Skip to content

Commit 1d2f5b6

Browse files
authored
azurerm_kusto_cluster_customer_managed_key - add support for managed_hsm_key_id (hashicorp#29416)
[ENHANCEMENT] * `azurerm_kusto_cluster_customer_managed_key` - add support for `managed_hsm_key_id`
1 parent 40e18ce commit 1d2f5b6

File tree

3 files changed

+330
-37
lines changed

3 files changed

+330
-37
lines changed

internal/services/kusto/kusto_cluster_customer_managed_key_resource.go

Lines changed: 86 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,14 @@ import (
1010

1111
"github.com/hashicorp/go-azure-helpers/lang/response"
1212
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids"
13-
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
1413
"github.com/hashicorp/go-azure-sdk/resource-manager/kusto/2024-04-13/clusters"
1514
"github.com/hashicorp/terraform-provider-azurerm/helpers/tf"
1615
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
1716
"github.com/hashicorp/terraform-provider-azurerm/internal/locks"
1817
"github.com/hashicorp/terraform-provider-azurerm/internal/services/kusto/migration"
18+
managedHsmHelpers "github.com/hashicorp/terraform-provider-azurerm/internal/services/managedhsm/helpers"
19+
"github.com/hashicorp/terraform-provider-azurerm/internal/services/managedhsm/parse"
20+
"github.com/hashicorp/terraform-provider-azurerm/internal/services/managedhsm/validate"
1921
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
2022
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
2123
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
@@ -54,12 +56,25 @@ func resourceKustoClusterCustomerManagedKey() *pluginsdk.Resource {
5456
ValidateFunc: commonids.ValidateKustoClusterID,
5557
},
5658

57-
"key_vault_id": commonschema.ResourceIDReferenceRequired(&commonids.KeyVaultId{}),
59+
"key_vault_id": {
60+
Type: pluginsdk.TypeString,
61+
Optional: true,
62+
ValidateFunc: commonids.ValidateKeyVaultID,
63+
ExactlyOneOf: []string{"managed_hsm_key_id", "key_vault_id"},
64+
},
65+
66+
"managed_hsm_key_id": {
67+
Type: pluginsdk.TypeString,
68+
Optional: true,
69+
ValidateFunc: validation.Any(validate.ManagedHSMDataPlaneVersionedKeyID, validate.ManagedHSMDataPlaneVersionlessKeyID),
70+
ExactlyOneOf: []string{"managed_hsm_key_id", "key_vault_id"},
71+
},
5872

5973
"key_name": {
6074
Type: pluginsdk.TypeString,
61-
Required: true,
75+
Optional: true,
6276
ValidateFunc: validation.StringIsNotEmpty,
77+
RequiredWith: []string{"key_vault_id"},
6378
},
6479

6580
"key_version": {
@@ -112,44 +127,62 @@ func resourceKustoClusterCustomerManagedKeyCreateUpdate(d *pluginsdk.ResourceDat
112127
}
113128
}
114129

115-
keyVaultIDRaw := d.Get("key_vault_id").(string)
116-
keyVaultID, err := commonids.ParseKeyVaultID(keyVaultIDRaw)
117-
if err != nil {
118-
return err
119-
}
130+
keyName := ""
131+
keyVersion := ""
132+
keyVaultURI := ""
120133

121-
keyVault, err := vaultsClient.Get(ctx, *keyVaultID)
122-
if err != nil {
123-
return fmt.Errorf("retrieving %s: %+v", *keyVaultID, err)
124-
}
134+
if _, ok := d.GetOk("key_vault_id"); ok {
135+
keyVaultID, err := commonids.ParseKeyVaultID(d.Get("key_vault_id").(string))
136+
if err != nil {
137+
return err
138+
}
139+
140+
keyVault, err := vaultsClient.Get(ctx, *keyVaultID)
141+
if err != nil {
142+
return fmt.Errorf("retrieving %s: %+v", *keyVaultID, err)
143+
}
125144

126-
softDeleteEnabled := false
127-
purgeProtectionEnabled := false
128-
if model := keyVault.Model; model != nil {
129-
if esd := model.Properties.EnableSoftDelete; esd != nil {
130-
softDeleteEnabled = *esd
145+
softDeleteEnabled := false
146+
purgeProtectionEnabled := false
147+
if model := keyVault.Model; model != nil {
148+
if esd := model.Properties.EnableSoftDelete; esd != nil {
149+
softDeleteEnabled = *esd
150+
}
151+
if epp := model.Properties.EnablePurgeProtection; epp != nil {
152+
purgeProtectionEnabled = *epp
153+
}
131154
}
132-
if epp := model.Properties.EnablePurgeProtection; epp != nil {
133-
purgeProtectionEnabled = *epp
155+
if !softDeleteEnabled || !purgeProtectionEnabled {
156+
return fmt.Errorf("%s must be configured for both Purge Protection and Soft Delete", *keyVaultID)
134157
}
135-
}
136-
if !softDeleteEnabled || !purgeProtectionEnabled {
137-
return fmt.Errorf("%s must be configured for both Purge Protection and Soft Delete", *keyVaultID)
138-
}
139158

140-
keyVaultBaseURL, err := keyVaultsClient.BaseUriForKeyVault(ctx, *keyVaultID)
141-
if err != nil {
142-
return fmt.Errorf("looking up Key Vault URI from %s: %+v", *keyVaultID, err)
159+
keyVaultBaseURL, err := keyVaultsClient.BaseUriForKeyVault(ctx, *keyVaultID)
160+
if err != nil {
161+
return fmt.Errorf("looking up Key Vault URI from %s: %+v", *keyVaultID, err)
162+
}
163+
keyName = d.Get("key_name").(string)
164+
keyVersion = d.Get("key_version").(string)
165+
keyVaultURI = *keyVaultBaseURL
166+
} else if managedHSMKeyId, ok := d.GetOk("managed_hsm_key_id"); ok {
167+
if keyId, err := parse.ManagedHSMDataPlaneVersionedKeyID(managedHSMKeyId.(string), nil); err == nil {
168+
keyName = keyId.KeyName
169+
keyVersion = keyId.KeyVersion
170+
keyVaultURI = keyId.BaseUri()
171+
} else if keyId, err := parse.ManagedHSMDataPlaneVersionlessKeyID(managedHSMKeyId.(string), nil); err == nil {
172+
keyName = keyId.KeyName
173+
keyVersion = ""
174+
keyVaultURI = keyId.BaseUri()
175+
} else {
176+
return fmt.Errorf("Failed to parse '%s' as HSM key ID", managedHSMKeyId)
177+
}
143178
}
144179

145-
keyName := d.Get("key_name").(string)
146-
keyVersion := d.Get("key_version").(string)
147180
props := clusters.ClusterUpdate{
148181
Properties: &clusters.ClusterProperties{
149182
KeyVaultProperties: &clusters.KeyVaultProperties{
150183
KeyName: utils.String(keyName),
151184
KeyVersion: utils.String(keyVersion),
152-
KeyVaultUri: utils.String(*keyVaultBaseURL),
185+
KeyVaultUri: utils.String(keyVaultURI),
153186
},
154187
},
155188
}
@@ -171,6 +204,7 @@ func resourceKustoClusterCustomerManagedKeyCreateUpdate(d *pluginsdk.ResourceDat
171204
func resourceKustoClusterCustomerManagedKeyRead(d *pluginsdk.ResourceData, meta interface{}) error {
172205
clusterClient := meta.(*clients.Client).Kusto.ClustersClient
173206
keyVaultsClient := meta.(*clients.Client).KeyVault
207+
env := meta.(*clients.Client).Account.Environment
174208
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
175209
defer cancel()
176210

@@ -223,16 +257,33 @@ func resourceKustoClusterCustomerManagedKeyRead(d *pluginsdk.ResourceData, meta
223257
return fmt.Errorf("retrieving %s: `properties.keyVaultProperties.keyVaultUri` was nil", id)
224258
}
225259

226-
// now we have the key vault uri we can look up the ID
227-
subscriptionResourceId := commonids.NewSubscriptionID(id.SubscriptionId)
228-
keyVaultID, err := keyVaultsClient.KeyVaultIDFromBaseUrl(ctx, subscriptionResourceId, keyVaultURI)
260+
isHSMURI, err, instanceName, domainSuffix := managedHsmHelpers.IsManagedHSMURI(env, keyVaultURI)
229261
if err != nil {
230-
return fmt.Errorf("retrieving Key Vault ID from the Base URI %q: %+v", keyVaultURI, err)
262+
return err
263+
}
264+
switch {
265+
case isHSMURI && keyVersion == "":
266+
{
267+
d.Set("managed_hsm_key_id", parse.NewManagedHSMDataPlaneVersionlessKeyID(instanceName, domainSuffix, keyName).ID())
268+
}
269+
case isHSMURI && keyVersion != "":
270+
{
271+
d.Set("managed_hsm_key_id", parse.NewManagedHSMDataPlaneVersionedKeyID(instanceName, domainSuffix, keyName, keyVersion).ID())
272+
}
273+
case !isHSMURI:
274+
{
275+
// now we have the key vault uri we can look up the ID
276+
subscriptionResourceId := commonids.NewSubscriptionID(id.SubscriptionId)
277+
keyVaultID, err := keyVaultsClient.KeyVaultIDFromBaseUrl(ctx, subscriptionResourceId, keyVaultURI)
278+
if err != nil {
279+
return fmt.Errorf("retrieving Key Vault ID from the Base URI %q: %+v", keyVaultURI, err)
280+
}
281+
d.Set("key_vault_id", keyVaultID)
282+
d.Set("key_name", keyName)
283+
}
231284
}
232285

233286
d.Set("cluster_id", d.Id())
234-
d.Set("key_vault_id", keyVaultID)
235-
d.Set("key_name", keyName)
236287
d.Set("key_version", keyVersion)
237288
d.Set("user_identity", userIdentity)
238289
return nil

0 commit comments

Comments
 (0)