bug 650 adding WIM account instantiation parameter. 41/7341/3
authortierno <alfonso.tiernosepulveda@telefonica.com>
Wed, 20 Mar 2019 17:23:45 +0000 (17:23 +0000)
committertierno <alfonso.tiernosepulveda@telefonica.com>
Thu, 21 Mar 2019 12:45:49 +0000 (12:45 +0000)
Allow manual selection of wim or deployment without Wim

Change-Id: If4928ff33ebc671b6870faf20f3b4253c9f59372
Signed-off-by: tierno <alfonso.tiernosepulveda@telefonica.com>
openmanod
osm_ro/nfvo.py
osm_ro/openmano_schemas.py
osm_ro/wim/engine.py

index 5dee02b..6e46990 100755 (executable)
--- a/openmanod
+++ b/openmanod
@@ -50,8 +50,8 @@ import osm_ro
 
 __author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes"
 __date__ = "$26-aug-2014 11:09:29$"
 
 __author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes"
 __date__ = "$26-aug-2014 11:09:29$"
-__version__ = "0.6.09"
-version_date = "Feb 2019"
+__version__ = "0.6.10"
+version_date = "Mar 2019"
 database_version = 37      # expected database schema version
 
 global global_config
 database_version = 37      # expected database schema version
 
 global global_config
index 677c7c6..5a972e2 100644 (file)
@@ -2998,6 +2998,7 @@ def create_instance(mydb, tenant_id, instance_dict):
     myvims = {}
     myvim_threads_id = {}
     datacenter = instance_dict.get("datacenter")
     myvims = {}
     myvim_threads_id = {}
     datacenter = instance_dict.get("datacenter")
+    default_wim_account = instance_dict.get("wim_account")
     default_datacenter_id, vim = get_datacenter_by_name_uuid(mydb, tenant_id, datacenter)
     myvims[default_datacenter_id] = vim
     myvim_threads_id[default_datacenter_id], _ = get_vim_thread(mydb, tenant_id, default_datacenter_id)
     default_datacenter_id, vim = get_datacenter_by_name_uuid(mydb, tenant_id, datacenter)
     myvims[default_datacenter_id] = vim
     myvim_threads_id[default_datacenter_id], _ = get_vim_thread(mydb, tenant_id, default_datacenter_id)
@@ -3163,7 +3164,9 @@ def create_instance(mydb, tenant_id, instance_dict):
         # However, this is not possible yet.
         for net_name, net_instance_desc in instance_dict.get("networks", {}).iteritems():
             for scenario_net in scenarioDict['nets']:
         # However, this is not possible yet.
         for net_name, net_instance_desc in instance_dict.get("networks", {}).iteritems():
             for scenario_net in scenarioDict['nets']:
-                if net_name == scenario_net["name"]:
+                if net_name == scenario_net.get("name") or net_name == scenario_net.get("osm_id") or net_name == scenario_net.get("uuid"):
+                    if "wim_account" in net_instance_desc and net_instance_desc["wim_account"] is not None:
+                        scenario_net["wim_account"] = net_instance_desc["wim_account"]
                     if 'ip-profile' in net_instance_desc:
                         ipprofile_db = ip_profile_IM2RO(net_instance_desc['ip-profile'])
                         if 'ip_profile' not in scenario_net:
                     if 'ip-profile' in net_instance_desc:
                         ipprofile_db = ip_profile_IM2RO(net_instance_desc['ip-profile'])
                         if 'ip_profile' not in scenario_net:
@@ -3200,19 +3203,28 @@ def create_instance(mydb, tenant_id, instance_dict):
                             break
             if not involved_datacenters:
                 involved_datacenters.append(default_datacenter_id)
                             break
             if not involved_datacenters:
                 involved_datacenters.append(default_datacenter_id)
