@@ -4,7 +4,10 @@ import (
4
4
"fmt"
5
5
"log"
6
6
"testing"
7
+ "time"
7
8
9
+ "github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault"
10
+ "github.com/Azure/go-autorest/autorest/date"
8
11
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
9
12
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance"
10
13
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
@@ -218,6 +221,37 @@ func TestAccAzureRMKeyVaultKey_update(t *testing.T) {
218
221
})
219
222
}
220
223
224
+ func TestAccAzureRMKeyVaultKey_updatedExternally (t * testing.T ) {
225
+ data := acceptance .BuildTestData (t , "azurerm_key_vault_key" , "test" )
226
+
227
+ resource .ParallelTest (t , resource.TestCase {
228
+ PreCheck : func () { acceptance .PreCheck (t ) },
229
+ Providers : acceptance .SupportedProviders ,
230
+ CheckDestroy : testCheckAzureRMKeyVaultKeyDestroy ,
231
+ Steps : []resource.TestStep {
232
+ {
233
+ Config : testAccAzureRMKeyVaultKey_basicEC (data ),
234
+ Check : resource .ComposeTestCheckFunc (
235
+ testCheckAzureRMKeyVaultKeyExists (data .ResourceName ),
236
+ updateExpiryDateForKeyVaultKey (data .ResourceName , "2029-02-02T12:59:00Z" ),
237
+ ),
238
+ ExpectNonEmptyPlan : true ,
239
+ },
240
+ {
241
+ Config : testAccAzureRMKeyVaultKey_basicECUpdatedExternally (data ),
242
+ Check : resource .ComposeTestCheckFunc (
243
+ testCheckAzureRMKeyVaultKeyExists (data .ResourceName ),
244
+ ),
245
+ },
246
+ {
247
+ Config : testAccAzureRMKeyVaultKey_basicECUpdatedExternally (data ),
248
+ PlanOnly : true ,
249
+ },
250
+ data .ImportStep ("key_size" ),
251
+ },
252
+ })
253
+ }
254
+
221
255
func TestAccAzureRMKeyVaultKey_disappears (t * testing.T ) {
222
256
data := acceptance .BuildTestData (t , "azurerm_key_vault_key" , "test" )
223
257
@@ -340,6 +374,60 @@ func testCheckAzureRMKeyVaultKeyExists(resourceName string) resource.TestCheckFu
340
374
}
341
375
}
342
376
377
+ func updateExpiryDateForKeyVaultKey (resourceName string , expiryDate string ) resource.TestCheckFunc {
378
+ return func (s * terraform.State ) error {
379
+ client := acceptance .AzureProvider .Meta ().(* clients.Client ).KeyVault .ManagementClient
380
+ vaultClient := acceptance .AzureProvider .Meta ().(* clients.Client ).KeyVault .VaultsClient
381
+ ctx := acceptance .AzureProvider .Meta ().(* clients.Client ).StopContext
382
+
383
+ // Ensure we have enough information in state to look up in API
384
+ rs , ok := s .RootModule ().Resources [resourceName ]
385
+ if ! ok {
386
+ return fmt .Errorf ("Not found: %s" , resourceName )
387
+ }
388
+ name := rs .Primary .Attributes ["name" ]
389
+ keyVaultId := rs .Primary .Attributes ["key_vault_id" ]
390
+ vaultBaseUrl , err := azure .GetKeyVaultBaseUrlFromID (ctx , vaultClient , keyVaultId )
391
+ if err != nil {
392
+ return fmt .Errorf ("Error looking up Secret %q vault url from id %q: %+v" , name , keyVaultId , err )
393
+ }
394
+
395
+ ok , err = azure .KeyVaultExists (ctx , acceptance .AzureProvider .Meta ().(* clients.Client ).KeyVault .VaultsClient , keyVaultId )
396
+ if err != nil {
397
+ return fmt .Errorf ("Error checking if key vault %q for Key %q in Vault at url %q exists: %v" , keyVaultId , name , vaultBaseUrl , err )
398
+ }
399
+ if ! ok {
400
+ log .Printf ("[DEBUG] Key %q Key Vault %q was not found in Key Vault at URI %q " , name , keyVaultId , vaultBaseUrl )
401
+ return nil
402
+ }
403
+
404
+ expirationDate , err := time .Parse (time .RFC3339 , expiryDate )
405
+ if err != nil {
406
+ return err
407
+ }
408
+ expirationUnixTime := date .UnixTime (expirationDate )
409
+ update := keyvault.KeyUpdateParameters {
410
+ KeyAttributes : & keyvault.KeyAttributes {
411
+ Expires : & expirationUnixTime ,
412
+ },
413
+ }
414
+ if _ , err = client .UpdateKey (ctx , vaultBaseUrl , name , "" , update ); err != nil {
415
+ return fmt .Errorf ("updating secret: %+v" , err )
416
+ }
417
+
418
+ resp , err := client .GetKey (ctx , vaultBaseUrl , name , "" )
419
+ if err != nil {
420
+ if utils .ResponseWasNotFound (resp .Response ) {
421
+ return fmt .Errorf ("Bad: Key Vault Key %q (resource group: %q) does not exist" , name , vaultBaseUrl )
422
+ }
423
+
424
+ return fmt .Errorf ("Bad: Get on keyVaultManagementClient: %+v" , err )
425
+ }
426
+
427
+ return nil
428
+ }
429
+ }
430
+
343
431
func testCheckAzureRMKeyVaultKeyDisappears (resourceName string ) resource.TestCheckFunc {
344
432
return func (s * terraform.State ) error {
345
433
client := acceptance .AzureProvider .Meta ().(* clients.Client ).KeyVault .ManagementClient
@@ -411,6 +499,7 @@ resource "azurerm_key_vault" "test" {
411
499
"create",
412
500
"delete",
413
501
"get",
502
+ "update",
414
503
]
415
504
416
505
secret_permissions = [
@@ -439,6 +528,70 @@ resource "azurerm_key_vault_key" "test" {
439
528
` , data .RandomInteger , data .Locations .Primary , data .RandomString , data .RandomString )
440
529
}
441
530
531
+ func testAccAzureRMKeyVaultKey_basicECUpdatedExternally (data acceptance.TestData ) string {
532
+ return fmt .Sprintf (`
533
+ provider "azurerm" {
534
+ features {}
535
+ }
536
+
537
+ data "azurerm_client_config" "current" {
538
+ }
539
+
540
+ resource "azurerm_resource_group" "test" {
541
+ name = "acctestRG-%d"
542
+ location = "%s"
543
+ }
544
+
545
+ resource "azurerm_key_vault" "test" {
546
+ name = "acctestkv-%s"
547
+ location = azurerm_resource_group.test.location
548
+ resource_group_name = azurerm_resource_group.test.name
549
+ tenant_id = data.azurerm_client_config.current.tenant_id
550
+
551
+ sku_name = "premium"
552
+
553
+ access_policy {
554
+ tenant_id = data.azurerm_client_config.current.tenant_id
555
+ object_id = data.azurerm_client_config.current.object_id
556
+
557
+ key_permissions = [
558
+ "create",
559
+ "delete",
560
+ "get",
561
+ "update",
562
+ ]
563
+
564
+ secret_permissions = [
565
+ "get",
566
+ "delete",
567
+ "set",
568
+ ]
569
+ }
570
+
571
+ tags = {
572
+ environment = "Production"
573
+ }
574
+ }
575
+
576
+ resource "azurerm_key_vault_key" "test" {
577
+ name = "key-%s"
578
+ key_vault_id = azurerm_key_vault.test.id
579
+ key_type = "EC"
580
+ key_size = 2048
581
+ expiration_date = "2029-02-02T12:59:00Z"
582
+
583
+ key_opts = [
584
+ "sign",
585
+ "verify",
586
+ ]
587
+
588
+ tags = {
589
+ Rick = "Morty"
590
+ }
591
+ }
592
+ ` , data .RandomInteger , data .Locations .Primary , data .RandomString , data .RandomString )
593
+ }
594
+
442
595
func testAccAzureRMKeyVaultKey_requiresImport (data acceptance.TestData ) string {
443
596
template := testAccAzureRMKeyVaultKey_basicEC (data )
444
597
return fmt .Sprintf (`
0 commit comments