/azurerm/internal/services/msi/tests/user_assigned_identity_resource_test.go

https://github.com/terraform-providers/terraform-provider-azurerm · Go · 147 lines · 124 code · 22 blank · 1 comment · 13 complexity · 791899d39936ff2dcd2f216d0e1a0ccc MD5 · raw file

  1. package tests
  2. import (
  3. "fmt"
  4. "testing"
  5. "net/http"
  6. "github.com/hashicorp/terraform-plugin-sdk/helper/resource"
  7. "github.com/hashicorp/terraform-plugin-sdk/terraform"
  8. "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate"
  9. "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance"
  10. "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
  11. )
  12. func TestAccAzureRMUserAssignedIdentity_basic(t *testing.T) {
  13. data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test")
  14. resource.ParallelTest(t, resource.TestCase{
  15. PreCheck: func() { acceptance.PreCheck(t) },
  16. Providers: acceptance.SupportedProviders,
  17. CheckDestroy: testCheckAzureRMUserAssignedIdentityDestroy,
  18. Steps: []resource.TestStep{
  19. {
  20. Config: testAccAzureRMUserAssignedIdentity_basic(data),
  21. Check: resource.ComposeTestCheckFunc(
  22. testCheckAzureRMUserAssignedIdentityExists(data.ResourceName),
  23. resource.TestMatchResourceAttr(data.ResourceName, "principal_id", validate.UUIDRegExp),
  24. resource.TestMatchResourceAttr(data.ResourceName, "client_id", validate.UUIDRegExp),
  25. ),
  26. },
  27. data.ImportStep(),
  28. },
  29. })
  30. }
  31. func TestAccAzureRMUserAssignedIdentity_requiresImport(t *testing.T) {
  32. data := acceptance.BuildTestData(t, "azurerm_user_assigned_identity", "test")
  33. resource.ParallelTest(t, resource.TestCase{
  34. PreCheck: func() { acceptance.PreCheck(t) },
  35. Providers: acceptance.SupportedProviders,
  36. CheckDestroy: testCheckAzureRMUserAssignedIdentityDestroy,
  37. Steps: []resource.TestStep{
  38. {
  39. Config: testAccAzureRMUserAssignedIdentity_basic(data),
  40. Check: resource.ComposeTestCheckFunc(
  41. testCheckAzureRMUserAssignedIdentityExists(data.ResourceName),
  42. resource.TestMatchResourceAttr(data.ResourceName, "principal_id", validate.UUIDRegExp),
  43. resource.TestMatchResourceAttr(data.ResourceName, "client_id", validate.UUIDRegExp),
  44. ),
  45. },
  46. {
  47. Config: testAccAzureRMUserAssignedIdentity_requiresImport(data),
  48. ExpectError: acceptance.RequiresImportError("azurerm_user_assigned_identity"),
  49. },
  50. },
  51. })
  52. }
  53. func testCheckAzureRMUserAssignedIdentityExists(resourceName string) resource.TestCheckFunc {
  54. return func(s *terraform.State) error {
  55. client := acceptance.AzureProvider.Meta().(*clients.Client).MSI.UserAssignedIdentitiesClient
  56. ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext
  57. // Ensure we have enough information in state to look up in API
  58. rs, ok := s.RootModule().Resources[resourceName]
  59. if !ok {
  60. return fmt.Errorf("Not found: %s", resourceName)
  61. }
  62. name := rs.Primary.Attributes["name"]
  63. resourceGroup, hasResourceGroup := rs.Primary.Attributes["resource_group_name"]
  64. if !hasResourceGroup {
  65. return fmt.Errorf("Bad: no resource group found in state for virtual machine: %s", name)
  66. }
  67. resp, err := client.Get(ctx, resourceGroup, name)
  68. if err != nil {
  69. return fmt.Errorf("Bad: Get on userAssignedIdentitiesClient: %+v", err)
  70. }
  71. if resp.StatusCode == http.StatusNotFound {
  72. return fmt.Errorf("Bad: User Assigned Identity %q (resource group: %q) does not exist", name, resourceGroup)
  73. }
  74. return nil
  75. }
  76. }
  77. func testCheckAzureRMUserAssignedIdentityDestroy(s *terraform.State) error {
  78. client := acceptance.AzureProvider.Meta().(*clients.Client).MSI.UserAssignedIdentitiesClient
  79. ctx := acceptance.AzureProvider.Meta().(*clients.Client).StopContext
  80. for _, rs := range s.RootModule().Resources {
  81. if rs.Type != "azurerm_virtual_machine" {
  82. continue
  83. }
  84. name := rs.Primary.Attributes["name"]
  85. resourceGroup := rs.Primary.Attributes["resource_group_name"]
  86. resp, err := client.Get(ctx, resourceGroup, name)
  87. if err != nil {
  88. if resp.StatusCode == http.StatusNotFound {
  89. return nil
  90. }
  91. return err
  92. }
  93. return fmt.Errorf("User Assigned Identity still exists:\n%#v", resp)
  94. }
  95. return nil
  96. }
  97. func testAccAzureRMUserAssignedIdentity_basic(data acceptance.TestData) string {
  98. return fmt.Sprintf(`
  99. provider "azurerm" {
  100. features {}
  101. }
  102. resource "azurerm_resource_group" "test" {
  103. name = "acctestRG-%d"
  104. location = "%s"
  105. }
  106. resource "azurerm_user_assigned_identity" "test" {
  107. name = "acctest%s"
  108. resource_group_name = azurerm_resource_group.test.name
  109. location = azurerm_resource_group.test.location
  110. }
  111. `, data.RandomInteger, data.Locations.Primary, data.RandomString)
  112. }
  113. func testAccAzureRMUserAssignedIdentity_requiresImport(data acceptance.TestData) string {
  114. return fmt.Sprintf(`
  115. %s
  116. resource "azurerm_user_assigned_identity" "import" {
  117. name = azurerm_user_assigned_identity.test.name
  118. resource_group_name = azurerm_user_assigned_identity.test.resource_group_name
  119. location = azurerm_user_assigned_identity.test.location
  120. }
  121. `, testAccAzureRMUserAssignedIdentity_basic(data))
  122. }