Skip to content

Commit 3a966ee

Browse files
Storage Mover SMB Mount Endpoint: set resource identity on create/read, rename credentials to key vault secret IDs
- Implement ResourceWithIdentity: call SetResourceIdentityData after SetID in Create and in Read to fix 'Missing Resource Identity After Create' - Align Create with guide: return metadata.Encode after SetResourceIdentityData - Rename username_uri/password_uri to username_key_vault_secret_id/password_key_vault_secret_id in schema, docs and tests (PR feedback) Made-with: Cursor
1 parent 284ac43 commit 3a966ee

File tree

3 files changed

+63
-41
lines changed

3 files changed

+63
-41
lines changed

internal/services/storagemover/storage_mover_smb_mount_endpoint_resource.go

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
"github.com/hashicorp/go-azure-helpers/lang/pointer"
1313
"github.com/hashicorp/go-azure-helpers/lang/response"
14+
"github.com/hashicorp/go-azure-helpers/resourcemanager/keyvault"
15+
"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
1416
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/endpoints"
1517
"github.com/hashicorp/go-azure-sdk/resource-manager/storagemover/2025-07-01/storagemovers"
1618
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
@@ -19,18 +21,21 @@ import (
1921
)
2022

2123
type StorageMoverSmbMountEndpointModel struct {
22-
Name string `tfschema:"name"`
23-
StorageMoverId string `tfschema:"storage_mover_id"`
24-
Host string `tfschema:"host"`
25-
ShareName string `tfschema:"share_name"`
26-
UsernameUri string `tfschema:"username_uri"`
27-
PasswordUri string `tfschema:"password_uri"`
28-
Description string `tfschema:"description"`
24+
Name string `tfschema:"name"`
25+
StorageMoverId string `tfschema:"storage_mover_id"`
26+
Host string `tfschema:"host"`
27+
ShareName string `tfschema:"share_name"`
28+
UsernameKeyVaultSecretId string `tfschema:"username_key_vault_secret_id"`
29+
PasswordKeyVaultSecretId string `tfschema:"password_key_vault_secret_id"`
30+
Description string `tfschema:"description"`
2931
}
3032

3133
type StorageMoverSmbMountEndpointResource struct{}
3234

33-
var _ sdk.ResourceWithUpdate = StorageMoverSmbMountEndpointResource{}
35+
var (
36+
_ sdk.ResourceWithUpdate = StorageMoverSmbMountEndpointResource{}
37+
_ sdk.ResourceWithIdentity = StorageMoverSmbMountEndpointResource{}
38+
)
3439

3540
func (r StorageMoverSmbMountEndpointResource) ResourceType() string {
3641
return "azurerm_storage_mover_smb_mount_endpoint"
@@ -40,6 +45,10 @@ func (r StorageMoverSmbMountEndpointResource) ModelObject() interface{} {
4045
return &StorageMoverSmbMountEndpointModel{}
4146
}
4247

48+
func (r StorageMoverSmbMountEndpointResource) Identity() resourceids.ResourceId {
49+
return &endpoints.EndpointId{}
50+
}
51+
4352
func (r StorageMoverSmbMountEndpointResource) IDValidationFunc() pluginsdk.SchemaValidateFunc {
4453
return endpoints.ValidateEndpointID
4554
}
@@ -77,17 +86,19 @@ func (r StorageMoverSmbMountEndpointResource) Arguments() map[string]*pluginsdk.
7786
ValidateFunc: validation.StringIsNotEmpty,
7887
},
7988

