Skip to content

Commit

Permalink
feat(instance_server): always default to sbs volume root volume (#2920)
Browse files Browse the repository at this point in the history
* feat(instance_server): default to sbs volume root volume, even if l_ssd is available

l_ssd servers are planned to disappear with the arrival of high perfomance block.

* refactor(block): extract test checks helpers

* update tests

* add image test with sbs

* update cassettes

* update lb cassette

* update vpcgw cassettes

* update invalid cassettes

* lint
  • Loading branch information
Codelax authored Feb 13, 2025
1 parent 006df6b commit b1b12fd
Show file tree
Hide file tree
Showing 41 changed files with 38,264 additions and 24,911 deletions.
5 changes: 3 additions & 2 deletions internal/services/block/snapshot_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
blocktestfuncs "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block/testfuncs"
)

func TestAccDataSourceSnapshot_Basic(t *testing.T) {
Expand All @@ -14,7 +15,7 @@ func TestAccDataSourceSnapshot_Basic(t *testing.T) {
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
isSnapshotDestroyed(tt),
blocktestfuncs.IsSnapshotDestroyed(tt),
),
Steps: []resource.TestStep{
{
Expand All @@ -38,7 +39,7 @@ func TestAccDataSourceSnapshot_Basic(t *testing.T) {
}
`,
Check: resource.ComposeTestCheckFunc(
isSnapshotPresent(tt, "scaleway_block_snapshot.main"),
blocktestfuncs.IsSnapshotPresent(tt, "scaleway_block_snapshot.main"),

resource.TestCheckResourceAttrPair("scaleway_block_snapshot.main", "name", "data.scaleway_block_snapshot.find_by_name", "name"),
resource.TestCheckResourceAttrPair("scaleway_block_snapshot.main", "name", "data.scaleway_block_snapshot.find_by_id", "name"),
Expand Down
64 changes: 3 additions & 61 deletions internal/services/block/snapshot_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package block_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
blockSDK "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block"
blocktestfuncs "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block/testfuncs"
)

func TestAccSnapshot_Basic(t *testing.T) {
Expand All @@ -19,7 +15,7 @@ func TestAccSnapshot_Basic(t *testing.T) {
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: isSnapshotDestroyed(tt),
CheckDestroy: blocktestfuncs.IsSnapshotDestroyed(tt),
Steps: []resource.TestStep{
{
Config: `
Expand All @@ -34,65 +30,11 @@ func TestAccSnapshot_Basic(t *testing.T) {
}
`,
Check: resource.ComposeTestCheckFunc(
isSnapshotPresent(tt, "scaleway_block_snapshot.main"),
blocktestfuncs.IsSnapshotPresent(tt, "scaleway_block_snapshot.main"),
acctest.CheckResourceAttrUUID("scaleway_block_snapshot.main", "id"),
resource.TestCheckResourceAttr("scaleway_block_snapshot.main", "name", "test-block-snapshot-basic"),
),
},
},
})
}

func isSnapshotPresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
return func(state *terraform.State) error {
rs, ok := state.RootModule().Resources[n]
if !ok {
return fmt.Errorf("resource not found: %s", n)
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

_, err = api.GetSnapshot(&blockSDK.GetSnapshotRequest{
SnapshotID: id,
Zone: zone,
})
if err != nil {
return err
}

return nil
}
}

func isSnapshotDestroyed(tt *acctest.TestTools) resource.TestCheckFunc {
return func(state *terraform.State) error {
for _, rs := range state.RootModule().Resources {
if rs.Type != "scaleway_block_snapshot" {
continue
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

err = api.DeleteSnapshot(&blockSDK.DeleteSnapshotRequest{
SnapshotID: id,
Zone: zone,
})

if err == nil {
return fmt.Errorf("block snapshot (%s) still exists", rs.Primary.ID)
}

if !httperrors.Is404(err) {
return err
}
}

return nil
}
}
120 changes: 120 additions & 0 deletions internal/services/block/testfuncs/checks.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package blocktestfuncs

import (
"fmt"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
blockSDK "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block"
)

func IsSnapshotPresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
return func(state *terraform.State) error {
rs, ok := state.RootModule().Resources[n]
if !ok {
return fmt.Errorf("resource not found: %s", n)
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

_, err = api.GetSnapshot(&blockSDK.GetSnapshotRequest{
SnapshotID: id,
Zone: zone,
})
if err != nil {
return err
}

return nil
}
}

func IsVolumePresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
return func(state *terraform.State) error {
rs, ok := state.RootModule().Resources[n]
if !ok {
return fmt.Errorf("resource not found: %s", n)
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

_, err = api.GetVolume(&blockSDK.GetVolumeRequest{
VolumeID: id,
Zone: zone,
})
if err != nil {
return err
}

return nil
}
}

func IsVolumeDestroyed(tt *acctest.TestTools) resource.TestCheckFunc {
return func(state *terraform.State) error {
for _, rs := range state.RootModule().Resources {
if rs.Type != "scaleway_block_volume" {
continue
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

err = api.DeleteVolume(&blockSDK.DeleteVolumeRequest{
VolumeID: id,
Zone: zone,
})

if err == nil {
return fmt.Errorf("block volume (%s) still exists", rs.Primary.ID)
}

if !httperrors.Is404(err) && !httperrors.Is410(err) {
return err
}
}

return nil
}
}

func IsSnapshotDestroyed(tt *acctest.TestTools) resource.TestCheckFunc {
return func(state *terraform.State) error {
for _, rs := range state.RootModule().Resources {
if rs.Type != "scaleway_block_snapshot" {
continue
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

err = api.DeleteSnapshot(&blockSDK.DeleteSnapshotRequest{
SnapshotID: id,
Zone: zone,
})

if err == nil {
return fmt.Errorf("block snapshot (%s) still exists", rs.Primary.ID)
}

if !httperrors.Is404(err) {
return err
}
}

return nil
}
}
5 changes: 3 additions & 2 deletions internal/services/block/volume_data_source_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
blocktestfuncs "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block/testfuncs"
)

func TestAccDataSourceVolume_Basic(t *testing.T) {
Expand All @@ -14,7 +15,7 @@ func TestAccDataSourceVolume_Basic(t *testing.T) {
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
isVolumeDestroyed(tt),
blocktestfuncs.IsVolumeDestroyed(tt),
),
Steps: []resource.TestStep{
{
Expand All @@ -34,7 +35,7 @@ func TestAccDataSourceVolume_Basic(t *testing.T) {
}
`,
Check: resource.ComposeTestCheckFunc(
isVolumePresent(tt, "scaleway_block_volume.main"),
blocktestfuncs.IsVolumePresent(tt, "scaleway_block_volume.main"),

resource.TestCheckResourceAttrPair("scaleway_block_volume.main", "name", "data.scaleway_block_volume.find_by_name", "name"),
resource.TestCheckResourceAttrPair("scaleway_block_volume.main", "name", "data.scaleway_block_volume.find_by_id", "name"),
Expand Down
68 changes: 5 additions & 63 deletions internal/services/block/volume_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
package block_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
blockSDK "github.com/scaleway/scaleway-sdk-go/api/block/v1alpha1"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/acctest"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block"
blocktestfuncs "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/block/testfuncs"
)

func TestAccVolume_Basic(t *testing.T) {
Expand All @@ -19,7 +15,7 @@ func TestAccVolume_Basic(t *testing.T) {
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: isVolumeDestroyed(tt),
CheckDestroy: blocktestfuncs.IsVolumeDestroyed(tt),
Steps: []resource.TestStep{
{
Config: `
Expand All @@ -30,7 +26,7 @@ func TestAccVolume_Basic(t *testing.T) {
}
`,
Check: resource.ComposeTestCheckFunc(
isVolumePresent(tt, "scaleway_block_volume.main"),
blocktestfuncs.IsVolumePresent(tt, "scaleway_block_volume.main"),
acctest.CheckResourceAttrUUID("scaleway_block_volume.main", "id"),
resource.TestCheckResourceAttr("scaleway_block_volume.main", "name", "test-block-volume-basic"),
resource.TestCheckResourceAttr("scaleway_block_volume.main", "size_in_gb", "20"),
Expand All @@ -47,7 +43,7 @@ func TestAccVolume_FromSnapshot(t *testing.T) {
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: isVolumeDestroyed(tt),
CheckDestroy: blocktestfuncs.IsVolumeDestroyed(tt),
Steps: []resource.TestStep{
{
Config: `
Expand All @@ -69,7 +65,7 @@ func TestAccVolume_FromSnapshot(t *testing.T) {
}
`,
Check: resource.ComposeTestCheckFunc(
isVolumePresent(tt, "scaleway_block_volume.main"),
blocktestfuncs.IsVolumePresent(tt, "scaleway_block_volume.main"),
acctest.CheckResourceAttrUUID("scaleway_block_volume.main", "id"),
resource.TestCheckResourceAttrPair("scaleway_block_volume.main", "snapshot_id", "scaleway_block_snapshot.main", "id"),
resource.TestCheckResourceAttrPair("scaleway_block_volume.main", "size_in_gb", "scaleway_block_volume.base", "size_in_gb"),
Expand All @@ -78,57 +74,3 @@ func TestAccVolume_FromSnapshot(t *testing.T) {
},
})
}

func isVolumePresent(tt *acctest.TestTools, n string) resource.TestCheckFunc {
return func(state *terraform.State) error {
rs, ok := state.RootModule().Resources[n]
if !ok {
return fmt.Errorf("resource not found: %s", n)
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

_, err = api.GetVolume(&blockSDK.GetVolumeRequest{
VolumeID: id,
Zone: zone,
})
if err != nil {
return err
}

return nil
}
}

func isVolumeDestroyed(tt *acctest.TestTools) resource.TestCheckFunc {
return func(state *terraform.State) error {
for _, rs := range state.RootModule().Resources {
if rs.Type != "scaleway_block_volume" {
continue
}

api, zone, id, err := block.NewAPIWithZoneAndID(tt.Meta, rs.Primary.ID)
if err != nil {
return err
}

err = api.DeleteVolume(&blockSDK.DeleteVolumeRequest{
VolumeID: id,
Zone: zone,
})

if err == nil {
return fmt.Errorf("block volume (%s) still exists", rs.Primary.ID)
}

if !httperrors.Is404(err) && !httperrors.Is410(err) {
return err
}
}

return nil
}
}
11 changes: 0 additions & 11 deletions internal/services/instance/helpers_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -508,22 +508,11 @@ func instanceServerAdditionalVolumeTemplate(api *BlockAndInstanceAPI, zone scw.Z
}

func prepareRootVolume(rootVolumeI map[string]any, serverType *instance.ServerType, image string) *UnknownVolume {
serverTypeCanBootOnBlock := serverType.VolumesConstraint.MaxSize == 0

rootVolumeIsBootVolume := types.ExpandBoolPtr(types.GetMapValue[bool](rootVolumeI, "boot"))
rootVolumeType := types.GetMapValue[string](rootVolumeI, "volume_type")
sizeInput := types.GetMapValue[int](rootVolumeI, "size_in_gb")
rootVolumeID := zonal.ExpandID(types.GetMapValue[string](rootVolumeI, "volume_id")).ID

// If the rootVolumeType is not defined, define it depending on the offer
if rootVolumeType == "" {
if serverTypeCanBootOnBlock {
rootVolumeType = instance.VolumeVolumeTypeSbsVolume.String()
} else {
rootVolumeType = instance.VolumeVolumeTypeLSSD.String()
}
}

rootVolumeName := ""
if image == "" { // When creating an instance from an image, volume should not have a name
rootVolumeName = types.NewRandomName("vol")
Expand Down
Loading

0 comments on commit b1b12fd

Please sign in to comment.