Add lcm notify call in vnf inst and term 65/72965/7
authorfujinhua <fu.jinhua@zte.com.cn>
Sat, 17 Nov 2018 06:39:13 +0000 (14:39 +0800)
committerfujinhua <fu.jinhua@zte.com.cn>
Tue, 20 Nov 2018 10:30:30 +0000 (18:30 +0800)
Change-Id: I7808360954933f1dbdcb2ae9341bb1e2d8e69c6c
Issue-ID: VFC-1163
Signed-off-by: fujinhua <fu.jinhua@zte.com.cn>
lcm/lcm/nf/biz/common.py
lcm/lcm/nf/biz/create_vnf.py
lcm/lcm/nf/biz/instantiate_vnf.py
lcm/lcm/nf/biz/terminate_vnf.py
lcm/lcm/nf/serializers/create_vnf_req.py
lcm/lcm/nf/tests/test_instantiate_vnf.py
lcm/lcm/nf/tests/test_terminate_vnf.py
lcm/lcm/nf/views/curd_vnf_views.py
lcm/lcm/pub/msapi/gvnfmdriver.py

index 3c21ab5..212c74c 100644 (file)
@@ -121,6 +121,7 @@ def vm_save(job_id, nf_inst_id, ret):
     JobUtil.add_job_status(job_id, 70, 'Create vms!')
     vm_id = str(uuid.uuid4())
     nics = ignore_case_get(ret, "nicArray")
+    volumes = ignore_case_get(ret, "volumeArray")
     VmInstModel.objects.create(
         vmid=vm_id,
         vmname=ignore_case_get(ret, "name"),
@@ -129,7 +130,7 @@ def vm_save(job_id, nf_inst_id, ret):
         tenant=ignore_case_get(ret, "tenantId"),
         nic_array=nics if nics else "null",
         metadata=ignore_case_get(ret, "metadata"),
-        volume_array=ignore_case_get(ret, "volumeArray"),
+        volume_array=volumes if volumes else "null",
         server_group=ignore_case_get(ret, "serverGroup"),
         availability_zone=str(ignore_case_get(ret, "availabilityZone", "undefined")),
         flavor_id=ignore_case_get(ret, "flavorId"),
index 09f5e76..fc0891a 100644 (file)
@@ -52,6 +52,7 @@ class CreateVnf:
         netype = ignore_case_get(metadata, "type", "undefined")
         vnfsoftwareversion = ignore_case_get(metadata, "version", "undefined")
         NfInstModel.objects.create(nfinstid=self.nf_inst_id,
+                                   vnfminstid=ignore_case_get(self.data, "vnfmInstId", "undefined"),
                                    nf_name=self.vnf_instance_mame,
                                    package_id=self.csar_id,
                                    version=version,
index 203a12b..101c96f 100644 (file)
@@ -20,7 +20,7 @@ from threading import Thread
 from lcm.pub.database.models import NfInstModel
 from lcm.pub.exceptions import NFLCMException
 from lcm.pub.msapi.gvnfmdriver import prepare_notification_data
-from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo
+from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo
 from lcm.pub.msapi.sdc_run_catalog import query_vnfpackage_by_id
 from lcm.pub.utils.jobutil import JobUtil
 from lcm.pub.utils.timeutil import now_time
@@ -136,8 +136,11 @@ class InstantiateVnf(Thread):
     def lcm_notify(self):
         notification_content = prepare_notification_data(self.nf_inst_id, self.job_id, CHANGE_TYPE.ADDED, OPERATION_TYPE.INSTANTIATE)
         logger.info('Notify request data = %s' % notification_content)
-        # resp = notify_lcm_to_nfvo(json.dumps(notification_content))
-        # logger.info('Lcm notify end, response %s' % resp)
+        try:
+            resp = notify_lcm_to_nfvo(json.dumps(notification_content))
+            logger.info('Lcm notify end, response %s' % resp)
+        except Exception as e:
+            logger.error("Lcm instantiate notify failed: %s", e.message)
         NotificationsUtil().send_notification(notification_content)
 
     def vnf_inst_failed_handle(self, error_msg):
index 250ce7f..b9e6dd3 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import json
+import json
 import logging
 import traceback
 from threading import Thread
@@ -25,7 +25,7 @@ from lcm.pub.database.models import (
 )
 from lcm.pub.exceptions import NFLCMException
 from lcm.pub.msapi.gvnfmdriver import prepare_notification_data
-from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo
+from lcm.pub.msapi.gvnfmdriver import notify_lcm_to_nfvo
 from lcm.pub.utils.jobutil import JobUtil
 from lcm.pub.utils.timeutil import now_time
 from lcm.pub.utils.notificationsutil import NotificationsUtil
@@ -122,8 +122,11 @@ class TerminateVnf(Thread):
     def lcm_notify(self):
         NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status='NOT_INSTANTIATED', lastuptime=now_time())
         logger.info('Send notify request to nfvo')
-        # resp = notify_lcm_to_nfvo(json.dumps(self.notify_data))
-        # logger.info('Lcm notify end, response: %s' % resp)
+        try:
+            resp = notify_lcm_to_nfvo(json.dumps(self.notify_data))
+            logger.info('Lcm notify end, response: %s' % resp)
+        except Exception as e:
+            logger.error("Lcm terminate notify failed: %s", e.message)
         NotificationsUtil().send_notification(self.notify_data)
 
     def vnf_term_failed_handle(self, error_msg):
index 6aba12f..5ebe3a0 100644 (file)
@@ -32,3 +32,9 @@ class CreateVnfReqSerializer(serializers.Serializer):
         required=False,
         allow_null=True,
         allow_blank=True)