80-
"username_uri": {
89+
"username_key_vault_secret_id": {
8190
Type: pluginsdk.TypeString,
8291
Optional: true,
83-
ValidateFunc: validation.StringIsNotEmpty,
92+
RequiredWith: []string{"password_key_vault_secret_id"},
93+
ValidateFunc: keyvault.ValidateNestedItemID(keyvault.VersionTypeAny, keyvault.NestedItemTypeSecret),
8494
},
8595

86-
"password_uri": {
96+
"password_key_vault_secret_id": {
8797
Type: pluginsdk.TypeString,
8898
Optional: true,
8999
Sensitive: true,
90-
ValidateFunc: validation.StringIsNotEmpty,
100+
RequiredWith: []string{"username_key_vault_secret_id"},
101+
ValidateFunc: keyvault.ValidateNestedItemID(keyvault.VersionTypeAny, keyvault.NestedItemTypeSecret),
91102
},
92103

93104
"description": {
@@ -132,11 +143,14 @@ func (r StorageMoverSmbMountEndpointResource) Create() sdk.ResourceFunc {
132143
ShareName: model.ShareName,
133144
}
134145

135-
if model.UsernameUri != "" || model.PasswordUri != "" {
146+
if model.UsernameKeyVaultSecretId != "" || model.PasswordKeyVaultSecretId != "" {
147+
if model.UsernameKeyVaultSecretId == "" || model.PasswordKeyVaultSecretId == "" {
148+
return fmt.Errorf("both `username_key_vault_secret_id` and `password_key_vault_secret_id` must be specified together when configuring SMB mount endpoint credentials")
149+
}
136150
endpointProperties.Credentials = &endpoints.AzureKeyVaultSmbCredentials{
137151
Type: endpoints.CredentialTypeAzureKeyVaultSmb,
138-
UsernameUri: pointer.To(model.UsernameUri),
139-
PasswordUri: pointer.To(model.PasswordUri),
152+
UsernameUri: pointer.To(model.UsernameKeyVaultSecretId),
153+
PasswordUri: pointer.To(model.PasswordKeyVaultSecretId),
140154
}
141155
}
142156

@@ -153,7 +167,10 @@ func (r StorageMoverSmbMountEndpointResource) Create() sdk.ResourceFunc {
153167
}
154168

155169
metadata.SetID(id)
156-
return nil
170+
if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, &id); err != nil {
171+
return err
172+
}
173+
return metadata.Encode(&model)
157174
},
158175
}
159176
}
@@ -189,15 +206,17 @@ func (r StorageMoverSmbMountEndpointResource) Update() sdk.ResourceFunc {
189206
v.Description = pointer.To(model.Description)
190207
}
191208

192-
if metadata.ResourceData.HasChange("username_uri") || metadata.ResourceData.HasChange("password_uri") {
193-
if model.UsernameUri != "" || model.PasswordUri != "" {
209+
if metadata.ResourceData.HasChange("username_key_vault_secret_id") || metadata.ResourceData.HasChange("password_key_vault_secret_id") {
210+
if model.UsernameKeyVaultSecretId != "" && model.PasswordKeyVaultSecretId != "" {
194211
v.Credentials = &endpoints.AzureKeyVaultSmbCredentials{
195212
Type: endpoints.CredentialTypeAzureKeyVaultSmb,
196-
UsernameUri: pointer.To(model.UsernameUri),
197-
PasswordUri: pointer.To(model.PasswordUri),
213+
UsernameUri: pointer.To(model.UsernameKeyVaultSecretId),
214+
PasswordUri: pointer.To(model.PasswordKeyVaultSecretId),
198215
}
199-
} else {
216+
} else if model.UsernameKeyVaultSecretId == "" && model.PasswordKeyVaultSecretId == "" {
200217
v.Credentials = nil
218+
} else {
219+
return fmt.Errorf("both `username_key_vault_secret_id` and `password_key_vault_secret_id` must be specified together")
201220
}
202221
}
203222

@@ -245,10 +264,10 @@ func (r StorageMoverSmbMountEndpointResource) Read() sdk.ResourceFunc {
245264

246265
if v.Credentials != nil {
247266
if v.Credentials.UsernameUri != nil {
248-
state.UsernameUri = *v.Credentials.UsernameUri
267+
state.UsernameKeyVaultSecretId = *v.Credentials.UsernameUri
249268
}
250269
if v.Credentials.PasswordUri != nil {
251-
state.PasswordUri = *v.Credentials.PasswordUri
270+
state.PasswordKeyVaultSecretId = *v.Credentials.PasswordUri
252271
}
253272
}
254273

@@ -260,6 +279,9 @@ func (r StorageMoverSmbMountEndpointResource) Read() sdk.ResourceFunc {
260279
}
261280
}
262281

282+
if err := pluginsdk.SetResourceIdentityData(metadata.ResourceData, id); err != nil {
283+
return err
284+
}
263285
return metadata.Encode(&state)
264286
},
265287
}

internal/services/storagemover/storage_mover_smb_mount_endpoint_resource_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestAccStorageMoverSmbMountEndpoint_complete(t *testing.T) {
5757
check.That(data.ResourceName).ExistsInAzure(r),
5858
),
5959
},
60-
data.ImportStep("password_uri"),
60+
data.ImportStep("password_key_vault_secret_id"),
6161
})
6262
}
6363

