@@ -10,10 +10,14 @@ import (
10
10
"github.com/nais/cloudsql-migrator/internal/pkg/instance"
11
11
"github.com/nais/cloudsql-migrator/internal/pkg/resolved"
12
12
"google.golang.org/api/datamigration/v1"
13
+ "google.golang.org/api/googleapi"
13
14
"google.golang.org/api/iterator"
15
+ "net/http"
14
16
"time"
15
17
)
16
18
19
+ const MigrationJobRetries = 3
20
+
17
21
func CheckReadyForPromotion (ctx context.Context , source , target * resolved.Instance , gcpProject * resolved.GcpProject , mgr * common_main.Manager ) error {
18
22
migrationName , err := resolved .MigrationName (source .Name , target .Name )
19
23
if err != nil {
@@ -22,9 +26,9 @@ func CheckReadyForPromotion(ctx context.Context, source, target *resolved.Instan
22
26
23
27
mgr .Logger .Info ("checking if migration job is ready for promotion" , "migrationName" , migrationName )
24
28
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 )
26
30
if err != nil {
27
- return fmt . Errorf ( "failed to get migration job: %w" , err )
31
+ return err
28
32
}
29
33
30
34
if migrationJob .State != "RUNNING" {
@@ -43,6 +47,22 @@ func CheckReadyForPromotion(ctx context.Context, source, target *resolved.Instan
43
47
return nil
44
48
}
45
49
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
+
46
66
func Promote (ctx context.Context , source , target * resolved.Instance , gcpProject * resolved.GcpProject , mgr * common_main.Manager ) error {
47
67
migrationName , err := resolved .MigrationName (source .Name , target .Name )
48
68
if err != nil {
0 commit comments