Skip to content

Commit d9f73ac

Browse files
Merge pull request #680 from RedisLabs/fix/privatelink-delete-loop
2 parents 55f62e2 + 5259670 commit d9f73ac

10 files changed

+192
-152
lines changed

.github/workflows/terraform_provider_pr.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,17 @@ jobs:
171171
go-version-file: go.mod
172172
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudProDatabase_Upgrade"'
173173

174+
go_test_privatelink:
175+
name: go test smoke privatelink
176+
needs: [ go_build ]
177+
runs-on: ubuntu-latest
178+
steps:
179+
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
180+
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
181+
with:
182+
go-version-file: go.mod
183+
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudPrivateLink_CRUDI"'
184+
174185

175186
tfproviderlint:
176187
name: tfproviderlint

go.mod

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

77
require (
8-
github.com/RedisLabs/rediscloud-go-api v0.36.4
8+
github.com/RedisLabs/rediscloud-go-api v0.36.5
99
github.com/bflad/tfproviderlint v0.31.0
1010
github.com/hashicorp/go-cty v1.5.0
1111
github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
44
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
55
github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
66
github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
7-
github.com/RedisLabs/rediscloud-go-api v0.36.4 h1:EBoyJ3SyvfX4MjTB5MNs5s+hhYTVSVzjdhNtPJDcfMw=
8-
github.com/RedisLabs/rediscloud-go-api v0.36.4/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
7+
github.com/RedisLabs/rediscloud-go-api v0.36.5 h1:zZ5C2+QHdfdlGqZDw3o2GMM7Wz5BhLUUW8U3yGFl1ck=
8+
github.com/RedisLabs/rediscloud-go-api v0.36.5/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
99
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
1010
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
1111
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=

provider/privatelink/resource_rediscloud_active_active_private_link.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"regexp"
77
"strconv"
8+
"strings"
89
"time"
910

1011
"github.com/RedisLabs/rediscloud-go-api/redis"
@@ -65,7 +66,7 @@ func ResourceRedisCloudActiveActivePrivateLink() *schema.Resource {
6566
},
6667
"principal_type": {
6768
Type: schema.TypeString,
68-
ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(aws_account|organization|organization_unit|iam_role|iam_user|service_principal)$"), "Must be an allowed Principal Type. ('aws_account', 'organization', 'organization_unit', 'iam_role', 'iam_user')'")),
69+
ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(aws_account|organization|organization_unit|iam_role|iam_user|service_principal)$"), "Must be an allowed Principal Type. ('aws_account', 'organization', 'organization_unit', 'iam_role', 'iam_user', 'service_principal')'")),
6970
Required: true,
7071
},
7172
"principal_alias": {
@@ -180,8 +181,6 @@ func resourceRedisCloudActiveActivePrivateLinkCreate(ctx context.Context, d *sch
180181
return diag.FromErr(err)
181182
}
182183

183-
d.SetId(strconv.Itoa(subId))
184-
185184
err = waitForActiveActivePrivateLinkToBeActive(ctx, api, subId, regionId)
186185

187186
if err != nil {
@@ -212,13 +211,30 @@ func resourceRedisCloudActiveActivePrivateLinkRead(ctx context.Context, d *schem
212211
var diags diag.Diagnostics
213212
api := meta.(*client.ApiClient)
214213

215-
subId, err := strconv.Atoi(d.Get("subscription_id").(string))
214+
parts := strings.Split(d.Id(), "/")
215+
if len(parts) != 2 {
216+
return diag.Errorf("unexpected format of ID (%q), expected <subscription_id>/<region_id>", d.Id())
217+
}
216218

219+
subId, err := strconv.Atoi(parts[0])
220+
if err != nil {
221+
return diag.FromErr(err)
222+
}
223+
regionId, err := strconv.Atoi(parts[1])
217224
if err != nil {
218225
return diag.FromErr(err)
219226
}
227+
err = d.Set("subscription_id", strconv.Itoa(subId))
220228

221-
regionId := d.Get("region_id").(int)
229+
if err != nil {
230+
return diag.FromErr(err)
231+
}
232+
233+
err = d.Set("region_id", regionId)
234+
235+
if err != nil {
236+
return diag.FromErr(err)
237+
}
222238

223239
privateLinkId := makeActiveActivePrivateLinkId(subId, regionId)
224240
d.SetId(privateLinkId)
@@ -233,8 +249,6 @@ func resourceRedisCloudActiveActivePrivateLinkRead(ctx context.Context, d *schem
233249
return diag.FromErr(err)
234250
}
235251

236-
d.SetId(strconv.Itoa(subId))
237-
238252
err = d.Set("share_name", privateLink.ShareName)
239253
if err != nil {
240254
return diag.FromErr(err)

provider/privatelink/resource_rediscloud_private_link.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func ResourceRedisCloudPrivateLink() *schema.Resource {
5959
},
6060
"principal_type": {
6161
Type: schema.TypeString,
62-
ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(aws_account|organization|organization_unit|iam_role|iam_user|service_principal)$"), "must be 'credit-card' or 'marketplace'")),
62+
ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(aws_account|organization|organization_unit|iam_role|iam_user|service_principal)$"), "must be one of 'aws_account', 'organization', 'organization_unit', 'iam_role', 'iam_user', 'service_principal'")),
6363
Required: true,
6464
},
6565
"principal_alias": {
@@ -202,7 +202,10 @@ func resourceRedisCloudPrivateLinkRead(ctx context.Context, d *schema.ResourceDa
202202
var diags diag.Diagnostics
203203
api := meta.(*client.ApiClient)
204204

205-
subId, err := strconv.Atoi(d.Get("subscription_id").(string))
205+
subId, err := strconv.Atoi(d.Id())
206+
if err != nil {
207+
return diag.FromErr(err)
208+
}
206209

207210
privateLink, err := api.Client.PrivateLink.GetPrivateLink(ctx, subId)
208211

@@ -217,6 +220,11 @@ func resourceRedisCloudPrivateLinkRead(ctx context.Context, d *schema.ResourceDa
217220

218221
d.SetId(strconv.Itoa(subId))
219222

223+
err = d.Set("subscription_id", strconv.Itoa(subId))
224+
if err != nil {
225+
return diag.FromErr(err)
226+
}
227+
220228
err = d.Set("share_name", privateLink.ShareName)
221229
if err != nil {
222230
return diag.FromErr(err)
@@ -256,7 +264,7 @@ func resourceRedisCloudPrivateLinkUpdate(ctx context.Context, d *schema.Resource
256264
var diags diag.Diagnostics
257265
api := meta.(*client.ApiClient)
258266

259-
if d.HasChange("principals") {
267+
if d.HasChange("principal") {
260268

261269
subId, err := strconv.Atoi(d.Get("subscription_id").(string))
262270

@@ -279,7 +287,7 @@ func resourceRedisCloudPrivateLinkUpdate(ctx context.Context, d *schema.Resource
279287
}
280288

281289
apiPrincipals := privateLink.Principals
282-
tfPrincipals := principalsFromSet(d.Get("principals").(*schema.Set))
290+
tfPrincipals := principalsFromSet(d.Get("principal").(*schema.Set))
283291

284292
principalsToCreate := findPrincipalsToCreate(apiPrincipals, tfPrincipals)
285293
err = createPrincipals(ctx, api, subId, principalsToCreate)
@@ -337,7 +345,7 @@ func resourceRedisCloudPrivateLinkDelete(ctx context.Context, d *schema.Resource
337345
return diag.FromErr(err)
338346
}
339347

340-
return resourceRedisCloudPrivateLinkDelete(ctx, d, meta)
348+
return diags
341349
}
342350

343351
func createOtherPrincipals(ctx context.Context, api *client.ApiClient, subId int, otherPrincipals []pl.PrivateLinkPrincipal) error {

provider/privatelink/testdata/testActiveActivePrivateLink.tf

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3,78 +3,87 @@ locals {
33
rediscloud_cloud_account = "%s"
44
rediscloud_private_link_share_name = "%s"
55
rediscloud_database_password = "%s"
6-
rediscloud_principal_1 = "%s"
7-
rediscloud_principal_2 = "%s"
86
}
97

108
data "rediscloud_payment_method" "card" {
119
card_type = "Visa"
1210
last_four_numbers = "5556"
1311
}
1412

15-
data "rediscloud_cloud_account" "account" {
16-
exclude_internal_account = true
17-
provider_type = "AWS"
18-
name = local.rediscloud_cloud_account
19-
}
2013

21-
resource "rediscloud_active_active_subscription" "subscription" {
14+
resource "rediscloud_active_active_subscription" "aa_subscription" {
2215
name = local.rediscloud_subscription_name
16+
payment_method = "credit-card"
2317
payment_method_id = data.rediscloud_payment_method.card.id
18+
cloud_provider = "AWS"
2419

25-
cloud_provider {
26-
provider = data.rediscloud_cloud_account.account.provider_type
27-
cloud_account_id = data.rediscloud_cloud_account.account.id
20+
creation_plan {
21+
memory_limit_in_gb = 1
22+
quantity = 1
2823
region {
29-
region = "eu-west-1"
30-
networking_deployment_cidr = "10.0.0.0/24"
31-
preferred_availability_zones = ["eu-west-1a"]
24+
region = "eu-west-1"
25+
networking_deployment_cidr = "192.168.0.0/24"
26+
write_operations_per_second = 1000
27+
read_operations_per_second = 1000
28+
}
29+
region {
30+
region = "eu-west-2"
31+
networking_deployment_cidr = "10.0.1.0/24"
32+
write_operations_per_second = 1000
33+
read_operations_per_second = 1000
3234
}
33-
}
34-
35-
creation_plan {
36-
dataset_size_in_gb = 15
37-
quantity = 1
38-
replication = true
39-
throughput_measurement_by = "operations-per-second"
40-
throughput_measurement_value = 20000
4135
}
4236
}
4337

44-
resource "rediscloud_active_active_subscription_database" "database_resource" {
45-
subscription_id = rediscloud_active_active_subscription.subscription.id
38+
resource "rediscloud_active_active_subscription_database" "aa_database" {
39+
subscription_id = rediscloud_active_active_subscription.aa_subscription.id
4640
name = "db"
4741
memory_limit_in_gb = 1
4842
global_data_persistence = "aof-every-1-second"
4943
global_password = local.rediscloud_database_password
5044
}
5145

52-
data "rediscloud_active_active_subscription_regions" "regions_info" {
53-
subscription_name = rediscloud_active_active_subscription.subscription.name
54-
depends_on = [rediscloud_active_active_subscription_database.database_resource]
46+
data "rediscloud_active_active_subscription_regions" "aa_regions_info" {
47+
subscription_name = rediscloud_active_active_subscription.aa_subscription.name
48+
depends_on = [rediscloud_active_active_subscription_database.aa_database]
5549
}
5650

57-
resource "rediscloud_active_active_private_link" "private_link" {
58-
subscription_id = rediscloud_active_active_subscription.subscription.id
59-
share_name = local.rediscloud_private_link_share_name
60-
region_id = data.rediscloud_active_active_subscription_regions.regions_info.regions[0].region_id
51+
52+
resource "rediscloud_active_active_private_link" "aa_private_link" {
53+
subscription_id = rediscloud_active_active_subscription.aa_subscription.id
54+
region_id = data.rediscloud_active_active_subscription_regions.aa_regions_info.regions[0].region_id
55+
share_name = "private_link testing"
6156

6257
principal {
63-
principal = local.rediscloud_principal_1
64-
principal_type = "aws_account"
58+
principal = "123456789012"
59+
principal_type = "aws_account"
6560
principal_alias = "terraform test aws account"
6661
}
67-
6862
principal {
69-
principal = local.rediscloud_principal_2
70-
principal_type = "aws_account"
63+
principal = "688576139039"
64+
principal_type = "aws_account"
7165
principal_alias = "terraform test aws account 2"
7266
}
7367
}
7468

75-
data "rediscloud_active_active_private_link" "private_link" {
76-
subscription_id = rediscloud_active_active_private_link.private_link.subscription_id
77-
region_id = 1
69+
data "rediscloud_active_active_private_link" "aa_private_link" {
70+
subscription_id = rediscloud_active_active_private_link.aa_private_link.subscription_id
71+
region_id = data.rediscloud_active_active_subscription_regions.aa_regions_info.regions[0].region_id
7872
}
7973

74+
# data "rediscloud_private_link_endpoint_script" "endpoint_script" {
75+
# subscription_id = rediscloud_private_link.private_link.subscription_id
76+
# }
77+
78+
79+
output "resource_aa_private_link" {
80+
value = rediscloud_active_active_private_link.aa_private_link
81+
}
82+
83+
output "data_aa_private_link" {
84+
value = data.rediscloud_active_active_private_link.aa_private_link
85+
}
8086

87+
# output "endpoint_script" {
88+
# value = data.rediscloud_private_link_endpoint_script.endpoint_script.endpoint_script
89+
# }

0 commit comments

Comments
 (0)