Supporting VLDs for Netslice 16/7016/3 v5.0.0 v5.0.1 v5.0.2
authorFelipe Vicens <felipe.vicens@atos.net>
Sat, 1 Dec 2018 03:42:40 +0000 (04:42 +0100)
committerFelipe Vicens <felipe.vicens@atos.net>
Sun, 2 Dec 2018 21:37:11 +0000 (22:37 +0100)
Change-Id: I3dd6b7517922cf77e74883845a4c3a508085124e
Signed-off-by: Felipe Vicens <felipe.vicens@atos.net>
osm_nbi/instance_topics.py
osm_nbi/tests/cirros_ns/cirros_2net_vld_nsd.yaml [new file with mode: 0644]
osm_nbi/tests/cirros_ns/cirros_nsd.yaml
osm_nbi/tests/cirros_slice/cirros_2net_nst_basic.yaml [new file with mode: 0644]
osm_nbi/tests/cirros_slice/cirros_nst.yaml [new file with mode: 0644]
osm_nbi/tests/cirros_slice/cirros_slice.yaml [deleted file]
osm_nbi/tests/cirros_slice/cirros_slice_vld.yaml [deleted file]
osm_nbi/tests/cirros_vnf/cirros_2net_vnfd.yaml [new file with mode: 0644]
osm_nbi/tests/test.py
osm_nbi/validation.py

index 210a207..d31218a 100644 (file)
@@ -782,7 +782,6 @@ class NsiTopic(BaseTopic):
 
             step = ""
             # look for nstd
-            self.logger.info(str(slice_request))
             step = "getting nstd id='{}' from database".format(slice_request.get("nstId"))
             _filter = {"_id": slice_request["nstId"]}
             _filter.update(BaseTopic._get_project_filter(session, write=False, show_all=True))
@@ -792,25 +791,68 @@ class NsiTopic(BaseTopic):
             nsi_id = str(uuid4())
             step = "filling nsi_descriptor with input data"
 
-            # "instantiation-parameters.netslice-subnet": []
-            # TODO: Equal as template for now
+            # Creating the NSIR
             nsi_descriptor = {
                 "id": nsi_id,
                 "name": slice_request["nsiName"],
                 "description": slice_request.get("nsiDescription", ""),
                 "datacenter": slice_request["vimAccountId"],
                 "nst-ref": nstd["id"],
-                # "instantiate_params": slice_request,
-                "instantiation-parameters": {
-                    "netslice-subnet": []
-                },
+                "instantiation_parameters": slice_request,
                 "network-slice-template": nstd,
+                "nsr-ref-list": [],
+                "vlr-list": [],
                 "_id": nsi_id,
             }
 
+            step = "creating nsi at database"
+            self.format_on_new(nsi_descriptor, session["project_id"], make_public=make_public)
+            nsi_descriptor["_admin"]["nsiState"] = "NOT_INSTANTIATED"
+            nsi_descriptor["_admin"]["netslice-subnet"] = None
+            
+            # Creating netslice-vld for the RO.
+            step = "creating netslice-vld at database"
+            instantiation_parameters = slice_request
+
+            # Building the vlds list to be deployed
+            # From netslice descriptors, creating the initial list
+            nsi_vlds = []           
+            if nstd.get("netslice-vld"):
+                # Building VLDs from NST
+                for netslice_vlds in nstd["netslice-vld"]:
+                    nsi_vld = {}
+                    # Adding nst vld name and global vimAccountId for netslice vld creation
+                    nsi_vld["name"] = netslice_vlds["name"]
+                    nsi_vld["vimAccountId"] = slice_request["vimAccountId"]
+                    # Getting template Instantiation parameters from NST
+                    for netslice_vld in netslice_vlds["nss-connection-point-ref"]:
+                        for netslice_subnet in nstd["netslice-subnet"]:
+                            nsi_vld["nsd-ref"] = netslice_subnet["nsd-ref"]
+                            nsi_vld["nsd-connection-point-ref"] = netslice_vld["nsd-connection-point-ref"]
+                            # Obtaining the vimAccountId from template instantiation parameter            
+                            if netslice_subnet.get("instantiation-parameters"):
+                                # Taking the vimAccountId from NST netslice-subnet instantiation parameters
+                                if netslice_subnet["instantiation-parameters"].get("vimAccountId"):
+                                    netsn = netslice_subnet["instantiation-parameters"]["vimAccountId"]
+                                    nsi_vld["vimAccountId"] = netsn
+                            # Obtaining the vimAccountId from user instantiation parameter
+                            if instantiation_parameters.get("netslice-subnet"):
+                                for ins_param in instantiation_parameters["netslice-subnet"]:
+                                    if ins_param.get("id") == netslice_vld["nss-ref"]:
+                                        if ins_param.get("vimAccountId"):
+                                            nsi_vld["vimAccountId"] = ins_param["vimAccountId"]
+                    # Adding vim-network-name defined by the user to vld
+                    if instantiation_parameters.get("netslice-vld"):
+                        for ins_param in instantiation_parameters["netslice-vld"]:
+                            if ins_param["name"] == netslice_vlds["name"] and ins_param.get("vim-network-name"):
+                                    nsi_vld["vim-network-name"] = ins_param.get("vim-network-name")
+                    nsi_vlds.append(nsi_vld)
+
+            nsi_descriptor["_admin"]["netslice-vld"] = nsi_vlds
             # Creating netslice-subnet_record. 
             needed_nsds = {}
             services = []
