blob: 586b1e8421f5f269b54925297107a890d20d8d7b [file] [log] [blame]
peustermcbcd4c22015-12-28 11:33:42 +01001"""
2Distributed Cloud Emulator (dcemulator)
3(c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
4"""
5import logging
6
7from mininet.net import Mininet
8from mininet.node import Controller, OVSKernelSwitch, Switch
9from mininet.cli import CLI
10from mininet.log import setLogLevel, info
11from mininet.link import TCLink, Link
12
13from node import Datacenter
14
15
16class DCNetwork(object):
17
18 def __init__(self):
19 self.dcs = {}
20 self.switches = {}
21 self.links = []
22
23 # create a Mininet/Dockernet network
24 setLogLevel('info') # set Mininet loglevel
25 self.mnet = Mininet(controller=Controller, switch=OVSKernelSwitch)
26 self.mnet.addController('c0')
27
28 def addDatacenter(self, name):
29 """
30 Create and add a logical cloud data center to the network.
31 """
32 if name in self.dcs:
33 raise Exception("Data center name already exists: %s" % name)
34 dc = Datacenter(name)
35 dc.net = self # set reference to network
36 self.dcs[name] = dc
37 dc.create() # finally create the data center in our Mininet instance
38 logging.info("added data center: %s" % name)
39 return dc
40
41 def addSwitch(self, name):
42 """
43 We can also add additional SDN switches between data centers.
44 """
45 s = self.mnet.addSwitch(name)
46 self.switches[name] = s
47 logging.info("added switch: %s" % name)
48 return s
49
50 def addLink(self, node1, node2):
51 assert node1 is not None
52 assert node2 is not None
53 # ensure type of node1
54 if isinstance( node1, basestring ):
55 if node1 in self.dcs:
56 node1 = self.dcs[node1].switch
57 elif node1 in self.switches:
58 node1 = self.switches[node1]
59 if isinstance( node1, Datacenter ):
60 node1 = node1.switch
61 # ensure type of node2
62 if isinstance( node2, basestring ):
63 if node2 in self.dcs:
64 node2 = self.dcs[node2].switch
65 elif node2 in self.switches:
66 node2 = self.switches[node2]
67 if isinstance( node2, Datacenter ):
68 node2 = node2.switch
69 # create link if everything is correct
70 if (node1 is not None and isinstance(node1, OVSKernelSwitch)
71 and node2 is not None and isinstance(node2, OVSKernelSwitch)):
peusterm9c252b62016-01-06 16:59:53 +010072 self.mnet.addLink(node1, node2) # TODO we need TCLinks with user defined performance here
peustermcbcd4c22015-12-28 11:33:42 +010073 else:
74 raise Exception(
75 "one of the given nodes is not a Mininet switch or None")
76
77 def start(self):
78 # start
79 for dc in self.dcs.itervalues():
80 dc.start()
81 self.mnet.start()
82
83 def stop(self):
84 self.mnet.stop()
85
86 def CLI(self):
87 CLI(self.mnet)
88