Skip to content

Commit 29411de

Browse files
New Resource: azurerm_storage_mover_multi_cloud_connector_endpoint
1 parent a43b4db commit 29411de

File tree

4 files changed

+536
-0
lines changed

4 files changed

+536
-0
lines changed

internal/services/storagemover/registration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func (r Registration) Resources() []sdk.Resource {
4646
StorageMoverTargetEndpointResource{},
4747
StorageMoverProjectResource{},
4848
StorageMoverJobDefinitionResource{},
49+
StorageMoverMultiCloudConnectorEndpointResource{},
4950
}
5051
}
5152

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

0 commit comments

Comments
 (0)