From 3fa1d97d7e34d34e429f6c51ae7efa31ec185009 Mon Sep 17 00:00:00 2001 From: Matthew Frahry Date: Tue, 28 Apr 2020 23:08:42 -0700 Subject: [PATCH 1/4] Start of image versions --- .../data_source_shared_image_versions.go | 136 ++++++++++++++++++ .../internal/services/compute/registration.go | 1 + .../data_source_shared_image_versions_test.go | 56 ++++++++ 3 files changed, 193 insertions(+) create mode 100644 azurerm/internal/services/compute/data_source_shared_image_versions.go create mode 100644 azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go diff --git a/azurerm/internal/services/compute/data_source_shared_image_versions.go b/azurerm/internal/services/compute/data_source_shared_image_versions.go new file mode 100644 index 000000000000..ae2f813b9eca --- /dev/null +++ b/azurerm/internal/services/compute/data_source_shared_image_versions.go @@ -0,0 +1,136 @@ +package compute + +import ( + "fmt" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" + "log" + "time" +) + +func dataSourceArmSharedImageVersions() *schema.Resource { + return &schema.Resource{ + Read: dataSourceArmSharedImageVersionsRead, + + Timeouts: &schema.ResourceTimeout{ + Read: schema.DefaultTimeout(5 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + "gallery_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validate.SharedImageGalleryName, + }, + + "image_name": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validate.SharedImageName, + }, + + "resource_group_name": azure.SchemaResourceGroupNameForDataSource(), + + "location": azure.SchemaLocationForDataSource(), + + "images": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "managed_image_id": { + Type: schema.TypeString, + Computed: true, + }, + + "target_region": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Computed: true, + }, + + "regional_replica_count": { + Type: schema.TypeInt, + Computed: true, + }, + + "storage_account_type": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + + "exclude_from_latest": { + Type: schema.TypeBool, + Computed: true, + }, + + "tags": tags.SchemaDataSource(), + }, + }, + }, + }, + } +} + +func dataSourceArmSharedImageVersionsRead(d *schema.ResourceData, meta interface{}) error { + client := meta.(*clients.Client).Compute.GalleryImageVersionsClient + ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d) + defer cancel() + + imageName := d.Get("image_name").(string) + galleryName := d.Get("gallery_name").(string) + resourceGroup := d.Get("resource_group_name").(string) + + resp, err := client.ListByGalleryImage(ctx, resourceGroup, galleryName, imageName) + if err != nil { + if utils.ResponseWasNotFound(resp.Response().Response) { + log.Printf("[DEBUG] Shared Image Versions (Image %q / Gallery %q / Resource Group %q) was not found - removing from state", imageName, galleryName, resourceGroup) + d.SetId("") + return nil + } + return fmt.Errorf("retrieving Shared Image Versions (Image %q / Gallery %q / Resource Group %q): %+v", imageName, galleryName, resourceGroup, err) + } + return fmt.Errorf("%+v", resp.Response()) + + d.SetId(time.Now().UTC().String()) + + d.Set("image_name", imageName) + d.Set("gallery_name", galleryName) + d.Set("resource_group_name", resourceGroup) + + if location := resp.Response().Location; location != nil { + d.Set("location", azure.NormalizeLocation(location)) + } + /* + if props := resp.GalleryImageVersionProperties; props != nil { + if profile := props.PublishingProfile; profile != nil { + d.Set("exclude_from_latest", profile.ExcludeFromLatest) + + flattenedRegions := flattenSharedImageVersionDataSourceTargetRegions(profile.TargetRegions) + if err := d.Set("target_region", flattenedRegions); err != nil { + return fmt.Errorf("Error setting `target_region`: %+v", err) + } + } + + if profile := props.StorageProfile; profile != nil { + if source := profile.Source; source != nil { + d.Set("managed_image_id", source.ID) + } + } + } + + return tags.FlattenAndSet(d, resp.Tags)*/ + return nil +} diff --git a/azurerm/internal/services/compute/registration.go b/azurerm/internal/services/compute/registration.go index 01e7eb742a91..74cf68caa570 100644 --- a/azurerm/internal/services/compute/registration.go +++ b/azurerm/internal/services/compute/registration.go @@ -31,6 +31,7 @@ func (r Registration) SupportedDataSources() map[string]*schema.Resource { "azurerm_proximity_placement_group": dataSourceArmProximityPlacementGroup(), "azurerm_shared_image_gallery": dataSourceArmSharedImageGallery(), "azurerm_shared_image_version": dataSourceArmSharedImageVersion(), + "azurerm_shared_image_versions": dataSourceArmSharedImageVersions(), "azurerm_shared_image": dataSourceArmSharedImage(), "azurerm_snapshot": dataSourceArmSnapshot(), "azurerm_virtual_machine": dataSourceArmVirtualMachine(), diff --git a/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go new file mode 100644 index 000000000000..ccc348611b58 --- /dev/null +++ b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go @@ -0,0 +1,56 @@ +package tests + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/acceptance" +) + +func TestAccDataSourceAzureRMSharedImageVersions_basic(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_shared_image_versions", "test") + username := "testadmin" + password := "Password1234!" + hostname := fmt.Sprintf("tftestcustomimagesrc%d", data.RandomInteger) + resourceGroup := fmt.Sprintf("acctestRG-%d", data.RandomInteger) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMSharedImageVersionDestroy, + Steps: []resource.TestStep{ + { + // need to create a vm and then reference it in the image creation + Config: testAccAzureRMSharedImageVersion_setup(data, username, password, hostname), + Destroy: false, + Check: resource.ComposeTestCheckFunc( + testCheckAzureVMExists("azurerm_virtual_machine.testsource", true), + testGeneralizeVMImage(resourceGroup, "testsource", username, password, hostname, "22", data.Locations.Primary), + ), + }, + { + Config: testAccDataSourceSharedImageVersions_basic(data, username, password, hostname), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(data.ResourceName, "tags.%", "0"), + resource.TestCheckResourceAttrSet(data.ResourceName, "managed_image_id"), + resource.TestCheckResourceAttr(data.ResourceName, "target_region.#", "1"), + resource.TestCheckResourceAttr(data.ResourceName, "target_region.0.storage_account_type", "Standard_LRS"), + ), + }, + }, + }) +} + +func testAccDataSourceSharedImageVersions_basic(data acceptance.TestData, username, password, hostname string) string { + template := testAccAzureRMSharedImageVersion_imageVersion(data, username, password, hostname) + return fmt.Sprintf(` +%s + +data "azurerm_shared_image_versions" "test" { + gallery_name = azurerm_shared_image_version.test.gallery_name + image_name = azurerm_shared_image_version.test.image_name + resource_group_name = azurerm_shared_image_version.test.resource_group_name +} +`, template) +} From 5e711b7a0febf4b8bf03749dca1007273bac4cd6 Mon Sep 17 00:00:00 2001 From: Matthew Frahry Date: Wed, 29 Apr 2020 15:02:22 -0700 Subject: [PATCH 2/4] Add shared image versions --- .../data_source_shared_image_versions.go | 71 +++++++++++++------ .../data_source_shared_image_versions_test.go | 8 +-- website/azurerm.erb | 4 ++ .../d/shared_image_versions.html.markdown | 68 ++++++++++++++++++ 4 files changed, 124 insertions(+), 27 deletions(-) create mode 100644 website/docs/d/shared_image_versions.html.markdown diff --git a/azurerm/internal/services/compute/data_source_shared_image_versions.go b/azurerm/internal/services/compute/data_source_shared_image_versions.go index ae2f813b9eca..63e6a340a20f 100644 --- a/azurerm/internal/services/compute/data_source_shared_image_versions.go +++ b/azurerm/internal/services/compute/data_source_shared_image_versions.go @@ -2,6 +2,10 @@ package compute import ( "fmt" + "log" + "time" + + "github.com/Azure/azure-sdk-for-go/services/compute/mgmt/2019-07-01/compute" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/validate" @@ -9,8 +13,6 @@ import ( "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts" "github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils" - "log" - "time" ) func dataSourceArmSharedImageVersions() *schema.Resource { @@ -36,13 +38,18 @@ func dataSourceArmSharedImageVersions() *schema.Resource { "resource_group_name": azure.SchemaResourceGroupNameForDataSource(), - "location": azure.SchemaLocationForDataSource(), - "images": { Type: schema.TypeList, Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Computed: true, + }, + + "location": azure.SchemaLocationForDataSource(), + "managed_image_id": { Type: schema.TypeString, Computed: true, @@ -102,7 +109,6 @@ func dataSourceArmSharedImageVersionsRead(d *schema.ResourceData, meta interface } return fmt.Errorf("retrieving Shared Image Versions (Image %q / Gallery %q / Resource Group %q): %+v", imageName, galleryName, resourceGroup, err) } - return fmt.Errorf("%+v", resp.Response()) d.SetId(time.Now().UTC().String()) @@ -110,27 +116,46 @@ func dataSourceArmSharedImageVersionsRead(d *schema.ResourceData, meta interface d.Set("gallery_name", galleryName) d.Set("resource_group_name", resourceGroup) - if location := resp.Response().Location; location != nil { - d.Set("location", azure.NormalizeLocation(location)) + if err := d.Set("images", flattenSharedImageVersions(resp.Values())); err != nil { + return fmt.Errorf("setting `images`: %+v", err) } - /* - if props := resp.GalleryImageVersionProperties; props != nil { - if profile := props.PublishingProfile; profile != nil { - d.Set("exclude_from_latest", profile.ExcludeFromLatest) - - flattenedRegions := flattenSharedImageVersionDataSourceTargetRegions(profile.TargetRegions) - if err := d.Set("target_region", flattenedRegions); err != nil { - return fmt.Errorf("Error setting `target_region`: %+v", err) - } - } - if profile := props.StorageProfile; profile != nil { - if source := profile.Source; source != nil { - d.Set("managed_image_id", source.ID) - } + return nil +} + +func flattenSharedImageVersions(input []compute.GalleryImageVersion) []interface{} { + results := make([]interface{}, 0) + + for _, imageVersion := range input { + flattenedIPAddress := flattenSharedImageVersion(imageVersion) + results = append(results, flattenedIPAddress) + } + + return results +} + +func flattenSharedImageVersion(input compute.GalleryImageVersion) map[string]interface{} { + output := make(map[string]interface{}) + + output["name"] = input.Name + + if location := input.Location; location != nil { + output["location"] = azure.NormalizeLocation(*location) + } + + if props := input.GalleryImageVersionProperties; props != nil { + if profile := props.PublishingProfile; profile != nil { + output["exclude_from_latest"] = profile.ExcludeFromLatest + output["target_region"] = flattenSharedImageVersionDataSourceTargetRegions(profile.TargetRegions) + } + + if profile := props.StorageProfile; profile != nil { + if source := profile.Source; source != nil { + output["managed_image_id"] = source.ID } } + output["tags"] = tags.Flatten(input.Tags) + } - return tags.FlattenAndSet(d, resp.Tags)*/ - return nil + return output } diff --git a/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go index ccc348611b58..69d602a4457e 100644 --- a/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go +++ b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go @@ -32,10 +32,10 @@ func TestAccDataSourceAzureRMSharedImageVersions_basic(t *testing.T) { { Config: testAccDataSourceSharedImageVersions_basic(data, username, password, hostname), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(data.ResourceName, "tags.%", "0"), - resource.TestCheckResourceAttrSet(data.ResourceName, "managed_image_id"), - resource.TestCheckResourceAttr(data.ResourceName, "target_region.#", "1"), - resource.TestCheckResourceAttr(data.ResourceName, "target_region.0.storage_account_type", "Standard_LRS"), + resource.TestCheckResourceAttr(data.ResourceName, "images.0.tags.%", "0"), + resource.TestCheckResourceAttrSet(data.ResourceName, "images.0.managed_image_id"), + resource.TestCheckResourceAttr(data.ResourceName, "images.0.target_region.#", "1"), + resource.TestCheckResourceAttr(data.ResourceName, "images.0.target_region.0.storage_account_type", "Standard_LRS"), ), }, }, diff --git a/website/azurerm.erb b/website/azurerm.erb index c4102eaac357..e52518a43a26 100644 --- a/website/azurerm.erb +++ b/website/azurerm.erb @@ -510,6 +510,10 @@ azurerm_shared_image_version +
  • + azurerm_shared_image_versions +
  • +
  • azurerm_signalr_service
  • diff --git a/website/docs/d/shared_image_versions.html.markdown b/website/docs/d/shared_image_versions.html.markdown new file mode 100644 index 000000000000..dd00072b6abb --- /dev/null +++ b/website/docs/d/shared_image_versions.html.markdown @@ -0,0 +1,68 @@ +--- +subcategory: "Compute" +layout: "azurerm" +page_title: "Azure Resource Manager: azurerm_shared_image_versions" +description: |- + Gets information about existing Versions of a Shared Image within a Shared Image Gallery. + +--- + +# Data Source: azurerm_shared_image_versions + +Use this data source to access information about existing Versions of a Shared Image within a Shared Image Gallery. + +## Example Usage + +```hcl +data "azurerm_shared_image_versions" "example" { + image_name = "my-image" + gallery_name = "my-image-gallery" + resource_group_name = "example-resources" +} +``` + +## Argument Reference + +The following arguments are supported: + +* `image_name` - The name of the Shared Image in which this Version exists. + +* `gallery_name` - The name of the Shared Image in which the Shared Image exists. + +* `resource_group_name` - The name of the Resource Group in which the Shared Image Gallery exists. + +## Attributes Reference + +The following attributes are exported: + +* `images` - An `images` block as defined below: + +--- + +A `images` block exports the following: + +* `exclude_from_latest` - Is this Image Version excluded from the `latest` filter? + +* `location` - The supported Azure location where the Shared Image Gallery exists. + +* `managed_image_id` - The ID of the Managed Image which was the source of this Shared Image Version. + +* `target_region` - One or more `target_region` blocks as documented below. + +* `tags` - A mapping of tags assigned to the Shared Image. + +--- + +The `target_region` block exports the following: + +* `name` - The Azure Region in which this Image Version exists. + +* `regional_replica_count` - The number of replicas of the Image Version to be created per region. + +* `storage_account_type` - The storage account type for the image version. + +## 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 Versions of a Shared Image within a Shared Image Gallery. From 46d022c1a13df668624fa9f25b9ad2ff47f1545c Mon Sep 17 00:00:00 2001 From: Matthew Frahry Date: Wed, 29 Apr 2020 19:01:59 -0700 Subject: [PATCH 3/4] Add tags_filter --- .../data_source_shared_image_versions.go | 34 +++++-- .../data_source_shared_image_versions_test.go | 95 +++++++++++++++++++ .../resource_arm_shared_image_version_test.go | 4 + .../d/shared_image_versions.html.markdown | 2 + 4 files changed, 129 insertions(+), 6 deletions(-) diff --git a/azurerm/internal/services/compute/data_source_shared_image_versions.go b/azurerm/internal/services/compute/data_source_shared_image_versions.go index 63e6a340a20f..3f2b9e70c3d8 100644 --- a/azurerm/internal/services/compute/data_source_shared_image_versions.go +++ b/azurerm/internal/services/compute/data_source_shared_image_versions.go @@ -38,6 +38,8 @@ func dataSourceArmSharedImageVersions() *schema.Resource { "resource_group_name": azure.SchemaResourceGroupNameForDataSource(), + "tags_filter": tags.Schema(), + "images": { Type: schema.TypeList, Computed: true, @@ -99,6 +101,7 @@ func dataSourceArmSharedImageVersionsRead(d *schema.ResourceData, meta interface imageName := d.Get("image_name").(string) galleryName := d.Get("gallery_name").(string) resourceGroup := d.Get("resource_group_name").(string) + filterTags := tags.Expand(d.Get("tags_filter").(map[string]interface{})) resp, err := client.ListByGalleryImage(ctx, resourceGroup, galleryName, imageName) if err != nil { @@ -110,31 +113,49 @@ func dataSourceArmSharedImageVersionsRead(d *schema.ResourceData, meta interface return fmt.Errorf("retrieving Shared Image Versions (Image %q / Gallery %q / Resource Group %q): %+v", imageName, galleryName, resourceGroup, err) } + images := flattenSharedImageVersions(resp.Values(), filterTags) + if len(images) == 0 { + return fmt.Errorf("unable to find any images") + } + d.SetId(time.Now().UTC().String()) d.Set("image_name", imageName) d.Set("gallery_name", galleryName) d.Set("resource_group_name", resourceGroup) - if err := d.Set("images", flattenSharedImageVersions(resp.Values())); err != nil { + if err := d.Set("images", images); err != nil { return fmt.Errorf("setting `images`: %+v", err) } return nil } -func flattenSharedImageVersions(input []compute.GalleryImageVersion) []interface{} { +func flattenSharedImageVersions(input []compute.GalleryImageVersion, filterTags map[string]*string) []interface{} { results := make([]interface{}, 0) for _, imageVersion := range input { - flattenedIPAddress := flattenSharedImageVersion(imageVersion) - results = append(results, flattenedIPAddress) + flattenedIPAddress := flattenSharedImageVersion(imageVersion, filterTags) + found := true + // Loop through our filter tags and see if they match + for k, v := range filterTags { + if v != nil { + // If the tags don't match, return false + if imageVersion.Tags[k] == nil || *v != *imageVersion.Tags[k] { + found = false + } + } + } + + if found { + results = append(results, flattenedIPAddress) + } } return results } -func flattenSharedImageVersion(input compute.GalleryImageVersion) map[string]interface{} { +func flattenSharedImageVersion(input compute.GalleryImageVersion, filterTags map[string]*string) map[string]interface{} { output := make(map[string]interface{}) output["name"] = input.Name @@ -154,8 +175,9 @@ func flattenSharedImageVersion(input compute.GalleryImageVersion) map[string]int output["managed_image_id"] = source.ID } } - output["tags"] = tags.Flatten(input.Tags) } + output["tags"] = tags.Flatten(input.Tags) + return output } diff --git a/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go index 69d602a4457e..877153860c15 100644 --- a/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go +++ b/azurerm/internal/services/compute/tests/data_source_shared_image_versions_test.go @@ -2,6 +2,7 @@ package tests import ( "fmt" + "regexp" "testing" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" @@ -42,6 +43,66 @@ func TestAccDataSourceAzureRMSharedImageVersions_basic(t *testing.T) { }) } +func TestAccDataSourceAzureRMSharedImageVersions_tagsFilterError(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_shared_image_versions", "test") + username := "testadmin" + password := "Password1234!" + hostname := fmt.Sprintf("tftestcustomimagesrc%d", data.RandomInteger) + resourceGroup := fmt.Sprintf("acctestRG-%d", data.RandomInteger) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMSharedImageVersionDestroy, + Steps: []resource.TestStep{ + { + // need to create a vm and then reference it in the image creation + Config: testAccAzureRMSharedImageVersion_setup(data, username, password, hostname), + Destroy: false, + Check: resource.ComposeTestCheckFunc( + testCheckAzureVMExists("azurerm_virtual_machine.testsource", true), + testGeneralizeVMImage(resourceGroup, "testsource", username, password, hostname, "22", data.Locations.Primary), + ), + }, + { + Config: testAccDataSourceSharedImageVersions_tagsFilterError(data, username, password, hostname), + ExpectError: regexp.MustCompile("unable to find any images"), + }, + }, + }) +} + +func TestAccDataSourceAzureRMSharedImageVersions_tagsFilter(t *testing.T) { + data := acceptance.BuildTestData(t, "data.azurerm_shared_image_versions", "test") + username := "testadmin" + password := "Password1234!" + hostname := fmt.Sprintf("tftestcustomimagesrc%d", data.RandomInteger) + resourceGroup := fmt.Sprintf("acctestRG-%d", data.RandomInteger) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acceptance.PreCheck(t) }, + Providers: acceptance.SupportedProviders, + CheckDestroy: testCheckAzureRMSharedImageVersionDestroy, + Steps: []resource.TestStep{ + { + // need to create a vm and then reference it in the image creation + Config: testAccAzureRMSharedImageVersion_setup(data, username, password, hostname), + Destroy: false, + Check: resource.ComposeTestCheckFunc( + testCheckAzureVMExists("azurerm_virtual_machine.testsource", true), + testGeneralizeVMImage(resourceGroup, "testsource", username, password, hostname, "22", data.Locations.Primary), + ), + }, + { + Config: testAccDataSourceSharedImageVersions_tagsFilter(data, username, password, hostname), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(data.ResourceName, "images.#", "1"), + ), + }, + }, + }) +} + func testAccDataSourceSharedImageVersions_basic(data acceptance.TestData, username, password, hostname string) string { template := testAccAzureRMSharedImageVersion_imageVersion(data, username, password, hostname) return fmt.Sprintf(` @@ -54,3 +115,37 @@ data "azurerm_shared_image_versions" "test" { } `, template) } + +func testAccDataSourceSharedImageVersions_tagsFilterError(data acceptance.TestData, username, password, hostname string) string { + template := testAccAzureRMSharedImageVersion_imageVersion(data, username, password, hostname) + return fmt.Sprintf(` +%s + +data "azurerm_shared_image_versions" "test" { + gallery_name = azurerm_shared_image_version.test.gallery_name + image_name = azurerm_shared_image_version.test.image_name + resource_group_name = azurerm_shared_image_version.test.resource_group_name + + tags_filter = { + "foo" = "error" + } +} +`, template) +} + +func testAccDataSourceSharedImageVersions_tagsFilter(data acceptance.TestData, username, password, hostname string) string { + template := testAccAzureRMSharedImageVersion_imageVersion(data, username, password, hostname) + return fmt.Sprintf(` +%s + +data "azurerm_shared_image_versions" "test" { + gallery_name = azurerm_shared_image_version.test.gallery_name + image_name = azurerm_shared_image_version.test.image_name + resource_group_name = azurerm_shared_image_version.test.resource_group_name + + tags_filter = { + "foo" = "bar" + } +} +`, template) +} diff --git a/azurerm/internal/services/compute/tests/resource_arm_shared_image_version_test.go b/azurerm/internal/services/compute/tests/resource_arm_shared_image_version_test.go index d1bc0fc39d4e..848947682c93 100644 --- a/azurerm/internal/services/compute/tests/resource_arm_shared_image_version_test.go +++ b/azurerm/internal/services/compute/tests/resource_arm_shared_image_version_test.go @@ -278,6 +278,10 @@ resource "azurerm_shared_image_version" "test" { name = azurerm_resource_group.test.location regional_replica_count = 1 } + + tags = { + "foo" = "bar" + } } `, template) } diff --git a/website/docs/d/shared_image_versions.html.markdown b/website/docs/d/shared_image_versions.html.markdown index dd00072b6abb..b32115fdcc04 100644 --- a/website/docs/d/shared_image_versions.html.markdown +++ b/website/docs/d/shared_image_versions.html.markdown @@ -31,6 +31,8 @@ The following arguments are supported: * `resource_group_name` - The name of the Resource Group in which the Shared Image Gallery exists. +* `tags_filter` - A mapping of tags to filter the list of images against. + ## Attributes Reference The following attributes are exported: From fa748eb473f8c01c71ace29886fd7379ad26d84b Mon Sep 17 00:00:00 2001 From: Matthew Frahry Date: Wed, 29 Apr 2020 19:58:46 -0700 Subject: [PATCH 4/4] Lint --- .../services/compute/data_source_shared_image_versions.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/azurerm/internal/services/compute/data_source_shared_image_versions.go b/azurerm/internal/services/compute/data_source_shared_image_versions.go index 3f2b9e70c3d8..59f51dff0478 100644 --- a/azurerm/internal/services/compute/data_source_shared_image_versions.go +++ b/azurerm/internal/services/compute/data_source_shared_image_versions.go @@ -135,7 +135,7 @@ func flattenSharedImageVersions(input []compute.GalleryImageVersion, filterTags results := make([]interface{}, 0) for _, imageVersion := range input { - flattenedIPAddress := flattenSharedImageVersion(imageVersion, filterTags) + flattenedIPAddress := flattenSharedImageVersion(imageVersion) found := true // Loop through our filter tags and see if they match for k, v := range filterTags { @@ -155,7 +155,7 @@ func flattenSharedImageVersions(input []compute.GalleryImageVersion, filterTags return results } -func flattenSharedImageVersion(input compute.GalleryImageVersion, filterTags map[string]*string) map[string]interface{} { +func flattenSharedImageVersion(input compute.GalleryImageVersion) map[string]interface{} { output := make(map[string]interface{}) output["name"] = input.Name