@@ -71,14 +71,14 @@ func TestAccStorageMoverSmbMountEndpoint_update(t *testing.T) {
7171
check.That(data.ResourceName).ExistsInAzure(r),
7272
),
7373
},
74-
data.ImportStep("password_uri"),
74+
data.ImportStep("password_key_vault_secret_id"),
7575
{
7676
Config: r.update(data),
7777
Check: acceptance.ComposeTestCheckFunc(
7878
check.That(data.ResourceName).ExistsInAzure(r),
7979
),
8080
},
81-
data.ImportStep("password_uri"),
81+
data.ImportStep("password_key_vault_secret_id"),
8282
})
8383
}
8484

@@ -195,9 +195,9 @@ resource "azurerm_storage_mover_smb_mount_endpoint" "test" {
195195
storage_mover_id = azurerm_storage_mover.test.id
196196
host = "192.168.0.1"
197197
share_name = "testshare"
198-
username_uri = azurerm_key_vault_secret.username.versionless_id
199-
password_uri = azurerm_key_vault_secret.password.versionless_id
200-
description = "Example SMB Mount Endpoint Description"
198+
username_key_vault_secret_id = azurerm_key_vault_secret.username.versionless_id
199+
password_key_vault_secret_id = azurerm_key_vault_secret.password.versionless_id
200+
description = "Example SMB Mount Endpoint Description"
201201
}
202202
`, template, data.RandomString, data.RandomInteger)
203203
}
@@ -251,9 +251,9 @@ resource "azurerm_storage_mover_smb_mount_endpoint" "test" {
251251
storage_mover_id = azurerm_storage_mover.test.id
252252
host = "192.168.0.1"
253253
share_name = "testshare"
254-
username_uri = azurerm_key_vault_secret.username.versionless_id
255-
password_uri = azurerm_key_vault_secret.password.versionless_id
256-
description = "Updated SMB Mount Endpoint Description"
254+
username_key_vault_secret_id = azurerm_key_vault_secret.username.versionless_id
255+
password_key_vault_secret_id = azurerm_key_vault_secret.password.versionless_id
256+
description = "Updated SMB Mount Endpoint Description"
257257
}
258258
`, template, data.RandomString, data.RandomInteger)
259259
}

website/docs/r/storage_mover_smb_mount_endpoint.html.markdown

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ resource "azurerm_storage_mover" "example" {
4848
}
4949
5050
resource "azurerm_storage_mover_smb_mount_endpoint" "example" {
51-
name = "example-smbme"
52-
storage_mover_id = azurerm_storage_mover.example.id
53-
host = "server.contoso.com"
54-
share_name = "data"
55-
username_uri = "https://example-vault.vault.azure.net/secrets/username"
56-
password_uri = "https://example-vault.vault.azure.net/secrets/password"
57-
description = "Example SMB Mount Endpoint with credentials"
51+
name = "example-smbme"
52+
storage_mover_id = azurerm_storage_mover.example.id
53+
host = "server.contoso.com"
54+
share_name = "data"
55+
username_key_vault_secret_id = azurerm_key_vault_secret.username.versionless_id
56+
password_key_vault_secret_id = azurerm_key_vault_secret.password.versionless_id
57+
description = "Example SMB Mount Endpoint with credentials"
5858
}
5959
```
6060

@@ -70,9 +70,9 @@ The following arguments are supported:
7070

7171
* `share_name` - (Required) Specifies the name of the SMB share. Changing this forces a new resource to be created.
7272

73-
* `username_uri` - (Optional) Specifies the Azure Key Vault secret URI for the username to use for authentication.
73+
* `username_key_vault_secret_id` - (Optional) Specifies the Azure Key Vault secret ID for the username to use for authentication. Must be specified together with `password_key_vault_secret_id`. You can use `azurerm_key_vault_secret.<name>.id` or `azurerm_key_vault_secret.<name>.versionless_id` (recommended to avoid pinning to a specific secret version).
7474

75-
* `password_uri` - (Optional) Specifies the Azure Key Vault secret URI for the password to use for authentication.
75+
* `password_key_vault_secret_id` - (Optional) Specifies the Azure Key Vault secret ID for the password to use for authentication. Must be specified together with `username_key_vault_secret_id`. You can use `azurerm_key_vault_secret.<name>.id` or `azurerm_key_vault_secret.<name>.versionless_id` (recommended).
7676

7777
* `description` - (Optional) Specifies a description for the Storage Mover SMB Mount Endpoint.
7878

0 commit comments

Comments
 (0)