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
4 changes: 3 additions & 1 deletion internal/services/storagemover/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,5 +66,7 @@ func (r Registration) EphemeralResources() []func() ephemeral.EphemeralResource
}

func (r Registration) ListResources() []sdk.FrameworkListWrappedResource {
return []sdk.FrameworkListWrappedResource{}
return []sdk.FrameworkListWrappedResource{
StorageMoverListResource{},
}
}
57 changes: 39 additions & 18 deletions internal/services/storagemover/storage_mover_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,15 @@ import (
"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
"github.com/hashicorp/go-azure-helpers/resourcemanager/location"
"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/storagemovers"
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
)

//go:generate go run ../../tools/generator-tests resourceidentity -resource-name storage_mover -service-package-name storagemover -properties "name,resource_group_name" -known-values "subscription_id:data.Subscriptions.Primary"

type StorageMoverModel struct {
Name string `tfschema:"name"`
ResourceGroupName string `tfschema:"resource_group_name"`
Expand All @@ -27,7 +30,14 @@ type StorageMoverModel struct {

type StorageMoverResource struct{}

var _ sdk.ResourceWithUpdate = StorageMoverResource{}
var (
_ sdk.ResourceWithIdentity = StorageMoverResource{}
_ sdk.ResourceWithUpdate = StorageMoverResource{}
)

func (r StorageMoverResource) Identity() resourceids.ResourceId {
return &storagemovers.StorageMoverId{}
}

func (r StorageMoverResource) ResourceType() string {
return "azurerm_storage_mover"
Expand Down Expand Up @@ -106,6 +116,9 @@ func (r StorageMoverResource) Create() sdk.ResourceFunc {
}

metadata.SetID(id)
if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, &id); err != nil {
return err
}

return nil
},
Expand Down Expand Up @@ -180,27 +193,35 @@ func (r StorageMoverResource) Read() sdk.ResourceFunc {
return fmt.Errorf("retrieving %s: model was nil", *id)
}

state := StorageMoverModel{
Name: id.StorageMoverName,
ResourceGroupName: id.ResourceGroupName,
Location: location.Normalize(model.Location),
}
return r.flatten(metadata, id, model)
},
}
}

description := ""
if properties := model.Properties; properties != nil {
if properties.Description != nil {
description = *properties.Description
}
}
state.Description = description
func (r StorageMoverResource) flatten(metadata sdk.ResourceMetaData, id *storagemovers.StorageMoverId, model *storagemovers.StorageMover) error {
state := StorageMoverModel{
Name: id.StorageMoverName,
ResourceGroupName: id.ResourceGroupName,
Location: location.Normalize(model.Location),
}

if model.Tags != nil {
state.Tags = *model.Tags
}
description := ""
if properties := model.Properties; properties != nil {
if properties.Description != nil {
description = *properties.Description
}
}
state.Description = description

return metadata.Encode(&state)
},
if model.Tags != nil {
state.Tags = *model.Tags
}

if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, id); err != nil {
return err
}

return metadata.Encode(&state)
}

