From d17a9b7c80ba98f02402619823e273307ed43b15 Mon Sep 17 00:00:00 2001 From: t-kikuc Date: Mon, 8 Jul 2024 18:06:48 +0900 Subject: [PATCH] Add a flag ignoreDesiredCountOnUpdate into each func Signed-off-by: t-kikuc --- pkg/app/piped/executor/ecs/deploy.go | 15 ++++++++++----- pkg/app/piped/executor/ecs/ecs.go | 17 +++++++++-------- pkg/app/piped/executor/ecs/rollback.go | 7 ++++--- pkg/app/piped/platformprovider/ecs/ecs.go | 2 +- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/pkg/app/piped/executor/ecs/deploy.go b/pkg/app/piped/executor/ecs/deploy.go index 90d697a09c..8aab4c501e 100644 --- a/pkg/app/piped/executor/ecs/deploy.go +++ b/pkg/app/piped/executor/ecs/deploy.go @@ -109,7 +109,8 @@ func (e *deployExecutor) ensureSync(ctx context.Context) model.StageStatus { } recreate := e.appCfg.QuickSync.Recreate - if !sync(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, recreate, taskDefinition, servicedefinition, primary) { + ignoreDesiredCountOnUpdate := *e.appCfg.Input.IgnoreDesiredCountOnUpdate + if !sync(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, recreate, taskDefinition, servicedefinition, primary, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } @@ -126,6 +127,8 @@ func (e *deployExecutor) ensurePrimaryRollout(ctx context.Context) model.StageSt return model.StageStatus_STAGE_FAILURE } + ignoreDesiredCountOnUpdate := *e.appCfg.Input.IgnoreDesiredCountOnUpdate + switch e.appCfg.Input.AccessType { case config.AccessTypeELB: primary, _, ok := loadTargetGroups(&e.Input, e.appCfg, e.deploySource) @@ -137,12 +140,12 @@ func (e *deployExecutor) ensurePrimaryRollout(ctx context.Context) model.StageSt return model.StageStatus_STAGE_FAILURE } - if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, primary) { + if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, primary, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } case config.AccessTypeServiceDiscovery: // Target groups are not used. - if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, nil) { + if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, nil, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } default: @@ -163,6 +166,8 @@ func (e *deployExecutor) ensureCanaryRollout(ctx context.Context) model.StageSta return model.StageStatus_STAGE_FAILURE } + ignoreDesiredCountOnUpdate := *e.appCfg.Input.IgnoreDesiredCountOnUpdate + switch e.appCfg.Input.AccessType { case config.AccessTypeELB: _, canary, ok := loadTargetGroups(&e.Input, e.appCfg, e.deploySource) @@ -174,12 +179,12 @@ func (e *deployExecutor) ensureCanaryRollout(ctx context.Context) model.StageSta return model.StageStatus_STAGE_FAILURE } - if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, canary) { + if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, canary, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } case config.AccessTypeServiceDiscovery: // Target groups are not used. - if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, nil) { + if !rollout(ctx, &e.Input, e.platformProviderName, e.platformProviderCfg, taskDefinition, servicedefinition, nil, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } default: diff --git a/pkg/app/piped/executor/ecs/ecs.go b/pkg/app/piped/executor/ecs/ecs.go index 04a0567758..af5b005b81 100644 --- a/pkg/app/piped/executor/ecs/ecs.go +++ b/pkg/app/piped/executor/ecs/ecs.go @@ -146,7 +146,8 @@ func applyTaskDefinition(ctx context.Context, cli provider.Client, taskDefinitio return td, nil } -func applyServiceDefinition(ctx context.Context, cli provider.Client, serviceDefinition types.Service) (*types.Service, error) { +// The parameter `ignoreDesiredCountOnUpdate` is only used when updating the service, not for creating it. +func applyServiceDefinition(ctx context.Context, cli provider.Client, serviceDefinition types.Service, ignoreDesiredCountOnUpdate bool) (*types.Service, error) { found, err := cli.ServiceExists(ctx, *serviceDefinition.ClusterArn, *serviceDefinition.ServiceName) if err != nil { return nil, fmt.Errorf("unable to validate service name %s: %w", *serviceDefinition.ServiceName, err) @@ -154,7 +155,7 @@ func applyServiceDefinition(ctx context.Context, cli provider.Client, serviceDef var service *types.Service if found { - service, err = cli.UpdateService(ctx, serviceDefinition) + service, err = cli.UpdateService(ctx, serviceDefinition, ignoreDesiredCountOnUpdate) if err != nil { return nil, fmt.Errorf("failed to update ECS service %s: %w", *serviceDefinition.ServiceName, err) } @@ -253,7 +254,7 @@ func createPrimaryTaskSet(ctx context.Context, client provider.Client, service t return nil } -func sync(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, recreate bool, taskDefinition types.TaskDefinition, serviceDefinition types.Service, targetGroup *types.LoadBalancer) bool { +func sync(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, recreate bool, taskDefinition types.TaskDefinition, serviceDefinition types.Service, targetGroup *types.LoadBalancer, ignoreDesiredCountOnUpdate bool) bool { client, err := provider.DefaultRegistry().Client(platformProviderName, platformProviderCfg, in.Logger) if err != nil { in.LogPersister.Errorf("Unable to create ECS client for the provider %s: %v", platformProviderName, err) @@ -268,7 +269,7 @@ func sync(ctx context.Context, in *executor.Input, platformProviderName string, } in.LogPersister.Infof("Start applying the ECS service definition") - service, err := applyServiceDefinition(ctx, client, serviceDefinition) + service, err := applyServiceDefinition(ctx, client, serviceDefinition, ignoreDesiredCountOnUpdate) if err != nil { in.LogPersister.Errorf("Failed to apply service %s: %v", *serviceDefinition.ServiceName, err) return false @@ -279,7 +280,7 @@ func sync(ctx context.Context, in *executor.Input, platformProviderName string, // Scale down the service tasks by set it to 0 in.LogPersister.Infof("Scale down ECS desired tasks count to 0") service.DesiredCount = 0 - if _, err = client.UpdateService(ctx, *service); err != nil { + if _, err = client.UpdateService(ctx, *service, false); err != nil { in.LogPersister.Errorf("Failed to stop service tasks: %v", err) return false } @@ -293,7 +294,7 @@ func sync(ctx context.Context, in *executor.Input, platformProviderName string, // Scale up the service tasks count back to its desired. in.LogPersister.Infof("Scale up ECS desired tasks count back to %d", cnt) service.DesiredCount = cnt - if _, err = client.UpdateService(ctx, *service); err != nil { + if _, err = client.UpdateService(ctx, *service, false); err != nil { in.LogPersister.Errorf("Failed to turning back service tasks: %v", err) return false } @@ -315,7 +316,7 @@ func sync(ctx context.Context, in *executor.Input, platformProviderName string, return true } -func rollout(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, taskDefinition types.TaskDefinition, serviceDefinition types.Service, targetGroup *types.LoadBalancer) bool { +func rollout(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, taskDefinition types.TaskDefinition, serviceDefinition types.Service, targetGroup *types.LoadBalancer, ignoreDesiredCountOnUpdate bool) bool { client, err := provider.DefaultRegistry().Client(platformProviderName, platformProviderCfg, in.Logger) if err != nil { in.LogPersister.Errorf("Unable to create ECS client for the provider %s: %v", platformProviderName, err) @@ -330,7 +331,7 @@ func rollout(ctx context.Context, in *executor.Input, platformProviderName strin } in.LogPersister.Infof("Start applying the ECS service definition") - service, err := applyServiceDefinition(ctx, client, serviceDefinition) + service, err := applyServiceDefinition(ctx, client, serviceDefinition, ignoreDesiredCountOnUpdate) if err != nil { in.LogPersister.Errorf("Failed to apply service %s: %v", *serviceDefinition.ServiceName, err) return false diff --git a/pkg/app/piped/executor/ecs/rollback.go b/pkg/app/piped/executor/ecs/rollback.go index 4f4bcb9697..86fae35a78 100644 --- a/pkg/app/piped/executor/ecs/rollback.go +++ b/pkg/app/piped/executor/ecs/rollback.go @@ -87,14 +87,15 @@ func (e *rollbackExecutor) ensureRollback(ctx context.Context) model.StageStatus return model.StageStatus_STAGE_FAILURE } - if !rollback(ctx, &e.Input, platformProviderName, platformProviderCfg, taskDefinition, serviceDefinition, primary, canary) { + ignoreDesiredCountOnUpdate := *appCfg.Input.IgnoreDesiredCountOnUpdate + if !rollback(ctx, &e.Input, platformProviderName, platformProviderCfg, taskDefinition, serviceDefinition, primary, canary, ignoreDesiredCountOnUpdate) { return model.StageStatus_STAGE_FAILURE } return model.StageStatus_STAGE_SUCCESS } -func rollback(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, taskDefinition types.TaskDefinition, serviceDefinition types.Service, primaryTargetGroup *types.LoadBalancer, canaryTargetGroup *types.LoadBalancer) bool { +func rollback(ctx context.Context, in *executor.Input, platformProviderName string, platformProviderCfg *config.PlatformProviderECSConfig, taskDefinition types.TaskDefinition, serviceDefinition types.Service, primaryTargetGroup *types.LoadBalancer, canaryTargetGroup *types.LoadBalancer, ignoreDesiredCountOnUpdate bool) bool { in.LogPersister.Infof("Start rollback the ECS service and task family: %s and %s to original stage", *serviceDefinition.ServiceName, *taskDefinition.Family) client, err := provider.DefaultRegistry().Client(platformProviderName, platformProviderCfg, in.Logger) if err != nil { @@ -112,7 +113,7 @@ func rollback(ctx context.Context, in *executor.Input, platformProviderName stri } // Rollback ECS service configuration to previous state including commit-hash of the tag. - service, err := applyServiceDefinition(ctx, client, serviceDefinition) + service, err := applyServiceDefinition(ctx, client, serviceDefinition, ignoreDesiredCountOnUpdate) if err != nil { in.LogPersister.Errorf("Unable to rollback ECS service %s configuration to previous stage: %v", *serviceDefinition.ServiceName, err) return false diff --git a/pkg/app/piped/platformprovider/ecs/ecs.go b/pkg/app/piped/platformprovider/ecs/ecs.go index 6814b8f6ac..028282fd8b 100644 --- a/pkg/app/piped/platformprovider/ecs/ecs.go +++ b/pkg/app/piped/platformprovider/ecs/ecs.go @@ -44,7 +44,7 @@ type Client interface { type ECS interface { ServiceExists(ctx context.Context, clusterName string, servicesName string) (bool, error) CreateService(ctx context.Context, service types.Service) (*types.Service, error) - UpdateService(ctx context.Context, service types.Service) (*types.Service, error) + UpdateService(ctx context.Context, service types.Service, ignoreDesiredCount bool) (*types.Service, error) WaitServiceStable(ctx context.Context, service types.Service) error RegisterTaskDefinition(ctx context.Context, taskDefinition types.TaskDefinition) (*types.TaskDefinition, error) RunTask(ctx context.Context, taskDefinition types.TaskDefinition, clusterArn string, launchType string, awsVpcConfiguration *config.ECSVpcConfiguration, tags []types.Tag) error