Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public class SupportedParameters {
public static final String APPLY_NAMESPACE_APPS = "app-names";
public static final String APPLY_NAMESPACE_SERVICES = "service-names";
public static final String APPLY_NAMESPACE_ROUTES = "app-routes";

public static final String BG_DEPENDENCY_AWARE_STOP_ORDER = "bg-dependency-aware-stop-order";
public static final String DEPLOY_MODE = "deploy_mode";

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

public static final Set<String> DEPENDENCY_PARAMETERS = Set.of(BINDING_NAME, ENV_VAR_NAME, VISIBILITY, USE_LIVE_ROUTES,
SERVICE_BINDING_CONFIG, DELETE_SERVICE_KEY_AFTER_DEPLOYMENT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,8 @@ public class Messages {
public static final String ERROR_WHILE_DETERMINING_SERVICE_KEYS_TO_RECREATE = "Error while determining service keys to recreate";
public static final String ERROR_WHILE_UPDATING_SERVICE_KEYS_METADATA = "Error while updating service keys metadata";
public static final String ERROR_WHILE_POLLING_SERVICE_KEY_OPERATION_0 = "Error while polling service key operation \"{0}\"";
public static final String ERROR_WHILE_STOPPING_DEPENDENT_MODULES = "Failed to stop dependent module with name \"{0}\"";
public static final String ERROR_WHEN_CONFIGURING_STOPPING_OF_DEPENDENT_MODULES = "Failed when configuring the stopping of dependent modules \"{0}\"";

public static final String ERROR_WHILE_BACKUP_APPLICATION = "Error while backup applcation \"{0}\"";
public static final String ERROR_DURING_PREPARATION_BACKUP_MTA = "Error during preparation backup mta for rollback deployment";
Expand Down Expand Up @@ -271,6 +273,8 @@ public class Messages {
public static final String SERVICE_INSTANCE_0_PARAMETERS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" parameters update failed, ignoring failure...";
public static final String SERVICE_INSTANCE_0_TAGS_UPDATE_FAILED_IGNORING_FAILURE = "Service instance: \"{0}\" tags update failed, ignoring failure...";
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}";
public static final String SKIPPING_DEPENDENCY_ORDER_STOP = "Skipping stopping modules in dependency-aware order. This feature is reserved only for blue green deployment strategy.";
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}\").";

// INFO log messages
public static final String ACQUIRING_LOCK = "Process \"{0}\" attempting to acquire lock for operation on MTA \"{1}\"";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,22 +40,26 @@ public static OperationMetadata getMetadata() {
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPLY_NAMESPACE_APP_NAMES.getName())
.type(ParameterType.BOOLEAN)
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_APP_NAMES))
.customConverter(new ApplyNamespaceParameterConverter(
Variables.APPLY_NAMESPACE_APP_NAMES))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPLY_NAMESPACE_SERVICE_NAMES.getName())
.type(ParameterType.BOOLEAN)
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_SERVICE_NAMES))
.customConverter(new ApplyNamespaceParameterConverter(
Variables.APPLY_NAMESPACE_SERVICE_NAMES))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPLY_NAMESPACE_APP_ROUTES.getName())
.type(ParameterType.BOOLEAN)
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_APP_ROUTES))
.customConverter(new ApplyNamespaceParameterConverter(
Variables.APPLY_NAMESPACE_APP_ROUTES))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPLY_NAMESPACE_AS_SUFFIX.getName())
.type(ParameterType.BOOLEAN)
.customConverter(new ApplyNamespaceParameterConverter(Variables.APPLY_NAMESPACE_AS_SUFFIX))
.customConverter(new ApplyNamespaceParameterConverter(
Variables.APPLY_NAMESPACE_AS_SUFFIX))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.VERSION_RULE.getName())
Expand Down Expand Up @@ -105,22 +109,26 @@ public static OperationMetadata getMetadata() {
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE.getName())
.type(ParameterType.INTEGER)
.customConverter(new TimeoutParameterConverter(Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE))
.customConverter(new TimeoutParameterConverter(
Variables.APPS_START_TIMEOUT_PROCESS_VARIABLE))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE.getName())
.type(ParameterType.INTEGER)
.customConverter(new TimeoutParameterConverter(Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE))
.customConverter(new TimeoutParameterConverter(
Variables.APPS_STAGE_TIMEOUT_PROCESS_VARIABLE))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE.getName())
.type(ParameterType.INTEGER)
.customConverter(new TimeoutParameterConverter(Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE))
.customConverter(new TimeoutParameterConverter(
Variables.APPS_UPLOAD_TIMEOUT_PROCESS_VARIABLE))
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE.getName())
.type(ParameterType.INTEGER)
.customConverter(new TimeoutParameterConverter(Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE))
.customConverter(new TimeoutParameterConverter(
Variables.APPS_TASK_EXECUTION_TIMEOUT_PROCESS_VARIABLE))
.build())
// Special blue green deploy parameters:
.addParameter(ImmutableParameterMetadata.builder()
Expand Down Expand Up @@ -149,6 +157,11 @@ public static OperationMetadata getMetadata() {
.id(Variables.SHOULD_BACKUP_PREVIOUS_VERSION.getName())
.type(ParameterType.BOOLEAN)
.build())
.addParameter(ImmutableParameterMetadata.builder()
.id(Variables.STOP_ORDER_IS_DEPENDENCY_AWARE.getName())
.type(ParameterType.BOOLEAN)
.defaultValue(false)
.build())
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended;
import org.cloudfoundry.multiapps.controller.core.cf.v2.ConfigurationEntriesCloudModelBuilder;
import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper;
import org.cloudfoundry.multiapps.controller.core.model.Phase;
import org.cloudfoundry.multiapps.controller.core.model.SupportedParameters;
import org.cloudfoundry.multiapps.controller.core.security.serialization.SecureSerialization;
import org.cloudfoundry.multiapps.controller.core.util.NameUtil;
import org.cloudfoundry.multiapps.controller.persistence.model.ConfigurationEntry;
import org.cloudfoundry.multiapps.controller.process.Messages;
import org.cloudfoundry.multiapps.controller.process.util.AdditionalModuleParametersReporter;
import org.cloudfoundry.multiapps.controller.process.util.ApplicationEnvironmentCalculator;
import org.cloudfoundry.multiapps.controller.process.util.DependentModuleStopResolver;
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
import org.cloudfoundry.multiapps.mta.handlers.HandlerFactory;
import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor;
Expand All @@ -38,6 +40,8 @@ public class BuildApplicationDeployModelStep extends SyncFlowableStep {
private ModuleToDeployHelper moduleToDeployHelper;
@Inject
private ApplicationEnvironmentCalculator applicationEnvironmentCalculator;
@Inject
private DependentModuleStopResolver moduleStopResolver;

@Override
protected StepPhase executeStep(ProcessContext context) {
Expand All @@ -61,6 +65,7 @@ protected StepPhase executeStep(ProcessContext context) {
buildConfigurationEntries(context, modifiedApp);
context.setVariable(Variables.TASKS_TO_EXECUTE, modifiedApp.getTasks());
getStepLogger().debug(Messages.CLOUD_APP_MODEL_BUILT);
determineDependentModulesToStop(context, module);
return StepPhase.DONE;
}

Expand Down Expand Up @@ -135,6 +140,14 @@ private ConfigurationEntriesCloudModelBuilder getConfigurationEntriesCloudModelB
return new ConfigurationEntriesCloudModelBuilder(organizationName, spaceName, spaceGuid, namespace);
}

private void determineDependentModulesToStop(ProcessContext context, Module module) {
if (context.getVariable(Variables.PHASE) != Phase.AFTER_RESUME) {
return;
}
List<Module> modulesToStop = moduleStopResolver.resolveDependentModulesToStop(context, module);
context.setVariable(Variables.DEPENDENT_MODULES_TO_STOP, modulesToStop);
}

@Override
protected String getStepErrorMessage(ProcessContext context) {
return Messages.ERROR_BUILDING_CLOUD_APP_MODEL;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package org.cloudfoundry.multiapps.controller.process.steps;

import java.text.MessageFormat;
import java.util.List;
import java.util.Map;
import java.util.Set;

import jakarta.inject.Inject;
import jakarta.inject.Named;
import org.cloudfoundry.multiapps.controller.client.facade.domain.CloudRoute;
import org.cloudfoundry.multiapps.controller.client.lib.domain.CloudApplicationExtended;
import org.cloudfoundry.multiapps.controller.client.lib.domain.ImmutableCloudApplicationExtended;
import org.cloudfoundry.multiapps.controller.core.cf.v2.ApplicationCloudModelBuilder;
import org.cloudfoundry.multiapps.controller.core.helpers.ModuleToDeployHelper;
import org.cloudfoundry.multiapps.controller.process.Messages;
import org.cloudfoundry.multiapps.controller.process.util.ApplicationEnvironmentCalculator;
import org.cloudfoundry.multiapps.controller.process.variables.Variables;
import org.cloudfoundry.multiapps.mta.handlers.HandlerFactory;
import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor;
import org.cloudfoundry.multiapps.mta.model.Module;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.Scope;

@Named("prepareToStopDependentModuleStep")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public class PrepareToStopDependentModuleStep extends SyncFlowableStep {

private ModuleToDeployHelper moduleToDeployHelper;

private ApplicationEnvironmentCalculator applicationEnvironmentCalculator;

@Inject
public PrepareToStopDependentModuleStep(ModuleToDeployHelper moduleToDeployHelper,
ApplicationEnvironmentCalculator applicationEnvironmentCalculator) {
this.moduleToDeployHelper = moduleToDeployHelper;
this.applicationEnvironmentCalculator = applicationEnvironmentCalculator;
}

@Override
protected StepPhase executeStep(ProcessContext context) {
Module applicationModule = findModuleInDeploymentDescriptor(context, getCurrentModuleToStop(context).getName());
context.setVariable(Variables.MODULE_TO_DEPLOY, applicationModule);
CloudApplicationExtended modifiedApp = getApplicationCloudModelBuilder(context).build(applicationModule, moduleToDeployHelper);
Map<String, String> calculatedAppEnv = applicationEnvironmentCalculator.calculateNewApplicationEnv(context, modifiedApp);
modifiedApp = getCloudApplicationExtended(context, modifiedApp, calculatedAppEnv);
context.setVariable(Variables.APP_TO_PROCESS, modifiedApp);
return StepPhase.DONE;
}

private CloudApplicationExtended getCloudApplicationExtended(ProcessContext context, CloudApplicationExtended modifiedApp,
Map<String, String> calculatedAppEnv) {
return ImmutableCloudApplicationExtended.builder()
.from(modifiedApp)
.staging(modifiedApp.getStaging())
.routes(getApplicationRoutes(context, modifiedApp))
.env(calculatedAppEnv)
.build();
}

protected ApplicationCloudModelBuilder getApplicationCloudModelBuilder(ProcessContext context) {
return StepsUtil.getApplicationCloudModelBuilder(context);
}

@Override
protected String getStepErrorMessage(ProcessContext context) {
return MessageFormat.format(Messages.ERROR_WHILE_STOPPING_DEPENDENT_MODULES, context.getVariable(Variables.APP_TO_PROCESS)
.getName());
}

private Module getCurrentModuleToStop(ProcessContext context) {
List<Module> modules = context.getVariable(Variables.DEPENDENT_MODULES_TO_STOP);
int index = context.getVariable(Variables.APPS_TO_STOP_INDEX);
return modules.get(index);
}

private Module findModuleInDeploymentDescriptor(ProcessContext context, String module) {
HandlerFactory handlerFactory = StepsUtil.getHandlerFactory(context.getExecution());
DeploymentDescriptor deploymentDescriptor = context.getVariable(Variables.COMPLETE_DEPLOYMENT_DESCRIPTOR);
return handlerFactory.getDescriptorHandler()
.findModule(deploymentDescriptor, module);
}

private Set<CloudRoute> getApplicationRoutes(ProcessContext context, CloudApplicationExtended modifiedApp) {
if (Boolean.TRUE.equals(context.getVariable(Variables.USE_IDLE_URIS))) {
return modifiedApp.getIdleRoutes();
}
return modifiedApp.getRoutes();
}

}
Loading