+
             for member_ns in nstd["netslice-subnet"]:
                 nsd_id = member_ns["nsd-ref"]
                 step = "getting nstd id='{}' constituent-nsd='{}' from database".format(
@@ -830,34 +872,60 @@ class NsiTopic(BaseTopic):
                 step = "filling nsir nsd-id='{}' constituent-nsd='{}' from database".format(
                     member_ns["nsd-ref"], member_ns["id"])
 
-            step = "creating nsi at database"
-            self.format_on_new(nsi_descriptor, session["project_id"], make_public=make_public)
-            nsi_descriptor["_admin"]["nsiState"] = "NOT_INSTANTIATED"          
-
-            ns_params = indata.get("ns")
-            
             # creates Network Services records (NSRs)
             step = "creating nsrs at database using NsrTopic.new()"
+            ns_params = slice_request.get("netslice-subnet")
+
             nsrs_list = []
+            nsi_netslice_subnet = []
             for service in services:
                 indata_ns = {}
                 indata_ns["nsdId"] = service["_id"]
-                indata_ns["nsName"] = service["id"]
-                indata_ns["vimAccountId"] = indata.get("vimAccountId")
+                indata_ns["nsName"] = slice_request.get("nsiName") + "." + service["id"]
+                indata_ns["vimAccountId"] = slice_request.get("vimAccountId")
                 indata_ns["nsDescription"] = service["description"]
                 indata_ns["key-pair-ref"] = None
+
                 # NsrTopic(rollback, session, indata_ns, kwargs, headers, force)
                 # Overwriting ns_params filtering by nsName == netslice-subnet.id
+
                 if ns_params:
                     for ns_param in ns_params:
-                        if ns_param["nsName"] == service["id"]:
-                            indata_ns.update(ns_param)
+                        if ns_param.get("id") == service["id"]:
+                            copy_ns_param = deepcopy(ns_param)
+                            del copy_ns_param["id"]
+                            indata_ns.update(copy_ns_param)
+                # TODO: Improve network selection via networkID
+                if nsi_vlds:
+                    indata_ns_list = []
+                    for nsi_vld in nsi_vlds:
+                        nsd = self.db.get_one("nsds", {"id": nsi_vld["nsd-ref"]})
+                        if nsd["connection-point"]:
+                            for vld_id_ref in nsd["connection-point"]:
+                                name = vld_id_ref["vld-id-ref"]
+                                vnm = nsi_vld.get("vim-network-name")
+                                if type(vnm) is not dict:
+                                    vnm = {slice_request.get("vimAccountId"): vnm}
+                                if vld_id_ref["name"] == nsi_vld["nsd-connection-point-ref"]:
+                                    if list(vnm.values())[0] is None:
+                                        networkName = "default"
+                                    else:
+                                        networkName = str(list(vnm.values())[0])
+                                    # VIMNetworkName = NetSliceName-NetworkName
+                                    vimnetname = str(slice_request["nsiName"]) + "-" + networkName
+                                    indata_ns_list.append({"name": name, "vim-network-name": vimnetname})
+                    indata_ns["vld"] = indata_ns_list
+                            
                 _id_nsr = NsrTopic.new(self, rollback, session, indata_ns, kwargs, headers, force)
                 nsrs_item = {"nsrId": _id_nsr}
                 nsrs_list.append(nsrs_item)
+                nsi_netslice_subnet.append(indata_ns)
+                nsr_ref = {"nsr-ref": _id_nsr}
+                nsi_descriptor["nsr-ref-list"].append(nsr_ref)
 
             # Adding the nsrs list to the nsi
             nsi_descriptor["_admin"]["nsrs-detailed-list"] = nsrs_list
+            nsi_descriptor["_admin"]["netslice-subnet"] = nsi_netslice_subnet
             # Creating the entry in the database
             self.db.create("nsis", nsi_descriptor)
             rollback.append({"topic": "nsis", "_id": nsi_id})
@@ -894,21 +962,21 @@ class NsiLcmOpTopic(BaseTopic):
         nsds = {}
         nstd = nsir["network-slice-template"]
 
-        def check_valid_netslice_subnet_id(nsId):
+        def check_valid_netslice_subnet_id(nstId):
             # TODO change to vnfR (??)
-            for ns in nstd["netslice-subnet"]:
-                if nsId == ns["id"]:
-                    nsd_id = ns["nsd-ref"]
+            for netslice_subnet in nstd["netslice-subnet"]:
+                if nstId == netslice_subnet["id"]:
+                    nsd_id = netslice_subnet["nsd-ref"]
                     if nsd_id not in nsds:
                         nsds[nsd_id] = self.db.get_one("nsds", {"id": nsd_id})
                     return nsds[nsd_id]
             else:
-                raise EngineException("Invalid parameter nsId='{}' is not one of the "
-                                      "nst:netslice-subnet".format(nsId))
+                raise EngineException("Invalid parameter nstId='{}' is not one of the "
+                                      "nst:netslice-subnet".format(nstId))
         if operation == "instantiate":
             # check the existance of netslice-subnet items
-            for in_nst in get_iterable(indata.get("netslice-subnet")):           
-                nstd = check_valid_netslice_subnet_id(in_nst["nsdId"])
+            for in_nst in get_iterable(indata.get("netslice-subnet")):   
+                check_valid_netslice_subnet_id(in_nst["id"])
 
     def _create_nsilcmop(self, session, netsliceInstanceId, operation, params):
         now = time()
diff --git a/osm_nbi/tests/cirros_ns/cirros_2net_vld_nsd.yaml b/osm_nbi/tests/cirros_ns/cirros_2net_vld_nsd.yaml
new file mode 100644 (file)
index 0000000..8a1bd00
--- /dev/null
@@ -0,0 +1,60 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+nsd-catalog:
+    nsd:
+    -   id: cirros_2net_vld_nsd
+        name: cirros_2net_vld_nsd
+        short-name: cirros_2net_vld_ns
+        description: NetServiceDescriptor with 2 vnfs and 2 vld (mgmt and data networks)
+        vendor: OSM
+        version: '1.0'
+        logo: osm_2x.png
+
+        constituent-vnfd:
+        -   member-vnf-index: 1
+            vnfd-id-ref: cirros_2net_vnfd
+        -   member-vnf-index: 2
+            vnfd-id-ref: cirros_2net_vnfd
+
+        connection-point:
+        -   name: nsd_cp_mgmt
+            vld-id-ref: nsd_vnfd_vld_mgmt
+        -   name: nsd_cp_data
+            vld-id-ref: nsd_vnfd_vld_data
+
+        vld:
+        -   id: nsd_vnfd_vld_mgmt
+            name: nsd_vnfd_vld_mgmt
+            short-name: nsd_vnfd_vld_mgmt
+            type: ELAN
+            mgmt-network: 'true'
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: 1
+                vnfd-id-ref: cirros_2net_vnfd
+                vnfd-connection-point-ref: eth0
+            -   member-vnf-index-ref: 2
+                vnfd-id-ref: cirros_2net_vnfd
+                vnfd-connection-point-ref: eth0
+        -   id: nsd_vnfd_vld_data
+            name: nsd_vnfd_vld_data
+            short-name: nsd_vnfd_vld_data
+            type: ELAN
+            mgmt-network: 'false'
+            vnfd-connection-point-ref:
+            -   member-vnf-index-ref: 1
+                vnfd-id-ref: cirros_2net_vnfd
+                vnfd-connection-point-ref: eth1
+            -   member-vnf-index-ref: 2
+                vnfd-id-ref: cirros_2net_vnfd
+                vnfd-connection-point-ref: eth1
\ No newline at end of file
index c013b56..ecc84ea 100644 (file)
@@ -30,6 +30,7 @@ nsd-catalog:
             # Multiple constituent VNFDs can be specified
         -   member-vnf-index: 1
             vnfd-id-ref: cirros_vnfd
+            
         scaling-group-descriptor:
         -   name: "scaling_cirros"
             vnfd-member:
diff --git a/osm_nbi/tests/cirros_slice/cirros_2net_nst_basic.yaml b/osm_nbi/tests/cirros_slice/cirros_2net_nst_basic.yaml
new file mode 100644 (file)
index 0000000..2ddc415
--- /dev/null
@@ -0,0 +1,51 @@
+# Copyright [2018] [Felipe Vicens, Pol Alemany, Ricard Vilalta]
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#NST to test VLD connection between Network Services within the same VIM
+nst:
+-   id: cirros_2net_nst_basic
+    name: cirros_2net_nst_basic
+    SNSSAI-identifier:
+        slice-service-type: eMBB
+    quality-of-service:
+        id: 1
+
+    netslice-subnet:
+    -   id: cirros_2net_vld_nsd_1
+        is-shared-nss: 'false'
+        description: NetSlice Subnet (service) composed by 2 vnfs and 4 cp (2 mgmt and 2 data)
+        nsd-ref: cirros_2net_vld_nsd
+    -   id: cirros_2net_vld_nsd_2
+        is-shared-nss: 'false'
+        description: NetSlice Subnet (service) composed by 2 vnfs and 4 cp (2 mgmt and 2 data)
+        nsd-ref: cirros_2net_vld_nsd
+
+    netslice-vld:
+    -   id: slice_cirros_vld_mgmt
+        name: slice_cirros_vld_mgmt
+        type: ELAN
+        mgmt-network: 'true'
+        nss-connection-point-ref:
+        -   nss-ref: cirros_2net_vld_nsd_1
+            nsd-connection-point-ref: nsd_cp_mgmt
+        -   nss-ref: cirros_2net_vld_nsd_2
+            nsd-connection-point-ref: nsd_cp_mgmt
+    -   id: slice_cirros_vld_data
+        name: slice_cirros_vld_data
+        type: ELAN
+        nss-connection-point-ref:
+        -   nss-ref: cirros_2net_vld_nsd_1
+            nsd-connection-point-ref: nsd_cp_data
+        -   nss-ref: cirros_2net_vld_nsd_2
+            nsd-connection-point-ref: nsd_cp_data
diff --git a/osm_nbi/tests/cirros_slice/cirros_nst.yaml b/osm_nbi/tests/cirros_slice/cirros_nst.yaml
new file mode 100644 (file)
index 0000000..a5f1c9c
--- /dev/null
@@ -0,0 +1,35 @@
+# Copyright [2018] [Felipe Vicens, Pol Alemany, Ricard Vilalta]
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#NST to deploy 2 Network Services without VLD
+nst:
+-   id: 'cirros_nst'
+    name: cirros_nst
+    SNSSAI-identifier:
+        slice-service-type: eMBB
+    quality-of-service:
+        id: 1
+    netslice-subnet:
+    -   id: cirros_nsd_1
+        is-shared-nss: 'false'
+        description: Slice example for osm-5.0
+        nsd-ref: 'cirros_2vnf_nsd'
+        instantiation-parameters:
+            vimAccountId: Openstack_7.18
+    -   id: cirros_nsd_2
+        is-shared-nss: 'false'
+        description: Slice example for osm-5.0
+        nsd-ref: 'cirros_2vnf_nsd'
+        instantiation-parameters:
+            vimAccountId: Openstack_7.18
diff --git a/osm_nbi/tests/cirros_slice/cirros_slice.yaml b/osm_nbi/tests/cirros_slice/cirros_slice.yaml
deleted file mode 100644 (file)
index b3b6598..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright [2018] [Felipe Vicens, Pol Alemany, Ricard Vilalta]
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-nst:
--   id: 'cirros_nst'
-    name: cirros_netslice_template
-    SNSSAI-identifier:
-        slice-service-type: eMBB
-    quality-of-service:
-        id: 1
-    netslice-subnet:
-    -   id: cirros_nsd_1
-        is-shared-nss: 'false'
-        description: Slice example for osm-5.0
-        nsd-ref: 'cirros_2vnf_nsd'
-        instantiation-parameters:
-            vimAccountId: Openstack_7.18
-    -   id: cirros_nsd_2
-        is-shared-nss: 'false'
-        description: Slice example for osm-5.0
-        nsd-ref: 'cirros_2vnf_nsd'
-        instantiation-parameters:
-            vimAccountId: Openstack_7.18
diff --git a/osm_nbi/tests/cirros_slice/cirros_slice_vld.yaml b/osm_nbi/tests/cirros_slice/cirros_slice_vld.yaml
deleted file mode 100644 (file)
index 6016f3f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright [2018] [Felipe Vicens, Pol Alemany, Ricard Vilalta]
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-nst:
--   id: cirros_nst
-    name: cirros_netslice_template
-    SNSSAI-identifier:
-        slice-service-type: eMBB
-    quality-of-service:
-        id: 1
-    netslice-subnet:
-    -   id: cirros_nsd_1
-        is-shared-nss: 'false'
-        description: Slice example for osm-5.0
-        nsd-ref: cirros_nsd
-        instantiation-parameters:
-        -   nsName: cirros_nsd
-            nsdId: cirros_nsd
-            vimAccountId: openstack_18
-    -   id: cirros_nsd_2
-        is-shared-nss: 'false'
-        description: Slice example for osm-5.0
-        nsd-ref: cirros_nsd
-        instantiation-parameters:
-        -   nsName: cirros_nsd
-            nsdId: cirros_nsd
-            vimAccountId: openstack_18
-    netslice-vld:
-    -   id: slice_cirros_vld1
-        name: slice_cirros_vld1
-        nsd-connection-point-ref:
-        -   nsd-ref: cirros_nsd
-            nsd-connection-point-ref: cirros_nsd_vld1
\ No newline at end of file
diff --git a/osm_nbi/tests/cirros_vnf/cirros_2net_vnfd.yaml b/osm_nbi/tests/cirros_vnf/cirros_2net_vnfd.yaml
new file mode 100644 (file)
index 0000000..04b14fd
--- /dev/null
@@ -0,0 +1,70 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+vnfd-catalog:
+    vnfd:
+    -   id: cirros_2net_vnfd
+        name: cirros_2net_vnfd
+        short-name: cirros_2net_vnfd
+        description: Simple VNF example with a cirros and 2 interfaces (mgmt and data) 
+        vendor: OSM
+        version: '1.0'
+
+        # Place the logo as png in icons directory and provide the name here
+        logo: cirros-64.png
+
+        # Management interface
+        mgmt-interface:
+            cp: eth0
+
+        # Atleast one VDU need to be specified
+        vdu:
+        -   id: cirros_2net_vnfd-VM
+            name: cirros_2net_vnfd-VM
+            description: cirros_2net_vnfd-VM
+            count: 1
+
+            # Flavour of the VM to be instantiated for the VDU
+            # flavor below can fit into m1.micro
+            vm-flavor:
+                vcpu-count: 1
+                memory-mb: 256
+                storage-gb: 2
+
+            # Image/checksum or image including the full path
+            image: 'cirros034'
+            #checksum: 
+
+            interface:
+            # Specify the external interfaces
+            # There can be multiple interfaces defined
+            -   name: eth0
+                type: EXTERNAL
+                virtual-interface:
+                    type: VIRTIO
+                    bandwidth: '0'
+                    vpci: 0000:00:0a.0
+                external-connection-point-ref: eth0
+            -   name: eth1
+                type: EXTERNAL
+                virtual-interface:
+                    type: VIRTIO
+                    bandwidth: '0'
+                    vpci: 0000:00:0a.0
+                external-connection-point-ref: eth1
+
+        connection-point:
+        -   name: eth0
+            type: VPORT
+        -   name: eth1
+            type: VPORT
\ No newline at end of file
index d3f643f..8621d6b 100755 (executable)
@@ -1725,7 +1725,7 @@ class TestNetSliceTemplates:
     description = "Upload a NST to OSM"
 
     def __init__(self):
-        self.nst_filenames = ("@./cirros_slice/cirros_slice.yaml")
+        self.nst_filenames = ("@./cirros_slice/cirros_slice_vld.yaml")
 
     def run(self, engine, test_osm, manual_check, test_params=None):
         # nst CREATE
index 839f91b..fd4e0e5 100644 (file)
@@ -579,7 +579,7 @@ nbi_edit_input_schemas = {
 nsi_slice_instantiate = deepcopy(ns_instantiate)
 nsi_slice_instantiate["title"] = "netslice subnet instantiation params input schema"
 nsi_slice_instantiate["properties"]["id"] = name_schema
-nsi_slice_instantiate["required"].append("id")
+del nsi_slice_instantiate["required"]
 
 nsi_vld_instantiate = {
     "title": "netslice vld instantiation params input schema",
@@ -618,7 +618,7 @@ nsi_instantiate = {
             "items": nsi_vld_instantiate
         },
     },
-    "required": ["nsiName", "nstId", "vimAccountId"], 
+    "required": ["nsiName", "nstId", "vimAccountId"],
     "additionalProperties": False
 }