diff options
-rw-r--r-- | lcm/ns/ns_create.py | 36 | ||||
-rw-r--r-- | lcm/ns/ns_delete.py | 65 | ||||
-rw-r--r-- | lcm/ns/ns_terminate.py | 25 | ||||
-rw-r--r-- | lcm/ns/tests/test_ns_create.py | 8 | ||||
-rw-r--r-- | lcm/ns/tests/test_ns_delete.py | 71 | ||||
-rw-r--r-- | lcm/ns/views.py | 10 | ||||
-rw-r--r-- | lcm/pub/msapi/aai.py | 6 |
7 files changed, 187 insertions, 34 deletions
diff --git a/lcm/ns/ns_create.py b/lcm/ns/ns_create.py index 69d7ae5a..a80bf8d5 100644 --- a/lcm/ns/ns_create.py +++ b/lcm/ns/ns_create.py @@ -16,6 +16,7 @@ import uuid from lcm.pub.database.models import NSDModel, NSInstModel from lcm.pub.exceptions import NSLCMException +from lcm.pub.msapi.aai import create_customer_aai from lcm.pub.utils.timeutil import now_time logger = logging.getLogger(__name__) @@ -33,6 +34,7 @@ class CreateNSService(object): self.check_nsd_valid() self.check_ns_inst_name_exist() self.create_ns_inst() + self.create_ns_in_aai() logger.debug("CreateNSService::do_biz::ns_inst_id=%s" % self.ns_inst_id) return self.ns_inst_id @@ -53,7 +55,37 @@ class CreateNSService(object): def create_ns_inst(self): self.ns_inst_id = str(uuid.uuid4()) logger.debug("CreateNSService::create_ns_inst::ns_inst_id=%s" % self.ns_inst_id) - NSInstModel(id=self.ns_inst_id, name=self.ns_name, nspackage_id=self.ns_package_id, - nsd_id=self.nsd_id, description=self.description, status='empty', + NSInstModel(id=self.ns_inst_id, name=self.ns_name, nspackage_id=self.ns_package_id, + nsd_id=self.nsd_id, description=self.description, status='empty', lastuptime=now_time()).save() + def create_ns_in_aai(self): + logger.debug("CreateNSService::create_ns_in_aai::report ns instance[%s] to aai." % self.ns_inst_id) + global_customer_id = "global-customer-id-" + self.ns_inst_id + data = { + "global-customer-id": "global-customer-id-" + self.ns_inst_id, + "subscriber-name": "subscriber-name-" + self.ns_inst_id, + "subscriber-type": "subscriber-type-" + self.ns_inst_id, + "service-subscriptions": { + "service-subscription": [ + { + "service-type": "service-type-" + self.ns_inst_id, + "service-instances": { + "service-instance": [ + { + "service-instance-id": self.ns_inst_id, + "service-instance-name": self.ns_name, + "service-type": "service-type-" + self.ns_inst_id, + "service-role": "service-role-" + self.ns_inst_id + } + ] + } + } + ] + } + } + resp_data, resp_status = create_customer_aai(global_customer_id, data) + if resp_data: + logger.debug("Fail to create ns instance[%s] to aai, resp_status: [%s]." % (self.ns_inst_id, resp_status) ) + else: + logger.debug("Success to create ns instance[%s] to aai, resp_status: [%s]." % (self.ns_inst_id, resp_status) ) diff --git a/lcm/ns/ns_delete.py b/lcm/ns/ns_delete.py new file mode 100644 index 00000000..7d51df46 --- /dev/null +++ b/lcm/ns/ns_delete.py @@ -0,0 +1,65 @@ +# Copyright 2016 ZTE Corporation. +# +# 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. + + +import logging +import traceback + +from lcm.pub.database.models import DefPkgMappingModel, InputParamMappingModel, ServiceBaseInfoModel +from lcm.pub.database.models import NSInstModel +from lcm.pub.msapi.aai import get_customer_aai, delete_customer_aai + + +logger = logging.getLogger(__name__) + + +class DeleteNsService(object): + def __init__(self, ns_inst_id): + self.ns_inst_id = ns_inst_id + + def do_biz(self): + try: + self.delete_ns() + self.delete_ns_in_aai() + except: + logger.error(traceback.format_exc()) + + def delete_ns(self): + logger.debug("delele NSInstModel(%s)", self.ns_inst_id) + NSInstModel.objects.filter(id=self.ns_inst_id).delete() + + logger.debug("delele InputParamMappingModel(%s)", self.ns_inst_id) + InputParamMappingModel.objects.filter(service_id=self.ns_inst_id).delete() + + logger.debug("delele DefPkgMappingModel(%s)", self.ns_inst_id) + DefPkgMappingModel.objects.filter(service_id=self.ns_inst_id).delete() + + logger.debug("delele ServiceBaseInfoModel(%s)", self.ns_inst_id) + ServiceBaseInfoModel.objects.filter(service_id=self.ns_inst_id).delete() + + def delete_ns_in_aai(self): + logger.debug("DeleteNsService::delete_ns_in_aai::delete ns instance[%s] in aai." % self.ns_inst_id) + global_customer_id = "global-customer-id-" + self.ns_inst_id + + # query ns instance in aai, get resource_version + customer_info = get_customer_aai(global_customer_id) + resource_version = customer_info["resource-version"] + + # delete ns instance from aai + resp_data, resp_status = delete_customer_aai(global_customer_id, resource_version) + if resp_data: + logger.debug("Fail to delete ns instance[%s] from aai, resp_status: [%s]." % (self.ns_inst_id, resp_status)) + else: + logger.debug( + "Success to delete ns instance[%s] from aai, resp_status: [%s]." % (self.ns_inst_id, resp_status)) diff --git a/lcm/ns/ns_terminate.py b/lcm/ns/ns_terminate.py index 95806573..dd8a267a 100644 --- a/lcm/ns/ns_terminate.py +++ b/lcm/ns/ns_terminate.py @@ -20,6 +20,7 @@ import time from lcm.ns.vnfs.wait_job import wait_job_finish from lcm.pub.database.models import NSInstModel, VLInstModel, FPInstModel, NfInstModel from lcm.pub.database.models import DefPkgMappingModel, InputParamMappingModel, ServiceBaseInfoModel +from lcm.pub.msapi.aai import get_customer_aai, delete_customer_aai from lcm.pub.utils.jobutil import JOB_MODEL_STATUS, JobUtil from lcm.pub.exceptions import NSLCMException from lcm.pub.msapi.nslcm import call_from_ns_cancel_resource @@ -253,27 +254,3 @@ class TerminateNsService(threading.Thread): floor_progress = int(math.floor(float(target_range[1] - target_range[0]) / 100 * progress)) target_range = floor_progress + target_range[0] return target_range - - -class DeleteNsService(object): - def __init__(self, ns_inst_id): - self.ns_inst_id = ns_inst_id - - def do_biz(self): - try: - self.delete_ns() - except: - logger.error(traceback.format_exc()) - - def delete_ns(self): - logger.debug("delele NSInstModel(%s)", self.ns_inst_id) - NSInstModel.objects.filter(id=self.ns_inst_id).delete() - - logger.debug("delele InputParamMappingModel(%s)", self.ns_inst_id) - InputParamMappingModel.objects.filter(service_id=self.ns_inst_id).delete() - - logger.debug("delele DefPkgMappingModel(%s)", self.ns_inst_id) - DefPkgMappingModel.objects.filter(service_id=self.ns_inst_id).delete() - - logger.debug("delele ServiceBaseInfoModel(%s)", self.ns_inst_id) - ServiceBaseInfoModel.objects.filter(service_id=self.ns_inst_id).delete() diff --git a/lcm/ns/tests/test_ns_create.py b/lcm/ns/tests/test_ns_create.py index a1b836eb..c9e1e080 100644 --- a/lcm/ns/tests/test_ns_create.py +++ b/lcm/ns/tests/test_ns_create.py @@ -11,12 +11,15 @@ # 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. +import json import uuid +import mock from django.test import TestCase, Client from rest_framework import status from lcm.pub.database.models import NSInstModel, NSDModel +from lcm.pub.utils import restcall class TestNsInstantiate(TestCase): @@ -30,7 +33,10 @@ class TestNsInstantiate(TestCase): NSDModel.objects.all().delete() NSInstModel.objects.all().delete() - def test_create_ns(self): + @mock.patch.object(restcall, 'call_req') + def test_create_ns(self, mock_call_req): + r1_create_ns_to_aai = [0, json.JSONEncoder().encode({}), '201'] + mock_call_req.side_effect = [r1_create_ns_to_aai] data = { 'nsdid': self.nsd_id, 'nsname': 'ns', diff --git a/lcm/ns/tests/test_ns_delete.py b/lcm/ns/tests/test_ns_delete.py new file mode 100644 index 00000000..846b6739 --- /dev/null +++ b/lcm/ns/tests/test_ns_delete.py @@ -0,0 +1,71 @@ +# Copyright 2017 ZTE Corporation. +# +# 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. +import json +import uuid + +import mock +from django.test import TestCase, Client +from rest_framework import status + +from lcm.pub.database.models import NSInstModel +from lcm.pub.utils import restcall + + +class TestNsDelelete(TestCase): + def setUp(self): + self.client = Client() + self.ns_inst_id = str(uuid.uuid1()) + NSInstModel.objects.filter().delete() + NSInstModel(id=self.ns_inst_id, nspackage_id="7", nsd_id="2").save() + + # self.nsd_id = str(uuid.uuid4()) + # self.ns_package_id = str(uuid.uuid4()) + # NSDModel(id=self.ns_package_id, nsd_id=self.nsd_id, name='name').save() + + def tearDown(self): + # NSDModel.objects.all().delete() + NSInstModel.objects.all().delete() + + @mock.patch.object(restcall, 'call_req') + def test_delete_ns(self, mock_call_req): + customer_info = { + "global-customer-id": "global-customer-id-9b9348f2-f75d-4559-823d-db7ac138ed34", + "subscriber-name": "subscriber-name-9b9348f2-f75d-4559-823d-db7ac138ed34", + "subscriber-type": "subscriber-type-9b9348f2-f75d-4559-823d-db7ac138ed34", + "resource-version": "1505350719754", + "service-subscriptions": { + "service-subscription": [ + { + "service-type": "service-type-9b9348f2-f75d-4559-823d-db7ac138ed34", + "resource-version": "1505350719887", + "service-instances": { + "service-instance": [ + { + "service-instance-id": "service-instance-id-9b9348f2-f75d-4559-823d-db7ac138ed34", + "service-instance-name": "service-instance-name-9b9348f2-f75d-4559-823d-db7ac138ed34", + "service-type": "service-type-9b9348f2-f75d-4559-823d-db7ac138ed34", + "service-role": "service-role-9b9348f2-f75d-4559-823d-db7ac138ed34", + "resource-version": "1505350720009" + } + ] + } + } + ] + } + } + r1_query_ns_to_aai = [0, json.JSONEncoder().encode(customer_info), '200'] + r2_delete_ns_to_aai = [0, json.JSONEncoder().encode({}), '200'] + mock_call_req.side_effect = [r1_query_ns_to_aai, r2_delete_ns_to_aai] + response = self.client.delete("/api/nslcm/v1/ns/%s" % self.ns_inst_id) + self.failUnlessEqual(status.HTTP_204_NO_CONTENT, response.status_code) diff --git a/lcm/ns/views.py b/lcm/ns/views.py index 8ce4c059..dbf285e7 100644 --- a/lcm/ns/views.py +++ b/lcm/ns/views.py @@ -11,6 +11,8 @@ # 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. + + import json import logging import os @@ -21,16 +23,16 @@ from rest_framework.response import Response from rest_framework.views import APIView from lcm.ns.ns_create import CreateNSService +from lcm.ns.ns_delete import DeleteNsService from lcm.ns.ns_get import GetNSInfoService +from lcm.ns.ns_heal import NSHealService from lcm.ns.ns_instant import InstantNSService from lcm.ns.ns_manual_scale import NSManualScaleService -from lcm.ns.ns_heal import NSHealService -from lcm.ns.ns_terminate import TerminateNsService, DeleteNsService +from lcm.ns.ns_terminate import TerminateNsService from lcm.pub.database.models import NSInstModel, ServiceBaseInfoModel from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE -from lcm.pub.utils.values import ignore_case_get from lcm.pub.utils.restcall import req_by_msb -from lcm.pub.exceptions import NSLCMException +from lcm.pub.utils.values import ignore_case_get logger = logging.getLogger(__name__) diff --git a/lcm/pub/msapi/aai.py b/lcm/pub/msapi/aai.py index c22b0380..51b13b89 100644 --- a/lcm/pub/msapi/aai.py +++ b/lcm/pub/msapi/aai.py @@ -45,11 +45,11 @@ def create_customer_aai(global_customer_id, data): if ret[0] != 0: logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) raise NSLCMException("Customer creation exception in AAI") - return json.JSONDecoder().decode(ret[1]) + return json.JSONDecoder().decode(ret[1]), ret[2] def get_customer_aai(global_customer_id): - resource = "/business/customers/customer/%s" % global_customer_id + resource = "/business/customers/customer/%s?depth=all" % global_customer_id ret = call_aai(resource, "GET") if ret[0] != 0: logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) @@ -65,7 +65,7 @@ def delete_customer_aai(global_customer_id, resource_version=""): if ret[0] != 0: logger.error("Status code is %s, detail is %s.", ret[2], ret[1]) raise NSLCMException("Customer delete exception in AAI") - return json.JSONDecoder().decode(ret[1]) + return json.JSONDecoder().decode(ret[1]), ret[2] def create_ns_aai(global_customer_id, service_type, service_instance_id, data): |