Skip to content

Commit e6f57b3

Browse files
authored
fix(datastores): fix availability zones parsing (#16)
* fix(datastores): fix availability zones parsing * also include az in the test
1 parent 21200ff commit e6f57b3

File tree

5 files changed

+45
-28
lines changed

5 files changed

+45
-28
lines changed

examples/network/main.tf

+17-10
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,40 @@ terraform {
88

99
provider "dfcloud" {
1010
# Configuration options
11+
api_host = "api.dev.dragonflydb.cloud"
1112
}
1213

1314

1415
# private network
1516
resource "dfcloud_network" "network" {
1617
name = "network"
1718
location = {
18-
region = "us-east-1"
19+
region = "eu-west-1"
1920
provider = "aws"
2021
}
2122
cidr_block = "192.168.0.0/16"
2223
}
2324

24-
resource "dfcloud_datastore" "datastore" {
25-
name = "tf-test-no-pass"
25+
26+
resource "dfcloud_datastore" "test" {
27+
name = "my-cache-datastore-test"
28+
network_id = dfcloud_network.network.id
29+
30+
location = {
31+
region = "eu-west-1"
32+
availability_zones = ["euw1-az2"]
33+
provider = "aws"
34+
}
35+
36+
disable_pass_key = true
2637

2738
tier = {
2839
max_memory_bytes = 3000000000
2940
performance_tier = "dev"
30-
replicas = 1
41+
replicas = 0
3142
}
3243

33-
location = {
34-
region = "us-east-1"
35-
provider = "aws"
44+
dragonfly = {
45+
cache_mode = false
3646
}
37-
38-
disable_pass_key = true
39-
network_id = dfcloud_network.network.id
4047
}

internal/provider/datastore.go

+15-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import (
1010
"github.com/hashicorp/terraform-plugin-framework/resource"
1111
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
1212
"github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier"
13+
"github.com/hashicorp/terraform-plugin-framework/resource/schema/listplanmodifier"
1314
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
15+
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
1416
"github.com/hashicorp/terraform-plugin-framework/types"
1517
"github.com/hashicorp/terraform-plugin-log/tflog"
1618
)
@@ -73,16 +75,25 @@ func (r *datastoreResource) Schema(_ context.Context, _ resource.SchemaRequest,
7375
"provider": schema.StringAttribute{
7476
MarkdownDescription: "The provider for the datastore location.",
7577
Required: true,
78+
PlanModifiers: []planmodifier.String{
79+
stringplanmodifier.RequiresReplace(),
80+
},
7681
},
7782
"region": schema.StringAttribute{
7883
MarkdownDescription: "The region for the datastore location.",
7984
Required: true,
85+
PlanModifiers: []planmodifier.String{
86+
stringplanmodifier.RequiresReplace(),
87+
},
8088
},
8189
"availability_zones": schema.ListAttribute{
8290
MarkdownDescription: "The availability zones for the datastore location.",
8391
ElementType: types.StringType,
8492
Optional: true,
8593
Computed: true,
94+
PlanModifiers: []planmodifier.List{
95+
listplanmodifier.RequiresReplace(),
96+
},
8697
},
8798
},
8899
},
@@ -203,7 +214,7 @@ func (r *datastoreResource) Create(ctx context.Context, req resource.CreateReque
203214
"status": respDatastore.Status,
204215
})
205216

206-
plan.FromConfig(respDatastore)
217+
plan.FromConfig(ctx, respDatastore)
207218
diags = resp.State.Set(ctx, &plan)
208219
resp.Diagnostics.Append(diags...)
209220
}
@@ -233,7 +244,7 @@ func (r *datastoreResource) Read(ctx context.Context, req resource.ReadRequest,
233244
"status": respDatastore.Status,
234245
})
235246

236-
state.FromConfig(respDatastore)
247+
state.FromConfig(ctx, respDatastore)
237248
diags = resp.State.Set(ctx, &state)
238249
resp.Diagnostics.Append(diags...)
239250
}
@@ -284,7 +295,7 @@ func (r *datastoreResource) Update(ctx context.Context, req resource.UpdateReque
284295
"status": respDatastore.Status,
285296
})
286297

287-
plan.FromConfig(respDatastore)
298+
plan.FromConfig(ctx, respDatastore)
288299
diags = resp.State.Set(ctx, &plan)
289300
resp.Diagnostics.Append(diags...)
290301
}
@@ -324,7 +335,7 @@ func (r *datastoreResource) ImportState(ctx context.Context, req resource.Import
324335
}
325336

326337
var plan resource_model.Datastore
327-
plan.FromConfig(datastore)
338+
plan.FromConfig(ctx, datastore)
328339
diags := resp.State.Set(ctx, &plan)
329340
resp.Diagnostics.Append(diags...)
330341
}

