Add query vnfm from ESR interface
[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.PUT;
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;
34
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.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 context
92      *            * {
93      *            "vnfInstanceId":"5",
94      *            "type":"SCALE_OUT",
95      *            "aspectId":"101",
96      *            "numberOfSteps":"1",
97      *            "additionalParam":{}
98      *            }
99      * @param resp
100      * @param vnfmId
101      * @return
102      *         {
103      *         "jobId":"1"
104      *         }
105      * @throws ServiceException
106      */
107     @POST
108     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/scale")
109     public String scaleVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
110             @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId)
111             throws ServiceException {
112         JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
113         LOG.info("function=scaleVNF, msg=enter to scale a vnf. request body:" + jsonObject);
114         JSONObject result = new JSONObject();
115         if(null == jsonObject) {
116             String msg = "the parameters do not meet the requirements,please check it!";
117             LOG.error("function=scalVnf," + msg);
118             resp.setStatus(Constant.HTTP_NOT_ACCEPTABLE);
119             result.put("msg", msg);
120             return result.toString();
121         }
122
123         result = vnfMgr.scaleVNF(jsonObject, vnfmId, vnfInstanceId);
124         LOG.info("function=scaleVNF,result=" + result.toString());
125         if(result.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
126             LOG.error("function=scaleVNF, msg=scaleVnf fail");
127             resp.setStatus(Constant.HTTP_INNERERROR);
128             return result.toString();
129         }
130         return JSONObject.fromObject(result.getJSONObject("data")).toString();
131     }
132
133     /**
134      * Provide function for instantiate VNF
135      * <br/>
136      *
137      * @param context
138      * @param resp
139      * @param vnfmId
140      * @return
141      * @throws ServiceException
142      * @since VFC 1.0
143      */
144     @POST
145     @Path("/{vnfmId}/vnfs")
146     public String addVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
147             @PathParam("vnfmId") String vnfmId) throws ServiceException {
148         LOG.warn("function=addVnf, msg=enter to add a vnf");
149         JSONObject subJsonObject = VnfmJsonUtil.getJsonFromContexts(context);
150         JSONObject restJson = new JSONObject();
151
152         if(null == subJsonObject) {
153             LOG.error("function=addVnf, msg=params are insufficient");
154             resp.setStatus(Constant.HTTP_INNERERROR);
155             return restJson.toString();
156         }
157         LOG.info("addVnf request info from (LCM):" + subJsonObject);
158         restJson = vnfMgr.addVnf(subJsonObject, vnfmId);
159
160         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
161             LOG.error("function=addVnf, msg=addvnf fail");
162             resp.setStatus(Constant.HTTP_INNERERROR);
163             return restJson.toString();
164         }
165
166         return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
167     }
168
169     /**
170      * Provide function for terminate VNF
171      * <br/>
172      *
173      * @param vnfmId
174      * @param resp
175      * @param vnfInstanceId
176      * @param context
177      * @return
178      * @throws ServiceException
179      * @since VFC 1.0
180      */
181     @POST
182     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/terminate")
183     public String delVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
184             @PathParam("vnfInstanceId") String vnfInstanceId, @Context HttpServletRequest context)
185             throws ServiceException {
186         LOG.warn("function=delVnf, msg=enter to delete a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
187         JSONObject vnfObject = VnfmJsonUtil.getJsonFromContexts(context);
188         JSONObject restJson = new JSONObject();
189
190         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
191             resp.setStatus(Constant.HTTP_INNERERROR);
192             return restJson.toString();
193         }
194
195         restJson = vnfMgr.deleteVnf(vnfInstanceId, vnfmId, vnfObject);
196         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
197             LOG.error("function=delVnf, msg=delVnf fail");
198             resp.setStatus(Constant.HTTP_INNERERROR);
199             return restJson.toString();
200         }
201
202         return JSONObject.fromObject(restJson.getJSONObject("data")).toString();
203     }
204
205     /**
206      * Provide function for get VNF
207      * <br/>
208      *
209      * @param vnfmId
210      * @param resp
211      * @param vnfInstanceId
212      * @param context
213      * @return
214      * @throws ServiceException
215      * @since VFC 1.0
216      */
217     @GET
218     @Path("/{vnfmId}/vnfs/{vnfInstanceId}")
219     public String getVnf(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp,
220             @PathParam("vnfInstanceId") String vnfInstanceId) throws ServiceException {
221         LOG.warn("function=getVnf, msg=enter to get a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
222         JSONObject restJson = new JSONObject();
223
224         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
225             resp.setStatus(Constant.HTTP_INNERERROR);
226             return restJson.toString();
227         }
228
229         restJson = vnfMgr.getVnf(vnfInstanceId, vnfmId);
230         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
231             LOG.error("function=getVnf, msg=getVnf fail");
232             resp.setStatus(Constant.HTTP_INNERERROR);
233             return restJson.toString();
234         }
235
236         restJson.remove(Constant.RETCODE);
237         return restJson.toString();
238     }
239
240     /**
241      * <br>
242      * 
243      * @param vnfmId
244      * @param resp
245      * @return
246      * @throws ServiceException
247      * @since VFC 1.0
248      */
249     @GET
250     @Path("/{vnfmId}")
251     public String getVnfmById(@PathParam("vnfmId") String vnfmId, @Context HttpServletResponse resp)
252             throws ServiceException {
253         LOG.warn("function=getVnfmById, vnfmId: {}", vnfmId);
254         return VnfmUtil.getVnfmById(vnfmId).toString();
255     }
256
257     /**
258      * Provide function for get job
259      * <br/>
260      *
261      * @param jobId
262      * @param vnfmId
263      * @param resp
264      * @param responseId
265      * @return
266      * @throws ServiceException
267      * @since VFC 1.0
268      */
269     @GET
270     @Path("/{vnfmId}/jobs/{jobId}")
271     public String getJob(@PathParam("jobId") String jobId, @PathParam("vnfmId") String vnfmId,
272             @Context HttpServletResponse resp, @QueryParam("@responseId") String responseId) throws ServiceException {
273         LOG.warn("function=getJob, msg=enter to get a job: jobId: {}, responseId: {}", jobId, responseId);
274         JSONObject restJson = new JSONObject();
275
276         if(StringUtils.isEmpty(jobId) || StringUtils.isEmpty(vnfmId)) {
277             resp.setStatus(Constant.HTTP_INNERERROR);
278             return restJson.toString();
279         }
280
281         restJson = vnfMgr.getJob(jobId, vnfmId);
282         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
283             LOG.error("function=getJob, msg=getJob fail");
284             resp.setStatus(Constant.HTTP_INNERERROR);
285             return restJson.toString();
286         }
287
288         return getJobBody(restJson);
289     }
290
291     /**
292      * <br>
293      * 
294      * @param context
295      *            {
296      *            �action�: �vmReset�,
297      *            �affectedvm�: {
298      *            �vmid�: �804cca71 - 9ae9 - 4511 - 8e30 - d1387718caff�,
299      *            �vduid�: �vdu_100�,
300      *            �vmname�: �ZTE_SSS_111_PP_2_L�
301      *            }
302      *            }
303      * @param resp
304      * @param vnfmId
305      * @param vnfInstanceId
306      * @return
307      * @throws ServiceException
308      * @since VFC 1.0
309      */
310     @PUT
311     @Path("/{vnfmId}/vnfs/{vnfInstanceId}/heal")
312     public String healVnf(@Context HttpServletRequest context, @Context HttpServletResponse resp,
313             @PathParam("vnfmId") String vnfmId, @PathParam("vnfInstanceId") String vnfInstanceId)
314             throws ServiceException {
315         LOG.warn("function=healVnf, msg=enter to heal a vnf: vnfInstanceId: {}, vnfmId: {}", vnfInstanceId, vnfmId);
316         JSONObject restJson = new JSONObject();
317         JSONObject jsonObject = VnfmJsonUtil.getJsonFromContexts(context);
318
319         if(StringUtils.isEmpty(vnfInstanceId) || StringUtils.isEmpty(vnfmId)) {
320             resp.setStatus(Constant.HTTP_INNERERROR);
321             restJson.put("message", "vnfmId is null or vnfInstanceId is null");
322             return restJson.toString();
323         }
324
325         restJson = vnfMgr.healVnf(jsonObject, vnfInstanceId, vnfmId);
326         if(restJson.getInt(Constant.RETCODE) == Constant.REST_FAIL) {
327             LOG.error("function=healVnf, msg=healVnf fail");
328             resp.setStatus(Constant.HTTP_INNERERROR);
329             return restJson.toString();
330         }
331
332         restJson.remove(Constant.RETCODE);
333         restJson.put("jobId", vnfInstanceId + "_put");
334         return restJson.toString();
335     }
336
337     private String getJobBody(JSONObject restJson) {
338         JSONObject responseJson = new JSONObject();
339         JSONObject jobInfoJson = new JSONObject();
340         JSONObject retJson = restJson.getJSONArray("data").getJSONObject(0);
341         jobInfoJson.put("jobId", retJson.getString("id"));
342         responseJson.put("progress", progressItem.get(retJson.getString(Constant.STATUS)));
343         responseJson.put("status", jobstatusItem.get(retJson.getString(Constant.STATUS)));
344         responseJson.put("errorCode", "null");
345         responseJson.put("responseId", progressItem.get(retJson.getString(Constant.STATUS)));
346         jobInfoJson.put("responsedescriptor", responseJson);
347         return jobInfoJson.toString();
348     }
349 }