ec1c5479fa80037ddc7207cf33d98ce54f35cc1e
[vid.git] / vid-app-common / src / main / java / org / onap / vid / mso / MsoBusinessLogicImpl.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
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
11  * 
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  * 
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=========================================================
20  */
21 package org.onap.vid.mso;
22
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.controller.OperationalEnvironmentController;
34 import org.onap.vid.exceptions.GenericUncheckedException;
35 import org.onap.vid.model.RequestReferencesContainer;
36 import org.onap.vid.model.SoftDeleteRequest;
37 import org.onap.vid.mso.model.*;
38 import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestDetails;
39 import org.onap.vid.mso.rest.*;
40 import org.springframework.beans.factory.annotation.Autowired;
41 import org.togglz.core.manager.FeatureManager;
42
43 import javax.ws.rs.BadRequestException;
44 import java.io.IOException;
45 import java.util.*;
46 import java.util.regex.Pattern;
47 import java.util.stream.Collectors;
48 import java.util.stream.Stream;
49
50 import static java.util.stream.Collectors.collectingAndThen;
51 import static java.util.stream.Collectors.toList;
52 import static org.apache.commons.lang.StringUtils.upperCase;
53 import static org.onap.vid.changeManagement.ChangeManagementRequest.MsoChangeManagementRequest;
54 import static org.onap.vid.controller.MsoController.*;
55 import static org.onap.vid.mso.MsoProperties.*;
56 import static org.onap.vid.properties.Features.FLAG_UNASSIGN_SERVICE;
57 import static org.onap.vid.utils.Logging.debugRequestDetails;
58
59 public class MsoBusinessLogicImpl implements MsoBusinessLogic {
60
61     static final List<String> DASHBOARD_ALLOWED_TYPES = Stream.of(RequestType.REPLACE_INSTANCE,
62             RequestType.UPDATE_INSTANCE,
63             RequestType.APPLY_UPDATED_CONFIG,
64             RequestType.IN_PLACE_SOFTWARE_UPDATE,
65             RequestType.SCALE_OUT)
66             .map(requestType -> requestType.toString().toUpperCase())
67             .collect(collectingAndThen(toList(), Collections::unmodifiableList));
68     private static final String RESOURCE_TYPE = "resourceType";
69     private static final Pattern SOFTWARE_VERSION_PATTERN = Pattern.compile("^[A-Za-z0-9.\\-]+$");
70     private static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9]+$");
71     private static final String ACTIVATE = "/activate";
72     private static final String DEACTIVATE = "/deactivate";
73     private static final String ENABLE_PORT = "/enablePort";
74     private static final String DISABLE_PORT = "/disablePort";
75     private static final String ACTIVATE_FABRIC_CONFIGURATION = "/activateFabricConfiguration";
76     private static final String DEACTIVATE_AND_CLOUD_DELETE = "/deactivateAndCloudDelete";
77     private static final String RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT = "operationalEnvironment";
78     private static final String SOURCE_OPERATIONAL_ENVIRONMENT = "VID";
79     private static final ObjectMapper objectMapper = new ObjectMapper();
80     /**
81      * The logger.
82      */
83     private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class);
84     /**
85      * The Mso REST client
86      * This should be replaced with mso client factory.
87      */
88     private final MsoInterface msoClientInterface;
89     FeatureManager featureManager;
90
91     @Autowired
92     public MsoBusinessLogicImpl(MsoInterface msoClientInterface, FeatureManager featureManager) {
93         this.msoClientInterface = msoClientInterface;
94         this.featureManager = featureManager;
95     }
96
97     public static String    validateEndpointPath(String endpointEnvVariable) {
98         String endpoint = SystemProperties.getProperty(endpointEnvVariable);
99         if (endpoint == null || endpoint.isEmpty()) {
100             throw new GenericUncheckedException(endpointEnvVariable + " env variable is not defined");
101         }
102         return endpoint;
103     }
104
105     // this function should get params from tosca and send them to instance at mso, then return success response.
106     @Override
107     public MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) {
108         logInvocationInDebug("createSvcInstance");
109
110         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
111
112         return msoClientInterface.createSvcInstance(msoRequest, endpoint);
113     }
114
115     @Override
116     public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) {
117         logInvocationInDebug("createE2eSvcInstance");
118         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
119
120         return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint);
121     }
122
123     @Override
124     public MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) {
125         logInvocationInDebug("createVnf");
126
127         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
128
129         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
130         return msoClientInterface.createVnf(requestDetails, vnfEndpoint);
131     }
132
133     @Override
134     public MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) {
135         logInvocationInDebug("createNwInstance");
136
137         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
138
139         String nw_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
140         return msoClientInterface.createNwInstance(requestDetails, nw_endpoint);
141     }
142
143     @Override
144     public MsoResponseWrapper createVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
145         logInvocationInDebug("createVolumeGroupInstance");
146
147         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
148
149         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
150         vnfEndpoint = vnfEndpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
151
152         return msoClientInterface.createVolumeGroupInstance(requestDetails, vnfEndpoint);
153     }
154
155     @Override
156     public MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
157         logInvocationInDebug("createVfModuleInstance");
158
159         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
160
161         String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
162         String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
163
164         return msoClientInterface.createVfModuleInstance(requestDetails, vf_module_endpoint);
165     }
166
167     @Override
168     public MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
169         logInvocationInDebug("scaleOutVfModuleInstance");
170
171         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
172
173         String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
174         String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
175         RequestDetailsWrapper wrapper = new RequestDetailsWrapper();
176         requestDetails.setVnfName(null);
177         requestDetails.setVnfInstanceId(null);
178         wrapper.requestDetails = requestDetails;
179
180         return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint);
181     }
182
183     @Override
184     public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) {
185         logInvocationInDebug("createConfigurationInstance");
186
187         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS);
188         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
189
190         return msoClientInterface.createConfigurationInstance(requestDetailsWrapper, endpoint);
191     }
192
193     @Override
194     public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) {
195         logInvocationInDebug("deleteE2eSvcInstance");
196
197         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
198
199         return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint);
200     }
201
202     @Override
203     public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) {
204         logInvocationInDebug("deleteSvcInstance");
205         String endpoint;
206
207         if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)) {
208             endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
209             if (shouldUnassignService(serviceStatus)) {
210                 logger.debug(EELFLoggerDelegate.debugLogger, "unassign service");
211                 String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign";
212                 return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint);
213             }
214         } else {
215             endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
216         }
217
218         String svc_endpoint = endpoint + "/" + serviceInstanceId;
219         return msoClientInterface.deleteSvcInstance(requestDetails, svc_endpoint);
220     }
221
222     private boolean shouldUnassignService(String serviceStatus) {
223         return ImmutableList.of("created", "pendingdelete", "pending-delete", "assigned").contains(serviceStatus.toLowerCase());
224     }
225
226     @Override
227     public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
228         logInvocationInDebug("deleteVnf");
229
230         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
231         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
232         vnfEndpoint = vnfEndpoint + '/' + vnfInstanceId;
233
234         return msoClientInterface.deleteVnf(requestDetails, vnfEndpoint);
235     }
236
237     @Override
238     public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) {
239         logInvocationInDebug("deleteVfModule");
240
241         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
242         String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
243         String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId;
244
245         return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint);
246     }
247
248     @Override
249     public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) {
250         logInvocationInDebug("deleteVolumeGroupInstance");
251
252         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
253         String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
254         String vnfEndpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
255         String delete_volume_group_endpoint = vnfEndpoint + "/" + volumeGroupId;
256
257         return msoClientInterface.deleteVolumeGroupInstance(requestDetails, delete_volume_group_endpoint);
258     }
259
260     @Override
261     public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) {
262         logInvocationInDebug("deleteNwInstance");
263
264         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
265         String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
266         String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId;
267
268         return msoClientInterface.deleteNwInstance(requestDetails, delete_nw_endpoint);
269     }
270
271     @Override
272     public MsoResponseWrapper getOrchestrationRequest(String requestId) {
273         String methodName = "getOrchestrationRequest";
274         logInvocationInDebug(methodName);
275         try {
276             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
277             String path = p + "/" + requestId;
278
279             return msoClientInterface.getOrchestrationRequest(path);
280
281         } catch (Exception e) {
282             logException(methodName, e);
283             throw e;
284         }
285     }
286
287     @Override
288     public MsoResponseWrapper getOrchestrationRequests(String filterString) {
289         String methodName = "getOrchestrationRequest";
290         logInvocationInDebug(methodName);
291         try {
292             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
293             String path = p + filterString;
294
295             return msoClientInterface.getOrchestrationRequest(path);
296
297         } catch (Exception e) {
298             logException(methodName, e);
299             throw e;
300         }
301     }
302
303     @Override
304     public List<Request> getOrchestrationRequestsForDashboard() {
305         String methodName = "getOrchestrationRequestsForDashboard";
306         logInvocationInDebug(methodName);
307
308         List<Request> dashboardOrchestrationReqs = new ArrayList<>();
309         try {
310             List<RequestWrapper> vnfOrchestrationReqsWrappers = getOrchestrationRequestsByFilter("modelType", "vnf");
311             dashboardOrchestrationReqs = vnfOrchestrationReqsWrappers.stream()
312                     .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest())
313                             && DASHBOARD_ALLOWED_TYPES.contains(upperCase(reqWrapper.getRequest().getRequestType())))
314                     .map(RequestWrapper::getRequest)
315                     .collect(Collectors.toList());
316
317             List<RequestWrapper> scaleOutOrchestrationReqWrappers = getOrchestrationRequestsByFilter("action", "scaleOut");
318             List<Request> scaleoutRequests = scaleOutOrchestrationReqWrappers.stream()
319                     .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest()))
320                     .map(RequestWrapper::getRequest)
321                     .collect(Collectors.toList());
322
323             dashboardOrchestrationReqs.addAll(scaleoutRequests);
324         } catch (Exception e) {
325             logException(methodName, e);
326             throw e;
327         }
328         return dashboardOrchestrationReqs;
329     }
330
331     private String constructOrchestrationRequestFilter(String filterName, String filterValue) {
332         return String.format("%sfilter=%s:EQUALS:%s",
333                 SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS), filterName, filterValue);
334     }
335
336     private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) {
337         String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue);
338         RestObject<String> restObjStr = new RestObject<>();
339         String str = new String();
340         restObjStr.set(str);
341         MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequest(str, "", orchestrationReqPath, restObjStr, true);
342         return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
343     }
344
345     private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
346         logInvocationInDebug("deserializeOrchestrationRequestsJson");
347
348         ObjectMapper mapper = new ObjectMapper();
349         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
350         mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
351         RequestList requestList;
352         try {
353             requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class);
354         } catch (IOException e) {
355             throw new GenericUncheckedException(e);
356         }
357         return requestList.getRequestList();
358     }
359
360
361     @Override
362     public List<Task> getManualTasksByRequestId(String originalRequestId) {
363         String methodName = "getManualTasksByRequestId";
364         logInvocationInDebug(methodName);
365
366         try {
367             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
368             String path = p + "?originalRequestId=" + originalRequestId;
369
370             RestObject<String> restObjStr = new RestObject<>();
371             String str = new String();
372             restObjStr.set(str);
373
374             MsoResponseWrapper msoResponseWrapper = msoClientInterface.getManualTasksByRequestId(str, "", path, restObjStr);
375             return deserializeManualTasksJson(msoResponseWrapper.getEntity());
376
377         } catch (Exception e) {
378             logException(methodName, e);
379             throw e;
380         }
381     }
382
383         private List<Task> deserializeManualTasksJson(String manualTasksJson) {
384         logInvocationInDebug("deserializeManualTasksJson");
385
386         ObjectMapper mapper = new ObjectMapper();
387         try {
388             TaskList taskList = mapper.readValue(manualTasksJson, TaskList.class);
389             return taskList.getTaskList();
390         } catch (IOException e) {
391             throw new GenericUncheckedException(e);
392         }
393     }
394
395
396     @Override
397     public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) {
398         String methodName = "completeManualTask";
399         logInvocationInDebug(methodName);
400         try {
401             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
402             String path = p + "/" + taskId + "/complete";
403
404             RestObject<String> restObjStr = new RestObject<>();
405             String str = new String();
406             restObjStr.set(str);
407
408             return msoClientInterface.completeManualTask(requestDetails, str, "", path, restObjStr);
409
410         } catch (Exception e) {
411             logException(methodName, e);
412             throw e;
413         }
414     }
415
416     @Override
417     public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
418         String methodName = "activateServiceInstance";
419         logInvocationInDebug(methodName);
420         try {
421             String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
422             String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE;
423
424             RestObject<String> restObjStr = new RestObject<>();
425             String str = "";
426             restObjStr.set(str);
427
428             msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", activateServicePath, restObjStr);
429
430             return MsoUtil.wrapResponse(restObjStr);
431
432         } catch (Exception e) {
433             logException(methodName, e);
434             throw e;
435         }
436     }
437
438
439     @Override
440     public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
441         logInvocationInDebug("updateVnf");
442
443         String endpoint;
444         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
445         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
446         vnfEndpoint = vnfEndpoint + '/' + vnfInstanceId;
447         return msoClientInterface.updateVnf(requestDetails, vnfEndpoint);
448     }
449
450     @Override
451     public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
452         logInvocationInDebug("replaceVnf");
453
454         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
455         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
456         vnfEndpoint = vnfEndpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
457         vnfEndpoint = vnfEndpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE);
458         return msoClientInterface.replaceVnf(requestDetails, vnfEndpoint);
459     }
460
461     public RequestDetailsWrapper generateInPlaceMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
462         validateUpdateVnfSoftwarePayload(requestDetails);
463         RequestDetails inPlaceSoftwareUpdateRequest = new RequestDetails();
464         inPlaceSoftwareUpdateRequest.setCloudConfiguration(requestDetails.getCloudConfiguration());
465         inPlaceSoftwareUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
466         inPlaceSoftwareUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
467         RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
468         requestDetailsWrapper.requestDetails = inPlaceSoftwareUpdateRequest;
469         return requestDetailsWrapper;
470     }
471
472     @Override
473     public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
474         validateUpdateVnfConfig(requestDetails);
475         RequestDetails configUpdateRequest = new RequestDetails();
476         configUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
477         configUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
478         RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
479         requestDetailsWrapper.requestDetails = configUpdateRequest;
480         return requestDetailsWrapper;
481     }
482
483     @Override
484     public String getActivateFabricConfigurationPath(String serviceInstanceId) {
485         String path = validateEndpointPath(MsoProperties.MSO_REST_API_SERVICE_INSTANCE_CREATE);
486         path += "/" + serviceInstanceId + ACTIVATE_FABRIC_CONFIGURATION;
487
488         return path;
489     }
490
491     @Override
492     public String getDeactivateAndCloudDeletePath(String serviceInstanceId, String vnfInstanceId, String vfModuleInstanceId) {
493         String path = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
494         path = path.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
495         path = path.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
496         path += "/" + vfModuleInstanceId + DEACTIVATE_AND_CLOUD_DELETE;
497
498         return path;
499     }
500
501     @Override
502     public RequestDetails buildRequestDetailsForSoftDelete(SoftDeleteRequest softDeleteRequest) {
503         RequestDetails requestDetails = new RequestDetails();
504         RequestInfo requestInfo = new RequestInfo();
505         requestInfo.setSource("VID");
506         requestInfo.setRequestorId(softDeleteRequest.getUserId());
507         requestDetails.setRequestInfo(requestInfo);
508
509         CloudConfiguration cloudConfiguration = new CloudConfiguration();
510         cloudConfiguration.setTenantId(softDeleteRequest.getTenantId());
511         cloudConfiguration.setLcpCloudRegionId(softDeleteRequest.getLcpCloudRegionId());
512         requestDetails.setCloudConfiguration(cloudConfiguration);
513
514         ModelInfo modelInfo = new ModelInfo();
515         modelInfo.setModelType("vfModule");
516         requestDetails.setModelInfo(modelInfo);
517
518         RequestParameters requestParameters = new RequestParameters();
519         requestParameters.setTestApi("GR_API");
520         requestDetails.setRequestParameters(requestParameters);
521
522         return requestDetails;
523     }
524
525     @Override
526     public MsoResponseWrapper2 deactivateAndCloudDelete(String serviceInstanceId, String vnfInstanceId, String vfModuleInstanceId, RequestDetails requestDetails) {
527         String path = getDeactivateAndCloudDeletePath(serviceInstanceId, vnfInstanceId, vfModuleInstanceId);
528         return new MsoResponseWrapper2<>(msoClientInterface.post(path, new RequestDetailsWrapper<>(requestDetails), RequestReferencesContainer.class));
529     }
530
531     @Override
532     public MsoResponseWrapper2 activateFabricConfiguration(String serviceInstanceId, RequestDetails requestDetails) {
533         String path = getActivateFabricConfigurationPath(serviceInstanceId);
534         return new MsoResponseWrapper2<>(msoClientInterface.post(path, new RequestDetailsWrapper<>(requestDetails), RequestReferencesContainer.class));
535     }
536
537
538     @Override
539     public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
540         logInvocationInDebug("updateVnfSoftware");
541         String vnfEndpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI
542         RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails);
543         return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnfEndpoint);
544     }
545
546     @Override
547     public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
548         logInvocationInDebug("updateVnfConfig");
549         RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails);
550         String vnfEndpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE);
551         return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnfEndpoint);
552     }
553
554     private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) {
555         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
556         String vnfEndpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
557         vnfEndpoint = vnfEndpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
558         vnfEndpoint = vnfEndpoint.replace(REQUEST_TYPE, vnfRequestType);
559         return vnfEndpoint;
560     }
561
562     private Map getChangeManagementPayload(RequestDetails requestDetails, String message) {
563         if (requestDetails.getRequestParameters() == null || requestDetails.getRequestParameters().getAdditionalProperties() == null) {
564             throw new BadRequestException(message);
565         }
566         Object payloadRaw = requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
567         try {
568             return objectMapper.readValue((String) payloadRaw, Map.class);
569         } catch (Exception exception) {
570             throw new BadRequestException(message);
571         }
572     }
573
574     private void validateUpdateVnfSoftwarePayload(RequestDetails requestDetails) {
575         final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE + " request";
576
577         Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
578         validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "existing_software_version", SOFTWARE_VERSION_PATTERN);
579         validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "new_software_version", SOFTWARE_VERSION_PATTERN);
580
581         //if "operations_timeout" is not integer, trying to read it as String that represent a number
582         if (!(payload.get("operations_timeout") instanceof Integer)) {
583             validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "operations_timeout", NUMBER_PATTERN);
584         }
585     }
586
587     private void validateUpdateVnfSoftwarePayloadProperty(Map payload, String noValidPayloadMsg, String propertyName, Pattern pattern) {
588         Object forValidation = payload.get(propertyName);
589         final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
590         if (!(forValidation instanceof String)) {
591             throw new BadRequestException(noValidPayloadPropertyMsg);
592         }
593         if (!pattern.matcher((String) forValidation).matches()) {
594             throw new BadRequestException(noValidPayloadPropertyMsg);
595         }
596     }
597
598     @Override
599     public MsoResponseWrapper deleteConfiguration(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
600                                                   String serviceInstanceId,
601                                                   String configurationId) {
602
603         logInvocationInDebug("deleteConfiguration");
604         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
605         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
606         endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
607
608         return msoClientInterface.deleteConfiguration(requestDetailsWrapper, endpoint);
609     }
610
611     @Override
612     public MsoResponseWrapper setConfigurationActiveStatus(
613             RequestDetails requestDetails,
614             String serviceInstanceId,
615             String configurationId,
616             boolean isActivate) {
617
618         logInvocationInDebug("setConfigurationActiveStatus");
619
620         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
621         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
622         endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
623
624         String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
625         endpoint = endpoint + isActivateState;
626
627         return msoClientInterface.setConfigurationActiveStatus(requestDetails, endpoint);
628     }
629
630     @Override
631     public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails, String serviceInstanceId, boolean isActivate) {
632         logInvocationInDebug("setServiceInstanceStatus");
633         String methodName = "setServiceInstanceStatus";
634         try {
635             String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
636             String endpoint = serviceEndpoint + "/" + serviceInstanceId;
637
638             String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
639             endpoint = endpoint + isActivateState;
640
641
642             RestObject<String> restObjStr = new RestObject<>();
643             String str = "";
644             restObjStr.set(str);
645
646             msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", endpoint, restObjStr);
647
648             return MsoUtil.wrapResponse(restObjStr);
649
650         } catch (Exception e) {
651             logger.error(EELFLoggerDelegate.errorLogger, methodName + e.toString());
652             logger.debug(EELFLoggerDelegate.debugLogger, methodName + e.toString());
653             throw e;
654         }
655     }
656
657     @Override
658     public MsoResponseWrapper setPortOnConfigurationStatus(
659             RequestDetails requestDetails,
660             String serviceInstanceId,
661             String configurationId,
662             boolean isEnable) {
663         logInvocationInDebug("setPortOnConfigurationStatus");
664
665         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
666         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
667         endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
668
669         String isEnablePortStatus = (isEnable ? ENABLE_PORT : DISABLE_PORT);
670         endpoint = endpoint + isEnablePortStatus;
671
672         return msoClientInterface.setPortOnConfigurationStatus(requestDetails, endpoint);
673     }
674
675
676     @Override
677     public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
678         RequestDetails requestDetails = new RequestDetails();
679         RequestInfo requestInfo = new RequestInfo();
680         requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
681         requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
682         requestInfo.setRequestorId(details.getUserId());
683         requestDetails.setRequestInfo(requestInfo);
684
685         RelatedInstance relatedInstance = new RelatedInstance();
686         relatedInstance.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
687         relatedInstance.setInstanceId(details.getRelatedInstanceId());
688         relatedInstance.setInstanceName(details.getRelatedInstanceName());
689         requestDetails.setAdditionalProperty("relatedInstanceList", Collections.singletonList(ImmutableMap.of("relatedInstance", relatedInstance)));
690
691         RequestParameters requestParameters = new RequestParameters();
692         requestParameters.setUserParams(null);
693         requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
694         requestParameters.setAdditionalProperty("workloadContext", details.getWorkloadContext());
695         requestParameters.setAdditionalProperty("manifest", details.getManifest());
696         requestDetails.setRequestParameters(requestParameters);
697
698         RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
699
700         debugRequestDetails(requestDetailsWrapper, logger);
701
702         return requestDetailsWrapper;
703     }
704
705     @Override
706     public String getOperationalEnvironmentActivationPath(OperationalEnvironmentActivateInfo details) {
707         String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_ACTIVATE);
708         path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
709         return path;
710     }
711
712     @Override
713     public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentDeactivationRequestDetails(OperationalEnvironmentDeactivateInfo details) {
714         RequestDetails requestDetails = new RequestDetails();
715
716         RequestInfo requestInfo = new RequestInfo();
717         requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
718         requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
719         requestInfo.setRequestorId(details.getUserId());
720         requestDetails.setRequestInfo(requestInfo);
721
722         RequestParameters requestParameters = new RequestParameters();
723         requestParameters.setUserParams(null);
724         requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
725         requestDetails.setRequestParameters(requestParameters);
726         RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
727         debugRequestDetails(requestDetailsWrapper, logger);
728         return requestDetailsWrapper;
729     }
730
731     @Override
732     public String getCloudResourcesRequestsStatusPath(String requestId) {
733         String path = validateEndpointPath(MSO_REST_API_CLOUD_RESOURCES_REQUEST_STATUS);
734         path = path.replace("<request_id>", requestId);
735         return path;
736     }
737
738     @Override
739     public String getOperationalEnvironmentDeactivationPath(OperationalEnvironmentDeactivateInfo details) {
740         String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_DEACTIVATE);
741         path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
742         return path;
743     }
744
745     @Override
746     public String getOperationalEnvironmentCreationPath() {
747         return validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_CREATE);
748     }
749
750
751     @Override
752     public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) {
753         OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo(
754                 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
755                 input.getInstanceName(),
756                 SOURCE_OPERATIONAL_ENVIRONMENT,
757                 userId);
758
759         OperationEnvironmentRequestDetails.RelatedInstance relatedInstance = new OperationEnvironmentRequestDetails.RelatedInstance(
760                 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
761                 input.getEcompInstanceId(),
762                 input.getEcompInstanceName());
763
764         List<OperationEnvironmentRequestDetails.RelatedInstance> relatedInstanceList = Collections.singletonList((relatedInstance));
765
766         OperationEnvironmentRequestDetails.RequestParameters requestParameters = new OperationEnvironmentRequestDetails.RequestParameters(
767                 input.getOperationalEnvironmentType(),
768                 input.getTenantContext(),
769                 input.getWorkloadContext());
770
771         OperationEnvironmentRequestDetails requestDetails = new OperationEnvironmentRequestDetails(requestInfo, relatedInstanceList, requestParameters);
772         RequestDetailsWrapper<OperationEnvironmentRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
773         debugRequestDetails(requestDetailsWrapper, logger);
774         return requestDetailsWrapper;
775     }
776
777     @Override
778     public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
779         logInvocationInDebug("removeRelationshipFromServiceInstance");
780
781         String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
782         String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships";
783
784         return msoClientInterface.removeRelationshipFromServiceInstance(requestDetails, removeRelationshipsPath);
785     }
786
787     @Override
788     public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
789         logInvocationInDebug("addRelationshipToServiceInstance");
790
791         String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
792         String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships";
793
794         return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
795     }
796
797     private void validateUpdateVnfConfig(RequestDetails requestDetails) {
798         final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
799
800         Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
801         validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
802         validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
803     }
804
805     private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
806         final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
807         if (!payload.containsKey(propertyName)) {
808             throw new BadRequestException(noValidPayloadPropertyMsg);
809         }
810     }
811
812     private void logInvocationInDebug(String methodName) {
813         logger.debug(EELFLoggerDelegate.debugLogger, methodName + "  start");
814     }
815
816     private void logException(String methodName, Exception e) {
817         logger.error(EELFLoggerDelegate.errorLogger, methodName + e.toString());
818         logger.debug(EELFLoggerDelegate.debugLogger, methodName + e.toString());
819     }
820
821     enum RequestType {
822
823         CREATE_INSTANCE("createInstance"),
824         DELETE_INSTANCE("deleteInstance"),
825         REPLACE_INSTANCE("replaceInstance"),
826         UPDATE_INSTANCE("updateInstance"),
827         ACTIVATE_INSTANCE("activateInstance"),
828         DEACTIVATE_INSTANCE("deactivateInstance"),
829         APPLY_UPDATED_CONFIG("applyUpdatedConfig"),
830         IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"),
831         SCALE_OUT("scaleOut"),
832         UNKNOWN("unknown"),
833         NOT_PROVIDED("not provided");
834         private final String value;
835         private static final Map<String, RequestType> CONSTANTS = new HashMap<>();
836
837         static {
838             for (RequestType c : values()) {
839                 CONSTANTS.put(c.value, c);
840             }
841         }
842
843         RequestType(String value) {
844             this.value = value;
845         }
846
847         @JsonCreator
848         public static RequestType fromValue(String value) {
849             RequestType constant = CONSTANTS.get(value);
850             if (constant == null) {
851                 throw new IllegalArgumentException(value);
852             } else {
853                 return constant;
854             }
855         }
856
857         @JsonValue
858         @Override
859         public String toString() {
860             return this.value;
861         }
862     }
863 }