Feature: Allow custom addressing in E-LANs deployed by the 5GTANGO LLCM.
[osm/vim-emu.git] / src / emuvim / api / tango / llcm.py
index 75c71bf..8940388 100755 (executable)
@@ -357,6 +357,8 @@ class Service(object):
             # do some re-naming of fields to be compatible to containernet
             for i in intfs:
                 if i.get("address"):
+                    LOG.info("Found static address for {}: {}"
+                             .format(i.get("id"), i.get("address")))
                     i["ip"] = i.get("address")
 
             # get ports and port_bindings from the port and publish fields of CNFD
@@ -364,11 +366,30 @@ class Service(object):
             ports = list()  # Containernet naming
             port_bindings = dict()
             for i in intfs:
-                if i.get("port"):
+                if i.get("port"):  # field with a single port
                     if not isinstance(i.get("port"), int):
                         LOG.info("Field 'port' is no int CP: {}".format(i))
                     else:
-                        ports.append(i.get("port"))
+                        ports.append(i.get("port"))  # collect all ports
+                if i.get("ports"):  # list with multiple ports
+                    if not isinstance(i.get("ports"), list):
+                        LOG.info("Field 'port' is no list CP: {}".format(i))
+                    else:
+                        for p in i.get("ports"):
+                            if not isinstance(p, int):
+                                # do some parsing
+                                try:
+                                    if "/udp" in p:
+                                        p = tuple(p.split("/"))
+                                    else:
+                                        p = int(p)
+                                    ports.append(p)  # collect all ports
+                                except BaseException as ex:
+                                    LOG.error(
+                                        "Could not parse ports list: {}".format(p))
+                                    LOG.error(ex)
+                            else:
+                                ports.append(p)  # collect all ports
                 if i.get("publish"):
                     if not isinstance(i.get("publish"), dict):
                         LOG.info("Field 'publish' is no dict CP: {}".format(i))
@@ -716,8 +737,8 @@ class Service(object):
             lan_hosts = list(lan_net.hosts())
 
             # generate lan ip address for all interfaces (of all involved (V/CDUs))
-            for intf in link["connection_points_reference"]:
-                vnf_id, intf_name = parse_interface(intf)
+            for intf_ref in link["connection_points_reference"]:
+                vnf_id, intf_name = parse_interface(intf_ref)
                 if vnf_id is None:
                     continue  # skip references to NS connection points
                 units = self._get_vnf_instance_units(instance_uuid, vnf_id)
@@ -728,10 +749,20 @@ class Service(object):
                     # Attention: we apply a simplification for multi DU VNFs here:
                     # the connection points of all involved DUs have to have the same
                     # name as the connection points of the surrounding VNF to be mapped.
-                    # This is because we do not consider links specified in the VNFds
+                    # This is because we do not consider links specified in the VNFDs
                     container_name = uvnfi.name
-                    ip_address = "{0}/{1}".format(str(lan_hosts.pop(0)),
-                                                  lan_net.prefixlen)
+
+                    ip_address = None
+                    # get the interface of the unit
+                    intf = self._get_vnfd_cp_from_vnfi(uvnfi, intf_name)
+                    # check if there is a manually assigned address
+                    if intf is not None:
+                        if intf.get("address"):
+                            ip_address = intf.get("address")
+                    if ip_address is None:
+                        # automatically asign an IP from our pool
+                        ip_address = "{0}/{1}".format(str(lan_hosts.pop(0)),
+                                                      lan_net.prefixlen)
                     LOG.debug(
                         "Setting up E-LAN/E-Tree interface. (%s:%s) -> %s" % (
                             container_name, intf_name, ip_address))