Update onboarding upload status during processing
[sdc.git] / openecomp-be / api / openecomp-sdc-rest-webapp / vendor-software-products-rest / vendor-software-products-rest-services / src / main / java / org / openecomp / sdcrests / vsp / rest / services / OrchestrationTemplateCandidateUploadManagerImpl.java
index d7cfe04..df280bd 100644 (file)
 
 package org.openecomp.sdcrests.vsp.rest.services;
 
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.alreadyInStatusBeingUpdated;
 import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotCreateLock;
 import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotFindLock;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotFindStatus;
 import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotUpdateLock;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.couldNotUpdateStatus;
+import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.invalidCompletionStatus;
 import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.uploadAlreadyFinished;
 import static org.openecomp.sdcrests.vsp.rest.exception.OrchestrationTemplateCandidateUploadManagerExceptionSupplier.vspUploadAlreadyInProgress;
 
@@ -58,28 +62,31 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
 
     private static final Logger LOGGER = LoggerFactory.getLogger(OrchestrationTemplateCandidateUploadManagerImpl.class);
 
-    private final VspUploadStatusRecordDao uploadManagerDao;
+    private final VspUploadStatusRecordDao vspUploadStatusRecordDao;
     private final VspUploadStatusRecordMapper vspUploadStatusRecordMapper;
     private final VendorSoftwareProductManager vendorSoftwareProductManager;
     private final Lock startUploadLock;
+    private final Lock updateStatusLock;
 
     @Autowired
     public OrchestrationTemplateCandidateUploadManagerImpl(
-        @Qualifier("vsp-upload-status-record-dao-impl") final VspUploadStatusRecordDao uploadManagerDao) {
+        @Qualifier("vsp-upload-status-record-dao-impl") final VspUploadStatusRecordDao vspUploadStatusRecordDao) {
 
-        this.uploadManagerDao = uploadManagerDao;
+        this.vspUploadStatusRecordDao = vspUploadStatusRecordDao;
         this.vendorSoftwareProductManager = VspManagerFactory.getInstance().createInterface();
         this.vspUploadStatusRecordMapper = new VspUploadStatusRecordMapper();
         startUploadLock = new ReentrantLock();
+        updateStatusLock = new ReentrantLock();
     }
 
     //for tests purpose
