0bef6131f6d03c9e9af66e832104ce3004c3f26c
[vfc/nfvo/lcm.git] / lcm / ns / vnfs / grant_vnfs.py
1 # Copyright 2016 ZTE Corporation.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import logging
16 import json
17
18 from lcm.pub.msapi import resmgr
19 from lcm.pub.database.models import NfPackageModel, NfInstModel
20 from lcm.pub.exceptions import NSLCMException
21 from lcm.pub.utils.values import ignore_case_get
22
23 logger = logging.getLogger(__name__)
24
25
26 class GrantVnfs(object):
27     def __init__(self, data, job_id):
28         self.job_id = job_id
29         self.vnfm_inst_id = ''
30         self.vnf_uuid = ''
31         self.vnfm_job_id = ''
32         self.data = data
33
34     def send_grant_vnf_to_resMgr(self):
35         logger.debug("grant data from vnfm:%s", self.data)
36         if isinstance(self.data, (unicode, str)):
37             self.data = json.JSONDecoder().decode(self.data)
38         has_res_tpl = False
39         grant_type = None
40         if ignore_case_get(self.data, "addResource"):
41             grant_type = "addResource"
42         elif ignore_case_get(self.data, "removeResource"):
43             grant_type = "removeResource"
44         else:
45             has_res_tpl = True
46
47         for res in ignore_case_get(self.data, grant_type):
48             if "resourceTemplate" in res:
49                 has_res_tpl = True
50                 break
51
52         if not has_res_tpl:
53             m_vnf_inst_id = ignore_case_get(self.data, "vnfInstanceId")
54             additional_param = ignore_case_get(self.data, "additionalparam")
55             vnfm_inst_id = ignore_case_get(additional_param, "vnfmid")
56             vim_id = ignore_case_get(additional_param, "vimid")
57
58             vnfinsts = NfInstModel.objects.filter(
59                 mnfinstid=m_vnf_inst_id, vnfm_inst_id=vnfm_inst_id)
60             if not vnfinsts:
61                 raise NSLCMException("Vnfinst(%s) is not found in vnfm(%s)" % (
62                     m_vnf_inst_id, vnfm_inst_id))
63                 
64             vnf_pkg_id = vnfinsts[0].package_id
65             vnf_pkgs = NfPackageModel.objects.filter(nfpackageid=vnf_pkg_id)
66             if not vnf_pkgs:
67                 raise NSLCMException("vnfpkg(%s) is not found" % vnf_pkg_id)
68
69             vnfd = json.JSONDecoder().decode(vnf_pkgs[0].vnfdmodel)
70
71             req_param = {
72                 "vnfInstanceId": m_vnf_inst_id, 
73                 "vimId": vim_id, 
74                 "additionalParam": additional_param,
75                 grant_type: []
76             }
77             for res in ignore_case_get(self.data, grant_type):
78                 vdu_name = ignore_case_get(res, "vdu")
79                 grant_res = {
80                     "resourceDefinitionId": ignore_case_get(res, "resourceDefinitionId"),
81                     "type": ignore_case_get(res,"type"),
82                     "vdu": vdu_name
83                 }
84                 for vdu in vnfd["vdus"]:
85                     if vdu_name in (vdu["vdu_id"], vdu["properties"].get("name", "")):
86                         grant_res["resourceTemplate"] = self.get_res_tpl(vdu, vnfd)
87                         break
88                 req_param[grant_type].append(grant_res)
89             self.data = req_param
90         return resmgr.grant_vnf(self.data)
91
92     def get_res_tpl(self, vdu, vnfd):
93         storage_size = 0
94         for storage_id in vdu["local_storages"]:
95             storage_size = storage_size + self.get_storage_size(storage_id, vnfd)
96         resourceTemplate = {
97             "virtualComputeDescriptor": {
98                 "virtualCpu": {
99                     "numVirtualCpu": int(vdu["nfv_compute"]["num_cpus"])
100                 },
101                 "virtualMemory": {
102                     "virtualMemSize": int(vdu["nfv_compute"]["mem_size"]) 
103                 }
104             },
105             "virtualStorageDescriptor": {
106                 "typeOfStorage": "",
107                 "sizeOfStorage": storage_size,
108                 "swImageDescriptor": ""
109             }
110         }
111         return resourceTemplate
112
113     def get_storage_size(self, storage_id, vnfd):
114         for storage in vnfd["local_storages"]:
115             if storage_id == storage["local_storage_id"]:
116                 return int(storage["properties"]["size"])
117         return 0