def _create_links(self, links): def is_remote(node): return isinstance(node, RemoteSwitch) def is_local(node): return not is_remote(node) self._info('**** Create %d link(s)' % len(links)) for id, link in links.iteritems(): self._debug('\tCreate link %s with params: %s' % (id, link)) node1 = self.net.get(link['node1']) node2 = self.net.get(link['node2']) name_to_node = {'node1': node1, 'node2': node2} link.update(name_to_node) remote = filter(is_remote, [node1, node2]) local = filter(is_local, [node1, node2]) if not remote: self.net.addLink(**link) else: sw = local[0] r = remote[0] intfName = r.params['local_intf_name'] r_mac = None # unknown, r.params['remote_mac'] r_port = r.params['remote_port'] self._debug('\tadd hw interface (%s) to node (%s)' % (intfName, sw.name)) # This hack avoids calling __init__ which always makeIntfPair() link = Link.__new__(Link) i1 = Intf(intfName, node=sw, link=link) i2 = Intf(intfName, node=r, mac=r_mac, port=r_port, link=link) i2.mac = r_mac # mn runs 'ifconfig', which resets mac to None # link.intf1, link.intf2 = i1, i2
def found_vnf_links(self, vnf_id, links): def get_intf_by_name(node, intf_name): for i in node.intfList(): if str(i) == intf_name: return i return None def get_or_create_intf(dev_name, obj, port): if port not in obj.intfs: # does not exist, let's create it return Intf(dev_name, node=obj, port=port) if str(obj.intfs[port]) != dev_name: # intf exists, but port is invalid return Intf(dev_name, node=obj, port=port) return obj.intfs[port] for i, link in enumerate(links): if int(link['sw_port']) == -1: # disconnected links (with port==-1) are omitted continue sw_name = link.get('sw_id', 'sw_id'+str(i)) sw_dev = link.get('sw_dev', 'sw_dev'+str(i)) sw_port = int(link['sw_port']) nf_name = vnf_id nf_dev = link.get('vnf_dev', 'vnf_dev'+str(i)) nf_port = int(link['vnf_port']) nf_mac = link['vnf_dev_mac'] sw_obj = self.net.getNodeByName(sw_name) try: nf_obj = self.net.getNodeByName(nf_name) except KeyError: # this is a VNF not managed by mininet, yet we have to # add to the mininet 'database'. TODO: Ideally, it # would be a RemoteHost, but for now it is a # RemoteSwitch. nf_obj = self.net.addRemoteSwitch(nf_name, dpid="-1") sw_i = get_or_create_intf(sw_dev, sw_obj, sw_port) if nf_dev in nf_obj.intfNames(): nf_i = get_intf_by_name(nf_obj, nf_dev) else: nf_i = Intf(nf_dev, node=nf_obj, port=nf_port, mac=nf_mac) nf_i.mac = nf_mac # mn runs 'ifconfig', which resets mac to None self.found_link(sw_obj, nf_obj, sw_i, nf_i)
def found_vnf_links(self, vnf_id, links): def get_intf_by_name(node, intf_name): for i in node.intfList(): if str(i) == intf_name: return i return None def get_or_create_intf(dev_name, obj, port): if port not in obj.intfs: # does not exist, let's create it return Intf(dev_name, node=obj, port=port) if str(obj.intfs[port]) != dev_name: # intf exists, but port is invalid return Intf(dev_name, node=obj, port=port) return obj.intfs[port] for i, link in enumerate(links): if int(link['sw_port']) == -1: # disconnected links (with port==-1) are omitted continue sw_name = link.get('sw_id', 'sw_id' + str(i)) sw_dev = link.get('sw_dev', 'sw_dev' + str(i)) sw_port = int(link['sw_port']) nf_name = vnf_id nf_dev = link.get('vnf_dev', 'vnf_dev' + str(i)) nf_port = int(link['vnf_port']) nf_mac = link['vnf_dev_mac'] sw_obj = self.net.getNodeByName(sw_name) try: nf_obj = self.net.getNodeByName(nf_name) except KeyError: # this is a VNF not managed by mininet, yet we have to # add to the mininet 'database'. TODO: Ideally, it # would be a RemoteHost, but for now it is a # RemoteSwitch. nf_obj = self.net.addRemoteSwitch(nf_name, dpid="-1") sw_i = get_or_create_intf(sw_dev, sw_obj, sw_port) if nf_dev in nf_obj.intfNames(): nf_i = get_intf_by_name(nf_obj, nf_dev) else: nf_i = Intf(nf_dev, node=nf_obj, port=nf_port, mac=nf_mac) nf_i.mac = nf_mac # mn runs 'ifconfig', which resets mac to None self.found_link(sw_obj, nf_obj, sw_i, nf_i)