diff --git a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java index c4211889458bbd48e832ea4273d35fc30fab98a4..a03794d9dc9e031a079913b66b85166756667720 100644 --- a/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java +++ b/src/main/java/net/geant/nmaas/portal/api/bulk/BulkController.java @@ -133,7 +133,7 @@ public class BulkController { User user = this.userService.findByUsername(principal.getName()).orElseThrow(() -> new MissingElementException("Missing user " + principal.getName())); return ResponseEntity.ok(mapToView(bulkDeploymentRepository.findByType(BulkType.DOMAIN)).stream() - .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); + .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); } @GetMapping("/apps") @@ -151,6 +151,12 @@ public class BulkController { .filter(bulk -> bulk.getCreator().getId().equals(user.getId())).collect(Collectors.toList())); } + @GetMapping("/refresh/{id}") + @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN') || hasRole('ROLE_VL_MANAGER')") + public ResponseEntity<BulkDeploymentViewS> getRefreshedState(@PathVariable Long id) { + return ResponseEntity.ok(mapToView(this.bulkApplicationService.updateState(id))); + } + private List<BulkDeploymentViewS> mapToView(List<BulkDeployment> deployments) { return deployments.stream() .map(bulk -> { @@ -162,6 +168,14 @@ public class BulkController { .collect(Collectors.toList()); } + private BulkDeploymentView mapToView(BulkDeployment deployment) { + BulkDeploymentView bulkView = modelMapper.map(deployment, BulkDeploymentView.class); + bulkView.setCreator(getUserView(deployment.getCreatorId())); + mapDetails(deployment, bulkView); + return bulkView; + + } + private void mapDetails(BulkDeployment deployment, BulkDeploymentViewS view) { if (deployment.getType().equals(BulkType.APPLICATION)) { Map<String, String> details = new HashMap<>(); diff --git a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java index bebf1c9f83b47a8ce983904e071a0e7697a01bf3..08583400d7b96e1a1e3c44cf474202e3d4c3b378 100644 --- a/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java +++ b/src/main/java/net/geant/nmaas/portal/service/BulkApplicationService.java @@ -7,6 +7,7 @@ import net.geant.nmaas.portal.api.bulk.BulkDeploymentView; import net.geant.nmaas.portal.api.bulk.BulkDeploymentViewS; import net.geant.nmaas.portal.api.bulk.CsvApplication; import net.geant.nmaas.portal.api.domain.UserViewMinimal; +import net.geant.nmaas.portal.persistent.entity.BulkDeployment; import org.springframework.context.ApplicationEvent; import org.springframework.core.io.InputStreamResource; @@ -24,4 +25,6 @@ public interface BulkApplicationService { InputStreamResource getInputStreamAppBulkDetails(List<BulkAppDetails> list ); + BulkDeployment updateState(Long bulkId); + } diff --git a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java index aea95a4edb36d392e16ba3d136942ea7d9b6edef..cb73a8fe91af9a396c5c29d6dd632deb9623a139 100644 --- a/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java +++ b/src/main/java/net/geant/nmaas/portal/service/impl/BulkApplicationServiceImpl.java @@ -55,6 +55,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -300,6 +301,58 @@ public class BulkApplicationServiceImpl implements BulkApplicationService { ); } + @Override + public BulkDeployment updateState(Long bulkId) { + log.info("Update all states for bulk {}", bulkId); + Optional<BulkDeployment> bulk = this.bulkDeploymentRepository.findById(bulkId); + if(bulk.isPresent()) { + BulkDeployment bulkDeployment = bulk.get(); + bulkDeployment.getEntries().forEach(entry -> { + try { + Long instanceId = Long.valueOf(entry.getDetails().get(BULK_ENTRY_DETAIL_KEY_APP_INSTANCE_ID)); + AppInstance instance = instanceService.find(instanceId).orElseThrow(); + + AppLifecycleState state = appDeploymentMonitor.state(instance.getInternalId()); + log.error("For bulk entries {} state = {}", entry.getId(), state.toString()); + switch (state) { + case APPLICATION_DEPLOYMENT_VERIFIED: + entry.setState(BulkDeploymentState.COMPLETED); + bulkDeploymentEntryRepository.save(entry); + break; + case APPLICATION_CONFIGURATION_FAILED: + case APPLICATION_DEPLOYMENT_FAILED: + case APPLICATION_DEPLOYMENT_VERIFICATION_FAILED: + case INTERNAL_ERROR: + entry.setState(BulkDeploymentState.FAILED); + bulkDeploymentEntryRepository.save(entry); + break; + default: + entry.setState(BulkDeploymentState.PENDING); + bulkDeploymentEntryRepository.save(entry); + break; + } + logBulkStateUpdate(entry.getId(), entry.getState().name()); + + } catch (Exception e) { + log.error("Can not update state of {} bulk entry", entry.getId()); + } + }); + if (bulkDeployment.getEntries().stream().allMatch(e -> BulkDeploymentState.COMPLETED.equals(e.getState()))) { + bulkDeployment.setState(BulkDeploymentState.COMPLETED); + } else if (bulkDeployment.getEntries().stream().allMatch(e -> BulkDeploymentState.FAILED.equals(e.getState()))) { + bulkDeployment.setState(BulkDeploymentState.FAILED); + } else if (bulkDeployment.getEntries().stream().anyMatch(e -> BulkDeploymentState.FAILED.equals(e.getState()))) { + bulkDeployment.setState(BulkDeploymentState.PARTIALLY_FAILED); + } + logBulkStateUpdate(bulkDeployment.getId(),bulkDeployment.getState().name()); + bulkDeploymentRepository.save(bulkDeployment); + return bulkDeployment; + } else { + log.error("Can not find bulk deployment {}", bulkId); + throw new MissingElementException("Can not find bulk deployment " + bulkId); + } + } + private static BulkDeployment createBulkDeployment(UserViewMinimal creator) { BulkDeployment bulkDeployment = new BulkDeployment(); bulkDeployment.setType(BulkType.APPLICATION);