+            target_wim_account = scenario_net.get("wim_account", default_wim_account)
 
             # --> WIM
             # TODO: use this information during network creation
             wim_account_id = wim_account_name = None
             if len(involved_datacenters) > 1 and 'uuid' in sce_net:
 
             # --> WIM
             # TODO: use this information during network creation
             wim_account_id = wim_account_name = None
             if len(involved_datacenters) > 1 and 'uuid' in sce_net:
-                # OBS: sce_net without uuid are used internally to VNFs
-                # and the assumption is that VNFs will not be split among
-                # different datacenters
-                wim_account = wim_engine.find_suitable_wim_account(
-                    involved_datacenters, tenant_id)
-                wim_account_id = wim_account['uuid']
-                wim_account_name = wim_account['name']
-                wim_usage[sce_net['uuid']] = wim_account_id
+                if target_wim_account is None or target_wim_account is True:  # automatic selection of WIM
+                    # OBS: sce_net without uuid are used internally to VNFs
+                    # and the assumption is that VNFs will not be split among
+                    # different datacenters
+                    wim_account = wim_engine.find_suitable_wim_account(
+                        involved_datacenters, tenant_id)
+                    wim_account_id = wim_account['uuid']
+                    wim_account_name = wim_account['name']
+                    wim_usage[sce_net['uuid']] = wim_account_id
+                elif isinstance(target_wim_account, str):     # manual selection of WIM
+                    wim_account.persist.get_wim_account_by(target_wim_account, tenant_id)
+                    wim_account_id = wim_account['uuid']
+                    wim_account_name = wim_account['name']
+                    wim_usage[sce_net['uuid']] = wim_account_id
+                else:  # not WIM usage
+                    wim_usage[sce_net['uuid']] = False
             # <-- WIM
 
             descriptor_net = {}
             # <-- WIM
 
             descriptor_net = {}
index 80795b5..5839e24 100644 (file)
@@ -59,6 +59,8 @@ schema_version_2={"type":"integer","minimum":2,"maximum":2}
 log_level_schema={"type":"string", "enum":["DEBUG", "INFO", "WARNING","ERROR","CRITICAL"]}
 checksum_schema={"type":"string", "pattern":"^[0-9a-fA-F]{32}$"}
 size_schema={"type":"integer","minimum":1,"maximum":100}
 log_level_schema={"type":"string", "enum":["DEBUG", "INFO", "WARNING","ERROR","CRITICAL"]}
 checksum_schema={"type":"string", "pattern":"^[0-9a-fA-F]{32}$"}
 size_schema={"type":"integer","minimum":1,"maximum":100}
