2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 Huawei Technologies Co., Ltd. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.mso.adapters.vfc;
23 import java.util.HashMap;
26 import org.openecomp.mso.adapters.vfc.constant.CommonConstant;
27 import org.openecomp.mso.adapters.vfc.constant.CommonConstant.Step;
28 import org.openecomp.mso.adapters.vfc.constant.DriverExceptionID;
29 import org.openecomp.mso.adapters.vfc.constant.HttpCode;
30 import org.openecomp.mso.adapters.vfc.exceptions.ApplicationException;
31 import org.openecomp.mso.adapters.vfc.model.CustomerModel;
32 import org.openecomp.mso.adapters.vfc.model.NSResourceInputParameter;
33 import org.openecomp.mso.adapters.vfc.model.NsCreateReq;
34 import org.openecomp.mso.adapters.vfc.model.NsInstantiateReq;
35 import org.openecomp.mso.adapters.vfc.model.NsOperationKey;
36 import org.openecomp.mso.adapters.vfc.model.NsParameters;
37 import org.openecomp.mso.adapters.vfc.model.NsProgressStatus;
38 import org.openecomp.mso.adapters.vfc.model.ResponseDescriptor;
39 import org.openecomp.mso.adapters.vfc.model.RestfulResponse;
40 import org.openecomp.mso.adapters.vfc.model.*;
41 import org.openecomp.mso.adapters.vfc.util.JsonUtil;
42 import org.openecomp.mso.adapters.vfc.util.RestfulUtil;
43 import org.openecomp.mso.adapters.vfc.util.ValidateUtil;
44 import org.openecomp.mso.requestsdb.RequestsDatabase;
45 import org.openecomp.mso.requestsdb.RequestsDbConstant;
46 import org.openecomp.mso.requestsdb.ResourceOperationStatus;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
56 * @version ONAP Amsterdam Release 2017-08-28
58 public class VfcManager {
60 private static final Logger LOGGER = LoggerFactory.getLogger(VfcManager.class);
65 private static Map<String, String> nfvoUrlMap;
68 nfvoUrlMap = new HashMap<>();
69 nfvoUrlMap.put(Step.CREATE, CommonConstant.NFVO_CREATE_URL);
70 nfvoUrlMap.put(Step.INSTANTIATE, CommonConstant.NFVO_INSTANTIATE_URL);
71 nfvoUrlMap.put(Step.TERMINATE, CommonConstant.NFVO_TERMINATE_URL);
72 nfvoUrlMap.put(Step.DELETE, CommonConstant.NFVO_DELETE_URL);
73 nfvoUrlMap.put(Step.QUERY, CommonConstant.NFVO_QUERY_URL);
74 nfvoUrlMap.put(Step.SCALE, CommonConstant.NFVO_SCALE_URL);
82 * create network service <br>
84 * @param segInput input parameters for current node from http request
86 * @since ONAP Amsterdam Release
88 public RestfulResponse createNs(NSResourceInputParameter segInput) throws ApplicationException {
90 // Step1: get service template by node type
91 String csarId = segInput.getNsOperationKey().getNodeTemplateUUID();
92 // nsdId for NFVO is "id" in the response, while for SDNO is "servcice template id"
93 LOGGER.info("serviceTemplateId is {}, id is {}", csarId);
95 LOGGER.info("create ns -> begin");
96 // Step2: Prepare url and method type
97 String url = getUrl(null, CommonConstant.Step.CREATE);
98 String methodType = CommonConstant.MethodType.POST;
100 // Step3: Prepare restful parameters and options
101 NsCreateReq oRequest = new NsCreateReq();
102 oRequest.setCsarId(csarId);
103 oRequest.setNsName(segInput.getNsServiceName());
104 oRequest.setDescription(segInput.getNsServiceDescription());
105 CustomerModel context = new CustomerModel();
106 context.setGlobalCustomerId(segInput.getNsOperationKey().getGlobalSubscriberId());
107 context.setServiceType(segInput.getNsOperationKey().getServiceType());
108 oRequest.setContext(context);
109 String createReq = JsonUtil.marshal(oRequest);
111 // Step4: Call NFVO or SDNO lcm to create ns
112 RestfulResponse createRsp = RestfulUtil.send(url, methodType, createReq);
113 ValidateUtil.assertObjectNotNull(createRsp);
114 LOGGER.info("create ns response status is : {}", createRsp.getStatus());
115 LOGGER.info("create ns response content is : {}", createRsp.getResponseContent());
117 // Step 5: save resource operation information
118 ResourceOperationStatus nsOperInfo = (RequestsDatabase.getInstance())
119 .getResourceOperationStatus(segInput.getNsOperationKey().getServiceId(),
120 segInput.getNsOperationKey().getOperationId(),
121 segInput.getNsOperationKey().getNodeTemplateUUID());
122 nsOperInfo.setStatus(RequestsDbConstant.Status.PROCESSING);
123 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
125 if (!HttpCode.isSucess(createRsp.getStatus())) {
126 LOGGER.error("update segment operation status : fail to create ns");
127 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
128 nsOperInfo.setErrorCode(String.valueOf(createRsp.getStatus()));
129 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
130 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
131 DriverExceptionID.FAIL_TO_CREATE_NS);
133 @SuppressWarnings("unchecked")
134 Map<String, String> rsp = JsonUtil.unMarshal(createRsp.getResponseContent(), Map.class);
135 String nsInstanceId = rsp.get(CommonConstant.NS_INSTANCE_ID);
136 if (ValidateUtil.isStrEmpty(nsInstanceId)) {
137 LOGGER.error("Invalid instanceId from create operation");
138 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
139 DriverExceptionID.INVALID_RESPONSEE_FROM_CREATE_OPERATION);
141 LOGGER.info("create ns -> end");
142 LOGGER.info("save segment and operaton info -> begin");
143 // Step 6: add relation between service and NS
144 AaiUtil.addRelation(segInput.getNsOperationKey().getGlobalSubscriberId(),
145 segInput.getNsOperationKey().getServiceType(), segInput.getNsOperationKey().getServiceId(),
147 LOGGER.info("save segment and operation info -> end");
152 * delete network service <br>
154 * @param nsOperationKey The operation key of the NS resource
155 * @param nsInstanceId The NS instance id
157 * @since ONAP Amsterdam Release
159 public RestfulResponse deleteNs(NsOperationKey nsOperationKey, String nsInstanceId)
160 throws ApplicationException {
161 LOGGER.info("delete ns -> begin");
162 // Step1: prepare url and methodType
163 String url = getUrl(nsInstanceId, CommonConstant.Step.DELETE);
164 String methodType = CommonConstant.MethodType.DELETE;
166 // Step2: prepare restful parameters and options
167 RestfulResponse deleteRsp = RestfulUtil.send(url, methodType, "");
168 ValidateUtil.assertObjectNotNull(deleteRsp);
169 LOGGER.info("delete ns response status is : {}", deleteRsp.getStatus());
170 LOGGER.info("delete ns response content is : {}", deleteRsp.getResponseContent());
171 LOGGER.info("delete ns -> end");
172 ResourceOperationStatus nsOperInfo =
173 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
174 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
175 if (!HttpCode.isSucess(deleteRsp.getStatus())) {
176 LOGGER.error("fail to delete ns");
178 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
179 nsOperInfo.setErrorCode(String.valueOf(deleteRsp.getStatus()));
180 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
181 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
182 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
183 DriverExceptionID.FAIL_TO_DELETE_NS);
186 // Step3: remove relation info between service and ns
187 AaiUtil.removeRelation(nsOperationKey.getGlobalSubscriberId(), nsOperationKey.getServiceType(),
188 nsOperationKey.getServiceId(), nsInstanceId);
189 LOGGER.info("delete segment information -> end");
191 // Step4: update service segment operation status
192 nsOperInfo.setStatus(RequestsDbConstant.Status.FINISHED);
193 nsOperInfo.setErrorCode(String.valueOf(deleteRsp.getStatus()));
194 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
195 LOGGER.info("update segment operaton status for delete -> end");
202 * instantiate network service <br>
204 * @param nsInstanceId The NS instance id
205 * @param segInput input parameters for current node from http request
207 * @since ONAP Amsterdam Release
209 public RestfulResponse instantiateNs(String nsInstanceId, NSResourceInputParameter segInput)
210 throws ApplicationException {
211 // Call the NFVO or SDNO service to instantiate service
212 LOGGER.info("instantiate ns -> begin");
214 // Step1: Prepare restful parameters and options
215 NsInstantiateReq oRequest = new NsInstantiateReq();
216 oRequest.setNsInstanceId(nsInstanceId);
217 NsParameters nsParameters = segInput.getNsParameters();
218 oRequest.setLocationConstraints(nsParameters.getLocationConstraints());
219 oRequest.setAdditionalParamForNs(nsParameters.getAdditionalParamForNs());
220 String instReq = JsonUtil.marshal(oRequest);
221 // Step2: prepare url and
222 String url = getUrl(nsInstanceId, CommonConstant.Step.INSTANTIATE);
223 String methodType = CommonConstant.MethodType.POST;
225 RestfulResponse instRsp = RestfulUtil.send(url, methodType, instReq);
226 ResourceOperationStatus nsOperInfo = (RequestsDatabase.getInstance())
227 .getResourceOperationStatus(segInput.getNsOperationKey().getServiceId(),
228 segInput.getNsOperationKey().getOperationId(),
229 segInput.getNsOperationKey().getNodeTemplateUUID());
230 ValidateUtil.assertObjectNotNull(instRsp);
231 if (!HttpCode.isSucess(instRsp.getStatus())) {
232 LOGGER.error("update segment operation status : fail to instantiate ns");
233 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
234 nsOperInfo.setErrorCode(String.valueOf(instRsp.getStatus()));
235 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
236 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
237 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
238 DriverExceptionID.FAIL_TO_INSTANTIATE_NS);
240 LOGGER.info("instantiate ns response status is : {}", instRsp.getStatus());
241 LOGGER.info("instantiate ns response content is : {}", instRsp.getResponseContent());
242 ValidateUtil.assertObjectNotNull(instRsp.getResponseContent());
243 @SuppressWarnings("unchecked")
244 Map<String, String> rsp = JsonUtil.unMarshal(instRsp.getResponseContent(), Map.class);
245 String jobId = rsp.get(CommonConstant.JOB_ID);
246 if (ValidateUtil.isStrEmpty(jobId)) {
247 LOGGER.error("Invalid jobId from instantiate operation");
248 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
249 nsOperInfo.setErrorCode(String.valueOf(instRsp.getStatus()));
250 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.INSTANTIATE_NS_FAILED);
251 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
252 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
253 DriverExceptionID.INVALID_RESPONSE_FROM_INSTANTIATE_OPERATION);
255 LOGGER.info("instantiate ns -> end");
256 // Step 3: update segment operation job id
257 LOGGER.info("update resource operation status job id -> begin");
258 nsOperInfo.setJobId(jobId);
259 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
260 LOGGER.info("update segment operation job id -> end");
266 * terminate network service <br>
268 * @param nsOperationKey The operation key for NS resource
269 * @param nsInstanceId The NS instance id
271 * @since ONAP Amsterdam Release
273 public RestfulResponse terminateNs(NsOperationKey nsOperationKey, String nsInstanceId)
274 throws ApplicationException {
275 // Step1: save segment operation info for delete process
276 LOGGER.info("save segment operation for delete process");
277 ResourceOperationStatus nsOperInfo =
278 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
279 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
280 nsOperInfo.setStatus(RequestsDbConstant.Status.PROCESSING);
281 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
283 LOGGER.info("terminate ns -> begin");
284 // Step2: prepare url and method type
285 String url = getUrl(nsInstanceId, CommonConstant.Step.TERMINATE);
286 String methodType = CommonConstant.MethodType.POST;
288 // Step3: prepare restful parameters and options
289 Map<String, String> reqBody = new HashMap<>();
290 reqBody.put("nsInstanceId", nsInstanceId);
291 reqBody.put("terminationType", "graceful");
292 reqBody.put("gracefulTerminationTimeout", "60");
294 // Step4: Call the NFVO or SDNO service to terminate service
295 RestfulResponse terminateRsp = RestfulUtil.send(url, methodType, JsonUtil.marshal(reqBody));
296 ValidateUtil.assertObjectNotNull(terminateRsp);
297 LOGGER.info("terminate ns response status is : {}", terminateRsp.getStatus());
298 LOGGER.info("terminate ns response content is : {}", terminateRsp.getResponseContent());
299 // Step 3: update segment operation
300 if (!HttpCode.isSucess(terminateRsp.getStatus())) {
301 LOGGER.error("fail to instantiate ns");
302 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
303 nsOperInfo.setErrorCode(String.valueOf(terminateRsp.getStatus()));
304 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
305 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
307 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
308 DriverExceptionID.FAIL_TO_TERMINATE_NS);
310 @SuppressWarnings("unchecked")
311 Map<String, String> rsp = JsonUtil.unMarshal(terminateRsp.getResponseContent(), Map.class);
312 String jobId = rsp.get(CommonConstant.JOB_ID);
313 if (ValidateUtil.isStrEmpty(jobId)) {
314 LOGGER.error("Invalid jobId from terminate operation");
315 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
316 nsOperInfo.setErrorCode(String.valueOf(terminateRsp.getStatus()));
317 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.TERMINATE_NS_FAILED);
318 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
319 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
320 DriverExceptionID.INVALID_RESPONSE_FROM_TERMINATE_OPERATION);
322 LOGGER.info("terminate ns -> end");
324 LOGGER.info("update segment job id -> begin");
325 nsOperInfo.setJobId(jobId);
326 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
327 LOGGER.info("update segment job id -> end");
333 * get ns progress by job Id <br>
335 * @param nsOperationKey The OperationKey for NS resource
336 * @param jobId the job id
338 * @since ONAP Amsterdam Release
340 public RestfulResponse getNsProgress(NsOperationKey nsOperationKey, String jobId)
341 throws ApplicationException {
343 ValidateUtil.assertObjectNotNull(jobId);
344 // Step 1: query the current resource operation status
345 ResourceOperationStatus nsOperInfo =
346 (RequestsDatabase.getInstance()).getResourceOperationStatus(nsOperationKey.getServiceId(),
347 nsOperationKey.getOperationId(), nsOperationKey.getNodeTemplateUUID());
349 // Step 2: start query
350 LOGGER.info("query ns status -> begin");
351 String url = getUrl(jobId, CommonConstant.Step.QUERY);
352 String methodType = CommonConstant.MethodType.GET;
353 // prepare restful parameters and options
354 RestfulResponse rsp = RestfulUtil.send(url, methodType, "");
355 ValidateUtil.assertObjectNotNull(rsp);
356 LOGGER.info("query ns progress response status is : {}", rsp.getStatus());
357 LOGGER.info("query ns progress response content is : {}", rsp.getResponseContent());
358 // Step 3:check the response staus
359 if (!HttpCode.isSucess(rsp.getStatus())) {
360 LOGGER.info("fail to query job status");
361 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
362 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
363 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
364 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
365 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
366 DriverExceptionID.FAIL_TO_QUERY_JOB_STATUS);
368 // Step 4: Process Network Service Instantiate Response
369 NsProgressStatus nsProgress =
370 JsonUtil.unMarshal(rsp.getResponseContent(), NsProgressStatus.class);
371 ResponseDescriptor rspDesc = nsProgress.getResponseDescriptor();
372 // Step 5: update segment operation progress
374 nsOperInfo.setProgress(rspDesc.getProgress());
375 nsOperInfo.setStatusDescription(rspDesc.getStatusDescription());
376 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
378 // Step 6: update segment operation status
379 if (RequestsDbConstant.Progress.ONE_HUNDRED.equals(rspDesc.getProgress())
380 && RequestsDbConstant.Status.FINISHED.equals(rspDesc.getStatus())) {
381 LOGGER.info("job result is succeeded, operType is {}", nsOperInfo.getOperType());
382 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
383 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
385 if(RequestsDbConstant.OperationType.CREATE.equalsIgnoreCase(nsOperInfo.getOperType())) {
386 nsOperInfo.setStatus(RequestsDbConstant.Status.FINISHED);
388 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
389 } else if (RequestsDbConstant.Status.ERROR.equals(rspDesc.getStatus())) {
390 LOGGER.error("job result is failed, operType is {}", nsOperInfo.getOperType());
391 nsOperInfo.setErrorCode(String.valueOf(rsp.getStatus()));
392 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.QUERY_JOB_STATUS_FAILED);
393 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
394 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
395 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
396 DriverExceptionID.JOB_STATUS_ERROR);
398 LOGGER.error("unexcepted response status");
400 LOGGER.info("query ns status -> end");
409 * @param nsInstanceId The NS instance id
410 * @param segInput input parameters for current node from http request
412 * @since ONAP Amsterdam Release
414 public RestfulResponse scaleNs(String nsInstanceId, NSResourceInputParameter segInput)
415 throws ApplicationException {
416 // Call the NFVO to scale service
417 LOGGER.info("scale ns -> begin");
419 // Step1: Prepare restful parameters and options
420 VFCScaleData oRequest = new VFCScaleData();
421 oRequest.setNsInstanceId(nsInstanceId);
422 NsScaleParameters nsScaleParameters = segInput.getNsScaleParameters();
423 oRequest.setScaleType(nsScaleParameters.getScaleType());
424 oRequest.setScaleNsData(nsScaleParameters.getScaleNsByStepsData());
425 String scaleReq = JsonUtil.marshal(oRequest);
427 // Step2: prepare url and method type
428 String url = getUrl(nsInstanceId, CommonConstant.Step.SCALE);
429 String methodType = CommonConstant.MethodType.POST;
430 LOGGER.info("scale ns request is {}", scaleReq);
431 // Step3: Call NFVO lcm to scale ns
432 RestfulResponse scaleRsp = RestfulUtil.send(url, methodType, scaleReq);
433 ResourceOperationStatus nsOperInfo = (RequestsDatabase.getInstance()).getResourceOperationStatus(
434 segInput.getNsOperationKey().getServiceId(), segInput.getNsOperationKey().getOperationId(),
435 segInput.getNsOperationKey().getNodeTemplateUUID());
436 ValidateUtil.assertObjectNotNull(scaleRsp);
437 if(!HttpCode.isSucess(scaleRsp.getStatus())) {
438 LOGGER.error("update segment operation status : fail to scale ns");
439 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
440 nsOperInfo.setErrorCode(String.valueOf(scaleRsp.getStatus()));
441 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.SCALE_NS_FAILED);
442 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
443 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR, DriverExceptionID.FAIL_TO_SCALE_NS);
445 LOGGER.info("scale ns response status is {}", scaleRsp.getStatus());
446 LOGGER.info("scale ns response content is {}", scaleRsp.getResponseContent());
448 ValidateUtil.assertObjectNotNull(scaleRsp.getResponseContent());
449 @SuppressWarnings("unchecked")
450 Map<String, String> rsp = JsonUtil.unMarshal(scaleRsp.getResponseContent(), Map.class);
451 String jobId = rsp.get(CommonConstant.JOB_ID);
452 if(ValidateUtil.isStrEmpty(jobId)) {
453 LOGGER.error("Invalid jobId from scale operation");
454 nsOperInfo.setStatus(RequestsDbConstant.Status.ERROR);
455 nsOperInfo.setErrorCode(String.valueOf(scaleRsp.getStatus()));
456 nsOperInfo.setStatusDescription(CommonConstant.StatusDesc.SCALE_NS_FAILED);
457 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
458 throw new ApplicationException(HttpCode.INTERNAL_SERVER_ERROR,
459 DriverExceptionID.INVALID_RESPONSE_FROM_SCALE_OPERATION);
462 LOGGER.info("update resource operation status job id -> begin");
463 // Step 4: update segment operation job id
464 nsOperInfo.setJobId(jobId);
465 (RequestsDatabase.getInstance()).updateResOperStatus(nsOperInfo);
466 LOGGER.info("update segment operation job id -> end");
467 LOGGER.info("scale ns -> end");
473 * get url for the operation <br>
475 * @param variable variable should be put in the url
476 * @param step step of the operation (terminate,query,delete)
478 * @since ONAP Amsterdam Release
480 private String getUrl(String variable, String step) {
484 originalUrl = (String) nfvoUrlMap.get(step);
485 url = String.format(originalUrl, variable);