Skip to content

Commit 99f58d9

Browse files
New Resource: azurerm_storage_mover_nfs_file_share_endpoint
1 parent a43b4db commit 99f58d9

File tree

5 files changed

+558
-0
lines changed

5 files changed

+558
-0
lines changed

internal/services/storagemover/registration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func (r Registration) Resources() []sdk.Resource {
4242
return []sdk.Resource{
4343
StorageMoverResource{},
4444
StorageMoverAgentResource{},
45+
StorageMoverNfsFileShareEndpointResource{},
4546
StorageMoverSourceEndpointResource{},
4647
StorageMoverTargetEndpointResource{},
4748
StorageMoverProjectResource{},
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
// Copyright (c) HashiCorp, Inc.
2+
// SPDX-License-Identifier: MPL-2.0
3+
4+
package storagemover
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"time"
10+
11+
"github.com/hashicorp/go-azure-helpers/lang/pointer"
12+
"github.com/hashicorp/go-azure-helpers/lang/response"
13+
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids"
14+
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/endpoints"
15+
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/storagemovers"
16+
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
17+
"github.com/hashicorp/terraform-provider-azurerm/internal/services/storagemover/validate"
18+
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
19+
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
20+
)
21+
22+
type StorageMoverNfsFileShareEndpointModel struct {
23+
Name string `tfschema:"name"`
24+
StorageMoverId string `tfschema:"storage_mover_id"`
25+
StorageAccountId string `tfschema:"storage_account_id"`
26+
FileShareName string `tfschema:"file_share_name"`
27+
Description string `tfschema:"description"`
28+
}
29+
30+
type StorageMoverNfsFileShareEndpointResource struct{}
31+
32+
var _ sdk.ResourceWithUpdate = StorageMoverNfsFileShareEndpointResource{}
33+
34+
func (r StorageMoverNfsFileShareEndpointResource) ResourceType() string {
35+
return "azurerm_storage_mover_nfs_file_share_endpoint"
36+
}
37+
38+
func (r StorageMoverNfsFileShareEndpointResource) ModelObject() interface{} {
39+
return &StorageMoverNfsFileShareEndpointModel{}
40+
}
41+
42+
func (r StorageMoverNfsFileShareEndpointResource) IDValidationFunc() pluginsdk.SchemaValidateFunc {
43+
return endpoints.ValidateEndpointID
44+
}
45+
46+
func (r StorageMoverNfsFileShareEndpointResource) Arguments() map[string]*pluginsdk.Schema {
47+
return map[string]*pluginsdk.Schema{
48+
"name": {
49+
Type: pluginsdk.TypeString,
50+
Required: true,
51+
ForceNew: true,
52+
ValidateFunc: validate.EndpointName,
53+
},
54+
55+
"storage_mover_id": {
56+
Type: pluginsdk.TypeString,
57+
Required: true,
58+
ForceNew: true,
59+
ValidateFunc: storagemovers.ValidateStorageMoverID,
60+
},
61+
62+
"storage_account_id": {
63+
Type: pluginsdk.TypeString,
64+
Required: true,
65+
ForceNew: true,
66+
ValidateFunc: commonids.ValidateStorageAccountID,
67+
},
68+
69+
"file_share_name": {
70+
Type: pluginsdk.TypeString,
71+
Required: true,
72+
ForceNew: true,
73+
ValidateFunc: validation.StringIsNotEmpty,
74+
},
75+
76+
"description": {
77+
Type: pluginsdk.TypeString,
78+
Optional: true,
79+
ValidateFunc: validation.StringIsNotEmpty,
80+
},
81+
}
82+
}
83+
84+
func (r StorageMoverNfsFileShareEndpointResource) Attributes() map[string]*pluginsdk.Schema {
85+
return map[string]*pluginsdk.Schema{}
86+
}
87+
88+
func (r StorageMoverNfsFileShareEndpointResource) Create() sdk.ResourceFunc {
89+
return sdk.ResourceFunc{
90+
Timeout: 30 * time.Minute,
91+
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
92+
var model StorageMoverNfsFileShareEndpointModel
93+
if err := metadata.Decode(&model); err != nil {
94+
return fmt.Errorf("decoding: %+v", err)
95+
}
96+
97+
client := metadata.Client.StorageMover.EndpointsClient
98+
storageMoverId, err := storagemovers.ParseStorageMoverID(model.StorageMoverId)
99+
if err != nil {
100+
return err
101+
}
102+
103+
id := endpoints.NewEndpointID(storageMoverId.SubscriptionId, storageMoverId.ResourceGroupName, storageMoverId.StorageMoverName, model.Name)
104+
existing, err := client.Get(ctx, id)
105+
if err != nil && !response.WasNotFound(existing.HttpResponse) {
106+
return fmt.Errorf("checking for existing %s: %+v", id, err)
107+
}
108+
109+
if !response.WasNotFound(existing.HttpResponse) {
110+
return metadata.ResourceRequiresImport(r.ResourceType(), id)
111+
}
112+
113+
properties := endpoints.Endpoint{
114+
Properties: endpoints.AzureStorageNfsFileShareEndpointProperties{
115+
FileShareName: model.FileShareName,
116+
StorageAccountResourceId: model.StorageAccountId,
117+
},
118+
}
119+
120+
if model.Description != "" {
121+
if v, ok := properties.Properties.(endpoints.AzureStorageNfsFileShareEndpointProperties); ok {
122+
v.Description = pointer.To(model.Description)
123+
properties.Properties = v
124+
}
125+
}
126+
127+
if _, err := client.CreateOrUpdate(ctx, id, properties); err != nil {
128+
return fmt.Errorf("creating %s: %+v", id, err)
129+
}
130+
131+
metadata.SetID(id)
132+
return nil
133+
},
134+
}
135+
}
136+
137+
func (r StorageMoverNfsFileShareEndpointResource) Update() sdk.ResourceFunc {
138+
return sdk.ResourceFunc{
139+
Timeout: 30 * time.Minute,
140+
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
141+
client := metadata.Client.StorageMover.EndpointsClient
142+
143+
id, err := endpoints.ParseEndpointID(metadata.ResourceData.Id())
144+
if err != nil {
145+
return err
146+
}
147+
148+
var model StorageMoverNfsFileShareEndpointModel
149+
if err := metadata.Decode(&model); err != nil {
150+
return fmt.Errorf("decoding: %+v", err)
151+
}
152+
153+
resp, err := client.Get(ctx, *id)
154+
if err != nil {
155+
return fmt.Errorf("retrieving %s: %+v", *id, err)
156+
}
157+
158+
properties := resp.Model
159+
if properties == nil {
160+
return fmt.Errorf("retrieving %s: model was nil", *id)
161+
}
162+
163+
if metadata.ResourceData.HasChange("description") {
164+
if v, ok := properties.Properties.(endpoints.AzureStorageNfsFileShareEndpointProperties); ok {
165+
v.Description = pointer.To(model.Description)
166+
properties.Properties = v
167+
}
168+
}
169+
170+
if _, err := client.CreateOrUpdate(ctx, *id, *properties); err != nil {
171+
return fmt.Errorf("updating %s: %+v", *id, err)
172+
}
173+
174+
return nil
175+
},
176+
}
177+
}
178+
179+
func (r StorageMoverNfsFileShareEndpointResource) Read() sdk.ResourceFunc {
180+
return sdk.ResourceFunc{
181+
Timeout: 5 * time.Minute,
182+
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
183+
client := metadata.Client.StorageMover.EndpointsClient
184+
185+
id, err := endpoints.ParseEndpointID(metadata.ResourceData.Id())
186+
if err != nil {
187+
return err
188+
}
189+
190+
resp, err := client.Get(ctx, *id)
191+
if err != nil {
192+
if response.WasNotFound(resp.HttpResponse) {
193+
return metadata.MarkAsGone(id)
194+
}
195+
196+
return fmt.Errorf("retrieving %s: %+v", *id, err)
197+
}
198+
199+
state := StorageMoverNfsFileShareEndpointModel{
200+
Name: id.EndpointName,
201+
StorageMoverId: storagemovers.NewStorageMoverID(id.SubscriptionId, id.ResourceGroupName, id.StorageMoverName).ID(),
202+
}
203+
204+
if model := resp.Model; model != nil {
205+
if v, ok := model.Properties.(endpoints.AzureStorageNfsFileShareEndpointProperties); ok {
206+
state.FileShareName = v.FileShareName
207+
state.StorageAccountId = v.StorageAccountResourceId
208+
209+
des := ""
210+
if v.Description != nil {
211+
des = *v.Description
212+
}
213+
state.Description = des
214+
}
215+
}
216+
217+
return metadata.Encode(&state)
218+
},
219+
}
220+
}
221+
222+
func (r StorageMoverNfsFileShareEndpointResource) Delete() sdk.ResourceFunc {
223+
return sdk.ResourceFunc{
224+
Timeout: 30 * time.Minute,
225+
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
226+
client := metadata.Client.StorageMover.EndpointsClient
227+
228+
id, err := endpoints.ParseEndpointID(metadata.ResourceData.Id())
229+
if err != nil {
230+
return err
231+
}
232+
233+
if err := client.DeleteThenPoll(ctx, *id); err != nil {
234+
return fmt.Errorf("deleting %s: %+v", id, err)
235+
}
236+
237+
return nil
238+
},
239+
}
240+
}

0 commit comments

Comments
 (0)