Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .github/workflows/terraform_provider_pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,17 @@ jobs:
go-version-file: go.mod
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudProDatabase_Upgrade"'

go_test_privatelink:
name: go test smoke privatelink
needs: [ go_build ]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
with:
go-version-file: go.mod
- run: EXECUTE_TESTS=true make testacc TESTARGS='-run="TestAccResourceRedisCloudPrivateLink_CRUDI"'


tfproviderlint:
name: tfproviderlint
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.24.0
toolchain go1.24.1

require (
github.com/RedisLabs/rediscloud-go-api v0.36.4
github.com/RedisLabs/rediscloud-go-api v0.36.5
github.com/bflad/tfproviderlint v0.31.0
github.com/hashicorp/go-cty v1.5.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.37.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
github.com/RedisLabs/rediscloud-go-api v0.36.4 h1:EBoyJ3SyvfX4MjTB5MNs5s+hhYTVSVzjdhNtPJDcfMw=
github.com/RedisLabs/rediscloud-go-api v0.36.4/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
github.com/RedisLabs/rediscloud-go-api v0.36.5 h1:zZ5C2+QHdfdlGqZDw3o2GMM7Wz5BhLUUW8U3yGFl1ck=
github.com/RedisLabs/rediscloud-go-api v0.36.5/go.mod h1:Hkh3i/EsHnyfgV0ijednbofz/EmZC3sFnSNNruF3G6I=
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/apparentlymart/go-textseg/v12 v12.0.0/go.mod h1:S/4uRK2UtaQttw1GenVJEynmyUenKwP++x/+DdGV/Ec=
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"regexp"
"strconv"
"strings"
"time"

"github.com/RedisLabs/rediscloud-go-api/redis"
Expand Down Expand Up @@ -65,7 +66,7 @@ func ResourceRedisCloudActiveActivePrivateLink() *schema.Resource {
},
"principal_type": {
Type: schema.TypeString,
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')'")),
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')'")),
Required: true,
},
"principal_alias": {
Expand Down Expand Up @@ -180,8 +181,6 @@ func resourceRedisCloudActiveActivePrivateLinkCreate(ctx context.Context, d *sch
return diag.FromErr(err)
}

d.SetId(strconv.Itoa(subId))

err = waitForActiveActivePrivateLinkToBeActive(ctx, api, subId, regionId)

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

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

subId, err := strconv.Atoi(parts[0])
if err != nil {
return diag.FromErr(err)
}
regionId, err := strconv.Atoi(parts[1])
if err != nil {
return diag.FromErr(err)
}
err = d.Set("subscription_id", strconv.Itoa(subId))

regionId := d.Get("region_id").(int)
if err != nil {
return diag.FromErr(err)
}

err = d.Set("region_id", regionId)

if err != nil {
return diag.FromErr(err)
}

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

d.SetId(strconv.Itoa(subId))

err = d.Set("share_name", privateLink.ShareName)
if err != nil {
return diag.FromErr(err)
Expand Down
18 changes: 13 additions & 5 deletions provider/privatelink/resource_rediscloud_private_link.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func ResourceRedisCloudPrivateLink() *schema.Resource {
},
"principal_type": {
Type: schema.TypeString,
ValidateDiagFunc: validation.ToDiagFunc(validation.StringMatch(regexp.MustCompile("^(aws_account|organization|organization_unit|iam_role|iam_user|service_principal)$"), "must be 'credit-card' or 'marketplace'")),
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'")),
Required: true,
},
"principal_alias": {
Expand Down Expand Up @@ -202,7 +202,10 @@ func resourceRedisCloudPrivateLinkRead(ctx context.Context, d *schema.ResourceDa
var diags diag.Diagnostics
api := meta.(*client.ApiClient)

subId, err := strconv.Atoi(d.Get("subscription_id").(string))
subId, err := strconv.Atoi(d.Id())
if err != nil {
return diag.FromErr(err)
}

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

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

d.SetId(strconv.Itoa(subId))

err = d.Set("subscription_id", strconv.Itoa(subId))
if err != nil {
return diag.FromErr(err)
}

err = d.Set("share_name", privateLink.ShareName)
if err != nil {
return diag.FromErr(err)
Expand Down Expand Up @@ -256,7 +264,7 @@ func resourceRedisCloudPrivateLinkUpdate(ctx context.Context, d *schema.Resource
var diags diag.Diagnostics
api := meta.(*client.ApiClient)

if d.HasChange("principals") {
if d.HasChange("principal") {

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

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

apiPrincipals := privateLink.Principals
tfPrincipals := principalsFromSet(d.Get("principals").(*schema.Set))
tfPrincipals := principalsFromSet(d.Get("principal").(*schema.Set))

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

return resourceRedisCloudPrivateLinkDelete(ctx, d, meta)
return diags
}

func createOtherPrincipals(ctx context.Context, api *client.ApiClient, subId int, otherPrincipals []pl.PrivateLinkPrincipal) error {
Expand Down
87 changes: 48 additions & 39 deletions provider/privatelink/testdata/testActiveActivePrivateLink.tf
Original file line number Diff line number Diff line change
Expand Up @@ -3,78 +3,87 @@ locals {
rediscloud_cloud_account = "%s"
rediscloud_private_link_share_name = "%s"
rediscloud_database_password = "%s"
rediscloud_principal_1 = "%s"
rediscloud_principal_2 = "%s"
}

data "rediscloud_payment_method" "card" {
card_type = "Visa"
last_four_numbers = "5556"
}

data "rediscloud_cloud_account" "account" {
exclude_internal_account = true
provider_type = "AWS"
name = local.rediscloud_cloud_account
}

resource "rediscloud_active_active_subscription" "subscription" {
resource "rediscloud_active_active_subscription" "aa_subscription" {
name = local.rediscloud_subscription_name
payment_method = "credit-card"
payment_method_id = data.rediscloud_payment_method.card.id
cloud_provider = "AWS"

cloud_provider {
provider = data.rediscloud_cloud_account.account.provider_type
cloud_account_id = data.rediscloud_cloud_account.account.id
creation_plan {
memory_limit_in_gb = 1
quantity = 1
region {
region = "eu-west-1"
networking_deployment_cidr = "10.0.0.0/24"
preferred_availability_zones = ["eu-west-1a"]
region = "eu-west-1"
networking_deployment_cidr = "192.168.0.0/24"
write_operations_per_second = 1000
read_operations_per_second = 1000
}
region {
region = "eu-west-2"
networking_deployment_cidr = "10.0.1.0/24"
write_operations_per_second = 1000
read_operations_per_second = 1000
}
}

creation_plan {
dataset_size_in_gb = 15
quantity = 1
replication = true
throughput_measurement_by = "operations-per-second"
throughput_measurement_value = 20000
}
}

resource "rediscloud_active_active_subscription_database" "database_resource" {
subscription_id = rediscloud_active_active_subscription.subscription.id
resource "rediscloud_active_active_subscription_database" "aa_database" {
subscription_id = rediscloud_active_active_subscription.aa_subscription.id
name = "db"
memory_limit_in_gb = 1
global_data_persistence = "aof-every-1-second"
global_password = local.rediscloud_database_password
}

data "rediscloud_active_active_subscription_regions" "regions_info" {
subscription_name = rediscloud_active_active_subscription.subscription.name
depends_on = [rediscloud_active_active_subscription_database.database_resource]
data "rediscloud_active_active_subscription_regions" "aa_regions_info" {
subscription_name = rediscloud_active_active_subscription.aa_subscription.name
depends_on = [rediscloud_active_active_subscription_database.aa_database]
}

resource "rediscloud_active_active_private_link" "private_link" {
subscription_id = rediscloud_active_active_subscription.subscription.id
share_name = local.rediscloud_private_link_share_name
region_id = data.rediscloud_active_active_subscription_regions.regions_info.regions[0].region_id

resource "rediscloud_active_active_private_link" "aa_private_link" {
subscription_id = rediscloud_active_active_subscription.aa_subscription.id
region_id = data.rediscloud_active_active_subscription_regions.aa_regions_info.regions[0].region_id
share_name = "private_link testing"

principal {
principal = local.rediscloud_principal_1
principal_type = "aws_account"
principal = "123456789012"
principal_type = "aws_account"
principal_alias = "terraform test aws account"
}

principal {
principal = local.rediscloud_principal_2
principal_type = "aws_account"
principal = "688576139039"
principal_type = "aws_account"
principal_alias = "terraform test aws account 2"
}
}

data "rediscloud_active_active_private_link" "private_link" {
subscription_id = rediscloud_active_active_private_link.private_link.subscription_id
region_id = 1
data "rediscloud_active_active_private_link" "aa_private_link" {
subscription_id = rediscloud_active_active_private_link.aa_private_link.subscription_id
region_id = data.rediscloud_active_active_subscription_regions.aa_regions_info.regions[0].region_id
}

# data "rediscloud_private_link_endpoint_script" "endpoint_script" {
# subscription_id = rediscloud_private_link.private_link.subscription_id
# }


output "resource_aa_private_link" {
value = rediscloud_active_active_private_link.aa_private_link
}

output "data_aa_private_link" {
value = data.rediscloud_active_active_private_link.aa_private_link
}

# output "endpoint_script" {
# value = data.rediscloud_private_link_endpoint_script.endpoint_script.endpoint_script
# }
Loading
Loading