@@ -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
171204func 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