Update gvnfm-driver .gitreview file
[vfc/nfvo/driver/vnfm/gvnfm.git] / juju / juju-vnfmadapter / Juju-vnfmadapterService / service / src / main / java / org / onap / vfc / nfvo / vnfm / gvnfm / jujuvnfmadapter / service / process / VnfMgr.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.gvnfm.jujuvnfmadapter.service.process;
18
19 import java.util.Date;
20 import java.util.HashMap;
21 import java.util.List;
22 import java.util.Map;
23 import java.util.UUID;
24
25 import org.apache.commons.collections.CollectionUtils;
26 import org.apache.commons.lang.StringUtils;
27 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.common.EntityUtils;
28 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.common.SwitchController;
29 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.common.VnfmUtil;
30 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.common.servicetoken.VnfmRestfulUtil;
31 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.adapter.inf.IResourceManager;
32 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.constant.Constant;
33 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.constant.UrlConstant;
34 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.entity.JujuVnfmInfo;
35 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.entity.JujuVnfmInfoExample;
36 import org.onap.vfc.nfvo.vnfm.gvnfm.jujuvnfmadapter.service.mapper.JujuVnfmInfoMapper;
37 import org.openo.baseservice.roa.util.restclient.RestfulResponse;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
40
41 import net.sf.json.JSONException;
42 import net.sf.json.JSONObject;
43
44 /**
45  * Provide function for instantiate or terminate VNF
46  * <br/>
47  * 
48  * @author
49  * @version NFVO 0.5 Aug 24, 2016
50  */
51 public class VnfMgr {
52
53     private static final Logger LOG = LoggerFactory.getLogger(VnfMgr.class);
54     private JujuVnfmInfoMapper jujuVnfmInfoMapper;
55     private IResourceManager resourceManager;
56
57     public IResourceManager getResourceManager() {
58         return resourceManager;
59     }
60
61     public void setResourceManager(IResourceManager resourceManager) {
62         this.resourceManager = resourceManager;
63     }
64
65     /**
66      * @return Returns the jujuVnfmInfoMapper.
67      */
68     public JujuVnfmInfoMapper getJujuVnfmInfoMapper() {
69         return jujuVnfmInfoMapper;
70     }
71
72     
73     /**
74      * @param jujuVnfmInfoMapper The jujuVnfmInfoMapper to set.
75      */
76     public void setJujuVnfmInfoMapper(JujuVnfmInfoMapper jujuVnfmInfoMapper) {
77         this.jujuVnfmInfoMapper = jujuVnfmInfoMapper;
78     }
79
80     /**
81      * Provide function for instantiate VNF
82      * <br/>
83      * 
84      * @param vnfObject
85      * @param vnfmId
86      * @return
87      * @since NFVO 0.5
88      */
89     public JSONObject addVnf(JSONObject vnfObject, String vnfmId) {
90         JSONObject restJson = new JSONObject();
91         restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
92         try {
93
94             if(vnfObject.isNullObject() || vnfObject.isEmpty()) {
95                 return restJson;
96             }
97             String vnfInstanceName = vnfObject.getString("vnfInstanceName");
98             String csarId = vnfObject.getString("vnfPackageId");
99             String url = null;
100             try {
101                 url = vnfObject.getString("vnfmServiceUrl");
102             } catch (Exception e) {
103                 LOG.warn("the value 'vnfmServiceUrl' not exist."+e.getMessage());
104             }
105             if (StringUtils.isBlank(url)) {
106                 url = SwitchController.vnfmServiceUrl;
107             }
108             if (StringUtils.isBlank(url)) {
109                 JSONObject vnfmObject = VnfmUtil.getVnfmById(vnfmId);
110
111                 if(vnfmObject == null || vnfmObject.isNullObject()) {
112                     LOG.error("function=addVnf, msg=Unable to get the jujuvnfm info from the 'ESR', vnfmId: {}", vnfmId);
113                     return restJson;
114                 }
115                 url = vnfmObject.getString("url");
116             }
117             //call juju-cliento deploy
118             JSONObject params = new JSONObject();
119             params.put(Constant.VNFM_ID, vnfmId);
120             params.put("appName", vnfInstanceName);
121             params.put("csarId", csarId);
122
123
124             Map<String, String> paramsMap = new HashMap<>(6);
125             paramsMap.put("url", url);
126             paramsMap.put(Constant.METHOD_TYPE, Constant.POST);
127             paramsMap.put("path", UrlConstant.REST_JUJU_CLIENT_DEPLOY);
128             paramsMap.put(Constant.AUTH_MODE, Constant.AuthenticationMode.ANONYMOUS);
129             RestfulResponse rsp = VnfmRestfulUtil.getRemoteResponse(paramsMap, params.toString(), null);
130             if(rsp == null) {
131                 LOG.error("function=addVnf, msg=send create vnf msg to csm get wrong results");
132                 return restJson;
133             }
134
135             int statusCode = rsp.getStatus();
136             if(statusCode == Constant.HTTP_CREATED || statusCode == Constant.HTTP_OK) {
137                 JSONObject res = JSONObject.fromObject(rsp.getResponseContent());
138                 String vnfId = res.getString("vnfId");
139                 saveJujuVnfmInfo(vnfInstanceName,vnfId,vnfId,vnfmId,vnfObject);
140                 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
141                 JSONObject resultObj = new JSONObject();
142                 resultObj.put("vnfInstanceId", vnfId);
143                 resultObj.put("jobId", vnfId + "_" + Constant.POST);
144                 restJson.put("data", resultObj);
145             } else {
146                 LOG.error("function=createVnf, msg=send create vnf msg to csm get wrong status: " + statusCode);
147             }
148
149         } catch(JSONException e) {
150             LOG.error("function=addVnf, msg=JSONException occurs, e={}.", e);
151         }
152         LOG.info("request:{},response:{}", vnfmId, restJson.toString());
153         return restJson;
154     }
155    
156     /**
157      * 
158      * <br/>
159      * 
160      * @param csarId
161      * @return
162      * @since  NFVO 0.5
163      */
164     public String getCharmPath(String csarId){
165         try {
166             JSONObject res = resourceManager.getVnfdInfo(csarId);
167             if(res != null && res.getString("csarFilePath") != null){
168                 return res.getString("csarFilePath");
169             }
170         } catch(Exception e) {
171             LOG.error("get charmPath fail:csarId="+csarId,e);
172         }
173         LOG.warn("get charmPath fail:csarId="+csarId);
174         return null;
175     }
176     /**
177      * save object to db
178      * <br/>
179      * 
180      * @param appName
181      * @param jobId
182      * @param vnfId
183      * @param vnfmId
184      * @since  NFVO 0.5
185      */
186     private void saveJujuVnfmInfo(String appName,String jobId,String vnfId,String vnfmId, JSONObject vnfObject){
187         JujuVnfmInfo record = new JujuVnfmInfo();
188         record.setId(UUID.randomUUID().toString());
189         record.setAppName(appName);
190         record.setJobId(jobId);
191         record.setVnfId(vnfId);
192         record.setVnfmId(vnfmId);
193         record.setStatus(0);
194         record.setCreateTime(new Date());
195         record.setModifyTime(new Date());
196         record.setExtend(vnfObject.toString());
197         jujuVnfmInfoMapper.insert(record);
198     }
199     /**
200      * delete the object by vnfid
201      * <br/>
202      * 
203      * @param vnfId
204      * @since  NFVO 0.5
205      */
206     private void delJujuVnfmInfo(String vnfId){
207         JujuVnfmInfoExample example = new JujuVnfmInfoExample();
208         example.createCriteria().andVnfIdEqualTo(vnfId);
209         jujuVnfmInfoMapper.deleteByExample(example);
210     }
211     
212     /**
213      * findByVnfId from db
214      * <br/>
215      * 
216      * @param vnfId
217      * @return
218      * @since  NFVO 0.5
219      */
220     private JujuVnfmInfo findByVnfId(String vnfId){
221         JujuVnfmInfoExample example = new JujuVnfmInfoExample();
222         example.createCriteria().andVnfIdEqualTo(vnfId);
223         List<JujuVnfmInfo> list = jujuVnfmInfoMapper.selectByExample(example);
224         if(CollectionUtils.isNotEmpty(list) && !list.isEmpty()){
225             return list.get(0);
226         }
227         return null;
228     }
229
230     /**
231      * Provide function for terminate VNF
232      * <br/>
233      * 
234      * @param vnfId
235      * @param vnfmId
236      * @param vnfObject
237      * @return
238      * @since NFVO 0.5
239      */
240     public JSONObject deleteVnf(String vnfId, String vnfmId, JSONObject vnfObject) {
241         LOG.warn("function=deleteVnf ,msg=enter to delete a vnf, vnfId:{}, vnfmId:{}", vnfId, vnfmId);
242         JSONObject restJson = new JSONObject();
243         restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
244         try {
245             String url = SwitchController.vnfmServiceUrl;
246
247             if (StringUtils.isBlank(url)) {
248                 JSONObject vnfmObject = VnfmUtil.getVnfmById(vnfmId);
249                 if(vnfmObject==null || vnfmObject.isNullObject()) {
250                     LOG.error("function=deleteVnf, msg=Unable to get the jujuvnfm info from the 'ESR', vnfmId: {}", vnfmId);
251                     return restJson;
252                 }
253                 url = vnfmObject.getString("url");
254             }
255
256             String vnfInstanceName = "";
257             JujuVnfmInfo jujuInfo = findByVnfId(vnfId);
258             if(jujuInfo != null){
259                 vnfInstanceName = jujuInfo.getAppName();
260             }
261             JSONObject params = new JSONObject();
262             params.put(Constant.VNFM_ID, vnfmId);
263             params.put("appName", vnfInstanceName);
264             params.put("vnfId", vnfId);
265
266             Map<String, String> paramsMap = new HashMap<>(6);
267             paramsMap.put("url", url);
268             paramsMap.put(Constant.METHOD_TYPE, Constant.POST);
269             paramsMap.put("path", UrlConstant.REST_JUJU_CLIENT_DESTORY);
270             paramsMap.put(Constant.AUTH_MODE, Constant.AuthenticationMode.ANONYMOUS);
271             RestfulResponse rsp = VnfmRestfulUtil.getRemoteResponse(paramsMap, params.toString(), null);
272             if(rsp == null) {
273                 LOG.error("function=deleteVnf, msg=send create vnf msg to csm get wrong results");
274                 return restJson;
275             }
276
277             int statusCode = rsp.getStatus();
278             if(statusCode == Constant.UNREG_SUCCESS) {
279                 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
280                 JSONObject resultObj = new JSONObject();
281                 resultObj.put("jobId", vnfId + "_" + Constant.DELETE);
282                 restJson.put("data", resultObj);
283                 delJujuVnfmInfo(vnfId);
284             } else {
285                 LOG.error("function=removeVnf, msg=send remove vnf msg to csm get wrong status: {}", statusCode);
286             }
287
288         } catch(JSONException e) {
289             LOG.error("function=deleteVnf, msg=JSONException occurs, e={}.", e);
290         }
291         return restJson;
292     }
293
294     /**
295      * Provide function for get VNF
296      * <br/>
297      * 
298      * @param vnfId
299      * @param vnfmId
300      * @return
301      * @since NFVO 0.5
302      */
303     public JSONObject getVnf(String vnfId, String vnfmId) {
304         LOG.warn("function=getVnf ,msg=enter to get a vnf, vnfId:{}, vnfmId:{}", vnfId, vnfmId);
305         JSONObject restJson = new JSONObject();
306         restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
307         try {
308             String url = SwitchController.vnfmServiceUrl;
309             JSONObject vnfmObject = null;
310             if (StringUtils.isBlank(url)) {
311                 // call the ESR to get jujuvnfm server url
312                 vnfmObject = VnfmUtil.getVnfmById(vnfmId);
313                 if(vnfmObject==null || vnfmObject.isNullObject()) {
314                     LOG.error("Unable to get jujuvnfm url info from the 'ESR', vnfmId: {}", vnfmId);
315                     return restJson;
316                 }
317                 url = vnfmObject.getString("url");
318             }
319
320             String appName = "";
321             JujuVnfmInfo jujuInfo = findByVnfId(vnfId);
322             if(jujuInfo != null){
323                 appName = jujuInfo.getAppName();
324             }
325             JSONObject params = new JSONObject();
326             params.put(Constant.VNFM_ID, vnfmId);
327             params.put("vnfId", vnfId);
328
329
330             Map<String, String> paramsMap = new HashMap<>(6);
331             paramsMap.put("url", url);
332             paramsMap.put(Constant.METHOD_TYPE, Constant.GET);
333             paramsMap.put("path", String.format(UrlConstant.REST_JUJU_CLIENT_GET,appName));
334             paramsMap.put(Constant.AUTH_MODE, Constant.AuthenticationMode.ANONYMOUS);
335             RestfulResponse rsp = VnfmRestfulUtil.getRemoteResponse(paramsMap, params.toString(), null);
336             if(rsp == null) {
337                 LOG.error("function=getVnf, msg=send create vnf msg to csm get wrong results");
338                 return restJson;
339             }
340             JSONObject queryResult = JSONObject.fromObject(rsp.getResponseContent());
341             int statusCode = rsp.getStatus();
342             if(statusCode == Constant.HTTP_OK || statusCode == Constant.HTTP_CREATED) {
343                 if(null == (queryResult.get("data"))) {
344                     LOG.warn("function=getVnf, msg=query is null {}", queryResult.get("data"));
345                     return restJson;
346                 }
347                 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
348                 restJson.put("data", JSONObject.fromObject(queryResult.getString("data")));
349             } else {
350                 LOG.error("function=getVnf, msg=send get vnf msg to csm get wrong status: {}", statusCode);
351             }
352             return restJson.getInt(EntityUtils.RESULT_CODE_KEY) == Constant.REST_FAIL ? restJson
353                     : getVnfBody(vnfId,appName, vnfmObject);
354
355         } catch(JSONException e) {
356             LOG.error("function=getVnf, msg=JSONException occurs, e={}.", e);
357             restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
358         }
359         return restJson;
360     }
361
362     private JSONObject getVnfBody(String vnfId,String appName, JSONObject vnfmObject) {
363         JSONObject vnfInfoJson = new JSONObject();
364         JSONObject basicInfoJson = new JSONObject();
365
366         basicInfoJson.put("vnfInstanceId", vnfId);
367         basicInfoJson.put("vnfInstanceName", appName);
368         basicInfoJson.put("vnfInstanceDescription", "vFW");
369         basicInfoJson.put("vnfdId", vnfmObject == null ? "" : vnfmObject.getString("vnfdId"));
370         basicInfoJson.put("vnfdPackageId", vnfmObject == null ? "" : vnfmObject.getString("vnfPackageId"));
371         basicInfoJson.put("version", vnfmObject == null ? "" : vnfmObject.getString("version"));
372         basicInfoJson.put("vnfProvider", "hw");
373         basicInfoJson.put("vnfType", appName);
374         basicInfoJson.put("vnfStatus", "activie");
375
376         vnfInfoJson.put("vnfInfo", basicInfoJson);
377         vnfInfoJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
378         return vnfInfoJson;
379     }
380
381     /**
382      * Provide function for get job
383      * <br/>
384      * 
385      * @param jobId
386      * @param vnfmId
387      * @return
388      * @since NFVO 0.5
389      */
390     public JSONObject getJob(String jobId, String vnfmId) {
391         LOG.info("getJob->jobId="+jobId+",vnfmId="+vnfmId);
392         JSONObject jobInfoJson = new JSONObject();
393         JSONObject responseJson = new JSONObject();
394         jobInfoJson.put("jobId",jobId);
395         responseJson.put("progress","100");
396         responseJson.put("status","finished");
397         responseJson.put("errorCode","null");
398         responseJson.put("responseId",(Math.random()*10+1));
399         jobInfoJson.put("responseDescriptor",responseJson);
400         LOG.info("get job response:"+jobInfoJson);
401         return jobInfoJson;
402     }
403 }