From b7da9d38e187429d6264eae4f33f182fd6e634ab Mon Sep 17 00:00:00 2001 From: Rob Campbell Date: Thu, 20 Jul 2023 12:02:15 -0400 Subject: [PATCH 1/7] Add fsx_ontap_storage_virtual_machine data source --- .../service/fsx/common_schema_data_source.go | 38 +++ internal/service/fsx/find.go | 49 ++++ ...tap_storage_virtual_machine_data_source.go | 267 ++++++++++++++++++ ...torage_virtual_machine_data_source_test.go | 160 +++++++++++ internal/service/fsx/service_package_gen.go | 5 + ...ntap_storage_virtual_machine.html.markdown | 98 +++++++ 6 files changed, 617 insertions(+) create mode 100644 internal/service/fsx/ontap_storage_virtual_machine_data_source.go create mode 100644 internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go create mode 100644 website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown diff --git a/internal/service/fsx/common_schema_data_source.go b/internal/service/fsx/common_schema_data_source.go index f1aef6df1813..d0ece97a3f2d 100644 --- a/internal/service/fsx/common_schema_data_source.go +++ b/internal/service/fsx/common_schema_data_source.go @@ -45,3 +45,41 @@ func DataSourceSnapshotFiltersSchema() *schema.Schema { }, } } + +func BuildStorageVirtualMachineFiltersDataSource(set *schema.Set) []*fsx.StorageVirtualMachineFilter { + var filters []*fsx.StorageVirtualMachineFilter + for _, v := range set.List() { + m := v.(map[string]interface{}) + var filterValues []*string + for _, e := range m["values"].([]interface{}) { + filterValues = append(filterValues, aws.String(e.(string))) + } + + filters = append(filters, &fsx.StorageVirtualMachineFilter{ + Name: aws.String(m["name"].(string)), + Values: filterValues, + }) + } + + return filters +} + +func DataSoureStorageVirtualMachineFiltersSchema() *schema.Schema { + return &schema.Schema{ + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + }, + "values": { + Type: schema.TypeList, + Required: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + } +} diff --git a/internal/service/fsx/find.go b/internal/service/fsx/find.go index f64069248c62..57d2dd7211dd 100644 --- a/internal/service/fsx/find.go +++ b/internal/service/fsx/find.go @@ -333,3 +333,52 @@ func FindSnapshots(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeSnapsh return output, nil } + +func FindStorageVirtualMachine(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeStorageVirtualMachinesInput) (*fsx.StorageVirtualMachine, error) { + output, err := FindStorageVirtualMachines(ctx, conn, input) + + if err != nil { + return nil, err + } + + if len(output) == 0 || output[0] == nil { + return nil, tfresource.NewEmptyResultError(input) + } + + if count := len(output); count > 1 { + return nil, tfresource.NewTooManyResultsError(count, input) + } + + return output[0], nil +} + +func FindStorageVirtualMachines(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeStorageVirtualMachinesInput) ([]*fsx.StorageVirtualMachine, error) { + var output []*fsx.StorageVirtualMachine + + err := conn.DescribeStorageVirtualMachinesPagesWithContext(ctx, input, func(page *fsx.DescribeStorageVirtualMachinesOutput, lastPage bool) bool { + if page == nil { + return !lastPage + } + + for _, v := range page.StorageVirtualMachines { + if v != nil { + output = append(output, v) + } + } + + return !lastPage + }) + + if tfawserr.ErrCodeEquals(err, fsx.ErrCodeStorageVirtualMachineNotFound) { + return nil, &retry.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + return output, nil +} diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source.go new file mode 100644 index 000000000000..b59cb0aaaab3 --- /dev/null +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source.go @@ -0,0 +1,267 @@ +package fsx + +import ( + "context" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/fsx" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-provider-aws/internal/conns" + "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" + tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" + "github.com/hashicorp/terraform-provider-aws/internal/tfresource" +) + +// @SDKDataSource("aws_fsx_ontap_storage_virtual_machine", name="Ontap Storage Virtual Machine") +func DataSourceOntapStorageVirtualMachine() *schema.Resource { + return &schema.Resource{ + ReadWithoutTimeout: dataSourceOntapStorageVirtualMachineRead, + + Schema: map[string]*schema.Schema{ + "arn": { + Type: schema.TypeString, + Computed: true, + }, + "active_directory_configuration": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "netbios_name": { + Type: schema.TypeString, + Computed: true, + }, + "self_managed_active_directory_configuration": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dns_ips": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + "domain_name": { + Type: schema.TypeString, + Computed: true, + }, + "file_system_administrators_group": { + Type: schema.TypeString, + Computed: true, + }, + "organizational_unit_distinguished_name": { + Type: schema.TypeString, + Computed: true, + }, + "username": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + }, + }, + }, + "creation_time": { + Type: schema.TypeString, + Computed: true, + }, + "endpoints": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "iscsi": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + }, + "management": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + }, + "nfs": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + }, + "smb": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "dns_name": { + Type: schema.TypeString, + Computed: true, + }, + "ip_addresses": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + }, + }, + }, + }, + }, + "file_system_id": { + Type: schema.TypeString, + Computed: true, + }, + "filter": DataSoureStorageVirtualMachineFiltersSchema(), + "id": { + Type: schema.TypeString, + Optional: true, + Computed: true, + }, + "lifecycle_status": { + Type: schema.TypeString, + Computed: true, + }, + "lifecycle_transition_reason": { + Type: schema.TypeSet, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "message": { + Type: schema.TypeString, + Computed: true, + }, + }, + }, + }, + "name": { + Type: schema.TypeString, + Computed: true, + }, + "root_volume_security_style": { + Type: schema.TypeString, + Computed: true, + }, + "subtype": { + Type: schema.TypeString, + Computed: true, + }, + "tags": tftags.TagsSchemaComputed(), + "uuid": { + Type: schema.TypeString, + Computed: true, + }, + }, + } +} + +const ( + DSNameOntapStorageVirtualMachine = "Ontap Storage Virtual Machine Data Source" +) + +func dataSourceOntapStorageVirtualMachineRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + var diags diag.Diagnostics + conn := meta.(*conns.AWSClient).FSxConn(ctx) + defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig + ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig + + input := &fsx.DescribeStorageVirtualMachinesInput{} + + if id, ok := d.GetOk("id"); ok { + input.StorageVirtualMachineIds = []*string{aws.String(id.(string))} + } + + input.Filters = BuildStorageVirtualMachineFiltersDataSource( + d.Get("filter").(*schema.Set), + ) + + if len(input.Filters) == 0 { + input.Filters = nil + } + + svm, err := FindStorageVirtualMachine(ctx, conn, input) + + if err != nil { + return sdkdiag.AppendFromErr(diags, tfresource.SingularDataSourceFindError("FSx StorageVirtualMachine", err)) + } + + d.SetId(aws.StringValue(svm.StorageVirtualMachineId)) + + d.Set("arn", svm.ResourceARN) + d.Set("endpoints", flattenOntapStorageVirtualMachineEndpoints(svm.Endpoints)) + d.Set("file_system_id", svm.FileSystemId) + d.Set("id", svm.StorageVirtualMachineId) + d.Set("lifecycle_status", svm.Lifecycle) + d.Set("lifecycle_transition_reason", flattenOntapSvmLifecycleTransitionReason(svm.LifecycleTransitionReason)) + d.Set("name", svm.Name) + d.Set("root_volume_security_style", svm.RootVolumeSecurityStyle) + d.Set("subtype", svm.Subtype) + d.Set("uuid", svm.UUID) + + if err := d.Set("active_directory_configuration", flattenOntapSvmActiveDirectoryConfiguration(d, svm.ActiveDirectoryConfiguration)); err != nil { + return sdkdiag.AppendErrorf(diags, "setting svm_active_directory: %s", err) + } + + if err := d.Set("creation_time", svm.CreationTime.Format(time.RFC3339)); err != nil { + return sdkdiag.AppendErrorf(diags, "setting creation_time: %s", err) + } + + tags := KeyValueTags(ctx, svm.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig) + + //lintignore:AWSR002 + if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil { + return sdkdiag.AppendErrorf(diags, "setting tags: %s", err) + } + + return diags +} + +func flattenOntapSvmLifecycleTransitionReason(rs *fsx.LifecycleTransitionReason) []interface{} { + if rs == nil { + return []interface{}{} + } + + m := make(map[string]interface{}) + if rs.Message != nil { + m["message"] = aws.StringValue(rs.Message) + } + + return []interface{}{m} +} diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go new file mode 100644 index 000000000000..326db8079ee0 --- /dev/null +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go @@ -0,0 +1,160 @@ +package fsx_test + +import ( + "fmt" + "testing" + + "github.com/aws/aws-sdk-go/service/fsx" + sdkacctest "github.com/hashicorp/terraform-plugin-testing/helper/acctest" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-provider-aws/internal/acctest" +) + +func TestAccFSxOntapStorageVirtualMachineDataSource_Id(t *testing.T) { + ctx := acctest.Context(t) + + if testing.Short() { + t.Skip("skipping long-running test in short mode") + } + + resourceName := "aws_fsx_ontap_storage_virtual_machine.test" + dataSourceName := "data.aws_fsx_ontap_storage_virtual_machine.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, fsx.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckOntapStorageVirtualMachineDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccFSxOntapStorageVirtualMachineDataSourceConfig_Id(rName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), + resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration", resourceName, "active_directory_configuration"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoints", resourceName, "endpoints"), + resource.TestCheckResourceAttrPair(dataSourceName, "file_system_id", resourceName, "file_system_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "id", resourceName, "id"), + resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"), + resource.TestCheckResourceAttrPair(dataSourceName, "root_volume_security_style", resourceName, "root_volume_security_style"), + resource.TestCheckResourceAttrPair(dataSourceName, "subtype", resourceName, "subtype"), + resource.TestCheckResourceAttrPair(dataSourceName, "uuid", resourceName, "uuid"), + ), + }, + }, + }) +} + +func TestAccFSxOntapStorageVirtualMachineDataSource_Filter(t *testing.T) { + ctx := acctest.Context(t) + + if testing.Short() { + t.Skip("skipping long-running test in short mode") + } + + resourceName := "aws_fsx_ontap_storage_virtual_machine.test" + dataSourceName := "data.aws_fsx_ontap_storage_virtual_machine.test" + rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { acctest.PreCheck(ctx, t) }, + ErrorCheck: acctest.ErrorCheck(t, fsx.EndpointsID), + ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, + CheckDestroy: testAccCheckOntapStorageVirtualMachineDestroy(ctx), + Steps: []resource.TestStep{ + { + Config: testAccFSxOntapStorageVirtualMachineDataSourceConfig_Filter(rName), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), + resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration", resourceName, "active_directory_configuration"), + resource.TestCheckResourceAttrPair(dataSourceName, "endpoints", resourceName, "endpoints"), + resource.TestCheckResourceAttrPair(dataSourceName, "file_system_id", resourceName, "file_system_id"), + resource.TestCheckResourceAttrPair(dataSourceName, "id", resourceName, "id"), + resource.TestCheckResourceAttrPair(dataSourceName, "name", resourceName, "name"), + resource.TestCheckResourceAttrPair(dataSourceName, "root_volume_security_style", resourceName, "root_volume_security_style"), + resource.TestCheckResourceAttrPair(dataSourceName, "subtype", resourceName, "subtype"), + resource.TestCheckResourceAttrPair(dataSourceName, "uuid", resourceName, "uuid"), + ), + }, + }, + }) +} + +func testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName string) string { + return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(` +data "aws_partition" "current" {} + +resource "aws_vpc" "test" { + cidr_block = "10.0.0.0/16" + + tags = { + Name = %[1]q + } +} + +resource "aws_subnet" "test1" { + vpc_id = aws_vpc.test.id + cidr_block = "10.0.1.0/24" + availability_zone = data.aws_availability_zones.available.names[0] + + tags = { + Name = %[1]q + } +} + +resource "aws_subnet" "test2" { + vpc_id = aws_vpc.test.id + cidr_block = "10.0.2.0/24" + availability_zone = data.aws_availability_zones.available.names[1] + + tags = { + Name = %[1]q + } +} + +resource "aws_fsx_ontap_file_system" "test" { + storage_capacity = 1024 + subnet_ids = [aws_subnet.test1.id] + deployment_type = "SINGLE_AZ_1" + throughput_capacity = 512 + preferred_subnet_id = aws_subnet.test1.id + + tags = { + Name = %[1]q + } +} +`, rName)) +} + +func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Id(rName string) string { + return acctest.ConfigCompose(testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName), fmt.Sprintf(` +resource "aws_fsx_ontap_storage_virtual_machine" "test" { + file_system_id = aws_fsx_ontap_file_system.test.id + name = %[1]q +} + +data "aws_fsx_ontap_storage_virtual_machine" "test" { + id = aws_fsx_ontap_storage_virtual_machine.test.id +} +`, rName)) +} + +func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Filter(rName string) string { + return acctest.ConfigCompose(testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName), fmt.Sprintf(` +resource "aws_fsx_ontap_storage_virtual_machine" "test" { + file_system_id = aws_fsx_ontap_file_system.test.id + name = %[1]q +} + +data "aws_fsx_ontap_storage_virtual_machine" "test" { + filter { + name = "file-system-id" + values = [aws_fsx_ontap_file_system.test.id] + } + + depends_on = [ + aws_fsx_ontap_storage_virtual_machine.test + ] +} +`, rName)) +} diff --git a/internal/service/fsx/service_package_gen.go b/internal/service/fsx/service_package_gen.go index 38d735af0a8e..f38f2d119548 100644 --- a/internal/service/fsx/service_package_gen.go +++ b/internal/service/fsx/service_package_gen.go @@ -25,6 +25,11 @@ func (p *servicePackage) FrameworkResources(ctx context.Context) []*types.Servic func (p *servicePackage) SDKDataSources(ctx context.Context) []*types.ServicePackageSDKDataSource { return []*types.ServicePackageSDKDataSource{ + { + Factory: DataSourceOntapStorageVirtualMachine, + TypeName: "aws_fsx_ontap_storage_virtual_machine", + Name: "Ontap Storage Virtual Machine", + }, { Factory: DataSourceOpenzfsSnapshot, TypeName: "aws_fsx_openzfs_snapshot", diff --git a/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown b/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown new file mode 100644 index 000000000000..c102b14de5d6 --- /dev/null +++ b/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown @@ -0,0 +1,98 @@ +--- +subcategory: "FSx" +layout: "aws" +page_title: "AWS: aws_fsx_ontap_storage_virtual_machine" +description: |- + Retrieve information on FSx ONTAP Storage Virtual Machine (SVM). +--- + +# Data Source: aws_fsx_ontap_storage_virtual_machine + +Retrieve information on FSx ONTAP Storage Virtual Machine (SVM). + +## Example Usage + +### Basic Usage + +```terraform +data "aws_fsx_ontap_storage_virtual_machine" "example" { + id = "svm-12345678" +} +``` + +### Filter Example + +``` +data "aws_fsx_ontap_storage_virtual_machine" "test" { + filter { + name = "file-system-id" + values = ["fs-12345678"] + } +} +``` + +## Argument Reference + +The arguments of this data source act as filters for querying the available ONTAP Storage Virtual Machines in the current region. The given filters must match exactly one Storage Virtual Machine whose data will be exported as attributes. + +The following arguments are optional: + +* `filter` - (Optional) Configuration block. Detailed below. +* `id` - (Optional) Identifier of the storage virtual machine (e.g. `svm-12345678`). + +### filter + +This block allows for complex filters. + +The following arguments are required: + +* `name` - (Required) Name of the field to filter by, as defined by [the underlying AWS API](https://docs.aws.amazon.com/fsx/latest/APIReference/API_StorageVirtualMachineFilter.html). +* `values` - (Required) Set of values that are accepted for the given field. An SVM will be selected if any one of the given values matches. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `arn` - Amazon Resource Name of the SVM. +* `active_directory_configuration` - The Microsoft Active Directory configuration to which the SVM is joined, if applicable. See [Active Directory Configuration](#active-directory-configuration) below. +* `creation_time` - The time that the SVM was created. +* `endpoints` - The endpoints that are used to access data or to manage the SVM using the NetApp ONTAP CLI, REST API, or NetApp CloudManager. They are the Iscsi, Management, Nfs, and Smb endpoints. See [SVM Endpoints](#svm-endpoints) below. +* `file_system_id` - Identifier of the file system (e.g. `fs-12345678`). +* `id` - The SVM's system generated unique ID. +* `lifecycle_status` - The SVM's lifecycle status. +* `lifecycle_transition_reason` - Describes why the SVM lifecycle state changed. See [Lifecycle Transition Reason](#lifecycle-transition-reason) below. +* `name` - The name of the SVM, if provisioned. +* `root_volume_security_style` - The security style of the root volume of the SVM. +* `subtype` - The SVM's subtype. +* `uuid` - The SVM's UUID. + +### Active Directory Configuration + +The following arguments are supported for `active_directory_configuration` configuration block: + +* `netbios_name` - The NetBIOS name of the AD computer object to which the SVM is joined. +* `self_managed_active_directory` - The configuration of the self-managed Microsoft Active Directory (AD) directory to which the Windows File Server or ONTAP storage virtual machine (SVM) instance is joined. See [Self Managed Active Directory](#self-managed-active-directory) below. + +### Self Managed Active Directory + +* `dns_ips` - A list of up to three IP addresses of DNS servers or domain controllers in the self-managed AD directory. +* `domain_name` - The fully qualified domain name of the self-managed AD directory. +* `file_system_administrators_group` - The name of the domain group whose members have administrative privileges for the FSx file system. +* `organizational_unit_distinguished_name` - The fully qualified distinguished name of the organizational unit within the self-managed AD directory to which the Windows File Server or ONTAP storage virtual machine (SVM) instance is joined. +* `username` - The user name for the service account on your self-managed AD domain that FSx uses to join to your AD domain. + +### Lifecycle Transition Reason + +* `message` - A detailed message. + +### SVM Endpoints + +* `Iscsi` - An endpoint for connecting using the Internet Small Computer Systems Interface (iSCSI) protocol. See [SVM Endpoint](#svm-endpoint) below. +* `management` - An endpoint for managing SVMs using the NetApp ONTAP CLI, NetApp ONTAP API, or NetApp CloudManager. See [SVM Endpoint](#svm-endpoint) below. +* `nfs` - An endpoint for connecting using the Network File System (NFS) protocol. See [SVM Endpoint](#svm-endpoint) below. +* `smb` - An endpoint for connecting using the Server Message Block (SMB) protocol. See [SVM Endpoint](#svm-endpoint) below. + +### SVM Endpoint + +* `DNSName` - The file system's DNS name. You can mount your file system using its DNS name. +* `IpAddresses` - The SVM endpoint's IP addresses. From aeaaf5eac54618f105da820a86c92da55323171a Mon Sep 17 00:00:00 2001 From: Rob Campbell Date: Thu, 20 Jul 2023 12:46:55 -0400 Subject: [PATCH 2/7] Add changelog --- .changelog/32621.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/32621.txt diff --git a/.changelog/32621.txt b/.changelog/32621.txt new file mode 100644 index 000000000000..7f9404ba2234 --- /dev/null +++ b/.changelog/32621.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +aws_fsx_ontap_storage_virtual_machine +``` From 6e46f317785dd096b5e8cbd5b92eb433438b76ec Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 20 Sep 2023 09:03:11 -0400 Subject: [PATCH 3/7] d/aws_fsx_ontap_storage_virtual_machine: Use 'findStorageVirtualMachine'. --- .../service/fsx/common_schema_data_source.go | 2 +- internal/service/fsx/find.go | 49 ------------------- ...tap_storage_virtual_machine_data_source.go | 14 ++---- internal/service/fsx/service_package_gen.go | 2 +- 4 files changed, 7 insertions(+), 60 deletions(-) diff --git a/internal/service/fsx/common_schema_data_source.go b/internal/service/fsx/common_schema_data_source.go index d0ece97a3f2d..e471b2490ffc 100644 --- a/internal/service/fsx/common_schema_data_source.go +++ b/internal/service/fsx/common_schema_data_source.go @@ -64,7 +64,7 @@ func BuildStorageVirtualMachineFiltersDataSource(set *schema.Set) []*fsx.Storage return filters } -func DataSoureStorageVirtualMachineFiltersSchema() *schema.Schema { +func DataSourceStorageVirtualMachineFiltersSchema() *schema.Schema { return &schema.Schema{ Type: schema.TypeSet, Optional: true, diff --git a/internal/service/fsx/find.go b/internal/service/fsx/find.go index 017280328c3a..c24a32bda5de 100644 --- a/internal/service/fsx/find.go +++ b/internal/service/fsx/find.go @@ -126,52 +126,3 @@ func FindSnapshots(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeSnapsh return output, nil } - -func FindStorageVirtualMachine(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeStorageVirtualMachinesInput) (*fsx.StorageVirtualMachine, error) { - output, err := FindStorageVirtualMachines(ctx, conn, input) - - if err != nil { - return nil, err - } - - if len(output) == 0 || output[0] == nil { - return nil, tfresource.NewEmptyResultError(input) - } - - if count := len(output); count > 1 { - return nil, tfresource.NewTooManyResultsError(count, input) - } - - return output[0], nil -} - -func FindStorageVirtualMachines(ctx context.Context, conn *fsx.FSx, input *fsx.DescribeStorageVirtualMachinesInput) ([]*fsx.StorageVirtualMachine, error) { - var output []*fsx.StorageVirtualMachine - - err := conn.DescribeStorageVirtualMachinesPagesWithContext(ctx, input, func(page *fsx.DescribeStorageVirtualMachinesOutput, lastPage bool) bool { - if page == nil { - return !lastPage - } - - for _, v := range page.StorageVirtualMachines { - if v != nil { - output = append(output, v) - } - } - - return !lastPage - }) - - if tfawserr.ErrCodeEquals(err, fsx.ErrCodeStorageVirtualMachineNotFound) { - return nil, &retry.NotFoundError{ - LastError: err, - LastRequest: input, - } - } - - if err != nil { - return nil, err - } - - return output, nil -} diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source.go index 6c4e0e7f5a69..71e1809330f7 100644 --- a/internal/service/fsx/ontap_storage_virtual_machine_data_source.go +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source.go @@ -13,11 +13,11 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-provider-aws/internal/conns" "github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag" + tfslices "github.com/hashicorp/terraform-provider-aws/internal/slices" tftags "github.com/hashicorp/terraform-provider-aws/internal/tags" - "github.com/hashicorp/terraform-provider-aws/internal/tfresource" ) -// @SDKDataSource("aws_fsx_ontap_storage_virtual_machine", name="Ontap Storage Virtual Machine") +// @SDKDataSource("aws_fsx_ontap_storage_virtual_machine", name="ONTAP Storage Virtual Machine") func DataSourceOntapStorageVirtualMachine() *schema.Resource { return &schema.Resource{ ReadWithoutTimeout: dataSourceOntapStorageVirtualMachineRead, @@ -152,7 +152,7 @@ func DataSourceOntapStorageVirtualMachine() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "filter": DataSoureStorageVirtualMachineFiltersSchema(), + "filter": DataSourceStorageVirtualMachineFiltersSchema(), "id": { Type: schema.TypeString, Optional: true, @@ -191,10 +191,6 @@ func DataSourceOntapStorageVirtualMachine() *schema.Resource { } } -const ( - DSNameOntapStorageVirtualMachine = "Ontap Storage Virtual Machine Data Source" -) - func dataSourceOntapStorageVirtualMachineRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { var diags diag.Diagnostics conn := meta.(*conns.AWSClient).FSxConn(ctx) @@ -215,10 +211,10 @@ func dataSourceOntapStorageVirtualMachineRead(ctx context.Context, d *schema.Res input.Filters = nil } - svm, err := FindStorageVirtualMachine(ctx, conn, input) + svm, err := findStorageVirtualMachine(ctx, conn, input, tfslices.PredicateTrue[*fsx.StorageVirtualMachine]()) if err != nil { - return sdkdiag.AppendFromErr(diags, tfresource.SingularDataSourceFindError("FSx StorageVirtualMachine", err)) + return sdkdiag.AppendErrorf(diags, "reading FSx ONTAP Storage Virtual Machine: %s", err) } d.SetId(aws.StringValue(svm.StorageVirtualMachineId)) diff --git a/internal/service/fsx/service_package_gen.go b/internal/service/fsx/service_package_gen.go index 445bff04b78c..6c64fe6af049 100644 --- a/internal/service/fsx/service_package_gen.go +++ b/internal/service/fsx/service_package_gen.go @@ -33,7 +33,7 @@ func (p *servicePackage) SDKDataSources(ctx context.Context) []*types.ServicePac { Factory: DataSourceOntapStorageVirtualMachine, TypeName: "aws_fsx_ontap_storage_virtual_machine", - Name: "Ontap Storage Virtual Machine", + Name: "ONTAP Storage Virtual Machine", }, { Factory: DataSourceOpenzfsSnapshot, From 7aa9b48c82c4d6c72d06d47c205091e37320f58a Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 20 Sep 2023 09:06:28 -0400 Subject: [PATCH 4/7] d/aws_fsx_ontap_storage_virtual_machine: Simplify acceptance test configurations. --- ...torage_virtual_machine_data_source_test.go | 75 ++----------------- ...ntap_storage_virtual_machine.html.markdown | 8 +- 2 files changed, 12 insertions(+), 71 deletions(-) diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go index e89552577ea7..c57395d1d35f 100644 --- a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go @@ -4,7 +4,6 @@ package fsx_test import ( - "fmt" "testing" "github.com/aws/aws-sdk-go/service/fsx" @@ -79,81 +78,23 @@ func TestAccFSxOntapStorageVirtualMachineDataSource_Filter(t *testing.T) { }) } -func testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName string) string { - return acctest.ConfigCompose(acctest.ConfigAvailableAZsNoOptIn(), fmt.Sprintf(` -data "aws_partition" "current" {} - -resource "aws_vpc" "test" { - cidr_block = "10.0.0.0/16" - - tags = { - Name = %[1]q - } -} - -resource "aws_subnet" "test1" { - vpc_id = aws_vpc.test.id - cidr_block = "10.0.1.0/24" - availability_zone = data.aws_availability_zones.available.names[0] - - tags = { - Name = %[1]q - } -} - -resource "aws_subnet" "test2" { - vpc_id = aws_vpc.test.id - cidr_block = "10.0.2.0/24" - availability_zone = data.aws_availability_zones.available.names[1] - - tags = { - Name = %[1]q - } -} - -resource "aws_fsx_ontap_file_system" "test" { - storage_capacity = 1024 - subnet_ids = [aws_subnet.test1.id] - deployment_type = "SINGLE_AZ_1" - throughput_capacity = 512 - preferred_subnet_id = aws_subnet.test1.id - - tags = { - Name = %[1]q - } -} -`, rName)) -} - func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Id(rName string) string { - return acctest.ConfigCompose(testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName), fmt.Sprintf(` -resource "aws_fsx_ontap_storage_virtual_machine" "test" { - file_system_id = aws_fsx_ontap_file_system.test.id - name = %[1]q -} - + return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { id = aws_fsx_ontap_storage_virtual_machine.test.id } -`, rName)) +`) } func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Filter(rName string) string { - return acctest.ConfigCompose(testAccOntapStorageVirtualMachineDataSourceBaseConfig(rName), fmt.Sprintf(` -resource "aws_fsx_ontap_storage_virtual_machine" "test" { - file_system_id = aws_fsx_ontap_file_system.test.id - name = %[1]q -} - + return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { filter { - name = "file-system-id" - values = [aws_fsx_ontap_file_system.test.id] - } + name = "file-system-id" + values = [aws_fsx_ontap_file_system.test.id] + } - depends_on = [ - aws_fsx_ontap_storage_virtual_machine.test - ] + depends_on = [aws_fsx_ontap_storage_virtual_machine.test] } -`, rName)) +`) } diff --git a/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown b/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown index 16d1a6a54ba9..f88159435882 100644 --- a/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown +++ b/website/docs/d/fsx_ontap_storage_virtual_machine.html.markdown @@ -23,11 +23,11 @@ data "aws_fsx_ontap_storage_virtual_machine" "example" { ### Filter Example ``` -data "aws_fsx_ontap_storage_virtual_machine" "test" { +data "aws_fsx_ontap_storage_virtual_machine" "example" { filter { - name = "file-system-id" - values = ["fs-12345678"] - } + name = "file-system-id" + values = ["fs-12345678"] + } } ``` From 354ac0d0524af9182e1c2f8d6bcb62b22cefdc4d Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 20 Sep 2023 09:08:34 -0400 Subject: [PATCH 5/7] r/aws_fsx_ontap_storage_virtual_machine: Change `file_system_id` to [ForceNew](https://developer.hashicorp.com/terraform/plugin/sdkv2/schemas/schema-behaviors#forcenew). --- .changelog/32621.txt | 4 ++++ internal/service/fsx/ontap_storage_virtual_machine.go | 1 + 2 files changed, 5 insertions(+) diff --git a/.changelog/32621.txt b/.changelog/32621.txt index 7f9404ba2234..ec4c48e4000a 100644 --- a/.changelog/32621.txt +++ b/.changelog/32621.txt @@ -1,3 +1,7 @@ ```release-note:new-data-source aws_fsx_ontap_storage_virtual_machine ``` + +```release-note:bug +resource/aws_fsx_ontap_storage_virtual_machine: Change `file_system_id` to [ForceNew](https://developer.hashicorp.com/terraform/plugin/sdkv2/schemas/schema-behaviors#forcenew) +``` \ No newline at end of file diff --git a/internal/service/fsx/ontap_storage_virtual_machine.go b/internal/service/fsx/ontap_storage_virtual_machine.go index b888ee4f90b6..272d13c822a3 100644 --- a/internal/service/fsx/ontap_storage_virtual_machine.go +++ b/internal/service/fsx/ontap_storage_virtual_machine.go @@ -199,6 +199,7 @@ func ResourceONTAPStorageVirtualMachine() *schema.Resource { "file_system_id": { Type: schema.TypeString, Required: true, + ForceNew: true, ValidateFunc: validation.StringLenBetween(11, 21), }, "name": { From 3610f31f5c859fc5d716ff5b489dc1d8a342446a Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 20 Sep 2023 09:12:09 -0400 Subject: [PATCH 6/7] d/aws_fsx_ontap_storage_virtual_machine: Acceptance test capitalization. --- ...ontap_storage_virtual_machine_data_source_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go index c57395d1d35f..84dfebfb7775 100644 --- a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/terraform-provider-aws/internal/acctest" ) -func TestAccFSxOntapStorageVirtualMachineDataSource_Id(t *testing.T) { +func TestAccFSxONTAPStorageVirtualMachineDataSource_Id(t *testing.T) { ctx := acctest.Context(t) if testing.Short() { @@ -29,7 +29,7 @@ func TestAccFSxOntapStorageVirtualMachineDataSource_Id(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ { - Config: testAccFSxOntapStorageVirtualMachineDataSourceConfig_Id(rName), + Config: testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Id(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration.#", resourceName, "active_directory_configuration.#"), @@ -45,7 +45,7 @@ func TestAccFSxOntapStorageVirtualMachineDataSource_Id(t *testing.T) { }) } -func TestAccFSxOntapStorageVirtualMachineDataSource_Filter(t *testing.T) { +func TestAccFSxONTAPStorageVirtualMachineDataSource_Filter(t *testing.T) { ctx := acctest.Context(t) if testing.Short() { @@ -62,7 +62,7 @@ func TestAccFSxOntapStorageVirtualMachineDataSource_Filter(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ { - Config: testAccFSxOntapStorageVirtualMachineDataSourceConfig_Filter(rName), + Config: testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Filter(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration.#", resourceName, "active_directory_configuration.#"), @@ -78,7 +78,7 @@ func TestAccFSxOntapStorageVirtualMachineDataSource_Filter(t *testing.T) { }) } -func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Id(rName string) string { +func testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Id(rName string) string { return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { id = aws_fsx_ontap_storage_virtual_machine.test.id @@ -86,7 +86,7 @@ data "aws_fsx_ontap_storage_virtual_machine" "test" { `) } -func testAccFSxOntapStorageVirtualMachineDataSourceConfig_Filter(rName string) string { +func testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Filter(rName string) string { return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { filter { From ab6e08b08045c910fe351c8ef9dd2063ae721f37 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Wed, 20 Sep 2023 09:13:32 -0400 Subject: [PATCH 7/7] d/aws_fsx_ontap_storage_virtual_machine: Fix semgrep 'ci.fsx-in-func-name'. --- .../fsx/ontap_storage_virtual_machine_data_source_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go index 84dfebfb7775..2bb73af2b09d 100644 --- a/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go +++ b/internal/service/fsx/ontap_storage_virtual_machine_data_source_test.go @@ -29,7 +29,7 @@ func TestAccFSxONTAPStorageVirtualMachineDataSource_Id(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ { - Config: testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Id(rName), + Config: testAccONTAPStorageVirtualMachineDataSourceConfig_Id(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration.#", resourceName, "active_directory_configuration.#"), @@ -62,7 +62,7 @@ func TestAccFSxONTAPStorageVirtualMachineDataSource_Filter(t *testing.T) { ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories, Steps: []resource.TestStep{ { - Config: testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Filter(rName), + Config: testAccONTAPStorageVirtualMachineDataSourceConfig_Filter(rName), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrPair(dataSourceName, "arn", resourceName, "arn"), resource.TestCheckResourceAttrPair(dataSourceName, "active_directory_configuration.#", resourceName, "active_directory_configuration.#"), @@ -78,7 +78,7 @@ func TestAccFSxONTAPStorageVirtualMachineDataSource_Filter(t *testing.T) { }) } -func testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Id(rName string) string { +func testAccONTAPStorageVirtualMachineDataSourceConfig_Id(rName string) string { return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { id = aws_fsx_ontap_storage_virtual_machine.test.id @@ -86,7 +86,7 @@ data "aws_fsx_ontap_storage_virtual_machine" "test" { `) } -func testAccFSxONTAPStorageVirtualMachineDataSourceConfig_Filter(rName string) string { +func testAccONTAPStorageVirtualMachineDataSourceConfig_Filter(rName string) string { return acctest.ConfigCompose(testAccONTAPStorageVirtualMachineConfig_basic(rName), ` data "aws_fsx_ontap_storage_virtual_machine" "test" { filter {