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
68 changes: 58 additions & 10 deletions internal/services/block/snapshot.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/scaleway/terraform-provider-scaleway/v2/internal/dsf"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/httperrors"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/regional"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/locality/zonal"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/services/account"
"github.com/scaleway/terraform-provider-scaleway/v2/internal/types"
Expand Down Expand Up @@ -41,10 +42,11 @@ func ResourceSnapshot() *schema.Resource {
},
"volume_id": {
Type: schema.TypeString,
Required: true,
Optional: true,
ValidateDiagFunc: verify.IsUUIDorUUIDWithLocality(),
Description: "ID of the volume from which creates a snapshot",
DiffSuppressFunc: dsf.Locality,
ConflictsWith: []string{"import"},
},
"tags": {
Type: schema.TypeList,
Expand All @@ -54,6 +56,34 @@ func ResourceSnapshot() *schema.Resource {
Optional: true,
Description: "The tags associated with the snapshot",
},
"import": {
Type: schema.TypeList,
ForceNew: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"bucket": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Bucket containing qcow",
DiffSuppressFunc: dsf.Locality,
StateFunc: func(i interface{}) string {
return regional.ExpandID(i.(string)).ID
},
},
"key": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
Description: "Key of the qcow file in the specified bucket",
},
},
},
Optional: true,
Description: "Import snapshot from a qcow",
ConflictsWith: []string{"volume_id"},
},
"zone": zonal.Schema(),
"project_id": account.ProjectIDSchema(),
},
Expand All @@ -66,15 +96,33 @@ func ResourceBlockSnapshotCreate(ctx context.Context, d *schema.ResourceData, m
return diag.FromErr(err)
}

snapshot, err := api.CreateSnapshot(&block.CreateSnapshotRequest{
Zone: zone,
ProjectID: d.Get("project_id").(string),
Name: types.ExpandOrGenerateString(d.Get("name").(string), "snapshot"),
VolumeID: locality.ExpandID(d.Get("volume_id")),
Tags: types.ExpandStrings(d.Get("tags")),
}, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
var snapshot *block.Snapshot

if _, isImported := d.GetOk("import"); !isImported {
snapshot, err = api.CreateSnapshot(&block.CreateSnapshotRequest{
Zone: zone,
ProjectID: d.Get("project_id").(string),
Name: types.ExpandOrGenerateString(d.Get("name").(string), "snapshot"),
VolumeID: locality.ExpandID(d.Get("volume_id")),
Tags: types.ExpandStrings(d.Get("tags")),
}, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
} else {
req := &block.ImportSnapshotFromObjectStorageRequest{
Zone: zone,
ProjectID: d.Get("project_id").(string),
Name: types.ExpandOrGenerateString(d.Get("name"), "snapshot"),
Bucket: regional.ExpandID(d.Get("import.0.bucket")).ID,
Key: d.Get("import.0.key").(string),
Tags: types.ExpandStrings(d.Get("tags")),
}

snapshot, err = api.ImportSnapshotFromObjectStorage(req, scw.WithContext(ctx))
if err != nil {
return diag.FromErr(err)
}
}

d.SetId(zonal.NewIDString(zone, snapshot.ID))
Expand Down
47 changes: 47 additions & 0 deletions internal/services/block/snapshot_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package block_test

import (
"fmt"
"testing"

sdkacctest "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"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"
objectchecks "github.com/scaleway/terraform-provider-scaleway/v2/internal/services/object/testfuncs"
)

func TestAccSnapshot_Basic(t *testing.T) {
Expand Down Expand Up @@ -38,3 +41,47 @@ func TestAccSnapshot_Basic(t *testing.T) {
},
})
}

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

bucketName := sdkacctest.RandomWithPrefix("test-acc-scaleway-block-snapshot")
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acctest.PreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
blocktestfuncs.IsSnapshotDestroyed(tt),
objectchecks.IsObjectDestroyed(tt),
objectchecks.IsBucketDestroyed(tt),
),
Steps: []resource.TestStep{
{
Config: fmt.Sprintf(`
resource "scaleway_object_bucket" "snapshot-bucket" {
name = "%s"
}

resource "scaleway_object" "qcow-object" {
bucket = scaleway_object_bucket.snapshot-bucket.name
key = "test-acc-block-snapshot.qcow2"
file = "testfixtures/small_image.qcow2"
}

resource "scaleway_block_snapshot" "qcow-block-snapshot" {
name = "test-acc-block-snapshot-qcow2"
import {
bucket = scaleway_object.qcow-object.bucket
key = scaleway_object.qcow-object.key
}
}
`, bucketName),
Check: resource.ComposeTestCheckFunc(
blocktestfuncs.IsSnapshotPresent(tt, "scaleway_block_snapshot.qcow-block-snapshot"),
acctest.CheckResourceAttrUUID("scaleway_block_snapshot.qcow-block-snapshot", "id"),
resource.TestCheckResourceAttr("scaleway_block_snapshot.qcow-block-snapshot", "name", "test-acc-block-snapshot-qcow2"),
),
},
},
})
}
Loading
Loading