Correct flow for ScaleOut
[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 scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
179         String methodName = "scaleOutVfModuleInstance";
180         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
181
182         String endpoint;
183         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
184
185         String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
186         String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
187         RequestDetailsWrapper wrapper = new RequestDetailsWrapper();
188         requestDetails.setVnfName(null);
189         requestDetails.setVnfInstanceId(null);
190         wrapper.requestDetails = requestDetails;
191
192         return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint);
193     }
194     @Override
195     public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) {
196         String methodName = "createConfigurationInstance";
197         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
198
199         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS);
200         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
201
202         return msoClientInterface.createConfigurationInstance(requestDetailsWrapper, endpoint);
203     }
204
205     @Override
206     public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) {
207         String methodName = "deleteE2eSvcInstance";
208         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
209
210         String endpoint;
211                 endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
212
213         return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint);
214     }
215
216     @Override
217     public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) {
218         String methodName = "deleteSvcInstance";
219         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
220         String endpoint;
221
222         if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)){
223             endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
224             if (shouldUnassignService(serviceStatus)){
225                 logger.debug(EELFLoggerDelegate.debugLogger, "unassign service");
226                 String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign";
227                 return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint);
228             }
229         } else {
230             endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
231         }
232
233         String svc_endpoint = endpoint + "/" + serviceInstanceId;
234         return msoClientInterface.deleteSvcInstance(requestDetails, svc_endpoint);
235     }
236
237     private boolean shouldUnassignService(String serviceStatus) {
238             return ImmutableList.of("created","pendingdelete","pending-delete", "assigned").contains(serviceStatus.toLowerCase());
239     }
240
241     @Override
242     public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
243         String methodName = "deleteVnf";
244         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
245
246         String endpoint;
247         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
248         String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
249         vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId;
250
251         return msoClientInterface.deleteVnf(requestDetails, vnf_endpoint);
252     }
253
254     @Override
255     public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) {
256         String methodName = "deleteVfModule";
257         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
258
259         String endpoint;
260         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
261
262         String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
263
264         String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId;
265
266         return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint);
267     }
268
269     @Override
270     public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) {
271         String methodName = "deleteVolumeGroupInstance";
272         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
273
274         String endpoint;
275         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
276
277         String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
278         String vnf_endpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
279         String delete_volume_group_endpoint = vnf_endpoint + "/" + volumeGroupId;
280
281         return msoClientInterface.deleteVolumeGroupInstance(requestDetails, delete_volume_group_endpoint);
282     }
283
284     @Override
285     public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) {
286         String methodName = "deleteNwInstance";
287         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
288
289         String endpoint;
290         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
291
292         String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
293         String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId;
294
295         return msoClientInterface.deleteNwInstance(requestDetails, delete_nw_endpoint);
296     }
297
298     @Override
299     public MsoResponseWrapper getOrchestrationRequest(String requestId) {
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_REQ);
304             String path = p + "/" + requestId;
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 MsoResponseWrapper getOrchestrationRequests(String filterString) {
317         String methodName = "getOrchestrationRequest";
318         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
319         try {
320             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
321             String path = p + filterString;
322
323             return msoClientInterface.getOrchestrationRequest(path);
324
325         } catch (Exception e) {
326             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
327             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
328             throw e;
329         }
330     }
331
332     @Override
333     public List<Request> getOrchestrationRequestsForDashboard() {
334         String methodName = "getOrchestrationRequestsForDashboard";
335         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
336         List<Request> filteredOrchestrationRequests = new ArrayList<>();
337         try {
338             String path = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
339             path += "filter=modelType:EQUALS:vnf";
340             RestObject<String> restObjStr = new RestObject<>();
341             String str = new String();
342             restObjStr.set(str);
343
344             MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", path, restObjStr);
345             List<RequestWrapper> allOrchestrationRequests = deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
346
347             final ImmutableList<String> suppoertedRequestTypes = ImmutableList.of(
348                     RequestType.REPLACE_INSTANCE.toString().toUpperCase(),
349                     RequestType.UPDATE_INSTANCE.toString().toUpperCase(),
350                     RequestType.APPLY_UPDATED_CONFIG.toString().toUpperCase(),
351                     RequestType.IN_PLACE_SOFTWARE_UPDATE.toString().toUpperCase()
352             );
353
354             for (RequestWrapper currentRequest : allOrchestrationRequests) {
355                 if (currentRequest.getRequest() != null
356                         && "vnf".equalsIgnoreCase(currentRequest.getRequest().getRequestScope())
357                         && suppoertedRequestTypes.contains(upperCase(currentRequest.getRequest().getRequestType()))
358                 ) {
359                     filteredOrchestrationRequests.add(currentRequest.getRequest());
360                 }
361             }
362         } catch (Exception e) {
363             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
364             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
365         }
366         return filteredOrchestrationRequests;
367     }
368
369     private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
370         String methodName = "deserializeOrchestrationRequestsJson";
371         logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START);
372
373         ObjectMapper mapper = new ObjectMapper();
374         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
375         mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
376         RequestList requestList = null;
377         try {
378             requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class);
379         } catch (IOException e) {
380             throw new GenericUncheckedException(e);
381         }
382         return requestList.getRequestList();
383     }
384
385
386     @Override
387     public List<Task> getManualTasksByRequestId(String originalRequestId) {
388         String methodName = "getManualTasksByRequestId";
389         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
390
391         try {
392             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
393             String path = p + "?originalRequestId=" + originalRequestId;
394
395             RestObject<String> restObjStr = new RestObject<>();
396             String str = new String();
397             restObjStr.set(str);
398
399             MsoResponseWrapper msoResponseWrapper = msoClientInterface.getManualTasksByRequestId(str, "", path, restObjStr);
400             return deserializeManualTasksJson(msoResponseWrapper.getEntity());
401
402         } catch (Exception e) {
403             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
404             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
405             throw e;
406         }
407     }
408
409     private List<Task> deserializeManualTasksJson(String manualTasksJson) {
410         String methodName = "deserializeManualTasksJson";
411         logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START);
412
413         ObjectMapper mapper = new ObjectMapper();
414         try {
415             TaskList taskList = mapper.readValue(manualTasksJson, TaskList.class);
416             return taskList.getTaskList();
417         } catch (IOException e) {
418             throw new GenericUncheckedException(e);
419         }
420     }
421
422
423     @Override
424     public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) {
425         String methodName = "completeManualTask";
426         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
427         try {
428             String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
429             String path = p + "/" + taskId + "/complete";
430
431             RestObject<String> restObjStr = new RestObject<>();
432             String str = new String();
433             restObjStr.set(str);
434
435             msoClientInterface.completeManualTask(requestDetails, str, "", path, restObjStr);
436
437             return MsoUtil.wrapResponse(restObjStr);
438
439         } catch (Exception e) {
440             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
441             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
442             throw e;
443         }
444     }
445
446     @Override
447     public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
448         String methodName = "activateServiceInstance";
449         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
450         try {
451             String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
452             String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE;
453
454             RestObject<String> restObjStr = new RestObject<>();
455             String str = "";
456             restObjStr.set(str);
457
458             msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", activateServicePath, restObjStr);
459
460             return MsoUtil.wrapResponse(restObjStr);
461
462         } catch (Exception e) {
463             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
464             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
465             throw e;
466         }
467     }
468
469
470     @Override
471     public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
472         String methodName = "updateVnf";
473         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
474
475         String endpoint;
476         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
477         String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
478         vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId;
479         return msoClientInterface.updateVnf(requestDetails, vnf_endpoint);
480     }
481
482     @Override
483     public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
484         String methodName = "replaceVnf";
485         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
486
487         String endpoint;
488         endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
489         String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
490         vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
491         vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE);
492         return msoClientInterface.replaceVnf(requestDetails, vnf_endpoint);
493     }
494
495     public RequestDetailsWrapper generateInPlaceMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
496         validateUpdateVnfSoftwarePayload(requestDetails);
497         RequestDetails inPlaceSoftwareUpdateRequest = new RequestDetails();
498         inPlaceSoftwareUpdateRequest.setCloudConfiguration(requestDetails.getCloudConfiguration());
499         inPlaceSoftwareUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
500         inPlaceSoftwareUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
501         RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
502         requestDetailsWrapper.requestDetails = inPlaceSoftwareUpdateRequest;
503         return requestDetailsWrapper;
504     }
505
506     @Override
507     public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
508         validateUpdateVnfConfig(requestDetails);
509         RequestDetails ConfigUpdateRequest = new RequestDetails();
510         ConfigUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
511         ConfigUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
512         RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
513         requestDetailsWrapper.requestDetails = ConfigUpdateRequest;
514         return requestDetailsWrapper;
515     }
516
517
518
519
520
521     @Override
522     public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
523         String methodName = "updateVnfSoftware";
524         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
525         String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI
526         RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails);
527         return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
528     }
529
530     @Override
531     public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
532         String methodName = "updateVnfConfig";
533         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
534         RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails);
535         String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE);
536         return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
537     }
538
539     private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) {
540         String endpoint  = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
541         String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
542         vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
543         vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, vnfRequestType);
544         return vnf_endpoint;
545     }
546
547     private Map getChangeManagementPayload(RequestDetails requestDetails, String message){
548         if(requestDetails.getRequestParameters()==null||requestDetails.getRequestParameters().getAdditionalProperties()==null){
549             throw new BadRequestException(message);
550         }
551         Object payloadRaw=requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
552         try{
553             return objectMapper.readValue((String)payloadRaw,Map.class);
554         }
555         catch(Exception exception){
556             throw new BadRequestException(message);
557         }
558     }
559
560     private void validateUpdateVnfSoftwarePayload(RequestDetails requestDetails) {
561         final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.VNF_IN_PLACE_SOFTWARE_UPDATE + " request";
562
563         Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
564         validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "existing_software_version", SOFTWARE_VERSION_PATTERN);
565         validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "new_software_version", SOFTWARE_VERSION_PATTERN);
566
567         //if "operations_timeout" is not integer, trying to read it as String that represent a number
568         if (!(payload.get("operations_timeout") instanceof Integer)) {
569             validateUpdateVnfSoftwarePayloadProperty(payload, noValidPayloadMsg, "operations_timeout", NUMBER_PATTERN);
570         }
571     }
572
573     private void validateUpdateVnfSoftwarePayloadProperty(Map payload, String noValidPayloadMsg, String propertyName, Pattern pattern) {
574         Object forValidation = payload.get(propertyName);
575         final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
576         if (!(forValidation instanceof String)) {
577             throw new BadRequestException(noValidPayloadPropertyMsg);
578         }
579         if (!pattern.matcher((String) forValidation).matches()) {
580             throw new BadRequestException(noValidPayloadPropertyMsg);
581         }
582     }
583
584     private void validateUpdateVnfConfig(RequestDetails requestDetails) {
585         final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
586
587         Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
588         validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
589         validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
590     }
591
592     private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
593         final String noValidPayloadPropertyMsg = noValidPayloadMsg+ ", "+ propertyName + " property is not valid";
594         if(!payload.containsKey(propertyName)) {
595             throw new BadRequestException( noValidPayloadPropertyMsg);
596         }
597     }
598
599     @Override
600     public MsoResponseWrapper deleteConfiguration(
601             org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
602             String serviceInstanceId,
603             String configurationId) {
604
605         String methodName = "deleteConfiguration";
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         return msoClientInterface.deleteConfiguration(requestDetailsWrapper, endpoint);
613     }
614
615     @Override
616     public MsoResponseWrapper setConfigurationActiveStatus(
617             RequestDetails requestDetails,
618             String serviceInstanceId,
619             String configurationId,
620             boolean isActivate) {
621
622         String methodName = "setConfigurationActiveStatus";
623         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
624
625         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
626         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
627         endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
628
629         String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
630         endpoint = endpoint + isActivateState;
631
632         return msoClientInterface.setConfigurationActiveStatus(requestDetails, endpoint);
633     }
634
635     @Override
636     public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails , String serviceInstanceId, boolean isActivate) {
637         String methodName = "setServiceInstanceStatus";
638         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
639         try {
640             String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
641             String endpoint = serviceEndpoint + "/" + serviceInstanceId;
642
643             String isActivateState = (isActivate ? ACTIVATE : DEACTIVATE);
644             endpoint = endpoint + isActivateState;
645
646
647             RestObject<String> restObjStr = new RestObject<>();
648             String str = "";
649             restObjStr.set(str);
650
651             msoClientInterface.setServiceInstanceStatus(requestDetails , str, "", endpoint, restObjStr);
652
653             return MsoUtil.wrapResponse(restObjStr);
654
655         } catch (Exception e) {
656             logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
657             logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
658             throw e;
659         }
660     }
661
662     @Override
663     public MsoResponseWrapper setPortOnConfigurationStatus(
664             RequestDetails requestDetails,
665             String serviceInstanceId,
666             String configurationId,
667             boolean isEnable) {
668         String methodName = "setPortOnConfigurationStatus";
669         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
670
671         String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
672         endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
673         endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
674
675         String isEnablePortStatus = (isEnable ? ENABLE_PORT : DISABLE_PORT);
676         endpoint = endpoint + isEnablePortStatus;
677
678         return msoClientInterface.setPortOnConfigurationStatus(requestDetails, endpoint);
679     }
680
681
682     @Override
683     public  RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
684         RequestDetails requestDetails = new RequestDetails();
685         RequestInfo requestInfo = new RequestInfo();
686         requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
687         requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
688         requestInfo.setRequestorId(details.getUserId());
689         requestDetails.setRequestInfo(requestInfo);
690
691         org.onap.vid.domain.mso.RelatedInstance relatedInstance = new org.onap.vid.domain.mso.RelatedInstance();
692         relatedInstance.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
693         relatedInstance.setInstanceId(details.getRelatedInstanceId());
694         relatedInstance.setInstanceName(details.getRelatedInstanceName());
695         requestDetails.setAdditionalProperty("relatedInstanceList", Collections.singletonList(ImmutableMap.of("relatedInstance", relatedInstance)));
696
697         org.onap.vid.domain.mso.RequestParameters requestParameters = new org.onap.vid.domain.mso.RequestParameters();
698         requestParameters.setUserParams(null);
699         requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
700         requestParameters.setAdditionalProperty("workloadContext", details.getWorkloadContext());
701         requestParameters.setAdditionalProperty("manifest", details.getManifest());
702         requestDetails.setRequestParameters(requestParameters);
703
704         RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
705
706         debugRequestDetails(requestDetailsWrapper, logger);
707
708         return requestDetailsWrapper;
709     }
710
711     @Override
712     public String getOperationalEnvironmentActivationPath(OperationalEnvironmentActivateInfo details) {
713         String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_ACTIVATE);
714         path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
715         return path;
716     }
717
718     @Override
719     public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentDeactivationRequestDetails(OperationalEnvironmentDeactivateInfo details) {
720         RequestDetails requestDetails = new RequestDetails();
721
722         RequestInfo requestInfo = new RequestInfo();
723         requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
724         requestInfo.setSource(SOURCE_OPERATIONAL_ENVIRONMENT);
725         requestInfo.setRequestorId(details.getUserId());
726         requestDetails.setRequestInfo(requestInfo);
727
728         org.onap.vid.domain.mso.RequestParameters requestParameters = new org.onap.vid.domain.mso.RequestParameters();
729         requestParameters.setUserParams(null);
730         requestParameters.setAdditionalProperty("operationalEnvironmentType", "VNF");
731         requestDetails.setRequestParameters(requestParameters);
732         RequestDetailsWrapper<RequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
733         debugRequestDetails(requestDetailsWrapper, logger);
734         return requestDetailsWrapper;
735     }
736
737     @Override
738     public String getCloudResourcesRequestsStatusPath(String requestId) {
739         String path = validateEndpointPath(MSO_REST_API_CLOUD_RESOURCES_REQUEST_STATUS);
740         path = path.replace("<request_id>", requestId);
741         return path;
742     }
743
744     @Override
745     public String getOperationalEnvironmentDeactivationPath(OperationalEnvironmentDeactivateInfo details) {
746         String path = validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_DEACTIVATE);
747         path = path.replace("<operational_environment_id>", details.getOperationalEnvironmentId());
748         return path;
749     }
750
751     @Override
752     public String getOperationalEnvironmentCreationPath() {
753         return validateEndpointPath(MSO_REST_API_OPERATIONAL_ENVIRONMENT_CREATE);
754     }
755
756
757
758     @Override
759     public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) {
760         OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo(
761                 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
762                 input.getInstanceName(),
763                 SOURCE_OPERATIONAL_ENVIRONMENT,
764                 userId);
765
766         OperationEnvironmentRequestDetails.RelatedInstance relatedInstance = new OperationEnvironmentRequestDetails.RelatedInstance(
767                 RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT,
768                 input.getEcompInstanceId(),
769                 input.getEcompInstanceName());
770
771         List<OperationEnvironmentRequestDetails.RelatedInstance> relatedInstanceList = Collections.singletonList((relatedInstance));
772
773         OperationEnvironmentRequestDetails.RequestParameters requestParameters = new OperationEnvironmentRequestDetails.RequestParameters(
774                 input.getOperationalEnvironmentType(),
775                 input.getTenantContext(),
776                 input.getWorkloadContext());
777
778         OperationEnvironmentRequestDetails requestDetails = new OperationEnvironmentRequestDetails(requestInfo, relatedInstanceList, requestParameters);
779         RequestDetailsWrapper<OperationEnvironmentRequestDetails> requestDetailsWrapper = new RequestDetailsWrapper<>(requestDetails);
780         debugRequestDetails(requestDetailsWrapper, logger);
781         return requestDetailsWrapper;
782     }
783
784     @Override
785     public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
786         String methodName = "removeRelationshipFromServiceInstance";
787         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
788
789         String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
790         String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships";
791
792         return msoClientInterface.removeRelationshipFromServiceInstance(requestDetails, removeRelationshipsPath);
793     }
794
795     @Override
796     public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
797         String methodName = "addRelationshipToServiceInstance";
798         logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
799
800         String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
801         String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships";
802
803         return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
804     }
805
806
807     public enum RequestType {
808
809         CREATE_INSTANCE("createInstance"),
810         DELETE_INSTANCE("deleteInstance"),
811         REPLACE_INSTANCE("replaceInstance"),
812         UPDATE_INSTANCE("updateInstance"),
813         ACTIVATE_INSTANCE("activateInstance"),
814         DEACTIVATE_INSTANCE("deactivateInstance"),
815         APPLY_UPDATED_CONFIG("applyUpdatedConfig"),
816         IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"),
817         UNKNOWN("unknown"),
818         NOT_PROVIDED("not provided");
819         private final String value;
820         private static final Map<String, RequestType> CONSTANTS = new HashMap<>();
821
822         static {
823             for (RequestType c: values()) {
824                 CONSTANTS.put(c.value, c);
825             }
826         }
827
828         RequestType(String value) {
829             this.value = value;
830         }
831
832         @JsonValue
833         @Override
834         public String toString() {
835             return this.value;
836         }
837
838         @JsonCreator
839         public static RequestType fromValue(String value) {
840             RequestType constant = CONSTANTS.get(value);
841             if (constant == null) {
842                 throw new IllegalArgumentException(value);
843             } else {
844                 return constant;
845             }
846         }
847     }
848 }