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.openo.nfvo.jujuvnfmadapter.service.process;
19 import java.util.Date;
20 import java.util.HashMap;
21 import java.util.List;
23 import java.util.UUID;
25 import org.apache.commons.collections.CollectionUtils;
26 import org.apache.commons.lang.StringUtils;
27 import org.openo.baseservice.roa.util.restclient.RestfulResponse;
28 import org.openo.nfvo.jujuvnfmadapter.common.EntityUtils;
29 import org.openo.nfvo.jujuvnfmadapter.common.SwitchController;
30 import org.openo.nfvo.jujuvnfmadapter.common.VnfmUtil;
31 import org.openo.nfvo.jujuvnfmadapter.common.servicetoken.VnfmRestfulUtil;
32 import org.openo.nfvo.jujuvnfmadapter.service.adapter.inf.IResourceManager;
33 import org.openo.nfvo.jujuvnfmadapter.service.constant.Constant;
34 import org.openo.nfvo.jujuvnfmadapter.service.constant.UrlConstant;
35 import org.openo.nfvo.jujuvnfmadapter.service.entity.JujuVnfmInfo;
36 import org.openo.nfvo.jujuvnfmadapter.service.entity.JujuVnfmInfoExample;
37 import org.openo.nfvo.jujuvnfmadapter.service.mapper.JujuVnfmInfoMapper;
38 import org.slf4j.Logger;
39 import org.slf4j.LoggerFactory;
41 import net.sf.json.JSONException;
42 import net.sf.json.JSONObject;
45 * Provide function for instantiate or terminate VNF
49 * @version NFVO 0.5 Aug 24, 2016
53 private static final Logger LOG = LoggerFactory.getLogger(VnfMgr.class);
54 private JujuVnfmInfoMapper jujuVnfmInfoMapper;
55 private IResourceManager resourceManager;
57 public IResourceManager getResourceManager() {
58 return resourceManager;
61 public void setResourceManager(IResourceManager resourceManager) {
62 this.resourceManager = resourceManager;
66 * @return Returns the jujuVnfmInfoMapper.
68 public JujuVnfmInfoMapper getJujuVnfmInfoMapper() {
69 return jujuVnfmInfoMapper;
74 * @param jujuVnfmInfoMapper The jujuVnfmInfoMapper to set.
76 public void setJujuVnfmInfoMapper(JujuVnfmInfoMapper jujuVnfmInfoMapper) {
77 this.jujuVnfmInfoMapper = jujuVnfmInfoMapper;
81 * Provide function for instantiate VNF
89 public JSONObject addVnf(JSONObject vnfObject, String vnfmId) {
90 JSONObject restJson = new JSONObject();
91 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
94 if(vnfObject.isNullObject() || vnfObject.isEmpty()) {
97 String vnfInstanceName = vnfObject.getString("vnfInstanceName");
98 String csarId = vnfObject.getString("vnfPackageId");
101 url = vnfObject.getString("vnfmServiceUrl");
102 } catch (Exception e) {
103 LOG.warn("the value 'vnfmServiceUrl' not exist."+e.getMessage());
105 if (StringUtils.isBlank(url)) {
106 url = SwitchController.vnfmServiceUrl;
108 if (StringUtils.isBlank(url)) {
109 JSONObject vnfmObject = VnfmUtil.getVnfmById(vnfmId);
111 if(vnfmObject == null || vnfmObject.isNullObject()) {
112 LOG.error("function=addVnf, msg=Unable to get the jujuvnfm info from the 'ESR', vnfmId: {}", vnfmId);
115 url = vnfmObject.getString("url");
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);
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);
131 LOG.error("function=addVnf, msg=send create vnf msg to csm get wrong results");
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);
146 LOG.error("function=createVnf, msg=send create vnf msg to csm get wrong status: " + statusCode);
149 } catch(JSONException e) {
150 LOG.error("function=addVnf, msg=JSONException occurs, e={}.", e);
152 LOG.info("request:{},response:{}", vnfmId, restJson.toString());
164 public String getCharmPath(String csarId){
166 JSONObject res = resourceManager.getVnfdInfo(csarId);
167 if(res != null && res.getString("csarFilePath") != null){
168 return res.getString("csarFilePath");
170 } catch(Exception e) {
171 LOG.error("get charmPath fail:csarId="+csarId,e);
173 LOG.warn("get charmPath fail:csarId="+csarId);
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);
194 record.setCreateTime(new Date());
195 record.setModifyTime(new Date());
196 record.setExtend(vnfObject.toString());
197 jujuVnfmInfoMapper.insert(record);
200 * delete the object by vnfid
206 private void delJujuVnfmInfo(String vnfId){
207 JujuVnfmInfoExample example = new JujuVnfmInfoExample();
208 example.createCriteria().andVnfIdEqualTo(vnfId);
209 jujuVnfmInfoMapper.deleteByExample(example);
213 * findByVnfId from db
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()){
231 * Provide function for terminate VNF
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);
245 String url = SwitchController.vnfmServiceUrl;
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);
253 url = vnfmObject.getString("url");
256 String vnfInstanceName = "";
257 JujuVnfmInfo jujuInfo = findByVnfId(vnfId);
258 if(jujuInfo != null){
259 vnfInstanceName = jujuInfo.getAppName();
261 JSONObject params = new JSONObject();
262 params.put(Constant.VNFM_ID, vnfmId);
263 params.put("appName", vnfInstanceName);
264 params.put("vnfId", vnfId);
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);
273 LOG.error("function=deleteVnf, msg=send create vnf msg to csm get wrong results");
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);
285 LOG.error("function=removeVnf, msg=send remove vnf msg to csm get wrong status: {}", statusCode);
288 } catch(JSONException e) {
289 LOG.error("function=deleteVnf, msg=JSONException occurs, e={}.", e);
295 * Provide function for get VNF
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);
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);
317 url = vnfmObject.getString("url");
321 JujuVnfmInfo jujuInfo = findByVnfId(vnfId);
322 if(jujuInfo != null){
323 appName = jujuInfo.getAppName();
325 JSONObject params = new JSONObject();
326 params.put(Constant.VNFM_ID, vnfmId);
327 params.put("vnfId", vnfId);
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);
337 LOG.error("function=getVnf, msg=send create vnf msg to csm get wrong results");
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"));
347 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
348 restJson.put("data", JSONObject.fromObject(queryResult.getString("data")));
350 LOG.error("function=getVnf, msg=send get vnf msg to csm get wrong status: {}", statusCode);
352 return restJson.getInt(EntityUtils.RESULT_CODE_KEY) == Constant.REST_FAIL ? restJson
353 : getVnfBody(vnfId,appName, vnfmObject);
355 } catch(JSONException e) {
356 LOG.error("function=getVnf, msg=JSONException occurs, e={}.", e);
357 restJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_FAIL);
362 private JSONObject getVnfBody(String vnfId,String appName, JSONObject vnfmObject) {
363 JSONObject vnfInfoJson = new JSONObject();
364 JSONObject basicInfoJson = new JSONObject();
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");
376 vnfInfoJson.put("vnfInfo", basicInfoJson);
377 vnfInfoJson.put(EntityUtils.RESULT_CODE_KEY, Constant.REST_SUCCESS);
382 * Provide function for get job
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);