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
14 changes: 9 additions & 5 deletions internal/services/k8s/acl.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ func ResourceACL() *schema.Resource {
ExactlyOneOf: []string{"acl_rules"},
},
"acl_rules": {
Type: schema.TypeList,
Type: schema.TypeSet,
Optional: true,
Description: "The list of network rules that manage inbound traffic",
ExactlyOneOf: []string{"no_ip_allowed"},
Expand Down Expand Up @@ -104,7 +104,7 @@ func ResourceACLCreate(ctx context.Context, d *schema.ResourceData, m any) diag.
return diag.FromErr(err)
}

acls, err := expandACL(d.Get("acl_rules").([]any))
acls, err := expandACL(d.Get("acl_rules"))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -170,7 +170,7 @@ func ResourceACLUpdate(ctx context.Context, d *schema.ResourceData, m any) diag.
}

if d.HasChanges("acl_rules", "no_ip_allowed") {
acls, err := expandACL(d.Get("acl_rules").([]any))
acls, err := expandACL(d.Get("acl_rules"))
if err != nil {
return diag.FromErr(err)
}
Expand Down Expand Up @@ -230,10 +230,14 @@ func ResourceACLDelete(ctx context.Context, d *schema.ResourceData, m any) diag.
return nil
}

func expandACL(data []any) ([]*k8s.ACLRuleRequest, error) {
func expandACL(data any) ([]*k8s.ACLRuleRequest, error) {
expandedACLs := []*k8s.ACLRuleRequest(nil)

for _, rule := range data {
if data == nil {
return expandedACLs, nil
}

for _, rule := range data.(*schema.Set).List() {
r := rule.(map[string]any)
expandedRule := &k8s.ACLRuleRequest{}

Expand Down
142 changes: 127 additions & 15 deletions internal/services/k8s/acl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,11 @@ func TestAccACL_Basic(t *testing.T) {
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed", "false"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "1"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.description", "First rule"),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_basic", "acl_rules.*", map[string]string{
"ip": "1.2.3.4/32",
"description": "First rule",
"scaleway_ranges": "false",
}),
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.0.id"),
),
},
Expand Down Expand Up @@ -77,13 +79,17 @@ func TestAccACL_Basic(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "2"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.description", ""),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_basic", "acl_rules.*", map[string]string{
"ip": "1.2.3.4/32",
"description": "",
"scaleway_ranges": "false",
}),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_basic", "acl_rules.*", map[string]string{
"ip": "5.6.7.0/30",
"description": "",
"scaleway_ranges": "false",
}),
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.0.id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.ip", "5.6.7.0/30"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.scaleway_ranges", "false"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.description", ""),
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.1.id"),
),
},
Expand Down Expand Up @@ -113,13 +119,17 @@ func TestAccACL_Basic(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "2"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.description", "First rule"),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_basic", "acl_rules.*", map[string]string{
"ip": "1.2.3.4/32",
"description": "First rule",
"scaleway_ranges": "false",
}),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_basic", "acl_rules.*", map[string]string{
"ip": "",
"description": "Scaleway ranges rule",
"scaleway_ranges": "true",
}),
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.0.id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.ip", ""),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.scaleway_ranges", "true"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.1.description", "Scaleway ranges rule"),
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.1.id"),
),
},
Expand Down Expand Up @@ -165,6 +175,108 @@ func TestAccACL_Basic(t *testing.T) {
})
}

func TestAccACL_RulesOrder(t *testing.T) {
tt := acctest.NewTestTools(t)
defer tt.Cleanup()

clusterName := "k8s-acl-order"
latestK8sVersion := testAccK8SClusterGetLatestK8SVersion(tt)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: testAccCheckK8SClusterDestroy(tt),
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(`
resource "scaleway_vpc_private_network" "acl_order" {}

resource "scaleway_k8s_cluster" "acl_order" {
name = "%s"
version = "%s"
cni = "cilium"
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.acl_order.id
}

resource "scaleway_k8s_acl" "acl_order" {
cluster_id = scaleway_k8s_cluster.acl_order.id
acl_rules {
ip = "12.2.3.4/32"
description = "First rule"
}
acl_rules {
ip = "11.2.3.4/32"
description = "Second rule"
}
acl_rules {
ip = "1.2.3.7/32"
description = "Third rule"
}
acl_rules {
ip = "1.2.3.4/32"
description = "Fourth rule"
}
}`, clusterName, latestK8sVersion),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_order", "cluster_id", "scaleway_k8s_cluster.acl_order", "id"),
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_order", "acl_rules.#", "4"),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_order", "acl_rules.*", map[string]string{
"ip": "12.2.3.4/32",
"description": "First rule",
}),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_order", "acl_rules.*", map[string]string{
"ip": "11.2.3.4/32",
"description": "Second rule",
}),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_order", "acl_rules.*", map[string]string{
"ip": "1.2.3.7/32",
"description": "Third rule",
}),
resource.TestCheckTypeSetElemNestedAttrs("scaleway_k8s_acl.acl_order", "acl_rules.*", map[string]string{
"ip": "1.2.3.4/32",
"description": "Fourth rule",
}),
),
},
{
Config: fmt.Sprintf(`
resource "scaleway_vpc_private_network" "acl_order" {}

resource "scaleway_k8s_cluster" "acl_order" {
name = "%s"
version = "%s"
cni = "cilium"
delete_additional_resources = true
private_network_id = scaleway_vpc_private_network.acl_order.id
}

resource "scaleway_k8s_acl" "acl_order" {
cluster_id = scaleway_k8s_cluster.acl_order.id
acl_rules {
ip = "12.2.3.4/32"
description = "First rule"
}
acl_rules {
ip = "11.2.3.4/32"
description = "Second rule"
}
acl_rules {
ip = "1.2.3.7/32"
description = "Third rule"
}
acl_rules {
ip = "1.2.3.4/32"
description = "Fourth rule"
}
}`, clusterName, latestK8sVersion),
PlanOnly: true,
ExpectNonEmptyPlan: false,
},
},
})
}

func testAccCheckK8SClusterAllowedIPs(tt *acctest.TestTools, n string, expected string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[n]
Expand Down
Loading
Loading