Skip to content

Commit 2f91304

Browse files
authored
test(instance): fix TestAccScalewayInstanceServer_AdditionalVolumes (#732)
1 parent 416da3c commit 2f91304

File tree

3 files changed

+2647
-2259
lines changed

3 files changed

+2647
-2259
lines changed

scaleway/resource_instance_server.go

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,8 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
286286
req.Volumes = make(map[string]*instance.VolumeTemplate)
287287
if size, ok := d.GetOk("root_volume.0.size_in_gb"); ok {
288288
req.Volumes["0"] = &instance.VolumeTemplate{
289-
Size: scw.Size(uint64(size.(int)) * gb),
289+
Size: scw.Size(uint64(size.(int)) * gb),
290+
VolumeType: instance.VolumeVolumeTypeLSSD,
290291
}
291292
} else {
292293
// We had a local root volume if it is not already present
@@ -310,6 +311,7 @@ func resourceScalewayInstanceServerCreate(ctx context.Context, d *schema.Resourc
310311
ID: vol.Volume.ID,
311312
Name: vol.Volume.Name,
312313
VolumeType: vol.Volume.VolumeType,
314+
Size: vol.Volume.Size,
313315
}
314316
}
315317
}
@@ -468,6 +470,7 @@ func resourceScalewayInstanceServerRead(ctx context.Context, d *schema.ResourceD
468470

469471
rootVolume["volume_id"] = newZonedID(zone, volume.ID).String()
470472
rootVolume["size_in_gb"] = int(uint64(volume.Size) / gb)
473+
rootVolume["delete_on_termination"] = d.Get("root_volume.0.delete_on_termination")
471474

472475
_ = d.Set("root_volume", []map[string]interface{}{rootVolume})
473476
} else {
@@ -551,20 +554,28 @@ func resourceScalewayInstanceServerUpdate(ctx context.Context, d *schema.Resourc
551554
volumes := map[string]*instance.VolumeTemplate{}
552555

553556
if raw, ok := d.GetOk("additional_volume_ids"); d.HasChange("additional_volume_ids") && ok {
554-
volumes["0"] = &instance.VolumeTemplate{ID: expandZonedID(d.Get("root_volume.0.volume_id")).ID, Name: newRandomName("vol")} // name is ignored by the API, any name will work here
557+
volumes["0"] = &instance.VolumeTemplate{
558+
ID: expandZonedID(d.Get("root_volume.0.volume_id")).ID,
559+
Name: newRandomName("vol"), // name is ignored by the API, any name will work here
560+
}
555561

556562
for i, volumeID := range raw.([]interface{}) {
563+
volumeHasChange := d.HasChange("additional_volume_ids." + strconv.Itoa(i))
557564
// local volumes can only be added when the instance is stopped
558-
if !isStopped {
565+
if volumeHasChange && !isStopped {
559566
volumeResp, err := instanceAPI.GetVolume(&instance.GetVolumeRequest{
560567
Zone: zone,
561568
VolumeID: expandZonedID(volumeID).ID,
562569
})
563570
if err != nil {
564571
return diag.FromErr(err)
565572
}
566-
if volumeResp.Volume.VolumeType == instance.VolumeVolumeTypeLSSD {
567-
return diag.FromErr(fmt.Errorf("instance must be stopped to change local volumes"))
573+
574+
// We must be able to tell whether a volume is already present in the server or not
575+
if volumeResp.Volume.Server != nil {
576+
if volumeResp.Volume.VolumeType == instance.VolumeVolumeTypeLSSD && volumeResp.Volume.Server.ID != "" {
577+
return diag.FromErr(fmt.Errorf("instance must be stopped to change local volumes"))
578+
}
568579
}
569580
}
570581
volumes[strconv.Itoa(i+1)] = &instance.VolumeTemplate{

scaleway/resource_instance_server_test.go

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package scaleway
22

33
import (
44
"fmt"
5-
"strings"
65
"testing"
76

87
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -494,19 +493,67 @@ func TestAccScalewayInstanceServer_AdditionalVolumes(t *testing.T) {
494493
CheckDestroy: testAccCheckScalewayInstanceServerDestroy(tt),
495494
Steps: []resource.TestStep{
496495
{
497-
Config: testAccCheckScalewayInstanceServerConfigVolumes(false, InstanceServerStateStarted),
496+
// With additional local
497+
Config: `
498+
resource "scaleway_instance_volume" "local" {
499+
size_in_gb = 10
500+
type = "l_ssd"
501+
}
502+
503+
resource "scaleway_instance_server" "base" {
504+
image = "ubuntu_focal"
505+
type = "DEV1-S"
506+
507+
root_volume {
508+
size_in_gb = 10
509+
}
510+
511+
tags = [ "terraform-test", "scaleway_instance_server", "additional_volume_ids" ]
512+
513+
additional_volume_ids = [
514+
scaleway_instance_volume.local.id
515+
]
516+
}
517+
`,
498518
Check: resource.ComposeTestCheckFunc(
499519
testAccCheckScalewayInstanceServerExists(tt, "scaleway_instance_server.base"),
500-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "20"),
520+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "10"),
501521
),
502522
},
503523
{
504-
Config: testAccCheckScalewayInstanceServerConfigVolumes(true, InstanceServerStateStarted),
524+
// With additional local and block
525+
Config: `
526+
resource "scaleway_instance_volume" "local" {
527+
size_in_gb = 10
528+
type = "l_ssd"
529+
}
530+
531+
resource "scaleway_instance_volume" "block" {
532+
size_in_gb = 10
533+
type = "b_ssd"
534+
}
535+
536+
resource "scaleway_instance_server" "base" {
537+
image = "ubuntu_focal"
538+
type = "DEV1-S"
539+
540+
root_volume {
541+
size_in_gb = 10
542+
}
543+
544+
tags = [ "terraform-test", "scaleway_instance_server", "additional_volume_ids" ]
545+
546+
additional_volume_ids = [
547+
scaleway_instance_volume.local.id,
548+
scaleway_instance_volume.block.id
549+
]
550+
}
551+
`,
505552
Check: resource.ComposeTestCheckFunc(
506-
testAccCheckScalewayInstanceVolumeExists(tt, "scaleway_instance_volume.base_block"),
553+
testAccCheckScalewayInstanceVolumeExists(tt, "scaleway_instance_volume.block"),
507554
testAccCheckScalewayInstanceServerExists(tt, "scaleway_instance_server.base"),
508-
resource.TestCheckResourceAttr("scaleway_instance_volume.base_block", "size_in_gb", "10"),
509-
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "20"),
555+
resource.TestCheckResourceAttr("scaleway_instance_volume.block", "size_in_gb", "10"),
556+
resource.TestCheckResourceAttr("scaleway_instance_server.base", "root_volume.0.size_in_gb", "10"),
510557
),
511558
},
512559
},
@@ -757,44 +804,6 @@ func testAccCheckScalewayInstanceServerDestroy(tt *TestTools) resource.TestCheck
757804
}
758805
}
759806

760-
func testAccCheckScalewayInstanceServerConfigVolumes(withBlock bool, state string, localVolumesInGB ...int) string {
761-
additionalVolumeResources := ""
762-
baseVolume := 20
763-
var additionalVolumeIDs []string
764-
for i, size := range localVolumesInGB {
765-
additionalVolumeResources += fmt.Sprintf(`
766-
resource "scaleway_instance_volume" "base_volume%d" {
767-
size_in_gb = %d
768-
type = "l_ssd"
769-
}`, i, size)
770-
additionalVolumeIDs = append(additionalVolumeIDs, fmt.Sprintf(`"${scaleway_instance_volume.base_volume%d.id}"`, i))
771-
baseVolume -= size
772-
}
773-
774-
if withBlock {
775-
additionalVolumeResources += `
776-
resource "scaleway_instance_volume" "base_block" {
777-
size_in_gb = 10
778-
type = "b_ssd"
779-
}`
780-
additionalVolumeIDs = append(additionalVolumeIDs, `"${scaleway_instance_volume.base_block.id}"`)
781-
}
782-
return fmt.Sprintf(`
783-
%s
784-
785-
resource "scaleway_instance_server" "base" {
786-
image = "ubuntu_focal"
787-
type = "DEV1-S"
788-
root_volume {
789-
size_in_gb = %d
790-
}
791-
tags = [ "terraform-test", "scaleway_instance_server", "additional_volume_ids" ]
792-
state = "%s"
793-
794-
additional_volume_ids = [ %s ]
795-
}`, additionalVolumeResources, baseVolume, state, strings.Join(additionalVolumeIDs, ","))
796-
}
797-
798807
func TestAccScalewayInstanceServer_Bootscript(t *testing.T) {
799808
tt := NewTestTools(t)
800809
defer tt.Cleanup()

0 commit comments

Comments
 (0)