Add seed codes of nfvo
[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             #raise NSLCMException("No grant resource is found.")
46             has_res_tpl = True
47
48         for res in ignore_case_get(self.data, grant_type):
49             if "resourceTemplate" in res:
50                 has_res_tpl = True
51                 break
52
53         if not has_res_tpl:
54             m_vnf_inst_id = ignore_case_get(self.data, "vnfInstanceId")
55             additional_param = ignore_case_get(self.data, "additionalparam")
56             vnfm_inst_id = ignore_case_get(additional_param, "vnfmid")
57             vim_id = ignore_case_get(additional_param, "vimid")
58
59             vnfinsts = NfInstModel.objects.filter(
60                 mnfinstid=m_vnf_inst_id, vnfm_inst_id=vnfm_inst_id)
61             if not vnfinsts:
62                 raise NSLCMException("Vnfinst(%s) is not found in vnfm(%s)" % (
63                     m_vnf_inst_id, vnfm_inst_id))
64                 
65             vnf_pkg_id = vnfinsts[0].package_id
66             vnf_pkgs = NfPackageModel.objects.filter(nfpackageid=vnf_pkg_id)
67             if not vnf_pkgs:
68                 raise NSLCMException("vnfpkg(%s) is not found" % vnf_pkg_id)
69
70             vnfd = json.JSONDecoder().decode(vnf_pkgs[0].vnfdmodel)
71
72             req_param = {
73                 "vnfInstanceId": m_vnf_inst_id, 
74                 "vimId": vim_id, 
75                 "additionalParam": additional_param,
76                 grant_type: []
77             }
78             for res in ignore_case_get(self.data, grant_type):
79                 vdu_name = ignore_case_get(res, "vdu")
80                 grant_res = {
81                     "resourceDefinitionId": ignore_case_get(res, "resourceDefinitionId"),
82                     "type": ignore_case_get(res,"type"),
83                     "vdu": vdu_name
84                 }
85                 for vdu in vnfd["vdus"]:
86                     if vdu_name in (vdu["vdu_id"], vdu["properties"].get("name", "")):
87                         grant_res["resourceTemplate"] = self.get_res_tpl(vdu, vnfd)
88                         break
89                 req_param[grant_type].append(grant_res)
90             self.data = req_param
91         return resmgr.grant_vnf(self.data)
92
93     def get_res_tpl(self, vdu, vnfd):
94         storage_size = 0
95         for storage_id in vdu["local_storages"]:
96             storage_size = storage_size + self.get_storage_size(storage_id, vnfd)
97         resourceTemplate = {
98             "virtualComputeDescriptor": {
99                 "virtualCpu": {
100                     "numVirtualCpu": int(vdu["nfv_compute"]["num_cpus"])
101                 },
102                 "virtualMemory": {
103                     "virtualMemSize": int(vdu["nfv_compute"]["mem_size"]) 
104                 }
105             },
106             "virtualStorageDescriptor": {
107                 "typeOfStorage": "",
108                 "sizeOfStorage": storage_size,
109                 "swImageDescriptor": ""
110             }
111         }
112         return resourceTemplate
113
114     def get_storage_size(self, storage_id, vnfd):
115         for storage in vnfd["local_storages"]:
116             if storage_id == storage["local_storage_id"]:
117                 return int(storage["properties"]["size"])
118         return 0
119
120
121
122
123
124
125