2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2018 - 2019 Nokia. All rights reserved.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
21 package org.onap.vid.mso;
23 import com.fasterxml.jackson.annotation.JsonCreator;
24 import com.fasterxml.jackson.annotation.JsonValue;
25 import com.fasterxml.jackson.databind.DeserializationFeature;
26 import com.fasterxml.jackson.databind.ObjectMapper;
27 import com.google.common.collect.ImmutableList;
28 import com.google.common.collect.ImmutableMap;
29 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
30 import org.onap.portalsdk.core.util.SystemProperties;
31 import org.onap.vid.changeManagement.ChangeManagementRequest;
32 import org.onap.vid.changeManagement.RequestDetailsWrapper;
33 import org.onap.vid.changeManagement.UIWorkflowsRequest;
34 import org.onap.vid.changeManagement.WorkflowRequestDetail;
35 import org.onap.vid.controller.ControllersUtils;
36 import org.onap.vid.controller.OperationalEnvironmentController;
37 import org.onap.vid.exceptions.GenericUncheckedException;
38 import org.onap.vid.model.RequestReferencesContainer;
39 import org.onap.vid.model.SoftDeleteRequest;
40 import org.onap.vid.mso.model.*;
41 import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestDetails;
42 import org.onap.vid.mso.rest.*;
43 import org.springframework.beans.factory.annotation.Autowired;
44 import org.togglz.core.manager.FeatureManager;
46 import javax.ws.rs.BadRequestException;
47 import java.io.IOException;
49 import java.util.regex.Pattern;
50 import java.util.stream.Collectors;
51 import java.util.stream.Stream;
53 import static java.util.stream.Collectors.collectingAndThen;
54 import static java.util.stream.Collectors.toList;
55 import static org.apache.commons.lang.StringUtils.upperCase;
56 import static org.onap.vid.changeManagement.ChangeManagementRequest.MsoChangeManagementRequest;
57 import static org.onap.vid.controller.MsoController.*;
58 import static org.onap.vid.mso.MsoProperties.*;
59 import static org.onap.vid.properties.Features.FLAG_UNASSIGN_SERVICE;
60 import static org.onap.vid.utils.Logging.debugRequestDetails;
62 public class MsoBusinessLogicImpl implements MsoBusinessLogic {
64 static final List<String> DASHBOARD_ALLOWED_TYPES = Stream.of(RequestType.REPLACE_INSTANCE,
65 RequestType.UPDATE_INSTANCE,
66 RequestType.APPLY_UPDATED_CONFIG,
67 RequestType.IN_PLACE_SOFTWARE_UPDATE,
68 RequestType.SCALE_OUT)
69 .map(requestType -> requestType.toString().toUpperCase())
70 .collect(collectingAndThen(toList(), Collections::unmodifiableList));
71 private static final String RESOURCE_TYPE = "resourceType";
72 private static final Pattern SOFTWARE_VERSION_PATTERN = Pattern.compile("^[A-Za-z0-9.\\-]+$");
73 private static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9]+$");
74 private static final String ACTIVATE = "/activate";
75 private static final String DEACTIVATE = "/deactivate";
76 private static final String ENABLE_PORT = "/enablePort";
77 private static final String DISABLE_PORT = "/disablePort";
78 private static final String ACTIVATE_FABRIC_CONFIGURATION = "/activateFabricConfiguration";
79 private static final String DEACTIVATE_AND_CLOUD_DELETE = "/deactivateAndCloudDelete";
80 private static final String RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT = "operationalEnvironment";
81 private static final String SOURCE_OPERATIONAL_ENVIRONMENT = "VID";
82 private static final ObjectMapper objectMapper = new ObjectMapper();
86 private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class);
89 * This should be replaced with mso client factory.
91 private final MsoInterface msoClientInterface;
92 FeatureManager featureManager;
95 public MsoBusinessLogicImpl(MsoInterface msoClientInterface, FeatureManager featureManager) {
96 this.msoClientInterface = msoClientInterface;
97 this.featureManager = featureManager;
100 public static String validateEndpointPath(String endpointEnvVariable) {
101 String endpoint = SystemProperties.getProperty(endpointEnvVariable);
102 if (endpoint == null || endpoint.isEmpty()) {
103 throw new GenericUncheckedException(endpointEnvVariable + " env variable is not defined");
108 // this function should get params from tosca and send them to instance at mso, then return success response.
110 public MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) {
111 logInvocationInDebug("createSvcInstance");
113 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
115 return msoClientInterface.createSvcInstance(msoRequest, endpoint);
119 public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) {
120 logInvocationInDebug("createE2eSvcInstance");
121 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
123 return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint);
127 public MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) {
128 logInvocationInDebug("createVnf");
130 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
132 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
133 return msoClientInterface.createVnf(requestDetails, vnfEndpoint);
137 public MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) {
138 logInvocationInDebug("createNwInstance");
140 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
142 String nw_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
143 return msoClientInterface.createNwInstance(requestDetails, nw_endpoint);
147 public MsoResponseWrapper createVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
148 logInvocationInDebug("createVolumeGroupInstance");
150 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
152 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
153 vnfEndpoint = vnfEndpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
155 return msoClientInterface.createVolumeGroupInstance(requestDetails, vnfEndpoint);
159 public MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
160 logInvocationInDebug("createVfModuleInstance");
162 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
164 String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
165 String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
167 return msoClientInterface.createVfModuleInstance(requestDetails, vf_module_endpoint);
171 public MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
172 logInvocationInDebug("scaleOutVfModuleInstance");
174 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
176 String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
177 String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
178 RequestDetailsWrapper wrapper = new RequestDetailsWrapper();
179 requestDetails.setVnfName(null);
180 requestDetails.setVnfInstanceId(null);
181 wrapper.requestDetails = requestDetails;
183 return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint);
187 public MsoResponseWrapper invokeVnfWorkflow(WorkflowRequestDetail request, String userId, UUID serviceInstanceId, UUID vnfInstanceId, UUID workflow_UUID) {
188 logInvocationInDebug("invokeVnfWorkflow");
190 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_WORKFLOW_INSTANCE);
192 String final_endpoint = endpoint
193 .replaceFirst(SVC_INSTANCE_ID, serviceInstanceId.toString())
194 .replaceFirst(WORKFLOW_ID, workflow_UUID.toString())
195 .replaceFirst(VNF_INSTANCE_ID, vnfInstanceId.toString());
197 Map<String,String> extraHeaders = new HashMap<>();
199 UUID requestId = UUID.randomUUID();
200 extraHeaders.put("X-ONAP-RequestID",requestId.toString());
201 extraHeaders.put("X-ONAP-PartnerName","VID");
202 extraHeaders.put("X-RequestorID",userId);
204 return msoClientInterface.invokeWorkflow(request,final_endpoint,extraHeaders);
208 public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) {
209 logInvocationInDebug("createConfigurationInstance");
211 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS);
212 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
214 return msoClientInterface.createConfigurationInstance(requestDetailsWrapper, endpoint);
218 public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) {
219 logInvocationInDebug("deleteE2eSvcInstance");
221 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
223 return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint);
227 public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) {
228 logInvocationInDebug("deleteSvcInstance");
231 if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)) {
232 endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
233 if (shouldUnassignService(serviceStatus)) {
234 logger.debug(EELFLoggerDelegate.debugLogger, "unassign service");
235 String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign";
236 return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint);
239 endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
242 String svc_endpoint = endpoint + "/" + serviceInstanceId;
243 return msoClientInterface.deleteSvcInstance(requestDetails, svc_endpoint);
246 private boolean shouldUnassignService(String serviceStatus) {
247 return ImmutableList.of("created", "pendingdelete", "pending-delete", "assigned").contains(serviceStatus.toLowerCase());
251 public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
252 logInvocationInDebug("deleteVnf");
254 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
255 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
256 vnfEndpoint = vnfEndpoint + '/' + vnfInstanceId;
258 return msoClientInterface.deleteVnf(requestDetails, vnfEndpoint);
262 public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) {
263 logInvocationInDebug("deleteVfModule");
265 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
266 String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
267 String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId;
269 return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint);
273 public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) {
274 logInvocationInDebug("deleteVolumeGroupInstance");
276 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
277 String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
278 String vnfEndpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
279 String delete_volume_group_endpoint = vnfEndpoint + "/" + volumeGroupId;
281 return msoClientInterface.deleteVolumeGroupInstance(requestDetails, delete_volume_group_endpoint);
285 public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) {
286 logInvocationInDebug("deleteNwInstance");
288 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
289 String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
290 String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId;
292 return msoClientInterface.deleteNwInstance(requestDetails, delete_nw_endpoint);
296 public MsoResponseWrapper getOrchestrationRequest(String requestId) {
297 String methodName = "getOrchestrationRequest";
298 logInvocationInDebug(methodName);
300 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
301 String path = p + "/" + requestId;
303 return msoClientInterface.getOrchestrationRequest(path);
305 } catch (Exception e) {
306 logException(methodName, e);
312 public MsoResponseWrapper getOrchestrationRequests(String filterString) {
313 String methodName = "getOrchestrationRequest";
314 logInvocationInDebug(methodName);
316 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
317 String path = p + filterString;
319 return msoClientInterface.getOrchestrationRequest(path);
321 } catch (Exception e) {
322 logException(methodName, e);
328 public List<Request> getOrchestrationRequestsForDashboard() {
329 String methodName = "getOrchestrationRequestsForDashboard";
330 logInvocationInDebug(methodName);
332 List<Request> dashboardOrchestrationReqs = new ArrayList<>();
334 List<RequestWrapper> vnfOrchestrationReqsWrappers = getOrchestrationRequestsByFilter("modelType", "vnf");
335 dashboardOrchestrationReqs = vnfOrchestrationReqsWrappers.stream()
336 .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest())
337 && DASHBOARD_ALLOWED_TYPES.contains(upperCase(reqWrapper.getRequest().getRequestType())))
338 .map(RequestWrapper::getRequest)
339 .collect(Collectors.toList());
341 List<RequestWrapper> scaleOutOrchestrationReqWrappers = getOrchestrationRequestsByFilter("action", "scaleOut");
342 List<Request> scaleoutRequests = scaleOutOrchestrationReqWrappers.stream()
343 .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest()))
344 .map(RequestWrapper::getRequest)
345 .collect(Collectors.toList());
347 dashboardOrchestrationReqs.addAll(scaleoutRequests);
348 } catch (Exception e) {
349 logException(methodName, e);
352 return dashboardOrchestrationReqs;
355 private String constructOrchestrationRequestFilter(String filterName, String filterValue) {
356 return String.format("%sfilter=%s:EQUALS:%s",
357 SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS), filterName, filterValue);
360 private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) {
361 String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue);
362 RestObject<String> restObjStr = new RestObject<>();
363 String str = new String();
365 MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequest(str, "", orchestrationReqPath, restObjStr, true);
366 return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
369 private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
370 logInvocationInDebug("deserializeOrchestrationRequestsJson");
372 ObjectMapper mapper = new ObjectMapper();
373 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
374 mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
375 RequestList requestList;
377 requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class);
378 } catch (IOException e) {
379 throw new GenericUncheckedException(e);
381 return requestList.getRequestList();
386 public List<Task> getManualTasksByRequestId(String originalRequestId) {
387 String methodName = "getManualTasksByRequestId";
388 logInvocationInDebug(methodName);
391 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
392 String path = p + "?originalRequestId=" + originalRequestId;
394 RestObject<String> restObjStr = new RestObject<>();
395 String str = new String();
398 MsoResponseWrapper msoResponseWrapper = msoClientInterface.getManualTasksByRequestId(str, "", path, restObjStr);
399 return deserializeManualTasksJson(msoResponseWrapper.getEntity());
401 } catch (Exception e) {
402 logException(methodName, e);
407 private List<Task> deserializeManualTasksJson(String manualTasksJson) {
408 logInvocationInDebug("deserializeManualTasksJson");
410 ObjectMapper mapper = new ObjectMapper();
412 TaskList taskList = mapper.readValue(manualTasksJson, TaskList.class);
413 return taskList.getTaskList();
414 } catch (IOException e) {
415 throw new GenericUncheckedException(e);
421 public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) {
422 String methodName = "completeManualTask";
423 logInvocationInDebug(methodName);
425 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
426 String path = p + "/" + taskId + "/complete";
428 RestObject<String> restObjStr = new RestObject<>();
429 String str = new String();
432 return msoClientInterface.completeManualTask(requestDetails, str, "", path, restObjStr);
434 } catch (Exception e) {
435 logException(methodName, e);
441 public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
442 String methodName = "activateServiceInstance";
443 logInvocationInDebug(methodName);
445 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
446 String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE;
448 RestObject<String> restObjStr = new RestObject<>();
452 msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", activateServicePath, restObjStr);
454 return MsoUtil.wrapResponse(restObjStr);
456 } catch (Exception e) {
457 logException(methodName, e);
464 public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
465 logInvocationInDebug("updateVnf");
468 endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
469 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
470 vnfEndpoint = vnfEndpoint + '/' + vnfInstanceId;
471 return msoClientInterface.updateVnf(requestDetails, vnfEndpoint);
475 public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
476 logInvocationInDebug("replaceVnf");
478 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
479 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
480 vnfEndpoint = vnfEndpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
481 vnfEndpoint = vnfEndpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE);
482 return msoClientInterface.replaceVnf(requestDetails, vnfEndpoint);
485 public RequestDetailsWrapper generateInPlaceMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
486 validateUpdateVnfSoftwarePayload(requestDetails);
487 RequestDetails inPlaceSoftwareUpdateRequest = new RequestDetails();
488 inPlaceSoftwareUpdateRequest.setCloudConfiguration(requestDetails.getCloudConfiguration());
489 inPlaceSoftwareUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
490 inPlaceSoftwareUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
491 RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
492 requestDetailsWrapper.requestDetails = inPlaceSoftwareUpdateRequest;
493 return requestDetailsWrapper;
497 public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
498 validateUpdateVnfConfig(requestDetails);
499 RequestDetails configUpdateRequest = new RequestDetails();
500 configUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
501 configUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
502 RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
503 requestDetailsWrapper.requestDetails = configUpdateRequest;
504 return requestDetailsWrapper;
508 public String getActivateFabricConfigurationPath(String serviceInstanceId) {
509 String path = validateEndpointPath(MsoProperties.MSO_REST_API_SERVICE_INSTANCE_CREATE);
510 path += "/" + serviceInstanceId + ACTIVATE_FABRIC_CONFIGURATION;
516 public String getDeactivateAndCloudDeletePath(String serviceInstanceId, String vnfInstanceId, String vfModuleInstanceId) {
517 String path = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
518 path = path.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
519 path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
520 path += "/" + vfModuleInstanceId + DEACTIVATE_AND_CLOUD_DELETE;
526 public RequestDetails buildRequestDetailsForSoftDelete(SoftDeleteRequest softDeleteRequest) {
527 RequestDetails requestDetails = new RequestDetails();
528 RequestInfo requestInfo = new RequestInfo();
529 requestInfo.setSource("VID");
530 requestInfo.setRequestorId(softDeleteRequest.getUserId());
531 requestDetails.setRequestInfo(requestInfo);
533 CloudConfiguration cloudConfiguration = new CloudConfiguration();
534 cloudConfiguration.setTenantId(softDeleteRequest.getTenantId());
535 cloudConfiguration.setLcpCloudRegionId(softDeleteRequest.getLcpCloudRegionId());
536 requestDetails.setCloudConfiguration(cloudConfiguration);
538 ModelInfo modelInfo = new ModelInfo();
539 modelInfo.setModelType("vfModule");
540 requestDetails.setModelInfo(modelInfo);
542 RequestParameters requestParameters = new RequestParameters();
543 requestParameters.setTestApi("GR_API");
544 requestDetails.setRequestParameters(requestParameters);
546 return requestDetails;
550 public MsoResponseWrapper2 deactivateAndCloudDelete(String serviceInstanceId, String vnfInstanceId, String vfModuleInstanceId, RequestDetails requestDetails) {
551 String path = getDeactivateAndCloudDeletePath(serviceInstanceId, vnfInstanceId, vfModuleInstanceId);
552 return new MsoResponseWrapper2<>(msoClientInterface.post(path, new RequestDetailsWrapper<>(requestDetails), RequestReferencesContainer.class));
556 public MsoResponseWrapper2 activateFabricConfiguration(String serviceInstanceId, RequestDetails requestDetails) {
557 String path = getActivateFabricConfigurationPath(serviceInstanceId);
558 return new MsoResponseWrapper2<>(msoClientInterface.post(path, new RequestDetailsWrapper<>(requestDetails), RequestReferencesContainer.class));
563 public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
564 logInvocationInDebug("updateVnfSoftware");
565 String vnfEndpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI
566 RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails);
567 return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnfEndpoint);
571 public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
572 logInvocationInDebug("updateVnfConfig");
573 RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails);
574 String vnfEndpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE);
575 return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnfEndpoint);
578 private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) {
579 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
580 String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
581 vnfEndpoint = vnfEndpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
582 vnfEndpoint = vnfEndpoint.replace(REQUEST_TYPE, vnfRequestType);
586 private Map getChangeManagementPayload(RequestDetails requestDetails, String message) {
587 if (requestDetails.getRequestParameters() == null || requestDetails.getRequestParameters().getAdditionalProperties() == null) {
588 throw new BadRequestException(message);
590 Object payloadRaw = requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
592 return objectMapper.readValue((String) payloadRaw, Map.class);
593 } catch (Exception exception) {
594 throw new BadRequestException(message);
598 private void validateUpdateVnfSoftwarePayload(RequestDetails requestDetails) {
599 final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE + " request";
601 Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
602 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "existing_software_version", SOFTWARE_VERSION_PATTERN);
603 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "new_software_version", SOFTWARE_VERSION_PATTERN);
605 //if "operations_timeout" is not integer, trying to read it as String that represent a number
606 if (!(payload.get("operations_timeout") instanceof Integer)) {
607 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "operations_timeout", NUMBER_PATTERN);
611 private void validateUpdateVnfSoftwarePayloadProperty(Map payload, String noValidPayloadMsg, String propertyName, Pattern pattern) {
612 Object forValidation = payload.get(propertyName);
613 final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
614 if (!(forValidation instanceof String)) {
615 throw new BadRequestException(noValidPayloadPropertyMsg);
617 if (!pattern.matcher((String) forValidation).matches()) {
618 throw new BadRequestException(noValidPayloadPropertyMsg);
623 public MsoResponseWrapper deleteConfiguration(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
624 String serviceInstanceId,
625 String configurationId) {
627 logInvocationInDebug("deleteConfiguration");
628 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
629 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
630 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
632 return msoClientInterface.deleteConfiguration(requestDetailsWrapper, endpoint);
636 public MsoResponseWrapper setConfigurationActiveStatus(
637 RequestDetails requestDetails,
638 String serviceInstanceId,
639 String configurationId,
640 boolean isActivate) {
642 logInvocationInDebug("setConfigurationActiveStatus");
644 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
645 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
646 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
648 String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
649 endpoint = endpoint + isActivateState;
651 return msoClientInterface.setConfigurationActiveStatus(requestDetails, endpoint);
655 public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails, String serviceInstanceId, boolean isActivate) {
656 logInvocationInDebug("setServiceInstanceStatus");
657 String methodName = "setServiceInstanceStatus";
659 String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
660 String endpoint = serviceEndpoint + "/" + serviceInstanceId;
662 String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
663 endpoint = endpoint + isActivateState;
666 RestObject<String> restObjStr = new RestObject<>();
670 msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", endpoint, restObjStr);
672 return MsoUtil.wrapResponse(restObjStr);
674 } catch (Exception e) {
675 logger.error(EELFLoggerDelegate.errorLogger, methodName + e.toString());
676 logger.debug(EELFLoggerDelegate.debugLogger, methodName + e.toString());
682 public MsoResponseWrapper setPortOnConfigurationStatus(
683 RequestDetails requestDetails,
684 String serviceInstanceId,
685 String configurationId,
687 logInvocationInDebug("setPortOnConfigurationStatus");
689 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
690 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
691 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
693 String isEnablePortStatus = (isEnable ? ENABLE_PORT : DISABLE_PORT);
694 endpoint = endpoint + isEnablePortStatus;
696 return msoClientInterface.setPortOnConfigurationStatus(requestDetails, endpoint);
701 public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
702 RequestDetails requestDetails = new RequestDetails();
703 RequestInfo requestInfo = new RequestInfo();
704 requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
705 requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
706 requestInfo.setRequestorId(details.getUserId());
707 requestDetails.setRequestInfo(requestInfo);
709 RelatedInstance relatedInstance = new RelatedInstance();
710 relatedInstance.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
711 relatedInstance.setInstanceId(details.getRelatedInstanceId());
712 relatedInstance.setInstanceName(details.getRelatedInstanceName());
713 requestDetails.setAdditionalProperty("relatedInstanceList", Collections.singletonList(ImmutableMap.of("relatedInstance", relatedInstance)));
715 RequestParameters requestParameters = new RequestParameters();
716 requestParameters.setUserParams(null);
717 requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
718 requestParameters.setAdditionalProperty("workloadContext", details.getWorkloadContext());
719 requestParameters.setAdditionalProperty("manifest", details.getManifest());
720 requestDetails.setRequestParameters(requestParameters);
722 RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
724 debugRequestDetails(requestDetailsWrapper, logger);
726 return requestDetailsWrapper;
730 public String getOperationalEnvironmentActivationPath(OperationalEnvironmentActivateInfo details) {
731 String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_ACTIVATE);
732 path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
737 public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentDeactivationRequestDetails(OperationalEnvironmentDeactivateInfo details) {
738 RequestDetails requestDetails = new RequestDetails();
740 RequestInfo requestInfo = new RequestInfo();
741 requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
742 requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
743 requestInfo.setRequestorId(details.getUserId());
744 requestDetails.setRequestInfo(requestInfo);
746 RequestParameters requestParameters = new RequestParameters();
747 requestParameters.setUserParams(null);
748 requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
749 requestDetails.setRequestParameters(requestParameters);
750 RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
751 debugRequestDetails(requestDetailsWrapper, logger);
752 return requestDetailsWrapper;
756 public String getCloudResourcesRequestsStatusPath(String requestId) {
757 String path = validateEndpointPath(MSO_REST_API_CLOUD_RESOURCES_REQUEST_STATUS);
758 path = path.replace("<request_id>", requestId);
763 public String getOperationalEnvironmentDeactivationPath(OperationalEnvironmentDeactivateInfo details) {
764 String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_DEACTIVATE);
765 path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
770 public String getOperationalEnvironmentCreationPath() {
771 return validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_CREATE);
776 public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) {
777 OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo(
778 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
779 input.getInstanceName(),
780 SOURCE_OPERATIONAL_ENVIRONMENT,
783 OperationEnvironmentRequestDetails.RelatedInstance relatedInstance = new OperationEnvironmentRequestDetails.RelatedInstance(
784 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
785 input.getEcompInstanceId(),
786 input.getEcompInstanceName());
788 List<OperationEnvironmentRequestDetails.RelatedInstance> relatedInstanceList = Collections.singletonList((relatedInstance));
790 OperationEnvironmentRequestDetails.RequestParameters requestParameters = new OperationEnvironmentRequestDetails.RequestParameters(
791 input.getOperationalEnvironmentType(),
792 input.getTenantContext(),
793 input.getWorkloadContext());
795 OperationEnvironmentRequestDetails requestDetails = new OperationEnvironmentRequestDetails(requestInfo, relatedInstanceList, requestParameters);
796 RequestDetailsWrapper<OperationEnvironmentRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
797 debugRequestDetails(requestDetailsWrapper, logger);
798 return requestDetailsWrapper;
802 public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
803 logInvocationInDebug("removeRelationshipFromServiceInstance");
805 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
806 String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships";
808 return msoClientInterface.removeRelationshipFromServiceInstance(requestDetails, removeRelationshipsPath);
812 public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
813 logInvocationInDebug("addRelationshipToServiceInstance");
815 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
816 String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships";
818 return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
821 private void validateUpdateVnfConfig(RequestDetails requestDetails) {
822 final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
824 Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
825 validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
826 validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
829 private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
830 final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
831 if (!payload.containsKey(propertyName)) {
832 throw new BadRequestException(noValidPayloadPropertyMsg);
836 private void logInvocationInDebug(String methodName) {
837 logger.debug(EELFLoggerDelegate.debugLogger, methodName + " start");
840 private void logException(String methodName, Exception e) {
841 logger.error(EELFLoggerDelegate.errorLogger, methodName + e.toString());
842 logger.debug(EELFLoggerDelegate.debugLogger, methodName + e.toString());
847 CREATE_INSTANCE("createInstance"),
848 DELETE_INSTANCE("deleteInstance"),
849 REPLACE_INSTANCE("replaceInstance"),
850 UPDATE_INSTANCE("updateInstance"),
851 ACTIVATE_INSTANCE("activateInstance"),
852 DEACTIVATE_INSTANCE("deactivateInstance"),
853 APPLY_UPDATED_CONFIG("applyUpdatedConfig"),
854 IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"),
855 SCALE_OUT("scaleOut"),
857 NOT_PROVIDED("not provided");
858 private final String value;
859 private static final Map<String, RequestType> CONSTANTS = new HashMap<>();
862 for (RequestType c : values()) {
863 CONSTANTS.put(c.value, c);
867 RequestType(String value) {
872 public static RequestType fromValue(String value) {
873 RequestType constant = CONSTANTS.get(value);
874 if (constant == null) {
875 throw new IllegalArgumentException(value);
883 public String toString() {