"""
Distributed Cloud Emulator (dcemulator)
(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
"""
import logging

from mininet.net import Mininet
from mininet.node import Controller, OVSKernelSwitch, Switch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Link

from node import Datacenter


class DCNetwork(object):
    """
    Wraps the original Mininet class and provides
    methods to add data centers, switches, etc.

    This class is used by topology definition scripts.
    """

    def __init__(self):
        self.dcs = {}
        self.switches = {}
        self.links = []

        # create a Mininet/Dockernet network
        setLogLevel('info')  # set Mininet loglevel
        self.mnet = Mininet(controller=Controller, switch=OVSKernelSwitch)
        self.mnet.addController('c0')

    def addDatacenter(self, name):
        """
        Create and add a logical cloud data center to the network.
        """
        if name in self.dcs:
            raise Exception("Data center name already exists: %s" % name)
        dc = Datacenter(name)
        dc.net = self  # set reference to network
        self.dcs[name] = dc
        dc.create()  # finally create the data center in our Mininet instance
        logging.info("added data center: %s" % name)
        return dc

    def addSwitch(self, name):
        """
        We can also add additional SDN switches between data centers.
        """
        s = self.mnet.addSwitch(name)
        self.switches[name] = s
        logging.info("added switch: %s" % name)
        return s

    def addLink(self, node1, node2):
        assert node1 is not None
        assert node2 is not None
        # ensure type of node1
        if isinstance( node1, basestring ):
            if node1 in self.dcs:
                node1 = self.dcs[node1].switch
            elif node1 in self.switches:
                node1 = self.switches[node1]
        if isinstance( node1, Datacenter ):
            node1 = node1.switch
        # ensure type of node2
        if isinstance( node2, basestring ):
            if node2 in self.dcs:
                node2 = self.dcs[node2].switch
            elif node2 in self.switches:
                node2 = self.switches[node2]
        if isinstance( node2, Datacenter ):
            node2 = node2.switch
        # create link if everything is correct
        if (node1 is not None and isinstance(node1, OVSKernelSwitch)
                and node2 is not None and isinstance(node2, OVSKernelSwitch)):
            self.mnet.addLink(node1, node2)  # TODO we need TCLinks with user defined performance here
        else:
            raise Exception(
                "one of the given nodes is not a Mininet switch or None")

    def start(self):
        # start
        for dc in self.dcs.itervalues():
            dc.start()
        self.mnet.start()

    def stop(self):
        self.mnet.stop()

    def CLI(self):
        CLI(self.mnet)
