return r
# private subnet definitions for the generated interfaces
# 10.10.xxx.0/24
-SAP_SUBNETS = generate_subnets('10.10', 0, subnet_size=50, mask=24)
-# 10.20.xxx.0/24
+SAP_SUBNETS = generate_subnets('10.10', 0, subnet_size=50, mask=30)
+# 10.20.xxx.0/30
ELAN_SUBNETS = generate_subnets('10.20', 0, subnet_size=50, mask=24)
# 10.30.xxx.0/30
ELINE_SUBNETS = generate_subnets('10.30', 0, subnet_size=50, mask=30)
elif sap["type"] == "external":
target_dc = sap.get("dc")
# add interface to dc switch
- target_dc.attachExternalSAP(sap['name'], str(sap['net']))
+ target_dc.attachExternalSAP(sap['name'], sap['net'])
def _connect_elines(self, eline_fwd_links, instance_uuid):
"""
elif src_sap_id in self.saps_ext:
src_id = src_sap_id
- src_if_name = src_sap_id
+ # set intf name to None so the chaining function will choose the first one
+ src_if_name = None
src_name = self.vnf_id2vnf_name[src_id]
dst_name = self.vnf_id2vnf_name[dst_id]
dst_vnfi = self._get_vnf_instance(instance_uuid, dst_name)
if dst_vnfi is not None:
# choose first ip address in sap subnet
sap_net = self.saps[src_sap_id]['net']
- sap_ip = "{0}/{1}".format(str(sap_net[1]), sap_net.prefixlen)
+ sap_ip = "{0}/{1}".format(str(sap_net[2]), sap_net.prefixlen)
self._vnf_reconfigure_network(dst_vnfi, dst_if_name, sap_ip)
setChaining = True
elif dst_sap_id in self.saps_ext:
dst_id = dst_sap_id
- dst_if_name = dst_sap_id
+ # set intf name to None so the chaining function will choose the first one
+ dst_if_name = None
src_name = self.vnf_id2vnf_name[src_id]
dst_name = self.vnf_id2vnf_name[dst_id]
src_vnfi = self._get_vnf_instance(instance_uuid, src_name)
if src_vnfi is not None:
sap_net = self.saps[dst_sap_id]['net']
- sap_ip = "{0}/{1}".format(str(sap_net[1]), sap_net.prefixlen)
+ sap_ip = "{0}/{1}".format(str(sap_net[2]), sap_net.prefixlen)
self._vnf_reconfigure_network(src_vnfi, src_if_name, sap_ip)
setChaining = True
acknowledge the contributions of their colleagues of the SONATA
partner consortium (www.sonata-nfv.eu).
"""
-from mininet.node import Docker
+from mininet.node import Docker, OVSBridge
from mininet.link import Link
from emuvim.dcemulator.resourcemodel import NotEnoughResourcesAvailable
import logging
-import time
-import json
+
LOG = logging.getLogger("dcemulator.node")
LOG.setLevel(logging.DEBUG)
DCDPID_BASE = 1000 # start of switch dpid's used for data center switches
+EXTSAPDPID_BASE = 2000 # start of switch dpid's used for external SAP switches
class EmulatorCompute(Docker):
"""
DCDPID_BASE += 1
return DCDPID_BASE
+ def _get_next_extSAP_dpid(self):
+ global EXTSAPDPID_BASE
+ EXTSAPDPID_BASE += 1
+ return EXTSAPDPID_BASE
+
def create(self):
"""
Each data center is represented by a single switch to which
return True
- def attachExternalSAP(self, sap_name, sap_ip):
- # create SAP as OVS internal interface
- sap_intf = self.switch.attachInternalIntf(sap_name, sap_ip)
-
- # add this as a link to the DCnetwork graph, so it is available for routing
- attr_dict2 = {'src_port_id': sap_name, 'src_port_nr': None,
- 'src_port_name': sap_name,
- 'dst_port_id': self.switch.ports[sap_intf], 'dst_port_nr': self.switch.ports[sap_intf],
- 'dst_port_name': sap_intf.name}
- self.net.DCNetwork_graph.add_edge(sap_name, self.switch.name, attr_dict=attr_dict2)
+ def attachExternalSAP(self, sap_name, sap_net, **params):
+ # create SAP as separate OVS switch with an assigned ip address
+ sap_ip = str(sap_net[1]) + '/' + str(sap_net.prefixlen)
+ sap_switch = self.net.addExtSAP(sap_name, sap_ip, dpid=hex(self._get_next_extSAP_dpid())[2:], **params)
+ sap_switch.start()
- attr_dict2 = {'dst_port_id': sap_name, 'dst_port_nr': None,
- 'dst_port_name': sap_name,
- 'src_port_id': self.switch.ports[sap_intf], 'src_port_nr': self.switch.ports[sap_intf],
- 'src_port_name': sap_intf.name}
- self.net.DCNetwork_graph.add_edge(self.switch.name, sap_name, attr_dict=attr_dict2)
+ # link SAP to the DC switch
+ self.net.addLink(sap_switch, self.switch, cls=Link)
+ # allow connection to the external internet through the host
+ self.net.addSAPNAT(sap_switch, str(sap_net))
def listCompute(self):
"""