def _create_and_upload_vnf(self, sample_name): body = jsonutils.dumps({"userDefinedData": {"foo": "bar"}}) vnf_package = self._create_vnf_package(body) csar_dir = self._get_csar_dir_path(sample_name) if os.path.exists(os.path.join(csar_dir, 'TOSCA-Metadata')) and \ sample_name != 'vnfpkgm2': file_path = utils.create_csar_with_unique_artifact(csar_dir) else: file_path, vnfd_id = utils.create_csar_with_unique_vnfd_id( csar_dir) self.addCleanup(os.remove, file_path) with open(file_path, 'rb') as file_object: resp, resp_body = self.http_client.do_request( '{base_path}/{id}/package_content'.format( id=vnf_package['id'], base_path=self.base_url), "PUT", body=file_object, content_type='application/zip') self.assertEqual(202, resp.status_code) self._wait_for_onboard(vnf_package['id']) return vnf_package['id']
def test_upload_from_uri_with_auth_and_delete(self): csar_dir = self._get_csar_dir_path("sample_vnfpkg_no_meta_single_vnfd") file_path, vnfd_id = utils.create_csar_with_unique_vnfd_id(csar_dir) self.addCleanup(os.remove, file_path) cls_obj = utils.StaticHttpFileHandler(os.path.dirname(file_path)) self.addCleanup(cls_obj.stop) body = jsonutils.dumps({"userDefinedData": {"foo": "bar"}}) vnf_package = self._create_vnf_package(body) csar_file_uri = 'http://localhost:{port}/{filename}'.format( port=cls_obj.port, filename=os.path.basename(file_path)) body = jsonutils.dumps({ "addressInformation": csar_file_uri, "userName": "******", "password": "******" }) resp, resp_body = self.http_client.do_request( '{base_path}/{id}/package_content/upload_from_uri'.format( id=vnf_package['id'], base_path=self.base_url), "POST", body=body) self.assertEqual(202, resp.status_code) self._wait_for_onboard(vnf_package['id']) self._disable_operational_state(vnf_package['id']) self._delete_vnf_package(vnf_package['id']) self._wait_for_delete(vnf_package['id'])
def test_load_csar_data(self, mock_extract_csar_zip_file): file_path, _ = utils.create_csar_with_unique_vnfd_id( './tacker/tests/etc/samples/etsi/nfv/vnfpkgm1') self.addCleanup(os.remove, file_path) vnf_data, flavours = csar_utils.load_csar_data( self.context, constants.UUID, file_path) self.assertEqual(vnf_data['descriptor_version'], '1.0') self.assertEqual(vnf_data['vnfm_info'], ['Tacker']) self.assertEqual(flavours[0]['flavour_id'], 'simple') self.assertIsNotNone(flavours[0]['sw_images'])
def test_load_csar_with_artifacts_short_notation_without_sw_image_data( self, mock_extract_csar_zip_file): file_path = "./tacker/tests/etc/samples/etsi/nfv/" \ "csar_short_notation_for_artifacts_without_sw_image_data" zip_name, uniqueid = utils.create_csar_with_unique_vnfd_id(file_path) exc = self.assertRaises(exceptions.InvalidCSAR, csar_utils.load_csar_data, self.context, constants.UUID, zip_name) msg = ('Node property "sw_image_data" is missing for' ' artifact sw_image for node VDU1.') self.assertEqual(msg, exc.format_message()) os.remove(zip_name)
def test_patch_in_onboarded_state(self): user_data = jsonutils.dumps({ "userDefinedData": { "key1": "val1", "key2": "val2", "key3": "val3" } }) vnf_package = self._create_vnf_package(user_data) update_req_body = jsonutils.dumps({ "operationalState": "DISABLED", "userDefinedData": { "key1": "changed_val1", "key2": "val2", "new_key": "new_val" } }) expected_result = { "operationalState": "DISABLED", "userDefinedData": { "key1": "changed_val1", "new_key": "new_val" } } csar_dir = self._get_csar_dir_path("vnfpkgm1") file_path, vnfd_id = utils.create_csar_with_unique_vnfd_id(csar_dir) self.addCleanup(os.remove, file_path) with open(file_path, 'rb') as file_object: resp, resp_body = self.http_client.do_request( '{base_path}/{id}/package_content'.format( id=vnf_package['id'], base_path=self.base_url), "PUT", body=file_object, content_type='application/zip') self.assertEqual(202, resp.status_code) self._wait_for_onboard(vnf_package['id']) # Update vnf package which is onboarded resp, resp_body = self.http_client.do_request( '{base_path}/{id}'.format(id=vnf_package['id'], base_path=self.base_url), "PATCH", content_type='application/json', body=update_req_body) self.assertEqual(200, resp.status_code) self.assertEqual(expected_result, resp_body) self._delete_vnf_package(vnf_package['id']) self._wait_for_delete(vnf_package['id'])
def test_load_csar_data_with_multiple_sw_image_data_with_short_notation( self, mock_extract_csar_zip_file): file_path = "./tacker/tests/etc/samples/etsi/nfv/" \ "csar_multiple_sw_image_data_with_short_notation" zip_name, uniqueid = utils.create_csar_with_unique_vnfd_id(file_path) exc = self.assertRaises(exceptions.InvalidCSAR, csar_utils.load_csar_data, self.context, constants.UUID, zip_name) msg = ('artifacts of type "tosca.artifacts.nfv.SwImage"' ' is added more than one time for node VDU1.') self.assertEqual(msg, exc.format_message()) os.remove(zip_name)
def test_load_csar_data_with_artifacts_short_notation( self, mock_extract_csar_zip_file): file_path = "./tacker/tests/etc/samples/etsi/nfv/" \ "csar_with_short_notation_for_artifacts" zip_name, uniqueid = utils.create_csar_with_unique_vnfd_id(file_path) vnf_data, flavours, vnf_artifacts = csar_utils.load_csar_data( self.context, constants.UUID, zip_name) self.assertEqual(vnf_data['descriptor_version'], '1.0') self.assertEqual(vnf_data['vnfm_info'], ['Tacker']) self.assertEqual(flavours[0]['flavour_id'], 'simple') self.assertIsNotNone(flavours[0]['sw_images']) os.remove(zip_name)
def test_get_vnf_package_vnfd_download_from_glance_store(self, mock_load_csar): fake_csar = os.path.join(self.temp_dir, self.vnf_package.id) cfg.CONF.set_override('vnf_package_csar_path', self.temp_dir, group='vnf_package') fake_csar_zip, _ = utils.create_csar_with_unique_vnfd_id( './tacker/tests/etc/samples/etsi/nfv/vnfpkgm1') mock_load_csar.return_value = fake_csar_zip expected_data = fakes.get_expected_vnfd_data(zip_file=fake_csar_zip) result = self.conductor.get_vnf_package_vnfd(self.context, self.vnf_package) self.assertEqual(expected_data, result) shutil.rmtree(fake_csar) os.remove(fake_csar_zip)
def _create_and_upload_vnf_package(tacker_client, csar_package_name, user_defined_data): # create vnf package body = jsonutils.dumps({"userDefinedData": user_defined_data}) resp, vnf_package = tacker_client.do_request('/vnfpkgm/v1/vnf_packages', "POST", body=body) # upload vnf package csar_package_path = "../../etc/samples/etsi/nfv/%s" % csar_package_name file_path = os.path.abspath( os.path.join(os.path.dirname(__file__), csar_package_path)) # Generating unique vnfd id. This is required when multiple workers # are running concurrently. The call below creates a new temporary # CSAR with unique vnfd id. file_path, uniqueid = utils.create_csar_with_unique_vnfd_id(file_path) with open(file_path, 'rb') as file_object: resp, resp_body = tacker_client.do_request( '/vnfpkgm/v1/vnf_packages/{id}/package_content'.format( id=vnf_package['id']), "PUT", body=file_object, content_type='application/zip') # wait for onboard timeout = VNF_PACKAGE_UPLOAD_TIMEOUT start_time = int(time.time()) show_url = os.path.join('/vnfpkgm/v1/vnf_packages', vnf_package['id']) vnfd_id = None while True: resp, body = tacker_client.do_request(show_url, "GET") if body['onboardingState'] == "ONBOARDED": vnfd_id = body['vnfdId'] break if ((int(time.time()) - start_time) > timeout): raise Exception("Failed to onboard vnf package") time.sleep(1) # remove temporarily created CSAR file os.remove(file_path) return vnf_package['id'], vnfd_id
def test_load_csar_data_with_unit_conversion(self, mock_extract_csar_zip_file): file_path, _ = utils.create_csar_with_unique_vnfd_id( './tacker/tests/etc/samples/etsi/nfv/sample_vnfpkg_tosca_vnfd') self.addCleanup(os.remove, file_path) vnf_data, flavours, vnf_artifact = csar_utils.load_csar_data( self.context, constants.UUID, file_path) self.assertEqual(vnf_data['descriptor_version'], '1.0') self.assertEqual(vnf_data['vnfm_info'], ['Tacker']) self.assertEqual(flavours[0]['flavour_id'], 'simple') self.assertIsNotNone(flavours[0]['sw_images']) # 'size', 'min_disk' and 'min_ram' values from sample VNFD will # be converted to Bytes self.assertEqual(flavours[0]['sw_images'][0]['min_disk'], 1000000000) self.assertEqual(flavours[0]['sw_images'][0]['size'], 1879048192) self.assertEqual(flavours[0]['sw_images'][1]['min_disk'], 2000000000) self.assertEqual(flavours[0]['sw_images'][1]['size'], 2000000000) self.assertEqual(flavours[0]['sw_images'][1]['min_ram'], 8590458880)