Merge 1806 code of vid-common
[vid.git] / vid-app-common / src / main / java / org / onap / vid / job / command / ServiceInstantiationCommand.java
1 package org.onap.vid.job.command;
2
3 import com.fasterxml.jackson.databind.ObjectMapper;
4 import com.google.common.collect.ImmutableMap;
5 import org.onap.vid.aai.exceptions.InvalidAAIResponseException;
6 import org.onap.vid.changeManagement.RequestDetailsWrapper;
7 import org.onap.vid.exceptions.MaxRetriesException;
8 import org.onap.vid.job.Job;
9 import org.onap.vid.job.JobCommand;
10 import org.onap.vid.job.NextCommand;
11 import org.onap.vid.model.RequestReferencesContainer;
12 import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
13 import org.onap.vid.mso.RestMsoImplementation;
14 import org.onap.vid.mso.RestObject;
15 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
16 import org.onap.vid.services.AsyncInstantiationBusinessLogic;
17 import org.onap.vid.services.AuditService;
18 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
19 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
20 import org.springframework.context.annotation.Scope;
21 import org.springframework.stereotype.Component;
22
23 import javax.inject.Inject;
24 import java.util.Map;
25 import java.util.UUID;
26
27
28 @Component
29 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
30 public class ServiceInstantiationCommand implements JobCommand {
31
32     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
33
34     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ServiceInstantiationCommand.class);
35
36     @Inject
37     private AsyncInstantiationBusinessLogic asyncInstantiationBL;
38
39     @Inject
40     private AuditService auditService;
41
42     @Inject
43     private RestMsoImplementation restMso;
44
45     private UUID uuid;
46     private ServiceInstantiation serviceInstantiationRequest;
47     private String userId;
48
49     public ServiceInstantiationCommand() {
50     }
51
52     public ServiceInstantiationCommand(UUID uuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
53         init(uuid, serviceInstantiationRequest, userId);
54     }
55
56     @Override
57     public NextCommand call() {
58         RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ;
59         try {
60             requestDetailsWrapper = asyncInstantiationBL.generateServiceInstantiationRequest(
61                     uuid, serviceInstantiationRequest, userId
62             );
63         }
64
65         //Aai return bad response while checking names uniqueness
66         catch (InvalidAAIResponseException exception) {
67             LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception);
68             //put the job in_progress so we will keep trying to check name uniqueness in AAI
69             //And then send the request to MSO
70             return new NextCommand(Job.JobStatus.IN_PROGRESS, this);
71         }
72
73         //Vid reached to max retries while trying to find unique name in AAI
74         catch (MaxRetriesException exception) {
75             LOGGER.error("Failed to find unused name in AAI. Set the job to FAILED ", exception);
76             return handleCommandFailed();
77         }
78
79         String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationRequest);
80
81         RestObject<RequestReferencesContainer> msoResponse = restMso.PostForObject(requestDetailsWrapper, "",
82                 path, RequestReferencesContainer.class);
83
84         if (msoResponse.getStatusCode() >= 200 && msoResponse.getStatusCode() < 400) {
85             final Job.JobStatus jobStatus = Job.JobStatus.IN_PROGRESS;
86             final String requestId = msoResponse.get().getRequestReferences().getRequestId();
87             final String instanceId = msoResponse.get().getRequestReferences().getInstanceId();
88             asyncInstantiationBL.auditVidStatus(uuid, jobStatus);
89             setInitialRequestAuditStatusFromMso(requestId);
90             asyncInstantiationBL.updateServiceInfo(uuid, x-> {
91                 x.setJobStatus(jobStatus);
92                 x.setServiceInstanceId(instanceId);
93             });
94
95             return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId));
96         } else {
97             auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatusCode(),msoResponse.getRaw());
98             return handleCommandFailed();
99         }
100
101     }
102
103     private void setInitialRequestAuditStatusFromMso(String requestId){
104         final String initialMsoRequestStatus = "REQUESTED";
105         asyncInstantiationBL.auditMsoStatus(uuid,initialMsoRequestStatus,requestId,null);
106     }
107
108     protected NextCommand handleCommandFailed() {
109         asyncInstantiationBL.handleFailedInstantiation(uuid);
110         return new NextCommand(Job.JobStatus.FAILED);
111     }
112
113     @Override
114     public ServiceInstantiationCommand init(UUID jobUuid, Map<String, Object> data) {
115         final Object request = data.get("request");
116
117         return init(
118                 jobUuid,
119                 OBJECT_MAPPER.convertValue(request, ServiceInstantiation.class),
120                 (String) data.get("userId")
121         );
122     }
123
124     private ServiceInstantiationCommand init(UUID jobUuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
125         this.uuid = jobUuid;
126         this.serviceInstantiationRequest = serviceInstantiationRequest;
127         this.userId = userId;
128
129         return this;
130     }
131
132     @Override
133     public Map<String, Object> getData() {
134         return ImmutableMap.of(
135                 "uuid", uuid,
136                 "request", serviceInstantiationRequest,
137                 "userId", userId
138         );
139     }
140 }