diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java index 3c792a7380..9c6694d191 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/Messages.java @@ -178,7 +178,7 @@ public final class Messages { public static final String THREAD_MONITOR_CACHE_TIMEOUT = "Flowable thread monitor cache timeout: {0} seconds"; public static final String SPACE_DEVELOPERS_CACHE_TIME_IN_SECONDS = "Cache for list of space developers per SpaceGUID: {0} seconds"; public static final String APP_SHUTDOWN_REQUEST = "Application with id:\"{0}\", instance id:\"{1}\", instance index:\"{2}\", is requested to shutdown. Timeout to wait before shutdown of Flowable job executor:\"{3}\" seconds."; - public static final String APP_SUCCESSFULLY_SHUTDOWN = "Application with id:\"{0}\", instance id:\"{1}\", instance index:\"{2}\", is shutdown. Timeout to wait before shutdown of Flowable job executor:\"{3}\" seconds."; + public static final String APP_SHUTDOWNED = "Application with id:\"{0}\", instance id:\"{1}\", instance index:\"{2}\", is shutdowned. Timeout to wait before shutdown of Flowable job executor:\"{3}\" seconds."; public static final String APP_SHUTDOWN_STATUS_MONITOR = "Monitor shutdown status of application with id:\"{0}\", instance id:\"{1}\", instance index:\"{2}\". Status:\"{3}\"."; public static final String CONTROLLER_CLIENT_SSL_HANDSHAKE_TIMEOUT_IN_SECONDS = "Controller client SSL handshake timeout in seconds: {0}"; public static final String CONTROLLER_CLIENT_CONNECT_TIMEOUT_IN_SECONDS = "Controller client connect timeout in seconds: {0}"; diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminer.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminer.java index d191580212..7e0b54d0e5 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminer.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminer.java @@ -10,7 +10,7 @@ public AppSuffixDeterminer(boolean keepOriginalNamesAfterDeploy, boolean isAfter this.isAfterResumePhase = isAfterResumePhase; } - public boolean shouldAppendIdleSuffix() { + public boolean shouldAppendApplicationSuffix() { return keepOriginalNamesAfterDeploy && isAfterResumePhase; } } diff --git a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java index 0abebaf7c6..2910e5e4e7 100644 --- a/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java +++ b/multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/cf/v2/ApplicationCloudModelBuilder.java @@ -152,7 +152,7 @@ private DeployedMtaApplication findDeployedApplication(String moduleName, Deploy private String getApplicationName(Module module) { String applicationName = NameUtil.getApplicationName(module); - if (appSuffixDeterminer.shouldAppendIdleSuffix()) { + if (appSuffixDeterminer.shouldAppendApplicationSuffix()) { applicationName += BlueGreenApplicationNameSuffix.IDLE.asSuffix(); } return applicationName; diff --git a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminerTest.java b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminerTest.java index 991ce4d81a..bce9c48cb8 100644 --- a/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminerTest.java +++ b/multiapps-controller-core/src/test/java/org/cloudfoundry/multiapps/controller/core/cf/detect/AppSuffixDeterminerTest.java @@ -1,17 +1,18 @@ package org.cloudfoundry.multiapps.controller.core.cf.detect; +import static org.junit.jupiter.api.Assertions.assertEquals; + import java.util.stream.Stream; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import static org.junit.jupiter.api.Assertions.assertEquals; - class AppSuffixDeterminerTest { static Stream testAppSuffixDeterminer() { return Stream.of( + //@formatter:off // (1) Keep original app names is not set and the process is not after resume phase Arguments.of(false, false, false), // (2) Keep original app names is set but the process is not after resume phase @@ -20,6 +21,7 @@ static Stream testAppSuffixDeterminer() { Arguments.of(false, true, false), // (4) Keep original app names is set and the process is after resume phase Arguments.of(true, true, true) + //@formatter:on ); } @@ -27,6 +29,6 @@ static Stream testAppSuffixDeterminer() { @MethodSource void testAppSuffixDeterminer(boolean keepOriginalNamesAfterDeploy, boolean isAfterResumePhase, boolean shouldAppendApplicationSuffix) { AppSuffixDeterminer appSuffixDeterminer = new AppSuffixDeterminer(keepOriginalNamesAfterDeploy, isAfterResumePhase); - assertEquals(shouldAppendApplicationSuffix, appSuffixDeterminer.shouldAppendIdleSuffix()); + assertEquals(shouldAppendApplicationSuffix, appSuffixDeterminer.shouldAppendApplicationSuffix()); } } diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java index 8e259ae732..a345de783c 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java @@ -161,6 +161,7 @@ public class Messages { public static final String ERROR_MONITORING_OPERATIONS_OVER_SERVICES = "Error monitoring operations over services"; public static final String ERROR_DELETING_REMAINING_FILE_PARTS = "Error deleting remaining file parts"; public static final String ERROR_DETECTING_APPLICATIONS_TO_RENAME = "Error detecting applications to rename"; + public static final String ERROR_RENAMING_NEW_APPLICATIONS = "Error renaming new applications"; public static final String ERROR_MONITORING_CREATION_OR_UPDATE_OF_SERVICES = "Error monitoring creation or update of services"; public static final String ERROR_MONITORING_DELETION_OF_SERVICES = "Error monitoring deletion of services"; public static final String SERVICE_IS_ALREADY_DELETED = "Service \"{0}\" is already deleted"; diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java index 8fc3f219b0..8198bfbe8f 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateAppStep.java @@ -18,7 +18,6 @@ import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; import org.cloudfoundry.multiapps.controller.client.facade.CloudCredentials; import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudApplication; -import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableCloudApplication; import org.cloudfoundry.multiapps.controller.client.facade.domain.ImmutableStaging; import org.cloudfoundry.multiapps.controller.client.facade.domain.Staging; import org.cloudfoundry.multiapps.controller.client.facade.dto.ApplicationToCreateDto; @@ -29,11 +28,8 @@ import org.cloudfoundry.multiapps.controller.core.cf.clients.AppBoundServiceInstanceNamesGetter; import org.cloudfoundry.multiapps.controller.core.cf.clients.WebClientFactory; import org.cloudfoundry.multiapps.controller.core.helpers.ApplicationFileDigestDetector; -import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; import org.cloudfoundry.multiapps.controller.core.security.token.TokenService; import org.cloudfoundry.multiapps.controller.core.util.ApplicationConfiguration; -import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationSubscription; -import org.cloudfoundry.multiapps.controller.persistence.services.ConfigurationSubscriptionService; import org.cloudfoundry.multiapps.controller.persistence.services.FileStorageException; import org.cloudfoundry.multiapps.controller.process.Messages; import org.cloudfoundry.multiapps.controller.process.util.ApplicationAttributeUpdater; @@ -63,8 +59,6 @@ public class CreateOrUpdateAppStep extends SyncFlowableStep { private WebClientFactory webClientFactory; @Inject private ApplicationConfiguration configuration; - @Inject - private ConfigurationSubscriptionService subscriptionService; @Override protected StepPhase executeStep(ProcessContext context) throws FileStorageException { @@ -100,9 +94,7 @@ protected AppBoundServiceInstanceNamesGetter getAppBoundServiceInstanceNamesGett return new AppBoundServiceInstanceNamesGetter(configuration, webClientFactory, credentials, correlationId); } - private StepFlowHandler createStepFlowHandler(ProcessContext context, - CloudControllerClient client, - CloudApplicationExtended app, + private StepFlowHandler createStepFlowHandler(ProcessContext context, CloudControllerClient client, CloudApplicationExtended app, CloudApplication existingApp) { if (existingApp == null) { return new CreateAppFlowHandler(context, client, app); @@ -220,9 +212,7 @@ private class UpdateAppFlowHandler extends StepFlowHandler { final CloudApplication existingApp; - public UpdateAppFlowHandler(ProcessContext context, - CloudControllerClient client, - CloudApplicationExtended app, + public UpdateAppFlowHandler(ProcessContext context, CloudControllerClient client, CloudApplicationExtended app, CloudApplication existingApp) { super(context, client, app); this.existingApp = existingApp; @@ -240,9 +230,7 @@ public void handleApplicationAttributes() { reportApplicationUpdateStatus(app, arePropertiesChanged); context.setVariable(Variables.VCAP_APP_PROPERTIES_CHANGED, arePropertiesChanged); - updateApplicationEnvironment(); - updateApplicationName(); } private void updateApplicationEnvironment() { @@ -290,31 +278,6 @@ private UpdateStrategy getEnvUpdateStrategy() { .shouldKeepExistingEnv() ? UpdateStrategy.MERGE : UpdateStrategy.REPLACE; } - public void updateApplicationName() { - boolean processIsBlueGreenWithIdleSuffix = StepsUtil.getAppSuffixDeterminer(context) - .shouldAppendIdleSuffix(); - if (!processIsBlueGreenWithIdleSuffix) { - return; - } - - String oldName = existingApp.getName(); - String newName = BlueGreenApplicationNameSuffix.removeSuffix(oldName); - if (oldName.equals(newName)) { - getStepLogger().info(Messages.THE_DETECTED_APPLICATION_HAS_THE_SAME_NAME_AS_THE_NEW_ONE); - return; - } - - getStepLogger().info(Messages.RENAMING_APPLICATION_0_TO_1, oldName, newName); - client.rename(oldName, newName); - - context.setVariable(Variables.EXISTING_APP, ImmutableCloudApplication.copyOf(existingApp) - .withName(newName)); - context.setVariable(Variables.APP_TO_PROCESS, ImmutableCloudApplicationExtended.copyOf(app) - .withName(newName)); - - updateConfigurationSubscribers(oldName, newName); - } - @Override public void handleApplicationServices() { if (context.getVariable(Variables.SHOULD_SKIP_SERVICE_REBINDING)) { @@ -334,40 +297,6 @@ public void printStepEndMessage() { getStepLogger().debug(Messages.APP_UPDATED, app.getName()); } - private void updateConfigurationSubscribers(String oldAppName, String newAppName) { - String mtaId = context.getVariable(Variables.MTA_ID); - String spaceGuid = context.getVariable(Variables.SPACE_GUID); - - List subscriptions = subscriptionService.createQuery() - .mtaId(mtaId) - .spaceId(spaceGuid) - .list(); - for (ConfigurationSubscription subscription : subscriptions) { - if (oldAppName.equals(subscription.getAppName())) { - getStepLogger().debug(Messages.UPDATING_CONFIGURATION_SUBSCRIPTION_0_WITH_NAME_1, subscription.getAppName(), - newAppName); - updateConfigurationSubscription(subscription, newAppName); - } - } - } - - private void updateConfigurationSubscription(ConfigurationSubscription subscription, String newAppName) { - ConfigurationSubscription newSubscription = createNewSubscription(subscription, newAppName); - subscriptionService.update(subscription, newSubscription); - } - - private ConfigurationSubscription createNewSubscription(ConfigurationSubscription subscription, String newAppName) { - return new ConfigurationSubscription(subscription.getId(), - subscription.getMtaId(), - subscription.getSpaceId(), - newAppName, - subscription.getFilter(), - subscription.getModuleDto(), - subscription.getResourceDto(), - subscription.getModuleId(), - subscription.getResourceId()); - } - private List getMtaAndExistingServices() { var serviceNamesGetter = getAppBoundServiceInstanceNamesGetter(context); return Stream.of(app.getServices(), serviceNamesGetter.getServiceInstanceNamesBoundToApp(existingApp.getGuid())) diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java new file mode 100644 index 0000000000..aee843d5d3 --- /dev/null +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/RemoveNewApplicationsSuffixStep.java @@ -0,0 +1,75 @@ +package org.cloudfoundry.multiapps.controller.process.steps; + +import java.util.List; + +import jakarta.inject.Inject; +import jakarta.inject.Named; +import org.cloudfoundry.multiapps.controller.client.facade.CloudControllerClient; +import org.cloudfoundry.multiapps.controller.core.model.BlueGreenApplicationNameSuffix; +import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationSubscription; +import org.cloudfoundry.multiapps.controller.persistence.services.ConfigurationSubscriptionService; +import org.cloudfoundry.multiapps.controller.process.Messages; +import org.cloudfoundry.multiapps.controller.process.variables.Variables; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Scope; + +@Named("removeNewApplicationsSuffixStep") +@Scope(BeanDefinition.SCOPE_PROTOTYPE) +public class RemoveNewApplicationsSuffixStep extends SyncFlowableStep { + + @Inject + private ConfigurationSubscriptionService subscriptionService; + + @Override + protected StepPhase executeStep(ProcessContext context) { + if (!context.getVariable(Variables.KEEP_ORIGINAL_APP_NAMES_AFTER_DEPLOY)) { + return StepPhase.DONE; + } + + List appsToProcess = context.getVariable(Variables.APPS_TO_DEPLOY); + CloudControllerClient client = context.getControllerClient(); + + for (String appName : appsToProcess) { + String newName = BlueGreenApplicationNameSuffix.removeSuffix(appName); + getStepLogger().info(Messages.RENAMING_APPLICATION_0_TO_1, appName, newName); + client.rename(appName, newName); + } + + String mtaId = context.getVariable(Variables.MTA_ID); + String spaceId = context.getVariable(Variables.SPACE_GUID); + updateConfigurationSubscribers(appsToProcess, mtaId, spaceId); + + return StepPhase.DONE; + } + + private void updateConfigurationSubscribers(List appsToProcess, String mtaId, String spaceId) { + List subscriptions = subscriptionService.createQuery() + .mtaId(mtaId) + .spaceId(spaceId) + .list(); + for (ConfigurationSubscription subscription : subscriptions) { + if (appsToProcess.contains(subscription.getAppName())) { + String newAppName = BlueGreenApplicationNameSuffix.removeSuffix(subscription.getAppName()); + getStepLogger().debug(Messages.UPDATING_CONFIGURATION_SUBSCRIPTION_0_WITH_NAME_1, subscription.getAppName(), newAppName); + updateConfigurationSubscription(subscription, newAppName); + } + } + } + + private void updateConfigurationSubscription(ConfigurationSubscription subscription, String newAppName) { + ConfigurationSubscription newSubscription = createNewSubscription(subscription, newAppName); + subscriptionService.update(subscription, newSubscription); + } + + private ConfigurationSubscription createNewSubscription(ConfigurationSubscription subscription, String newAppName) { + return new ConfigurationSubscription(subscription.getId(), subscription.getMtaId(), subscription.getSpaceId(), newAppName, + subscription.getFilter(), subscription.getModuleDto(), subscription.getResourceDto(), + subscription.getModuleId(), subscription.getResourceId()); + } + + @Override + protected String getStepErrorMessage(ProcessContext context) { + return Messages.ERROR_RENAMING_NEW_APPLICATIONS; + } + +} diff --git a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java index 3dba3e9306..7228b15780 100644 --- a/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java +++ b/multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/StepsUtil.java @@ -216,7 +216,7 @@ static ApplicationCloudModelBuilder getApplicationCloudModelBuilder(ProcessConte shouldApplyIncrementalInstancesUpdate(context)); } - public static AppSuffixDeterminer getAppSuffixDeterminer(ProcessContext context) { + static AppSuffixDeterminer getAppSuffixDeterminer(ProcessContext context) { boolean keepOriginalNamesAfterDeploy = context.getVariable(Variables.KEEP_ORIGINAL_APP_NAMES_AFTER_DEPLOY); boolean isAfterResumePhase = context.getVariable(Variables.PHASE) == Phase.AFTER_RESUME; return new AppSuffixDeterminer(keepOriginalNamesAfterDeploy, isAfterResumePhase); diff --git a/multiapps-controller-process/src/main/resources/org/cloudfoundry/multiapps/controller/process/xs2-bg-deploy.bpmn b/multiapps-controller-process/src/main/resources/org/cloudfoundry/multiapps/controller/process/xs2-bg-deploy.bpmn index b50086161f..0764bbbfa7 100644 --- a/multiapps-controller-process/src/main/resources/org/cloudfoundry/multiapps/controller/process/xs2-bg-deploy.bpmn +++ b/multiapps-controller-process/src/main/resources/org/cloudfoundry/multiapps/controller/process/xs2-bg-deploy.bpmn @@ -133,6 +133,7 @@ + @@ -218,14 +219,19 @@ + + + + + @@ -234,10 +240,6 @@ - - - - @@ -383,7 +385,7 @@ - + @@ -403,6 +405,9 @@ + + + @@ -422,10 +427,10 @@ - + - + @@ -434,9 +439,10 @@ - - - + + + + @@ -470,9 +476,9 @@ - - - + + + @@ -491,8 +497,8 @@ - - + + @@ -541,25 +547,29 @@ - - - + + + - - - + + + - - - + + + + + + + @@ -567,9 +577,9 @@ - - - + + + @@ -623,9 +633,9 @@ - - - + + + @@ -657,36 +667,36 @@ - - + + - - - + + + - - - + + + - - + + - - - - + + + + @@ -695,9 +705,9 @@ - - - + + + @@ -745,9 +755,9 @@ - - - + + + diff --git a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java index 78f20b5f65..81dec8e5a0 100644 --- a/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java +++ b/multiapps-controller-process/src/test/java/org/cloudfoundry/multiapps/controller/process/steps/CreateOrUpdateStepWithExistingAppTest.java @@ -28,17 +28,12 @@ import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended; import org.cloudfoundry.multiapps.controller.core.Constants; import org.cloudfoundry.multiapps.controller.core.cf.clients.AppBoundServiceInstanceNamesGetter; -import org.cloudfoundry.multiapps.controller.core.model.Phase; import org.cloudfoundry.multiapps.controller.core.util.ApplicationURI; -import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationSubscription; -import org.cloudfoundry.multiapps.controller.persistence.query.ConfigurationSubscriptionQuery; -import org.cloudfoundry.multiapps.controller.persistence.services.ConfigurationSubscriptionService; import org.cloudfoundry.multiapps.controller.process.variables.Variables; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import org.mockito.Answers; import org.mockito.Mock; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -64,10 +59,6 @@ class CreateOrUpdateStepWithExistingAppTest extends SyncFlowableStepTest testHandleStagingApplicationAttributes() { return Stream.of( @@ -226,7 +217,7 @@ private void prepareClient(CloudApplication application, Set routes, when(appServicesGetter.getServiceInstanceNamesBoundToApp(any())).thenReturn(services); when(client.getApplicationEnvironment(application.getGuid())).thenReturn(env); application = prepareAppWithStaging(application, staging); - when(client.getApplication(application.getName(), false)).thenReturn(application); + when(client.getApplication(APP_NAME, false)).thenReturn(application); when(client.getApplicationSshEnabled(application.getGuid())).thenReturn(staging.isSshEnabled() != null && staging.isSshEnabled()); when(client.getApplicationRoutes(application.getGuid())).thenReturn(List.copyOf(routes)); String command = staging.getCommand() == null ? DEFAULT_COMMAND : staging.getCommand(); @@ -480,32 +471,6 @@ private Map buildExpectedEnvWithDeployAttributes(Map { + + @Mock + private ConfigurationSubscriptionService subscriptionService; + + @Mock(answer = Answers.RETURNS_SELF) + private ConfigurationSubscriptionQuery query; + + @BeforeEach + void setUp() { + context.setVariable(Variables.KEEP_ORIGINAL_APP_NAMES_AFTER_DEPLOY, true); + Mockito.when(query.list()) + .thenReturn(Collections.emptyList()); + Mockito.when(subscriptionService.createQuery()) + .thenReturn(query); + } + + @Test + void testExecuteWithNoAppsToDeploy() { + context.setVariable(Variables.APPS_TO_DEPLOY, Collections.emptyList()); + + step.execute(execution); + assertStepFinishedSuccessfully(); + + Mockito.verify(client, Mockito.never()) + .rename(Mockito.anyString(), Mockito.anyString()); + } + + @Test + void testExecuteRenamesApps() { + List apps = List.of("a-idle", "b-idle"); + context.setVariable(Variables.APPS_TO_DEPLOY, apps); + + step.execute(execution); + assertStepFinishedSuccessfully(); + + for (String app : apps) { + Mockito.verify(client) + .rename(app, removeAppNameSuffix(app)); + } + } + + @Test + void testUpdatingOfConfigurationSubscriptions() { + Mockito.when(query.list()) + .thenReturn(List.of(new ConfigurationSubscription(0, "", "", "a-idle", null, null, null, null, null))); + Mockito.when(subscriptionService.createQuery()) + .thenReturn(query); + + context.setVariable(Variables.APPS_TO_DEPLOY, List.of("a-idle")); + + step.execute(execution); + assertStepFinishedSuccessfully(); + + Mockito.verify(subscriptionService) + .update(Mockito.any(), Mockito.eq(new ConfigurationSubscription(0, "", "", "a", null, null, null, null, null))); + } + + private static String removeAppNameSuffix(String appName) { + return appName.substring(0, appName.lastIndexOf('-')); + } + + @Override + protected RemoveNewApplicationsSuffixStep createStep() { + return new RemoveNewApplicationsSuffixStep(); + } + +} diff --git a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ApplicationShutdownResource.java b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ApplicationShutdownResource.java index a69b9c5a24..dcfce4e70a 100644 --- a/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ApplicationShutdownResource.java +++ b/multiapps-controller-web/src/main/java/org/cloudfoundry/multiapps/controller/web/resources/ApplicationShutdownResource.java @@ -3,7 +3,6 @@ import java.text.MessageFormat; import java.util.concurrent.CompletableFuture; -import jakarta.inject.Inject; import org.cloudfoundry.multiapps.controller.core.Messages; import org.cloudfoundry.multiapps.controller.core.model.ApplicationShutdown; import org.cloudfoundry.multiapps.controller.core.model.ImmutableApplicationShutdown; @@ -18,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import jakarta.inject.Inject; + @RestController @RequestMapping(value = Constants.Resources.APPLICATION_SHUTDOWN) public class ApplicationShutdownResource { @@ -29,18 +30,17 @@ public class ApplicationShutdownResource { @PostMapping(produces = { MediaType.APPLICATION_JSON_VALUE }) public ApplicationShutdown - shutdownFlowableJobExecutor(@RequestHeader(name = "x-cf-applicationid", required = false) String applicationId, - @RequestHeader(name = "x-cf-instanceid", required = false) String applicationInstanceId, - @RequestHeader(name = "x-cf-instanceindex", required = false) String applicationInstanceIndex) { + shutdownFlowableJobExecutor(@RequestHeader(name = "x-cf-applicationid", required = false) String applicationId, + @RequestHeader(name = "x-cf-instanceid", required = false) String applicationInstanceId, + @RequestHeader(name = "x-cf-instanceindex", required = false) String applicationInstanceIndex) { CompletableFuture.runAsync(() -> { - LOGGER.info(MessageFormat.format(Messages.APP_SHUTDOWN_REQUEST, applicationId, applicationInstanceId, - applicationInstanceIndex)); - flowableFacade.shutdownJobExecutor(); - }) - .thenRun(() -> LOGGER.info( - MessageFormat.format(Messages.APP_SUCCESSFULLY_SHUTDOWN, applicationId, applicationInstanceId, - applicationInstanceIndex))); + LOGGER.info(MessageFormat.format(Messages.APP_SHUTDOWN_REQUEST, applicationId, applicationInstanceId, + applicationInstanceIndex)); + flowableFacade.shutdownJobExecutor(); + }) + .thenRun(() -> LOGGER.info(MessageFormat.format(Messages.APP_SHUTDOWNED, applicationId, applicationInstanceId, + applicationInstanceIndex))); return ImmutableApplicationShutdown.builder() .status(getShutdownStatus()) @@ -56,14 +56,13 @@ private ApplicationShutdown.Status getShutdownStatus() { @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE) public ApplicationShutdown - getFlowableJobExecutorShutdownStatus(@RequestHeader(name = "x-cf-applicationid", required = false) String applicationId, - @RequestHeader(name = "x-cf-instanceid", required = false) String applicationInstanceId, - @RequestHeader(name = "x-cf-instanceindex", required = false) String applicationInstanceIndex) { + getFlowableJobExecutorShutdownStatus(@RequestHeader(name = "x-cf-applicationid", required = false) String applicationId, + @RequestHeader(name = "x-cf-instanceid", required = false) String applicationInstanceId, + @RequestHeader(name = "x-cf-instanceindex", required = false) String applicationInstanceIndex) { ApplicationShutdown applicationShutdown = ImmutableApplicationShutdown.builder() .status(getShutdownStatus()) - .applicationInstanceIndex( - Integer.parseInt(applicationInstanceIndex)) + .applicationInstanceIndex(Integer.parseInt(applicationInstanceIndex)) .applicationId(applicationId) .applicationInstanceId(applicationInstanceId) .build();