Skip to content

Commit e20ff09

Browse files
Codelaxremyleone
andauthored
feat(redis): add data source (#1245)
Co-authored-by: Rémy Léone <[email protected]>
1 parent bc155b3 commit e20ff09

6 files changed

+2153
-0
lines changed

docs/data-sources/redis_cluster.md

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
---
2+
layout: "scaleway"
3+
page_title: "Scaleway: scaleway_redis_instance"
4+
description: |-
5+
Gets information about a Redis cluster.
6+
---
7+
8+
# scaleway_redis_cluster
9+
10+
Gets information about a Redis cluster.
11+
12+
## Example Usage
13+
14+
```hcl
15+
# Get info by name
16+
data "scaleway_redis_cluster" "my_cluster" {
17+
name = "foobar"
18+
}
19+
20+
# Get info by cluster ID
21+
data "scaleway_redis_cluster" "my_cluster" {
22+
cluster_id = "11111111-1111-1111-1111-111111111111"
23+
}
24+
```
25+
26+
## Argument Reference
27+
28+
- `name` - (Optional) The name of the Redis cluster.
29+
Only one of the `name` and `cluster_id` should be specified.
30+
31+
- `cluster_id` - (Optional) The Redis cluster ID.
32+
Only one of the `name` and `cluster_id` should be specified.
33+
34+
- `zone` - (Default to [provider](../index.md) `region`) The [zone](../guides/regions_and_zones.md#zones) in which the server exists.
35+
36+
- `project_id` - (Default to [provider](../index.md) `project_id`)

scaleway/data_source_redis_cluster.go

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package scaleway
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
redis "github.com/scaleway/scaleway-sdk-go/api/redis/v1alpha1"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func dataSourceScalewayRedisCluster() *schema.Resource {
14+
// Generate datasource schema from resource
15+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayRedisCluster().Schema)
16+
// Set 'Optional' schema elements
17+
addOptionalFieldsToSchema(dsSchema, "name", "zone")
18+
19+
dsSchema["name"].ConflictsWith = []string{"cluster_id"}
20+
dsSchema["cluster_id"] = &schema.Schema{
21+
Type: schema.TypeString,
22+
Optional: true,
23+
Description: "The ID of the Redis cluster",
24+
ConflictsWith: []string{"name"},
25+
ValidateFunc: validationUUIDorUUIDWithLocality(),
26+
}
27+
28+
return &schema.Resource{
29+
ReadContext: dataSourceScalewayRedisClusterRead,
30+
Schema: dsSchema,
31+
}
32+
}
33+
34+
func dataSourceScalewayRedisClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
35+
api, zone, err := redisAPIWithZone(d, meta)
36+
if err != nil {
37+
return diag.FromErr(err)
38+
}
39+
40+
clusterID, ok := d.GetOk("cluster_id")
41+
if !ok {
42+
res, err := api.ListClusters(&redis.ListClustersRequest{
43+
Zone: zone,
44+
Name: expandStringPtr(d.Get("name")),
45+
ProjectID: expandStringPtr(d.Get("project_id")),
46+
}, scw.WithContext(ctx))
47+
if err != nil {
48+
return diag.FromErr(err)
49+
}
50+
for _, cluster := range res.Clusters {
51+
if cluster.Name == d.Get("name").(string) {
52+
if clusterID != "" {
53+
return diag.FromErr(fmt.Errorf("more than 1 cluster found with the same name %s", d.Get("name")))
54+
}
55+
clusterID = cluster.ID
56+
}
57+
}
58+
if clusterID == "" {
59+
return diag.FromErr(fmt.Errorf("no clusters found with the name %s", d.Get("name")))
60+
}
61+
}
62+
63+
zonedID := datasourceNewZonedID(clusterID, zone)
64+
d.SetId(zonedID)
65+
err = d.Set("cluster_id", zonedID)
66+
if err != nil {
67+
return diag.FromErr(err)
68+
}
69+
70+
// Check if cluster exist as Read will return nil if resource does not exist
71+
// clusterID may be zoned if using name in data source
72+
getReq := &redis.GetClusterRequest{
73+
Zone: zone,
74+
ClusterID: expandID(clusterID.(string)),
75+
}
76+
_, err = api.GetCluster(getReq, scw.WithContext(ctx))
77+
if err != nil {
78+
return diag.FromErr(fmt.Errorf("no clusters found with the id %s", clusterID))
79+
}
80+
81+
return resourceScalewayRedisClusterRead(ctx, d, meta)
82+
}
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceRedisCluster_Basic(t *testing.T) {
10+
tt := NewTestTools(t)
11+
defer tt.Cleanup()
12+
resource.ParallelTest(t, resource.TestCase{
13+
PreCheck: func() { testAccPreCheck(t) },
14+
ProviderFactories: tt.ProviderFactories,
15+
CheckDestroy: testAccCheckScalewayRedisClusterDestroy(tt),
16+
Steps: []resource.TestStep{
17+
{
18+
Config: `
19+
resource "scaleway_redis_cluster" "test" {
20+
name = "test_redis_datasource_terraform"
21+
version = "6.2.6"
22+
node_type = "MDB-BETA-M"
23+
user_name = "my_initial_user"
24+
password = "thiZ_is_v&ry_s3cret"
25+
}
26+
27+
data "scaleway_redis_cluster" "test" {
28+
name = scaleway_redis_cluster.test.name
29+
}
30+
31+
data "scaleway_redis_cluster" "test2" {
32+
cluster_id = scaleway_redis_cluster.test.id
33+
}
34+
`,
35+
Check: resource.ComposeTestCheckFunc(
36+
testAccCheckScalewayRedisExists(tt, "scaleway_redis_cluster.test"),
37+
38+
resource.TestCheckResourceAttr("data.scaleway_redis_cluster.test", "name", "test_redis_datasource_terraform"),
39+
resource.TestCheckResourceAttrSet("data.scaleway_redis_cluster.test", "id"),
40+
41+
resource.TestCheckResourceAttr("data.scaleway_redis_cluster.test2", "name", "test_redis_datasource_terraform"),
42+
resource.TestCheckResourceAttrSet("data.scaleway_redis_cluster.test2", "id"),
43+
),
44+
},
45+
},
46+
})
47+
}

