From 7d9975c51d895cbea9a323a91ff1ba64fdb58da6 Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Fri, 29 May 2020 14:49:37 -0700 Subject: [PATCH 1/6] add scale set data source with identity --- .../internal/services/compute/registration.go | 1 + ...virtual_machine_scale_set_resource_test.go | 2 +- ...tual_machine_scale_set_data_source_test.go | 72 +++++++++++++++ ...virtual_machine_scale_set_resource_test.go | 2 +- .../virtual_machine_scale_set_data_source.go | 87 +++++++++++++++++++ .../d/virtual_machine_scale_set.html.markdown | 56 ++++++++++++ 6 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go create mode 100644 azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go create mode 100644 website/docs/d/virtual_machine_scale_set.html.markdown diff --git a/azurerm/internal/services/compute/registration.go b/azurerm/internal/services/compute/registration.go index b29001431de4..31c32398ac68 100644 --- a/azurerm/internal/services/compute/registration.go +++ b/azurerm/internal/services/compute/registration.go @@ -35,6 +35,7 @@ func (r Registration) SupportedDataSources() map[string]*schema.Resource { "azurerm_shared_image": dataSourceArmSharedImage(), "azurerm_snapshot": dataSourceArmSnapshot(), "azurerm_virtual_machine": dataSourceArmVirtualMachine(), + "azurerm_virtual_machine_scale_set": dataSourceArmVirtualMachineScaleSet(), } } diff --git a/azurerm/internal/services/compute/tests/linux_virtual_machine_scale_set_resource_test.go b/azurerm/internal/services/compute/tests/linux_virtual_machine_scale_set_resource_test.go index 762e6bb690e2..13504c6185a2 100644 --- a/azurerm/internal/services/compute/tests/linux_virtual_machine_scale_set_resource_test.go +++ b/azurerm/internal/services/compute/tests/linux_virtual_machine_scale_set_resource_test.go @@ -91,7 +91,7 @@ resource "azurerm_subnet" "test" { name = "internal" resource_group_name = azurerm_resource_group.test.name virtual_network_name = azurerm_virtual_network.test.name - address_prefix = "10.0.2.0/24" + address_prefixes = ["10.0.2.0/24"] } `, data.RandomInteger, data.Locations.Primary, data.RandomInteger) } diff --git a/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go b/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go new file mode 100644 index 000000000000..073e1e96993e --- /dev/null +++ b/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go @@ -0,0 +1,72 @@ +package tests + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" +) + +func TestAccDataSourceAzureRMVirtualMachineScaleSet_basicLinux(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine_scale_set", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceAzureRMVirtualMachineScaleSet_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"), + ), + }, + }, + }) +} + +func TestAccDataSourceAzureRMVirtualMachineScaleSet_basicWindows(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine_scale_set", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMVirtualMachineDestroy, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceAzureRMVirtualMachineScaleSet_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"), + ), + }, + }, + }) +} + +func testAccDataSourceAzureRMVirtualMachineScaleSet_basicLinux(data acceptance.TestData) string { + template := testAccAzureRMLinuxVirtualMachineScaleSet_identitySystemAssigned(data) + return fmt.Sprintf(` +%s + +data "azurerm_virtual_machine_scale_set" "test" { + name = azurerm_linux_virtual_machine_scale_set.test.name + resource_group_name = azurerm_resource_group.test.name +} +`, template) +} + +func testAccDataSourceAzureRMVirtualMachineScaleSet_basicWindows(data acceptance.TestData) string { + template := testAccAzureRMWindowsVirtualMachineScaleSet_identitySystemAssigned(data) + return fmt.Sprintf(` +%s + +data "azurerm_virtual_machine_scale_set" "test" { + name = azurerm_windows_virtual_machine_scale_set.test.name + resource_group_name = azurerm_resource_group.test.name +} +`, template) +} diff --git a/azurerm/internal/services/compute/tests/windows_virtual_machine_scale_set_resource_test.go b/azurerm/internal/services/compute/tests/windows_virtual_machine_scale_set_resource_test.go index c6b7daea5f32..6ed900743375 100644 --- a/azurerm/internal/services/compute/tests/windows_virtual_machine_scale_set_resource_test.go +++ b/azurerm/internal/services/compute/tests/windows_virtual_machine_scale_set_resource_test.go @@ -95,7 +95,7 @@ resource "azurerm_subnet" "test" { name = "internal" resource_group_name = azurerm_resource_group.test.name virtual_network_name = azurerm_virtual_network.test.name - address_prefix = "10.0.2.0/24" + address_prefixes = ["10.0.2.0/24"] } `, name, data.RandomInteger, data.Locations.Primary, data.RandomInteger) } diff --git a/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go new file mode 100644 index 000000000000..d5233ea6f535 --- /dev/null +++ b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go @@ -0,0 +1,87 @@ +package compute + +import ( + "fmt" + "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" +) + +func dataSourceArmVirtualMachineScaleSet() *schema.Resource { + return &schema.Resource{ + Read: dataSourceArmVirtualMachineScaleSetRead, + + Timeouts: &schema.ResourceTimeout{ + Read: schema.DefaultTimeout(5 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "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, + }, + }, + }, + }, + }, + } +} + +func dataSourceArmVirtualMachineScaleSetRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Compute.VMScaleSetClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + resGroup := d.Get("resource_group_name").(string) + name := d.Get("name").(string) + + resp, err := client.Get(ctx, resGroup, name) + if err != nil { + if utils.ResponseWasNotFound(resp.Response) { + return fmt.Errorf("Error: Virtual Machine Scale Set %q (Resource Group %q) was not found", name, resGroup) + } + + return fmt.Errorf("Error making Read request on Virtual Machine Scale Set %q (Resource Group %q): %+v", name, resGroup, err) + } + + d.SetId(*resp.ID) + + if err := d.Set("identity", FlattenVirtualMachineScaleSetIdentity(resp.Identity)); err != nil { + return fmt.Errorf("setting `identity`: %+v", err) + } + + return nil +} diff --git a/website/docs/d/virtual_machine_scale_set.html.markdown b/website/docs/d/virtual_machine_scale_set.html.markdown new file mode 100644 index 000000000000..2cd77b93537b --- /dev/null +++ b/website/docs/d/virtual_machine_scale_set.html.markdown @@ -0,0 +1,56 @@ +--- +subcategory: "Compute" +layout: "azurerm" +page_title: "Azure Resource Manager: Data Source: azurerm_virtual_machine_scale_set" +description: |- + Gets information about an existing Virtual Machine Scale Set. +--- + +# Data Source: azurerm_virtual_machine_scale_set + +Use this data source to access information about an existing Virtual Machine Scale Set. + +## Example Usage + +```hcl +data "azurerm_virtual_machine_scale_set" "example" { + name = "existing" + resource_group_name = "existing" +} + +output "id" { + value = data.azurerm_virtual_machine_scale_set.example.id +} +``` + +## Arguments Reference + +The following arguments are supported: + +* `name` - (Required) The name of this Virtual Machine Scale Set. + +* `resource_group_name` - (Required) The name of the Resource Group where the Virtual Machine Scale Set exists. + +## Attributes Reference + +In addition to the Arguments listed above - the following Attributes are exported: + +* `id` - The ID of the Virtual Machine Scale Set. + +* `identity` - A `identity` block as defined below. + +--- + +A `identity` block exports the following: + +* `identity_ids` - The list of User Managed Identity ID's which are assigned to the Virtual Machine Scale Set. + +* `principal_id` - The ID of the System Managed Service Principal assigned to the Virtual Machine Scale Set. + +* `type` - The identity types of the Managed Identity assigned to the Virtual Machine Scale Set. + +## Timeouts + +The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: + +* `read` - (Defaults to 5 minutes) Used when retrieving the Virtual Machine Scale Set. \ No newline at end of file From 3a8519d1027dce4dd716525de40862c26c769af5 Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Fri, 29 May 2020 15:39:10 -0700 Subject: [PATCH 2/6] add to website.erb --- website/azurerm.erb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/website/azurerm.erb b/website/azurerm.erb index 972c812fe1e3..33da1373173a 100644 --- a/website/azurerm.erb +++ b/website/azurerm.erb @@ -601,6 +601,10 @@ azurerm_virtual_machine +
  • + azurerm_virtual_machine_scale_set +
  • +
  • azurerm_virtual_network
  • From 99aacf1b9d2196caca101cd1a158e1cb261c53f9 Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Fri, 29 May 2020 16:07:57 -0700 Subject: [PATCH 3/6] terrafmt markdown --- website/docs/d/virtual_machine_scale_set.html.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/d/virtual_machine_scale_set.html.markdown b/website/docs/d/virtual_machine_scale_set.html.markdown index 2cd77b93537b..fadf49fd1ea9 100644 --- a/website/docs/d/virtual_machine_scale_set.html.markdown +++ b/website/docs/d/virtual_machine_scale_set.html.markdown @@ -14,7 +14,7 @@ Use this data source to access information about an existing Virtual Machine Sca ```hcl data "azurerm_virtual_machine_scale_set" "example" { - name = "existing" + name = "existing" resource_group_name = "existing" } @@ -53,4 +53,4 @@ A `identity` block exports the following: The `timeouts` block allows you to specify [timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) for certain actions: -* `read` - (Defaults to 5 minutes) Used when retrieving the Virtual Machine Scale Set. \ No newline at end of file +* `read` - (Defaults to 5 minutes) Used when retrieving the Virtual Machine Scale Set. From f2d931f55ea750737f6de3e350074ac14e46fa3d Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Tue, 2 Jun 2020 12:18:18 -0700 Subject: [PATCH 4/6] typo in readme, check if id is null before setting --- .../services/compute/virtual_machine_scale_set_data_source.go | 3 +++ website/docs/d/virtual_machine_scale_set.html.markdown | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go index d5233ea6f535..6146d2f38d93 100644 --- a/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go +++ b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go @@ -77,6 +77,9 @@ func dataSourceArmVirtualMachineScaleSetRead(d *schema.ResourceData, meta interf return fmt.Errorf("Error making Read request on Virtual Machine Scale Set %q (Resource Group %q): %+v", name, resGroup, err) } + if resp.ID == nil || *resp.ID == "" { + return fmt.Errorf("Error reading Virtual Machine Scale Set %q (Resource Group %q): ID is empty or nil", name, resourceGroup) + } d.SetId(*resp.ID) if err := d.Set("identity", FlattenVirtualMachineScaleSetIdentity(resp.Identity)); err != nil { diff --git a/website/docs/d/virtual_machine_scale_set.html.markdown b/website/docs/d/virtual_machine_scale_set.html.markdown index fadf49fd1ea9..b956c8517110 100644 --- a/website/docs/d/virtual_machine_scale_set.html.markdown +++ b/website/docs/d/virtual_machine_scale_set.html.markdown @@ -47,7 +47,7 @@ A `identity` block exports the following: * `principal_id` - The ID of the System Managed Service Principal assigned to the Virtual Machine Scale Set. -* `type` - The identity types of the Managed Identity assigned to the Virtual Machine Scale Set. +* `type` - The identity type of the Managed Identity assigned to the Virtual Machine Scale Set. ## Timeouts From 2c2b9b8fdf52940db4c2a97a91fb3ceddb5dba12 Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Tue, 2 Jun 2020 12:30:21 -0700 Subject: [PATCH 5/6] fix var name --- .../services/compute/virtual_machine_scale_set_data_source.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go index 6146d2f38d93..6daf74ab34c8 100644 --- a/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go +++ b/azurerm/internal/services/compute/virtual_machine_scale_set_data_source.go @@ -78,7 +78,7 @@ func dataSourceArmVirtualMachineScaleSetRead(d *schema.ResourceData, meta interf } if resp.ID == nil || *resp.ID == "" { - return fmt.Errorf("Error reading Virtual Machine Scale Set %q (Resource Group %q): ID is empty or nil", name, resourceGroup) + return fmt.Errorf("Error reading Virtual Machine Scale Set %q (Resource Group %q): ID is empty or nil", name, resGroup) } d.SetId(*resp.ID) From 0950eae46e4917d797f8f4db354bdd56069814ef Mon Sep 17 00:00:00 2001 From: "github@automatetheneedful.com" Date: Wed, 3 Jun 2020 07:09:28 -0700 Subject: [PATCH 6/6] adding orchestrated vmss test --- ...tual_machine_scale_set_data_source_test.go | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go b/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go index 073e1e96993e..7710d507107d 100644 --- a/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go +++ b/azurerm/internal/services/compute/tests/virtual_machine_scale_set_data_source_test.go @@ -47,6 +47,24 @@ func TestAccDataSourceAzureRMVirtualMachineScaleSet_basicWindows(t *testing.T) { }) } +func TestAccDataSourceAzureRMVirtualMachineScaleSet_orchestrated(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_virtual_machine_scale_set", "test") + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMVirtualMachineDestroy, + Steps: []resource.TestStep{ + { + Config: testAccDataSourceAzureRMVirtualMachineScaleSet_orchestrated(data), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet(data.ResourceName, "id"), + ), + }, + }, + }) +} + func testAccDataSourceAzureRMVirtualMachineScaleSet_basicLinux(data acceptance.TestData) string { template := testAccAzureRMLinuxVirtualMachineScaleSet_identitySystemAssigned(data) return fmt.Sprintf(` @@ -70,3 +88,15 @@ data "azurerm_virtual_machine_scale_set" "test" { } `, template) } + +func testAccDataSourceAzureRMVirtualMachineScaleSet_orchestrated(data acceptance.TestData) string { + template := testAccAzureRMWindowsVirtualMachine_orchestratedZonal(data) + return fmt.Sprintf(` +%s + +data "azurerm_virtual_machine_scale_set" "test" { + name = azurerm_orchestrated_virtual_machine_scale_set.test.name + resource_group_name = azurerm_resource_group.test.name +} +`, template) +}