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