Skip to content

Commit 4792533

Browse files
CENG-507: Add sleep timeout for control/upstream tests to battle flakes
1 parent a877a69 commit 4792533

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

cloudsmith/resource_entitlement_control_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"os"
77
"testing"
8+
"time"
89

910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1011
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
@@ -27,6 +28,20 @@ func TestAccEntitlementControl_basic(t *testing.T) {
2728
Config: testAccEntitlementControlConfigBasic,
2829
Check: resource.ComposeTestCheckFunc(
2930
testAccEntitlementControlCheckExists("cloudsmith_entitlement_control.test"),
31+
func(s *terraform.State) error {
32+
resourceState, ok := s.RootModule().Resources["cloudsmith_entitlement_control.test"]
33+
if !ok {
34+
return fmt.Errorf("resource not found: %s", "cloudsmith_entitlement_control.test")
35+
}
36+
if resourceState.Primary.ID == "" {
37+
return fmt.Errorf("resource id not set")
38+
}
39+
pc := testAccProvider.Meta().(*providerConfig)
40+
namespace := os.Getenv("CLOUDSMITH_NAMESPACE")
41+
repository := resourceState.Primary.Attributes["repository"]
42+
identifier := resourceState.Primary.ID
43+
return waitForEntitlementControlEnabled(pc, namespace, repository, identifier, true, 15)
44+
},
3045
resource.TestCheckResourceAttr("cloudsmith_entitlement_control.test", "namespace", os.Getenv("CLOUDSMITH_NAMESPACE")),
3146
resource.TestCheckResourceAttr("cloudsmith_entitlement_control.test", "enabled", "true"),
3247
),
@@ -35,6 +50,20 @@ func TestAccEntitlementControl_basic(t *testing.T) {
3550
Config: testAccEntitlementControlConfigBasicUpdate,
3651
Check: resource.ComposeTestCheckFunc(
3752
testAccEntitlementControlCheckExists("cloudsmith_entitlement_control.test"),
53+
func(s *terraform.State) error {
54+
resourceState, ok := s.RootModule().Resources["cloudsmith_entitlement_control.test"]
55+
if !ok {
56+
return fmt.Errorf("resource not found: %s", "cloudsmith_entitlement_control.test")
57+
}
58+
if resourceState.Primary.ID == "" {
59+
return fmt.Errorf("resource id not set")
60+
}
61+
pc := testAccProvider.Meta().(*providerConfig)
62+
namespace := os.Getenv("CLOUDSMITH_NAMESPACE")
63+
repository := resourceState.Primary.Attributes["repository"]
64+
identifier := resourceState.Primary.ID
65+
return waitForEntitlementControlEnabled(pc, namespace, repository, identifier, false, 15)
66+
},
3867
resource.TestCheckResourceAttr("cloudsmith_entitlement_control.test", "namespace", os.Getenv("CLOUDSMITH_NAMESPACE")),
3968
resource.TestCheckResourceAttr("cloudsmith_entitlement_control.test", "enabled", "false"),
4069
),
@@ -120,6 +149,28 @@ func testAccEntitlementControlCheckExists(resourceName string) resource.TestChec
120149
}
121150
}
122151

152+
func waitForEntitlementControlEnabled(pc *providerConfig, namespace, repository, identifier string, wantEnabled bool, timeoutSec int) error {
153+
deadline := time.Now().Add(time.Duration(timeoutSec) * time.Second)
154+
for {
155+
req := pc.APIClient.EntitlementsApi.EntitlementsRead(pc.Auth, namespace, repository, identifier)
156+
entitlement, resp, err := pc.APIClient.EntitlementsApi.EntitlementsReadExecute(req)
157+
if resp != nil {
158+
defer resp.Body.Close()
159+
}
160+
if err == nil {
161+
if entitlement.GetIsActive() == wantEnabled {
162+
return nil
163+
}
164+
} else if is404(resp) {
165+
return fmt.Errorf("entitlement not found while waiting for enabled=%v", wantEnabled)
166+
}
167+
if time.Now().After(deadline) {
168+
return fmt.Errorf("timeout waiting for entitlement control enabled=%v", wantEnabled)
169+
}
170+
time.Sleep(1 * time.Second)
171+
}
172+
}
173+
123174
var testAccEntitlementControlConfigBasic = fmt.Sprintf(`
124175
resource "cloudsmith_repository" "test" {
125176
name = "terraform-acc-test-ent-ctrl"

cloudsmith/resource_repository_upstream.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,23 @@ func readCertificateFiles(d *schema.ResourceData) (cert, key *string, err error)
158158
return cert, key, nil
159159
}
160160

161+
func waitForUpstreamActive(getUpstreamFn func() (Upstream, *http.Response, error), timeout time.Duration) error {
162+
deadline := time.Now().Add(timeout)
163+
for {
164+
upstream, _, err := getUpstreamFn()
165+
if err != nil {
166+
return fmt.Errorf("error fetching upstream: %w", err)
167+
}
168+
if upstream.GetIsActive() {
169+
return nil
170+
}
171+
if time.Now().After(deadline) {
172+
return fmt.Errorf("timeout waiting for upstream to become active")
173+
}
174+
time.Sleep(1 * time.Second)
175+
}
176+
}
177+
161178
func resourceRepositoryUpstreamCreate(d *schema.ResourceData, m interface{}) error {
162179
pc := m.(*providerConfig)
163180

@@ -468,6 +485,13 @@ func resourceRepositoryUpstreamCreate(d *schema.ResourceData, m interface{}) err
468485
return fmt.Errorf("error waiting for upstream (%s) to be created: %w", d.Id(), err)
469486
}
470487

488+
// After creation, wait for is_active to be true (max 15s)
489+
if err := waitForUpstreamActive(func() (Upstream, *http.Response, error) {
490+
return getUpstream(d, m)
491+
}, 15*time.Second); err != nil {
492+
return err
493+
}
494+
471495
return resourceRepositoryUpstreamRead(d, m)
472496
}
473497

0 commit comments

Comments
 (0)