Skip to content

Commit f5dc073

Browse files
committed
Update region_enumeration data sources
Update region_enumeration data sources to consume the new asynchronous calls Signed-off-by: Ferran Rodenas <[email protected]>
1 parent 10099f6 commit f5dc073

8 files changed

+435
-146
lines changed

vra/client.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020

2121
// API Versions
2222
const (
23+
IaaSAPIVersion = "2021-07-15"
2324
CatalogAPIVersion = "2020-08-25"
2425
DeploymentsAPIVersion = "2020-08-25"
2526
)

vra/data_source_region_enumeration.go

Lines changed: 92 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,57 @@
11
package vra
22

33
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
"time"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
411
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
"github.com/vmware/vra-sdk-go/pkg/client"
513
"github.com/vmware/vra-sdk-go/pkg/client/cloud_account"
14+
"github.com/vmware/vra-sdk-go/pkg/client/request"
615
"github.com/vmware/vra-sdk-go/pkg/models"
716
)
817

918
func dataSourceRegionEnumeration() *schema.Resource {
1019
return &schema.Resource{
11-
Read: dataSourceRegionEnumerationRead,
20+
ReadContext: dataSourceRegionEnumerationRead,
1221
DeprecationMessage: "'region_enumeration' is deprecated. Use 'region_enumeration_vsphere' instead.",
1322

1423
Schema: map[string]*schema.Schema{
1524
"accept_self_signed_cert": {
16-
Type: schema.TypeBool,
17-
Optional: true,
18-
Default: false,
25+
Type: schema.TypeBool,
26+
Optional: true,
27+
Default: false,
28+
Description: "Whether to accept self signed certificate when connecting to the vCenter Server.",
1929
},
2030
"dcid": {
21-
Type: schema.TypeString,
22-
Optional: true,
31+
Type: schema.TypeString,
32+
Optional: true,
33+
Description: "Identifier of a data collector vm deployed in the on premise infrastructure.",
2334
},
2435
"hostname": {
25-
Type: schema.TypeString,
26-
Required: true,
36+
Type: schema.TypeString,
37+
Required: true,
38+
Description: "IP address or FQDN of the vCenter Server.",
2739
},
2840
"password": {
29-
Type: schema.TypeString,
30-
Required: true,
31-
Sensitive: true,
41+
Type: schema.TypeString,
42+
Required: true,
43+
Sensitive: true,
44+
Description: "Password of the vCenter Server.",
3245
},
3346
"username": {
34-
Type: schema.TypeString,
35-
Required: true,
47+
Type: schema.TypeString,
48+
Required: true,
49+
Description: "Username of the vCenter Server.",
3650
},
3751
"regions": {
38-
Type: schema.TypeSet,
39-
Computed: true,
52+
Type: schema.TypeSet,
53+
Computed: true,
54+
Description: "A set of region ids that can be enabled for this cloud account.",
4055
Elem: &schema.Schema{
4156
Type: schema.TypeString,
4257
},
@@ -45,23 +60,75 @@ func dataSourceRegionEnumeration() *schema.Resource {
4560
}
4661
}
4762

48-
func dataSourceRegionEnumerationRead(d *schema.ResourceData, meta interface{}) error {
63+
func dataSourceRegionEnumerationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
4964
apiClient := meta.(*Client).apiClient
5065

51-
getResp, err := apiClient.CloudAccount.EnumerateVSphereRegions(cloud_account.NewEnumerateVSphereRegionsParams().WithBody(&models.CloudAccountVsphereSpecification{
52-
AcceptSelfSignedCertificate: d.Get("accept_self_signed_cert").(bool),
53-
Dcid: d.Get("dcid").(string),
54-
HostName: withString(d.Get("hostname").(string)),
55-
Password: withString(d.Get("password").(string)),
56-
Username: withString(d.Get("username").(string)),
57-
}))
66+
enumResp, err := apiClient.CloudAccount.EnumerateVSphereRegionsAsync(
67+
cloud_account.NewEnumerateVSphereRegionsAsyncParams().
68+
WithAPIVersion(withString(IaaSAPIVersion)).
69+
WithTimeout(IncreasedTimeOut).
70+
WithBody(&models.CloudAccountVsphereRegionEnumerationSpecification{
71+
AcceptSelfSignedCertificate: d.Get("accept_self_signed_cert").(bool),
72+
Dcid: d.Get("dcid").(string),
73+
HostName: d.Get("hostname").(string),
74+
Password: d.Get("password").(string),
75+
Username: d.Get("username").(string),
76+
}))
77+
if err != nil {
78+
return diag.FromErr(err)
79+
}
80+
81+
stateChangeFunc := resource.StateChangeConf{
82+
Delay: 5 * time.Second,
83+
Pending: []string{models.RequestTrackerStatusINPROGRESS},
84+
Refresh: dataSourceRegionEnumerationReadRefreshFunc(*apiClient, *enumResp.Payload.ID),
85+
Target: []string{models.RequestTrackerStatusFINISHED},
86+
Timeout: d.Timeout(schema.TimeoutRead),
87+
MinTimeout: 5 * time.Second,
88+
}
89+
90+
resourceIds, err := stateChangeFunc.WaitForStateContext(ctx)
91+
if err != nil {
92+
return diag.FromErr(err)
93+
}
94+
enumID := (resourceIds.([]string))[0]
5895

96+
getResp, err := apiClient.CloudAccount.GetRegionEnumerationResult(
97+
cloud_account.NewGetRegionEnumerationResultParams().
98+
WithAPIVersion(withString(IaaSAPIVersion)).
99+
WithTimeout(IncreasedTimeOut).
100+
WithID(enumID))
59101
if err != nil {
60-
return err
102+
return diag.FromErr(err)
61103
}
62104

63-
d.Set("regions", getResp.Payload.ExternalRegionIds)
105+
d.Set("regions", extractIdsFromRegionSpecification(getResp.Payload.ExternalRegions))
64106
d.SetId(d.Get("hostname").(string))
65107

66108
return nil
67109
}
110+
111+
func dataSourceRegionEnumerationReadRefreshFunc(apiClient client.MulticloudIaaS, id string) resource.StateRefreshFunc {
112+
return func() (interface{}, string, error) {
113+
reqResp, err := apiClient.Request.GetRequestTracker(request.NewGetRequestTrackerParams().WithID(id))
114+
if err != nil {
115+
return "", models.RequestTrackerStatusFAILED, err
116+
}
117+
118+
status := reqResp.Payload.Status
119+
switch *status {
120+
case models.RequestTrackerStatusFAILED:
121+
return []string{""}, *status, fmt.Errorf(reqResp.Payload.Message)
122+
case models.RequestTrackerStatusINPROGRESS:
123+
return [...]string{id}, *status, nil
124+
case models.RequestTrackerStatusFINISHED:
125+
regionEnumerationIds := make([]string, len(reqResp.Payload.Resources))
126+
for i, r := range reqResp.Payload.Resources {
127+
regionEnumerationIds[i] = strings.TrimPrefix(r, "/iaas/api/cloud-accounts/region-enumeration/")
128+
}
129+
return regionEnumerationIds, *status, nil
130+
default:
131+
return [...]string{id}, reqResp.Payload.Message, fmt.Errorf("dataSourceRegionEnumerationReadRefreshFunc: unknown status %v", *status)
132+
}
133+
}
134+
}

vra/data_source_region_enumeration_aws.go

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,84 @@
11
package vra
22

33
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
49
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
510
"github.com/vmware/vra-sdk-go/pkg/client/cloud_account"
611
"github.com/vmware/vra-sdk-go/pkg/models"
712
)
813

914
func dataSourceRegionEnumerationAWS() *schema.Resource {
1015
return &schema.Resource{
11-
Read: dataSourceRegionEnumerationAWSRead,
16+
ReadContext: dataSourceRegionEnumerationAWSRead,
1217

1318
Schema: map[string]*schema.Schema{
1419
"access_key": {
15-
Type: schema.TypeString,
16-
Optional: true,
20+
Type: schema.TypeString,
21+
Required: true,
22+
Description: "Aws Access key ID.",
23+
},
24+
"secret_key": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
Sensitive: true,
28+
Description: "Aws Secret Access Key.",
1729
},
1830
"regions": {
19-
Type: schema.TypeSet,
20-
Computed: true,
31+
Type: schema.TypeSet,
32+
Computed: true,
33+
Description: "A set of region ids that can be enabled for this cloud account.",
2134
Elem: &schema.Schema{
2235
Type: schema.TypeString,
2336
},
2437
},
25-
"secret_key": {
26-
Type: schema.TypeString,
27-
Required: true,
28-
Sensitive: true,
29-
},
3038
},
3139
}
3240
}
3341

34-
func dataSourceRegionEnumerationAWSRead(d *schema.ResourceData, meta interface{}) error {
42+
func dataSourceRegionEnumerationAWSRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
3543
apiClient := meta.(*Client).apiClient
3644

37-
getResp, err := apiClient.CloudAccount.EnumerateAwsRegions(cloud_account.NewEnumerateAwsRegionsParams().WithBody(&models.CloudAccountAwsSpecification{
38-
AccessKeyID: withString(d.Get("access_key").(string)),
39-
SecretAccessKey: withString(d.Get("secret_key").(string)),
40-
}))
45+
enumResp, err := apiClient.CloudAccount.EnumerateAwsRegionsAsync(
46+
cloud_account.NewEnumerateAwsRegionsAsyncParams().
47+
WithAPIVersion(withString(IaaSAPIVersion)).
48+
WithTimeout(IncreasedTimeOut).
49+
WithBody(&models.CloudAccountAwsRegionEnumerationSpecification{
50+
AccessKeyID: d.Get("access_key").(string),
51+
SecretAccessKey: d.Get("secret_key").(string),
52+
}))
53+
if err != nil {
54+
return diag.FromErr(err)
55+
}
56+
57+
stateChangeFunc := resource.StateChangeConf{
58+
Delay: 5 * time.Second,
59+
Pending: []string{models.RequestTrackerStatusINPROGRESS},
60+
Refresh: dataSourceRegionEnumerationReadRefreshFunc(*apiClient, *enumResp.Payload.ID),
61+
Target: []string{models.RequestTrackerStatusFINISHED},
62+
Timeout: d.Timeout(schema.TimeoutRead),
63+
MinTimeout: 5 * time.Second,
64+
}
65+
66+
resourceIds, err := stateChangeFunc.WaitForStateContext(ctx)
67+
if err != nil {
68+
return diag.FromErr(err)
69+
}
70+
enumID := (resourceIds.([]string))[0]
4171

72+
getResp, err := apiClient.CloudAccount.GetRegionEnumerationResult(
73+
cloud_account.NewGetRegionEnumerationResultParams().
74+
WithAPIVersion(withString(IaaSAPIVersion)).
75+
WithTimeout(IncreasedTimeOut).
76+
WithID(enumID))
4277
if err != nil {
43-
return err
78+
return diag.FromErr(err)
4479
}
4580

46-
d.Set("regions", getResp.Payload.ExternalRegionIds)
81+
d.Set("regions", extractIdsFromRegionSpecification(getResp.Payload.ExternalRegions))
4782
d.SetId(d.Get("access_key").(string))
4883

4984
return nil

vra/data_source_region_enumeration_azure.go

Lines changed: 62 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,96 @@
11
package vra
22

33
import (
4+
"context"
5+
"time"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
49
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
510
"github.com/vmware/vra-sdk-go/pkg/client/cloud_account"
611
"github.com/vmware/vra-sdk-go/pkg/models"
712
)
813

914
func dataSourceRegionEnumerationAzure() *schema.Resource {
1015
return &schema.Resource{
11-
Read: dataSourceRegionEnumerationAzureRead,
16+
ReadContext: dataSourceRegionEnumerationAzureRead,
1217

1318
Schema: map[string]*schema.Schema{
1419
"application_id": {
15-
Type: schema.TypeString,
16-
Required: true,
20+
Type: schema.TypeString,
21+
Required: true,
22+
Description: "Azure Client Application ID.",
1723
},
1824
"application_key": {
19-
Type: schema.TypeString,
20-
Required: true,
21-
Sensitive: true,
25+
Type: schema.TypeString,
26+
Required: true,
27+
Sensitive: true,
28+
Description: "Azure Client Application Secret Key.",
29+
},
30+
"subscription_id": {
31+
Type: schema.TypeString,
32+
Required: true,
33+
Description: "Azure Subscription ID.",
34+
},
35+
"tenant_id": {
36+
Type: schema.TypeString,
37+
Required: true,
38+
Description: "Azure Tenant ID.",
2239
},
2340
"regions": {
24-
Type: schema.TypeSet,
25-
Computed: true,
41+
Type: schema.TypeSet,
42+
Computed: true,
43+
Description: "A set of region ids that can be enabled for this cloud account.",
2644
Elem: &schema.Schema{
2745
Type: schema.TypeString,
2846
},
2947
},
30-
"subscription_id": {
31-
Type: schema.TypeString,
32-
Required: true,
33-
},
34-
"tenant_id": {
35-
Type: schema.TypeString,
36-
Required: true,
37-
},
3848
},
3949
}
4050
}
4151

42-
func dataSourceRegionEnumerationAzureRead(d *schema.ResourceData, meta interface{}) error {
52+
func dataSourceRegionEnumerationAzureRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
4353
apiClient := meta.(*Client).apiClient
4454

45-
getResp, err := apiClient.CloudAccount.EnumerateAzureRegions(cloud_account.NewEnumerateAzureRegionsParams().WithBody(&models.CloudAccountAzureSpecification{
46-
ClientApplicationID: withString(d.Get("application_id").(string)),
47-
ClientApplicationSecretKey: withString(d.Get("application_key").(string)),
48-
SubscriptionID: withString(d.Get("subscription_id").(string)),
49-
TenantID: withString(d.Get("tenant_id").(string)),
50-
}))
55+
enumResp, err := apiClient.CloudAccount.EnumerateAzureRegionsAsync(
56+
cloud_account.NewEnumerateAzureRegionsAsyncParams().
57+
WithAPIVersion(withString(IaaSAPIVersion)).
58+
WithTimeout(IncreasedTimeOut).
59+
WithBody(&models.CloudAccountAzureRegionEnumerationSpecification{
60+
ClientApplicationID: d.Get("application_id").(string),
61+
ClientApplicationSecretKey: d.Get("application_key").(string),
62+
SubscriptionID: d.Get("subscription_id").(string),
63+
TenantID: d.Get("tenant_id").(string),
64+
}))
65+
if err != nil {
66+
return diag.FromErr(err)
67+
}
68+
69+
stateChangeFunc := resource.StateChangeConf{
70+
Delay: 5 * time.Second,
71+
Pending: []string{models.RequestTrackerStatusINPROGRESS},
72+
Refresh: dataSourceRegionEnumerationReadRefreshFunc(*apiClient, *enumResp.Payload.ID),
73+
Target: []string{models.RequestTrackerStatusFINISHED},
74+
Timeout: d.Timeout(schema.TimeoutRead),
75+
MinTimeout: 5 * time.Second,
76+
}
77+
78+
resourceIds, err := stateChangeFunc.WaitForStateContext(ctx)
79+
if err != nil {
80+
return diag.FromErr(err)
81+
}
82+
enumID := (resourceIds.([]string))[0]
5183

84+
getResp, err := apiClient.CloudAccount.GetRegionEnumerationResult(
85+
cloud_account.NewGetRegionEnumerationResultParams().
86+
WithAPIVersion(withString(IaaSAPIVersion)).
87+
WithTimeout(IncreasedTimeOut).
88+
WithID(enumID))
5289
if err != nil {
53-
return err
90+
return diag.FromErr(err)
5491
}
5592

56-
d.Set("regions", getResp.Payload.ExternalRegionIds)
93+
d.Set("regions", extractIdsFromRegionSpecification(getResp.Payload.ExternalRegions))
5794
d.SetId(d.Get("application_id").(string))
5895

5996
return nil

0 commit comments

Comments
 (0)