Skip to content

Commit 1ec2374

Browse files
Refactor admin password validation for Windows VM
Simplifies validation logic for admin_password and admin_password_wo in the Windows Virtual Machine resource by removing redundant constraints and updating test and documentation to clarify usage. This improves clarity and flexibility for specifying administrator credentials.
1 parent fadf977 commit 1ec2374

3 files changed

Lines changed: 46 additions & 25 deletions

File tree

internal/services/compute/windows_virtual_machine_resource.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/hashicorp/go-azure-sdk/resource-manager/compute/2024-03-01/virtualmachines"
2525
"github.com/hashicorp/go-cty/cty"
2626
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
27-
sdkValidation "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
2827
"github.com/hashicorp/terraform-provider-azurerm/helpers/tf"
2928
azValidate "github.com/hashicorp/terraform-provider-azurerm/helpers/validate"
3029
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
@@ -56,10 +55,6 @@ func resourceWindowsVirtualMachine() *pluginsdk.Resource {
5655
Delete: pluginsdk.DefaultTimeout(45 * time.Minute),
5756
},
5857

59-
ValidateRawResourceConfigFuncs: []schema.ValidateRawResourceConfigFunc{
60-
sdkValidation.PreferWriteOnlyAttribute(cty.GetAttrPath("admin_password"), cty.GetAttrPath("admin_password_wo")),
61-
},
62-
6358
Schema: map[string]*pluginsdk.Schema{
6459
"name": {
6560
Type: pluginsdk.TypeString,
@@ -78,24 +73,19 @@ func resourceWindowsVirtualMachine() *pluginsdk.Resource {
7873
ForceNew: true,
7974
Sensitive: true,
8075
DiffSuppressFunc: adminPasswordDiffSuppressFunc,
81-
RequiredWith: []string{
82-
"admin_username",
83-
},
8476
ConflictsWith: []string{
8577
"os_managed_disk_id",
8678
"admin_password_wo",
8779
},
8880
ValidateFunc: computeValidate.WindowsAdminPassword,
89-
ExactlyOneOf: []string{"admin_password", "admin_password_wo"},
9081
},
9182

9283
"admin_password_wo": {
9384
Type: pluginsdk.TypeString,
9485
Optional: true,
9586
WriteOnly: true,
9687
RequiredWith: []string{"admin_password_wo_version"},
97-
ConflictsWith: []string{"admin_password"},
98-
ExactlyOneOf: []string{"admin_password", "admin_password_wo"},
88+
ConflictsWith: []string{"admin_password", "os_managed_disk_id"},
9989
ValidateFunc: computeValidate.WindowsAdminPassword,
10090
},
10191

@@ -110,9 +100,6 @@ func resourceWindowsVirtualMachine() *pluginsdk.Resource {
110100
Type: pluginsdk.TypeString,
111101
Optional: true,
112102
ForceNew: true,
113-
RequiredWith: []string{
114-
"admin_password",
115-
},
116103
ExactlyOneOf: []string{
117104
"admin_username",
118105
"os_managed_disk_id",

internal/services/compute/windows_virtual_machine_resource_auth_test.go

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ func TestAccWindowsVirtualMachine_authPasswordWriteOnly(t *testing.T) {
3232

3333
data.ResourceTest(t, r, []acceptance.TestStep{
3434
{
35-
Config: r.authPasswordWriteOnly(data, "P@$$w0rd1234!", 1),
35+
Config: r.authPasswordWriteOnly(data, 1),
3636
Check: acceptance.ComposeTestCheckFunc(
3737
check.That(data.ResourceName).ExistsInAzure(r),
3838
),
3939
},
40-
data.ImportStep("admin_password", "admin_password_wo_version"),
40+
data.ImportStep("admin_password_wo_version"),
4141
})
4242
}
4343

@@ -71,18 +71,52 @@ resource "azurerm_windows_virtual_machine" "test" {
7171
`, r.template(data))
7272
}
7373

74-
func (r WindowsVirtualMachineResource) authPasswordWriteOnly(data acceptance.TestData, password string, version int) string {
74+
func (r WindowsVirtualMachineResource) authPasswordWriteOnly(data acceptance.TestData, version int) string {
7575
return fmt.Sprintf(`
7676
%s
7777
78+
data "azurerm_client_config" "current" {}
79+
80+
resource "azurerm_key_vault" "test" {
81+
name = "acctestkv%[2]s"
82+
location = azurerm_resource_group.test.location
83+
resource_group_name = azurerm_resource_group.test.name
84+
tenant_id = data.azurerm_client_config.current.tenant_id
85+
sku_name = "standard"
86+
87+
access_policy {
88+
tenant_id = data.azurerm_client_config.current.tenant_id
89+
object_id = data.azurerm_client_config.current.object_id
90+
91+
secret_permissions = [
92+
"Get",
93+
"Set",
94+
"Delete",
95+
"Purge",
96+
]
97+
}
98+
}
99+
100+
resource "azurerm_key_vault_secret" "test" {
101+
name = "admin-password"
102+
value = "P@$$w0rd1234!%[3]d"
103+
key_vault_id = azurerm_key_vault.test.id
104+
}
105+
106+
ephemeral "azurerm_key_vault_secret" "test" {
107+
name = azurerm_key_vault_secret.test.name
108+
key_vault_id = azurerm_key_vault.test.id
109+
}
110+
78111
resource "azurerm_windows_virtual_machine" "test" {
79112
name = local.vm_name
80113
resource_group_name = azurerm_resource_group.test.name
81114
location = azurerm_resource_group.test.location
82115
size = "Standard_F2"
83116
admin_username = "adminuser"
84-
admin_password_wo = "%s"
85-
admin_password_wo_version = %d
117+
admin_password_wo = ephemeral.azurerm_key_vault_secret.test.value
118+
admin_password_wo_version = %[3]d
119+
86120
network_interface_ids = [
87121
azurerm_network_interface.test.id,
88122
]
@@ -99,5 +133,5 @@ resource "azurerm_windows_virtual_machine" "test" {
99133
version = "latest"
100134
}
101135
}
102-
`, r.template(data), password, version)
136+
`, r.template(data), data.RandomString, version)
103137
}

website/docs/r/windows_virtual_machine.html.markdown

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,15 @@ The following arguments are supported:
107107

108108
---
109109

110-
* `admin_password_wo` - (Optional, Write-Only) The Password which should be used for the local-administrator on this Virtual Machine.
110+
* `admin_password` - (Optional) The Password which should be used for the local-administrator on this Virtual Machine. Changing this forces a new resource to be created.
111111

112-
~> **Note:** One of `admin_password` or `admin_password_wo` must be specified.
112+
~> **Note:** This is required unless using an existing OS Managed Disk by specifying `os_managed_disk_id` or using `admin_password_wo`.
113113

114-
* `admin_password_wo_version` - (Optional) An integer value used to trigger an update for `admin_password_wo`. This property should be incremented when updating `admin_password_wo`.
114+
* `admin_password_wo` - (Optional, Write-Only) The write-only Password which should be used for the local-administrator on this Virtual Machine. This property should be used when sensitive values should not be stored in state.
115115

116-
* `admin_password` - (Optional) The Password which should be used for the local-administrator on this Virtual Machine. Changing this forces a new resource to be created.
116+
~> **Note:** One of `admin_password` or `admin_password_wo` must be specified when not using an existing OS Managed Disk.
117117

118-
~> **Note:** This is required unless using an existing OS Managed Disk by specifying `os_managed_disk_id`.
118+
* `admin_password_wo_version` - (Optional) An integer value used to trigger an update for `admin_password_wo`. This property should be incremented when updating `admin_password_wo`. Changing this forces a new resource to be created.
119119

120120
* `admin_username` - (Optional) The username of the local administrator used for the Virtual Machine. Changing this forces a new resource to be created.
121121

0 commit comments

Comments
 (0)