Skip to content

Commit 7089ee3

Browse files
authored
Add new bg deploy stop order (#1761)
LMCROSSITXSADEPLOY-3367
1 parent 48b0ea4 commit 7089ee3

File tree

17 files changed

+1508
-407
lines changed

17 files changed

+1508
-407
lines changed

multiapps-controller-core/src/main/java/org/cloudfoundry/multiapps/controller/core/model/SupportedParameters.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class SupportedParameters {
3737
public static final String APPLY_NAMESPACE_APPS = "app-names";
3838
public static final String APPLY_NAMESPACE_SERVICES = "service-names";
3939
public static final String APPLY_NAMESPACE_ROUTES = "app-routes";
40-
40+
public static final String BG_DEPENDENCY_AWARE_STOP_ORDER = "bg-dependency-aware-stop-order";
4141
public static final String DEPLOY_MODE = "deploy_mode";
4242

4343
public static final String PATH = "path";
@@ -212,7 +212,7 @@ public class SupportedParameters {
212212
FAIL_ON_SERVICE_UPDATE, SERVICE_PROVIDER, SERVICE_VERSION);
213213
public static final Set<String> GLOBAL_PARAMETERS = Set.of(KEEP_EXISTING_ROUTES, APPS_UPLOAD_TIMEOUT, APPS_TASK_EXECUTION_TIMEOUT,
214214
APPS_START_TIMEOUT, APPS_STAGE_TIMEOUT, APPLY_NAMESPACE,
215-
ENABLE_PARALLEL_DEPLOYMENTS, DEPLOY_MODE);
215+
ENABLE_PARALLEL_DEPLOYMENTS, DEPLOY_MODE, BG_DEPENDENCY_AWARE_STOP_ORDER);
216216

217217
public static final Set<String> DEPENDENCY_PARAMETERS = Set.of(BINDING_NAME, ENV_VAR_NAME, VISIBILITY, USE_LIVE_ROUTES,
218218
SERVICE_BINDING_CONFIG, DELETE_SERVICE_KEY_AFTER_DEPLOYMENT);

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/Messages.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ public class Messages {
194194
public static final String ERROR_WHILE_DETERMINING_SERVICE_KEYS_TO_RECREATE = "Error while determining service keys to recreate";
195195
public static final String ERROR_WHILE_UPDATING_SERVICE_KEYS_METADATA = "Error while updating service keys metadata";
196196
public static final String ERROR_WHILE_POLLING_SERVICE_KEY_OPERATION_0 = "Error while polling service key operation \"{0}\"";
197+
public static final String ERROR_WHILE_STOPPING_DEPENDENT_MODULE = "Failed to stop dependent module with name \"{0}\"";
198+
public static final String ERROR_WHILE_CONFIGURING_STOPPING_OF_DEPENDENT_MODULES = "Failed while configuring the stopping of dependent modules \"{0}\"";
197199

198200
public static final String ERROR_WHILE_BACKUP_APPLICATION = "Error while backup applcation \"{0}\"";
199201
public static final String ERROR_DURING_PREPARATION_BACKUP_MTA = "Error during preparation backup mta for rollback deployment";
@@ -270,6 +272,8 @@ public class Messages {
270272
public static final String SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" parameters update failed, ignoring failure...";
271273
public static final String SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" tags update failed, ignoring failure...";
272274
public static final String ONLY_FIRST_SERVICE_WILL_BE_CREATED = "Only the first service will be created because the provided 'service-name' fields are duplicated! All other services with the same 'service-name' will be ignored! Duplicated names: {0}";
275+
public static final String BLUE_GREEN_SKIPPING_DEPENDENCY_ORDER_STOP = "Skipping stopping modules in dependency-aware order. This feature is available for blue green deployment strategy.";
276+
public static final String UNSUPPORTED_DEPLOYED_AFTER_SCHEMA_VERSION_WARNING = "Skipping module \"{0}\": major schema version \"{1}\" does not support 'deployed-after' (minimum supported version is \"{2}\").";
273277

274278
// INFO log messages
275279
public static final String ACQUIRING_LOCK = "Process \"{0}\" attempting to acquire lock for operation on MTA \"{1}\"";

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/metadata/BlueGreenDeployMetadata.java

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,26 @@ public static OperationMetadata getMetadata() {
4040
.addParameter(ImmutableParameterMetadata.builder()
4141
.id(Variables.APPLY_NAMESPACE_APP_NAMES.getName())
4242
.type(ParameterType.BOOLEAN)
43-
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_APP_NAMES))
43+
.customConverter(new ApplyNamespaceParameterConverter(
44+
Variables.APPLY_NAMESPACE_APP_NAMES))
4445
.build())
4546
.addParameter(ImmutableParameterMetadata.builder()
4647
.id(Variables.APPLY_NAMESPACE_SERVICE_NAMES.getName())
4748
.type(ParameterType.BOOLEAN)
48-
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_SERVICE_NAMES))
49+
.customConverter(new ApplyNamespaceParameterConverter(
50+
Variables.APPLY_NAMESPACE_SERVICE_NAMES))
4951
.build())
5052
.addParameter(ImmutableParameterMetadata.builder()
5153
.id(Variables.APPLY_NAMESPACE_APP_ROUTES.getName())
5254
.type(ParameterType.BOOLEAN)
53-
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_APP_ROUTES))
55+
.customConverter(new ApplyNamespaceParameterConverter(
56+
Variables.APPLY_NAMESPACE_APP_ROUTES))
5457
.build())
5558
.addParameter(ImmutableParameterMetadata.builder()
5659
.id(Variables.APPLY_NAMESPACE_AS_SUFFIX.getName())
5760
.type(ParameterType.BOOLEAN)
58-
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_AS_SUFFIX))
61+
.customConverter(new ApplyNamespaceParameterConverter(
62+
Variables.APPLY_NAMESPACE_AS_SUFFIX))
5963
.build())
6064
.addParameter(ImmutableParameterMetadata.builder()
6165
.id(Variables.VERSION_RULE.getName())
@@ -105,22 +109,26 @@ public static OperationMetadata getMetadata() {
105109
.addParameter(ImmutableParameterMetadata.builder()
106110
.id(Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE.getName())
107111
.type(ParameterType.INTEGER)
108-
.customConverter(new TimeoutParameterConverter(Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE))
112+
.customConverter(new TimeoutParameterConverter(
113+
Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE))
109114
.build())
110115
.addParameter(ImmutableParameterMetadata.builder()
111116
.id(Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE.getName())
112117
.type(ParameterType.INTEGER)
113-
.customConverter(new TimeoutParameterConverter(Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE))
118+
.customConverter(new TimeoutParameterConverter(
119+
Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE))
114120
.build())
115121
.addParameter(ImmutableParameterMetadata.builder()
116122
.id(Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE.getName())
117123
.type(ParameterType.INTEGER)
118-
.customConverter(new TimeoutParameterConverter(Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE))
124+
.customConverter(new TimeoutParameterConverter(
125+
Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE))
119126
.build())
120127
.addParameter(ImmutableParameterMetadata.builder()
121128
.id(Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE.getName())
122129
.type(ParameterType.INTEGER)
123-
.customConverter(new TimeoutParameterConverter(Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE))
130+
.customConverter(new TimeoutParameterConverter(
131+
Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE))
124132
.build())
125133
// Special blue green deploy parameters:
126134
.addParameter(ImmutableParameterMetadata.builder()
@@ -149,6 +157,11 @@ public static OperationMetadata getMetadata() {
149157
.id(Variables.SHOULD_BACKUP_PREVIOUS_VERSION.getName())
150158
.type(ParameterType.BOOLEAN)
151159
.build())
160+
.addParameter(ImmutableParameterMetadata.builder()
161+
.id(Variables.STOP_ORDER_IS_DEPENDENCY_AWARE.getName())
162+
.type(ParameterType.BOOLEAN)
163+
.defaultValue(false)
164+
.build())
152165
.build();
153166
}
154167

multiapps-controller-process/src/main/java/org/cloudfoundry/multiapps/controller/process/steps/BuildApplicationDeployModelStep.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended;
1717
import org.cloudfoundry.multiapps.controller.core.cf.v2.ConfigurationEntriesCloudModelBuilder;
1818
import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper;
19+
import org.cloudfoundry.multiapps.controller.core.model.Phase;
1920
import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters;
2021
import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization;
2122
import org.cloudfoundry.multiapps.controller.core.util.NameUtil;
2223
import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationEntry;
2324
import org.cloudfoundry.multiapps.controller.process.Messages;
2425
import org.cloudfoundry.multiapps.controller.process.util.AdditionalModuleParametersReporter;
2526
import org.cloudfoundry.multiapps.controller.process.util.ApplicationEnvironmentCalculator;
27+
import org.cloudfoundry.multiapps.controller.process.util.DependentModuleStopResolver;
2628
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
2729
import org.cloudfoundry.multiapps.mta.handlers.HandlerFactory;
2830
import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor;
@@ -38,6 +40,8 @@ public class BuildApplicationDeployModelStep extends SyncFlowableStep {
3840
private ModuleToDeployHelper moduleToDeployHelper;
3941
@Inject
4042
private ApplicationEnvironmentCalculator applicationEnvironmentCalculator;
43+
@Inject
44+
private DependentModuleStopResolver moduleStopResolver;
4145

4246
@Override
4347
protected StepPhase executeStep(ProcessContext context) {
@@ -61,6 +65,7 @@ protected StepPhase executeStep(ProcessContext context) {
6165
buildConfigurationEntries(context, modifiedApp);
6266
context.setVariable(Variables.TASKS_TO_EXECUTE, modifiedApp.getTasks());
6367
getStepLogger().debug(Messages.CLOUD_APP_MODEL_BUILT);
68+
determineDependentModulesToStop(context, module);
6469
return StepPhase.DONE;
6570
}
6671

@@ -135,6 +140,14 @@ private ConfigurationEntriesCloudModelBuilder getConfigurationEntriesCloudModelB
135140
return new ConfigurationEntriesCloudModelBuilder(organizationName, spaceName, spaceGuid, namespace);
136141
}
137142

143+
private void determineDependentModulesToStop(ProcessContext context, Module module) {
144+
if (context.getVariable(Variables.PHASE) != Phase.AFTER_RESUME) {
145+
return;
146+
}
147+
List<Module> modulesToStop = moduleStopResolver.resolveDependentModulesToStop(context, module);
148+
context.setVariable(Variables.DEPENDENT_MODULES_TO_STOP, modulesToStop);
149+
}
150+
138151
@Override
139152
protected String getStepErrorMessage(ProcessContext context) {
140153
return Messages.ERROR_BUILDING_CLOUD_APP_MODEL;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package org.cloudfoundry.multiapps.controller.process.steps;
2+
3+
import java.text.MessageFormat;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.Set;
7+
8+
import jakarta.inject.Inject;
9+
import jakarta.inject.Named;
10+
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute;
11+
import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended;
12+
import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended;
13+
import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder;
14+
import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper;
15+
import org.cloudfoundry.multiapps.controller.process.Messages;
16+
import org.cloudfoundry.multiapps.controller.process.util.ApplicationEnvironmentCalculator;
17+
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
18+
import org.cloudfoundry.multiapps.mta.handlers.HandlerFactory;
19+
import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor;
20+
import org.cloudfoundry.multiapps.mta.model.Module;
21+
import org.springframework.beans.factory.config.BeanDefinition;
22+
import org.springframework.context.annotation.Scope;
23+
24+
@Named("prepareToStopDependentModuleStep")
25+
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
26+
public class PrepareToStopDependentModuleStep extends SyncFlowableStep {
27+
28+
private ModuleToDeployHelper moduleToDeployHelper;
29+
30+
private ApplicationEnvironmentCalculator applicationEnvironmentCalculator;
31+
32+
@Inject
33+
public PrepareToStopDependentModuleStep(ModuleToDeployHelper moduleToDeployHelper,
34+
ApplicationEnvironmentCalculator applicationEnvironmentCalculator) {
35+
this.moduleToDeployHelper = moduleToDeployHelper;
36+
this.applicationEnvironmentCalculator = applicationEnvironmentCalculator;
37+
}
38+
39+
@Override
40+
protected StepPhase executeStep(ProcessContext context) {
41+
Module applicationModule = findModuleInDeploymentDescriptor(context, getCurrentModuleToStop(context).getName());
42+
context.setVariable(Variables.MODULE_TO_DEPLOY, applicationModule);
43+
CloudApplicationExtended modifiedApp = getApplicationCloudModelBuilder(context).build(applicationModule, moduleToDeployHelper);
44+
Map<String, String> calculatedAppEnv = applicationEnvironmentCalculator.calculateNewApplicationEnv(context, modifiedApp);
45+
modifiedApp = getCloudApplicationExtended(context, modifiedApp, calculatedAppEnv);
46+
context.setVariable(Variables.APP_TO_PROCESS, modifiedApp);
47+
return StepPhase.DONE;
48+
}
49+
50+
private CloudApplicationExtended getCloudApplicationExtended(ProcessContext context, CloudApplicationExtended modifiedApp,
51+
Map<String, String> calculatedAppEnv) {
52+
return ImmutableCloudApplicationExtended.builder()
53+
.from(modifiedApp)
54+
.staging(modifiedApp.getStaging())
55+
.routes(getApplicationRoutes(context, modifiedApp))
56+
.env(calculatedAppEnv)
57+
.build();
58+
}
59+
60+
protected ApplicationCloudModelBuilder getApplicationCloudModelBuilder(ProcessContext context) {
61+
return StepsUtil.getApplicationCloudModelBuilder(context);
62+
}
63+
64+
@Override
65+
protected String getStepErrorMessage(ProcessContext context) {
66+
return MessageFormat.format(Messages.ERROR_WHILE_STOPPING_DEPENDENT_MODULE, context.getVariable(Variables.APP_TO_PROCESS)
67+
.getName());
68+
}
69+
70+
private Module getCurrentModuleToStop(ProcessContext context) {
71+
List<Module> modules = context.getVariable(Variables.DEPENDENT_MODULES_TO_STOP);
72+
int index = context.getVariable(Variables.APPS_TO_STOP_INDEX);
73+
return modules.get(index);
74+
}
75+
76+
private Module findModuleInDeploymentDescriptor(ProcessContext context, String module) {
77+
HandlerFactory handlerFactory = StepsUtil.getHandlerFactory(context.getExecution());
78+
DeploymentDescriptor deploymentDescriptor = context.getVariable(Variables.COMPLETE_DEPLOYMENT_DESCRIPTOR);
79+
return handlerFactory.getDescriptorHandler()
80+
.findModule(deploymentDescriptor, module);
81+
}
82+
83+
private Set<CloudRoute> getApplicationRoutes(ProcessContext context, CloudApplicationExtended modifiedApp) {
84+
if (Boolean.TRUE.equals(context.getVariable(Variables.USE_IDLE_URIS))) {
85+
return modifiedApp.getIdleRoutes();
86+
}
87+
return modifiedApp.getRoutes();
88+
}
89+
90+
}

0 commit comments

Comments
 (0)