+ engine.get_autorization()
+ engine.set_test_name(self.test_name)
+ nsname = os.environ.get("OSMNBITEST_NS_NAME", "OSMNBITEST")
+
+ # create real VIM if not exist
+ self.vim_id = engine.get_create_vim(test_osm)
+ # instantiate PDU
+ self.pduDeploy.create_descriptors(engine)
+ self.pduDeploy.instantiate(engine, {"nsDescription": "to be used as PDU", "nsName": nsname + "-PDU",
+ "nsdId": self.pduDeploy.nsd_id, "vimAccountId": self.vim_id})
+ if manual_check:
+ input('VNF to be used as PDU has been deployed. Perform manual check and press enter to resume')
+ if test_osm:
+ self.pduDeploy.test_ns(engine, test_osm)
+
+ if test_osm:
+ r = engine.test("Get VNFR to obtain IP_ADDRESS", "GET",
+ "/nslcm/v1/vnfrs?nsr-id-ref={}".format(self.pduDeploy.ns_id), headers_json, None,
+ 200, r_header_json, "json")
+ if not r:
+ return
+ vnfr_data = r.json()
+ # print(vnfr_data)
+
+ self.pdu_interface_0["ip-address"] = vnfr_data[0]["vdur"][0]["interfaces"][0].get("ip-address")
+ self.pdu_interface_1["ip-address"] = vnfr_data[0]["vdur"][0]["interfaces"][1].get("ip-address")
+ self.pdu_interface_0["mac-address"] = vnfr_data[0]["vdur"][0]["interfaces"][0].get("mac-address")
+ self.pdu_interface_1["mac-address"] = vnfr_data[0]["vdur"][0]["interfaces"][1].get("mac-address")
+ if not self.pdu_interface_0["ip-address"]:
+ raise TestException("Vnfr has not managment ip address")
+ else:
+ self.pdu_interface_0["ip-address"] = "192.168.10.10"
+ self.pdu_interface_1["ip-address"] = "192.168.11.10"
+ self.pdu_interface_0["mac-address"] = "52:33:44:55:66:13"
+ self.pdu_interface_1["mac-address"] = "52:33:44:55:66:14"
+
+ self.create_descriptors(engine)
+
+ ns_data = {"nsDescription": "default description", "nsName": nsname, "nsdId": self.nsd_id,
+ "vimAccountId": self.vim_id}
+ if test_params and test_params.get("ns-config"):
+ if isinstance(test_params["ns-config"], str):
+ ns_data.update(yaml.load(test_params["ns-config"]))
+ else:
+ ns_data.update(test_params["ns-config"])
+
+ self.instantiate(engine, ns_data)
+ if manual_check:
+ input('NS has been deployed. Perform manual check and press enter to resume')
+ if test_osm:
+ self.test_ns(engine, test_osm)
+ self.additional_operations(engine, test_osm, manual_check)
+ self.terminate(engine)
+ self.pduDeploy.terminate(engine)
+ self.delete_descriptors(engine)
+ self.pduDeploy.delete_descriptors(engine)
+
+ def delete_descriptors(self, engine):
+ super().delete_descriptors(engine)
+ # delete pdu
+ engine.test("Delete PDU SOL005", "DELETE",
+ "/pdu/v1/pdu_descriptors/{}".format(self.pdu_id),
+ headers_yaml, None, 204, None, 0)
+
+
+class TestDescriptors:
+ description = "Test VNFD, NSD, PDU descriptors CRUD and dependencies"
+
+ def __init__(self):
+ self.vnfd_filename = "hackfest_3charmed_vnfd.tar.gz"
+ self.nsd_filename = "hackfest_3charmed_nsd.tar.gz"
+ self.descriptor_url = "https://osm-download.etsi.org/ftp/osm-3.0-three/2nd-hackfest/packages/"
+ self.vnfd_id = None
+ self.nsd_id = None
+ self.vnfd_empty = """vnfd:vnfd-catalog:
+ vnfd:
+ - name: prova
+ short-name: prova
+ id: prova
+ """
+ self.vnfd_prova = """vnfd:vnfd-catalog:
+ vnfd:
+ - connection-point:
+ - name: cp_0h8m
+ type: VPORT
+ id: prova
+ name: prova
+ short-name: prova
+ vdu:
+ - id: vdu_z4bm
+ image: ubuntu
+ interface:
+ - external-connection-point-ref: cp_0h8m
+ name: eth0
+ virtual-interface:
+ type: VIRTIO
+ name: vdu_z4bm
+ version: '1.0'
+ """
+
+ def run(self, engine, test_osm, manual_check, test_params=None):
+ engine.set_test_name("Descriptors")
+ engine.get_autorization()
+ temp_dir = os.path.dirname(os.path.abspath(__file__)) + "/temp/"
+ if not os.path.exists(temp_dir):
+ os.makedirs(temp_dir)
+
+ # download files
+ for filename in (self.vnfd_filename, self.nsd_filename):
+ filename_path = temp_dir + filename
+ if not os.path.exists(filename_path):
+ with open(filename_path, "wb") as file:
+ response = requests.get(self.descriptor_url + filename)
+ if response.status_code >= 300:
+ raise TestException("Error downloading descriptor from '{}': {}".format(
+ self.descriptor_url + filename, response.status_code))
+ file.write(response.content)
+
+ vnfd_filename_path = temp_dir + self.vnfd_filename
+ nsd_filename_path = temp_dir + self.nsd_filename
+
+ engine.test("Onboard empty VNFD in one step", "POST", "/vnfpkgm/v1/vnf_packages_content", headers_yaml,
+ self.vnfd_empty, 201, r_headers_yaml_location_vnfd, "yaml")
+ self.vnfd_id = engine.last_id
+
+ # test bug 605
+ engine.test("Upload invalid VNFD ", "PUT", "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
+ headers_yaml, self.vnfd_prova, 422, r_header_yaml, "yaml")
+
+ engine.test("Upload VNFD {}".format(self.vnfd_filename), "PUT",
+ "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id), headers_zip_yaml,
+ "@b" + vnfd_filename_path, 204, None, 0)
+
+ queries = ["mgmt-interface.cp=mgmt", "vdu.0.interface.0.external-connection-point-ref=mgmt",
+ "vdu.0.interface.1.internal-connection-point-ref=internal",
+ "internal-vld.0.internal-connection-point.0.id-ref=internal"]
+ for query in queries:
+ engine.test("Upload invalid VNFD ", "PUT",
+ "/vnfpkgm/v1/vnf_packages/{}/package_content?{}".format(self.vnfd_id, query),
+ headers_zip_yaml, "@b" + vnfd_filename_path, 422, r_header_yaml, "yaml")
+
+ # test bug 605
+ engine.test("Upload invalid VNFD ", "PUT", "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id),
+ headers_yaml, self.vnfd_prova, 422, r_header_yaml, "yaml")
+
+ # get vnfd descriptor
+ engine.test("Get VNFD descriptor", "GET", "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_id),
+ headers_yaml, None, 200, r_header_yaml, "yaml")
+
+ # get vnfd file descriptor
+ engine.test("Get VNFD file descriptor", "GET", "/vnfpkgm/v1/vnf_packages/{}/vnfd".format(self.vnfd_id),
+ headers_text, None, 200, r_header_text, "text", temp_dir+"vnfd-yaml")
+ # TODO compare files: diff vnfd-yaml hackfest_3charmed_vnfd/hackfest_3charmed_vnfd.yaml
+
+ # get vnfd zip file package
+ engine.test("Get VNFD zip package", "GET",
+ "/vnfpkgm/v1/vnf_packages/{}/package_content".format(self.vnfd_id), headers_zip, None, 200,
+ r_header_zip, "zip", temp_dir+"vnfd-zip")
+ # TODO compare files: diff vnfd-zip hackfest_3charmed_vnfd.tar.gz
+
+ # get vnfd artifact
+ engine.test("Get VNFD artifact package", "GET",
+ "/vnfpkgm/v1/vnf_packages/{}/artifacts/icons/osm.png".format(self.vnfd_id), headers_zip, None, 200,
+ r_header_octect, "octet-string", temp_dir+"vnfd-icon")
+ # TODO compare files: diff vnfd-icon hackfest_3charmed_vnfd/icons/osm.png
+
+ # nsd CREATE AND UPLOAD in one step:
+ engine.test("Onboard NSD in one step", "POST", "/nsd/v1/ns_descriptors_content", headers_zip_yaml,
+ "@b" + nsd_filename_path, 201, r_headers_yaml_location_nsd, "yaml")
+ self.nsd_id = engine.last_id
+
+ queries = ["vld.0.vnfd-connection-point-ref.0.vnfd-id-ref=hf"]
+ for query in queries:
+ engine.test("Upload invalid NSD ", "PUT",
+ "/nsd/v1/ns_descriptors/{}/nsd_content?{}".format(self.nsd_id, query),
+ headers_zip_yaml, "@b" + nsd_filename_path, 422, r_header_yaml, "yaml")
+
+ # get nsd descriptor
+ engine.test("Get NSD descriptor", "GET", "/nsd/v1/ns_descriptors/{}".format(self.nsd_id), headers_yaml,
+ None, 200, r_header_yaml, "yaml")
+
+ # get nsd file descriptor
+ engine.test("Get NSD file descriptor", "GET", "/nsd/v1/ns_descriptors/{}/nsd".format(self.nsd_id), headers_text,
+ None, 200, r_header_text, "text", temp_dir+"nsd-yaml")
+ # TODO compare files: diff nsd-yaml hackfest_3charmed_nsd/hackfest_3charmed_nsd.yaml
+
+ # get nsd zip file package
+ engine.test("Get NSD zip package", "GET", "/nsd/v1/ns_descriptors/{}/nsd_content".format(self.nsd_id),
+ headers_zip, None, 200, r_header_zip, "zip", temp_dir+"nsd-zip")
+ # TODO compare files: diff nsd-zip hackfest_3charmed_nsd.tar.gz
+
+ # get nsd artifact
+ engine.test("Get NSD artifact package", "GET",
+ "/nsd/v1/ns_descriptors/{}/artifacts/icons/osm.png".format(self.nsd_id), headers_zip, None, 200,
+ r_header_octect, "octet-string", temp_dir+"nsd-icon")
+ # TODO compare files: diff nsd-icon hackfest_3charmed_nsd/icons/osm.png
+
+ # vnfd DELETE
+ test_rest.test("Delete VNFD conflict", "DELETE", "/vnfpkgm/v1/vnf_packages/{}".format(self.vnfd_id),
+ headers_yaml, None, 409, None, None)
+
+ test_rest.test("Delete VNFD force", "DELETE", "/vnfpkgm/v1/vnf_packages/{}?FORCE=TRUE".format(self.vnfd_id),
+ headers_yaml, None, 204, None, 0)
+
+ # nsd DELETE
+ test_rest.test("Delete NSD", "DELETE", "/nsd/v1/ns_descriptors/{}".format(self.nsd_id), headers_yaml, None, 204,
+ None, 0)
+
+
+class TestNetSliceTemplates:
+ description = "Upload a NST to OSM"
+
+ def __init__(self):
+ self.nst_filenames = ("@./cirros_slice/cirros_slice_vld.yaml")
+
+ def run(self, engine, test_osm, manual_check, test_params=None):
+ # nst CREATE
+ engine.set_test_name("NST")
+ engine.get_autorization()
+ engine.test("Onboard NST", "POST", "/nst/v1/netslice_templates_content", headers_yaml, self.nst_filenames,
+ 201, r_headers_yaml_location_nst, "yaml")
+ nst_id = engine.last_id
+
+ # nstd SHOW OSM format
+ engine.test("Show NSTD OSM format", "GET", "/nst/v1/netslice_templates/{}".format(nst_id), headers_json, None,
+ 200, r_header_json, "json")
+
+ # nstd DELETE
+ engine.test("Delete NSTD", "DELETE", "/nst/v1/netslice_templates/{}".format(nst_id), headers_json, None,
+ 204, None, 0)
+
+
+class TestNetSliceInstances:
+ description = "Upload a NST to OSM"
+
+ def __init__(self):
+ self.vim_id = None
+ self.nst_filenames = ("@./cirros_slice/cirros_slice.yaml")
+
+ def run(self, engine, test_osm, manual_check, test_params=None):
+ # nst CREATE
+ engine.set_test_name("NSI")
+ engine.get_autorization()
+ engine.test("Onboard NST", "POST", "/nst/v1/netslice_templates_content", headers_yaml, self.nst_filenames, 201,
+ r_headers_yaml_location_nst, "yaml")
+ nst_id = engine.last_id
+
+ # nsi CREATE
+ self.vim_id = engine.get_create_vim(test_osm)
+
+ ns_data = {"nsiDescription": "default description", "nsiName": "my_slice", "nstId": nst_id,
+ "vimAccountId": self.vim_id}
+ ns_data_text = yaml.safe_dump(ns_data, default_flow_style=True, width=256)
+
+ engine.test("Onboard NSI", "POST", "/nsilcm/v1/netslice_instances_content", headers_yaml, ns_data_text, 201,
+ r_headers_yaml_location_nst, "yaml")
+ nsi_id = engine.last_id
+
+ # TODO: Improve the wait with a polling if NSI was deployed
+ wait = 120
+ sleep(wait)
+
+ # Check deployment
+ engine.test("Wait until NSI is deployed", "GET", "/nsilcm/v1/netslice_instances_content/{}".format(nsi_id),
+ headers_json, None, 200, r_header_json, "json")
+
+ # nsi DELETE
+ engine.test("Delete NSI", "DELETE", "/nsilcm/v1/netslice_instances_content/{}".format(nsi_id), headers_json,
+ None, 202, r_header_json, "json")
+
+ sleep(60)
+
+ # nstd DELETE
+ engine.test("Delete NSTD", "DELETE", "/nst/v1/netslice_templates/{}".format(nst_id), headers_json, None,
+ 204, None, 0)