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