modify healVnf vmid
[vfc/nfvo/driver/vnfm/svnfm.git] / huawei / vnfmadapter / VnfmadapterService / service / src / main / java / org / onap / vfc / nfvo / vnfm / svnfm / vnfmadapter / service / csm / vnf / VnfMgrVnfm.java
index 18de1c0..92b28f3 100644 (file)
 
 package org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.csm.vnf;
 
-import net.sf.json.JSONArray;
+import java.io.IOException;
 
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.ResultRequestUtil;
+import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.adapter.impl.AdapterResourceManager;
 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.Constant;
 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.ParamConstants;
+import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.UrlConstant;
 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.csm.inf.InterfaceVnfMgr;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import net.sf.json.JSONArray;
 import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
 
-import javax.print.attribute.standard.ReferenceUriSchemesSupported;
-
 /**
  * create or terminate VNF to M
  * <br/>
  *
  * @author
- * @version NFVO 0.5 Aug 24, 2016
+ * @version VFC 1.0 Aug 24, 2016
  */
 public class VnfMgrVnfm implements InterfaceVnfMgr {
 
     private static final Logger LOG = LoggerFactory.getLogger(VnfMgrVnfm.class);
 
+    private static final int PARAM_ZERO = 0;
+
+    private static final int PARAM_ONE = 1;
+
     @Override
     public JSONObject scaleVnf(JSONObject vnfObject, JSONObject vnfmObject, String vnfmId, String vnfInstanceId) {
         LOG.warn("function=scaleVnf, msg=enter to scale a vnf");
+
+        JSONObject queryVms = ResultRequestUtil.call(vnfmObject,
+                String.format(ParamConstants.VNF_GET_VMINFO, vnfInstanceId), Constant.GET, null, Constant.CERTIFICATE);
+        LOG.info("function=scaleVnf, msg=query vms result=" + queryVms);
+
         JSONObject restJson = new JSONObject();
         restJson.put(Constant.RETCODE, Constant.REST_FAIL);
         String path = String.format(ParamConstants.VNF_SCALE, vnfInstanceId);
 
         int scaleType = getScaleType(vnfObject.getString("type"));
-        //build request json object
+        // build request json object
         JSONObject paramJson = new JSONObject();
         JSONObject scaleInfo = new JSONObject();
         JSONArray vduList = new JSONArray();
         JSONObject vdu = new JSONObject();
-        vdu.put("vdu_type",this.getVduType(vnfmObject,vnfInstanceId));//TODO:set vdu_type
-        vdu.put("h_steps",vnfObject.get("numberOfSteps"));
+
+        if(vnfObject.containsKey("configedVduType")) {
+            vdu.put("vdu_type", vnfObject.getString("configedVduType"));
+        } else {
+            vdu.put("vdu_type", this.getVduType(vnfmObject, queryVms));
+        }
+        vdu.put("h_steps", vnfObject.get("numberOfSteps"));
         vduList.add(vdu);
-        scaleInfo.put("vnf_id",vnfInstanceId);
-        scaleInfo.put("scale_type",0);
-        scaleInfo.put("scale_action",scaleType);
-        scaleInfo.put("vdu_list",vduList);
-        if(scaleType == 0){//scale_in
+        scaleInfo.put("vnf_id", vnfInstanceId);
+        scaleInfo.put("scale_pattern", "without_plan");
+        scaleInfo.put("scale_type", PARAM_ZERO);
+        scaleInfo.put("scale_action", scaleType);
+        scaleInfo.put("scale_step", PARAM_ZERO);
+        scaleInfo.put("scale_step_value", PARAM_ONE);
+        scaleInfo.put("scale_group", vdu.getString("vdu_type"));
+        scaleInfo.put("vdu_list", vduList);
+        if(scaleType == PARAM_ZERO) {
+            // scale_in
             JSONArray vmList = new JSONArray();
             try {
-                JSONObject additionalParam = vnfObject.getJSONObject("additionalParam");
-                vmList = additionalParam.getJSONArray("vm_list");
-            }catch (JSONException e) {
-              LOG.error("the param 'additionalParam' or 'vm_list' not found,please check it",e);
+                // JSONObject additionalParam = vnfObject.getJSONObject("additionalParam");
+                // vmList = additionalParam.getJSONArray("vm_list");
+                vmList = ScaleManager.beforeScaleIn(queryVms, vnfInstanceId);
+                if(vmList.isEmpty()) {
+                    vmList = AdapterResourceManager.readScaleInVmIdFromJson().getJSONArray("vm_list");
+                }
+            } catch(JSONException e) {
+                LOG.error("the param 'additionalParam' or 'vm_list' not found,please check it", e);
             }
-            scaleInfo.put("vm_list",vmList);
+            if(null != vmList && !vmList.isEmpty()) {
+                scaleInfo.put("vm_list", vmList);
+            }
+        } else if(scaleType == PARAM_ONE) {
+            ScaleManager.beforeScaleOut(queryVms, vnfInstanceId);
         }
-        paramJson.put("scale_info",scaleInfo);
-        JSONObject queryResult = ResultRequestUtil.call(vnfmObject, path, Constant.PUT, paramJson.toString(),Constant.CERTIFICATE);
-        LOG.info("SCALE execute result:"+queryResult.toString());
+        paramJson.put("scale_info", scaleInfo);
+        JSONObject queryResult =
+                ResultRequestUtil.call(vnfmObject, path, Constant.PUT, paramJson.toString(), Constant.CERTIFICATE);
+        LOG.info("SCALE execute result:" + queryResult.toString());
         try {
             int statusCode = queryResult.getInt(Constant.RETCODE);
 
             if(statusCode == Constant.HTTP_CREATED || statusCode == Constant.HTTP_OK) {
                 restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
+                // restJson.put("data",
+                // queryResult.getJSONObject("data").getJSONObject("scale_info"));
+                JSONObject appInfo = new JSONObject();
+                try {
+                    appInfo = JSONObject.fromObject(queryResult.getString("data")).getJSONObject("scale_info");
+                } catch(JSONException e) {
+                    LOG.error("function=scaleVnf, msg=csm return obj is not a json, e={}.", e);
+                }
                 JSONObject resultObj = new JSONObject();
-                resultObj.put("jobId", vnfInstanceId + "_" + Constant.PUT);
+                // resultObj.put(Constant.JOBID, vnfInstanceId + "_" + Constant.PUT);
+                handleResponse(resultObj, appInfo, vnfInstanceId, Constant.PUT);
                 restJson.put("data", resultObj);
             } else {
                 LOG.error("function=scaleVnf, msg=send create vnf msg to csm get wrong status: " + statusCode);
@@ -93,37 +133,37 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         return restJson;
     }
 
-
-    private String getVduType(JSONObject vnfmObject, String vnfInstanceId){
+    private String getVduType(JSONObject vnfmObject, JSONObject queryResult) {
         String vduType = "";
         try {
-            JSONObject queryResult = ResultRequestUtil.call(vnfmObject, String.format(ParamConstants.VNF_GET_VMINFO, vnfInstanceId), Constant.GET, null,Constant.CERTIFICATE);
-            LOG.info("getVduType result="+queryResult);
             vduType = queryResult.getJSONObject("data").getJSONArray("vms").getJSONObject(0).getString("vdu_type");
-        } catch (Exception e) {
-            LOG.error("get vdu_type failed.",e);
+        } catch(Exception e) {
+            LOG.error("get vdu_type failed.", e);
         }
-        LOG.info("vdu_type="+vduType);
+        LOG.info("vdu_type=" + vduType);
         return vduType;
     }
-    private int getScaleType(String type){
-        if("SCALE_OUT".equalsIgnoreCase(type)){
+
+    private int getScaleType(String type) {
+        if("SCALE_OUT".equalsIgnoreCase(type)) {
             return 1;
-        }else if("SCALE_IN".equalsIgnoreCase(type)){
+        } else if("SCALE_IN".equalsIgnoreCase(type)) {
             return 0;
         }
         return -1;
     }
+
     @Override
     public JSONObject createVnf(JSONObject subJsonObject, JSONObject vnfmObject) {
         LOG.info("function=createVnf, msg=enter to create a vnf");
-        LOG.info("createVnf csm request body :"+subJsonObject);
+        LOG.info("createVnf csm request body :" + subJsonObject);
         JSONObject restJson = new JSONObject();
         restJson.put(Constant.RETCODE, Constant.REST_FAIL);
         String path = ParamConstants.VNF_INSTANCE + Constant.ROARAND;
 
-        JSONObject queryResult = ResultRequestUtil.call(vnfmObject, path, Constant.POST, subJsonObject.toString(),Constant.CERTIFICATE);
-        LOG.info("createVnf csm response content:"+queryResult);
+        JSONObject queryResult =
+                ResultRequestUtil.call(vnfmObject, path, Constant.POST, subJsonObject.toString(), Constant.CERTIFICATE);
+        LOG.info("createVnf csm response content:" + queryResult);
         try {
             int statusCode = queryResult.getInt(Constant.RETCODE);
 
@@ -131,8 +171,10 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
                 restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
                 JSONObject appInfo = JSONObject.fromObject(queryResult.getString("data")).getJSONObject("app_info");
                 JSONObject resultObj = new JSONObject();
-                resultObj.put("vnfInstanceId", appInfo.getString("id"));
-                resultObj.put("jobId", appInfo.getString("id") + "_" + Constant.POST);
+                // resultObj.put("vnfInstanceId", appInfo.getString("id"));
+                // resultObj.put(Constant.JOBID, appInfo.getString("id") + "_" + Constant.POST);
+                String vnfInstanceId = appInfo.getString("id");
+                handleResponse(resultObj, appInfo, vnfInstanceId, Constant.POST);
                 restJson.put("data", resultObj);
             } else {
                 LOG.error("function=createVnf, msg=send create vnf msg to csm get wrong status: " + statusCode);
@@ -145,6 +187,17 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         return restJson;
     }
 
+    private void handleResponse(JSONObject result, JSONObject returnObj, String vnfInstanceId, String type) {
+        String jobId = "";
+        if(returnObj.containsKey("job_id")) {
+            jobId = returnObj.getString("job_id") + ":job";
+        } else {
+            jobId = vnfInstanceId + "_" + type + ":no";
+        }
+        result.put("vnfInstanceId", vnfInstanceId);
+        result.put(Constant.JOBID, jobId);
+    }
+
     @Override
     public JSONObject removeVnf(JSONObject vnfmObject, String vnfId, JSONObject vnfObject) {
         LOG.warn("function=removeVnf, msg=enter to remove a vnf: {}", vnfId);
@@ -152,14 +205,22 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         restJson.put(Constant.RETCODE, Constant.REST_FAIL);
 
         JSONObject queryResult = ResultRequestUtil.call(vnfmObject,
-                String.format(ParamConstants.VNF_INSTANCE_DEL, vnfId) + Constant.ROARAND, Constant.DELETE, null,Constant.CERTIFICATE);
+                String.format(ParamConstants.VNF_INSTANCE_DEL, vnfId) + Constant.ROARAND, Constant.DELETE, null,
+                Constant.CERTIFICATE);
 
         int statusCode = queryResult.getInt(Constant.RETCODE);
 
-        if(statusCode == Constant.HTTP_NOCONTENT) {
+        if(statusCode == Constant.HTTP_NOCONTENT || statusCode == Constant.HTTP_OK) {
             restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
+            // restJson.put("data", JSONObject.fromObject(queryResult.getString("data")));
+            JSONObject appInfo = new JSONObject();
+            if(queryResult.containsKey("data") && StringUtils.isNotEmpty(queryResult.getString("data")))
+            {
+                appInfo = JSONObject.fromObject(queryResult.getString("data"));
+            }
             JSONObject resultObj = new JSONObject();
-            resultObj.put("jobId", vnfId + "_" + Constant.DELETE);
+            // resultObj.put(Constant.JOBID, vnfId + "_" + Constant.DELETE);
+            handleResponse(resultObj, appInfo, vnfId, Constant.DELETE);
             restJson.put("data", resultObj);
         } else {
             LOG.error("function=removeVnf, msg=send remove vnf msg to csm get wrong status: {}", statusCode);
@@ -175,10 +236,9 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         restJson.put(Constant.RETCODE, Constant.REST_FAIL);
 
         JSONObject queryResult = ResultRequestUtil.call(vnfmObject,
-                String.format(ParamConstants.VNF_INSTANCE_GET, vnfId) + Constant.ROARAND + "&type=status", Constant.GET,
-                null,Constant.CERTIFICATE);
+                String.format(ParamConstants.VNF_INSTANCE_GET, vnfId), Constant.GET, null, Constant.CERTIFICATE);
 
-        int statusCode = queryResult.getInt("retCode");
+        int statusCode = queryResult.getInt(Constant.RETCODE);
 
         if(statusCode == Constant.HTTP_OK || statusCode == Constant.HTTP_CREATED) {
             if(null == (queryResult.get("data"))) {
@@ -186,7 +246,7 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
                 return restJson;
             }
             restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
-            restJson.put("data", JSONObject.fromObject(queryResult.getString("data")).getJSONArray("basic"));
+            restJson.put("data", JSONObject.fromObject(queryResult.getString("data")).getJSONArray("vnf_list"));
         } else {
             LOG.error("function=getVnf, msg=send get vnf msg to csm get wrong status: {}", statusCode);
         }
@@ -194,6 +254,57 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         return restJson;
     }
 
+    public JSONObject getIp(JSONObject vnfmObject, String vnfId) throws IOException {
+        LOG.warn("function=getIp, msg=enter to getIp: {}", vnfId);
+        JSONObject restJson = new JSONObject();
+        restJson.put(Constant.RETCODE, Constant.REST_FAIL);
+
+        JSONObject queryResult = ResultRequestUtil.call(vnfmObject,
+                String.format(ParamConstants.VNF_CONFIGURATION_GET, vnfId), Constant.GET, null, Constant.CERTIFICATE);
+
+        int statusCode = queryResult.getInt(Constant.RETCODE);
+
+        if(statusCode == Constant.HTTP_OK || statusCode == Constant.HTTP_CREATED) {
+            if(null == (queryResult.get("data"))) {
+                LOG.warn("function=getIp, msg=query is null {}", queryResult.get("data"));
+                return restJson;
+            }
+            JSONObject config = JSONObject.fromObject(queryResult.getString("data"));
+            LOG.info("function=getIp, query configuration result: {}", config);
+            JSONObject vnfInfo = config.getJSONArray("configuration").getJSONObject(0);
+            JSONObject result = new JSONObject();
+            result.put("vnf_id", vnfInfo.getString("vnf_id"));
+            result.put("vnf_type", vnfInfo.getString("vnf_type"));
+            JSONArray inputs = vnfInfo.getJSONArray("inputs");
+
+            ClassLoader classLoader = getClass().getClassLoader();
+            String ipConfig = IOUtils.toString(classLoader.getResourceAsStream("ipConfig.json"));
+            LOG.info("ipConfig: {}", ipConfig);
+            JSONObject ipCon = JSONObject.fromObject(ipConfig);
+            String vnfType = vnfInfo.getString("vnf_type");
+            if(ipCon.containsKey(vnfType)) {
+                String ipKey = ipCon.getString(vnfInfo.getString("vnf_type"));
+                LOG.info("ipKey: {}", ipKey);
+                String ip = "";
+                for(int i = 0; i < inputs.size(); i++) {
+                    JSONObject obj = inputs.getJSONObject(i);
+                    if(obj.getString("key_name").equals(ipKey)) {
+                        ip = obj.getString("value");
+                        break;
+                    }
+                }
+                result.put("ip", ip);
+                restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
+                restJson.put("data", result);
+            }
+
+        } else {
+            LOG.error("function=getIp, msg=send get vnf msg to csm get wrong status: {}", statusCode);
+        }
+
+        return restJson;
+    }
+
     @Override
     public JSONObject getJob(JSONObject vnfmObject, String jobId) {
         LOG.warn("function=getJob, msg=enter to get a job: {}", jobId);
@@ -203,9 +314,9 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
         String vnfId = jobId.split("_")[0];
         JSONObject queryResult = ResultRequestUtil.call(vnfmObject,
                 String.format(ParamConstants.VNF_INSTANCE_GET, vnfId) + Constant.ROARAND + "&type=status", Constant.GET,
-                null,Constant.CERTIFICATE);
+                null, Constant.CERTIFICATE);
 
-        int statusCode = queryResult.getInt("retCode");
+        int statusCode = queryResult.getInt(Constant.RETCODE);
 
         if(statusCode == Constant.HTTP_OK || statusCode == Constant.HTTP_CREATED) {
 
@@ -214,11 +325,93 @@ public class VnfMgrVnfm implements InterfaceVnfMgr {
                 return restJson;
             }
             restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
-            restJson.put("data", JSONObject.fromObject(queryResult.getString("data")).getJSONArray("basic"));
+            restJson.put("data", JSONObject.fromObject(queryResult.getString("data")).getJSONArray("vnf_list"));
         } else {
             LOG.error("function=getJob, msg=send get vnf msg to csm get wrong status: {}", statusCode);
         }
 
         return restJson;
     }
+
+    /**
+     * <br>
+     * 
+     * @param jsonObject
+     * @param vnfmObjcet
+     * @param vnfmId
+     * @param vnfInstanceId
+     * @return
+     * @since VFC 1.0
+     */
+    public JSONObject healVnf(JSONObject jsonObject, JSONObject vnfmObjcet, String vnfmId, String vnfInstanceId) {
+        LOG.info("healVnf request body :" + jsonObject);
+        JSONObject restJson = new JSONObject();
+        restJson.put(Constant.RETCODE, Constant.REST_FAIL);
+
+        String action = jsonObject.getString("action");
+        JSONObject affectedVm = jsonObject.getJSONObject("affectedvm");
+        String vmId = getNativeVmId(affectedVm.getString("vmid"), vnfmObjcet, vnfInstanceId);
+        String path = String.format(ParamConstants.HEAL_VNF, vmId);
+
+        JSONObject subJsonObject = new JSONObject();
+        subJsonObject.put("type", "hard");
+        subJsonObject.put("boot_mode", "");
+        if("vmReset".equalsIgnoreCase(action)) {
+            subJsonObject.put("action", "reset");
+        }
+        LOG.info("healVnf subJsonObject :" + subJsonObject);
+        JSONObject healResult = ResultRequestUtil.callSouth(vnfmObjcet, path, Constant.PUT, subJsonObject.toString(),
+                Constant.CERTIFICATE);
+
+        int statusCode = healResult.getInt(Constant.RETCODE);
+        if(statusCode == Constant.HTTP_OK) {
+            LOG.info("healResult:{}", healResult);
+            restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
+        } else {
+            LOG.error("function=healVnf, msg=send heal vnf msg to csm get wrong status: {}", statusCode);
+        }
+
+        return restJson;
+    }
+
+    private String getNativeVmId(String vimVmId, JSONObject vnfmObjcet, String vnfInstanceId) {
+        JSONObject queryVms = ResultRequestUtil.call(vnfmObjcet,
+                String.format(ParamConstants.VNF_GET_VMINFO, vnfInstanceId), Constant.GET, null, Constant.CERTIFICATE);
+        LOG.info("function=getNativeVmId, msg=query vms result=" + queryVms);
+        JSONArray vms = queryVms.getJSONObject("data").getJSONArray("vms");
+        for(int i = 0; i < vms.size(); i++) {
+            JSONObject obj = vms.getJSONObject(i);
+            String tmpVimVmId = obj.getString("backend_id");
+            if(vimVmId.equalsIgnoreCase(tmpVimVmId)) {
+                return obj.getString("id");
+            }
+        }
+        LOG.error("function=getNativeVmId, msg=get native vmId failed.");
+        return "";
+    }
+
+    public JSONObject getJobFromVnfm(JSONObject vnfmObjcet, String jobId) {
+        LOG.warn("function=getJobFromVnfm, jobId: {}", jobId);
+
+        JSONObject restJson = new JSONObject();
+        restJson.put(Constant.RETCODE, Constant.REST_FAIL);
+
+        JSONObject queryResult = ResultRequestUtil.call(vnfmObjcet, String.format(UrlConstant.URL_JOBSTATUS_GET, jobId),
+                Constant.GET, null, Constant.CERTIFICATE);
+
+        int statusCode = queryResult.getInt(Constant.RETCODE);
+        if(statusCode == Constant.HTTP_OK || statusCode == Constant.HTTP_CREATED) {
+            if((queryResult.get("data")) == null) {
+                LOG.warn("function=getJobFromVnfm, msg=query is null {}", queryResult.get("data"));
+                return restJson;
+            }
+            restJson.put(Constant.RETCODE, Constant.REST_SUCCESS);
+            restJson.put("data", JSONObject.fromObject(queryResult.getString("data")));
+        } else {
+            LOG.error("function=getJobFromVnfm, msg=query job from vnfm wrong status: {}", statusCode);
+        }
+
+        return restJson;
+    }
+
 }