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