2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2018 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.vid.changeManagement.ChangeManagementRequest;
30 import org.onap.vid.changeManagement.RequestDetailsWrapper;
31 import org.onap.vid.controllers.OperationalEnvironmentController;
32 import org.onap.vid.domain.mso.RequestInfo;
33 import org.onap.vid.exceptions.GenericUncheckedException;
34 import org.onap.vid.mso.model.OperationalEnvironmentActivateInfo;
35 import org.onap.vid.mso.model.OperationalEnvironmentDeactivateInfo;
36 import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestDetails;
37 import org.onap.vid.mso.rest.*;
38 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
39 import org.onap.portalsdk.core.util.SystemProperties;
40 import org.springframework.beans.factory.annotation.Autowired;
41 import org.togglz.core.manager.FeatureManager;
43 import javax.ws.rs.BadRequestException;
44 import java.io.IOException;
45 import java.text.DateFormat;
46 import java.text.SimpleDateFormat;
48 import java.util.regex.Pattern;
49 import java.util.stream.Collectors;
50 import java.util.stream.Stream;
52 import static java.util.stream.Collectors.collectingAndThen;
53 import static java.util.stream.Collectors.toList;
54 import static org.apache.commons.lang.StringUtils.upperCase;
55 import static org.onap.vid.changeManagement.ChangeManagementRequest.MsoChangeManagementRequest;
56 import static org.onap.vid.controllers.MsoController.*;
57 import static org.onap.vid.mso.MsoProperties.*;
58 import static org.onap.vid.properties.Features.FLAG_UNASSIGN_SERVICE;
59 import static org.onap.vid.utils.Logging.debugRequestDetails;
61 public class MsoBusinessLogicImpl implements MsoBusinessLogic {
63 static final List<String> DASHBOARD_ALLOWED_TYPES = Stream.of(RequestType.REPLACE_INSTANCE,
64 RequestType.UPDATE_INSTANCE,
65 RequestType.APPLY_UPDATED_CONFIG,
66 RequestType.IN_PLACE_SOFTWARE_UPDATE,
67 RequestType.SCALE_OUT)
68 .map(requestType -> requestType.toString().toUpperCase())
69 .collect(collectingAndThen(toList(), Collections::unmodifiableList));
70 private static final String RESOURCE_TYPE = "resourceType";
72 * The Constant dateFormat.
74 private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
75 private static final Pattern SOFTWARE_VERSION_PATTERN = Pattern.compile("^[A-Za-z0-9.\\-]+$");
76 private static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9]+$");
77 private static final String ACTIVATE = "/activate";
78 private static final String DEACTIVATE = "/deactivate";
79 private static final String ENABLE_PORT = "/enablePort";
80 private static final String DISABLE_PORT = "/disablePort";
81 private static final String RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT = "operationalEnvironment";
82 private static final String SOURCE_OPERATIONAL_ENVIRONMENT = "VID";
83 private static final ObjectMapper objectMapper = new ObjectMapper();
87 private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class);
90 * This should be replaced with mso client factory.
92 private final MsoInterface msoClientInterface;
93 FeatureManager featureManager;
96 public MsoBusinessLogicImpl(MsoInterface msoClientInterface, FeatureManager featureManager) {
97 this.msoClientInterface = msoClientInterface;
98 this.featureManager = featureManager;
101 public static String validateEndpointPath(String endpointEnvVariable) {
102 String endpoint = SystemProperties.getProperty(endpointEnvVariable);
103 if (endpoint == null || endpoint.isEmpty()) {
104 throw new GenericUncheckedException(endpointEnvVariable + " env variable is not defined");
109 // this function should get params from tosca and send them to instance at mso, then return success response.
111 public MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) {
112 logInvocationInDebug("createSvcInstance");
114 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
116 return msoClientInterface.createSvcInstance(msoRequest, endpoint);
120 public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) {
121 logInvocationInDebug("createE2eSvcInstance");
122 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
124 return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint);
128 public MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) {
129 logInvocationInDebug("createVnf");
131 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
133 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
134 return msoClientInterface.createVnf(requestDetails, vnf_endpoint);
138 public MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) {
139 logInvocationInDebug("createNwInstance");
141 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
143 String nw_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
144 return msoClientInterface.createNwInstance(requestDetails, nw_endpoint);
148 public MsoResponseWrapper createVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
149 logInvocationInDebug("createVolumeGroupInstance");
151 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
153 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
154 vnf_endpoint = vnf_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
156 return msoClientInterface.createVolumeGroupInstance(requestDetails, vnf_endpoint);
160 public MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
161 logInvocationInDebug("createVfModuleInstance");
163 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
165 String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
166 String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
168 return msoClientInterface.createVfModuleInstance(requestDetails, vf_module_endpoint);
172 public MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
173 logInvocationInDebug("scaleOutVfModuleInstance");
175 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
177 String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
178 String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
179 RequestDetailsWrapper wrapper = new RequestDetailsWrapper();
180 requestDetails.setVnfName(null);
181 requestDetails.setVnfInstanceId(null);
182 wrapper.requestDetails = requestDetails;
184 return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint);
188 public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) {
189 logInvocationInDebug("createConfigurationInstance");
191 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS);
192 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
194 return msoClientInterface.createConfigurationInstance(requestDetailsWrapper, endpoint);
198 public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) {
199 logInvocationInDebug("deleteE2eSvcInstance");
201 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
203 return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint);
207 public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) {
208 logInvocationInDebug("deleteSvcInstance");
211 if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)) {
212 endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
213 if (shouldUnassignService(serviceStatus)) {
214 logger.debug(EELFLoggerDelegate.debugLogger, "unassign service");
215 String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign";
216 return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint);
219 endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
222 String svc_endpoint = endpoint + "/" + serviceInstanceId;
223 return msoClientInterface.deleteSvcInstance(requestDetails, svc_endpoint);
226 private boolean shouldUnassignService(String serviceStatus) {
227 return ImmutableList.of("created", "pendingdelete", "pending-delete", "assigned").contains(serviceStatus.toLowerCase());
231 public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
232 logInvocationInDebug("deleteVnf");
234 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
235 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
236 vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId;
238 return msoClientInterface.deleteVnf(requestDetails, vnf_endpoint);
242 public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) {
243 logInvocationInDebug("deleteVfModule");
245 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
246 String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
247 String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId;
249 return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint);
253 public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) {
254 logInvocationInDebug("deleteVolumeGroupInstance");
256 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
257 String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
258 String vnf_endpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
259 String delete_volume_group_endpoint = vnf_endpoint + "/" + volumeGroupId;
261 return msoClientInterface.deleteVolumeGroupInstance(requestDetails, delete_volume_group_endpoint);
265 public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) {
266 logInvocationInDebug("deleteNwInstance");
268 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
269 String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
270 String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId;
272 return msoClientInterface.deleteNwInstance(requestDetails, delete_nw_endpoint);
276 public MsoResponseWrapper getOrchestrationRequest(String requestId) {
277 String methodName = "getOrchestrationRequest";
278 logInvocationInDebug(methodName);
280 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
281 String path = p + "/" + requestId;
283 return msoClientInterface.getOrchestrationRequest(path);
285 } catch (Exception e) {
286 logException(methodName, e);
292 public MsoResponseWrapper getOrchestrationRequests(String filterString) {
293 String methodName = "getOrchestrationRequest";
294 logInvocationInDebug(methodName);
296 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
297 String path = p + filterString;
299 return msoClientInterface.getOrchestrationRequest(path);
301 } catch (Exception e) {
302 logException(methodName, e);
308 public List<Request> getOrchestrationRequestsForDashboard() {
309 String methodName = "getOrchestrationRequestsForDashboard";
310 logInvocationInDebug(methodName);
312 List<Request> dashboardOrchestrationReqs = new ArrayList<>();
314 List<RequestWrapper> vnfOrchestrationReqsWrappers = getOrchestrationRequestsByFilter("modelType", "vnf");
315 dashboardOrchestrationReqs = vnfOrchestrationReqsWrappers.stream()
316 .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest())
317 && DASHBOARD_ALLOWED_TYPES.contains(upperCase(reqWrapper.getRequest().getRequestType())))
318 .map(RequestWrapper::getRequest)
319 .collect(Collectors.toList());
321 List<RequestWrapper> scaleOutOrchestrationReqWrappers = getOrchestrationRequestsByFilter("action", "scaleOut");
322 List<Request> scaleoutRequests = scaleOutOrchestrationReqWrappers.stream()
323 .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest()))
324 .map(RequestWrapper::getRequest)
325 .collect(Collectors.toList());
327 dashboardOrchestrationReqs.addAll(scaleoutRequests);
328 } catch (Exception e) {
329 logException(methodName, e);
331 return dashboardOrchestrationReqs;
334 private String constructOrchestrationRequestFilter(String filterName, String filterValue) {
335 return String.format("%sfilter=%s:EQUALS:%s",
336 SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS), filterName, filterValue);
339 private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) {
340 String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue);
341 RestObject<String> restObjStr = new RestObject<>();
342 String str = new String();
344 MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", orchestrationReqPath, restObjStr);
345 return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
348 private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
349 logInvocationInDebug("deserializeOrchestrationRequestsJson");
351 ObjectMapper mapper = new ObjectMapper();
352 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
353 mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
354 RequestList requestList;
356 requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class);
357 } catch (IOException e) {
358 throw new GenericUncheckedException(e);
360 return requestList.getRequestList();
365 public List<Task> getManualTasksByRequestId(String originalRequestId) {
366 String methodName = "getManualTasksByRequestId";
367 logInvocationInDebug(methodName);
370 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
371 String path = p + "?originalRequestId=" + originalRequestId;
373 RestObject<String> restObjStr = new RestObject<>();
374 String str = new String();
377 MsoResponseWrapper msoResponseWrapper = msoClientInterface.getManualTasksByRequestId(str, "", path, restObjStr);
378 return deserializeManualTasksJson(msoResponseWrapper.getEntity());
380 } catch (Exception e) {
381 logException(methodName, e);
386 private List<Task> deserializeManualTasksJson(String manualTasksJson) {
387 logInvocationInDebug("deserializeManualTasksJson");
389 ObjectMapper mapper = new ObjectMapper();
391 TaskList taskList = mapper.readValue(manualTasksJson, TaskList.class);
392 return taskList.getTaskList();
393 } catch (IOException e) {
394 throw new GenericUncheckedException(e);
400 public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) {
401 String methodName = "completeManualTask";
402 logInvocationInDebug(methodName);
404 String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
405 String path = p + "/" + taskId + "/complete";
407 RestObject<String> restObjStr = new RestObject<>();
408 String str = new String();
411 msoClientInterface.completeManualTask(requestDetails, str, "", path, restObjStr);
413 return MsoUtil.wrapResponse(restObjStr);
415 } catch (Exception e) {
416 logException(methodName, e);
422 public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
423 String methodName = "activateServiceInstance";
424 logInvocationInDebug(methodName);
426 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
427 String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE;
429 RestObject<String> restObjStr = new RestObject<>();
433 msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", activateServicePath, restObjStr);
435 return MsoUtil.wrapResponse(restObjStr);
437 } catch (Exception e) {
438 logException(methodName, e);
445 public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
446 logInvocationInDebug("updateVnf");
449 endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
450 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
451 vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId;
452 return msoClientInterface.updateVnf(requestDetails, vnf_endpoint);
456 public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
457 logInvocationInDebug("replaceVnf");
459 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
460 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
461 vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
462 vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE);
463 return msoClientInterface.replaceVnf(requestDetails, vnf_endpoint);
466 public RequestDetailsWrapper generateInPlaceMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
467 validateUpdateVnfSoftwarePayload(requestDetails);
468 RequestDetails inPlaceSoftwareUpdateRequest = new RequestDetails();
469 inPlaceSoftwareUpdateRequest.setCloudConfiguration(requestDetails.getCloudConfiguration());
470 inPlaceSoftwareUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
471 inPlaceSoftwareUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
472 RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
473 requestDetailsWrapper.requestDetails = inPlaceSoftwareUpdateRequest;
474 return requestDetailsWrapper;
478 public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
479 validateUpdateVnfConfig(requestDetails);
480 RequestDetails configUpdateRequest = new RequestDetails();
481 configUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
482 configUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
483 RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
484 requestDetailsWrapper.requestDetails = configUpdateRequest;
485 return requestDetailsWrapper;
489 public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
490 logInvocationInDebug("updateVnfSoftware");
491 String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI
492 RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails);
493 return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
497 public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
498 logInvocationInDebug("updateVnfConfig");
499 RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails);
500 String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE);
501 return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
504 private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) {
505 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
506 String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
507 vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
508 vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, vnfRequestType);
512 private Map getChangeManagementPayload(RequestDetails requestDetails, String message) {
513 if (requestDetails.getRequestParameters() == null || requestDetails.getRequestParameters().getAdditionalProperties() == null) {
514 throw new BadRequestException(message);
516 Object payloadRaw = requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
518 return objectMapper.readValue((String) payloadRaw, Map.class);
519 } catch (Exception exception) {
520 throw new BadRequestException(message);
524 private void validateUpdateVnfSoftwarePayload(RequestDetails requestDetails) {
525 final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE + " request";
527 Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
528 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "existing_software_version", SOFTWARE_VERSION_PATTERN);
529 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "new_software_version", SOFTWARE_VERSION_PATTERN);
531 //if "operations_timeout" is not integer, trying to read it as String that represent a number
532 if (!(payload.get("operations_timeout") instanceof Integer)) {
533 validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "operations_timeout", NUMBER_PATTERN);
537 private void validateUpdateVnfSoftwarePayloadProperty(Map payload, String noValidPayloadMsg, String propertyName, Pattern pattern) {
538 Object forValidation = payload.get(propertyName);
539 final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
540 if (!(forValidation instanceof String)) {
541 throw new BadRequestException(noValidPayloadPropertyMsg);
543 if (!pattern.matcher((String) forValidation).matches()) {
544 throw new BadRequestException(noValidPayloadPropertyMsg);
549 public MsoResponseWrapper deleteConfiguration(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
550 String serviceInstanceId,
551 String configurationId) {
553 logInvocationInDebug("deleteConfiguration");
554 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
555 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
556 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
558 return msoClientInterface.deleteConfiguration(requestDetailsWrapper, endpoint);
562 public MsoResponseWrapper setConfigurationActiveStatus(
563 RequestDetails requestDetails,
564 String serviceInstanceId,
565 String configurationId,
566 boolean isActivate) {
568 logInvocationInDebug("setConfigurationActiveStatus");
570 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
571 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
572 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
574 String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
575 endpoint = endpoint + isActivateState;
577 return msoClientInterface.setConfigurationActiveStatus(requestDetails, endpoint);
581 public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails, String serviceInstanceId, boolean isActivate) {
582 logInvocationInDebug("setServiceInstanceStatus");
583 String methodName = "setServiceInstanceStatus";
585 String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
586 String endpoint = serviceEndpoint + "/" + serviceInstanceId;
588 String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
589 endpoint = endpoint + isActivateState;
592 RestObject<String> restObjStr = new RestObject<>();
596 msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", endpoint, restObjStr);
598 return MsoUtil.wrapResponse(restObjStr);
600 } catch (Exception e) {
601 logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
602 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
608 public MsoResponseWrapper setPortOnConfigurationStatus(
609 RequestDetails requestDetails,
610 String serviceInstanceId,
611 String configurationId,
613 logInvocationInDebug("setPortOnConfigurationStatus");
615 String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
616 endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
617 endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
619 String isEnablePortStatus = (isEnable ? ENABLE_PORT : DISABLE_PORT);
620 endpoint = endpoint + isEnablePortStatus;
622 return msoClientInterface.setPortOnConfigurationStatus(requestDetails, endpoint);
627 public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
628 RequestDetails requestDetails = new RequestDetails();
629 RequestInfo requestInfo = new RequestInfo();
630 requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
631 requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
632 requestInfo.setRequestorId(details.getUserId());
633 requestDetails.setRequestInfo(requestInfo);
635 org.onap.vid.domain.mso.RelatedInstance relatedInstance = new org.onap.vid.domain.mso.RelatedInstance();
636 relatedInstance.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
637 relatedInstance.setInstanceId(details.getRelatedInstanceId());
638 relatedInstance.setInstanceName(details.getRelatedInstanceName());
639 requestDetails.setAdditionalProperty("relatedInstanceList", Collections.singletonList(ImmutableMap.of("relatedInstance", relatedInstance)));
641 org.onap.vid.domain.mso.RequestParameters requestParameters = new org.onap.vid.domain.mso.RequestParameters();
642 requestParameters.setUserParams(null);
643 requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
644 requestParameters.setAdditionalProperty("workloadContext", details.getWorkloadContext());
645 requestParameters.setAdditionalProperty("manifest", details.getManifest());
646 requestDetails.setRequestParameters(requestParameters);
648 RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
650 debugRequestDetails(requestDetailsWrapper, logger);
652 return requestDetailsWrapper;
656 public String getOperationalEnvironmentActivationPath(OperationalEnvironmentActivateInfo details) {
657 String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_ACTIVATE);
658 path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
663 public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentDeactivationRequestDetails(OperationalEnvironmentDeactivateInfo details) {
664 RequestDetails requestDetails = new RequestDetails();
666 RequestInfo requestInfo = new RequestInfo();
667 requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
668 requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
669 requestInfo.setRequestorId(details.getUserId());
670 requestDetails.setRequestInfo(requestInfo);
672 org.onap.vid.domain.mso.RequestParameters requestParameters = new org.onap.vid.domain.mso.RequestParameters();
673 requestParameters.setUserParams(null);
674 requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
675 requestDetails.setRequestParameters(requestParameters);
676 RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
677 debugRequestDetails(requestDetailsWrapper, logger);
678 return requestDetailsWrapper;
682 public String getCloudResourcesRequestsStatusPath(String requestId) {
683 String path = validateEndpointPath(MSO_REST_API_CLOUD_RESOURCES_REQUEST_STATUS);
684 path = path.replace("<request_id>", requestId);
689 public String getOperationalEnvironmentDeactivationPath(OperationalEnvironmentDeactivateInfo details) {
690 String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_DEACTIVATE);
691 path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
696 public String getOperationalEnvironmentCreationPath() {
697 return validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_CREATE);
702 public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) {
703 OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo(
704 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
705 input.getInstanceName(),
706 SOURCE_OPERATIONAL_ENVIRONMENT,
709 OperationEnvironmentRequestDetails.RelatedInstance relatedInstance = new OperationEnvironmentRequestDetails.RelatedInstance(
710 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
711 input.getEcompInstanceId(),
712 input.getEcompInstanceName());
714 List<OperationEnvironmentRequestDetails.RelatedInstance> relatedInstanceList = Collections.singletonList((relatedInstance));
716 OperationEnvironmentRequestDetails.RequestParameters requestParameters = new OperationEnvironmentRequestDetails.RequestParameters(
717 input.getOperationalEnvironmentType(),
718 input.getTenantContext(),
719 input.getWorkloadContext());
721 OperationEnvironmentRequestDetails requestDetails = new OperationEnvironmentRequestDetails(requestInfo, relatedInstanceList, requestParameters);
722 RequestDetailsWrapper<OperationEnvironmentRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
723 debugRequestDetails(requestDetailsWrapper, logger);
724 return requestDetailsWrapper;
728 public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
729 logInvocationInDebug("removeRelationshipFromServiceInstance");
731 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
732 String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships";
734 return msoClientInterface.removeRelationshipFromServiceInstance(requestDetails, removeRelationshipsPath);
738 public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
739 logInvocationInDebug("addRelationshipToServiceInstance");
741 String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
742 String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships";
744 return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
747 private void validateUpdateVnfConfig(RequestDetails requestDetails) {
748 final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
750 Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
751 validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
752 validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
755 private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
756 final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
757 if (!payload.containsKey(propertyName)) {
758 throw new BadRequestException(noValidPayloadPropertyMsg);
762 private void logInvocationInDebug(String methodName) {
763 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
766 private void logException(String methodName, Exception e) {
767 logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
768 logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
773 CREATE_INSTANCE("createInstance"),
774 DELETE_INSTANCE("deleteInstance"),
775 REPLACE_INSTANCE("replaceInstance"),
776 UPDATE_INSTANCE("updateInstance"),
777 ACTIVATE_INSTANCE("activateInstance"),
778 DEACTIVATE_INSTANCE("deactivateInstance"),
779 APPLY_UPDATED_CONFIG("applyUpdatedConfig"),
780 IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"),
781 SCALE_OUT("scaleOut"),
783 NOT_PROVIDED("not provided");
784 private static final Map<String, RequestType> CONSTANTS = new HashMap<>();
787 for (RequestType c : values()) {
788 CONSTANTS.put(c.value, c);
792 private final String value;
794 RequestType(String value) {
799 public static RequestType fromValue(String value) {
800 RequestType constant = CONSTANTS.get(value);
801 if (constant == null) {
802 throw new IllegalArgumentException(value);
810 public String toString() {