Skip to content

Commit

Permalink
test with instance resource, needs other PR to switch updates of volu…
Browse files Browse the repository at this point in the history
…me and node types
  • Loading branch information
Mia-Cross committed Mar 13, 2024
1 parent dc186b9 commit 3b828f1
Show file tree
Hide file tree
Showing 3 changed files with 4,821 additions and 52 deletions.
29 changes: 2 additions & 27 deletions scaleway/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -953,31 +953,6 @@ func expandListKeys(key string, diff *schema.ResourceDiff) []string {
return keys
}

func expandListKeysResourceData(key string, d *schema.ResourceData) []string {
addr := strings.Split(key, ".")
// index of # in the addr
index := 0

for i := range addr {
if addr[i] == "#" {
index = i
}
}

// get attribute.#
listKey := key[:strings.Index(key, "#")+1]
listLength := d.Get(listKey).(int)

keys := make([]string, 0, listLength)

for i := 0; i < listLength; i++ {
addr[index] = strconv.FormatInt(int64(i), 10)
keys = append(keys, strings.Join(addr, "."))
}

return keys
}

// getLocality find the locality of a resource
// Will try to get the zone if available then use region
// Will also use default zone or region if available
Expand Down Expand Up @@ -1253,7 +1228,7 @@ func getKeyInRawConfigMap(rawConfig map[string]cty.Value, key string, ty cty.Typ
return getKeyInRawConfigMap(value.AsValueMap(), strings.Join(keys[1:], ""), ty)

case value.Type().IsPrimitiveType():
// If it's a primitive type (bool, string, number), we convert the value to its right type before returning it
// If it's a primitive type (bool, string, number), we convert the value to the expected type given as parameter before returning it
switch ty {
case cty.String:
if value.IsNull() {
Expand Down Expand Up @@ -1283,7 +1258,7 @@ func getKeyInRawConfigMap(rawConfig map[string]cty.Value, key string, ty cty.Typ
}

// getRawConfigForKey returns the value for a specific key in the user's raw configuration, which can be useful on resources' update
// The value for the key to look for must be a primitive type (bool, string, number)
// The value for the key to look for must be a primitive type (bool, string, number) and the expected type of the value should be passed as the ty parameter
func getRawConfigForKey(d *schema.ResourceData, key string, ty cty.Type) (interface{}, bool) {
rawConfig := d.GetRawConfig()
if rawConfig.IsNull() {
Expand Down
178 changes: 153 additions & 25 deletions scaleway/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strings"
"testing"

"github.com/hashicorp/go-cty/cty"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
"github.com/scaleway/scaleway-sdk-go/scw"
Expand Down Expand Up @@ -305,29 +306,156 @@ func TestStringHashcode_positiveIndex(t *testing.T) {
}

func TestGetRawConfigForKey(t *testing.T) {
//t.Run("String", func(t *testing.T) {
// config := map[string]cty.Value{
// "key1": cty.StringVal(""),
// "key2": cty.StringVal("value2"),
// }
// //assert.Equal(t, "", getKeyInRawConfigMap(config, "key1", cty.String))
// //assert.Equal(t, "value2", getKeyInRawConfigMap(config, "key2", cty.String))
// //assert.Equal(t, nil, getKeyInRawConfigMap(config, "unknown-key", cty.String))
//})

//t.Run("List", func(t *testing.T) {
// config := map[string]cty.Value{
// "key1": cty.EmptyTupleVal,
// "key2": cty.ListVal([]cty.Value{
// cty.EmptyObjectVal,
// cty.ObjectVal(map[string]cty.Value{
// "sub-key1": cty.EmptyObjectVal,
// "sub-key2": cty.StringVal("sub-value2"),
// "sub-key3": cty.BoolVal(true),
// "sub-key4": cty.StringVal("sub-value4"),
// }),
// }),
// }
// assert.Equal(t, config["key2"], getKeyInRawConfigMap(config, "key2"))
//})
tt := NewTestTools(t)
defer tt.Cleanup()

latestEngineVersion := testAccCheckScalewayRdbEngineGetLatestVersion(tt, postgreSQLEngineName)
instanceUnchangedConfig := fmt.Sprintf(`
name = "test-get-raw-config-for-key"
engine = %q
is_ha_cluster = false
user_name = "my_initial_user"
password = "thiZ_is_v&ry_s3cret"`, latestEngineVersion)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
testAccCheckScalewayRdbInstanceDestroy(tt),
testAccCheckScalewayVPCPrivateNetworkDestroy(tt),
),
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(`
resource scaleway_vpc_private_network pn {}
resource scaleway_rdb_instance main {%s
node_type = "db-dev-s"
disable_backup = false
volume_type = "lssd"
tags = [ "terraform-test", "core", "get-raw-config" ]
private_network {
pn_id = "${scaleway_vpc_private_network.pn.id}"
enable_ipam = true
}
settings = {
work_mem = "4"
max_connections = "200"
}
}
`, instanceUnchangedConfig),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayRdbExists(tt, "scaleway_rdb_instance.main"),
assertGetRawConfigResults(t, "is_ha_cluster", false, true, cty.Bool),
assertGetRawConfigResults(t, "disable_backup", false, true, cty.Bool),
assertGetRawConfigResults(t, "volume_type", "lssd", true, cty.String),
assertGetRawConfigResults(t, "volume_size_in_gb", nil, false, cty.Number),
assertGetRawConfigResults(t, "tags.0", "terraform-test", true, cty.String),
assertGetRawConfigResults(t, "tags.1", "core", true, cty.String),
assertGetRawConfigResults(t, "tags.2", "get-raw-config", true, cty.String),
assertGetRawConfigResults(t, "tags.3", nil, false, cty.String),
assertGetRawConfigResults(t, "private_network.0.ip_net", nil, false, cty.String),
assertGetRawConfigResults(t, "private_network.0.enable_ipam", true, true, cty.Bool),
assertGetRawConfigResults(t, "private_network.#.enable_ipam", true, true, cty.Bool),
assertGetRawConfigResults(t, "settings.work_mem", "4", true, cty.String),
assertGetRawConfigResults(t, "settings.max_connections", "200", true, cty.String),
assertGetRawConfigResults(t, "settings.not_in_map", nil, false, cty.String),
),
},
{
Config: fmt.Sprintf(`
resource scaleway_vpc_private_network pn {}
resource scaleway_rdb_instance main {%s
node_type = "db-dev-s"
disable_backup = true
volume_type = "bssd"
volume_size_in_gb = 10
tags = [ "terraform-test", "core", "get-raw-config-for-key" ]
private_network {
pn_id = "${scaleway_vpc_private_network.pn.id}"
ip_net = "172.16.32.1/24"
}
settings = {
work_mem = "2"
max_connections = "100"
}
}
`, instanceUnchangedConfig),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayRdbExists(tt, "scaleway_rdb_instance.main"),
assertGetRawConfigResults(t, "is_ha_cluster", false, true, cty.Bool),
assertGetRawConfigResults(t, "disable_backup", true, true, cty.Bool),
assertGetRawConfigResults(t, "volume_type", "bssd", true, cty.String),
assertGetRawConfigResults(t, "volume_size_in_gb", 10, true, cty.Number),
assertGetRawConfigResults(t, "tags.0", "terraform-test", true, cty.String),
assertGetRawConfigResults(t, "tags.1", "core", true, cty.String),
assertGetRawConfigResults(t, "tags.2", "get-raw-config-for-key", true, cty.String),
assertGetRawConfigResults(t, "tags.3", nil, false, cty.String),
assertGetRawConfigResults(t, "private_network.0.ip_net", "172.16.32.1/24", true, cty.String),
assertGetRawConfigResults(t, "private_network.0.enable_ipam", false, false, cty.Bool),
assertGetRawConfigResults(t, "private_network.#.enable_ipam", false, false, cty.Bool),
assertGetRawConfigResults(t, "private_network.#.not_in_list", false, false, cty.Bool),
assertGetRawConfigResults(t, "settings.work_mem", "2", true, cty.String),
assertGetRawConfigResults(t, "settings.max_connections", "100", true, cty.String),
assertGetRawConfigResults(t, "settings.not_in_map", nil, false, cty.String),
),
},
{
Config: fmt.Sprintf(`
resource scaleway_vpc_private_network pn {}
resource scaleway_rdb_instance main {%s
node_type = "db-gp-s"
volume_type = "lssd"
tags = [ "terraform-test", "core", "get-raw-config" ]
private_network {
pn_id = "${scaleway_vpc_private_network.pn.id}"
enable_ipam = true
}
settings = {
work_mem = "4"
max_connections = "200"
}
}
`, instanceUnchangedConfig),
Check: resource.ComposeTestCheckFunc(
testAccCheckScalewayRdbExists(tt, "scaleway_rdb_instance.main"),
assertGetRawConfigResults(t, "is_ha_cluster", false, true, cty.Bool),
assertGetRawConfigResults(t, "disable_backup", false, false, cty.Bool),
assertGetRawConfigResults(t, "volume_type", "lssd", true, cty.String),
assertGetRawConfigResults(t, "volume_size_in_gb", nil, false, cty.Number),
assertGetRawConfigResults(t, "tags.0", "terraform-test", true, cty.String),
assertGetRawConfigResults(t, "tags.1", "core", true, cty.String),
assertGetRawConfigResults(t, "tags.2", "get-raw-config", true, cty.String),
assertGetRawConfigResults(t, "tags.3", nil, false, cty.String),
assertGetRawConfigResults(t, "private_network.0.ip_net", nil, false, cty.String),
assertGetRawConfigResults(t, "private_network.0.enable_ipam", true, true, cty.Bool),
assertGetRawConfigResults(t, "private_network.#.enable_ipam", true, true, cty.Bool),
assertGetRawConfigResults(t, "settings.work_mem", "4", true, cty.String),
assertGetRawConfigResults(t, "settings.max_connections", "200", true, cty.String),
assertGetRawConfigResults(t, "settings.not_in_map", nil, false, cty.String),
),
},
},
})
}

func assertGetRawConfigResults(t *testing.T, key string, expectedValue any, expectedSet bool, ty cty.Type) resource.TestCheckFunc {
return func(s *terraform.State) error {
resourceTFName := "scaleway_rdb_instance.main"
rs, ok := s.RootModule().Resources[resourceTFName]
if !ok {
return fmt.Errorf("resource not found: %s", resourceTFName)
}
if rs.Primary.RawConfig.IsNull() {
return nil
}

actualValue, actualSet := getKeyInRawConfigMap(rs.Primary.RawConfig.AsValueMap(), key, ty)
assert.Equal(t, expectedSet, actualSet)
assert.Equal(t, expectedValue, actualValue)

return nil
}
}

0 comments on commit 3b828f1

Please sign in to comment.