internal/provider/datastore_test.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ func TestAcc_DatastoreResource(t *testing.T) {
6767
testCheckDatastoreExists("dfcloud_datastore.test"),
6868
resource.TestCheckResourceAttr("dfcloud_datastore.test", "name", name),
6969
resource.TestCheckResourceAttr("dfcloud_datastore.test", "location.provider", "aws"),
70-
resource.TestCheckResourceAttr("dfcloud_datastore.test", "location.region", "us-east-1"),
70+
resource.TestCheckResourceAttr("dfcloud_datastore.test", "location.region", "eu-west-1"),
71+
resource.TestCheckResourceAttr("dfcloud_datastore.test", "location.availability_zones.#", "1"),
72+
resource.TestCheckResourceAttr("dfcloud_datastore.test", "location.availability_zones.0", "euw1-az2"),
7173
resource.TestCheckResourceAttr("dfcloud_datastore.test", "tier.performance_tier", "dev"),
7274
resource.TestCheckResourceAttr("dfcloud_datastore.test", "tier.max_memory_bytes", "3000000000"),
7375
resource.TestCheckResourceAttr("dfcloud_datastore.test", "tier.replicas", "1"),
@@ -96,7 +98,8 @@ resource "dfcloud_datastore" "test" {
9698
9799
location = {
98100
provider = "aws"
99-
region = "us-east-1"
101+
region = "eu-west-1"
102+
availability_zones = ["euw1-az2"]
100103
}
101104
102105
tier = {

internal/resource_model/datastore.go

+7-11
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,21 @@ type DatastoreTier struct {
3636
Replicas types.Int64 `tfsdk:"replicas"`
3737
}
3838

39-
func (d *Datastore) FromConfig(in *dfcloud.Datastore) {
39+
func (d *Datastore) FromConfig(ctx context.Context, in *dfcloud.Datastore) {
4040
d.ID = types.StringValue(in.ID)
4141
d.Name = types.StringValue(in.Config.Name)
4242
d.NetworkId = types.StringNull()
4343
d.CreatedAt = types.Int64Value(in.CreatedAt)
4444
d.Location.Provider = types.StringValue(string(in.Config.Location.Provider))
4545
d.Location.Region = types.StringValue(in.Config.Location.Region)
46-
d.Location.AvailabilityZones, _ = types.ListValueFrom(context.Background(), types.StringType, in.Config.Location.AvailabilityZones)
46+
d.Location.AvailabilityZones, _ = types.ListValueFrom(ctx, types.StringType, in.Config.Location.AvailabilityZones)
4747
d.Addr = types.StringValue(in.Addr)
4848
d.Password = types.StringValue(in.Key)
4949
d.Tier.Memory = types.Int64Value(int64(in.Config.Tier.Memory))
5050
d.Tier.PerformanceTier = types.StringValue(string(in.Config.Tier.PerformanceTier))
5151
d.Tier.Replicas = types.Int64Value(int64(*in.Config.Tier.Replicas))
5252

53-
aclRules, _ := types.ListValueFrom(context.Background(), types.StringType, in.Config.Dragonfly.AclRules)
53+
aclRules, _ := types.ListValueFrom(ctx, types.StringType, in.Config.Dragonfly.AclRules)
5454
d.Dragonfly = types.ObjectValueMust(map[string]attr.Type{
5555
"cache_mode": types.BoolType,
5656
"tls": types.BoolType,
@@ -74,19 +74,13 @@ func (d *Datastore) FromConfig(in *dfcloud.Datastore) {
7474
}
7575

7676
func IntoDatastoreConfig(in Datastore) *dfcloud.Datastore {
77-
var zones []string
78-
for _, z := range in.Location.AvailabilityZones.Elements() {
79-
zones = append(zones, z.String())
80-
}
81-
8277
datastore := &dfcloud.Datastore{
8378
ID: in.ID.ValueString(),
8479
Config: dfcloud.DatastoreConfig{
8580
Name: in.Name.ValueString(),
8681
Location: dfcloud.DatastoreLocation{
87-
Provider: dfcloud.CloudProvider(in.Location.Provider.ValueString()),
88-
Region: in.Location.Region.ValueString(),
89-
AvailabilityZones: zones,
82+
Provider: dfcloud.CloudProvider(in.Location.Provider.ValueString()),
83+
Region: in.Location.Region.ValueString(),
9084
},
9185
Tier: dfcloud.DatastoreTier{
9286
Memory: uint64(in.Tier.Memory.ValueInt64()),
@@ -96,6 +90,8 @@ func IntoDatastoreConfig(in Datastore) *dfcloud.Datastore {
9690
},
9791
}
9892

93+
_ = in.Location.AvailabilityZones.ElementsAs(context.Background(), &datastore.Config.Location.AvailabilityZones, false)
94+
9995
if !in.NetworkId.IsNull() {
10096
datastore.Config.NetworkID = in.NetworkId.ValueString()
10197
}

internal/sdk/datastore.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type DatastoreLocation struct {
1414
Region string `json:"region"`
1515
// AvailabilityZones indicates which availability zones the datastore
1616
// should use in priority order.
17-
AvailabilityZones []string `json:"availability_zones"`
17+
AvailabilityZones []string `json:"availability_zones" mapstructure:"availability_zones"`
1818
}
1919

2020
type PerformanceTier string

0 commit comments

Comments
 (0)