+    vnfmInstId = serializers.CharField(
+        help_text="VNFM instance ID passed from nfvo.",
+        max_length=255,
+        required=False,
+        allow_null=True,
+        allow_blank=True)
index b54a135..d52787b 100644 (file)
@@ -221,9 +221,8 @@ class TestNFInstantiate(TestCase):
         r1_get_vnfpackage_by_vnfdid = [0, json.JSONEncoder().encode(vnfpackage_info), '200']\r
         r2_apply_grant_result = [0, json.JSONEncoder().encode(self.grant_result), '200']\r
         r3_all_aai_result = [1, json.JSONEncoder().encode(''), '404']\r
-        # r4_lcm_notify_result = [0, json.JSONEncoder().encode(''), '200']\r
-        # mock_call_req.side_effect = [r1_get_vnfpackage_by_vnfdid, r2_apply_grant_result, r3_all_aai_result, r4_lcm_notify_result]\r
-        mock_call_req.side_effect = [r1_get_vnfpackage_by_vnfdid, r2_apply_grant_result, r3_all_aai_result]\r
+        r4_lcm_notify_result = [0, json.JSONEncoder().encode(''), '200']\r
+        mock_call_req.side_effect = [r1_get_vnfpackage_by_vnfdid, r2_apply_grant_result, r3_all_aai_result, r4_lcm_notify_result]\r
         mock_call.side_effect = [c1_data_get_tenant_id,\r
                                  c2_data_create_volume, c3_data_get_volume,\r
                                  c4_data_create_network,\r
@@ -237,4 +236,4 @@ class TestNFInstantiate(TestCase):
         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
         data = inst_req_data\r
         InstantiateVnf(data, nf_inst_id=self.nf_inst_id, job_id=self.job_id).run()\r
-        self.assert_job_result(self.job_id, 100, 'Instantiate Vnf success.')\r
+        self.assert_job_result(self.job_id, 100, 'Instantiate Vnf success.')\r
index 5e9a9a8..b5f75f3 100644 (file)
@@ -171,10 +171,9 @@ class TestNFTerminate(TestCase):
                     }\r
                 ]\r
             }), '200']\r
-        t2_lcm_notify_result = [0, json.JSONEncoder().encode(''), '200']\r
+        t2_lcm_notify_result = [0, json.JSONEncoder().encode(''), '200']\r
         t3_delete_flavor = [0, json.JSONEncoder().encode({"vim_id": "vimid_1"}), '200']\r
