diff options
-rw-r--r-- | lcm/packages/sdc_ns_package.py | 1 | ||||
-rw-r--r-- | lcm/packages/tests/test_sdc_ns.py | 165 | ||||
-rw-r--r-- | lcm/packages/urls.py | 5 | ||||
-rw-r--r-- | lcm/packages/views.py | 44 | ||||
-rw-r--r-- | lcm/pub/msapi/sdc.py | 8 |
5 files changed, 170 insertions, 53 deletions
diff --git a/lcm/packages/sdc_ns_package.py b/lcm/packages/sdc_ns_package.py index 872f7005..d8960dd9 100644 --- a/lcm/packages/sdc_ns_package.py +++ b/lcm/packages/sdc_ns_package.py @@ -135,6 +135,7 @@ class SdcNsPackage(object): if NSInstModel.objects.filter(nspackage_id=csar_id): raise NSLCMException("CSAR(%s) is in using, cannot be deleted." % csar_id) NSDModel.objects.filter(id=csar_id).delete() + return [0, "Delete CSAR(%s) successfully." % csar_id] def get_csars(self): diff --git a/lcm/packages/tests/test_sdc_ns.py b/lcm/packages/tests/test_sdc_ns.py index 6f9c52d2..d0cc6a95 100644 --- a/lcm/packages/tests/test_sdc_ns.py +++ b/lcm/packages/tests/test_sdc_ns.py @@ -17,8 +17,9 @@ from rest_framework import status from django.test import TestCase from django.test import Client -from lcm.pub.utils import restcall +from lcm.pub.utils import restcall, toscaparser from lcm.pub.database.models import NSDModel, NSInstModel, NfPackageModel +from lcm.pub.msapi import sdc class TestSdcNsPackage(TestCase): @@ -229,43 +230,6 @@ class TestSdcNsPackage(TestCase): ], "type": "tosca.nodes.nfv.ext.zte.VNF.VFW", "networks": [] - }, - { - "vnf_id": "VNAT", - "description": "", - "properties": { - "NatIpRange": "192.167.0.10-192.168.0.20", - "plugin_info": "vbrasplugin_1.0", - "vendor": "zte", - "is_shared": False , - "adjust_vnf_capacity": True, - "name": "VNAT", - "id": "vcpe_vnat_zte_1", - "vnf_extend_type": "driver", - "csarVersion": "v1.0", - "csarType": "NFAR", - "csarProvider": "ZTE", - "version": "1.0", - "nsh_aware": True, - "cross_dc": False , - "vnf_type": "VNAT", - "vmnumber_overquota_alarm": True, - "vnfd_version": "1.0.0", - "externalPluginManageNetworkName": "vlan_4007_plugin_net", - "request_reclassification": False - }, - "dependencies": [ - { - "key_name": "vnat_ctrl_by_manager_cp", - "vl_id": "ext_mnet_net" - }, - { - "key_name": "vnat_data_cp", - "vl_id": "sfc_data_network" - } - ], - "type": "tosca.nodes.nfv.ext.zte.VNF.VNAT", - "networks": [] } ], "ns_exposed": { @@ -428,3 +392,128 @@ class TestSdcNsPackage(TestCase): self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) self.assertEqual("failed", resp.data["status"]) self.assertEqual("NS CSAR(1) already exists.", resp.data["statusDescription"]) + + @mock.patch.object(restcall, 'call_req') + def test_ns_pkg_distribute_when_csar_not_exist(self, mock_call_req): + mock_call_req.return_value = [0, "[]", '200'] + resp = self.client.post("/api/nslcm/v1/nspackage", {"csarId": "1"}, format='json') + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("failed", resp.data["status"]) + self.assertEqual("Failed to query artifact(services,1) from sdc.", resp.data["statusDescription"]) + + @mock.patch.object(restcall, 'call_req') + @mock.patch.object(sdc, 'download_artifacts') + @mock.patch.object(toscaparser, 'parse_nsd') + def test_ns_pkg_distribute_when_nsd_already_exists(self, + mock_parse_nsd, mock_download_artifacts, mock_call_req): + mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) + mock_download_artifacts.return_value = "/home/vcpe.csar" + mock_call_req.return_value = [0, json.JSONEncoder().encode([{ + "uuid": "1", + "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar" + }]), '200'] + NSDModel(id="2", nsd_id="VCPE_NS").save() + resp = self.client.post("/api/nslcm/v1/nspackage", {"csarId": "1"}, format='json') + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("failed", resp.data["status"]) + self.assertEqual("NSD(VCPE_NS) already exists.", resp.data["statusDescription"]) + + @mock.patch.object(restcall, 'call_req') + @mock.patch.object(sdc, 'download_artifacts') + @mock.patch.object(toscaparser, 'parse_nsd') + def test_ns_pkg_distribute_when_nf_not_distributed(self, + mock_parse_nsd, mock_download_artifacts, mock_call_req): + mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) + mock_download_artifacts.return_value = "/home/vcpe.csar" + mock_call_req.return_value = [0, json.JSONEncoder().encode([{ + "uuid": "1", + "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar" + }]), '200'] + resp = self.client.post("/api/nslcm/v1/nspackage", {"csarId": "1"}, format='json') + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("failed", resp.data["status"]) + self.assertEqual("VNF package(vcpe_vfw_zte_1_0) is not distributed.", resp.data["statusDescription"]) + + @mock.patch.object(restcall, 'call_req') + @mock.patch.object(sdc, 'download_artifacts') + @mock.patch.object(toscaparser, 'parse_nsd') + def test_ns_pkg_distribute_when_successfully(self, + mock_parse_nsd, mock_download_artifacts, mock_call_req): + mock_parse_nsd.return_value = json.JSONEncoder().encode(self.nsd_data) + mock_download_artifacts.return_value = "/home/vcpe.csar" + mock_call_req.return_value = [0, json.JSONEncoder().encode([{ + "uuid": "1", + "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/vcpe.csar" + }]), '200'] + NfPackageModel(uuid="1", nfpackageid="1", vnfdid="vcpe_vfw_zte_1_0").save() + resp = self.client.post("/api/nslcm/v1/nspackage", {"csarId": "1"}, format='json') + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("success", resp.data["status"]) + self.assertEqual("CSAR(1) distributed successfully.", resp.data["statusDescription"]) + + ############################################################################################################### + def test_ns_pkg_force_delete(self): + NfPackageModel(uuid="1", nfpackageid="1", vnfdid="vcpe_vfw_zte_1_0").save() + NSDModel(id="8", nsd_id="2").save() + resp = self.client.delete("/api/nslcm/v1/nspackage/8force") + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("success", resp.data["status"]) + self.assertEqual("Delete CSAR(8) successfully.", resp.data["statusDescription"]) + + def test_ns_pkg_normal_delete(self): + NSDModel(id="8", nsd_id="2").save() + resp = self.client.delete("/api/nslcm/v1/nspackage/8") + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("success", resp.data["status"]) + self.assertEqual("Delete CSAR(8) successfully.", resp.data["statusDescription"]) + + def test_ns_pkg_force_delete(self): + NSInstModel(id="1", nspackage_id="8").save() + NSDModel(id="8", nsd_id="2").save() + resp = self.client.delete("/api/nslcm/v1/nspackage/8force") + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("success", resp.data["status"]) + self.assertEqual("Delete CSAR(8) successfully.", resp.data["statusDescription"]) + + def test_ns_pkg_when_in_using(self): + NSInstModel(id="1", nspackage_id="8").save() + NSDModel(id="8", nsd_id="2").save() + resp = self.client.delete("/api/nslcm/v1/nspackage/8") + self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual("failed", resp.data["status"]) + self.assertEqual("CSAR(8) is in using, cannot be deleted.", resp.data["statusDescription"]) + + def test_ns_pkg_get_all(self): + NSDModel(id="13", nsd_id="2", vendor="3", version="4").save() + + resp = self.client.get("/api/nslcm/v1/nspackage") + self.assertEqual(resp.status_code, status.HTTP_200_OK) + self.assertEqual({"csars": [{"csarId":"13", "nsdId": "2"}]}, resp.data) + + def test_ns_pkg_get_one(self): + NSDModel(id="14", nsd_id="2", vendor="3", version="4").save() + NSInstModel(id="1", nspackage_id="14", name="11").save() + + resp = self.client.get("/api/nslcm/v1/nspackage/14") + self.assertEqual(resp.status_code, status.HTTP_200_OK) + self.assertEqual({"csarId": "14", + "packageInfo": { + "nsdId": "2", + "nsdProvider": "3", + "nsdVersion": "4" + }, + "nsInstanceInfo": [{ + "nsInstanceId": "1", "nsInstanceName": "11" + }]}, resp.data) + + + + + + + + + + + + diff --git a/lcm/packages/urls.py b/lcm/packages/urls.py index d4b139eb..bef33f39 100644 --- a/lcm/packages/urls.py +++ b/lcm/packages/urls.py @@ -17,8 +17,9 @@ from rest_framework.urlpatterns import format_suffix_patterns from lcm.packages import views urlpatterns = [ - url(r'^api/nslcm/v1/nspackage$', views.ns_distribute, name='ns_distribute'), - url(r'^api/nslcm/v1/vnfpackage$', views.nf_distribute, name='nf_distribute'), + url(r'^api/nslcm/v1/nspackage$', views.ns_distribute_get, name='ns_distribute_get'), + url(r'^api/nslcm/v1/nspackage/(?P<csarId>[0-9a-zA-Z\-\_]+)$', views.ns_rd_csar, name='ns_rd_csar'), + url(r'^api/nslcm/v1/vnfpackage$', views.nf_distribute_get, name='nf_distribute_get'), ######################################################################################### url(r'^api/nslcm/v0/nspackage/(?P<csarId>[0-9a-zA-Z\-\_]+)$', views.ns_access_csar, name='ns_access_csar'), url(r'^api/nslcm/v0/nspackage$', views.ns_on_boarding, name='ns_on_boarding'), diff --git a/lcm/packages/views.py b/lcm/packages/views.py index 28a9bf66..44c1c76c 100644 --- a/lcm/packages/views.py +++ b/lcm/packages/views.py @@ -25,21 +25,47 @@ from lcm.packages import ns_package, nf_package, sdc_ns_package, sdc_nf_package logger = logging.getLogger(__name__) -@api_view(http_method_names=['POST']) -def ns_distribute(request, *args, **kwargs): - csar_id = ignore_case_get(request.data, "csarId") +@api_view(http_method_names=['POST', 'GET']) +def ns_distribute_get(request, *args, **kwargs): + logger.debug("Enter %s, method is %s", fun_name(), request.method) + ret, normal_status = None, None + if request.method == 'GET': + ret = sdc_ns_package.SdcNsPackage().get_csars() + normal_status = status.HTTP_200_OK + else: + csar_id = ignore_case_get(request.data, "csarId") + logger.debug("csar_id is %s", csar_id) + ret = sdc_ns_package.ns_on_distribute(csar_id) + normal_status = status.HTTP_202_ACCEPTED + logger.debug("Leave %s, Return value is %s", fun_name(), ret) + if ret[0] != 0: + return Response(data={'error': ret[1]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) + return Response(data=ret[1], status=normal_status) + +@api_view(http_method_names=['GET', 'DELETE']) +def ns_rd_csar(request, *args, **kwargs): + csar_id = ignore_case_get(kwargs, "csarId") logger.info("Enter %s, method is %s, csar_id is %s", fun_name(), request.method, csar_id) - ret = sdc_ns_package.ns_on_distribute(csar_id) - logger.info("Leave %s, Return value is %s", fun_name(), ret) + ret, normal_status = None, None + if request.method == 'GET': + ret = sdc_ns_package.ns_get_csar(csar_id) + normal_status = status.HTTP_200_OK + else: + force_delete = csar_id.endswith("force") + if force_delete: + csar_id = csar_id[:-5] + ret = sdc_ns_package.ns_delete_csar(csar_id, force_delete) + normal_status = status.HTTP_202_ACCEPTED + logger.info("Leave %s, Return value is %s", fun_name(), str(ret)) if ret[0] != 0: return Response(data={'error': ret[1]}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) - return Response(data=ret[1], status=status.HTTP_202_ACCEPTED) + return Response(data=ret[1], status=normal_status) #################################################################################################### @api_view(http_method_names=['POST', 'GET']) -def nf_distribute(request, *args, **kwargs): - logger.info("Enter %s%s, method is %s", fun_name(), request.data, request.method) +def nf_distribute_get(request, *args, **kwargs): + logger.debug("Enter %s%s, method is %s", fun_name(), request.data, request.method) if request.method == 'GET': ret = sdc_nf_package.SdcNfPackage().get_csars() logger.debug("csars=%s", ret) @@ -50,7 +76,7 @@ def nf_distribute(request, *args, **kwargs): job_id = str(uuid.uuid4()) sdc_nf_package.SdcNfDistributeThread(csar_id, vim_ids, lab_vim_id, job_id).start() ret = {"jobId": job_id} - logger.info("Leave %s, Return value is %s", fun_name(), ret) + logger.debug("Leave %s, Return value is %s", fun_name(), ret) return Response(data=ret, status=status.HTTP_202_ACCEPTED) diff --git a/lcm/pub/msapi/sdc.py b/lcm/pub/msapi/sdc.py index 1d4569db..7a3e9394 100644 --- a/lcm/pub/msapi/sdc.py +++ b/lcm/pub/msapi/sdc.py @@ -16,7 +16,7 @@ import json import logging from lcm.pub.exceptions import NSLCMException -from lcm.pub.utils.restcall import call_req, rest_no_auth +from lcm.pub.utils import restcall from lcm.pub.config.config import SDC_BASE_URL, SDC_USER, SDC_PASSWD logger = logging.getLogger(__name__) @@ -25,10 +25,10 @@ ASSETTYPE_RESOURCES = "resources" ASSETTYPE_SERVICES = "services" def call_sdc(resource, method, content=''): - return call_req(base_url=SDC_BASE_URL, + return restcall.call_req(base_url=SDC_BASE_URL, user=SDC_USER, passwd=SDC_PASSWD, - auth_type=rest_no_auth, + auth_type=restcall.rest_no_auth, resource=resource, method=method, content=content) @@ -59,7 +59,7 @@ def delete_artifact(asset_type, asset_id, artifact_id): return json.JSONDecoder().decode(ret[1]) def download_artifacts(download_url, local_path): - ret = call_req(base_url=download_url, + ret = restcall.call_req(base_url=download_url, user=SDC_USER, passwd=SDC_PASSWD, auth_type=rest_no_auth, |