2 * Copyright 2016-2017 Huawei Technologies Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.process;
19 import java.util.HashMap;
22 import org.apache.commons.lang.StringUtils;
23 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.servicetoken.VnfmRestfulUtil;
24 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.Constant;
25 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.ParamConstants;
26 import org.openo.baseservice.roa.util.restclient.RestfulResponse;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 import net.sf.json.JSONArray;
31 import net.sf.json.JSONException;
32 import net.sf.json.JSONObject;
35 * Provide function of resource for VNFM.
41 * @version NFVO 0.5 Aug 25, 2016
43 public class VnfResourceMgr {
45 private static final Logger LOG = LoggerFactory.getLogger(VnfResourceMgr.class);
48 * Provide function of grant resource for VNFM.
57 public JSONObject grantVnfResource(JSONObject vnfObj, String vnfId, String vnfmId) {
58 LOG.warn("function=grantVnfResource, msg=enter to grant vnf resource, params: {}", vnfObj);
59 JSONObject resultJson = new JSONObject();
60 resultJson.put("retCode", Constant.REST_FAIL);
62 String type = vnfObj.getString("type");
63 String requestType = vnfObj.getString("operation_right");
64 String vnfName = vnfObj.getString("vnf_name");
66 if(StringUtils.isEmpty(type) || StringUtils.isEmpty(requestType) || StringUtils.isEmpty(vnfName)
67 || StringUtils.isEmpty(vnfId)) {
68 LOG.error("function=grantVnfResource, msg=grant basic params error");
69 resultJson.put("errorMsg", "basic params error");
73 JSONArray vmList = vnfObj.getJSONArray("vm_list");
75 Map<String, Integer> resMap = calculateGrantRes(vmList);
78 LOG.error("function=grantVnfResource, msg=grant resource params error");
79 resultJson.put("errorMsg", "resource params error");
83 JSONObject grantObj = new JSONObject();
84 grantObj.put("vimId", vnfObj.getString("vim_id"));
85 grantObj.put("vnfId", vnfId);
86 grantObj.put("vnfName", vnfName);
87 grantObj.put("vnfmId", vnfmId);
88 String action = getGrantAction(type, requestType);
89 grantObj.put("action", action);
91 JSONObject grantParam = parseGrantParam(resMap, grantObj);
92 resultJson = sendGrantToResmgr(grantParam);
93 LOG.error("function=grantVnfResource, resultJson={}.", resultJson);
94 } catch(JSONException e) {
95 LOG.error("function=grantVnfResource, msg=parse params occoured JSONException e={}.", e);
96 resultJson.put("errorMsg", "params parse exception");
109 private JSONObject sendGrantToResmgr(JSONObject grantParam) {
110 RestfulResponse rsp = VnfmRestfulUtil.getRemoteResponse(ParamConstants.GRANT_RES_URL, VnfmRestfulUtil.TYPE_PUT,
111 grantParam.toString());
112 if(rsp == null || rsp.getStatus() != Constant.HTTP_OK) {
115 LOG.error("funtion=sendGrantToResmgr, status={}", rsp.getStatus());
116 return JSONObject.fromObject(rsp.getResponseContent());
127 private JSONObject parseGrantParam(Map<String, Integer> resMap, JSONObject grantParam) {
128 JSONObject result = new JSONObject();
129 result.put("vnfInstanceId", grantParam.getString("vnfId"));
130 result.put("vimId", grantParam.getString("vimId"));
132 JSONArray resource = new JSONArray();
133 JSONObject resourceObj = new JSONObject();
134 resourceObj.put("type", "vdu");
135 JSONObject resourceTemplate = new JSONObject();
136 JSONObject storage = new JSONObject();
137 storage.put("sizeOfStorage", resMap.get("diskNum"));
138 storage.put("typeOfStorage", "");
139 storage.put("swImageDescriptor", "");
140 JSONObject compute = new JSONObject();
141 JSONObject virtualMemory = new JSONObject();
142 virtualMemory.put("virtualMemSize", resMap.get("memNum"));
143 JSONObject virtualCpu = new JSONObject();
144 virtualCpu.put("numVirtualCpu", resMap.get("cpuNum"));
145 compute.put("virtualMemory", virtualMemory);
146 compute.put("virtualCpu", virtualCpu);
147 resourceTemplate.put("virtualStorageDescriptor", storage);
148 resourceTemplate.put("virtualComputeDescriptor", compute);
149 resourceObj.put("resourceTemplate", resourceTemplate);
150 resourceObj.put("resourceDefinitionId", "");
151 resourceObj.put("vdu", grantParam.getString("vnfName"));
152 resource.add(resourceObj);
154 if("online".equals(grantParam.getString("action")) || "scaleOut".equals(grantParam.getString("action"))) {
155 result.put("addResource", resource);
157 result.put("removeResource", resource);
160 JSONObject additionalParam = new JSONObject();
161 additionalParam.put("vnfmId", grantParam.getString("vnfmId"));
162 additionalParam.put("vimId", grantParam.getString("vimId"));
163 additionalParam.put("tenant", "");
164 result.put("additionalParam", additionalParam);
165 LOG.info("funtion=parseGrantParam, result={}", result);
169 private Map<String, Integer> calculateGrantRes(JSONArray vmList) {
170 Map<String, Integer> resMap = new HashMap<>(Constant.DEFAULT_COLLECTION_SIZE);
171 int vmSize = vmList.size();
182 for(int i = 0; i < vmSize; i++) {
183 JSONObject resInfo = vmList.getJSONObject(i);
184 JSONObject vmFlavor = resInfo.getJSONObject("vm_flavor");
185 initNum = Integer.parseInt(resInfo.getString("init_number"));
191 JSONArray volumList = vmFlavor.getJSONArray("storage");
192 diskSize = volumList.size();
194 for(int j = 0; j < diskSize; j++) {
195 JSONObject volumeInfo = volumList.getJSONObject(j);
196 diskTmp += getDiskQuantity(volumeInfo);
199 cpuTmp = Integer.parseInt(vmFlavor.getString("num_cpus"));
200 memTmp = Integer.parseInt(vmFlavor.getString("mem_size"));
202 cpuNum += cpuTmp * initNum;
203 memNum += memTmp * initNum;
204 diskNum += diskTmp * initNum;
209 } catch(JSONException e) {
210 LOG.error("function=calculateGrantRes, msg=parse params occoured JSONException e={}.", e);
214 resMap.put("cpuNum", cpuNum);
215 resMap.put("memNum", memNum);
216 resMap.put("diskNum", diskNum);
220 private String getGrantAction(String type, String requestType) {
221 String action = "unknown";
223 if(("increase").equals(requestType)) {
224 if(("instantiation").equals(type)) {
226 } else if(("scale").equals(type)) {
230 } else if(("decrease").equals(requestType)) {
231 if(("instantiation").equals(type)) {
233 } else if(("scale").equals(type)) {
241 private int getDiskQuantity(JSONObject volumeObj) {
243 if(volumeObj.containsKey("vol_type")) {
244 if("local_volume".equals(volumeObj.getString("vol_type"))) {
245 disk = Integer.parseInt(volumeObj.getString("vol_size"));
247 } else if(volumeObj.containsKey("storage_type") && "local_image".equals(volumeObj.getString("storage_type"))) {
249 disk = Integer.parseInt(volumeObj.getString("disk_size"));