Skip to content

Commit c1afba6

Browse files
authored
Merge branch 'master' into servers_datasource
2 parents 34d2c05 + 3d6bf9c commit c1afba6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+8070
-2365
lines changed

docs/resources/container_namespace.md

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ The following arguments are supported:
3636

3737
- `environment_variables` - The environment variables of the namespace.
3838

39+
- `destroy_registry` - (Defaults to false). Destroy linked container registry on deletion.
40+
3941
## Attributes Reference
4042

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

docs/resources/instance_security_group_rules.md

+5
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ The `inbound_rule` and `outbound_rule` block supports:
119119

120120
- `port`- (Optional) The port this rule apply to. If no port is specified, rule will apply to all port.
121121

122+
- `port_range`- Need terraform >= 0.13.0 (Optional) The port range (e.g `22-23`) this rule applies to.
123+
Port range MUST comply the Scaleway-notation: interval between ports must be a power of 2 `2^X-1` number (e.g 2^13-1=8191 in port_range = "10000-18191").
124+
If no `port` nor `port_range` are specified, rule will apply to all port.
125+
Only one of `port` and `port_range` should be specified.
126+
122127
- `ip`- (Optional) The ip this rule apply to. If no `ip` nor `ip_range` are specified, rule will apply to all ip. Only one of `ip` and `ip_range` should be specified.
123128

124129
- `ip_range`- (Optional) The ip range (e.g `192.168.1.0/24`) this rule applies to. If no `ip` nor `ip_range` are specified, rule will apply to all ip. Only one of `ip` and `ip_range` should be specified.

scaleway/helpers.go

+8
Original file line numberDiff line numberDiff line change
@@ -616,3 +616,11 @@ func ErrCodeEquals(err error, codes ...string) bool {
616616
}
617617
return false
618618
}
619+
620+
func getBool(d *schema.ResourceData, key string) interface{} {
621+
val, ok := d.GetOkExists(key)
622+
if !ok {
623+
return nil
624+
}
625+
return val
626+
}

