blob: e0f41e21b302540e190249eaee125f8893b70aa8 [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):
peusterme4e89d32016-01-07 09:14:54 +010017 """
18 Wraps the original Mininet class and provides
19 methods to add data centers, switches, etc.
20
21 This class is used by topology definition scripts.
22 """
peustermcbcd4c22015-12-28 11:33:42 +010023
24 def __init__(self):
25 self.dcs = {}
26 self.switches = {}
27 self.links = []
28
29 # create a Mininet/Dockernet network
30 setLogLevel('info') # set Mininet loglevel
31 self.mnet = Mininet(controller=Controller, switch=OVSKernelSwitch)
32 self.mnet.addController('c0')
33
34 def addDatacenter(self, name):
35 """
36 Create and add a logical cloud data center to the network.
37 """
38 if name in self.dcs:
39 raise Exception("Data center name already exists: %s" % name)
40 dc = Datacenter(name)
41 dc.net = self # set reference to network
42 self.dcs[name] = dc
43 dc.create() # finally create the data center in our Mininet instance
44 logging.info("added data center: %s" % name)
45 return dc
46
47 def addSwitch(self, name):
48 """
49 We can also add additional SDN switches between data centers.
50 """
51 s = self.mnet.addSwitch(name)
52 self.switches[name] = s
53 logging.info("added switch: %s" % name)
54 return s
55
56 def addLink(self, node1, node2):
57 assert node1 is not None
58 assert node2 is not None
59 # ensure type of node1
60 if isinstance( node1, basestring ):
61 if node1 in self.dcs:
62 node1 = self.dcs[node1].switch
63 elif node1 in self.switches:
64 node1 = self.switches[node1]
65 if isinstance( node1, Datacenter ):
66 node1 = node1.switch
67 # ensure type of node2
68 if isinstance( node2, basestring ):
69 if node2 in self.dcs:
70 node2 = self.dcs[node2].switch
71 elif node2 in self.switches:
72 node2 = self.switches[node2]
73 if isinstance( node2, Datacenter ):
74 node2 = node2.switch
75 # create link if everything is correct
76 if (node1 is not None and isinstance(node1, OVSKernelSwitch)
77 and node2 is not None and isinstance(node2, OVSKernelSwitch)):
peusterm9c252b62016-01-06 16:59:53 +010078 self.mnet.addLink(node1, node2) # TODO we need TCLinks with user defined performance here
peustermcbcd4c22015-12-28 11:33:42 +010079 else:
80 raise Exception(
81 "one of the given nodes is not a Mininet switch or None")
82
83 def start(self):
84 # start
85 for dc in self.dcs.itervalues():
86 dc.start()
87 self.mnet.start()
88
89 def stop(self):
90 self.mnet.stop()
91
92 def CLI(self):
93 CLI(self.mnet)