func (r StorageMoverResource) Delete() sdk.ResourceFunc {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright IBM Corp. 2014, 2025
// SPDX-License-Identifier: MPL-2.0

package storagemover_test

import (
"testing"

"github.com/hashicorp/terraform-plugin-testing/knownvalue"
"github.com/hashicorp/terraform-plugin-testing/statecheck"
"github.com/hashicorp/terraform-plugin-testing/tfjsonpath"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
customstatecheck "github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/statecheck"
)

func TestAccStorageMover_resourceIdentity(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_storage_mover", "test")
r := StorageMoverResource{}

checkedFields := map[string]struct{}{
"subscription_id": {},
"name": {},
"resource_group_name": {},
}

data.ResourceIdentityTest(t, []acceptance.TestStep{
{
Config: r.basic(data),
ConfigStateChecks: []statecheck.StateCheck{
customstatecheck.ExpectAllIdentityFieldsAreChecked("azurerm_storage_mover.test", checkedFields),
statecheck.ExpectIdentityValue("azurerm_storage_mover.test", tfjsonpath.New("subscription_id"), knownvalue.StringExact(data.Subscriptions.Primary)),
statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_storage_mover.test", tfjsonpath.New("name"), tfjsonpath.New("name")),
statecheck.ExpectIdentityValueMatchesStateAtPath("azurerm_storage_mover.test", tfjsonpath.New("resource_group_name"), tfjsonpath.New("resource_group_name")),
},
},
data.ImportBlockWithResourceIdentityStep(false),
data.ImportBlockWithIDStep(false),
}, false)
}
98 changes: 98 additions & 0 deletions internal/services/storagemover/storage_mover_resource_list.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: MPL-2.0

package storagemover

import (
"context"
"fmt"

"github.com/hashicorp/go-azure-helpers/lang/pointer"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids"
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/storagemovers"
"github.com/hashicorp/terraform-plugin-framework/list"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
)

type StorageMoverListResource struct{}

var _ sdk.FrameworkListWrappedResource = new(StorageMoverListResource)

func (StorageMoverListResource) Metadata(_ context.Context, _ resource.MetadataRequest, response *resource.MetadataResponse) {
response.TypeName = StorageMoverResource{}.ResourceType()
}

func (StorageMoverListResource) ResourceFunc() *pluginsdk.Resource {
return sdk.WrappedResource(StorageMoverResource{})
}

func (StorageMoverListResource) List(ctx context.Context, request list.ListRequest, stream *list.ListResultsStream, metadata sdk.ResourceMetadata) {
client := metadata.Client.StorageMover.StorageMoversClient

var data sdk.DefaultListModel
diags := request.Config.Get(ctx, &data)
if diags.HasError() {
stream.Results = list.ListResultsStreamDiagnostics(diags)
return
}

var results []storagemovers.StorageMover
subscriptionID := metadata.SubscriptionId
if !data.SubscriptionId.IsNull() {
subscriptionID = data.SubscriptionId.ValueString()
}

resource := StorageMoverResource{}

switch {
case !data.ResourceGroupName.IsNull():
resp, err := client.ListComplete(ctx, commonids.NewResourceGroupID(subscriptionID, data.ResourceGroupName.ValueString()))
if err != nil {
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", resource.ResourceType()), err)
return
}

results = resp.Items
default:
resp, err := client.ListBySubscriptionComplete(ctx, commonids.NewSubscriptionID(subscriptionID))
if err != nil {
sdk.SetResponseErrorDiagnostic(stream, fmt.Sprintf("listing `%s`", resource.ResourceType()), err)
return
}

results = resp.Items
}

stream.Results = func(push func(list.ListResult) bool) {
for _, item := range results {
result := request.NewListResult(ctx)
result.DisplayName = pointer.From(item.Name)

id, err := storagemovers.ParseStorageMoverIDInsensitively(pointer.From(item.Id))
if err != nil {
sdk.SetErrorDiagnosticAndPushListResult(result, push, "parsing Storage Mover ID", err)
return
}

meta := sdk.NewResourceMetaData(metadata.Client, resource)
meta.SetID(id)

if err := resource.flatten(meta, id, &item); err != nil {
sdk.SetErrorDiagnosticAndPushListResult(result, push, fmt.Sprintf("encoding `%s` resource data", resource.ResourceType()), err)
return
}

sdk.EncodeListResult(ctx, meta.ResourceData, &result)
if result.Diagnostics.HasError() {
push(result)
return
}

if !push(result) {
return
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
// Copyright IBM Corp. 2014, 2026
// SPDX-License-Identifier: MPL-2.0

package storagemover_test

import (
"context"
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-testing/helper/resource"
"github.com/hashicorp/terraform-plugin-testing/knownvalue"
"github.com/hashicorp/terraform-plugin-testing/querycheck"
"github.com/hashicorp/terraform-plugin-testing/tfversion"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
"github.com/hashicorp/terraform-provider-azurerm/internal/provider/framework"
)

func TestAccStorageMover_list(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_storage_mover", "testlist")
r := StorageMoverResource{}
resourceName := fmt.Sprintf("acctest-ssm-%d", data.RandomInteger)
resourceGroupName := fmt.Sprintf("acctest-rg-%d", data.RandomInteger)

resource.Test(t, resource.TestCase{
TerraformVersionChecks: []tfversion.TerraformVersionCheck{
tfversion.SkipBelow(tfversion.Version1_14_0),
},
ProtoV5ProviderFactories: framework.ProtoV5ProviderFactoriesInit(context.Background(), "azurerm"),
Steps: []resource.TestStep{
{
Config: r.basic(data),
},
{
Query: true,
Config: r.subscriptionListQuery(),
QueryResultChecks: []querycheck.QueryResultCheck{
querycheck.ExpectLengthAtLeast("azurerm_storage_mover.list", 1),
querycheck.ExpectIdentity("azurerm_storage_mover.list", map[string]knownvalue.Check{
"name": knownvalue.StringExact(resourceName),
"resource_group_name": knownvalue.StringExact(resourceGroupName),
"subscription_id": knownvalue.StringExact(data.Subscriptions.Primary),
}),
},
},
{
Query: true,
Config: r.resourceGroupListQuery(),
QueryResultChecks: []querycheck.QueryResultCheck{
querycheck.ExpectLength("azurerm_storage_mover.list", 1),
querycheck.ExpectIdentity("azurerm_storage_mover.list", map[string]knownvalue.Check{
"name": knownvalue.StringExact(resourceName),
"resource_group_name": knownvalue.StringExact(resourceGroupName),
"subscription_id": knownvalue.StringExact(data.Subscriptions.Primary),
}),
},
},
},
})
}

func (r StorageMoverResource) subscriptionListQuery() string {
return `
list "azurerm_storage_mover" "list" {
provider = azurerm
}
`
}

func (r StorageMoverResource) resourceGroupListQuery() string {
return `
list "azurerm_storage_mover" "list" {
provider = azurerm
config {
resource_group_name = azurerm_resource_group.test.name
}
}
`
}
Loading
Loading