Skip to content

Commit 7983463

Browse files
don't retry on storage bucket data source (#5820) (#11295)
Signed-off-by: Modular Magician <[email protected]>
1 parent 7b9d5ad commit 7983463

File tree

3 files changed

+112
-91
lines changed

3 files changed

+112
-91
lines changed

.changelog/5820.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
storage: fixed a bug where `google_storage_bucket` data source would retry for 20 min when bucket was not found.
3+
```

google/data_source_google_storage_bucket.go

+14-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package google
22

33
import (
44
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
5+
"log"
56
)
67

78
func dataSourceGoogleStorageBucket() *schema.Resource {
@@ -17,9 +18,20 @@ func dataSourceGoogleStorageBucket() *schema.Resource {
1718
}
1819

1920
func dataSourceGoogleStorageBucketRead(d *schema.ResourceData, meta interface{}) error {
21+
config := meta.(*Config)
22+
userAgent, err := generateUserAgentString(d, config.userAgent)
23+
if err != nil {
24+
return err
25+
}
2026

27+
// Get the bucket and acl
2128
bucket := d.Get("name").(string)
22-
d.SetId(bucket)
2329

24-
return resourceStorageBucketRead(d, meta)
30+
res, err := config.NewStorageClient(userAgent).Buckets.Get(bucket).Do()
31+
if err != nil {
32+
return err
33+
}
34+
log.Printf("[DEBUG] Read bucket %v at location %v\n\n", res.Name, res.SelfLink)
35+
36+
return setStorageBucket(d, config, res, bucket, userAgent)
2537
}

google/resource_storage_bucket.go

+95-89
Original file line numberDiff line numberDiff line change
@@ -664,95 +664,7 @@ func resourceStorageBucketRead(d *schema.ResourceData, meta interface{}) error {
664664
}
665665
log.Printf("[DEBUG] Read bucket %v at location %v\n\n", res.Name, res.SelfLink)
666666

667-
// We are trying to support several different use cases for bucket. Buckets are globally
668-
// unique but they are associated with projects internally, but some users want to use
669-
// buckets in a project agnostic way. Thus we will check to see if the project ID has been
670-
// explicitly set and use that first. However if no project is explicitly set, such as during
671-
// import, we will look up the ID from the compute API using the project Number from the
672-
// bucket API response.
673-
// If you are working in a project-agnostic way and have not set the project ID in the provider
674-
// block, or the resource or an environment variable, we use the compute API to lookup the projectID
675-
// from the projectNumber which is included in the bucket API response
676-
if d.Get("project") == "" {
677-
project, _ := getProject(d, config)
678-
if err := d.Set("project", project); err != nil {
679-
return fmt.Errorf("Error setting project: %s", err)
680-
}
681-
}
682-
if d.Get("project") == "" {
683-
proj, err := config.NewComputeClient(userAgent).Projects.Get(strconv.FormatUint(res.ProjectNumber, 10)).Do()
684-
if err != nil {
685-
return err
686-
}
687-
log.Printf("[DEBUG] Bucket %v is in project number %v, which is project ID %s.\n", res.Name, res.ProjectNumber, proj.Name)
688-
if err := d.Set("project", proj.Name); err != nil {
689-
return fmt.Errorf("Error setting project: %s", err)
690-
}
691-
}
692-
693-
// Update the bucket ID according to the resource ID
694-
if err := d.Set("self_link", res.SelfLink); err != nil {
695-
return fmt.Errorf("Error setting self_link: %s", err)
696-
}
697-
if err := d.Set("url", fmt.Sprintf("gs://%s", bucket)); err != nil {
698-
return fmt.Errorf("Error setting url: %s", err)
699-
}
700-
if err := d.Set("storage_class", res.StorageClass); err != nil {
701-
return fmt.Errorf("Error setting storage_class: %s", err)
702-
}
703-
if err := d.Set("encryption", flattenBucketEncryption(res.Encryption)); err != nil {
704-
return fmt.Errorf("Error setting encryption: %s", err)
705-
}
706-
if err := d.Set("location", res.Location); err != nil {
707-
return fmt.Errorf("Error setting location: %s", err)
708-
}
709-
if err := d.Set("cors", flattenCors(res.Cors)); err != nil {
710-
return fmt.Errorf("Error setting cors: %s", err)
711-
}
712-
if err := d.Set("default_event_based_hold", res.DefaultEventBasedHold); err != nil {
713-
return fmt.Errorf("Error setting default_event_based_hold: %s", err)
714-
}
715-
if err := d.Set("logging", flattenBucketLogging(res.Logging)); err != nil {
716-
return fmt.Errorf("Error setting logging: %s", err)
717-
}
718-
if err := d.Set("versioning", flattenBucketVersioning(res.Versioning)); err != nil {
719-
return fmt.Errorf("Error setting versioning: %s", err)
720-
}
721-
if err := d.Set("lifecycle_rule", flattenBucketLifecycle(res.Lifecycle)); err != nil {
722-
return fmt.Errorf("Error setting lifecycle_rule: %s", err)
723-
}
724-
if err := d.Set("labels", res.Labels); err != nil {
725-
return fmt.Errorf("Error setting labels: %s", err)
726-
}
727-
if err := d.Set("website", flattenBucketWebsite(res.Website)); err != nil {
728-
return fmt.Errorf("Error setting website: %s", err)
729-
}
730-
if err := d.Set("retention_policy", flattenBucketRetentionPolicy(res.RetentionPolicy)); err != nil {
731-
return fmt.Errorf("Error setting retention_policy: %s", err)
732-
}
733-
734-
if res.IamConfiguration != nil && res.IamConfiguration.UniformBucketLevelAccess != nil {
735-
if err := d.Set("uniform_bucket_level_access", res.IamConfiguration.UniformBucketLevelAccess.Enabled); err != nil {
736-
return fmt.Errorf("Error setting uniform_bucket_level_access: %s", err)
737-
}
738-
} else {
739-
if err := d.Set("uniform_bucket_level_access", false); err != nil {
740-
return fmt.Errorf("Error setting uniform_bucket_level_access: %s", err)
741-
}
742-
}
743-
744-
if res.Billing == nil {
745-
if err := d.Set("requester_pays", nil); err != nil {
746-
return fmt.Errorf("Error setting requester_pays: %s", err)
747-
}
748-
} else {
749-
if err := d.Set("requester_pays", res.Billing.RequesterPays); err != nil {
750-
return fmt.Errorf("Error setting requester_pays: %s", err)
751-
}
752-
}
753-
754-
d.SetId(res.Id)
755-
return nil
667+
return setStorageBucket(d, config, res, bucket, userAgent)
756668
}
757669

758670
func resourceStorageBucketDelete(d *schema.ResourceData, meta interface{}) error {
@@ -1379,3 +1291,97 @@ func detectLifecycleChange(d *schema.ResourceData) bool {
13791291

13801292
return false
13811293
}
1294+
1295+
// Resource Read and DataSource Read both need to set attributes, but Data Sources don't support Timeouts
1296+
// so we pulled this portion out separately (https://github.com/hashicorp/terraform-provider-google/issues/11264)
1297+
func setStorageBucket(d *schema.ResourceData, config *Config, res *storage.Bucket, bucket, userAgent string) error {
1298+
// We are trying to support several different use cases for bucket. Buckets are globally
1299+
// unique but they are associated with projects internally, but some users want to use
1300+
// buckets in a project agnostic way. Thus we will check to see if the project ID has been
1301+
// explicitly set and use that first. However if no project is explicitly set, such as during
1302+
// import, we will look up the ID from the compute API using the project Number from the
1303+
// bucket API response.
1304+
// If you are working in a project-agnostic way and have not set the project ID in the provider
1305+
// block, or the resource or an environment variable, we use the compute API to lookup the projectID
1306+
// from the projectNumber which is included in the bucket API response
1307+
if d.Get("project") == "" {
1308+
project, _ := getProject(d, config)
1309+
if err := d.Set("project", project); err != nil {
1310+
return fmt.Errorf("Error setting project: %s", err)
1311+
}
1312+
}
1313+
if d.Get("project") == "" {
1314+
proj, err := config.NewComputeClient(userAgent).Projects.Get(strconv.FormatUint(res.ProjectNumber, 10)).Do()
1315+
if err != nil {
1316+
return err
1317+
}
1318+
log.Printf("[DEBUG] Bucket %v is in project number %v, which is project ID %s.\n", res.Name, res.ProjectNumber, proj.Name)
1319+
if err := d.Set("project", proj.Name); err != nil {
1320+
return fmt.Errorf("Error setting project: %s", err)
1321+
}
1322+
}
1323+
1324+
// Update the bucket ID according to the resource ID
1325+
if err := d.Set("self_link", res.SelfLink); err != nil {
1326+
return fmt.Errorf("Error setting self_link: %s", err)
1327+
}
1328+
if err := d.Set("url", fmt.Sprintf("gs://%s", bucket)); err != nil {
1329+
return fmt.Errorf("Error setting url: %s", err)
1330+
}
1331+
if err := d.Set("storage_class", res.StorageClass); err != nil {
1332+
return fmt.Errorf("Error setting storage_class: %s", err)
1333+
}
1334+
if err := d.Set("encryption", flattenBucketEncryption(res.Encryption)); err != nil {
1335+
return fmt.Errorf("Error setting encryption: %s", err)
1336+
}
1337+
if err := d.Set("location", res.Location); err != nil {
1338+
return fmt.Errorf("Error setting location: %s", err)
1339+
}
1340+
if err := d.Set("cors", flattenCors(res.Cors)); err != nil {
1341+
return fmt.Errorf("Error setting cors: %s", err)
1342+
}
1343+
if err := d.Set("default_event_based_hold", res.DefaultEventBasedHold); err != nil {
1344+
return fmt.Errorf("Error setting default_event_based_hold: %s", err)
1345+
}
1346+
if err := d.Set("logging", flattenBucketLogging(res.Logging)); err != nil {
1347+
return fmt.Errorf("Error setting logging: %s", err)
1348+
}
1349+
if err := d.Set("versioning", flattenBucketVersioning(res.Versioning)); err != nil {
1350+
return fmt.Errorf("Error setting versioning: %s", err)
1351+
}
1352+
if err := d.Set("lifecycle_rule", flattenBucketLifecycle(res.Lifecycle)); err != nil {
1353+
return fmt.Errorf("Error setting lifecycle_rule: %s", err)
1354+
}
1355+
if err := d.Set("labels", res.Labels); err != nil {
1356+
return fmt.Errorf("Error setting labels: %s", err)
1357+
}
1358+
if err := d.Set("website", flattenBucketWebsite(res.Website)); err != nil {
1359+
return fmt.Errorf("Error setting website: %s", err)
1360+
}
1361+
if err := d.Set("retention_policy", flattenBucketRetentionPolicy(res.RetentionPolicy)); err != nil {
1362+
return fmt.Errorf("Error setting retention_policy: %s", err)
1363+
}
1364+
1365+
if res.IamConfiguration != nil && res.IamConfiguration.UniformBucketLevelAccess != nil {
1366+
if err := d.Set("uniform_bucket_level_access", res.IamConfiguration.UniformBucketLevelAccess.Enabled); err != nil {
1367+
return fmt.Errorf("Error setting uniform_bucket_level_access: %s", err)
1368+
}
1369+
} else {
1370+
if err := d.Set("uniform_bucket_level_access", false); err != nil {
1371+
return fmt.Errorf("Error setting uniform_bucket_level_access: %s", err)
1372+
}
1373+
}
1374+
1375+
if res.Billing == nil {
1376+
if err := d.Set("requester_pays", nil); err != nil {
1377+
return fmt.Errorf("Error setting requester_pays: %s", err)
1378+
}
1379+
} else {
1380+
if err := d.Set("requester_pays", res.Billing.RequesterPays); err != nil {
1381+
return fmt.Errorf("Error setting requester_pays: %s", err)
1382+
}
1383+
}
1384+
1385+
d.SetId(res.Id)
1386+
return nil
1387+
}

0 commit comments

Comments
 (0)