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