2 Distributed Cloud Emulator (dcemulator)
3 (c) 2015 by Manuel Peuster <manuel.peuster@upb.de>
7 from mininet
.net
import Mininet
8 from mininet
.node
import Controller
, OVSKernelSwitch
, Switch
, Docker
, Host
9 from mininet
.cli
import CLI
10 from mininet
.log
import setLogLevel
, info
11 from mininet
.link
import TCLink
, Link
13 from node
import Datacenter
, EmulatorCompute
16 class DCNetwork(object):
18 Wraps the original Mininet class and provides
19 methods to add data centers, switches, etc.
21 This class is used by topology definition scripts.
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')
34 def addDatacenter(self
, name
):
36 Create and add a logical cloud data center to the network.
39 raise Exception("Data center name already exists: %s" % name
)
41 dc
.net
= self
# set reference to network
43 dc
.create() # finally create the data center in our Mininet instance
44 logging
.info("added data center: %s" % name
)
47 def addSwitch(self
, name
):
49 We can also add additional SDN switches between data centers.
51 s
= self
.mnet
.addSwitch(name
)
52 self
.switches
[name
] = s
53 logging
.info("added switch: %s" % name
)
56 def addLink(self
, node1
, node2
, **params
):
58 Able to handle Datacenter objects as link
61 assert node1
is not None
62 assert node2
is not None
63 logging
.debug("addLink: n1=%s n2=%s" % (str(node1
), str(node2
)))
64 # ensure type of node1
65 if isinstance( node1
, basestring
):
67 node1
= self
.dcs
[node1
].switch
68 elif node1
in self
.switches
:
69 node1
= self
.switches
[node1
]
70 if isinstance( node1
, Datacenter
):
72 # ensure type of node2
73 if isinstance( node2
, basestring
):
75 node2
= self
.dcs
[node2
].switch
76 elif node2
in self
.switches
:
77 node2
= self
.switches
[node2
]
78 if isinstance( node2
, Datacenter
):
80 # try to give containers a default IP
81 if isinstance( node1
, Docker
):
82 if not "params1" in params
:
83 params
["params1"] = {}
84 if not "ip" in params
["params1"]:
85 params
["params1"]["ip"] = self
.getNextIp()
86 if isinstance( node2
, Docker
):
87 if not "params2" in params
:
88 params
["params2"] = {}
89 if not "ip" in params
["params2"]:
90 params
["params2"]["ip"] = self
.getNextIp()
92 return self
.mnet
.addLink(node1
, node2
, **params
) # TODO we need TCLinks with user defined performance here
94 def removeLink(self
, link
=None, node1
=None, node2
=None):
96 Removes a link. Can either be specified by link object,
97 or the nodes the link connects. Wraps Dockernet method.
99 logging
.debug("removeLink: n1=%s n2=%s" % (str(node1
), str(node2
)))
100 return self
.mnet
.removeLink(link
=link
, node1
=node1
, node2
=node2
)
102 def addDocker( self
, name
, **params
):
104 Wrapper for addDocker method provided by Dockernet.
106 return self
.mnet
.addDocker( name
, cls
=EmulatorCompute
, **params
)
108 def removeDocker( self
, name
, **params
):
110 Wrapper for removeHost. Just to be complete.
112 return self
.mnet
.removeDocker(name
, **params
)
115 return self
.mnet
.getNextIp()
119 for dc
in self
.dcs
.itervalues():