1 package org.onap.vid.job.command;
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;
23 import javax.inject.Inject;
25 import java.util.UUID;
29 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
30 public class ServiceInstantiationCommand implements JobCommand {
32 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
34 private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ServiceInstantiationCommand.class);
37 private AsyncInstantiationBusinessLogic asyncInstantiationBL;
40 private AuditService auditService;
43 private RestMsoImplementation restMso;
46 private ServiceInstantiation serviceInstantiationRequest;
47 private String userId;
49 public ServiceInstantiationCommand() {
52 public ServiceInstantiationCommand(UUID uuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
53 init(uuid, serviceInstantiationRequest, userId);
57 public NextCommand call() {
58 RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ;
60 requestDetailsWrapper = asyncInstantiationBL.generateServiceInstantiationRequest(
61 uuid, serviceInstantiationRequest, userId
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);
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();
79 String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationRequest);
81 RestObject<RequestReferencesContainer> msoResponse = restMso.PostForObject(requestDetailsWrapper, "",
82 path, RequestReferencesContainer.class);
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);
95 return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId));
97 auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatusCode(),msoResponse.getRaw());
98 return handleCommandFailed();
103 private void setInitialRequestAuditStatusFromMso(String requestId){
104 final String initialMsoRequestStatus = "REQUESTED";
105 asyncInstantiationBL.auditMsoStatus(uuid,initialMsoRequestStatus,requestId,null);
108 protected NextCommand handleCommandFailed() {
109 asyncInstantiationBL.handleFailedInstantiation(uuid);
110 return new NextCommand(Job.JobStatus.FAILED);
114 public ServiceInstantiationCommand init(UUID jobUuid, Map<String, Object> data) {
115 final Object request = data.get("request");
119 OBJECT_MAPPER.convertValue(request, ServiceInstantiation.class),
120 (String) data.get("userId")
124 private ServiceInstantiationCommand init(UUID jobUuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
126 this.serviceInstantiationRequest = serviceInstantiationRequest;
127 this.userId = userId;
133 public Map<String, Object> getData() {
134 return ImmutableMap.of(
136 "request", serviceInstantiationRequest,