Skip to content

Commit 6af6ee3

Browse files
authored
Add region type filtering for regions (#391)
1 parent f4853d5 commit 6af6ee3

File tree

7 files changed

+177
-12
lines changed

7 files changed

+177
-12
lines changed

docs/data-sources/available_regions.md

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,52 @@ Retrieve a list of available cloud regions in Astra
1313
## Example Usage
1414

1515
```terraform
16-
data "astra_available_regions" "regions" {
16+
# Get all available "serverless" regions. With no filtering only "serverless" regions are returned.
17+
data "astra_available_regions" "serverless_regions" {
18+
}
19+
20+
# Get all available "serverless" regions, with explicit filtering for "serverless"
21+
data "astra_available_regions" "serverless_regions" {
22+
region_type = "serverless"
23+
}
24+
25+
# Get all available "vector" regions
26+
data "astra_available_regions" "vector_regions" {
27+
region_type = "vector"
28+
}
29+
30+
# Get all available regions, regardless of type
31+
data "astra_available_regions" "all_regions" {
32+
region_type = "all"
33+
}
34+
35+
# Filter regions by cloud provider (one of "aws", "azure", "gcp")
36+
data "astra_available_regions" "aws_serverless_regions" {
37+
cloud_provider = "aws"
38+
}
39+
40+
# Filter regions by enabled status
41+
data "astra_available_regions" "enabled_regions" {
42+
only_enabled = true
43+
}
44+
45+
# Filter only enabled regions in GCP for vector
46+
data "astra_available_regions" "gcp_vector_regions" {
47+
region_type = "vector"
48+
cloud_provider = "gcp"
49+
only_enabled = true
1750
}
1851
```
1952

2053
<!-- schema generated by tfplugindocs -->
2154
## Schema
2255

56+
### Optional
57+
58+
- `cloud_provider` (String) The cloud provider to filter by
59+
- `only_enabled` (Boolean) Whether to filter by enabled regions. If 'false' or omitted, all regions are returned, enabled or not
60+
- `region_type` (String) The region type to filter by (currently either 'serverless', 'vector' or 'all'). If omitted, the default is 'serverless'
61+
2362
### Read-Only
2463

2564
- `id` (String) The ID of this resource.
@@ -32,5 +71,8 @@ Read-Only:
3271

3372
- `cloud_provider` (String)
3473
- `display_name` (String)
74+
- `enabled` (Boolean)
3575
- `region` (String)
76+
- `region_type` (String)
77+
- `reserved_for_qualified_users` (Boolean)
3678
- `zone` (String)
Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,35 @@
1-
data "astra_available_regions" "regions" {
1+
# Get all available "serverless" regions. With no filtering only "serverless" regions are returned.
2+
data "astra_available_regions" "serverless_regions" {
3+
}
4+
5+
# Get all available "serverless" regions, with explicit filtering for "serverless"
6+
data "astra_available_regions" "serverless_regions" {
7+
region_type = "serverless"
8+
}
9+
10+
# Get all available "vector" regions
11+
data "astra_available_regions" "vector_regions" {
12+
region_type = "vector"
13+
}
14+
15+
# Get all available regions, regardless of type
16+
data "astra_available_regions" "all_regions" {
17+
region_type = "all"
18+
}
19+
20+
# Filter regions by cloud provider (one of "aws", "azure", "gcp")
21+
data "astra_available_regions" "aws_serverless_regions" {
22+
cloud_provider = "aws"
23+
}
24+
25+
# Filter regions by enabled status
26+
data "astra_available_regions" "enabled_regions" {
27+
only_enabled = true
28+
}
29+
30+
# Filter only enabled regions in GCP for vector
31+
data "astra_available_regions" "gcp_vector_regions" {
32+
region_type = "vector"
33+
cloud_provider = "gcp"
34+
only_enabled = true
235
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.21
55
toolchain go1.22.0
66

77
require (
8-
github.com/datastax/astra-client-go/v2 v2.2.52
8+
github.com/datastax/astra-client-go/v2 v2.2.53
99
github.com/datastax/pulsar-admin-client-go v0.0.0-20230707040954-1a4745e07587
1010
github.com/google/uuid v1.6.0
1111
github.com/hashicorp/go-cty v1.4.1-0.20200414143053-d3edf31b6320

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
101101
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
102102
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
103103
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
104-
github.com/datastax/astra-client-go/v2 v2.2.52 h1:gpW7tRA3FvTX55SNeKbgOz+67T9XYm5OIvjLguhQzJw=
105-
github.com/datastax/astra-client-go/v2 v2.2.52/go.mod h1:zxXWuqDkYia7PzFIL3T7RmjChc9LN81UnfI2yB4kE7M=
104+
github.com/datastax/astra-client-go/v2 v2.2.53 h1:qWCBksV9rWi9WmSBW71IGhy3mL/QwkEw1BMG42ph540=
105+
github.com/datastax/astra-client-go/v2 v2.2.53/go.mod h1:zxXWuqDkYia7PzFIL3T7RmjChc9LN81UnfI2yB4kE7M=
106106
github.com/datastax/pulsar-admin-client-go v0.0.0-20230707040954-1a4745e07587 h1:3jv+O0hWcz3oj3sZ9/Ov9/m1Vaqx8Ql8jp5ZeA13O5A=
107107
github.com/datastax/pulsar-admin-client-go v0.0.0-20230707040954-1a4745e07587/go.mod h1:guL8YZ5gJINN+h5Kmja1AnuzhxLU3sHQL8o/8HYLtqk=
108108
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

internal/provider/data_source_available_regions.go

Lines changed: 62 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,44 @@ package provider
22

33
import (
44
"context"
5+
"strings"
56

67
"github.com/datastax/astra-client-go/v2/astra"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
89
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/id"
910
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1012
)
1113

14+
var regionTypes = []string{"serverless", "vector", "all"}
15+
1216
func dataSourceAvailableRegions() *schema.Resource {
1317
return &schema.Resource{
1418
Description: "Retrieve a list of available cloud regions in Astra",
1519

1620
ReadContext: dataSourceRegionsRead,
1721

1822
Schema: map[string]*schema.Schema{
23+
"cloud_provider": {
24+
Type: schema.TypeString,
25+
Description: "The cloud provider to filter by",
26+
Optional: true,
27+
ValidateFunc: validation.StringInSlice(availableCloudProviders, true),
28+
DiffSuppressFunc: ignoreCase,
29+
},
30+
"region_type": {
31+
Type: schema.TypeString,
32+
Description: "The region type to filter by (currently either 'serverless', 'vector' or 'all'). If omitted, the default is 'serverless'",
33+
Optional: true,
34+
ValidateFunc: validation.StringInSlice(regionTypes, true),
35+
DiffSuppressFunc: ignoreCase,
36+
},
37+
"only_enabled": {
38+
Type: schema.TypeBool,
39+
Description: "Whether to filter by enabled regions. If 'false' or omitted, all regions are returned, enabled or not",
40+
Optional: true,
41+
Default: false,
42+
},
1943
"results": {
2044
Type: schema.TypeList,
2145
Description: "The list of supported Astra regions by cloud provider and tier.",
@@ -42,6 +66,21 @@ func dataSourceAvailableRegions() *schema.Resource {
4266
Type: schema.TypeString,
4367
Computed: true,
4468
},
69+
"region_type": {
70+
Description: "The region type, either serverless or vector",
71+
Type: schema.TypeString,
72+
Computed: true,
73+
},
74+
"enabled": {
75+
Description: "Whether the region is enabled",
76+
Type: schema.TypeBool,
77+
Computed: true,
78+
},
79+
"reserved_for_qualified_users": {
80+
Description: "Whether the region is reserved for qualified users",
81+
Type: schema.TypeBool,
82+
Computed: true,
83+
},
4584
},
4685
},
4786
},
@@ -52,7 +91,14 @@ func dataSourceAvailableRegions() *schema.Resource {
5291
func dataSourceRegionsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
5392
client := meta.(astraClients).astraClient.(*astra.ClientWithResponses)
5493

55-
regionsResp, err := client.ListServerlessRegionsWithResponse(ctx)
94+
params := &astra.ListServerlessRegionsParams{}
95+
if d, ok := d.GetOk("region_type"); ok {
96+
regionType := d.(string)
97+
params.RegionType = &regionType
98+
}
99+
cloud_provider := d.Get("cloud_provider").(string)
100+
enabled := d.Get("only_enabled").(bool)
101+
regionsResp, err := client.ListServerlessRegionsWithResponse(ctx, params)
56102
if err != nil {
57103
return diag.FromErr(err)
58104
} else if regionsResp.StatusCode() != 200 {
@@ -66,6 +112,14 @@ func dataSourceRegionsRead(ctx context.Context, d *schema.ResourceData, meta int
66112
regions := *regionsResp.JSON200
67113
flatRegions := make([]map[string]interface{}, 0, len(regions))
68114
for _, region := range regions {
115+
if cloud_provider != "" && !strings.EqualFold(string(region.CloudProvider), cloud_provider) {
116+
// skip
117+
continue
118+
}
119+
if enabled && !*region.Enabled {
120+
// skip
121+
continue
122+
}
69123
flatRegions = append(flatRegions, flattenRegion(&region))
70124
}
71125

@@ -79,9 +133,12 @@ func dataSourceRegionsRead(ctx context.Context, d *schema.ResourceData, meta int
79133

80134
func flattenRegion(region *astra.ServerlessRegion) map[string]interface{} {
81135
return map[string]interface{}{
82-
"cloud_provider": region.CloudProvider,
83-
"region": region.Name,
84-
"zone": region.Zone,
85-
"display_name": region.DisplayName,
136+
"cloud_provider": region.CloudProvider,
137+
"region": region.Name,
138+
"zone": region.Zone,
139+
"display_name": region.DisplayName,
140+
"region_type": region.RegionType,
141+
"enabled": region.Enabled,
142+
"reserved_for_qualified_users": region.ReservedForQualifiedUsers,
86143
}
87144
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package provider
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAvailableRegionsDataSource(t *testing.T) {
11+
resource.Test(t, resource.TestCase{
12+
PreCheck: func() { testAccPreCheck(t) },
13+
Providers: testAccProviders,
14+
Steps: []resource.TestStep{
15+
{
16+
Config: testAccAvailableRegionsDataSource(),
17+
},
18+
},
19+
})
20+
}
21+
22+
// https://www.terraform.io/docs/extend/testing/acceptance-tests/index.html
23+
func testAccAvailableRegionsDataSource() string {
24+
return fmt.Sprintf(`
25+
data "astra_available_regions" "dev" {
26+
}
27+
`)
28+
}

internal/provider/resource_database.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,8 +596,13 @@ func flattenDatabase(db *astra.Database) map[string]interface{} {
596596
}
597597

598598
func ensureValidRegions(ctx context.Context, client *astra.ClientWithResponses, resourceData *schema.ResourceData) diag.Diagnostics {
599-
// get the list of serveless regions
600-
regionsResp, err := client.ListServerlessRegionsWithResponse(ctx)
599+
params := &astra.ListServerlessRegionsParams{}
600+
// get the list of regions
601+
if resourceData.Get("db_type").(string) == "vector" {
602+
regionType := "vector"
603+
params.RegionType = &regionType
604+
}
605+
regionsResp, err := client.ListServerlessRegionsWithResponse(ctx, params)
601606
if err != nil {
602607
return diag.FromErr(err)
603608
} else if regionsResp.StatusCode() != http.StatusOK {

0 commit comments

Comments
 (0)