/*
* Copyright 2016-2017 Huawei Technologies Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.process;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.restclient.RestfulResponse;
import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.servicetoken.VnfmRestfulUtil;
import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.Constant;
import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.ParamConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
/**
* Provide function of resource for VNFM.
*
*
*
*
* @author
* @version VFC 1.0 Aug 25, 2016
*/
public class VnfResourceMgr {
private static final Logger LOG = LoggerFactory.getLogger(VnfResourceMgr.class);
/**
* Provide function of grant resource for VNFM.
*
*
* @param vnfObj
* @param vnfId
* @param vnfmId
* @return
* @since VFC 1.0
*/
public JSONObject grantVnfResource(JSONObject vnfObj, String vnfId, String vnfmId) {
LOG.warn("function=grantVnfResource, msg=enter to grant vnf resource, params: {}", vnfObj);
JSONObject resultJson = new JSONObject();
resultJson.put(Constant.RETCODE, Constant.REST_FAIL);
try {
String type = vnfObj.getString("type");
String requestType = vnfObj.getString("operation_right");
String vnfName = vnfObj.getString("vnf_name");
if(StringUtils.isEmpty(type) || StringUtils.isEmpty(requestType) || StringUtils.isEmpty(vnfName)
|| StringUtils.isEmpty(vnfId)) {
LOG.error("function=grantVnfResource, msg=grant basic params error");
resultJson.put(Constant.ERRORMSG, "basic params error");
return resultJson;
}
JSONArray vmList = vnfObj.getJSONArray("vm_list");
Map resMap = calculateGrantRes(vmList);
if(null == resMap) {
LOG.error("function=grantVnfResource, msg=grant resource params error");
resultJson.put(Constant.ERRORMSG, "resource params error");
return resultJson;
}
JSONObject grantObj = new JSONObject();
grantObj.put(Constant.VIMID, vnfObj.getString("vim_id"));
grantObj.put("vnfId", vnfId);
grantObj.put("vnfName", vnfName);
grantObj.put(Constant.VNFMID, vnfmId);
String action = getGrantAction(type, requestType);
grantObj.put(Constant.ACTION, action);
JSONObject grantParam = parseGrantParam(resMap, grantObj);
resultJson = sendGrantToResmgr(grantParam);
LOG.error("function=grantVnfResource, resultJson={}.", resultJson);
} catch(JSONException e) {
LOG.error("function=grantVnfResource, msg=parse params occoured JSONException e={}.", e);
resultJson.put(Constant.ERRORMSG, "params parse exception");
}
return resultJson;
}
/**
*
*
* @param grantParam
* @return
* @since VFC 1.0
*/
private JSONObject sendGrantToResmgr(JSONObject grantParam) {
RestfulResponse rsp = VnfmRestfulUtil.getRemoteResponse(ParamConstants.GRANT_RES_URL, VnfmRestfulUtil.TYPE_PUT,
grantParam.toString());
if(rsp == null || rsp.getStatus() != Constant.HTTP_OK) {
return new JSONObject();
}
LOG.error("funtion=sendGrantToResmgr, status={}", rsp.getStatus());
return JSONObject.fromObject(rsp.getResponseContent());
}
/**
*
*
* @param resMap
* @param grantParam
* @return
* @since VFC 1.0
*/
private JSONObject parseGrantParam(Map resMap, JSONObject grantParam) {
JSONObject result = new JSONObject();
result.put("vnfInstanceId", grantParam.getString("vnfId"));
result.put(Constant.VIMID, grantParam.getString(Constant.VIMID));
JSONArray resource = new JSONArray();
JSONObject resourceObj = new JSONObject();
resourceObj.put("type", "vdu");
JSONObject resourceTemplate = new JSONObject();
JSONObject storage = new JSONObject();
storage.put("sizeOfStorage", resMap.get("diskNum"));
storage.put("typeOfStorage", "");
storage.put("swImageDescriptor", "");
JSONObject compute = new JSONObject();
JSONObject virtualMemory = new JSONObject();
virtualMemory.put("virtualMemSize", resMap.get("memNum"));
JSONObject virtualCpu = new JSONObject();
virtualCpu.put("numVirtualCpu", resMap.get("cpuNum"));
compute.put("virtualMemory", virtualMemory);
compute.put("virtualCpu", virtualCpu);
resourceTemplate.put("virtualStorageDescriptor", storage);
resourceTemplate.put("virtualComputeDescriptor", compute);
resourceObj.put("resourceTemplate", resourceTemplate);
resourceObj.put("resourceDefinitionId", "");
resourceObj.put("vdu", grantParam.getString("vnfName"));
resource.add(resourceObj);
if("online".equals(grantParam.getString(Constant.ACTION))
|| "scaleOut".equals(grantParam.getString(Constant.ACTION))) {
result.put("addResource", resource);
} else {
result.put("removeResource", resource);
}
JSONObject additionalParam = new JSONObject();
additionalParam.put(Constant.VNFMID, grantParam.getString(Constant.VNFMID));
additionalParam.put(Constant.VIMID, grantParam.getString(Constant.VIMID));
additionalParam.put("tenant", "");
result.put("additionalParam", additionalParam);
LOG.info("funtion=parseGrantParam, result={}", result);
return result;
}
private Map calculateGrantRes(JSONArray vmList) {
Map resMap = new HashMap<>(Constant.DEFAULT_COLLECTION_SIZE);
int vmSize = vmList.size();
int cpuNum = 0;
int memNum = 0;
int diskNum = 0;
int diskSize = 0;
int cpuTmp = 0;
int memTmp = 0;
int diskTmp = 0;
int initNum = 0;
try {
for(int i = 0; i < vmSize; i++) {
JSONObject resInfo = vmList.getJSONObject(i);
JSONObject vmFlavor = resInfo.getJSONObject("vm_flavor");
initNum = Integer.parseInt(resInfo.getString("init_number"));
if(initNum == 0) {
continue;
}
JSONArray volumList = vmFlavor.getJSONArray("storage");
diskSize = volumList.size();
for(int j = 0; j < diskSize; j++) {
JSONObject volumeInfo = volumList.getJSONObject(j);
diskTmp += getDiskQuantity(volumeInfo);
}
cpuTmp = Integer.parseInt(vmFlavor.getString("num_cpus"));
memTmp = Integer.parseInt(vmFlavor.getString("mem_size"));
cpuNum += cpuTmp * initNum;
memNum += memTmp * initNum;
diskNum += diskTmp * initNum;
diskTmp = 0;
}
} catch(JSONException e) {
LOG.error("function=calculateGrantRes, msg=parse params occoured JSONException e={}.", e);
return null;
}
resMap.put("cpuNum", cpuNum);
resMap.put("memNum", memNum);
resMap.put("diskNum", diskNum);
return resMap;
}
private String getGrantAction(String type, String requestType) {
String action = "unknown";
if(("increase").equals(requestType)) {
if(("instantiation").equals(type)) {
action = "online";
} else if(("scale").equals(type)) {
action = "scaleOut";
}
} else if(("decrease").equals(requestType)) {
if(("instantiation").equals(type)) {
action = "offline";
} else if(("scale").equals(type)) {
action = "scaleIn";
}
}
return action;
}
private int getDiskQuantity(JSONObject volumeObj) {
int disk = 0;
if(volumeObj.containsKey("vol_type")) {
if("local_volume".equals(volumeObj.getString("vol_type"))) {
disk = Integer.parseInt(volumeObj.getString("vol_size"));
}
} else if(volumeObj.containsKey("storage_type") && "local_image".equals(volumeObj.getString("storage_type"))) {
disk = Integer.parseInt(volumeObj.getString("disk_size"));
}
return disk;
}
}