From: Felipe Vicens Date: Sat, 1 Dec 2018 03:42:40 +0000 (+0100) Subject: Supporting VLDs for Netslice X-Git-Tag: v5.0.2 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=3d5fe1a90ca037d596fae165704814adb16394ea;p=osm%2FNBI.git Supporting VLDs for Netslice Change-Id: I3dd6b7517922cf77e74883845a4c3a508085124e Signed-off-by: Felipe Vicens --- diff --git a/osm_nbi/instance_topics.py b/osm_nbi/instance_topics.py index 210a207..d31218a 100644 --- a/osm_nbi/instance_topics.py +++ b/osm_nbi/instance_topics.py @@ -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 index 0000000..8a1bd00 --- /dev/null +++ b/osm_nbi/tests/cirros_ns/cirros_2net_vld_nsd.yaml @@ -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 diff --git a/osm_nbi/tests/cirros_ns/cirros_nsd.yaml b/osm_nbi/tests/cirros_ns/cirros_nsd.yaml index c013b56..ecc84ea 100644 --- a/osm_nbi/tests/cirros_ns/cirros_nsd.yaml +++ b/osm_nbi/tests/cirros_ns/cirros_nsd.yaml @@ -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 index 0000000..2ddc415 --- /dev/null +++ b/osm_nbi/tests/cirros_slice/cirros_2net_nst_basic.yaml @@ -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 index 0000000..a5f1c9c --- /dev/null +++ b/osm_nbi/tests/cirros_slice/cirros_nst.yaml @@ -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 index b3b6598..0000000 --- a/osm_nbi/tests/cirros_slice/cirros_slice.yaml +++ /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 index 6016f3f..0000000 --- a/osm_nbi/tests/cirros_slice/cirros_slice_vld.yaml +++ /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 index 0000000..04b14fd --- /dev/null +++ b/osm_nbi/tests/cirros_vnf/cirros_2net_vnfd.yaml @@ -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 diff --git a/osm_nbi/tests/test.py b/osm_nbi/tests/test.py index d3f643f..8621d6b 100755 --- a/osm_nbi/tests/test.py +++ b/osm_nbi/tests/test.py @@ -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 diff --git a/osm_nbi/validation.py b/osm_nbi/validation.py index 839f91b..fd4e0e5 100644 --- a/osm_nbi/validation.py +++ b/osm_nbi/validation.py @@ -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 }