From 365c26821930902f2bdf32ffd96e568c77a8043d Mon Sep 17 00:00:00 2001 From: Dapeng Zhang Date: Wed, 29 Apr 2020 18:38:53 +0800 Subject: [PATCH 1/3] Fix #6675 --- .../compute/data_source_virtual_machine.go | 43 ++++++- .../tests/data_source_virtual_machine_test.go | 120 ++++++------------ .../services/compute/virtual_machine.go | 11 ++ website/docs/d/virtual_machine.html.markdown | 19 +++ .../r/linux_virtual_machine.html.markdown | 6 + .../r/windows_virtual_machine.html.markdown | 6 + 6 files changed, 121 insertions(+), 84 deletions(-) diff --git a/azurerm/internal/services/compute/data_source_virtual_machine.go b/azurerm/internal/services/compute/data_source_virtual_machine.go index 0cfb385fd617..d56b17d5024b 100644 --- a/azurerm/internal/services/compute/data_source_virtual_machine.go +++ b/azurerm/internal/services/compute/data_source_virtual_machine.go @@ -2,11 +2,11 @@ package compute import ( "fmt" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "time" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" @@ -21,13 +21,46 @@ func dataSourceArmVirtualMachine() *schema.Resource { }, Schema: map[string]*schema.Schema{ - "resource_group_name": azure.SchemaResourceGroupNameForDataSource(), - "name": { Type: schema.TypeString, Required: true, ValidateFunc: validation.NoZeroValues, }, + + "resource_group_name": azure.SchemaResourceGroupNameForDataSource(), + + "location": azure.SchemaLocationForDataSource(), + + "identity": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "type": { + Type: schema.TypeString, + Computed: true, + }, + + "identity_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + + "principal_id": { + Type: schema.TypeString, + Computed: true, + }, + + "tenant_id": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, }, } } @@ -51,5 +84,9 @@ func dataSourceArmVirtualMachineRead(d *schema.ResourceData, meta interface{}) e d.SetId(*resp.ID) + if err := d.Set("identity", flattenVirtualMachineIdentity(resp.Identity)); err != nil { + return fmt.Errorf("setting `identity`: %+v", err) + } + return nil } diff --git a/azurerm/internal/services/compute/tests/data_source_virtual_machine_test.go b/azurerm/internal/services/compute/tests/data_source_virtual_machine_test.go index 391f04c0ba21..32cfdb4e9f4d 100644 --- a/azurerm/internal/services/compute/tests/data_source_virtual_machine_test.go +++ b/azurerm/internal/services/compute/tests/data_source_virtual_machine_test.go @@ -8,109 +8,67 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" ) -func TestAccDataSourceVirtualMachine_basic(t *testing.T) { +func TestAccDataSourceVirtualMachine_basicLinux(t *testing.T) { data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine", "test") - name := fmt.Sprintf("acctvm-%d", data.RandomInteger) - resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { acceptance.PreCheck(t) }, Providers: acceptance.SupportedProviders, Steps: []resource.TestStep{ { - Config: testAccDataSourceVirtualMachine_basic(data), - Check: resource.TestCheckResourceAttr(data.ResourceName, "name", name), + Config: testAccDataSourceAzureRMVirtualMachine_basicLinux(data), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(data.ResourceName, "identity.#", "1"), + resource.TestCheckResourceAttr(data.ResourceName, "identity.0.type", "SystemAssigned"), + resource.TestCheckResourceAttrSet(data.ResourceName, "identity.0.principal_id"), + resource.TestCheckResourceAttrSet(data.ResourceName, "identity.0.tenant_id"), + ), }, }, }) } -func testAccDataSourceVirtualMachine_basic(data acceptance.TestData) string { - return fmt.Sprintf(` -provider "azurerm" { - features {} -} - -resource "azurerm_resource_group" "test" { - name = "acctestRG-%[1]d" - location = "%[2]s" -} +func TestAccDataSourceAzureRMVirtualMachine_basicWindows(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine", "test") -resource "azurerm_virtual_network" "test" { - name = "acctvn-%[1]d" - address_space = ["10.0.0.0/16"] - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMVirtualMachineDestroy, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceAzureRMVirtualMachine_basicWindows(data), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(data.ResourceName, "identity.#", "1"), + resource.TestCheckResourceAttr(data.ResourceName, "identity.0.type", "SystemAssigned"), + resource.TestCheckResourceAttrSet(data.ResourceName, "identity.0.principal_id"), + resource.TestCheckResourceAttrSet(data.ResourceName, "identity.0.tenant_id"), + ), + }, + }, + }) } -resource "azurerm_subnet" "test" { - name = "acctsub-%[1]d" - resource_group_name = azurerm_resource_group.test.name - virtual_network_name = azurerm_virtual_network.test.name - address_prefix = "10.0.2.0/24" -} +func testAccDataSourceAzureRMVirtualMachine_basicLinux(data acceptance.TestData) string { + template := testLinuxVirtualMachine_identitySystemAssigned(data) + return fmt.Sprintf(` +%s -resource "azurerm_network_interface" "test" { - name = "acctni-%[1]d" - location = azurerm_resource_group.test.location +data "azurerm_virtual_machine" "test" { + name = azurerm_linux_virtual_machine.test.name resource_group_name = azurerm_resource_group.test.name - - ip_configuration { - name = "testconfiguration1" - subnet_id = azurerm_subnet.test.id - private_ip_address_allocation = "dynamic" - } } - -resource "azurerm_storage_account" "test" { - name = "accsa%[1]d" - resource_group_name = azurerm_resource_group.test.name - location = azurerm_resource_group.test.location - account_tier = "Standard" - account_replication_type = "LRS" -} - -resource "azurerm_storage_container" "test" { - name = "vhds" - storage_account_name = azurerm_storage_account.test.name - container_access_type = "private" +`, template) } -resource "azurerm_virtual_machine" "test" { - name = "acctvm-%[1]d" - location = azurerm_resource_group.test.location - resource_group_name = azurerm_resource_group.test.name - network_interface_ids = [azurerm_network_interface.test.id] - vm_size = "Standard_D1_v2" - - storage_image_reference { - publisher = "Canonical" - offer = "UbuntuServer" - sku = "16.04-LTS" - version = "latest" - } - - storage_os_disk { - name = "myosdisk1" - vhd_uri = "${azurerm_storage_account.test.primary_blob_endpoint}${azurerm_storage_container.test.name}/myosdisk1.vhd" - caching = "ReadWrite" - create_option = "FromImage" - } - - os_profile { - computer_name = "linuxhost01" - admin_username = "testadmin" - admin_password = "Password1234!" - } - - os_profile_linux_config { - disable_password_authentication = false - } -} +func testAccDataSourceAzureRMVirtualMachine_basicWindows(data acceptance.TestData) string { + template := testWindowsVirtualMachine_identitySystemAssigned(data) + return fmt.Sprintf(` +%s data "azurerm_virtual_machine" "test" { + name = azurerm_linux_virtual_machine.test.name resource_group_name = azurerm_resource_group.test.name - name = azurerm_virtual_machine.test.name } -`, data.RandomInteger, data.Locations.Primary) +`, template) } diff --git a/azurerm/internal/services/compute/virtual_machine.go b/azurerm/internal/services/compute/virtual_machine.go index 5e545d1c4a61..5f323b400c60 100644 --- a/azurerm/internal/services/compute/virtual_machine.go +++ b/azurerm/internal/services/compute/virtual_machine.go @@ -96,6 +96,11 @@ func virtualMachineIdentitySchema() *schema.Schema { Type: schema.TypeString, Computed: true, }, + + "tenant_id": { + Type: schema.TypeString, + Computed: true, + }, }, }, } @@ -149,11 +154,17 @@ func flattenVirtualMachineIdentity(input *compute.VirtualMachineIdentity) []inte principalId = *input.PrincipalID } + tenantId := "" + if input.TenantID != nil { + tenantId = *input.TenantID + } + return []interface{}{ map[string]interface{}{ "type": string(input.Type), "identity_ids": identityIds, "principal_id": principalId, + "tenant_id": tenantId, }, } } diff --git a/website/docs/d/virtual_machine.html.markdown b/website/docs/d/virtual_machine.html.markdown index b8d3b60660df..ed009706d410 100644 --- a/website/docs/d/virtual_machine.html.markdown +++ b/website/docs/d/virtual_machine.html.markdown @@ -13,6 +13,10 @@ Use this data source to access information about an existing Virtual Machine. ## Example Usage ```hcl +provider "azurerm" { + features {} +} + data "azurerm_virtual_machine" "example" { name = "production" resource_group_name = "networking" @@ -26,12 +30,27 @@ output "virtual_machine_id" { ## Argument Reference * `name` - Specifies the name of the Virtual Machine. + * `resource_group_name` - Specifies the name of the resource group the Virtual Machine is located in. ## Attributes Reference * `id` - The ID of the Virtual Machine. +* `identity` - A `identity` block as defined below. + +--- + +An `identity` block exports the following: + +* `identity_ids` - The list of User Managed Identity ID's which are assigned to the Virtual Machine. + +* `principal_id` - The ID of the System Managed Service Principal assigned to the Virtual Machine. + +* `tenant_id` - The ID of the Tenant of the System Managed Service Principal assigned to the Virtual Machine. + +* `type` - The identity type of the Managed Identity assigned to the Virtual Machine. + ## Timeouts The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: diff --git a/website/docs/r/linux_virtual_machine.html.markdown b/website/docs/r/linux_virtual_machine.html.markdown index 7e3b0b310126..2a0621d4f911 100644 --- a/website/docs/r/linux_virtual_machine.html.markdown +++ b/website/docs/r/linux_virtual_machine.html.markdown @@ -27,6 +27,10 @@ Manages a Linux Virtual Machine. This example provisions a basic Linux Virtual Machine on an internal network. Additional examples of how to use the `azurerm_linux_virtual_machine` resource can be found [in the ./examples/virtual-machine/linux` directory within the Github Repository](https://github.com/terraform-providers/terraform-provider-azurerm/tree/master/examples/virtual-machines/linux). ```hcl +provider "azurerm" { + features {} +} + resource "azurerm_resource_group" "example" { name = "example-resources" location = "West Europe" @@ -282,6 +286,8 @@ An `identity` block exports the following: * `principal_id` - The ID of the System Managed Service Principal. +* `tenant_id` - The ID of the Tenant the System Managed Service Principal is assigned in. + ## Timeouts The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: diff --git a/website/docs/r/windows_virtual_machine.html.markdown b/website/docs/r/windows_virtual_machine.html.markdown index 54907eeb9499..45d26b42e320 100644 --- a/website/docs/r/windows_virtual_machine.html.markdown +++ b/website/docs/r/windows_virtual_machine.html.markdown @@ -27,6 +27,10 @@ Manages a Windows Virtual Machine. This example provisions a basic Windows Virtual Machine on an internal network. Additional examples of how to use the `azurerm_windows_virtual_machine` resource can be found [in the ./examples/virtual-machine/windows` directory within the Github Repository](https://github.com/terraform-providers/terraform-provider-azurerm/tree/master/examples/virtual-machine/windows). ```hcl +provider "azurerm" { + features {} +} + resource "azurerm_resource_group" "example" { name = "example-resources" location = "West Europe" @@ -283,6 +287,8 @@ An `identity` block exports the following: * `principal_id` - The ID of the System Managed Service Principal. +* `tenant_id` - The ID of the Tenant the System Managed Service Principal is assigned in. + ## Timeouts The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: From 38c0d1bb6b2cf1f71674927d67cf5dda2df2ed4f Mon Sep 17 00:00:00 2001 From: Dapeng Zhang Date: Wed, 29 Apr 2020 18:40:52 +0800 Subject: [PATCH 2/3] goimports --- .../internal/services/compute/data_source_virtual_machine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/compute/data_source_virtual_machine.go b/azurerm/internal/services/compute/data_source_virtual_machine.go index d56b17d5024b..a1e33f1af70f 100644 --- a/azurerm/internal/services/compute/data_source_virtual_machine.go +++ b/azurerm/internal/services/compute/data_source_virtual_machine.go @@ -2,11 +2,11 @@ package compute import ( "fmt" - "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "time" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" From 19f05dc59015d7382ff2ac2ee2b967ad76def19c Mon Sep 17 00:00:00 2001 From: Dapeng Zhang Date: Sat, 9 May 2020 12:11:22 +0800 Subject: [PATCH 3/3] Resolve comments --- .../compute/tests/virtual_machine_data_source_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azurerm/internal/services/compute/tests/virtual_machine_data_source_test.go b/azurerm/internal/services/compute/tests/virtual_machine_data_source_test.go index 32cfdb4e9f4d..cf71e37f166f 100644 --- a/azurerm/internal/services/compute/tests/virtual_machine_data_source_test.go +++ b/azurerm/internal/services/compute/tests/virtual_machine_data_source_test.go @@ -8,7 +8,7 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" ) -func TestAccDataSourceVirtualMachine_basicLinux(t *testing.T) { +func TestAccDataSourceAzureRMVirtualMachine_basicLinux(t *testing.T) { data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine", "test") resource.ParallelTest(t, resource.TestCase{ @@ -67,7 +67,7 @@ func testAccDataSourceAzureRMVirtualMachine_basicWindows(data acceptance.TestDat %s data "azurerm_virtual_machine" "test" { - name = azurerm_linux_virtual_machine.test.name + name = azurerm_windows_virtual_machine.test.name resource_group_name = azurerm_resource_group.test.name } `, template)