scaleway/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ func Provider(config *ProviderConfig) plugin.ProviderFunc {
133133
"scaleway_rdb_instance": dataSourceScalewayRDBInstance(),
134134
"scaleway_rdb_database": dataSourceScalewayRDBDatabase(),
135135
"scaleway_rdb_privilege": dataSourceScalewayRDBPrivilege(),
136+
"scaleway_redis_cluster": dataSourceScalewayRedisCluster(),
136137
"scaleway_registry_namespace": dataSourceScalewayRegistryNamespace(),
137138
"scaleway_registry_image": dataSourceScalewayRegistryImage(),
138139
"scaleway_vpc_public_gateway": dataSourceScalewayVPCPublicGateway(),

scaleway/resource_redis_cluster.go

+2
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ func resourceScalewayRedisCluster() *schema.Resource {
6262
"cluster_size": {
6363
Type: schema.TypeInt,
6464
Optional: true,
65+
Computed: true,
6566
Description: "Number of nodes for the cluster.",
6667
},
6768
"tls_enabled": {
@@ -130,6 +131,7 @@ func resourceScalewayRedisClusterCreate(ctx context.Context, d *schema.ResourceD
130131

131132
return resourceScalewayRedisClusterRead(ctx, d, meta)
132133
}
134+
133135
func resourceScalewayRedisClusterRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
134136
redisAPI, zone, ID, err := redisAPIWithZoneAndID(meta, d.Id())
135137
if err != nil {

0 commit comments

Comments
 (0)