Merge "Add vfc-ztevnfmdriver logDig check"
[vfc/nfvo/driver/vnfm/svnfm.git] / huawei / vnfmadapter / VnfmadapterService / service / src / main / java / org / onap / vfc / nfvo / vnfm / svnfm / vnfmadapter / service / rest / VnfRoa.java
1 /*
2  * Copyright 2016-2017 Huawei Technologies Co., Ltd.
3  *
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 package org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.rest;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import javax.servlet.http.HttpServletRequest;
23 import javax.servlet.http.HttpServletResponse;
24 import javax.ws.rs.Consumes;
25 import javax.ws.rs.GET;
26 import javax.ws.rs.POST;
27 import javax.ws.rs.Path;
28 import javax.ws.rs.PathParam;
29 import javax.ws.rs.Produces;
30 import javax.ws.rs.QueryParam;
31 import javax.ws.rs.core.Context;
32 import javax.ws.rs.core.MediaType;
33
34 import org.apache.commons.collections.map.UnmodifiableMap;
35 import org.apache.commons.lang3.StringUtils;
36 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.VnfmJsonUtil;
37 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.VnfmUtil;
38 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.constant.Constant;
39 import org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.service.process.VnfMgr;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 import net.sf.json.JSONObject;
44
45 /**
46  * Provide interfaces for instantiate or terminate VNF.
47  * <br/>
48  *
49  * @author
50  * @version VFC 1.0 Aug 24, 2016
51  */
52 @SuppressWarnings("unchecked")
53 @Path("/api/huaweivnfmdriver/v1")
54 @Consumes(MediaType.APPLICATION_JSON)
55 @Produces(MediaType.APPLICATION_JSON)
56 public class VnfRoa {
57
58     private static final Logger LOG = LoggerFactory.getLogger(VnfRoa.class);
59
60     private VnfMgr vnfMgr;
61
62     private static Map<String, String> progressItem;
63
64     private static Map<String, String> jobstatusItem;
65
66     static {
67         Map<String, String> map = new HashMap<>();
68         map.put("Building", "50");
69         map.put("Active", "100");
70         map.put("Stopped", "50");
71         map.put("Error", "100");
72         progressItem = UnmodifiableMap.decorate(map);
73
74         map = new HashMap<>();
75         map.put("Building", "processing");
76         map.put("Active", "finished");
77         map.put("Stopped", "processing");
78         map.put("Error", "error");
79         jobstatusItem = UnmodifiableMap.decorate(map);
80     }
81
82     public void setVnfMgr(VnfMgr vnfMgr) {
83         this.vnfMgr = vnfMgr;
84     }
85
86     /**
87      * Scale VNF
88      *
89      * @param vnfmId
90      * @param vnfInstanceId
91      * @param resp
92      * @param context
93      *            {
94      *            "vnfInstanceId":"5",
95      *            "type":"SCALE_OUT",
96      *            "aspectId":"101",
97      *            "numberOfSteps":"1",
98      *            "additionalParam":{}
99      *            }
100      * @return
101      *         {
102      *         "jobId":"1"
103      *         }
104      */
105     @POST
106     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/scale")
107     public String scaleVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
108             @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId) {
109         JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
110         LOG.info("function=scaleVNF, msg=enter to scale a vnf. request body:" + jsonObject);
111         JSONObject result = new JSONObject();
112         if(null == jsonObject) {
113             String msg = "the parameters do not meet the requirements,please check it!";
114             LOG.error("function=scalVnf," + msg);
115             resp.setStatus(Constant.HTTP_NOT_ACCEPTABLE);
116             result.put("msg", msg);
117             return result.toString();
118         }
119
120         result = vnfMgr.scaleVNF(jsonObject, vnfmId, vnfInstanceId);
121         LOG.info("function=scaleVNF,result=" + result.toString());
122         if(result.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
123             LOG.error("function=scaleVNF, msg=scaleVnf fail");
124             resp.setStatus(Constant.HTTP_INNERERROR);
125             return result.toString();
126         }
127         return JSONObject.fromObject(result.getJSONObject("data")).toString();
128     }
129
130     /**
131      * Provide function for instantiate VNF
132      * <br/>
133      *
134      * @param context
135      * @param resp
136      * @param vnfmId
137      * @return
138      * @since VFC 1.0
139      */
140     @POST
141     @Path("/{vnfmId}/vnfs")
142     public String addVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
143             @PathParam("vnfmId") String vnfmId) {
144         LOG.warn("function=addVnf, msg=enter to add a vnf");
145         JSONObject subJsonObject = VnfmJsonUtil.getJsonFromContexts(context);
146         JSONObject restJson = new JSONObject();
147
148         if(null == subJsonObject) {
149             LOG.error("function=addVnf, msg=params are insufficient");
150             resp.setStatus(Constant.HTTP_INNERERROR);
151             return restJson.toString();
152         }
153         LOG.info("addVnf request info from (LCM):" + subJsonObject);
154         restJson = vnfMgr.addVnf(subJsonObject, vnfmId);
155
156         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
157             LOG.error("function=addVnf, msg=addvnf fail");
158             resp.setStatus(Constant.HTTP_INNERERROR);
159             return restJson.toString();
160         }
161
162         return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
163     }
164
165     /**
166      * Provide function for terminate VNF
167      * <br/>
168      *
169      * @param vnfmId
170      * @param resp
171      * @param vnfInstanceId
172      * @param context
173      * @return
174      * @since VFC 1.0
175      */
176     @POST
177     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/terminate")
178     public String delVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
179             @PathParam("vnfInstanceId") String vnfInstanceId, @Context HttpServletRequest context) {
180         LOG.warn("function=delVnf, msg=enter to delete a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
181         JSONObject vnfObject = VnfmJsonUtil.getJsonFromContexts(context);
182         JSONObject restJson = new JSONObject();
183
184         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
185             resp.setStatus(Constant.HTTP_INNERERROR);
186             return restJson.toString();
187         }
188
189         restJson = vnfMgr.deleteVnf(vnfInstanceId, vnfmId, vnfObject);
190         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
191             LOG.error("function=delVnf, msg=delVnf fail");
192             resp.setStatus(Constant.HTTP_INNERERROR);
193             return restJson.toString();
194         }
195
196         return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
197     }
198
199     /**
200      * Provide function for get VNF
201      * <br/>
202      *
203      * @param vnfmId
204      * @param resp
205      * @param vnfInstanceId
206      * @return
207      * @since VFC 1.0
208      */
209     @GET
210     @Path("/{vnfmId}/vnfs/{vnfInstanceId}")
211     public String getVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
212             @PathParam("vnfInstanceId") String vnfInstanceId) {
213         LOG.warn("function=getVnf, msg=enter to get a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
214         JSONObject restJson = new JSONObject();
215
216         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
217             resp.setStatus(Constant.HTTP_INNERERROR);
218             return restJson.toString();
219         }
220
221         restJson = vnfMgr.getVnf(vnfInstanceId, vnfmId);
222         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
223             LOG.error("function=getVnf, msg=getVnf fail");
224             resp.setStatus(Constant.HTTP_INNERERROR);
225             return restJson.toString();
226         }
227
228         restJson.remove(Constant.RETCODE);
229         return restJson.toString();
230     }
231
232     /**
233      * <br>
234      * 
235      * @param vnfmId
236      * @param resp
237      * @return
238      * @since VFC 1.0
239      */
240     @GET
241     @Path("/{vnfmId}")
242     public String getVnfmById(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp) {
243         LOG.warn("function=getVnfmById, vnfmId: {}", vnfmId);
244         return VnfmUtil.getVnfmById(vnfmId).toString();
245     }
246
247     /**
248      * Provide function for get job
249      * <br/>
250      *
251      * @param jobId
252      * @param vnfmId
253      * @param resp
254      * @param responseId
255      * @return
256      * @since VFC 1.0
257      */
258     @GET
259     @Path("/{vnfmId}/jobs_old/{jobId}")
260     public String getJob(@PathParam("jobId") String jobId, @PathParam("vnfmId") String vnfmId,
261             @Context HttpServletResponse resp, @QueryParam("@responseId") String responseId) {
262         LOG.warn("function=getJob, msg=enter to get a job: jobId: {}, responseId: {}", jobId, responseId);
263         JSONObject restJson = new JSONObject();
264
265         if(StringUtils.isEmpty(jobId) || StringUtils.isEmpty(vnfmId)) {
266             resp.setStatus(Constant.HTTP_INNERERROR);
267             return restJson.toString();
268         }
269
270         restJson = vnfMgr.getJob(jobId, vnfmId);
271         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
272             LOG.error("function=getJob, msg=getJob fail");
273             resp.setStatus(Constant.HTTP_INNERERROR);
274             return restJson.toString();
275         }
276
277         return getJobBody(restJson);
278     }
279
280     /**
281      * <br>
282      *
283      * @param context
284      *            {
285      *            "action": "vmReset",
286      *            "affectedvm": {
287      *            "vmid": "804cca71 - 9ae9 - 4511 - 8e30 - d1387718caff",
288      *            "vduid": "vdu_100",
289      *            "vmname": "ZTE_SSS_111_PP_2_L"
290      *            }
291      *            }
292      * @param resp
293      * @param vnfmId
294      * @param vnfInstanceId
295      * @return
296      * @since VFC 1.0
297      */
298     @POST
299     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/heal")
300     public String healVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
301             @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId) {
302         LOG.warn("function=healVnf, msg=enter to heal a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
303         JSONObject restJson = new JSONObject();
304         JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
305
306         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
307             resp.setStatus(Constant.HTTP_INNERERROR);
308             restJson.put("message", "vnfmId is null or vnfInstanceId is null");
309             return restJson.toString();
310         }
311
312         restJson = vnfMgr.healVnf(jsonObject, vnfInstanceId, vnfmId);
313         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
314             LOG.error("function=healVnf, msg=healVnf fail");
315             resp.setStatus(Constant.HTTP_INNERERROR);
316             return restJson.toString();
317         }
318
319         restJson.remove(Constant.RETCODE);
320         restJson.put("jobId", vnfInstanceId + "_post");
321         return restJson.toString();
322     }
323
324     private String getJobBody(JSONObject restJson) {
325         LOG.warn("function=getJobBody, restJson: {}", restJson);
326         JSONObject responseJson = new JSONObject();
327         JSONObject jobInfoJson = new JSONObject();
328         JSONObject retJson = restJson.getJSONArray("data").getJSONObject(0);
329         jobInfoJson.put("jobId", retJson.getString("id"));
330         responseJson.put("progress", progressItem.get(retJson.getString(Constant.STATUS)));
331         responseJson.put("status", jobstatusItem.get(retJson.getString(Constant.STATUS)));
332         responseJson.put("errorCode", "null");
333         responseJson.put("responseId", progressItem.get(retJson.getString(Constant.STATUS)));
334         if(retJson.getString(Constant.STATUS) == null || retJson.getString(Constant.STATUS) == "null") {
335             responseJson.put("progress", "100");
336             responseJson.put("status", "finished");
337             responseJson.put("errorCode", "null");
338             responseJson.put("responseId", "100");
339         }
340         jobInfoJson.put("responsedescriptor", responseJson);
341         LOG.warn("function=getJobBody, jobInfoJson: {}", jobInfoJson);
342         return jobInfoJson.toString();
343     }
344
345     /**
346      * <br>
347      * Query vms info from vnfm
348      * 
349      * @param vnfmId
350      * @param resp
351      * @return
352      */
353     @GET
354     @Path("/{vnfmId}/vms")
355     public String getVms(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp) {
356         LOG.info("function=getVms, msg=enter to get vms: vnfmId: {}", vnfmId);
357         JSONObject restJson = vnfMgr.getVmsFromVnfm(vnfmId, null);
358         LOG.info("function=getVms, restJson: {}", restJson);
359         return restJson.getString("data");
360     }
361
362     /**
363      * <br>
364      * Query vms info by vnfId from vnfm
365      *
366      * @param vnfmId
367      * @param vnfInstanceId
368      * @param resp
369      * @return
370      */
371     @GET
372     @Path("/{vnfmId}/{vnfInstanceId}/vms")
373     public String getVmsByVnfId(@PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId,
374             @Context HttpServletResponse resp) {
375         LOG.info("function=getVmsByVnfId, msg=enter to get vms: vnfmId: {}", vnfmId);
376         JSONObject restJson = vnfMgr.getVmsFromVnfm(vnfmId, vnfInstanceId);
377         LOG.info("function=getVmsByVnfId, restJson: {}", restJson);
378         return restJson.getString("data");
379     }
380
381     /**
382      * <br>
383      * Query job status from vnfm version 18.1
384      * 
385      * @param jobId
386      * @param vnfmId
387      * @param responseId
388      * @return
389      * @since VFC 1.0
390      */
391     @GET
392     @Path("/{vnfmId}/jobs/{jobId}")
393     public String getJobFromVnfm(@PathParam("jobId") String jobId, @PathParam("vnfmId") String vnfmId,
394             @Context HttpServletResponse resp, @QueryParam("@responseId") String responseId) {
395         LOG.warn("function=getJobFromVnfm, msg=enter to get a job: jobId: {}, responseId: {}", jobId, responseId);
396         JSONObject restJson = vnfMgr.getJobFromVnfm(jobId, vnfmId);
397
398         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
399             LOG.error("function=getJobFromVnfm, msg=getJobFromVnfm fail");
400             resp.setStatus(Constant.HTTP_INNERERROR);
401             return restJson.toString();
402         }
403
404         return vnfMgr.transferToLcm(restJson);
405     }
406 }