From 0334ec5633a786c3f2a1a37afc81cecf5f1145fe Mon Sep 17 00:00:00 2001 From: kepe bonner Date: Fri, 23 Jan 2026 10:20:28 -0800 Subject: [PATCH 1/4] remove incorrect block error --- .../deployment_versioning/aa_clean_old_deployments/feature.go | 1 - 1 file changed, 1 deletion(-) diff --git a/features/deployment_versioning/aa_clean_old_deployments/feature.go b/features/deployment_versioning/aa_clean_old_deployments/feature.go index ad816ed7..c1764148 100644 --- a/features/deployment_versioning/aa_clean_old_deployments/feature.go +++ b/features/deployment_versioning/aa_clean_old_deployments/feature.go @@ -125,7 +125,6 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { if err != nil { return fmt.Errorf("failed to unset ramping version for deployment %s: %w", deploymentName, err) } - return fmt.Errorf("failed to unset ramping version for deployment %s: %w", deploymentName, err) } for _, version := range deploymentInfo.WorkerDeploymentInfo.VersionSummaries { From de32c027cb45d09b87080b42fe4ea996e0e95cc5 Mon Sep 17 00:00:00 2001 From: kepe bonner Date: Fri, 23 Jan 2026 10:38:32 -0800 Subject: [PATCH 2/4] use conflict token --- .../aa_clean_old_deployments/feature.go | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/features/deployment_versioning/aa_clean_old_deployments/feature.go b/features/deployment_versioning/aa_clean_old_deployments/feature.go index c1764148..e4e22406 100644 --- a/features/deployment_versioning/aa_clean_old_deployments/feature.go +++ b/features/deployment_versioning/aa_clean_old_deployments/feature.go @@ -82,20 +82,16 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { return fmt.Errorf("failed to describe worker deployment %s: %w", deploymentName, err) } // Unset current/ramping versions so things can be deleted - _, err = client.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ - Namespace: ns, - DeploymentName: deploymentName, - Identity: "feature-deployment-deleter", - IgnoreMissingTaskQueues: true, - AllowNoPollers: true, - }) - if err != nil { - // Try using unversioned string (needed if deployment was very old) - _, err = client.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ + routingConfig := deploymentInfo.WorkerDeploymentInfo.RoutingConfig + conflictToken := deploymentInfo.ConflictToken + + // Unset current version if one is set (pass empty BuildId with ConflictToken) + if routingConfig != nil && routingConfig.CurrentDeploymentVersion != nil && routingConfig.CurrentDeploymentVersion.BuildId != "" { + resp, err := client.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ Namespace: ns, DeploymentName: deploymentName, - Version: "__unversioned__", - BuildId: "__unversioned__", + BuildId: "", // Empty to unset + ConflictToken: conflictToken, Identity: "feature-deployment-deleter", IgnoreMissingTaskQueues: true, AllowNoPollers: true, @@ -103,21 +99,17 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { if err != nil { return fmt.Errorf("failed to unset current version for deployment %s: %w", deploymentName, err) } + // Update conflict token for next call + conflictToken = resp.ConflictToken } - _, err = client.WorkflowService().SetWorkerDeploymentRampingVersion(ctx, &workflowservice.SetWorkerDeploymentRampingVersionRequest{ - Namespace: ns, - DeploymentName: deploymentName, - Identity: "feature-deployment-deleter", - IgnoreMissingTaskQueues: true, - AllowNoPollers: true, - }) - if err != nil { - // Try using unversioned string (needed if deployment was very old) + + // Unset ramping version if one is set (pass empty BuildId with ConflictToken) + if routingConfig != nil && routingConfig.RampingDeploymentVersion != nil && routingConfig.RampingDeploymentVersion.BuildId != "" { _, err = client.WorkflowService().SetWorkerDeploymentRampingVersion(ctx, &workflowservice.SetWorkerDeploymentRampingVersionRequest{ Namespace: ns, DeploymentName: deploymentName, - Version: "__unversioned__", - BuildId: "__unversioned__", + BuildId: "", // Empty to unset + ConflictToken: conflictToken, Identity: "feature-deployment-deleter", IgnoreMissingTaskQueues: true, AllowNoPollers: true, From e0647141486c7c64cdb84b2bcfb1f7483c5ac4d5 Mon Sep 17 00:00:00 2001 From: kepe bonner Date: Fri, 23 Jan 2026 10:47:59 -0800 Subject: [PATCH 3/4] try with empty string --- .../aa_clean_old_deployments/feature.go | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/features/deployment_versioning/aa_clean_old_deployments/feature.go b/features/deployment_versioning/aa_clean_old_deployments/feature.go index e4e22406..6143764d 100644 --- a/features/deployment_versioning/aa_clean_old_deployments/feature.go +++ b/features/deployment_versioning/aa_clean_old_deployments/feature.go @@ -68,10 +68,11 @@ func ListOldDeployments(ctx context.Context) ([]string, error) { } func DeleteDeployment(ctx context.Context, deploymentName string) error { - client := activity.GetClient(ctx) + tClient := activity.GetClient(ctx) ns := activity.GetInfo(ctx).WorkflowNamespace - deploymentInfo, err := client.WorkflowService().DescribeWorkerDeployment( + // Use low-level gRPC API to access routing config + deploymentInfo, err := tClient.WorkflowService().DescribeWorkerDeployment( ctx, &workflowservice.DescribeWorkerDeploymentRequest{ Namespace: ns, @@ -81,13 +82,13 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { if err != nil { return fmt.Errorf("failed to describe worker deployment %s: %w", deploymentName, err) } - // Unset current/ramping versions so things can be deleted + routingConfig := deploymentInfo.WorkerDeploymentInfo.RoutingConfig conflictToken := deploymentInfo.ConflictToken - // Unset current version if one is set (pass empty BuildId with ConflictToken) + // Unset current version if one is set if routingConfig != nil && routingConfig.CurrentDeploymentVersion != nil && routingConfig.CurrentDeploymentVersion.BuildId != "" { - resp, err := client.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ + resp, err := tClient.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ Namespace: ns, DeploymentName: deploymentName, BuildId: "", // Empty to unset @@ -99,13 +100,12 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { if err != nil { return fmt.Errorf("failed to unset current version for deployment %s: %w", deploymentName, err) } - // Update conflict token for next call conflictToken = resp.ConflictToken } - // Unset ramping version if one is set (pass empty BuildId with ConflictToken) + // Unset ramping version if one is set if routingConfig != nil && routingConfig.RampingDeploymentVersion != nil && routingConfig.RampingDeploymentVersion.BuildId != "" { - _, err = client.WorkflowService().SetWorkerDeploymentRampingVersion(ctx, &workflowservice.SetWorkerDeploymentRampingVersionRequest{ + _, err = tClient.WorkflowService().SetWorkerDeploymentRampingVersion(ctx, &workflowservice.SetWorkerDeploymentRampingVersionRequest{ Namespace: ns, DeploymentName: deploymentName, BuildId: "", // Empty to unset @@ -119,8 +119,9 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { } } + // Delete all versions for _, version := range deploymentInfo.WorkerDeploymentInfo.VersionSummaries { - _, err = client.WorkflowService().DeleteWorkerDeploymentVersion(ctx, + _, err = tClient.WorkflowService().DeleteWorkerDeploymentVersion(ctx, &workflowservice.DeleteWorkerDeploymentVersionRequest{ Namespace: ns, DeploymentVersion: version.DeploymentVersion, @@ -134,7 +135,8 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { } } - client.WorkflowService().DeleteWorkerDeployment(ctx, + // Delete the deployment itself + tClient.WorkflowService().DeleteWorkerDeployment(ctx, &workflowservice.DeleteWorkerDeploymentRequest{ Namespace: ns, DeploymentName: deploymentName, From f59107ae82f956034505acc227ec090e2a03fac5 Mon Sep 17 00:00:00 2001 From: kepe bonner Date: Fri, 23 Jan 2026 10:55:49 -0800 Subject: [PATCH 4/4] test removing unset --- .../aa_clean_old_deployments/feature.go | 45 +++---------------- 1 file changed, 6 insertions(+), 39 deletions(-) diff --git a/features/deployment_versioning/aa_clean_old_deployments/feature.go b/features/deployment_versioning/aa_clean_old_deployments/feature.go index 6143764d..60a18c2b 100644 --- a/features/deployment_versioning/aa_clean_old_deployments/feature.go +++ b/features/deployment_versioning/aa_clean_old_deployments/feature.go @@ -71,7 +71,7 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { tClient := activity.GetClient(ctx) ns := activity.GetInfo(ctx).WorkflowNamespace - // Use low-level gRPC API to access routing config + // Describe to get version summaries deploymentInfo, err := tClient.WorkflowService().DescribeWorkerDeployment( ctx, &workflowservice.DescribeWorkerDeploymentRequest{ @@ -83,43 +83,7 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { return fmt.Errorf("failed to describe worker deployment %s: %w", deploymentName, err) } - routingConfig := deploymentInfo.WorkerDeploymentInfo.RoutingConfig - conflictToken := deploymentInfo.ConflictToken - - // Unset current version if one is set - if routingConfig != nil && routingConfig.CurrentDeploymentVersion != nil && routingConfig.CurrentDeploymentVersion.BuildId != "" { - resp, err := tClient.WorkflowService().SetWorkerDeploymentCurrentVersion(ctx, &workflowservice.SetWorkerDeploymentCurrentVersionRequest{ - Namespace: ns, - DeploymentName: deploymentName, - BuildId: "", // Empty to unset - ConflictToken: conflictToken, - Identity: "feature-deployment-deleter", - IgnoreMissingTaskQueues: true, - AllowNoPollers: true, - }) - if err != nil { - return fmt.Errorf("failed to unset current version for deployment %s: %w", deploymentName, err) - } - conflictToken = resp.ConflictToken - } - - // Unset ramping version if one is set - if routingConfig != nil && routingConfig.RampingDeploymentVersion != nil && routingConfig.RampingDeploymentVersion.BuildId != "" { - _, err = tClient.WorkflowService().SetWorkerDeploymentRampingVersion(ctx, &workflowservice.SetWorkerDeploymentRampingVersionRequest{ - Namespace: ns, - DeploymentName: deploymentName, - BuildId: "", // Empty to unset - ConflictToken: conflictToken, - Identity: "feature-deployment-deleter", - IgnoreMissingTaskQueues: true, - AllowNoPollers: true, - }) - if err != nil { - return fmt.Errorf("failed to unset ramping version for deployment %s: %w", deploymentName, err) - } - } - - // Delete all versions + // Delete all versions (with SkipDrainage to force delete) for _, version := range deploymentInfo.WorkerDeploymentInfo.VersionSummaries { _, err = tClient.WorkflowService().DeleteWorkerDeploymentVersion(ctx, &workflowservice.DeleteWorkerDeploymentVersionRequest{ @@ -136,12 +100,15 @@ func DeleteDeployment(ctx context.Context, deploymentName string) error { } // Delete the deployment itself - tClient.WorkflowService().DeleteWorkerDeployment(ctx, + _, err = tClient.WorkflowService().DeleteWorkerDeployment(ctx, &workflowservice.DeleteWorkerDeploymentRequest{ Namespace: ns, DeploymentName: deploymentName, Identity: "features-deployment-deleter", }, ) + if err != nil { + return fmt.Errorf("failed to delete deployment %s: %w", deploymentName, err) + } return nil }