+boolean_schema = {"type": "boolean"}
+null_schema = {"type": "null"}
 
 metadata_schema={
     "type":"object",
 
 metadata_schema={
     "type":"object",
@@ -83,7 +85,7 @@ config_schema = {
         "http_port": port_schema,
         "http_admin_port": port_schema,
         "http_host": nameshort_schema,
         "http_port": port_schema,
         "http_admin_port": port_schema,
         "http_host": nameshort_schema,
-        "auto_push_VNF_to_VIMs": {"type":"boolean"},
+        "auto_push_VNF_to_VIMs": boolean_schema,
         "vnf_repository": path_schema,
         "db_host": nameshort_schema,
         "db_user": nameshort_schema,
         "vnf_repository": path_schema,
         "db_host": nameshort_schema,
         "db_user": nameshort_schema,
@@ -100,7 +102,7 @@ config_schema = {
         "vim_tenant_name": nameshort_schema,
         "mano_tenant_name": nameshort_schema,
         "mano_tenant_id": id_schema,
         "vim_tenant_name": nameshort_schema,
         "mano_tenant_name": nameshort_schema,
         "mano_tenant_id": id_schema,
-        "http_console_proxy": {"type":"boolean"},
+        "http_console_proxy": boolean_schema,
         "http_console_host": nameshort_schema,
         "http_console_ports": {
             "type": "array",
         "http_console_host": nameshort_schema,
         "http_console_ports": {
             "type": "array",
@@ -262,7 +264,7 @@ datacenter_action_schema = {
                 "net": name_schema,  #name or uuid of net to change
                 "name": name_schema,
                 "description": description_schema,
                 "net": name_schema,  #name or uuid of net to change
                 "name": name_schema,
                 "description": description_schema,
-                "shared": {"type": "boolean"}
+                "shared": boolean_schema
             },
             "minProperties": 1,
             "additionalProperties": False
             },
             "minProperties": 1,
             "additionalProperties": False
@@ -311,8 +313,8 @@ dhcp_schema = {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties":{
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties":{
-        "enabled": {"type": "boolean"},
-        "start-address": {"OneOf": [{"type": "null"}, ip_schema]},
+        "enabled": boolean_schema,
+        "start-address": {"OneOf": [null_schema, ip_schema]},
         "count": integer0_schema
     },
     # "required": ["start-address", "count"],
         "count": integer0_schema
     },
     # "required": ["start-address", "count"],
@@ -431,7 +433,7 @@ external_connection_schema_v02 = {
     "type":"object",
     "properties":{
         "name": name_schema,
     "type":"object",
     "properties":{
         "name": name_schema,
-        "mgmt": {"type":"boolean"},
+        "mgmt": boolean_schema,
         "type": {"type": "string", "enum":["e-line", "e-lan"]},
         "implementation": {"type": "string", "enum":["overlay", "underlay"]},
         "VNFC": name_schema,
         "type": {"type": "string", "enum":["e-line", "e-lan"]},
         "implementation": {"type": "string", "enum":["overlay", "underlay"]},
         "VNFC": name_schema,
@@ -468,8 +470,8 @@ bridge_interfaces_schema={
             "vpci":pci_schema,
             "mac_address": mac_schema,
             "model": {"type":"string", "enum":["virtio","e1000","ne2k_pci","pcnet","rtl8139", "paravirt"]},
             "vpci":pci_schema,
             "mac_address": mac_schema,
             "model": {"type":"string", "enum":["virtio","e1000","ne2k_pci","pcnet","rtl8139", "paravirt"]},
-            "port-security": {"type" : "boolean"},
-            "floating-ip": {"type" : "boolean"}
+            "port-security": boolean_schema,
+            "floating-ip": boolean_schema,
         },
         "additionalProperties": False,
         "required": ["name"]
         },
         "additionalProperties": False,
         "required": ["name"]
@@ -539,7 +541,7 @@ boot_data_vdu_schema  = {
         "user-data": {"type" : "string"},  # scrip to run
         "config-files": {"type": "array", "items": config_files_schema},
         # NOTE: “user-data” are mutually exclusive with users and config-files because user/files are injected using user-data
         "user-data": {"type" : "string"},  # scrip to run
         "config-files": {"type": "array", "items": config_files_schema},
         # NOTE: “user-data” are mutually exclusive with users and config-files because user/files are injected using user-data
-        "boot-data-drive": {"type": "boolean"},
+        "boot-data-drive": boolean_schema,
     },
     "additionalProperties": False,
 }
     },
     "additionalProperties": False,
 }
@@ -604,8 +606,8 @@ vnfd_schema_v01 = {
                 "description": description_schema,
 
                 "class": nameshort_schema,
                 "description": description_schema,
 
                 "class": nameshort_schema,
-                "public": {"type" : "boolean"},
-                "physical": {"type" : "boolean"},
+                "public": boolean_schema,
+                "physical": boolean_schema,
                 "default_user": name_schema,
                 "tenant_id": id_schema, #only valid for admin
                 "external-connections": {"type" : "array", "items": external_connection_schema, "minItems":1},
                 "default_user": name_schema,
                 "tenant_id": id_schema, #only valid for admin
                 "external-connections": {"type" : "array", "items": external_connection_schema, "minItems":1},
@@ -633,8 +635,8 @@ vnfd_schema_v02 = {
                 "name": name_schema,
                 "description": description_schema,
                 "class": nameshort_schema,
                 "name": name_schema,
                 "description": description_schema,
                 "class": nameshort_schema,
-                "public": {"type" : "boolean"},
-                "physical": {"type" : "boolean"},
+                "public": boolean_schema,
+                "physical": boolean_schema,
                 "tenant_id": id_schema, #only valid for admin
                 "external-connections": {"type" : "array", "items": external_connection_schema, "minItems":1},
                 "internal-connections": {"type" : "array", "items": internal_connection_schema_v02, "minItems":1},
                 "tenant_id": id_schema, #only valid for admin
                 "external-connections": {"type" : "array", "items": external_connection_schema, "minItems":1},
                 "internal-connections": {"type" : "array", "items": internal_connection_schema_v02, "minItems":1},
@@ -683,7 +685,7 @@ nsd_schema_v01 = {
         "name":name_schema,
         "description": description_schema,
         "tenant_id": id_schema, #only valid for admin
         "name":name_schema,
         "description": description_schema,
         "tenant_id": id_schema, #only valid for admin
-        "public": {"type": "boolean"},
+        "public": boolean_schema,
         "topology":{
             "type":"object",
             "properties":{
         "topology":{
             "type":"object",
             "properties":{
@@ -739,7 +741,7 @@ nsd_schema_v02 = {
                 "name": name_schema,
                 "description": description_schema,
                 "tenant_id": id_schema, #only valid for admin
                 "name": name_schema,
                 "description": description_schema,
                 "tenant_id": id_schema, #only valid for admin
-                "public": {"type": "boolean"},
+                "public": boolean_schema,
                 "vnfs": {
                     "type":"object",
                     "patternProperties":{
                 "vnfs": {
                     "type":"object",
                     "patternProperties":{
@@ -762,7 +764,7 @@ nsd_schema_v02 = {
                             "properties":{
                                 "interfaces":{"type":"array", "minLength":1},
                                 "type": {"type": "string", "enum":["dataplane", "bridge"]},
                             "properties":{
                                 "interfaces":{"type":"array", "minLength":1},
                                 "type": {"type": "string", "enum":["dataplane", "bridge"]},
-                                "external" : {"type": "boolean"},
+                                "external" : boolean_schema,
                                 "graph": graph_schema
                             },
                             "required": ["interfaces"]
                                 "graph": graph_schema
                             },
                             "required": ["interfaces"]
@@ -792,7 +794,7 @@ nsd_schema_v03 = {
                 "name": name_schema,
                 "description": description_schema,
                 "tenant_id": id_schema, #only valid for admin
                 "name": name_schema,
                 "description": description_schema,
                 "tenant_id": id_schema, #only valid for admin
-                "public": {"type": "boolean"},
+                "public": boolean_schema,
                 "cloud-config": cloud_config_schema, #common for all vnfs in the scenario
                 #"datacenter": name_schema,
                 "vnfs": {
                 "cloud-config": cloud_config_schema, #common for all vnfs in the scenario
                 #"datacenter": name_schema,
                 "vnfs": {
@@ -855,7 +857,7 @@ nsd_schema_v03 = {
                                 },
                                 "type": {"type": "string", "enum":["e-line", "e-lan"]},
                                 "implementation": {"type": "string", "enum":["overlay", "underlay"]},
                                 },
                                 "type": {"type": "string", "enum":["e-line", "e-lan"]},
                                 "implementation": {"type": "string", "enum":["overlay", "underlay"]},
-                                "external" : {"type": "boolean"},
+                                "external" : boolean_schema,
                                 "graph": graph_schema,
                                 "ip-profile": ip_profile_schema
                             },
                                 "graph": graph_schema,
                                 "ip-profile": ip_profile_schema
                             },
@@ -977,7 +979,7 @@ instance_scenario_object = {
                 "type": "object",
                 "properties": {
                     "name": name_schema,
                 "type": "object",
                 "properties": {
                     "name": name_schema,
-                    "external": {"type": "boolean"},
+                    "external": boolean_schema,
                     "type": {"enum": ["bridge", "ptp", "data"]},  # for overlay, underlay E-LINE, underlay E-LAN
                 },
                 "additionalProperties": False,
                     "type": {"enum": ["bridge", "ptp", "data"]},  # for overlay, underlay E-LINE, underlay E-LAN
                 },
                 "additionalProperties": False,
@@ -1003,9 +1005,10 @@ instance_scenario_create_schema_v01 = {
                 "name": name_schema,
                 "description":description_schema,
                 "datacenter": name_schema,
                 "name": name_schema,
                 "description":description_schema,
                 "datacenter": name_schema,
+                "wim_account": {"oneOf": [boolean_schema, id_schema, null_schema]},
                 "scenario" : {"oneOff": [name_schema, instance_scenario_object]},  # can be an UUID or name or a dict
                 "action":{"enum": ["deploy","reserve","verify" ]},
                 "scenario" : {"oneOff": [name_schema, instance_scenario_object]},  # can be an UUID or name or a dict
                 "action":{"enum": ["deploy","reserve","verify" ]},
-                "connect_mgmt_interfaces": {"oneOf": [{"type":"boolean"}, {"type":"object"}]},# can be true or a dict with datacenter: net_name
+                "connect_mgmt_interfaces": {"oneOf": [boolean_schema, {"type":"object"}]},# can be true or a dict with datacenter: net_name
                 "cloud-config": cloud_config_schema, #common to all vnfs in the instance scenario
                 "vnfs":{             #mapping from scenario to datacenter
                     "type": "object",
                 "cloud-config": cloud_config_schema, #common to all vnfs in the instance scenario
                 "vnfs":{             #mapping from scenario to datacenter
                     "type": "object",
@@ -1041,7 +1044,7 @@ instance_scenario_create_schema_v01 = {
                                                         ".": {
                                                             "ip_address": ip_schema,
                                                             "mac_address": mac_schema,
                                                         ".": {
                                                             "ip_address": ip_schema,
                                                             "mac_address": mac_schema,
-                                                            "floating-ip": {"type": "boolean"},
+                                                            "floating-ip": boolean_schema,
                                                         }
                                                     }
                                                 }
                                                         }
                                                     }
                                                 }
@@ -1089,6 +1092,7 @@ instance_scenario_create_schema_v01 = {
                                         }
                                     }
                                 },
                                         }
                                     }
                                 },
+                                "wim_account": {"oneOf": [boolean_schema, id_schema, null_schema]},
                                 "ip-profile": ip_profile_schema,
                                 #if the network connects VNFs deployed at different sites, you must specify one entry per site that this network connect to
                                 "sites": {
                                 "ip-profile": ip_profile_schema,
                                 #if the network connects VNFs deployed at different sites, you must specify one entry per site that this network connect to
                                 "sites": {
@@ -1100,7 +1104,7 @@ instance_scenario_create_schema_v01 = {
                                             # By default for an scenario 'external' network openmano looks for an existing VIM network to map this external scenario network,
                                             # for other networks openamno creates at VIM
                                             # Use netmap-create to force to create an external scenario network
                                             # By default for an scenario 'external' network openmano looks for an existing VIM network to map this external scenario network,
                                             # for other networks openamno creates at VIM
                                             # Use netmap-create to force to create an external scenario network
-                                            "netmap-create": {"oneOf":[name_schema,{"type": "null"}]}, #datacenter network to use. Null if must be created as an internal net
+                                            "netmap-create": {"oneOf":[name_schema,null_schema]}, #datacenter network to use. Null if must be created as an internal net
                                             #netmap-use:   Indicates an existing VIM network that must be used for this scenario network.
                                             #Can use both the VIM network name (if it is not ambiguous) or the VIM net UUID
                                             #If both 'netmap-create' and 'netmap-use'are supplied, netmap-use precedes, but if fails openmano follows the netmap-create
                                             #netmap-use:   Indicates an existing VIM network that must be used for this scenario network.
                                             #Can use both the VIM network name (if it is not ambiguous) or the VIM net UUID
                                             #If both 'netmap-create' and 'netmap-use'are supplied, netmap-use precedes, but if fails openmano follows the netmap-create
@@ -1131,13 +1135,13 @@ instance_scenario_action_schema = {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "type": "object",
     "properties": {
-        "start": {"type": "null"},
-        "pause": {"type": "null"},
-        "resume": {"type": "null"},
-        "shutoff": {"type": "null"},
-        "shutdown": {"type": "null"},
-        "forceOff": {"type": "null"},
-        "rebuild": {"type": "null"},
+        "start": null_schema,
+        "pause": null_schema,
+        "resume": null_schema,
+        "shutoff": null_schema,
+        "shutdown": null_schema,
+        "forceOff": null_schema,
+        "rebuild": null_schema,
         "reboot": {
             "type": ["object", "null"],
         },
         "reboot": {
             "type": ["object", "null"],
         },
@@ -1224,7 +1228,7 @@ sdn_port_mapping_schema  = {
                         "items": {
                             "type": "object",
                             "properties": {
                         "items": {
                             "type": "object",
                             "properties": {
-                                "pci": {"OneOf": [{"type": "null"}, pci_extended_schema]},       # pci_schema,
+                                "pci": {"OneOf": [null_schema, pci_extended_schema]},       # pci_schema,
                                 "switch_port": nameshort_schema,
                                 "switch_mac": mac_schema
                             },
                                 "switch_port": nameshort_schema,
                                 "switch_mac": mac_schema
                             },
index 39defb1..a5da1dd 100644 (file)
@@ -356,7 +356,7 @@ class WimEngine(object):
         (NSR).
 
         Arguments:
         (NSR).
 
         Arguments:
-            wim_usage(dict): Mapping between sce_net_id and wim_id
+            wim_usage(dict): Mapping between sce_net_id and wim_id. If wim_id is False, means not create wam_links
             networks(list): Dicts containing the information about the networks
                 that will be instantiated to materialize a Network Service
                 (scenario) instance.
             networks(list): Dicts containing the information about the networks
                 that will be instantiated to materialize a Network Service
                 (scenario) instance.
@@ -374,11 +374,11 @@ class WimEngine(object):
         wan_groups = [key
                       for key, counter in datacenters_per_group
                       if counter > 1]
         wan_groups = [key
                       for key, counter in datacenters_per_group
                       if counter > 1]
-
+        # Keys are tuples(instance_scenario_id, sce_net_id)
         return [
             self.derive_wan_link(wim_usage,
                                  key[0], key[1], grouped_networks[key], tenant)
         return [
             self.derive_wan_link(wim_usage,
                                  key[0], key[1], grouped_networks[key], tenant)
-            for key in wan_groups
+            for key in wan_groups if wim_usage.get(key[1]) is not False
         ]
 
     def create_action(self, wan_link):
         ]
 
     def create_action(self, wan_link):
@@ -511,7 +511,7 @@ def _group_networks(networks):
             (scenario) instance.
     Returns:
         dict: Keys are tuples (instance_scenario_id, sce_net_id) and values
             (scenario) instance.
     Returns:
         dict: Keys are tuples (instance_scenario_id, sce_net_id) and values
-            are lits of networks.
+            are list of networks.
     """
     criteria = itemgetter('instance_scenario_id', 'sce_net_id')
 
     """
     criteria = itemgetter('instance_scenario_id', 'sce_net_id')