scaleway/resource_apple_silicon_server.go

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func resourceScalewayAppleSiliconServer() *schema.Resource {
1818
UpdateContext: resourceScalewayAppleSiliconServerUpdate,
1919
DeleteContext: resourceScalewayAppleSiliconServerDelete,
2020
Timeouts: &schema.ResourceTimeout{
21+
Create: schema.DefaultTimeout(defaultAppleSiliconServerTimeout),
2122
Default: schema.DefaultTimeout(defaultAppleSiliconServerTimeout),
2223
},
2324
Importer: &schema.ResourceImporter{

scaleway/resource_baremetal_server.go

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ func resourceScalewayBaremetalServer() *schema.Resource {
2323
SchemaVersion: 0,
2424
Timeouts: &schema.ResourceTimeout{
2525
Default: schema.DefaultTimeout(defaultBaremetalServerTimeout),
26+
Create: schema.DefaultTimeout(defaultBaremetalServerTimeout),
27+
Update: schema.DefaultTimeout(defaultBaremetalServerTimeout),
28+
Delete: schema.DefaultTimeout(defaultBaremetalServerTimeout),
2629
},
2730
Schema: map[string]*schema.Schema{
2831
"name": {

scaleway/resource_container_namespace.go

+35-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
99
container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
10+
"github.com/scaleway/scaleway-sdk-go/api/registry/v1"
1011
"github.com/scaleway/scaleway-sdk-go/scw"
1112
)
1213

@@ -20,6 +21,10 @@ func resourceScalewayContainerNamespace() *schema.Resource {
2021
StateContext: schema.ImportStatePassthroughContext,
2122
},
2223
Timeouts: &schema.ResourceTimeout{
24+
Create: schema.DefaultTimeout(defaultContainerNamespaceTimeout),
25+
Read: schema.DefaultTimeout(defaultContainerNamespaceTimeout),
26+
Update: schema.DefaultTimeout(defaultContainerNamespaceTimeout),
27+
Delete: schema.DefaultTimeout(defaultContainerNamespaceTimeout),
2328
Default: schema.DefaultTimeout(defaultContainerNamespaceTimeout),
2429
},
2530
SchemaVersion: 0,
@@ -56,6 +61,12 @@ func resourceScalewayContainerNamespace() *schema.Resource {
5661
Computed: true,
5762
Description: "The ID of the registry namespace",
5863
},
64+
"destroy_registry": {
65+
Type: schema.TypeBool,
66+
Optional: true,
67+
Default: false,
68+
Description: "Destroy registry on deletion",
69+
},
5970
"region": regionSchema(),
6071
"organization_id": organizationIDSchema(),
6172
"project_id": projectIDSchema(),
@@ -173,13 +184,32 @@ func resourceScalewayContainerNamespaceDelete(ctx context.Context, d *schema.Res
173184
}
174185

175186
_, err = waitForContainerNamespace(ctx, api, region, id, d.Timeout(schema.TimeoutDelete))
176-
if err != nil {
177-
if is404Error(err) {
178-
d.SetId("")
179-
return nil
180-
}
187+
if err != nil && !is404Error(err) {
181188
return diag.FromErr(err)
182189
}
183190

191+
d.SetId("")
192+
193+
if destroy := d.Get("destroy_registry"); destroy != nil && destroy == true {
194+
registryAPI, region, err := registryAPIWithRegion(d, meta)
195+
if err != nil {
196+
return diag.FromErr(err)
197+
}
198+
199+
registryID := d.Get("registry_namespace_id").(string)
200+
201+
_, err = registryAPI.DeleteNamespace(&registry.DeleteNamespaceRequest{
202+
Region: region,
203+
NamespaceID: registryID,
204+
})
205+
if err != nil {
206+
return diag.FromErr(err)
207+
}
208+
_, err = waitForRegistryNamespace(ctx, registryAPI, region, registryID, d.Timeout(schema.TimeoutDelete))
209+
if err != nil && !is404Error(err) {
210+
return diag.FromErr(err)
211+
}
212+
}
213+
184214
return nil
185215
}

scaleway/resource_container_namespace_test.go

+60-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
99
container "github.com/scaleway/scaleway-sdk-go/api/container/v1beta1"
10+
"github.com/scaleway/scaleway-sdk-go/api/registry/v1"
1011
"github.com/scaleway/scaleway-sdk-go/scw"
1112
)
1213

@@ -147,6 +148,34 @@ func TestAccScalewayContainerNamespace_Basic(t *testing.T) {
147148
})
148149
}
149150

151+
func TestAccScalewayContainerNamespace_DestroyRegistry(t *testing.T) {
152+
tt := NewTestTools(t)
153+
defer tt.Cleanup()
154+
155+
resource.ParallelTest(t, resource.TestCase{
156+
PreCheck: func() { testAccPreCheck(t) },
157+
ProviderFactories: tt.ProviderFactories,
158+
CheckDestroy: resource.ComposeTestCheckFunc(
159+
testAccCheckScalewayContainerNamespaceDestroy(tt),
160+
testAccCheckScalewayContainerRegistryDestroy(tt),
161+
),
162+
Steps: []resource.TestStep{
163+
{
164+
Config: `
165+
resource scaleway_container_namespace main {
166+
name = "test-cr-ns-01"
167+
destroy_registry = true
168+
}
169+
`,
170+
Check: resource.ComposeTestCheckFunc(
171+
testAccCheckScalewayContainerNamespaceExists(tt, "scaleway_container_namespace.main"),
172+
testCheckResourceAttrUUID("scaleway_container_namespace.main", "id"),
173+
),
174+
},
175+
},
176+
})
177+
}
178+
150179
func testAccCheckScalewayContainerNamespaceExists(tt *TestTools, n string) resource.TestCheckFunc {
151180
return func(state *terraform.State) error {
152181
rs, ok := state.RootModule().Resources[n]
@@ -175,7 +204,7 @@ func testAccCheckScalewayContainerNamespaceExists(tt *TestTools, n string) resou
175204
func testAccCheckScalewayContainerNamespaceDestroy(tt *TestTools) resource.TestCheckFunc {
176205
return func(state *terraform.State) error {
177206
for _, rs := range state.RootModule().Resources {
178-
if rs.Type != "scaleway_container_namespace" {
207+
if rs.Type != "scaleway_container_namespace" { //nolint:goconst
179208
continue
180209
}
181210

@@ -201,3 +230,33 @@ func testAccCheckScalewayContainerNamespaceDestroy(tt *TestTools) resource.TestC
201230
return nil
202231
}
203232
}
233+
234+
func testAccCheckScalewayContainerRegistryDestroy(tt *TestTools) resource.TestCheckFunc {
235+
return func(state *terraform.State) error {
236+
for _, rs := range state.RootModule().Resources {
237+
if rs.Type != "scaleway_container_namespace" {
238+
continue
239+
}
240+
241+
api, region, _, err := registryAPIWithRegionAndID(tt.Meta, rs.Primary.ID)
242+
if err != nil {
243+
return err
244+
}
245+
246+
_, err = api.DeleteNamespace(&registry.DeleteNamespaceRequest{
247+
NamespaceID: rs.Primary.Attributes["registry_namespace_id"],
248+
Region: region,
249+
})
250+
251+
if err == nil {
252+
return fmt.Errorf("registry namespace (%s) still exists", rs.Primary.Attributes["registry_namespace_id"])
253+
}
254+
255+
if !is404Error(err) {
256+
return err
257+
}
258+
}
259+
260+
return nil
261+
}
262+
}

scaleway/resource_domain_record.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func resourceScalewayDomainRecord() *schema.Resource {
2020
UpdateContext: resourceScalewayDomainRecordUpdate,
2121
DeleteContext: resourceScalewayDomainRecordDelete,
2222
Timeouts: &schema.ResourceTimeout{
23+
Create: schema.DefaultTimeout(defaultDomainRecordTimeout),
24+
Read: schema.DefaultTimeout(defaultDomainRecordTimeout),
25+
Update: schema.DefaultTimeout(defaultDomainRecordTimeout),
26+
Delete: schema.DefaultTimeout(defaultDomainRecordTimeout),
2327
Default: schema.DefaultTimeout(defaultDomainRecordTimeout),
2428
},
2529
Importer: &schema.ResourceImporter{
@@ -530,11 +534,11 @@ func resourceScalewayDomainRecordDelete(ctx context.Context, d *schema.ResourceD
530534

531535
if !hasRecords {
532536
_, err = waitForDNSZone(ctx, domainAPI, d.Get("dns_zone").(string), d.Timeout(schema.TimeoutDelete))
533-
if err != nil && !ErrCodeEquals(err, domain.ErrCodeNoSuchDNSZone) {
534-
if is404Error(err) {
537+
if err != nil {
538+
if errorCheck(err, domain.ErrCodeNoSuchDNSZone) {
535539
return nil
536540
}
537-
return diag.FromErr(err)
541+
return diag.FromErr(fmt.Errorf("failed to wait for dns zone before deleting: %w", err))
538542
}
539543

540544
_, err = domainAPI.DeleteDNSZone(&domain.DeleteDNSZoneRequest{

scaleway/resource_domain_record_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ func TestAccScalewayDomainRecord_Basic2(t *testing.T) {
210210
tt := NewTestTools(t)
211211
defer tt.Cleanup()
212212

213-
testDNSZone := fmt.Sprintf("test-basic.%s", testDomain)
213+
testDNSZone := fmt.Sprintf("test-basic2.%s", testDomain)
214214
l.Debugf("TestAccScalewayDomainRecord_Basic: test dns zone: %s", testDNSZone)
215215

216216
recordType := "A"
@@ -694,7 +694,7 @@ func testAccCheckScalewayDomainRecordDestroy(tt *TestTools) resource.TestCheckFu
694694
}
695695

696696
if err != nil {
697-
return err
697+
return fmt.Errorf("failed to check if domain zone exists: %w", err)
698698
}
699699

700700
if listDNSZones.TotalCount > 0 {

scaleway/resource_function_namespace.go

+4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ func resourceScalewayFunctionNamespace() *schema.Resource {
2020
StateContext: schema.ImportStatePassthroughContext,
2121
},
2222
Timeouts: &schema.ResourceTimeout{
23+
Create: schema.DefaultTimeout(defaultFunctionNamespaceTimeout),
24+
Read: schema.DefaultTimeout(defaultFunctionNamespaceTimeout),
25+
Update: schema.DefaultTimeout(defaultFunctionNamespaceTimeout),
26+
Delete: schema.DefaultTimeout(defaultFunctionNamespaceTimeout),
2327
Default: schema.DefaultTimeout(defaultFunctionNamespaceTimeout),
2428
},
2529
SchemaVersion: 0,

scaleway/resource_instance_private_nic.go

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ func resourceScalewayInstancePrivateNIC() *schema.Resource {
1919
StateContext: schema.ImportStatePassthroughContext,
2020
},
2121
Timeouts: &schema.ResourceTimeout{
22+
Create: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
23+
Read: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
24+
Update: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
25+
Delete: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
2226
Default: schema.DefaultTimeout(defaultInstancePrivateNICWaitTimeout),
2327
},
2428
Schema: map[string]*schema.Schema{

scaleway/resource_instance_server.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ func resourceScalewayInstanceServer() *schema.Resource {
3030
StateContext: schema.ImportStatePassthroughContext,
3131
},
3232
Timeouts: &schema.ResourceTimeout{
33+
Create: schema.DefaultTimeout(defaultInstanceServerWaitTimeout),
34+
Read: schema.DefaultTimeout(defaultInstanceServerWaitTimeout),
35+
Update: schema.DefaultTimeout(defaultInstanceServerWaitTimeout),
36+
Delete: schema.DefaultTimeout(defaultInstanceServerWaitTimeout),
3337
Default: schema.DefaultTimeout(defaultInstanceServerWaitTimeout),
3438
},
3539
SchemaVersion: 0,
@@ -677,12 +681,16 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
677681

678682
volumes := map[string]*instance.VolumeServerTemplate{}
679683

680-
if raw, ok := d.GetOk("additional_volume_ids"); d.HasChange("additional_volume_ids") && ok {
684+
if raw, hasAdditionalVolumes := d.GetOk("additional_volume_ids"); d.HasChange("additional_volume_ids") {
681685
volumes["0"] = &instance.VolumeServerTemplate{
682686
ID: expandZonedID(d.Get("root_volume.0.volume_id")).ID,
683687
Name: newRandomName("vol"), // name is ignored by the API, any name will work here
684688
}
685689

690+
if !hasAdditionalVolumes {
691+
raw = []interface{}{} // Set an empty list if not volumes exist
692+
}
693+
686694
for i, volumeID := range raw.([]interface{}) {
687695
volumeHasChange := d.HasChange("additional_volume_ids." + strconv.Itoa(i))
688696
// local volumes can only be added when the instance is stopped

scaleway/resource_instance_server_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,73 @@ func TestAccScalewayInstanceServer_AdditionalVolumes(t *testing.T) {
543543
})
544544
}
545545

546+
func TestAccScalewayInstanceServer_AdditionalVolumesDetach(t *testing.T) {
547+
tt := NewTestTools(t)
548+
defer tt.Cleanup()
549+
resource.Test(t, resource.TestCase{
550+
PreCheck: func() { testAccPreCheck(t) },
551+
ProviderFactories: tt.ProviderFactories,
552+
CheckDestroy: resource.ComposeTestCheckFunc(
553+
testAccCheckScalewayInstanceVolumeDestroy(tt),
554+
testAccCheckScalewayInstanceServerDestroy(tt),
555+
),
556+
Steps: []resource.TestStep{
557+
{
558+
Config: `
559+
variable "zone" {
560+
type = string
561+
default = "fr-par-1"
562+
}
563+
564+
resource "scaleway_instance_volume" "main" {
565+
type = "b_ssd"
566+
name = "foobar"
567+
size_in_gb = 1
568+
}
569+
570+
resource "scaleway_instance_server" "main" {
571+
type = "DEV1-S"
572+
image = "ubuntu_focal"
573+
name = "foobar"
574+
575+
enable_dynamic_ip = true
576+
577+
additional_volume_ids = [scaleway_instance_volume.main.id]
578+
}
579+
`,
580+
},
581+
{
582+
Config: `
583+
variable "zone" {
584+
type = string
585+
default = "fr-par-1"
586+
}
587+
588+
resource "scaleway_instance_volume" "main" {
589+
type = "b_ssd"
590+
name = "foobar"
591+
size_in_gb = 1
592+
}
593+
594+
resource "scaleway_instance_server" "main" {
595+
type = "DEV1-S"
596+
image = "ubuntu_focal"
597+
name = "foobar"
598+
599+
enable_dynamic_ip = true
600+
601+
additional_volume_ids = []
602+
}
603+
`,
604+
Check: resource.ComposeTestCheckFunc(
605+
testAccCheckScalewayInstanceVolumeExists(tt, "scaleway_instance_volume.main"),
606+
resource.TestCheckResourceAttr("scaleway_instance_server.main", "additional_volume_ids.#", "0"),
607+
),
608+
},
609+
},
610+
})
611+
}
612+
546613
func TestAccScalewayInstanceServer_WithPlacementGroup(t *testing.T) {
547614
tt := NewTestTools(t)
548615
defer tt.Cleanup()

scaleway/resource_instance_snapshot.go

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ func resourceScalewayInstanceSnapshot() *schema.Resource {
2121
StateContext: schema.ImportStatePassthroughContext,
2222
},
2323
Timeouts: &schema.ResourceTimeout{
24+
Create: schema.DefaultTimeout(defaultInstanceSnapshotWaitTimeout),
25+
Delete: schema.DefaultTimeout(defaultInstanceSnapshotWaitTimeout),
2426
Default: schema.DefaultTimeout(defaultInstanceSnapshotWaitTimeout),
2527
},
2628
SchemaVersion: 0,

0 commit comments

Comments
 (0)