Skip to content

Commit d5c57e9

Browse files
authored
Add dependency aware stop order flag (#253)
LMCROSSITXSADEPLOY-3367
1 parent c621232 commit d5c57e9

4 files changed

Lines changed: 57 additions & 13 deletions

File tree

commands/base_command.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const (
3636
noRestartSubscribedAppsOpt = "no-restart-subscribed-apps"
3737
noFailOnMissingPermissionsOpt = "do-not-fail-on-missing-permissions"
3838
abortOnErrorOpt = "abort-on-error"
39+
dependencyAwareStopOrderOpt = "dependency-aware-stop-order"
3940
retriesOpt = "retries"
4041
namespaceOpt = "namespace"
4142
)

commands/deploy_command.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func (c *DeployCommand) GetPluginCommand() plugin.Command {
146146
util.GetShortOption(taskExecutionTimeoutOpt): "Task execution timeout in seconds",
147147
util.CombineFullAndShortParameters(startTimeoutOpt, timeoutOpt): "Start app timeout in seconds",
148148
util.GetShortOption(shouldBackupPreviousVersionOpt): "(EXPERIMENTAL) (STRATEGY: BLUE-GREEN, INCREMENTAL-BLUE-GREEN) Backup previous version of applications, use new cli command \"rollback-mta\" to rollback to the previous version",
149+
util.GetShortOption(dependencyAwareStopOrderOpt): "(STRATEGY: BLUE-GREEN, INCREMENTAL-BLUE-GREEN) Stop apps in a dependency-aware order during the resume phase of a blue-green deployment",
149150
},
150151
},
151152
}
@@ -225,6 +226,7 @@ func (c *DeployCommand) defineCommandOptions(flags *flag.FlagSet) {
225226
flags.String(uploadTimeoutOpt, "", "")
226227
flags.String(taskExecutionTimeoutOpt, "", "")
227228
flags.Bool(shouldBackupPreviousVersionOpt, false, "")
229+
flags.Bool(dependencyAwareStopOrderOpt, false, "")
228230
}
229231

230232
func (c *DeployCommand) executeInternal(positionalArgs []string, dsHost string, flags *flag.FlagSet, cfTarget util.CloudFoundryTarget) ExecutionStatus {

commands/deployment_strategy.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ type BlueGreenDeployCommandDeploymentStrategy struct {
2424
skipIdleStart bool
2525
incrementalDeploy bool
2626
shouldBackupPreviousVersion bool
27+
dependencyAwareStopOrderOpt bool
2728
}
2829

2930
func (b *BlueGreenDeployCommandDeploymentStrategy) CreateProcessBuilder() *util.ProcessBuilder {
@@ -34,21 +35,22 @@ func (b *BlueGreenDeployCommandDeploymentStrategy) CreateProcessBuilder() *util.
3435
processBuilder.Parameter("keepOriginalAppNamesAfterDeploy", strconv.FormatBool(true))
3536
processBuilder.Parameter("shouldApplyIncrementalInstancesUpdate", strconv.FormatBool(b.incrementalDeploy))
3637
processBuilder.Parameter("shouldBackupPreviousVersion", strconv.FormatBool(b.shouldBackupPreviousVersion))
38+
processBuilder.Parameter("stopOrderIsDependencyAware", strconv.FormatBool(b.dependencyAwareStopOrderOpt))
3739
return processBuilder
3840
}
3941

4042
func NewDeploymentStrategy(flags *flag.FlagSet, typeProvider ProcessTypeProvider) DeploymentStrategy {
4143
if typeProvider.GetProcessType() == (blueGreenDeployCommandProcessTypeProvider{}).GetProcessType() {
42-
return &BlueGreenDeployCommandDeploymentStrategy{GetBoolOpt(noConfirmOpt, flags), GetBoolOpt(skipIdleStart, flags), isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags)}
44+
return &BlueGreenDeployCommandDeploymentStrategy{GetBoolOpt(noConfirmOpt, flags), GetBoolOpt(skipIdleStart, flags), isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags), GetBoolOpt(dependencyAwareStopOrderOpt, flags)}
4345
}
4446
strategy := GetStringOpt(strategyOpt, flags)
4547
if strategy == "default" {
4648
return &DeployCommandDeploymentStrategy{}
4749
}
4850
if GetBoolOpt(skipIdleStart, flags) {
49-
return &BlueGreenDeployCommandDeploymentStrategy{true, true, isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags)}
51+
return &BlueGreenDeployCommandDeploymentStrategy{true, true, isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags), GetBoolOpt(dependencyAwareStopOrderOpt, flags)}
5052
}
51-
return &BlueGreenDeployCommandDeploymentStrategy{GetBoolOpt(skipTestingPhase, flags), false, isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags)}
53+
return &BlueGreenDeployCommandDeploymentStrategy{GetBoolOpt(skipTestingPhase, flags), false, isIncrementalBlueGreen(flags), GetBoolOpt(shouldBackupPreviousVersionOpt, flags), GetBoolOpt(dependencyAwareStopOrderOpt, flags)}
5254
}
5355

