X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Fsonata%2Fdummygatekeeper.py;h=939070ce9a0ade5429fca08b8fa19dfd013d84c4;hb=3bb86bfa4fe6f529e27ac35a9550d9afcb3eb4ba;hp=bea0a010be8696fb70549e1d7332f86f9d6413c9;hpb=ca88566fc038a5a59c8ca3d3af82aab8db7d253a;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py index bea0a01..939070c 100755 --- a/src/emuvim/api/sonata/dummygatekeeper.py +++ b/src/emuvim/api/sonata/dummygatekeeper.py @@ -110,6 +110,7 @@ class Service(object): self.eline_subnets_src = generate_subnet_strings(50, start=200, subnet_size=24, ip=1) self.eline_subnets_dst = generate_subnet_strings(50, start=200, subnet_size=24, ip=2) + def onboard(self): """ Do all steps to prepare this service to be instantiated @@ -128,7 +129,7 @@ class Service(object): else: self._load_docker_urls() self._pull_predefined_dockerimages() - LOG.info("On-boarded service: %r" % self.manifest.get("package_name")) + LOG.info("On-boarded service: %r" % self.manifest.get("name")) def start_service(self): """ @@ -165,8 +166,12 @@ class Service(object): vlinks = self.nsd["virtual_links"] fwd_links = self.nsd["forwarding_graphs"][0]["constituent_virtual_links"] eline_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-Line")] + elan_fwd_links = [l for l in vlinks if (l["id"] in fwd_links) and (l["connectivity_type"] == "E-LAN")] - cookie = 1 # not clear why this is needed - to check with Steven + # 3a. deploy E-Line links + # cookie is used as identifier for the flowrules installed by the dummygatekeeper + # eg. different services get a unique cookie for their flowrules + cookie = 1 for link in eline_fwd_links: src_id, src_if_name = link["connection_points_reference"][0].split(":") dst_id, dst_if_name = link["connection_points_reference"][1].split(":") @@ -186,8 +191,7 @@ class Service(object): ret = network.setChain( src_docker_name, dst_docker_name, vnf_src_interface=src_if_name, vnf_dst_interface=dst_if_name, - bidirectional=True, cmd="add-flow", cookie=cookie) - cookie += 1 + bidirectional=True, cmd="add-flow", cookie=cookie, priority=10) # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-Link src_vnfi = self._get_vnf_instance(instance_uuid, src_name) @@ -197,6 +201,33 @@ class Service(object): if dst_vnfi is not None: self._vnf_reconfigure_network(dst_vnfi, dst_if_name, self.eline_subnets_dst.pop(0)) + # 3b. deploy E-LAN links + base = 10 + for link in elan_fwd_links: + # generate lan ip address + ip = 1 + for intf in link["connection_points_reference"]: + ip_address = generate_lan_string("10.0", base, subnet_size=24, ip=ip) + vnf_id, intf_name = intf.split(":") + vnf_name = vnf_id2vnf_name[vnf_id] + LOG.debug( + "Setting up E-LAN link. %s(%s:%s) -> %s" % ( + vnf_name, vnf_id, intf_name, ip_address)) + + if vnf_name in self.vnfds: + # re-configure the VNFs IP assignment and ensure that a new subnet is used for each E-LAN + # E-LAN relies on the learning switch capability of the infrastructure switch in dockernet, + # so no explicit chaining is necessary + vnfi = self._get_vnf_instance(instance_uuid, vnf_name) + if vnfi is not None: + self._vnf_reconfigure_network(vnfi, intf_name, ip_address) + # increase for the next ip address on this E-LAN + ip += 1 + # increase the base ip address for the next E-LAN + base += 1 + + + # 4. run the emulator specific entrypoint scripts in the VNFIs of this service instance self._trigger_emulator_start_scripts_in_vnfis(self.instances[instance_uuid]["vnf_instances"]) @@ -225,9 +256,7 @@ class Service(object): # 3. do the dc.startCompute(name="foobar") call to run the container # TODO consider flavors, and other annotations intfs = vnfd.get("connection_points") - # mgmt connection points can be skipped, this is considered to be the connection the default docker0 bridge - intfs = [intf for intf in intfs if 'mgmt' not in intf['id']] - + # use the vnf_id in the nsd as docker name # so deployed containers can be easily mapped back to the nsd vnf_name2id = defaultdict(lambda: "NotExistingNode", @@ -554,6 +583,14 @@ def make_relative_path(path): return path +def generate_lan_string(prefix, base, subnet_size=24, ip=0): + """ + Helper to generate different network configuration strings. + """ + r = "%s.%d.%d/%d" % (prefix, base, ip, subnet_size) + return r + + def generate_subnet_strings(n, start=1, subnet_size=24, ip=0): """ Helper to generate different network configuration strings.