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.rest;
19 import java.io.IOException;
20 import java.util.HashMap;
23 import javax.servlet.http.HttpServletRequest;
24 import javax.servlet.http.HttpServletResponse;
25 import javax.ws.rs.Consumes;
26 import javax.ws.rs.GET;
27 import javax.ws.rs.POST;
28 import javax.ws.rs.Path;
29 import javax.ws.rs.PathParam;
30 import javax.ws.rs.Produces;
31 import javax.ws.rs.QueryParam;
32 import javax.ws.rs.core.Context;
33 import javax.ws.rs.core.MediaType;
35 import org.apache.commons.collections.map.UnmodifiableMap;
36 import org.apache.commons.lang3.StringUtils;
37 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.VnfmJsonUtil;
38 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.VnfmUtil;
39 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.Constant;
40 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.process.VnfMgr;
41 import org.slf4j.Logger;
42 import org.slf4j.LoggerFactory;
44 import net.sf.json.JSONObject;
47 * Provide interfaces for instantiate or terminate VNF.
51 * @version VFC 1.0 Aug 24, 2016
53 @SuppressWarnings("unchecked")
54 @Path("/api/huaweivnfmdriver/v1")
55 @Consumes(MediaType.APPLICATION_JSON)
56 @Produces(MediaType.APPLICATION_JSON)
59 private static final Logger LOG = LoggerFactory.getLogger(VnfRoa.class);
61 private VnfMgr vnfMgr;
63 private static Map<String, String> progressItem;
65 private static Map<String, String> jobstatusItem;
68 Map<String, String> map = new HashMap<>();
69 map.put("Building", "50");
70 map.put("Active", "100");
71 map.put("Stopped", "50");
72 map.put("Error", "100");
73 progressItem = UnmodifiableMap.decorate(map);
75 map = new HashMap<>();
76 map.put("Building", "processing");
77 map.put("Active", "finished");
78 map.put("Stopped", "processing");
79 map.put("Error", "error");
80 jobstatusItem = UnmodifiableMap.decorate(map);
83 public void setVnfMgr(VnfMgr vnfMgr) {
91 * @param vnfInstanceId
95 * "vnfInstanceId":"5",
98 * "numberOfSteps":"1",
99 * "additionalParam":{}
107 @Path("/{vnfmId}/vnfs/{vnfInstanceId}/scale")
108 public String scaleVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
109 @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId) {
110 JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
111 LOG.info("function=scaleVNF, msg=enter to scale a vnf. request body:" + jsonObject);
112 JSONObject result = new JSONObject();
113 if(null == jsonObject) {
114 String msg = "the parameters do not meet the requirements,please check it!";
115 LOG.error("function=scalVnf," + msg);
116 resp.setStatus(Constant.HTTP_NOT_ACCEPTABLE);
117 result.put("msg", msg);
118 return result.toString();
121 result = vnfMgr.scaleVNF(jsonObject, vnfmId, vnfInstanceId);
122 LOG.info("function=scaleVNF,result=" + result.toString());
123 if(result.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
124 LOG.error("function=scaleVNF, msg=scaleVnf fail");
125 resp.setStatus(Constant.HTTP_INNERERROR);
126 return result.toString();
128 return JSONObject.fromObject(result.getJSONObject("data")).toString();
132 * Provide function for instantiate VNF
142 @Path("/{vnfmId}/vnfs")
143 public String addVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
144 @PathParam("vnfmId") String vnfmId) {
145 LOG.warn("function=addVnf, msg=enter to add a vnf");
146 JSONObject subJsonObject = VnfmJsonUtil.getJsonFromContexts(context);
147 JSONObject restJson = new JSONObject();
149 if(null == subJsonObject) {
150 LOG.error("function=addVnf, msg=params are insufficient");
151 resp.setStatus(Constant.HTTP_INNERERROR);
152 return restJson.toString();
154 LOG.info("addVnf request info from (LCM):" + subJsonObject);
155 restJson = vnfMgr.addVnf(subJsonObject, vnfmId);
157 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
158 LOG.error("function=addVnf, msg=addvnf fail");
159 resp.setStatus(Constant.HTTP_INNERERROR);
160 return restJson.toString();
163 return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
167 * Provide function for terminate VNF
172 * @param vnfInstanceId
178 @Path("/{vnfmId}/vnfs/{vnfInstanceId}/terminate")
179 public String delVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
180 @PathParam("vnfInstanceId") String vnfInstanceId, @Context HttpServletRequest context) {
181 LOG.warn("function=delVnf, msg=enter to delete a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
182 JSONObject vnfObject = VnfmJsonUtil.getJsonFromContexts(context);
183 JSONObject restJson = new JSONObject();
185 if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
186 resp.setStatus(Constant.HTTP_INNERERROR);
187 return restJson.toString();
190 restJson = vnfMgr.deleteVnf(vnfInstanceId, vnfmId, vnfObject);
191 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
192 LOG.error("function=delVnf, msg=delVnf fail");
193 resp.setStatus(Constant.HTTP_INNERERROR);
194 return restJson.toString();
197 return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
201 * Provide function for get VNF
206 * @param vnfInstanceId
211 @Path("/{vnfmId}/vnfs/{vnfInstanceId}")
212 public String getVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
213 @PathParam("vnfInstanceId") String vnfInstanceId) throws IOException {
214 LOG.warn("function=getVnf, msg=enter to get a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
215 JSONObject restJson = new JSONObject();
217 if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
218 resp.setStatus(Constant.HTTP_INNERERROR);
219 return restJson.toString();
222 restJson = vnfMgr.getVnf(vnfInstanceId, vnfmId);
223 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
224 LOG.error("function=getVnf, msg=getVnf fail");
225 resp.setStatus(Constant.HTTP_INNERERROR);
226 return restJson.toString();
229 restJson.remove(Constant.RETCODE);
230 LOG.info("function=getVnf, restJson: {}", restJson);
231 return restJson.toString();
244 public String getVnfmById(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp) {
245 LOG.warn("function=getVnfmById, vnfmId: {}", vnfmId);
246 return VnfmUtil.getVnfmById(vnfmId).toString();
250 * Provide function for get job
261 @Path("/{vnfmId}/jobs_old/{jobId}")
262 public String getJob(@PathParam("jobId") String jobId, @PathParam("vnfmId") String vnfmId,
263 @Context HttpServletResponse resp, @QueryParam("@responseId") String responseId) {
264 LOG.warn("function=getJob, msg=enter to get a job: jobId: {}, responseId: {}", jobId, responseId);
265 return getJobProcess(jobId, vnfmId, resp, jobId);
270 * common getJob method
278 private String getJobProcess(String jobId, String vnfmId, HttpServletResponse resp, String orgJobId) {
279 JSONObject restJson = new JSONObject();
281 if(StringUtils.isEmpty(jobId) || StringUtils.isEmpty(vnfmId)) {
282 resp.setStatus(Constant.HTTP_INNERERROR);
283 return restJson.toString();
286 restJson = vnfMgr.getJob(jobId, vnfmId);
287 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
288 LOG.error("function=getJobProcess, msg=getJob fail");
289 resp.setStatus(Constant.HTTP_INNERERROR);
290 return restJson.toString();
293 return getJobBody(restJson, orgJobId);
301 * "action": "vmReset",
303 * "vmid": "804cca71 - 9ae9 - 4511 - 8e30 - d1387718caff",
304 * "vduid": "vdu_100",
305 * "vmname": "SBC_111_PP_2_L"
310 * @param vnfInstanceId
315 @Path("/{vnfmId}/vnfs/{vnfInstanceId}/heal")
316 public String healVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
317 @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId) {
318 LOG.warn("function=healVnf, msg=enter to heal a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
319 JSONObject restJson = new JSONObject();
320 JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
322 if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
323 resp.setStatus(Constant.HTTP_INNERERROR);
324 restJson.put("message", "vnfmId is null or vnfInstanceId is null");
325 return restJson.toString();
328 restJson = vnfMgr.healVnf(jsonObject, vnfInstanceId, vnfmId);
329 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
330 LOG.error("function=healVnf, msg=healVnf fail");
331 resp.setStatus(Constant.HTTP_INNERERROR);
332 return restJson.toString();
335 restJson.remove(Constant.RETCODE);
336 //restJson.put("jobId", vnfInstanceId + "_post");
337 restJson.put("jobId", vnfInstanceId + ":heal");
338 return restJson.toString();
341 private String getHealJobBody(String jobId) {
342 LOG.warn("function=getHealJobBody");
343 JSONObject responseJson = new JSONObject();
344 JSONObject jobInfoJson = new JSONObject();
345 jobInfoJson.put("jobId", jobId);
346 responseJson.put("progress", "100");
347 responseJson.put("status", "finished");
348 responseJson.put("errorCode", "null");
349 responseJson.put("responseId", "100");
350 jobInfoJson.put("responsedescriptor", responseJson);
352 LOG.warn("function=getJobBody, jobInfoJson: {}", jobInfoJson);
353 return jobInfoJson.toString();
356 private String getJobBody(JSONObject restJson, String jobId) {
357 LOG.warn("function=getJobBody, restJson: {}", restJson);
358 JSONObject responseJson = new JSONObject();
359 JSONObject jobInfoJson = new JSONObject();
360 JSONObject retJson = restJson.getJSONArray("data").getJSONObject(0);
361 jobInfoJson.put("jobId", jobId);
362 responseJson.put("progress", progressItem.get(retJson.getString(Constant.STATUS)));
363 responseJson.put("status", jobstatusItem.get(retJson.getString(Constant.STATUS)));
364 responseJson.put("errorCode", "null");
365 responseJson.put("responseId", progressItem.get(retJson.getString(Constant.STATUS)));
366 if(retJson.getString(Constant.STATUS) == null || retJson.getString(Constant.STATUS) == "null") {
367 responseJson.put("progress", "100");
368 responseJson.put("status", "finished");
369 responseJson.put("errorCode", "null");
370 responseJson.put("responseId", "100");
372 jobInfoJson.put("responsedescriptor", responseJson);
373 LOG.warn("function=getJobBody, jobInfoJson: {}", jobInfoJson);
374 return jobInfoJson.toString();
379 * Query vms info from vnfm
386 @Path("/{vnfmId}/vms")
387 public String getVms(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp) {
388 LOG.info("function=getVms, msg=enter to get vms: vnfmId: {}", vnfmId);
389 JSONObject restJson = vnfMgr.getVmsFromVnfm(vnfmId, null);
390 LOG.info("function=getVms, restJson: {}", restJson);
391 return restJson.getString("data");
396 * Query vms info by vnfId from vnfm
399 * @param vnfInstanceId
404 @Path("/{vnfmId}/{vnfInstanceId}/vms")
405 public String getVmsByVnfId(@PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId,
406 @Context HttpServletResponse resp) {
407 LOG.info("function=getVmsByVnfId, msg=enter to get vms: vnfmId: {}", vnfmId);
408 JSONObject restJson = vnfMgr.getVmsFromVnfm(vnfmId, vnfInstanceId);
409 LOG.info("function=getVmsByVnfId, restJson: {}", restJson);
410 return restJson.getString("data");
415 * Query job status from vnfm version 18.1
424 @Path("/{vnfmId}/jobs/{jobId}")
425 public String getJobFromVnfm(@PathParam("jobId") String jobId, @PathParam("vnfmId") String vnfmId,
426 @Context HttpServletResponse resp, @QueryParam("@responseId") String responseId) {
427 LOG.warn("function=getJobFromVnfm, msg=enter to get a job: jobId: {}, responseId: {}", jobId, responseId);
428 String[] temps = jobId.split(":");
429 String tmpJobId = temps[0];
431 if(temps.length > 1) {
434 LOG.warn("function=getJobFromVnfm, tmpJobId: {}, flag: {}", tmpJobId, flag);
436 if(flag.equalsIgnoreCase("no")) {
437 return getJobProcess(tmpJobId, vnfmId, resp, jobId);
438 } else if (flag.equalsIgnoreCase("heal")){
439 return getHealJobBody(jobId);
441 JSONObject restJson = vnfMgr.getJobFromVnfm(tmpJobId, vnfmId);
443 if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
444 LOG.error("function=getJobFromVnfm, msg=getJobFromVnfm fail");
445 resp.setStatus(Constant.HTTP_INNERERROR);
446 return restJson.toString();
449 return vnfMgr.transferToLcm(restJson);