Skip to content

Commit 241c87b

Browse files
mortenljtronghn
andcommitted
Add retries when getting migration job in case of permission errors
IAM permissions can take some time to propagate, so we retry in case it resolves itself after some time. Co-authored-by: Trong Nguyen <[email protected]>
1 parent db4efd0 commit 241c87b

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

internal/pkg/promote/promote.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,14 @@ import (
1010
"github.com/nais/cloudsql-migrator/internal/pkg/instance"
1111
"github.com/nais/cloudsql-migrator/internal/pkg/resolved"
1212
"google.golang.org/api/datamigration/v1"
13+
"google.golang.org/api/googleapi"
1314
"google.golang.org/api/iterator"
15+
"net/http"
1416
"time"
1517
)
1618

19+
const MigrationJobRetries = 3
20+
1721
func CheckReadyForPromotion(ctx context.Context, source, target *resolved.Instance, gcpProject *resolved.GcpProject, mgr *common_main.Manager) error {
1822
migrationName, err := resolved.MigrationName(source.Name, target.Name)
1923
if err != nil {
@@ -22,9 +26,9 @@ func CheckReadyForPromotion(ctx context.Context, source, target *resolved.Instan
2226

2327
mgr.Logger.Info("checking if migration job is ready for promotion", "migrationName", migrationName)
2428

25-
migrationJob, err := mgr.DatamigrationService.Projects.Locations.MigrationJobs.Get(gcpProject.GcpComponentURI("migrationJobs", migrationName)).Context(ctx).Do()
29+
migrationJob, err := getMigrationJobWithRetry(ctx, migrationName, gcpProject, mgr, MigrationJobRetries)
2630
if err != nil {
27-
return fmt.Errorf("failed to get migration job: %w", err)
31+
return err
2832
}
2933

3034
if migrationJob.State != "RUNNING" {
@@ -43,6 +47,22 @@ func CheckReadyForPromotion(ctx context.Context, source, target *resolved.Instan
4347
return nil
4448
}
4549

50+
func getMigrationJobWithRetry(ctx context.Context, migrationName string, gcpProject *resolved.GcpProject, mgr *common_main.Manager, retries int) (*datamigration.MigrationJob, error) {
51+
migrationJob, err := mgr.DatamigrationService.Projects.Locations.MigrationJobs.Get(gcpProject.GcpComponentURI("migrationJobs", migrationName)).Context(ctx).Do()
52+
if err != nil {
53+
var ae *googleapi.Error
54+
ok := errors.As(err, &ae)
55+
if ok && ae.Code == http.StatusForbidden {
56+
mgr.Logger.Warn("Forbidden from getting migration job, retrying in case permissions are not yet propagated")
57+
time.Sleep(20 * time.Second)
58+
return getMigrationJobWithRetry(ctx, migrationName, gcpProject, mgr, retries-1)
59+
}
60+
return nil, fmt.Errorf("failed to get migration job: %w", err)
61+
}
62+
63+
return migrationJob, nil
64+
}
65+
4666
func Promote(ctx context.Context, source, target *resolved.Instance, gcpProject *resolved.GcpProject, mgr *common_main.Manager) error {
4767
migrationName, err := resolved.MigrationName(source.Name, target.Name)
4868
if err != nil {

0 commit comments

Comments
 (0)