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))
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(
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})
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()
--- /dev/null
+# 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
# Multiple constituent VNFDs can be specified
- member-vnf-index: 1
vnfd-id-ref: cirros_vnfd
+
scaling-group-descriptor:
- name: "scaling_cirros"
vnfd-member:
--- /dev/null
+# 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
--- /dev/null
+# 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
+++ /dev/null
-# 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
+++ /dev/null
-# 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
--- /dev/null
+# 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
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
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",
"items": nsi_vld_instantiate
},
},
- "required": ["nsiName", "nstId", "vimAccountId"],
+ "required": ["nsiName", "nstId", "vimAccountId"],
"additionalProperties": False
}