Skip to content

Commit

Permalink
Add a flag ignoreDesiredCountOnUpdate into each func
Browse files Browse the repository at this point in the history
Signed-off-by: t-kikuc <tkikuchi07f@gmail.com>
  • Loading branch information
t-kikuc committed Jul 8, 2024
1 parent cf3efbf commit d17a9b7
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 17 deletions.
15 changes: 10 additions & 5 deletions pkg/app/piped/executor/ecs/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -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)
Expand All @@ -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:
Expand All @@ -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)
Expand All @@ -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:
Expand Down
17 changes: 9 additions & 8 deletions pkg/app/piped/executor/ecs/ecs.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,16 @@ 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)
}

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)
}
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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)
Expand All @@ -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
Expand Down
7 changes: 4 additions & 3 deletions pkg/app/piped/executor/ecs/rollback.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion pkg/app/piped/platformprovider/ecs/ecs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit d17a9b7

Please sign in to comment.