Dynamic Cloud Owner Support
[so.git] / mso-api-handlers / mso-api-handler-infra / src / main / java / org / onap / so / apihandlerinfra / ServiceInstances.java
index 60b07fd..fb6076e 100644 (file)
@@ -45,6 +45,7 @@ import org.onap.so.apihandlerinfra.exceptions.BPMNFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ClientConnectionException;
 import org.onap.so.apihandlerinfra.exceptions.DuplicateRequestException;
 import org.onap.so.apihandlerinfra.exceptions.RecipeNotFoundException;
+import org.onap.so.apihandlerinfra.exceptions.RequestDbFailureException;
 import org.onap.so.apihandlerinfra.exceptions.ValidateException;
 import org.onap.so.apihandlerinfra.exceptions.VfModuleNotFoundException;
 import org.onap.so.apihandlerinfra.logging.ErrorLoggerInfo;
@@ -109,6 +110,7 @@ public class ServiceInstances {
        private static MsoLogger msoLogger = MsoLogger.getMsoLogger (MsoLogger.Catalog.APIH,MsoRequest.class);
        private static String NAME = "name";
        private static String VALUE = "value";
+       private static final String SAVE_TO_DB = "save instance to db";
        
        @Autowired
        private Environment env;
@@ -372,6 +374,20 @@ public class ServiceInstances {
                instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
                return serviceInstances(request, Action.applyUpdatedConfig, instanceIdMap, version, requestId, getRequestUri(requestContext));
        }
+       
+       @POST
+       @Path("/{version:[vV][7]}/serviceInstances/{serviceInstanceId}/vnfs/{vnfInstanceId}/recreate")
+       @Consumes(MediaType.APPLICATION_JSON)
+       @Produces(MediaType.APPLICATION_JSON)
+       @ApiOperation(value="Recreate VNF Instance",response=Response.class)
+       public Response recreateVnfInstance(String request, @PathParam("version") String version, @PathParam("serviceInstanceId") String serviceInstanceId,
+                                       @PathParam("vnfInstanceId") String vnfInstanceId, @Context ContainerRequestContext requestContext) throws ApiException {
+               String requestId = getRequestId(requestContext);
+               HashMap<String, String> instanceIdMap = new HashMap<>();
+               instanceIdMap.put("serviceInstanceId", serviceInstanceId);
+               instanceIdMap.put("vnfInstanceId", vnfInstanceId);              
+               return serviceInstances(request, Action.recreateInstance, instanceIdMap, version, requestId, getRequestUri(requestContext));
+       }
 
 
        @DELETE
@@ -663,14 +679,14 @@ public class ServiceInstances {
                                
 
                                // Get VF Module-specific base module indicator
-                               VfModule vfm;
+                               VfModule vfm = null;
 
                                String modelVersionId = modelInfo.getModelVersionId();
 
                                if(modelVersionId != null) {
                                        vfm = catalogDbClient.getVfModuleByModelUUID(modelVersionId);
-                               } else {
-                                       vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());                                     
+                               } else if(modelInfo.getModelInvariantId() != null && modelInfo.getModelVersion() != null){
+                                       vfm = catalogDbClient.getVfModuleByModelInvariantUUIDAndModelVersion(modelInfo.getModelInvariantId(), modelInfo.getModelVersion());
                                }
 
                                if (vfm != null) {
@@ -726,7 +742,13 @@ public class ServiceInstances {
                if (sir.getCorrelationId() != null) {
                        correlationId = sir.getCorrelationId();
                }
-               infraActiveRequestsClient.save(currentActiveReq);
+               try{
+                       infraActiveRequestsClient.save(currentActiveReq);
+               }catch(Exception e){
+                       ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+            throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+                    .errorInfo(errorLoggerInfo).build();
+               }
                
                if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
                        aLaCarte = true;
@@ -831,9 +853,8 @@ public class ServiceInstances {
             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
             ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
                         .errorInfo(errorLoggerInfo).build();
-            currentActiveReq.setRequestStatus(Status.FAILED.name());
-            currentActiveReq.setStatusMessage(validateException.getMessage());
-           throw validateException;
+            updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
+            throw validateException;
         }
 
                // BPEL accepted the request, the request is in progress
@@ -850,15 +871,20 @@ public class ServiceInstances {
                                        ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_BPEL_RESPONSE_ERROR, MsoLogger.ErrorCode.SchemaError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
                                        ValidateException validateException = new ValidateException.Builder("Exception caught mapping Camunda JSON response to object", HttpStatus.SC_NOT_ACCEPTABLE, ErrorNumbers.SVC_BAD_PARAMETER).cause(e)
                                            .errorInfo(errorLoggerInfo).build();
-                                       currentActiveReq.setRequestStatus(Status.FAILED.name());
-                                       currentActiveReq.setStatusMessage(validateException.getMessage());
+                                       updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
                                        throw validateException;
                                }
                        
                                currentActiveReq.setRequestStatus(Status.IN_PROGRESS.name());
                                setInstanceId(currentActiveReq, requestScope, jsonResponse.getRequestReferences().getInstanceId(), new HashMap<>());
                                
-                               infraActiveRequestsClient.save(currentActiveReq);
+                               try{
+                                       infraActiveRequestsClient.save(currentActiveReq);
+                               }catch(Exception e){
+                                       ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+                           throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+                                   .errorInfo(errorLoggerInfo).build();
+                               }
                                return builder.buildResponse(HttpStatus.SC_ACCEPTED, requestId, jsonResponse, apiVersion);
                        } 
                }
@@ -971,14 +997,10 @@ public class ServiceInstances {
                        }
                } catch (Exception e) {
             ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DUPLICATE_CHECK_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
-
-
-            ValidateException validateException = new ValidateException.Builder("Duplicate Check Request", HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+            RequestDbFailureException requestDbFailureException = new RequestDbFailureException.Builder("check for duplicate instance", e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
                     .errorInfo(errorLoggerInfo).build();
-
-            updateStatus(currentActiveReq, Status.FAILED, validateException.getMessage());
-
-            throw validateException;
+            updateStatus(currentActiveReq, Status.FAILED, requestDbFailureException.getMessage());
+            throw requestDbFailureException;
                }
                return dup;
        }
@@ -1004,7 +1026,7 @@ public class ServiceInstances {
        }
        
        private void parseRequest(ServiceInstancesRequest sir, HashMap<String, String> instanceIdMap, Actions action, String version, 
-                                                               String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException {
+                                                               String requestJSON, Boolean aLaCarte, String requestId, InfraActiveRequests currentActiveReq) throws ValidateException, RequestDbFailureException {
                int reqVersion = Integer.parseInt(version.substring(1));
                try {
                        msoRequest.parse(sir, instanceIdMap, action, version, requestJSON, reqVersion, aLaCarte);
@@ -1206,6 +1228,7 @@ public class ServiceInstances {
                        targetConfiguration.setAicNodeClli(sourceCloudConfiguration.getAicNodeClli());
                        targetConfiguration.setTenantId(sourceCloudConfiguration.getTenantId());
                        targetConfiguration.setLcpCloudRegionId(sourceCloudConfiguration.getLcpCloudRegionId());
+                       targetConfiguration.setCloudOwner(sourceCloudConfiguration.getCloudOwner());
                        return Optional.of(targetConfiguration);
                }
                return Optional.empty();
@@ -1621,7 +1644,13 @@ public class ServiceInstances {
                if (sir.getCorrelationId() != null) {
                        correlationId = sir.getCorrelationId();
                }
-               infraActiveRequestsClient.save(currentActiveReq);
+               try{
+                       infraActiveRequestsClient.save(currentActiveReq);
+               }catch(Exception e){
+                       ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+            throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+                    .errorInfo(errorLoggerInfo).build();
+               }
                
                if(!requestScope.equalsIgnoreCase(ModelType.service.name())){
                        aLaCarte = true;
@@ -1648,14 +1677,20 @@ public class ServiceInstances {
                        throw validateException;
        }
     }
-       public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage){
+       public void updateStatus(InfraActiveRequests aq, Status status, String errorMessage) throws RequestDbFailureException{
                if ((status == Status.FAILED) || (status == Status.COMPLETE)) {
                        aq.setStatusMessage (errorMessage);
                        aq.setProgress(new Long(100));
                        aq.setRequestStatus(status.toString());
                        Timestamp endTimeStamp = new Timestamp (System.currentTimeMillis());
                        aq.setEndTime (endTimeStamp);
-                       infraActiveRequestsClient.save(aq);
+                       try{
+                               infraActiveRequestsClient.save(aq);
+                       }catch(Exception e){
+                               ErrorLoggerInfo errorLoggerInfo = new ErrorLoggerInfo.Builder(MessageEnum.APIH_DB_ACCESS_EXC, MsoLogger.ErrorCode.DataError).errorSource(Constants.MSO_PROP_APIHANDLER_INFRA).build();
+                   throw new RequestDbFailureException.Builder(SAVE_TO_DB, e.toString(), HttpStatus.SC_INTERNAL_SERVER_ERROR, ErrorNumbers.SVC_DETAILED_SERVICE_ERROR).cause(e)
+                           .errorInfo(errorLoggerInfo).build();
+                       }
                }
        }
 }