diff --git a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java index 776d10b9ae7289960ad25d540de7c5e8c25a128e..90f1bbfe7b57d3542f233591baa93d1bf2935e6c 100644 --- a/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java +++ b/src/main/java/net/geant/nmaas/portal/api/market/ApplicationController.java @@ -10,12 +10,7 @@ import net.geant.nmaas.notifications.MailAttributes; import net.geant.nmaas.notifications.NotificationEvent; import net.geant.nmaas.notifications.templates.MailType; import net.geant.nmaas.orchestration.AppLifecycleManager; -import net.geant.nmaas.portal.api.domain.AppRateView; -import net.geant.nmaas.portal.api.domain.ApplicationBaseView; -import net.geant.nmaas.portal.api.domain.ApplicationStateChangeRequest; -import net.geant.nmaas.portal.api.domain.ApplicationView; -import net.geant.nmaas.portal.api.domain.Id; -import net.geant.nmaas.portal.api.domain.UserView; +import net.geant.nmaas.portal.api.domain.*; import net.geant.nmaas.portal.api.exception.MarketException; import net.geant.nmaas.portal.api.exception.MissingElementException; import net.geant.nmaas.portal.api.exception.ProcessingException; @@ -73,6 +68,8 @@ public class ApplicationController extends AppBaseController { private final AppLifecycleManager appLifecycleManager; + private final AppInstanceController appInstanceController; + /* * Application Base Part */ @@ -151,14 +148,8 @@ public class ApplicationController extends AppBaseController { ApplicationState state = ApplicationState.DELETED; for (ApplicationVersion appVersion : base.getVersions()) { Application app = getApp(appVersion.getAppVersionId()); - applicationService.changeApplicationState(app, state); - List<AppInstance> instanceList = applicationInstanceService.findAllByApplication(app); - instanceList.forEach(instance -> { - appLifecycleManager.removeApplication(instance.getInternalId()); - }); - appVersion.setState(state); + if(app.getState() != ApplicationState.DELETED) throw new ProcessingException("Can not delete base, version " + app.getVersion() +" is not deleted"); } - appBaseService.deleteAppBase(base); } @@ -323,8 +314,23 @@ public class ApplicationController extends AppBaseController { @PatchMapping(value = "/state/{id}") @PreAuthorize("hasRole('ROLE_SYSTEM_ADMIN')") @Transactional - public void changeApplicationState(@PathVariable long id, @RequestBody ApplicationStateChangeRequest stateChangeRequest) { + public void changeApplicationState(@PathVariable long id, @RequestBody ApplicationStateChangeRequest stateChangeRequest, Principal principal) { Application app = getApp(id); + if(stateChangeRequest.getState().equals(ApplicationState.DELETED)) { + applicationInstanceService.findAllByApplication(app).forEach(ai -> { + AppInstanceStatus instanceState = appInstanceController.getState(ai.getId(), principal); + int numberOfRunningInstances = 0; + if(!(instanceState.getState().equals(AppInstanceState.DONE) + || instanceState.getState().equals(AppInstanceState.FAILURE) + || instanceState.getState().equals(AppInstanceState.REMOVED) )) { + numberOfRunningInstances = +1; + } + if(numberOfRunningInstances > 0) { + throw new ProcessingException("Can not delete app version. You still have " + numberOfRunningInstances + " running instances of this version."); + } + } + ); + } applicationService.changeApplicationState(app, stateChangeRequest.getState()); appBaseService.updateApplicationVersionState(app.getName(), app.getVersion(), stateChangeRequest.getState()); this.sendMails(app, stateChangeRequest);