Update python2 to python3
[vfc/nfvo/lcm.git] / lcm / ns_vnfs / biz / grant_vnf.py
index 4734850..9c869ea 100644 (file)
 import json
 import logging
 import uuid
-from lcm.pub.database.models import NfInstModel
+import time
+from lcm.pub.database.models import NfInstModel, OOFDataModel
 from lcm.pub.exceptions import NSLCMException
 from lcm.pub.msapi.sdc_run_catalog import query_vnfpackage_by_id
 from lcm.pub.utils.values import ignore_case_get
 from lcm.pub.msapi import resmgr
+from lcm.ns_vnfs.const import SCALAR_UNIT_DICT
 
 logger = logging.getLogger(__name__)
 
@@ -30,10 +32,11 @@ class GrantVnf(object):
 
     def exec_grant(self):
         logger.debug("grant data from vnfm:%s", self.data)
-        if isinstance(self.data, (unicode, str)):
+        if isinstance(self.data, str):
             self.data = json.JSONDecoder().decode(self.data)
         has_res_tpl = False
         grant_type = None
+        action_type = ignore_case_get(self.data, "operation")
         vimConnections = []
         if ignore_case_get(self.data, "addResources"):
             grant_type = "addResources"
@@ -52,9 +55,12 @@ class GrantVnf(object):
             additional_param = ignore_case_get(self.data, "additionalparams")
             vnfm_inst_id = ignore_case_get(additional_param, "vnfmid")
             vim_id = ignore_case_get(additional_param, "vimid")
-
-            vnfinsts = NfInstModel.objects.filter(
-                nfinstid=m_vnf_inst_id, vnfm_inst_id=vnfm_inst_id)
+            if vnfm_inst_id and vnfm_inst_id != "":
+                vnfinsts = NfInstModel.objects.filter(
+                    mnfinstid=m_vnf_inst_id, vnfm_inst_id=vnfm_inst_id)
+            else:
+                vnfinsts = NfInstModel.objects.filter(
+                    mnfinstid=m_vnf_inst_id)
             if not vnfinsts:
                 raise NSLCMException("Vnfinst(%s) is not found in vnfm(%s)" % (
                     m_vnf_inst_id, vnfm_inst_id))
@@ -84,13 +90,48 @@ class GrantVnf(object):
                         break
                 req_param[grant_type].append(grant_res)
             self.data = req_param
-        vimConnections.append(resmgr.grant_vnf(self.data))
+        tmp = resmgr.grant_vnf(self.data)
+        vimConnections.append(
+            {
+                "id": tmp["vim"]["vimId"],
+                "vimId": tmp["vim"]["vimId"],
+                "vimType": None,
+                "interfaceInfo": None,
+                "accessInfo": tmp["vim"]["accessInfo"],
+                "extra": None
+            }
+        )
+
         grant_resp = {
             "id": str(uuid.uuid4()),
             "vnfInstanceId": ignore_case_get(self.data, 'vnfInstanceId'),
             "vnfLcmOpOccId": ignore_case_get(self.data, "vnfLcmOpOccId"),
             "vimConnections": vimConnections
         }
+
+        logger.debug("action_type=%s" % action_type)
+        if action_type == 'INSTANTIATE':
+            for i in range(18):
+                offs = OOFDataModel.objects.filter(service_resource_id=ignore_case_get(self.data, "vnfInstanceId"))
+                if not (offs.exists() and offs[0].vdu_info):
+                    logger.debug("Cannot find oof data, retry%s" % (i + 1))
+                    time.sleep(5)
+                    continue
+                try:
+                    vdu_info = json.loads(offs[0].vdu_info)
+                    grant_resp['vimAssets'] = {'computeResourceFlavours': []}
+                    for vdu in vdu_info:
+                        grant_resp['vimAssets']['computeResourceFlavours'].append({
+                            'vimConnectionId': offs[0].vim_id,
+                            'resourceProviderId': vdu.get("vduName"),
+                            'vnfdVirtualComputeDescId': None,  # TODO: required
+                            'vimFlavourId': vdu.get("flavorId")
+                        })
+                        # grant_resp['additionalparams'][off.vim_id] = off.directive
+                except Exception:
+                    logger.debug("Load OOF data error")
+                break
+
         logger.debug("grant_resp=%s", grant_resp)
         return grant_resp
 
@@ -123,11 +164,11 @@ class GrantVnf(object):
 
 
 def parse_unit(val, base_unit):
-    recognized_units = ["B", "kB", "KiB", "MB", "MiB", "GB", "GiB", "TB", "TiB"]
-    units_rate = [1, 1000, 1024, 1000000, 1048576, 1000000000, 1073741824, 1000000000000, 1099511627776]
-    unit_rate_map = {unit.upper(): rate for unit, rate in zip(recognized_units, units_rate)}
+    recognized_units = ["B", "kB", "KiB", "MB", "MiB", "GB", "GiB", "TB", "TiB"]
+    units_rate = [1, 1000, 1024, 1000000, 1048576, 1000000000, 1073741824, 1000000000000, 1099511627776]
+    unit_rate_map = {unit.upper(): rate for unit, rate in zip(recognized_units, units_rate)}
     num_unit = val.strip().split(" ")
     if len(num_unit) != 2:
         return val.strip()
     num, unit = num_unit[0], num_unit[1]
-    return int(num) * unit_rate_map[unit.upper()] / unit_rate_map[base_unit.upper()]
+    return int(num) * SCALAR_UNIT_DICT[unit.upper()] / SCALAR_UNIT_DICT[base_unit.upper()]