5456
func isIncrementalBlueGreen(flags *flag.FlagSet) bool {

commands/deployment_strategy_test.go

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ var _ = Describe("Deployment Strategy", func() {
1616
const keepOriginalNamesAfterDeploy = "keepOriginalAppNamesAfterDeploy"
1717
const skipIdleStart = "skipIdleStart"
1818
const shouldBackupPreviousVersion = "shouldBackupPreviousVersion"
19+
const dependencyAwareStopOrderOpt = "stopOrderIsDependencyAware"
1920

2021
var deployProcessTypeProvider = &fakes.FakeDeployCommandProcessTypeProvider{}
2122
var bgDeployProcessTypeProvider = &fakes.FakeBlueGreenCommandProcessTypeProvider{}
2223

23-
var createFlags = func(noConfirm bool, skipIdleStart bool, strategy string, backupPreviousVersion bool) *flag.FlagSet {
24+
var createFlags = func(noConfirm bool, skipIdleStart bool, strategy string, backupPreviousVersion bool, dependencyAwareStopOption bool) *flag.FlagSet {
2425
flags := flag.NewFlagSet("", flag.ContinueOnError)
2526
flags.SetOutput(io.Discard)
2627

@@ -29,11 +30,12 @@ var _ = Describe("Deployment Strategy", func() {
2930
flags.Bool("skip-testing-phase", true, "")
3031
flags.Bool("skip-idle-start", skipIdleStart, "")
3132
flags.Bool("backup-previous-version", backupPreviousVersion, "")
33+
flags.Bool("dependency-aware-stop-order", dependencyAwareStopOption, "")
3234
return flags
3335
}
3436

3537
var testInputAndOperationProcessTypesMatch = func(provider commands.ProcessTypeProvider) {
36-
flags := createFlags(false, false, "default", false)
38+
flags := createFlags(false, false, "default", false, false)
3739
processBuilder := commands.NewDeploymentStrategy(flags, provider).CreateProcessBuilder()
3840
operation := processBuilder.Build()
3941
Expect(operation.ProcessType).To(Equal(provider.GetProcessType()))
@@ -47,7 +49,7 @@ var _ = Describe("Deployment Strategy", func() {
4749

4850
Context("with a blue-green deploy command and --no-confirm flag", func() {
4951
It("should build a blue-green deploy operation with the noConfirm parameter set to true", func() {
50-
flags := createFlags(true, false, "default", false)
52+
flags := createFlags(true, false, "default", false, false)
5153

5254
processBuilder := commands.NewDeploymentStrategy(flags, bgDeployProcessTypeProvider).CreateProcessBuilder()
5355
operation := processBuilder.Build()
@@ -58,7 +60,7 @@ var _ = Describe("Deployment Strategy", func() {
5860

5961
Context("with a blue-green deploy command and --skip-idle-start flag", func() {
6062
It("should build a blue-green deploy operation with the skipIdleStart parameter set to true", func() {
61-
flags := createFlags(false, true, "default", false)
63+
flags := createFlags(false, true, "default", false, false)
6264

6365
processBuilder := commands.NewDeploymentStrategy(flags, bgDeployProcessTypeProvider).CreateProcessBuilder()
6466
operation := processBuilder.Build()
@@ -75,7 +77,7 @@ var _ = Describe("Deployment Strategy", func() {
7577

7678
Context("with a deploy command with strategy flag set to blue-green", func() {
7779
It("should build a blue-green deploy operation", func() {
78-
flags := createFlags(false, false, "blue-green", false)
80+
flags := createFlags(false, false, "blue-green", false, false)
7981

8082
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
8183
operation := processBuilder.Build()
@@ -87,7 +89,7 @@ var _ = Describe("Deployment Strategy", func() {
8789

8890
Context("with a deploy command with strategy flag set to blue-green and --no-confirm flag present", func() {
8991
It("should build a blue-green deploy operation with the noConfirm parameter set to true", func() {
90-
flags := createFlags(true, false, "blue-green", false)
92+
flags := createFlags(true, false, "blue-green", false, false)
9193

9294
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
9395
operation := processBuilder.Build()
@@ -100,7 +102,7 @@ var _ = Describe("Deployment Strategy", func() {
100102

101103
Context("with a deploy command with strategy flag set to blue-green and skip-idl-start set to true", func() {
102104
It("should build a blue-green deploy operation", func() {
103-
flags := createFlags(false, true, "blue-green", false)
105+
flags := createFlags(false, true, "blue-green", false, false)
104106

105107
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
106108
operation := processBuilder.Build()
@@ -113,7 +115,7 @@ var _ = Describe("Deployment Strategy", func() {
113115

114116
Context("with a deploy command with strategy flag set to blue-green and backup-previous-version set to true", func() {
115117
It("should build a blue-green deploy operation with set backup-previous-version flag", func() {
116-
flags := createFlags(true, false, "blue-green", true)
118+
flags := createFlags(true, false, "blue-green", true, false)
117119

118120
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
119121
operation := processBuilder.Build()
@@ -125,7 +127,7 @@ var _ = Describe("Deployment Strategy", func() {
125127

126128
Context("with a deploy command with strategy flag set to incremental-blue-green and backup-previous-version set to true", func() {
127129
It("should build a blue-green deploy operation with set incremental-blue-green to true and backup-previous-version to true", func() {
128-
flags := createFlags(true, false, "incremental-blue-green", true)
130+
flags := createFlags(true, false, "incremental-blue-green", true, false)
129131

130132
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
131133
operation := processBuilder.Build()
@@ -138,7 +140,7 @@ var _ = Describe("Deployment Strategy", func() {
138140

139141
Context("with a deploy command with default strategy flag and backup-previous-version flag", func() {
140142
It("should build a deploy operation without backup-previous-version flag", func() {
141-
flags := createFlags(false, false, "default", true)
143+
flags := createFlags(false, false, "default", true, false)
142144

143145
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
144146
operation := processBuilder.Build()
@@ -147,4 +149,41 @@ var _ = Describe("Deployment Strategy", func() {
147149
Expect(operation.Parameters).NotTo(HaveKey(shouldBackupPreviousVersion))
148150
})
149151
})
152+
153+
Context("with a deploy command with blue-green strategy flag and dependency-aware-stop-order flag set to true", func() {
154+
It("should build a blue-green deploy operation with the dependency-aware-stop-order parameter set to true", func() {
155+
flags := createFlags(false, false, "blue-green", true, true)
156+
157+
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
158+
operation := processBuilder.Build()
159+
160+
Expect(operation.ProcessType).To(Equal(bgDeployProcessTypeProvider.GetProcessType()))
161+
Expect(operation.Parameters[dependencyAwareStopOrderOpt]).To(Equal(strconv.FormatBool(true)))
162+
})
163+
})
164+
165+
Context("with a deploy command with strategy flag set to incremental-blue-green and dependency-aware-stop-order set to true", func() {
166+
It("should build a blue-green deploy operation with set incremental-blue-green to true and dependency-aware-stop-order to true", func() {
167+
flags := createFlags(false, false, "incremental-blue-green", true, true)
168+
169+
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
170+
operation := processBuilder.Build()
171+
172+
Expect(operation.ProcessType).To(Equal(bgDeployProcessTypeProvider.GetProcessType()))
173+
Expect(operation.Parameters[dependencyAwareStopOrderOpt]).To(Equal(strconv.FormatBool(true)))
174+
Expect(operation.Parameters["shouldApplyIncrementalInstancesUpdate"]).To(Equal(strconv.FormatBool(true)))
175+
})
176+
})
177+
178+
Context("with a deploy command with default strategy flag and dependency-aware-stop-order flag", func() {
179+
It("should build a deploy operation without dependency-aware-stop-order flag", func() {
180+
flags := createFlags(false, false, "default", true, true)
181+
182+
processBuilder := commands.NewDeploymentStrategy(flags, deployProcessTypeProvider).CreateProcessBuilder()
183+
operation := processBuilder.Build()
184+
185+
Expect(operation.ProcessType).To(Equal(deployProcessTypeProvider.GetProcessType()))
186+
Expect(operation.Parameters).NotTo(HaveKey(dependencyAwareStopOrderOpt))
187+
})
188+
})
150189
})

0 commit comments

Comments
 (0)