-    OrchestrationTemplateCandidateUploadManagerImpl(final VspUploadStatusRecordDao uploadManagerDao,
+    OrchestrationTemplateCandidateUploadManagerImpl(final VspUploadStatusRecordDao vspUploadStatusRecordDao,
                                                     final VendorSoftwareProductManager vendorSoftwareProductManager) {
-        this.uploadManagerDao = uploadManagerDao;
+        this.vspUploadStatusRecordDao = vspUploadStatusRecordDao;
         this.vendorSoftwareProductManager = vendorSoftwareProductManager;
         this.vspUploadStatusRecordMapper = new VspUploadStatusRecordMapper();
         startUploadLock = new ReentrantLock();
+        updateStatusLock = new ReentrantLock();
     }
 
     @Override
@@ -90,7 +97,7 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
         final VspUploadStatusRecord vspUploadStatusRecord;
         startUploadLock.lock();
         try {
-            final List<VspUploadStatusRecord> uploadInProgressList = uploadManagerDao.findAllInProgress(vspId, vspVersionId);
+            final List<VspUploadStatusRecord> uploadInProgressList = vspUploadStatusRecordDao.findAllInProgress(vspId, vspVersionId);
             if (!uploadInProgressList.isEmpty()) {
                 throw vspUploadAlreadyInProgress(vspId, vspVersionId).get();
             }
@@ -102,7 +109,7 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
             vspUploadStatusRecord.setLockId(UUID.randomUUID());
             vspUploadStatusRecord.setCreated(new Date());
 
-            uploadManagerDao.create(vspUploadStatusRecord);
+            vspUploadStatusRecordDao.create(vspUploadStatusRecord);
             LOGGER.debug("Upload lock '{}' created for VSP id '{}', version '{}'", vspUploadStatusRecord.getLockId(), vspId, vspVersionId);
         } catch (final CoreException e) {
             throw e;
@@ -115,6 +122,57 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
         return vspUploadStatusRecordMapper.applyMapping(vspUploadStatusRecord, VspUploadStatusDto.class);
     }
 
+    @Override
+    public VspUploadStatusDto putUploadInValidation(final String vspId, final String vspVersionId, final String user) {
+        return updateToNotFinalStatus(vspId, vspVersionId, VspUploadStatus.VALIDATING, user);
+    }
+
+    @Override
+    public VspUploadStatusDto putUploadInProcessing(final String vspId, final String vspVersionId, final String user) {
+        return updateToNotFinalStatus(vspId, vspVersionId, VspUploadStatus.PROCESSING, user);
+    }
+
+    private VspUploadStatusDto updateToNotFinalStatus(final String vspId, final String vspVersionId, final VspUploadStatus status, final String user) {
+        LOGGER.debug("Updating upload status to '{}' for VSP id '{}', version '{}', triggered by user '{}'", status, vspId, vspVersionId, user);
+        if (status.isCompleteStatus()) {
+            throw invalidCompletionStatus(status).get();
+        }
+        updateStatusLock.lock();
+        try {
+            final Optional<VspUploadStatusRecord> vspUploadStatusRecordOptional = vspUploadStatusRecordDao.findLatest(vspId, vspVersionId);
+            if (vspUploadStatusRecordOptional.isEmpty()) {
+                throw couldNotFindStatus(vspId, vspVersionId).get();
+            }
+
+            final VspUploadStatusRecord vspUploadStatusRecord = vspUploadStatusRecordOptional.get();
+            final VspUploadStatus currentStatus = vspUploadStatusRecord.getStatus();
+            if (currentStatus == status) {
+                throw alreadyInStatusBeingUpdated(vspId, vspVersionId, status).get();
+            }
+            return updateStatus(vspUploadStatusRecord, status);
+        } finally {
+            updateStatusLock.unlock();
+        }
+    }
+
+    private VspUploadStatusDto updateStatus(final VspUploadStatusRecord vspUploadStatusRecord, final VspUploadStatus status) {
+        final VspUploadStatus currentStatus = vspUploadStatusRecord.getStatus();
+        vspUploadStatusRecord.setStatus(status);
+        vspUploadStatusRecord.setUpdated(new Date());
+
+        final String vspId = vspUploadStatusRecord.getVspId();
+        final String vspVersionId = vspUploadStatusRecord.getVspVersionId();
+        try {
+            vspUploadStatusRecordDao.update(vspUploadStatusRecord);
+            LOGGER.debug("Upload lock '{}' status updated from '{}' to '{}' for VSP id '{}', version '{}'",
+                vspUploadStatusRecord.getLockId(), currentStatus, status, vspId, vspVersionId);
+        } catch (final Exception e) {
+            throw couldNotUpdateStatus(vspId, vspVersionId, status, e).get();
+        }
+
+        return vspUploadStatusRecordMapper.applyMapping(vspUploadStatusRecord, VspUploadStatusDto.class);
+    }
+
     @Override
     public VspUploadStatusDto putUploadAsFinished(final String vspId, final String vspVersionId, final UUID lockId, final VspUploadStatus completionStatus,
                                                   final String user) {
@@ -123,7 +181,7 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
             throw OrchestrationTemplateCandidateUploadManagerExceptionSupplier.invalidCompleteStatus(completionStatus).get();
         }
         final Optional<VspUploadStatusRecord> vspUploadStatusOptional =
-            uploadManagerDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId);
+            vspUploadStatusRecordDao.findByVspIdAndVersionIdAndLockId(vspId, vspVersionId, lockId);
         if (vspUploadStatusOptional.isEmpty()) {
             throw couldNotFindLock(lockId, vspId, vspVersionId).get();
         }
@@ -138,7 +196,7 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
         vspUploadStatusRecord.setIsComplete(true);
 
         try {
-            uploadManagerDao.update(vspUploadStatusRecord);
+            vspUploadStatusRecordDao.update(vspUploadStatusRecord);
             LOGGER.debug("Upload complete for VSP '{}', version '{}', lock '{}'",
                 vspUploadStatusRecord.getLockId(), vspUploadStatusRecord.getVspId(), vspUploadStatusRecord.getVspVersionId());
         } catch (final Exception e) {
@@ -160,7 +218,7 @@ public class OrchestrationTemplateCandidateUploadManagerImpl implements Orchestr
     public Optional<VspUploadStatusDto> findLatestStatus(final String vspId, final String vspVersionId, final String user) {
         checkVspExists(vspId, vspVersionId);
 
-        final Optional<VspUploadStatusRecord> vspUploadStatus = uploadManagerDao.findLatest(vspId, vspVersionId);
+        final Optional<VspUploadStatusRecord> vspUploadStatus = vspUploadStatusRecordDao.findLatest(vspId, vspVersionId);
         if (vspUploadStatus.isEmpty()) {
             return Optional.empty();
         }