Skip to content

Commit dc39f07

Browse files
committed
ok with no_ip_allowed (final)
1 parent e9459e9 commit dc39f07

File tree

5 files changed

+1385
-3549
lines changed

5 files changed

+1385
-3549
lines changed

docs/resources/k8s_acl.md

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ page_title: "Scaleway: scaleway_k8s_acl"
55

66
# Resource: scaleway_k8s_acl
77

8-
Creates and manages Scaleway Kubernetes cluster authorized IPs.
8+
Creates and manages Scaleway Kubernetes Cluster authorized IPs.
99
For more information, please refer to the [API documentation](https://www.scaleway.com/en/developers/api/kubernetes/#path-access-control-list-add-new-acls)
1010

11+
~> **Important:** When creating a Cluster, it comes with a default ACL rule allowing all ranges `0.0.0.0/0`.
12+
Defining custom ACLs with Terraform will overwrite this rule, but it will be recreated automatically when deleting the ACL resource.
13+
1114
## Example Usage
1215

1316
### Basic
@@ -36,17 +39,42 @@ resource "scaleway_k8s_acl" "acl_basic" {
3639
}
3740
```
3841

42+
### Full-isolation
43+
44+
```terraform
45+
resource "scaleway_vpc_private_network" "acl_basic" {}
46+
47+
resource "scaleway_k8s_cluster" "acl_basic" {
48+
name = "acl-basic"
49+
version = "1.32.2"
50+
cni = "cilium"
51+
delete_additional_resources = true
52+
private_network_id = scaleway_vpc_private_network.acl_basic.id
53+
}
54+
55+
resource "scaleway_k8s_acl" "acl_basic" {
56+
cluster_id = scaleway_k8s_cluster.acl_basic.id
57+
no_ip_allowed = true
58+
}
59+
```
60+
3961
## Argument Reference
4062

4163
The following arguments are supported:
4264

43-
- `cluster_id` - (Required) UUID of the Cluster.
65+
- `cluster_id` - (Required) UUID of the Cluster. The ID of the cluster is also the ID of the ACL resource as there can only be one per cluster.
4466

4567
~> **Important:** Updates to `cluster_id` will recreate the ACL.
4668

47-
- `acl_rules` - A list of ACLs (structure is described below)
69+
- `no_ip_allowed` - (Optional) If set to true, no IP will be allowed and the cluster will be in full-isolation.
70+
71+
~> **Important:** This field cannot be set to true if the `acl_rules` is defined.
72+
73+
- `acl_rules` - (Optional) A list of ACLs (structure is described below)
4874

49-
- `region` - (Defaults to [provider](../index.md#region) `region`) The [region](../guides/regions_and_zones.md#regions) in which the ACL rule should be created.
75+
~> **Important:** This block cannot be defined if the `no_ip_allowed` field is set to true.
76+
77+
- `region` - (Defaults to [provider](../index.md#arguments-reference) `region`) The [region](../guides/regions_and_zones.md#regions) in which the ACL rule should be created.
5078

5179
The `acl_rules` block supports:
5280

@@ -65,9 +93,11 @@ Only one rule with this field set to true can be added.
6593

6694
In addition to all arguments above, the following attributes are exported:
6795

68-
- `acl_rules.0.id` - The ID of each ACL rule.
96+
- `id` - The ID of the ACL resource. It is the same as the ID of the cluster.
97+
98+
~> **Important:** Kubernetes ACLs' IDs are [regional](../guides/regions_and_zones.md#resource-ids), which means they are of the form `{region}/{id}`, e.g. `fr-par/11111111-1111-1111-1111-111111111111`
6999

70-
~> **Important:** Kubernetes ACL rules' IDs are [regional](../guides/regions_and_zones.md#resource-ids), which means they are of the form `{region}/{id}`, e.g. `fr-par/11111111-1111-1111-1111-111111111111`
100+
- `acl_rules.#.id` - The ID of each individual ACL rule.
71101

72102
## Import
73103

internal/services/k8s/acl.go

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,18 @@ func ResourceACL() *schema.Resource {
4343
DiffSuppressFunc: dsf.Locality,
4444
Description: "Cluster on which the ACL should be applied",
4545
},
46-
"no_ip_allowed_on_delete": {
47-
Type: schema.TypeBool,
48-
Optional: true,
49-
Default: false,
50-
Description: "Determines whether deleting the resource should allow all IPs again or no IP at all",
46+
"no_ip_allowed": {
47+
Type: schema.TypeBool,
48+
Optional: true,
49+
Default: false,
50+
Description: "If true, no IP will be allowed",
51+
ExactlyOneOf: []string{"acl_rules"},
5152
},
5253
"acl_rules": {
53-
Type: schema.TypeList,
54-
Required: true,
55-
Description: "The list of network rules that manage inbound traffic",
54+
Type: schema.TypeList,
55+
Optional: true,
56+
Description: "The list of network rules that manage inbound traffic",
57+
ExactlyOneOf: []string{"no_ip_allowed"},
5658
Elem: &schema.Resource{
5759
Schema: map[string]*schema.Schema{
5860
"ip": {
@@ -167,7 +169,7 @@ func ResourceACLUpdate(ctx context.Context, d *schema.ResourceData, m interface{
167169
return diag.FromErr(err)
168170
}
169171

170-
if d.HasChange("acl_rules") {
172+
if d.HasChange("acl_rules") || d.HasChange("no_ip_allowed") {
171173
acls, err := expandACL(d.Get("acl_rules").([]interface{}))
172174
if err != nil {
173175
return diag.FromErr(err)
@@ -201,16 +203,14 @@ func ResourceACLDelete(ctx context.Context, d *schema.ResourceData, m interface{
201203

202204
rulesToSet := []*k8s.ACLRuleRequest(nil)
203205

204-
if d.Get("no_ip_allowed_on_delete").(bool) == false {
205-
allowedIPs, err := types.ExpandIPNet("0.0.0.0/0")
206-
if err != nil {
207-
return diag.FromErr(err)
208-
}
209-
rulesToSet = append(rulesToSet, &k8s.ACLRuleRequest{
210-
IP: &allowedIPs,
211-
Description: "Automatically generated after scaleway_k8s_acl resource deletion",
212-
})
206+
allowedIPs, err := types.ExpandIPNet("0.0.0.0/0")
207+
if err != nil {
208+
return diag.FromErr(err)
213209
}
210+
rulesToSet = append(rulesToSet, &k8s.ACLRuleRequest{
211+
IP: &allowedIPs,
212+
Description: "Automatically generated after scaleway_k8s_acl resource deletion",
213+
})
214214

215215
req := &k8s.SetClusterACLRulesRequest{
216216
Region: region,

internal/services/k8s/acl_test.go

Lines changed: 8 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func TestAccACL_Basic(t *testing.T) {
4444
}`, clusterName, latestK8sVersion),
4545
Check: resource.ComposeTestCheckFunc(
4646
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
47-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed_on_delete", "false"),
47+
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed", "false"),
4848
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "1"),
4949
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
5050
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
@@ -66,7 +66,6 @@ func TestAccACL_Basic(t *testing.T) {
6666
6767
resource "scaleway_k8s_acl" "acl_basic" {
6868
cluster_id = scaleway_k8s_cluster.acl_basic.id
69-
no_ip_allowed_on_delete = true
7069
acl_rules {
7170
ip = "1.2.3.4/32"
7271
}
@@ -77,7 +76,6 @@ func TestAccACL_Basic(t *testing.T) {
7776
}`, clusterName, latestK8sVersion),
7877
Check: resource.ComposeTestCheckFunc(
7978
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
80-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed_on_delete", "true"),
8179
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "2"),
8280
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
8381
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
@@ -114,7 +112,6 @@ func TestAccACL_Basic(t *testing.T) {
114112
}`, clusterName, latestK8sVersion),
115113
Check: resource.ComposeTestCheckFunc(
116114
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
117-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed_on_delete", "false"),
118115
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "2"),
119116
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
120117
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.scaleway_ranges", "false"),
@@ -126,37 +123,6 @@ func TestAccACL_Basic(t *testing.T) {
126123
resource.TestCheckResourceAttrSet("scaleway_k8s_acl.acl_basic", "acl_rules.1.id"),
127124
),
128125
},
129-
{
130-
Config: fmt.Sprintf(`
131-
resource "scaleway_vpc_private_network" "acl_basic" {}
132-
133-
resource "scaleway_k8s_cluster" "acl_basic" {
134-
name = "%s"
135-
version = "%s"
136-
cni = "cilium"
137-
delete_additional_resources = true
138-
private_network_id = scaleway_vpc_private_network.acl_basic.id
139-
}`, clusterName, latestK8sVersion),
140-
Check: resource.ComposeTestCheckFunc(
141-
testAccCheckK8SClusterAllowedIPs(tt, "scaleway_k8s_cluster.acl_basic", "0.0.0.0/0"),
142-
),
143-
},
144-
},
145-
})
146-
}
147-
148-
func TestAccACL_AllowedIPsOnDelete(t *testing.T) {
149-
tt := acctest.NewTestTools(t)
150-
defer tt.Cleanup()
151-
152-
clusterName := "k8s-acl-allowed-ips-on-delete"
153-
latestK8sVersion := testAccK8SClusterGetLatestK8SVersion(tt)
154-
155-
resource.ParallelTest(t, resource.TestCase{
156-
PreCheck: func() { acctest.PreCheck(t) },
157-
ProviderFactories: tt.ProviderFactories,
158-
CheckDestroy: testAccCheckK8SClusterDestroy(tt),
159-
Steps: []resource.TestStep{
160126
{
161127
Config: fmt.Sprintf(`
162128
resource "scaleway_vpc_private_network" "acl_basic" {}
@@ -171,70 +137,30 @@ func TestAccACL_AllowedIPsOnDelete(t *testing.T) {
171137
172138
resource "scaleway_k8s_acl" "acl_basic" {
173139
cluster_id = scaleway_k8s_cluster.acl_basic.id
174-
no_ip_allowed_on_delete = true
175-
acl_rules {
176-
ip = "1.2.3.4/32"
177-
}
140+
no_ip_allowed = true
178141
}`, clusterName, latestK8sVersion),
179142
Check: resource.ComposeTestCheckFunc(
180143
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
181-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed_on_delete", "true"),
182-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "1"),
183-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
144+
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed", "true"),
145+
resource.TestCheckNoResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#"),
146+
testAccCheckK8SClusterAllowedIPs(tt, "scaleway_k8s_cluster.acl_basic", ""),
184147
),
185148
},
186149
{
187150
Config: fmt.Sprintf(`
188151
resource "scaleway_vpc_private_network" "acl_basic" {}
189-
190-
resource "scaleway_k8s_cluster" "acl_basic" {
191-
name = "%s"
192-
version = "%s"
193-
cni = "cilium"
194-
delete_additional_resources = true
195-
private_network_id = scaleway_vpc_private_network.acl_basic.id
196-
}`, clusterName, latestK8sVersion),
197-
Check: testAccCheckK8SClusterAllowedIPs(tt, "scaleway_k8s_cluster.acl_basic", ""),
198-
},
199-
{
200-
Config: fmt.Sprintf(`
201-
resource "scaleway_vpc_private_network" "acl_basic" {}
202-
152+
203153
resource "scaleway_k8s_cluster" "acl_basic" {
204154
name = "%s"
205155
version = "%s"
206156
cni = "cilium"
207157
delete_additional_resources = true
208-
private_network_id = scaleway_vpc_private_network.acl_basic.id
209-
}
210-
211-
resource "scaleway_k8s_acl" "acl_basic" {
212-
cluster_id = scaleway_k8s_cluster.acl_basic.id
213-
no_ip_allowed_on_delete = false
214-
acl_rules {
215-
ip = "1.2.3.4/32"
216-
}
158+
private_network_id = scaleway_vpc_private_network.acl_basic.id
217159
}`, clusterName, latestK8sVersion),
218160
Check: resource.ComposeTestCheckFunc(
219-
resource.TestCheckResourceAttrPair("scaleway_k8s_acl.acl_basic", "cluster_id", "scaleway_k8s_cluster.acl_basic", "id"),
220-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "no_ip_allowed_on_delete", "false"),
221-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.#", "1"),
222-
resource.TestCheckResourceAttr("scaleway_k8s_acl.acl_basic", "acl_rules.0.ip", "1.2.3.4/32"),
161+
testAccCheckK8SClusterAllowedIPs(tt, "scaleway_k8s_cluster.acl_basic", "0.0.0.0/0"),
223162
),
224163
},
225-
{
226-
Config: fmt.Sprintf(`
227-
resource "scaleway_vpc_private_network" "acl_basic" {}
228-
229-
resource "scaleway_k8s_cluster" "acl_basic" {
230-
name = "%s"
231-
version = "%s"
232-
cni = "cilium"
233-
delete_additional_resources = true
234-
private_network_id = scaleway_vpc_private_network.acl_basic.id
235-
}`, clusterName, latestK8sVersion),
236-
Check: testAccCheckK8SClusterAllowedIPs(tt, "scaleway_k8s_cluster.acl_basic", "0.0.0.0/0"),
237-
},
238164
},
239165
})
240166
}

0 commit comments

Comments
 (0)