Merge from ECOMP's repository
[vid.git] / vid-app-common / src / main / java / org / onap / vid / job / command / ServiceInstantiationCommand.java
index 958fc11..b40b701 100644 (file)
-/*-
- * ============LICENSE_START=======================================================
- * VID
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2018 Nokia. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
 package org.onap.vid.job.command;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.collect.ImmutableMap;
-import io.joshworks.restclient.http.HttpResponse;
-import org.onap.vid.aai.exceptions.InvalidAAIResponseException;
+import org.apache.commons.lang3.ObjectUtils;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
 import org.onap.vid.changeManagement.RequestDetailsWrapper;
 import org.onap.vid.exceptions.MaxRetriesException;
 import org.onap.vid.job.Job;
 import org.onap.vid.job.JobCommand;
 import org.onap.vid.job.NextCommand;
+import org.onap.vid.job.impl.JobSharedData;
 import org.onap.vid.model.RequestReferencesContainer;
 import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
-import org.onap.vid.mso.MsoInterface;
+import org.onap.vid.mso.RestMsoImplementation;
+import org.onap.vid.mso.RestObject;
 import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
 import org.onap.vid.services.AsyncInstantiationBusinessLogic;
-import org.onap.vid.services.AuditService;
-import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
-import org.springframework.beans.factory.config.ConfigurableBeanFactory;
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
 
 import javax.inject.Inject;
 import java.util.Map;
-import java.util.Objects;
-import java.util.UUID;
 
 
-@Component
-@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
-public class ServiceInstantiationCommand implements JobCommand {
-
-    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+public abstract class ServiceInstantiationCommand extends BaseRootCommand implements JobCommand {
 
     private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(ServiceInstantiationCommand.class);
 
     @Inject
-    private AsyncInstantiationBusinessLogic asyncInstantiationBL;
-
-    @Inject
-    private AuditService auditService;
+    protected AsyncInstantiationBusinessLogic asyncInstantiationBL;
 
     @Inject
-    private MsoInterface restMso;
+    private RestMsoImplementation restMso;
 
-    private UUID uuid;
-    private ServiceInstantiation serviceInstantiationRequest;
-    private String userId;
+    protected String optimisticUniqueServiceInstanceName;
 
     public ServiceInstantiationCommand() {
     }
 
-    public ServiceInstantiationCommand(UUID uuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
-        init(uuid, serviceInstantiationRequest, userId);
-    }
-
-    ServiceInstantiationCommand(AsyncInstantiationBusinessLogic asyncInstantiationBL, AuditService auditService, MsoInterface msoInterface,
-                                UUID uuid, ServiceInstantiation serviceInstantiation, String userId) {
-        this(uuid, serviceInstantiation, userId);
-        this.asyncInstantiationBL = asyncInstantiationBL;
-        this.auditService = auditService;
-        this.restMso = msoInterface;
-    }
-
     @Override
     public NextCommand call() {
         RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ;
         try {
-            requestDetailsWrapper = asyncInstantiationBL.generateServiceInstantiationRequest(
-                    uuid, serviceInstantiationRequest, userId
-            );
+            requestDetailsWrapper = generateServiceInstantiationRequest();
         }
+
         //Aai return bad response while checking names uniqueness
-        catch (InvalidAAIResponseException exception) {
-            LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception);
-            //put the job in_progress so we will keep trying to check name uniqueness in AAI
-            //And then send the request to MSO
-            return new NextCommand(Job.JobStatus.IN_PROGRESS, this);
+        catch (ExceptionWithRequestInfo exception) {
+            return handleAaiNameUniquenessBadResponse(exception);
         }
 
         //Vid reached to max retries while trying to find unique name in AAI
         catch (MaxRetriesException exception) {
-            LOGGER.error("Failed to find unused name in AAI. Set the job to FAILED ", exception);
-            return handleCommandFailed();
+            return handleMaxRetryInNameUniqueness(exception);
         }
 
-        String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationRequest);
+        String path = asyncInstantiationBL.getServiceInstantiationPath(getRequest());
 
-        HttpResponse<RequestReferencesContainer> msoResponse = restMso.post(path,
-            requestDetailsWrapper, RequestReferencesContainer.class);
+        RestObject<RequestReferencesContainer> msoResponse = restMso.PostForObject(requestDetailsWrapper,
+                path, RequestReferencesContainer.class);
 
+        return handleRootResponse(msoResponse);
 
-        if (msoResponse.getStatus() >= 200 && msoResponse.getStatus() < 400) {
-            final Job.JobStatus jobStatus = Job.JobStatus.IN_PROGRESS;
-            final String requestId = msoResponse.getBody().getRequestReferences().getRequestId();
-            final String instanceId = msoResponse.getBody().getRequestReferences().getInstanceId();
-            asyncInstantiationBL.auditVidStatus(uuid, jobStatus);
-            setInitialRequestAuditStatusFromMso(requestId);
-            asyncInstantiationBL.updateServiceInfo(uuid, x-> {
-                x.setJobStatus(jobStatus);
-                x.setServiceInstanceId(instanceId);
-            });
-
-            return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId));
-        } else {
-            auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatus(),
-                    Objects.toString(msoResponse.getBody()));
-            return handleCommandFailed();
-        }
+    }
 
+    @Override
+    protected ServiceInstantiation getRequest() {
+        return (ServiceInstantiation) getSharedData().getRequest();
     }
 
-    private void setInitialRequestAuditStatusFromMso(String requestId){
-        final String initialMsoRequestStatus = "REQUESTED";
-        asyncInstantiationBL.auditMsoStatus(uuid,initialMsoRequestStatus,requestId,null);
+    protected abstract RequestDetailsWrapper<ServiceInstantiationRequestDetails> generateServiceInstantiationRequest();
+
+    private NextCommand handleMaxRetryInNameUniqueness(MaxRetriesException exception) {
+        LOGGER.error("Failed to find unused name in AAI. Set the job to FAILED ", exception);
+        return handleCommandFailed();
     }
 
-    protected NextCommand handleCommandFailed() {
-        asyncInstantiationBL.handleFailedInstantiation(uuid);
-        return new NextCommand(Job.JobStatus.FAILED);
+    private NextCommand handleAaiNameUniquenessBadResponse(ExceptionWithRequestInfo exception) {
+        LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception);
+        //put the job in_progress so we will keep trying to check name uniqueness in AAI
+        //And then send the request to MSO
+        return new NextCommand(Job.JobStatus.IN_PROGRESS, this);
     }
 
     @Override
-    public ServiceInstantiationCommand init(UUID jobUuid, Map<String, Object> data) {
-        final Object request = data.get("request");
+    public ServiceInstantiationCommand init(JobSharedData sharedData, Map<String, Object> commandData) {
 
         return init(
-                jobUuid,
-                OBJECT_MAPPER.convertValue(request, ServiceInstantiation.class),
-                (String) data.get("userId")
+                sharedData,
+                (String) commandData.get("optimisticUniqueServiceInstanceName")
         );
     }
 
-    private ServiceInstantiationCommand init(UUID jobUuid, ServiceInstantiation serviceInstantiationRequest, String userId) {
-        this.uuid = jobUuid;
-        this.serviceInstantiationRequest = serviceInstantiationRequest;
-        this.userId = userId;
-
+    protected ServiceInstantiationCommand init(JobSharedData sharedData, String optimisticUniqueServiceInstanceName) {
+        init(sharedData);
+        this.optimisticUniqueServiceInstanceName = ObjectUtils.defaultIfNull(optimisticUniqueServiceInstanceName,
+                (getRequest()).getInstanceName());
         return this;
     }
 
     @Override
     public Map<String, Object> getData() {
         return ImmutableMap.of(
-                "uuid", uuid,
-                "request", serviceInstantiationRequest,
-                "userId", userId
+                "optimisticUniqueServiceInstanceName", optimisticUniqueServiceInstanceName
         );
     }
 }