-        # mock_call_req.side_effect = [t1_apply_grant_result, t2_lcm_notify_result, t3_delete_flavor]\r
-        mock_call_req.side_effect = [t1_apply_grant_result, t3_delete_flavor]\r
+        mock_call_req.side_effect = [t1_apply_grant_result, t2_lcm_notify_result, t3_delete_flavor]\r
         mock_call.return_value = None\r
         mock_post_notification.return_value = None\r
         data = {\r
index 3200e1f..ae8a211 100644 (file)
@@ -70,7 +70,7 @@ class CreateVnfAndQueryVnfs(APIView):
             if not req_serializer.is_valid():
                 raise NFLCMException(req_serializer.errors)
 
-            nf_inst = CreateVnf(req_serializer.data).do_biz()
+            nf_inst = CreateVnf(request.data).do_biz()
             create_vnf_resp_serializer = VnfInstanceSerializer(data={"id": nf_inst.nfinstid,
                                                                      "vnfProvider": nf_inst.vendor,
                                                                      "vnfdVersion": nf_inst.version,
index 13e8dee..c2519ea 100644 (file)
@@ -61,7 +61,7 @@ def prepare_notification_data(nfinstid, jobid, changetype, operation):
             vm = VmInstModel.objects.filter(vmid=vnfc.vmid)
             if vm:
                 vm_resource = {
-                    'vimId': vm[0].vimid,
+                    'vimConnectionId': vm[0].vimid,
                     'resourceId': vm[0].resourceid,
                     'resourceProviderId': vm[0].vmname,  # TODO: is resourceName mapped to resourceProviderId?
                     'vimLevelResourceType': 'vm'
@@ -87,10 +87,13 @@ def prepare_notification_data(nfinstid, jobid, changetype, operation):
             'changeType': changetype,
             'networkResource': network_resource
         })
-    ext_link_ports = []
+    ext_connectivity = []
+    ext_connectivity_map = {}
     ports = PortInstModel.objects.filter(instid=nfinstid)
     for port in ports:
-        ext_link_ports.append({
+        if port.networkid not in ext_connectivity_map:
+            ext_connectivity_map[port.networkid] = []
+        ext_connectivity_map[port.networkid].append({
             'id': port.portid,  # TODO: port.portid or port.nodeid?
             'resourceHandle': {
                 'vimConnectionId': port.vimid,
@@ -99,7 +102,21 @@ def prepare_notification_data(nfinstid, jobid, changetype, operation):
                 'vimLevelResourceType': 'port'
             },
             'cpInstanceId': port.cpinstanceid  # TODO: port.cpinstanceid is not initiated when create port resource.
-        }),
+        })
+    for network_id, ext_link_ports in ext_connectivity_map.items():
+        networks = NetworkInstModel.objects.filter(networkid=network_id)
+        network = networks[0]
+        network_resource = {
+            'vimConnectionId': network.vimid,
+            'resourceId': network.resourceid,
+            'resourceProviderId': network.name,  # TODO: is resourceName mapped to resourceProviderId?
+            'vimLevelResourceType': 'network'
+        }
+        ext_connectivity.append({
+            'id': network_id,
+            'resourceHandle': network_resource,
+            'extLinkPorts': ext_link_ports
+        })
     affected_vss = []
     vss = StorageInstModel.objects.filter(instid=nfinstid)
     for vs in vss:
@@ -128,11 +145,7 @@ def prepare_notification_data(nfinstid, jobid, changetype, operation):
         'affectedVnfcs': affected_vnfcs,
         'affectedVirtualLinks': affected_vls,
         'affectedVirtualStorages': affected_vss,
-        'chengedExtConnectivity': [{
-            'id': None,  # TODO
-            'resourceHandle': None,  # TODO
-            'extLinkPorts': ext_link_ports
-        }],
+        'changedExtConnectivity': ext_connectivity,
         '_links': {
             'vnfInstance': {'href': '/api/vnflcm/v1/vnf_instances/%s' % nfinstid},
             # set 'subscription' link after filtering for subscribers
@@ -140,6 +153,6 @@ def prepare_notification_data(nfinstid, jobid, changetype, operation):
         }
     }
     nfInsts = NfInstModel.objects.filter(nfinstid=nfinstid)
-    notification_content['vnfmInstId'] = nfInsts[0].vnfminstid
+    notification_content['vnfmInstId'] = nfInsts[0].vnfminstid if nfInsts[0].vnfminstid else '1'
     logger.info('Notify request data = %s' % notification_content)
     return notification_content