Skip to content

Commit b7178dd

Browse files
Implement retry logic to enforce timeouts (#1033)
1 parent f443d11 commit b7178dd

33 files changed

Lines changed: 1040 additions & 753 deletions

rancher2/resource_rancher2_app_v2.go

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -83,31 +83,38 @@ func resourceRancher2AppV2Read(d *schema.ResourceData, meta interface{}) error {
8383
name := d.Get("name").(string)
8484
log.Printf("[INFO] Refreshing App V2 %s at %s", name, clusterID)
8585

86-
if clusterName, ok := d.Get("cluster_name").(string); !ok || len(clusterName) == 0 {
87-
cluster, err := meta.(*Config).GetClusterByID(clusterID)
88-
if err != nil {
89-
return err
86+
return resource.Retry(d.Timeout(schema.TimeoutRead), func() *resource.RetryError {
87+
if clusterName, ok := d.Get("cluster_name").(string); !ok || len(clusterName) == 0 {
88+
cluster, err := meta.(*Config).GetClusterByID(clusterID)
89+
if err != nil {
90+
return resource.NonRetryableError(err)
91+
}
92+
d.Set("cluster_name", cluster.Name)
9093
}
91-
d.Set("cluster_name", cluster.Name)
92-
}
93-
if systemDefaultRegistry, ok := d.Get("system_default_registry").(string); !ok || len(systemDefaultRegistry) == 0 {
94-
systemDefaultRegistry, err := meta.(*Config).GetSettingV2ByID(appV2DefaultRegistryID)
94+
if systemDefaultRegistry, ok := d.Get("system_default_registry").(string); !ok || len(systemDefaultRegistry) == 0 {
95+
systemDefaultRegistry, err := meta.(*Config).GetSettingV2ByID(appV2DefaultRegistryID)
96+
if err != nil {
97+
return resource.NonRetryableError(err)
98+
}
99+
d.Set("system_default_registry", systemDefaultRegistry.Value)
100+
}
101+
_, rancherID := splitID(d.Id())
102+
app, err := getAppV2ByID(meta.(*Config), clusterID, rancherID)
95103
if err != nil {
96-
return err
104+
if IsNotFound(err) || IsForbidden(err) {
105+
log.Printf("[INFO] App V2 %s not found at %s", name, clusterID)
106+
d.SetId("")
107+
return nil
108+
}
109+
return resource.NonRetryableError(err)
97110
}
98-
d.Set("system_default_registry", systemDefaultRegistry.Value)
99-
}
100-
_, rancherID := splitID(d.Id())
101-
app, err := getAppV2ByID(meta.(*Config), clusterID, rancherID)
102-
if err != nil {
103-
if IsNotFound(err) || IsForbidden(err) {
104-
log.Printf("[INFO] App V2 %s not found at %s", name, clusterID)
105-
d.SetId("")
106-
return nil
111+
112+
if err = flattenAppV2(d, app); err != nil {
113+
return resource.NonRetryableError(err)
107114
}
108-
return err
109-
}
110-
return flattenAppV2(d, app)
115+
116+
return nil
117+
})
111118
}
112119

113120
func resourceRancher2AppV2Update(d *schema.ResourceData, meta interface{}) error {

rancher2/resource_rancher2_catalog_v2.go

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,17 +63,24 @@ func resourceRancher2CatalogV2Read(d *schema.ResourceData, meta interface{}) err
6363
name := d.Get("name").(string)
6464
log.Printf("[INFO] Refreshing Catalog V2 %s", name)
6565

66-
_, rancherID := splitID(d.Id())
67-
catalog, err := getCatalogV2ByID(meta.(*Config), clusterID, rancherID)
68-
if err != nil {
69-
if IsNotFound(err) || IsForbidden(err) {
70-
log.Printf("[INFO] Catalog V2 %s not found", name)
71-
d.SetId("")
72-
return nil
66+
return resource.Retry(d.Timeout(schema.TimeoutRead), func() *resource.RetryError {
67+
_, rancherID := splitID(d.Id())
68+
catalog, err := getCatalogV2ByID(meta.(*Config), clusterID, rancherID)
69+
if err != nil {
70+
if IsNotFound(err) || IsForbidden(err) {
71+
log.Printf("[INFO] Catalog V2 %s not found", name)
72+
d.SetId("")
73+
return nil
74+
}
75+
return resource.NonRetryableError(err)
7376
}
74-
return err
75-
}
76-
return flattenCatalogV2(d, catalog)
77+
78+
if err = flattenCatalogV2(d, catalog); err != nil {
79+
return resource.NonRetryableError(err)
80+
}
81+
82+
return nil
83+
})
7784
}
7885

7986
func resourceRancher2CatalogV2Update(d *schema.ResourceData, meta interface{}) error {

rancher2/resource_rancher2_certificate.go

Lines changed: 81 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package rancher2
22

33
import (
44
"fmt"
5+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
56
"log"
67
"time"
78

@@ -28,29 +29,36 @@ func resourceRancher2CertificateCreate(d *schema.ResourceData, meta interface{})
2829
_, projectID := splitProjectID(d.Get("project_id").(string))
2930
name := d.Get("name").(string)
3031

31-
err := meta.(*Config).ProjectExist(projectID)
32-
if err != nil {
33-
return err
34-
}
32+
return resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
33+
err := meta.(*Config).ProjectExist(projectID)
34+
if err != nil {
35+
return resource.NonRetryableError(err)
36+
}
3537

36-
certificate, err := expandCertificate(d)
37-
if err != nil {
38-
return err
39-
}
38+
certificate, err := expandCertificate(d)
39+
if err != nil {
40+
return resource.NonRetryableError(err)
41+
}
4042

41-
log.Printf("[INFO] Creating Certificate %s on Project ID %s", name, projectID)
43+
log.Printf("[INFO] Creating Certificate %s on Project ID %s", name, projectID)
4244

43-
newCertificate, err := meta.(*Config).CreateCertificate(certificate)
44-
if err != nil {
45-
return err
46-
}
45+
newCertificate, err := meta.(*Config).CreateCertificate(certificate)
46+
if err != nil {
47+
return resource.NonRetryableError(err)
48+
}
4749

48-
err = flattenCertificate(d, newCertificate)
49-
if err != nil {
50-
return err
51-
}
50+
err = flattenCertificate(d, newCertificate)
51+
if err != nil {
52+
return resource.NonRetryableError(err)
53+
}
54+
55+
err = resourceRancher2CertificateRead(d, meta)
56+
if err != nil {
57+
return resource.NonRetryableError(err)
58+
}
5259

53-
return resourceRancher2CertificateRead(d, meta)
60+
return nil
61+
})
5462
}
5563

5664
func resourceRancher2CertificateRead(d *schema.ResourceData, meta interface{}) error {
@@ -60,17 +68,23 @@ func resourceRancher2CertificateRead(d *schema.ResourceData, meta interface{}) e
6068

6169
log.Printf("[INFO] Refreshing Certificate ID %s", id)
6270

63-
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
64-
if err != nil {
65-
if IsNotFound(err) || IsForbidden(err) {
66-
log.Printf("[INFO] Certificate ID %s not found.", id)
67-
d.SetId("")
68-
return nil
71+
return resource.Retry(d.Timeout(schema.TimeoutRead), func() *resource.RetryError {
72+
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
73+
if err != nil {
74+
if IsNotFound(err) || IsForbidden(err) {
75+
log.Printf("[INFO] Certificate ID %s not found.", id)
76+
d.SetId("")
77+
return nil
78+
}
79+
return resource.NonRetryableError(err)
80+
}
81+
82+
if err := flattenCertificate(d, certificate); err != nil {
83+
return resource.NonRetryableError(err)
6984
}
70-
return err
71-
}
7285

73-
return flattenCertificate(d, certificate)
86+
return nil
87+
})
7488
}
7589

7690
func resourceRancher2CertificateUpdate(d *schema.ResourceData, meta interface{}) error {
@@ -80,27 +94,34 @@ func resourceRancher2CertificateUpdate(d *schema.ResourceData, meta interface{})
8094

8195
log.Printf("[INFO] Updating Certificate ID %s", id)
8296

83-
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
84-
if err != nil {
85-
return err
86-
}
97+
return resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
98+
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
99+
if err != nil {
100+
return resource.NonRetryableError(err)
101+
}
87102

88-
update, err := expandCertificate(d)
89-
if err != nil {
90-
return err
91-
}
103+
update, err := expandCertificate(d)
104+
if err != nil {
105+
return resource.NonRetryableError(err)
106+
}
92107

93-
newCertificate, err := meta.(*Config).UpdateCertificate(certificate, update)
94-
if err != nil {
95-
return err
96-
}
108+
newCertificate, err := meta.(*Config).UpdateCertificate(certificate, update)
109+
if err != nil {
110+
return resource.NonRetryableError(err)
111+
}
97112

98-
err = flattenCertificate(d, newCertificate)
99-
if err != nil {
100-
return err
101-
}
113+
err = flattenCertificate(d, newCertificate)
114+
if err != nil {
115+
return resource.NonRetryableError(err)
116+
}
117+
118+
err = resourceRancher2CertificateRead(d, meta)
119+
if err != nil {
120+
return resource.NonRetryableError(err)
121+
}
102122

103-
return resourceRancher2CertificateRead(d, meta)
123+
return nil
124+
})
104125
}
105126

106127
func resourceRancher2CertificateDelete(d *schema.ResourceData, meta interface{}) error {
@@ -110,21 +131,23 @@ func resourceRancher2CertificateDelete(d *schema.ResourceData, meta interface{})
110131

111132
log.Printf("[INFO] Deleting Certificate ID %s", id)
112133

113-
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
114-
if err != nil {
115-
if IsNotFound(err) || IsForbidden(err) {
116-
log.Printf("[INFO] Certificate ID %s not found.", d.Id())
117-
d.SetId("")
118-
return nil
134+
return resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
135+
certificate, err := meta.(*Config).GetCertificate(id, projectID, namespaceID)
136+
if err != nil {
137+
if IsNotFound(err) || IsForbidden(err) {
138+
log.Printf("[INFO] Certificate ID %s not found.", d.Id())
139+
d.SetId("")
140+
return nil
141+
}
142+
return resource.NonRetryableError(err)
119143
}
120-
return err
121-
}
122144

123-
err = meta.(*Config).DeleteCertificate(certificate)
124-
if err != nil {
125-
return fmt.Errorf("Error removing Certificate: %s", err)
126-
}
145+
err = meta.(*Config).DeleteCertificate(certificate)
146+
if err != nil {
147+
return resource.NonRetryableError(fmt.Errorf("[ERROR] Error removing Certificate: %s", err))
148+
}
127149

128-
d.SetId("")
129-
return nil
150+
d.SetId("")
151+
return nil
152+
})
130153
}

rancher2/resource_rancher2_cloud_credential.go

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -77,18 +77,24 @@ func resourceRancher2CloudCredentialRead(d *schema.ResourceData, meta interface{
7777
return err
7878
}
7979

80-
cloudCredential := &CloudCredential{}
81-
err = client.APIBaseClient.ByID(managementClient.CloudCredentialType, d.Id(), cloudCredential)
82-
if err != nil {
83-
if IsNotFound(err) || IsForbidden(err) {
84-
log.Printf("[INFO] Cloud Credential ID %s not found.", d.Id())
85-
d.SetId("")
86-
return nil
80+
return resource.Retry(d.Timeout(schema.TimeoutRead), func() *resource.RetryError {
81+
cloudCredential := &CloudCredential{}
82+
err = client.APIBaseClient.ByID(managementClient.CloudCredentialType, d.Id(), cloudCredential)
83+
if err != nil {
84+
if IsNotFound(err) || IsForbidden(err) {
85+
log.Printf("[INFO] Cloud Credential ID %s not found.", d.Id())
86+
d.SetId("")
87+
return nil
88+
}
89+
return resource.NonRetryableError(err)
90+
}
91+
92+
if err = flattenCloudCredential(d, cloudCredential); err != nil {
93+
return resource.NonRetryableError(err)
8794
}
88-
return err
89-
}
9095

91-
return flattenCloudCredential(d, cloudCredential)
96+
return nil
97+
})
9298
}
9399

94100
func resourceRancher2CloudCredentialUpdate(d *schema.ResourceData, meta interface{}) error {

0 commit comments

Comments
 (0)