From 62593d79cb062f7e09244442f8f248e1b5a6eddb Mon Sep 17 00:00:00 2001 From: Jeremy Ciak Date: Wed, 9 Dec 2020 22:37:15 -0500 Subject: [PATCH 01/14] Adding support for aliases with FSx for Windows --- aws/resource_aws_fsx_windows_file_system.go | 105 ++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/aws/resource_aws_fsx_windows_file_system.go b/aws/resource_aws_fsx_windows_file_system.go index 1dbf1f7dae0..8f1f11ca8a7 100644 --- a/aws/resource_aws_fsx_windows_file_system.go +++ b/aws/resource_aws_fsx_windows_file_system.go @@ -43,6 +43,18 @@ func resourceAwsFsxWindowsFileSystem() *schema.Resource { ForceNew: true, ConflictsWith: []string{"self_managed_active_directory"}, }, + "aliases": { + Type: schema.TypeSet, + Optional: true, + MaxItems: 50, + Elem: &schema.Schema{ + Type: schema.TypeString, + ValidateFunc: validation.All( + validation.StringLenBetween(4, 253), + validation.StringMatch(regexp.MustCompile(`^[A-Za-z0-9]([.][A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])+$`), "must be in the fqdn format hostname.domain"), + ), + }, + }, "arn": { Type: schema.TypeString, Computed: true, @@ -265,6 +277,10 @@ func resourceAwsFsxWindowsFileSystemCreate(d *schema.ResourceData, meta interfac input.WindowsConfiguration.ActiveDirectoryId = aws.String(v.(string)) } + if v, ok := d.GetOk("aliases"); ok { + input.WindowsConfiguration.Aliases = expandStringSet(v.(*schema.Set)) + } + if v, ok := d.GetOk("deployment_type"); ok { input.WindowsConfiguration.DeploymentType = aws.String(v.(string)) } @@ -339,6 +355,14 @@ func resourceAwsFsxWindowsFileSystemUpdate(d *schema.ResourceData, meta interfac WindowsConfiguration: &fsx.UpdateFileSystemWindowsConfiguration{}, } + if d.HasChange("aliases") { + o, n := d.GetChange("aliases") + + if err := updateFsxAliases(conn, d.Get("arn").(string), o.([]*fsx.Alias), n.([]*fsx.Alias)); err != nil { + return fmt.Errorf("error updating FSx Windows File System (%s) aliases: %s", d.Get("arn").(string), err) + } + } + if d.HasChange("automatic_backup_retention_days") { input.WindowsConfiguration.AutomaticBackupRetentionDays = aws.Int64(int64(d.Get("automatic_backup_retention_days").(int))) } @@ -425,6 +449,10 @@ func resourceAwsFsxWindowsFileSystemRead(d *schema.ResourceData, meta interface{ d.Set("kms_key_id", filesystem.KmsKeyId) d.Set("storage_type", filesystem.StorageType) + if err := d.Set("aliases", aws.StringValueSlice(expandFsxAliasValues(filesystem.WindowsConfiguration.Aliases))); err != nil { + return fmt.Errorf("error setting aliases: %s", err) + } + if err := d.Set("network_interface_ids", aws.StringValueSlice(filesystem.NetworkInterfaceIds)); err != nil { return fmt.Errorf("error setting network_interface_ids: %w", err) } @@ -493,6 +521,83 @@ func resourceAwsFsxWindowsFileSystemDelete(d *schema.ResourceData, meta interfac return nil } +func expandFsxAliasValues(aliases []*fsx.Alias) []*string { + var alternateDNSNames []*string + + for i := 0; i < len(aliases); i++ { + alternateDNSNames[i] = aliases[i].Name + } + + return alternateDNSNames +} + +func updateFsxAliases(conn *fsx.FSx, identifier string, oldAliases []*fsx.Alias, newAliases []*fsx.Alias) error { + oldAliasValues := expandFsxAliasValues(oldAliases) + newAliasValues := expandFsxAliasValues(newAliases) + + var removedAliases []*string + + for _, oldAliasValue := range oldAliasValues { + exists := false + + for _, newAliasValue := range newAliasValues { + if newAliasValue == oldAliasValue { + exists = true + break + } + } + + if !exists { + removedAliases = append(removedAliases, oldAliasValue) + } + } + + if len(removedAliases) > 0 { + input := &fsx.DisassociateFileSystemAliasesInput{ + FileSystemId: aws.String(identifier), + Aliases: removedAliases, + } + + _, err := conn.DisassociateFileSystemAliases(input) + + if err != nil { + return fmt.Errorf("error disassociating aliases from FSx file system (%s): %w", identifier, err) + } + } + + var addedAliases []*string + + for _, newAliasValue := range newAliasValues { + exists := false + + for _, oldAliasValue := range oldAliasValues { + if oldAliasValue == newAliasValue { + exists = true + break + } + } + + if !exists { + addedAliases = append(addedAliases, newAliasValue) + } + } + + if len(addedAliases) > 0 { + input := &fsx.AssociateFileSystemAliasesInput{ + FileSystemId: aws.String(identifier), + Aliases: addedAliases, + } + + _, err := conn.AssociateFileSystemAliases(input) + + if err != nil { + return fmt.Errorf("error associating aliases to FSx file system (%s): %w", identifier, err) + } + } + + return nil +} + func expandFsxSelfManagedActiveDirectoryConfigurationCreate(l []interface{}) *fsx.SelfManagedActiveDirectoryConfiguration { if len(l) == 0 || l[0] == nil { return nil From d9b8d0715718f461a94d692881dce673ec36c9d7 Mon Sep 17 00:00:00 2001 From: Jeremy Ciak Date: Wed, 9 Dec 2020 22:37:29 -0500 Subject: [PATCH 02/14] Adding tests to account for the new support for aliases --- ...source_aws_fsx_windows_file_system_test.go | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index 20b4b679c8e..9feae003698 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -85,6 +85,7 @@ func TestAccAWSFsxWindowsFileSystem_basic(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem), testAccMatchResourceAttrRegionalARN(resourceName, "arn", "fsx", regexp.MustCompile(`file-system/fs-.+`)), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "0"), resource.TestCheckResourceAttr(resourceName, "automatic_backup_retention_days", "7"), resource.TestCheckResourceAttr(resourceName, "copy_tags_to_backups", "false"), resource.TestMatchResourceAttr(resourceName, "daily_automatic_backup_start_time", regexp.MustCompile(`^\d\d:\d\d$`)), @@ -140,6 +141,7 @@ func TestAccAWSFsxWindowsFileSystem_singleAz2(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem), testAccMatchResourceAttrRegionalARN(resourceName, "arn", "fsx", regexp.MustCompile(`file-system/fs-.+`)), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "0"), resource.TestCheckResourceAttr(resourceName, "automatic_backup_retention_days", "7"), resource.TestCheckResourceAttr(resourceName, "copy_tags_to_backups", "false"), resource.TestMatchResourceAttr(resourceName, "daily_automatic_backup_start_time", regexp.MustCompile(`^\d\d:\d\d$`)), @@ -219,6 +221,7 @@ func TestAccAWSFsxWindowsFileSystem_multiAz(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem), testAccMatchResourceAttrRegionalARN(resourceName, "arn", "fsx", regexp.MustCompile(`file-system/fs-.+`)), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "0"), resource.TestCheckResourceAttr(resourceName, "automatic_backup_retention_days", "7"), resource.TestCheckResourceAttr(resourceName, "copy_tags_to_backups", "false"), resource.TestMatchResourceAttr(resourceName, "daily_automatic_backup_start_time", regexp.MustCompile(`^\d\d:\d\d$`)), @@ -273,6 +276,55 @@ func TestAccAWSFsxWindowsFileSystem_disappears(t *testing.T) { }) } +func TestAccAWSFsxWindowsFileSystem_Aliases(t *testing.T) { + var filesystem1, filesystem2, filesystem3 fsx.FileSystem + resourceName := "aws_fsx_windows_file_system.test" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t); testAccPartitionHasServicePreCheck(fsx.EndpointsID, t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckFsxWindowsFileSystemDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem1.domain.name.com"), + Check: resource.ComposeTestCheckFunc( + testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem1), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "1"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem1.domain.name.com"), + ), + }, + { + ResourceName: resourceName, + ImportState: true, + ImportStateVerify: true, + ImportStateVerifyIgnore: []string{ + "security_group_ids", + "skip_final_backup", + }, + }, + { + Config: testAccAwsFsxWindowsFileSystemConfigAliases2("filesystem1.domain.name.com", "filesystem2.domain.name.com"), + Check: resource.ComposeTestCheckFunc( + testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem2), + testAccCheckFsxWindowsFileSystemNotRecreated(&filesystem1, &filesystem2), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "2"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem1.domain.name.com"), + resource.TestCheckResourceAttr(resourceName, "aliases.1", "filesystem2.domain.name.com"), + ), + }, + { + Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem2.domain.name.com"), + Check: resource.ComposeTestCheckFunc( + testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem3), + testAccCheckFsxWindowsFileSystemNotRecreated(&filesystem2, &filesystem3), + resource.TestCheckResourceAttr(resourceName, "aliases.#", "1"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem2.domain.name.com"), + ), + }, + }, + }) +} + func TestAccAWSFsxWindowsFileSystem_AutomaticBackupRetentionDays(t *testing.T) { var filesystem1, filesystem2, filesystem3 fsx.FileSystem resourceName := "aws_fsx_windows_file_system.test" @@ -861,6 +913,39 @@ resource "aws_directory_service_directory" "test" { ` } +func testAccAwsFsxWindowsFileSystemConfigAliases1(alias1 string) string { + return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` +resource "aws_fsx_windows_file_system" "test" { + active_directory_id = aws_directory_service_directory.test.id + skip_final_backup = true + storage_capacity = 32 + subnet_ids = [aws_subnet.test1.id] + throughput_capacity = 8 + + aliases = [ + %[1]q + ] +} +`, alias1) +} + +func testAccAwsFsxWindowsFileSystemConfigAliases2(alias1, alias2 string) string { + return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` +resource "aws_fsx_windows_file_system" "test" { + active_directory_id = aws_directory_service_directory.test.id + skip_final_backup = true + storage_capacity = 32 + subnet_ids = [aws_subnet.test1.id] + throughput_capacity = 8 + + aliases = [ + %[1]q + %[2]q + ] +} +`, alias1, alias2) +} + func testAccAwsFsxWindowsFileSystemConfigAutomaticBackupRetentionDays(automaticBackupRetentionDays int) string { return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { From 43d31c78ff1fa962d5f08c878af2efe511d60086 Mon Sep 17 00:00:00 2001 From: Jeremy Ciak Date: Wed, 9 Dec 2020 22:37:45 -0500 Subject: [PATCH 03/14] Updating tools --- tools/go.mod | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/go.mod b/tools/go.mod index 02ed3cf722a..f6e63fbb44f 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -5,12 +5,19 @@ go 1.15 require ( github.com/bflad/tfproviderdocs v0.9.1 github.com/client9/misspell v0.3.4 +<<<<<<< HEAD github.com/golangci/golangci-lint v1.39.0 github.com/hashicorp/go-changelog v0.0.0-20201005170154-56335215ce3a github.com/hashicorp/go-getter v1.5.2 // indirect github.com/katbyte/terrafmt v0.3.0 github.com/pavius/impi v0.0.3 github.com/terraform-linters/tflint v0.28.1 +======= + github.com/golangci/golangci-lint v1.33.0 + github.com/katbyte/terrafmt v0.2.1-0.20200913185704-5ff4421407b4 + github.com/pavius/impi v0.0.3 // indirect + github.com/terraform-linters/tflint v0.20.3 +>>>>>>> 9c419a56f (Updating tools) ) replace github.com/katbyte/terrafmt => github.com/gdavison/terrafmt v0.3.1-0.20210204054728-84242796be99 From 3394f1479e61dbf2074126078058fba2678f6db0 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Thu, 1 Jul 2021 20:58:52 +0300 Subject: [PATCH 04/14] revert --- tools/go.mod | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/go.mod b/tools/go.mod index f6e63fbb44f..02ed3cf722a 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -5,19 +5,12 @@ go 1.15 require ( github.com/bflad/tfproviderdocs v0.9.1 github.com/client9/misspell v0.3.4 -<<<<<<< HEAD github.com/golangci/golangci-lint v1.39.0 github.com/hashicorp/go-changelog v0.0.0-20201005170154-56335215ce3a github.com/hashicorp/go-getter v1.5.2 // indirect github.com/katbyte/terrafmt v0.3.0 github.com/pavius/impi v0.0.3 github.com/terraform-linters/tflint v0.28.1 -======= - github.com/golangci/golangci-lint v1.33.0 - github.com/katbyte/terrafmt v0.2.1-0.20200913185704-5ff4421407b4 - github.com/pavius/impi v0.0.3 // indirect - github.com/terraform-linters/tflint v0.20.3 ->>>>>>> 9c419a56f (Updating tools) ) replace github.com/katbyte/terrafmt => github.com/gdavison/terrafmt v0.3.1-0.20210204054728-84242796be99 From c6345fab946f2d0cfa957dc1ec30080f51e59124 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 13:40:24 +0300 Subject: [PATCH 05/14] refactor PR --- aws/fsx.go | 72 ++++++++++ aws/resource_aws_fsx_windows_file_system.go | 130 ++++++++++-------- ...source_aws_fsx_windows_file_system_test.go | 30 ++-- 3 files changed, 161 insertions(+), 71 deletions(-) diff --git a/aws/fsx.go b/aws/fsx.go index 73afe902a41..faf6dcce2e8 100644 --- a/aws/fsx.go +++ b/aws/fsx.go @@ -8,6 +8,11 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) +const ( + fsxWindowsFileSystemAliasAvailable = 10 * time.Minute + fsxWindowsFileSystemAliasDeleted = 10 * time.Minute +) + func describeFsxFileSystem(conn *fsx.FSx, id string) (*fsx.FileSystem, error) { input := &fsx.DescribeFileSystemsInput{ FileSystemIds: []*string{aws.String(id)}, @@ -48,6 +53,45 @@ func refreshFsxFileSystemLifecycle(conn *fsx.FSx, id string) resource.StateRefre } } +func refreshFsxWindowsFileSystemAliasLifecycle(conn *fsx.FSx, id, aliasName string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + filesystem, err := describeFsxFileSystem(conn, id) + + if isAWSErr(err, fsx.ErrCodeFileSystemNotFound, "") { + return nil, "", nil + } + + if err != nil { + return nil, "", err + } + + if filesystem == nil { + return nil, "", nil + } + + if filesystem.WindowsConfiguration == nil { + return nil, "", nil + } + + aliases := filesystem.WindowsConfiguration.Aliases + if aliases == nil { + return nil, "", nil + } + + for _, alias := range aliases { + if alias == nil { + continue + } + + if aws.StringValue(alias.Name) == aliasName { + return filesystem, aws.StringValue(alias.Lifecycle), nil + } + } + + return filesystem, "", nil + } +} + func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.FSx, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { filesystem, err := describeFsxFileSystem(conn, id) @@ -78,6 +122,34 @@ func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.F } } +func waitForFsxWindowsFileSystemAliasAvailable(conn *fsx.FSx, id, alias string) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{fsx.AliasLifecycleCreating}, + Target: []string{fsx.AliasLifecycleAvailable}, + Refresh: refreshFsxWindowsFileSystemAliasLifecycle(conn, id, alias), + Timeout: fsxWindowsFileSystemAliasAvailable, + Delay: 30 * time.Second, + } + + _, err := stateConf.WaitForState() + + return err +} + +func waitForFsxWindowsFileSystemAliasDeleted(conn *fsx.FSx, id, alias string) error { + stateConf := &resource.StateChangeConf{ + Pending: []string{fsx.AliasLifecycleAvailable, fsx.AliasLifecycleDeleting}, + Target: []string{""}, + Refresh: refreshFsxWindowsFileSystemAliasLifecycle(conn, id, alias), + Timeout: fsxWindowsFileSystemAliasDeleted, + Delay: 30 * time.Second, + } + + _, err := stateConf.WaitForState() + + return err +} + func waitForFsxFileSystemCreation(conn *fsx.FSx, id string, timeout time.Duration) error { stateConf := &resource.StateChangeConf{ Pending: []string{fsx.FileSystemLifecycleCreating}, diff --git a/aws/resource_aws_fsx_windows_file_system.go b/aws/resource_aws_fsx_windows_file_system.go index 8f1f11ca8a7..ced17dc4c90 100644 --- a/aws/resource_aws_fsx_windows_file_system.go +++ b/aws/resource_aws_fsx_windows_file_system.go @@ -51,7 +51,7 @@ func resourceAwsFsxWindowsFileSystem() *schema.Resource { Type: schema.TypeString, ValidateFunc: validation.All( validation.StringLenBetween(4, 253), - validation.StringMatch(regexp.MustCompile(`^[A-Za-z0-9]([.][A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])+$`), "must be in the fqdn format hostname.domain"), + // validation.StringMatch(regexp.MustCompile(`^[A-Za-z0-9]([.][A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])+$`), "must be in the fqdn format hostname.domain"), ), }, }, @@ -348,21 +348,21 @@ func resourceAwsFsxWindowsFileSystemUpdate(d *schema.ResourceData, meta interfac } } - if d.HasChangeExcept("tags_all") { + if d.HasChange("aliases") { + o, n := d.GetChange("aliases") + + if err := updateFsxAliases(conn, d.Id(), o.(*schema.Set), n.(*schema.Set)); err != nil { + return fmt.Errorf("error updating FSx Windows File System (%s) aliases: %w", d.Id(), err) + } + } + + if d.HasChangesExcept("tags_all", "aliases") { input := &fsx.UpdateFileSystemInput{ ClientRequestToken: aws.String(resource.UniqueId()), FileSystemId: aws.String(d.Id()), WindowsConfiguration: &fsx.UpdateFileSystemWindowsConfiguration{}, } - if d.HasChange("aliases") { - o, n := d.GetChange("aliases") - - if err := updateFsxAliases(conn, d.Get("arn").(string), o.([]*fsx.Alias), n.([]*fsx.Alias)); err != nil { - return fmt.Errorf("error updating FSx Windows File System (%s) aliases: %s", d.Get("arn").(string), err) - } - } - if d.HasChange("automatic_backup_retention_days") { input.WindowsConfiguration.AutomaticBackupRetentionDays = aws.Int64(int64(d.Get("automatic_backup_retention_days").(int))) } @@ -524,76 +524,94 @@ func resourceAwsFsxWindowsFileSystemDelete(d *schema.ResourceData, meta interfac func expandFsxAliasValues(aliases []*fsx.Alias) []*string { var alternateDNSNames []*string - for i := 0; i < len(aliases); i++ { - alternateDNSNames[i] = aliases[i].Name + for _, alias := range aliases { + aName := alias.Name + alternateDNSNames = append(alternateDNSNames, aName) } return alternateDNSNames } -func updateFsxAliases(conn *fsx.FSx, identifier string, oldAliases []*fsx.Alias, newAliases []*fsx.Alias) error { - oldAliasValues := expandFsxAliasValues(oldAliases) - newAliasValues := expandFsxAliasValues(newAliases) +func updateFsxAliases(conn *fsx.FSx, identifier string, newSet *schema.Set, oldSet *schema.Set) error { + // oldAliasValues := expandFsxAliasValues(oldAliases) + // newAliasValues := expandFsxAliasValues(newAliases) - var removedAliases []*string + // var removedAliases []*string - for _, oldAliasValue := range oldAliasValues { - exists := false + // for _, oldAliasValue := range oldAliasValues { + // exists := false - for _, newAliasValue := range newAliasValues { - if newAliasValue == oldAliasValue { - exists = true - break - } - } + // for _, newAliasValue := range newAliasValues { + // if newAliasValue == oldAliasValue { + // exists = true + // break + // } + // } - if !exists { - removedAliases = append(removedAliases, oldAliasValue) - } - } + // if !exists { + // removedAliases = append(removedAliases, oldAliasValue) + // } + // } - if len(removedAliases) > 0 { - input := &fsx.DisassociateFileSystemAliasesInput{ - FileSystemId: aws.String(identifier), - Aliases: removedAliases, - } + if newSet.Len() > 0 { + if newAliases := newSet.Difference(oldSet); newAliases.Len() > 0 { - _, err := conn.DisassociateFileSystemAliases(input) + input := &fsx.AssociateFileSystemAliasesInput{ + FileSystemId: aws.String(identifier), + Aliases: expandStringSet(newAliases), + } - if err != nil { - return fmt.Errorf("error disassociating aliases from FSx file system (%s): %w", identifier, err) + _, err := conn.AssociateFileSystemAliases(input) + + if err != nil { + return fmt.Errorf("error associating aliases to FSx file system (%s): %w", identifier, err) + } + + for _, alias := range newAliases.List() { + if err := waitForFsxWindowsFileSystemAliasAvailable(conn, identifier, alias.(string)); err != nil { + return fmt.Errorf("Error waiting for FSX Windows filesystem alias (%s) to be available: %w", identifier, err) + } + } } } - var addedAliases []*string + if oldSet.Len() > 0 { + if oldAliases := oldSet.Difference(newSet); oldAliases.Len() > 0 { + input := &fsx.DisassociateFileSystemAliasesInput{ + FileSystemId: aws.String(identifier), + Aliases: expandStringSet(oldAliases), + } - for _, newAliasValue := range newAliasValues { - exists := false + _, err := conn.DisassociateFileSystemAliases(input) - for _, oldAliasValue := range oldAliasValues { - if oldAliasValue == newAliasValue { - exists = true - break + if err != nil { + return fmt.Errorf("error disassociating aliases from FSx file system (%s): %w", identifier, err) } - } - if !exists { - addedAliases = append(addedAliases, newAliasValue) + for _, alias := range oldAliases.List() { + if err := waitForFsxWindowsFileSystemAliasDeleted(conn, identifier, alias.(string)); err != nil { + return fmt.Errorf("Error waiting for FSX Windows filesystem alias (%s) to delete: %w", identifier, err) + } + } } } - if len(addedAliases) > 0 { - input := &fsx.AssociateFileSystemAliasesInput{ - FileSystemId: aws.String(identifier), - Aliases: addedAliases, - } + // var addedAliases []*string - _, err := conn.AssociateFileSystemAliases(input) + // for _, newAliasValue := range newAliasValues { + // exists := false - if err != nil { - return fmt.Errorf("error associating aliases to FSx file system (%s): %w", identifier, err) - } - } + // for _, oldAliasValue := range oldAliasValues { + // if oldAliasValue == newAliasValue { + // exists = true + // break + // } + // } + + // if !exists { + // addedAliases = append(addedAliases, newAliasValue) + // } + // } return nil } diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index 9feae003698..44493c61138 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -276,7 +276,7 @@ func TestAccAWSFsxWindowsFileSystem_disappears(t *testing.T) { }) } -func TestAccAWSFsxWindowsFileSystem_Aliases(t *testing.T) { +func TestAccAWSFsxWindowsFileSystem_aliases(t *testing.T) { var filesystem1, filesystem2, filesystem3 fsx.FileSystem resourceName := "aws_fsx_windows_file_system.test" @@ -286,11 +286,11 @@ func TestAccAWSFsxWindowsFileSystem_Aliases(t *testing.T) { CheckDestroy: testAccCheckFsxWindowsFileSystemDestroy, Steps: []resource.TestStep{ { - Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem1.domain.name.com"), + Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem1.example.com"), Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem1), resource.TestCheckResourceAttr(resourceName, "aliases.#", "1"), - resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem1.domain.name.com"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem1.example.com"), ), }, { @@ -303,22 +303,22 @@ func TestAccAWSFsxWindowsFileSystem_Aliases(t *testing.T) { }, }, { - Config: testAccAwsFsxWindowsFileSystemConfigAliases2("filesystem1.domain.name.com", "filesystem2.domain.name.com"), + Config: testAccAwsFsxWindowsFileSystemConfigAliases2("filesystem2.example.com", "filesystem3.example.com"), Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem2), testAccCheckFsxWindowsFileSystemNotRecreated(&filesystem1, &filesystem2), resource.TestCheckResourceAttr(resourceName, "aliases.#", "2"), - resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem1.domain.name.com"), - resource.TestCheckResourceAttr(resourceName, "aliases.1", "filesystem2.domain.name.com"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem2.example.com"), + resource.TestCheckResourceAttr(resourceName, "aliases.1", "filesystem3.example.com"), ), }, { - Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem2.domain.name.com"), + Config: testAccAwsFsxWindowsFileSystemConfigAliases1("filesystem3.example.com"), Check: resource.ComposeTestCheckFunc( testAccCheckFsxWindowsFileSystemExists(resourceName, &filesystem3), testAccCheckFsxWindowsFileSystemNotRecreated(&filesystem2, &filesystem3), resource.TestCheckResourceAttr(resourceName, "aliases.#", "1"), - resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem2.domain.name.com"), + resource.TestCheckResourceAttr(resourceName, "aliases.0", "filesystem3.example.com"), ), }, }, @@ -914,12 +914,12 @@ resource "aws_directory_service_directory" "test" { } func testAccAwsFsxWindowsFileSystemConfigAliases1(alias1 string) string { - return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` + return fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { - active_directory_id = aws_directory_service_directory.test.id + active_directory_id = "d-92677185a7" skip_final_backup = true storage_capacity = 32 - subnet_ids = [aws_subnet.test1.id] + subnet_ids = ["subnet-060ab259c291fa28c"] throughput_capacity = 8 aliases = [ @@ -930,16 +930,16 @@ resource "aws_fsx_windows_file_system" "test" { } func testAccAwsFsxWindowsFileSystemConfigAliases2(alias1, alias2 string) string { - return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` + return fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { - active_directory_id = aws_directory_service_directory.test.id + active_directory_id = "d-92677185a7" skip_final_backup = true storage_capacity = 32 - subnet_ids = [aws_subnet.test1.id] + subnet_ids = ["subnet-060ab259c291fa28c"] throughput_capacity = 8 aliases = [ - %[1]q + %[1]q, %[2]q ] } From 15fe05ff273c21d5ce4caa8f52c1391c283473f6 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 13:43:30 +0300 Subject: [PATCH 06/14] changelog --- .changelog/20054.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/20054.txt diff --git a/.changelog/20054.txt b/.changelog/20054.txt new file mode 100644 index 00000000000..17613fbece0 --- /dev/null +++ b/.changelog/20054.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/fsx_windows_file_system: Add `aliases` argument. +``` From b19fd347424ccb3db1a6a67630e7bc1172f1643e Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 13:46:16 +0300 Subject: [PATCH 07/14] docs --- website/docs/r/fsx_windows_file_system.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/r/fsx_windows_file_system.html.markdown b/website/docs/r/fsx_windows_file_system.html.markdown index 4378b897041..8498466b874 100644 --- a/website/docs/r/fsx_windows_file_system.html.markdown +++ b/website/docs/r/fsx_windows_file_system.html.markdown @@ -56,6 +56,7 @@ The following arguments are supported: * `subnet_ids` - (Required) A list of IDs for the subnets that the file system will be accessible from. To specify more than a single subnet set `deployment_type` to `MULTI_AZ_1`. * `throughput_capacity` - (Required) Throughput (megabytes per second) of the file system in power of 2 increments. Minimum of `8` and maximum of `2048`. * `active_directory_id` - (Optional) The ID for an existing Microsoft Active Directory instance that the file system should join when it's created. Cannot be specified with `self_managed_active_directory`. +* `aliases` - (Optional) An array DNS alias names that you want to associate with the Amazon FSx file system. For more information, see [Working with DNS Aliases](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/managing-dns-aliases.html) * `automatic_backup_retention_days` - (Optional) The number of days to retain automatic backups. Minimum of `0` and maximum of `90`. Defaults to `7`. Set to `0` to disable. * `copy_tags_to_backups` - (Optional) A boolean flag indicating whether tags on the file system should be copied to backups. Defaults to `false`. * `daily_automatic_backup_start_time` - (Optional) The preferred time (in `HH:MM` format) to take daily automatic backups, in the UTC time zone. From 321819037b8db314d4dae84e4ee4c5d6b101cd64 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 13:47:56 +0300 Subject: [PATCH 08/14] fmt --- aws/resource_aws_fsx_windows_file_system_test.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index 44493c61138..87f3b1fac64 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -922,9 +922,7 @@ resource "aws_fsx_windows_file_system" "test" { subnet_ids = ["subnet-060ab259c291fa28c"] throughput_capacity = 8 - aliases = [ - %[1]q - ] + aliases = [%[1]q] } `, alias1) } @@ -938,10 +936,7 @@ resource "aws_fsx_windows_file_system" "test" { subnet_ids = ["subnet-060ab259c291fa28c"] throughput_capacity = 8 - aliases = [ - %[1]q, - %[2]q - ] + aliases = [%[1]q, %[2]q] } `, alias1, alias2) } From d3ecd65b58533856e88f2b222184ffed762af20c Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 14:08:20 +0300 Subject: [PATCH 09/14] fix diff --- aws/resource_aws_fsx_windows_file_system.go | 43 ++----------------- ...source_aws_fsx_windows_file_system_test.go | 1 + 2 files changed, 4 insertions(+), 40 deletions(-) diff --git a/aws/resource_aws_fsx_windows_file_system.go b/aws/resource_aws_fsx_windows_file_system.go index ced17dc4c90..eb7eda3011f 100644 --- a/aws/resource_aws_fsx_windows_file_system.go +++ b/aws/resource_aws_fsx_windows_file_system.go @@ -532,27 +532,7 @@ func expandFsxAliasValues(aliases []*fsx.Alias) []*string { return alternateDNSNames } -func updateFsxAliases(conn *fsx.FSx, identifier string, newSet *schema.Set, oldSet *schema.Set) error { - // oldAliasValues := expandFsxAliasValues(oldAliases) - // newAliasValues := expandFsxAliasValues(newAliases) - - // var removedAliases []*string - - // for _, oldAliasValue := range oldAliasValues { - // exists := false - - // for _, newAliasValue := range newAliasValues { - // if newAliasValue == oldAliasValue { - // exists = true - // break - // } - // } - - // if !exists { - // removedAliases = append(removedAliases, oldAliasValue) - // } - // } - +func updateFsxAliases(conn *fsx.FSx, identifier string, oldSet *schema.Set, newSet *schema.Set) error { if newSet.Len() > 0 { if newAliases := newSet.Difference(oldSet); newAliases.Len() > 0 { @@ -569,7 +549,7 @@ func updateFsxAliases(conn *fsx.FSx, identifier string, newSet *schema.Set, oldS for _, alias := range newAliases.List() { if err := waitForFsxWindowsFileSystemAliasAvailable(conn, identifier, alias.(string)); err != nil { - return fmt.Errorf("Error waiting for FSX Windows filesystem alias (%s) to be available: %w", identifier, err) + return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias (%s) to be available: %w", identifier, alias.(string), err) } } } @@ -590,29 +570,12 @@ func updateFsxAliases(conn *fsx.FSx, identifier string, newSet *schema.Set, oldS for _, alias := range oldAliases.List() { if err := waitForFsxWindowsFileSystemAliasDeleted(conn, identifier, alias.(string)); err != nil { - return fmt.Errorf("Error waiting for FSX Windows filesystem alias (%s) to delete: %w", identifier, err) + return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias (%s) to delete: %w", identifier, alias.(string), err) } } } } - // var addedAliases []*string - - // for _, newAliasValue := range newAliasValues { - // exists := false - - // for _, oldAliasValue := range oldAliasValues { - // if oldAliasValue == newAliasValue { - // exists = true - // break - // } - // } - - // if !exists { - // addedAliases = append(addedAliases, newAliasValue) - // } - // } - return nil } diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index 87f3b1fac64..99e8bbd9863 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -282,6 +282,7 @@ func TestAccAWSFsxWindowsFileSystem_aliases(t *testing.T) { resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t); testAccPartitionHasServicePreCheck(fsx.EndpointsID, t) }, + ErrorCheck: testAccErrorCheck(t, fsx.EndpointsID), Providers: testAccProviders, CheckDestroy: testAccCheckFsxWindowsFileSystemDestroy, Steps: []resource.TestStep{ From 1d20f54c376f026aa7f44661790ec06807ea5d98 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 15:16:34 +0300 Subject: [PATCH 10/14] use admin action waiter --- aws/fsx.go | 80 ++------------------- aws/resource_aws_fsx_windows_file_system.go | 18 ++--- 2 files changed, 11 insertions(+), 87 deletions(-) diff --git a/aws/fsx.go b/aws/fsx.go index faf6dcce2e8..7aa5d989698 100644 --- a/aws/fsx.go +++ b/aws/fsx.go @@ -8,11 +8,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -const ( - fsxWindowsFileSystemAliasAvailable = 10 * time.Minute - fsxWindowsFileSystemAliasDeleted = 10 * time.Minute -) - func describeFsxFileSystem(conn *fsx.FSx, id string) (*fsx.FileSystem, error) { input := &fsx.DescribeFileSystemsInput{ FileSystemIds: []*string{aws.String(id)}, @@ -53,46 +48,7 @@ func refreshFsxFileSystemLifecycle(conn *fsx.FSx, id string) resource.StateRefre } } -func refreshFsxWindowsFileSystemAliasLifecycle(conn *fsx.FSx, id, aliasName string) resource.StateRefreshFunc { - return func() (interface{}, string, error) { - filesystem, err := describeFsxFileSystem(conn, id) - - if isAWSErr(err, fsx.ErrCodeFileSystemNotFound, "") { - return nil, "", nil - } - - if err != nil { - return nil, "", err - } - - if filesystem == nil { - return nil, "", nil - } - - if filesystem.WindowsConfiguration == nil { - return nil, "", nil - } - - aliases := filesystem.WindowsConfiguration.Aliases - if aliases == nil { - return nil, "", nil - } - - for _, alias := range aliases { - if alias == nil { - continue - } - - if aws.StringValue(alias.Name) == aliasName { - return filesystem, aws.StringValue(alias.Lifecycle), nil - } - } - - return filesystem, "", nil - } -} - -func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.FSx, id string) resource.StateRefreshFunc { +func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.FSx, id, action string) resource.StateRefreshFunc { return func() (interface{}, string, error) { filesystem, err := describeFsxFileSystem(conn, id) @@ -113,7 +69,7 @@ func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.F continue } - if aws.StringValue(administrativeAction.AdministrativeActionType) == fsx.AdministrativeActionTypeFileSystemUpdate { + if aws.StringValue(administrativeAction.AdministrativeActionType) == action { return filesystem, aws.StringValue(administrativeAction.Status), nil } } @@ -122,34 +78,6 @@ func refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn *fsx.F } } -func waitForFsxWindowsFileSystemAliasAvailable(conn *fsx.FSx, id, alias string) error { - stateConf := &resource.StateChangeConf{ - Pending: []string{fsx.AliasLifecycleCreating}, - Target: []string{fsx.AliasLifecycleAvailable}, - Refresh: refreshFsxWindowsFileSystemAliasLifecycle(conn, id, alias), - Timeout: fsxWindowsFileSystemAliasAvailable, - Delay: 30 * time.Second, - } - - _, err := stateConf.WaitForState() - - return err -} - -func waitForFsxWindowsFileSystemAliasDeleted(conn *fsx.FSx, id, alias string) error { - stateConf := &resource.StateChangeConf{ - Pending: []string{fsx.AliasLifecycleAvailable, fsx.AliasLifecycleDeleting}, - Target: []string{""}, - Refresh: refreshFsxWindowsFileSystemAliasLifecycle(conn, id, alias), - Timeout: fsxWindowsFileSystemAliasDeleted, - Delay: 30 * time.Second, - } - - _, err := stateConf.WaitForState() - - return err -} - func waitForFsxFileSystemCreation(conn *fsx.FSx, id string, timeout time.Duration) error { stateConf := &resource.StateChangeConf{ Pending: []string{fsx.FileSystemLifecycleCreating}, @@ -192,7 +120,7 @@ func waitForFsxFileSystemUpdate(conn *fsx.FSx, id string, timeout time.Duration) return err } -func waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn *fsx.FSx, id string, timeout time.Duration) error { +func waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn *fsx.FSx, id, action string, timeout time.Duration) error { stateConf := &resource.StateChangeConf{ Pending: []string{ fsx.StatusInProgress, @@ -202,7 +130,7 @@ func waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn fsx.StatusCompleted, fsx.StatusUpdatedOptimizing, }, - Refresh: refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn, id), + Refresh: refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn, id, action), Timeout: timeout, Delay: 30 * time.Second, } diff --git a/aws/resource_aws_fsx_windows_file_system.go b/aws/resource_aws_fsx_windows_file_system.go index eb7eda3011f..fb9df280df4 100644 --- a/aws/resource_aws_fsx_windows_file_system.go +++ b/aws/resource_aws_fsx_windows_file_system.go @@ -351,7 +351,7 @@ func resourceAwsFsxWindowsFileSystemUpdate(d *schema.ResourceData, meta interfac if d.HasChange("aliases") { o, n := d.GetChange("aliases") - if err := updateFsxAliases(conn, d.Id(), o.(*schema.Set), n.(*schema.Set)); err != nil { + if err := updateFsxAliases(conn, d.Id(), o.(*schema.Set), n.(*schema.Set), d.Timeout(schema.TimeoutUpdate)); err != nil { return fmt.Errorf("error updating FSx Windows File System (%s) aliases: %w", d.Id(), err) } } @@ -397,7 +397,7 @@ func resourceAwsFsxWindowsFileSystemUpdate(d *schema.ResourceData, meta interfac return fmt.Errorf("error updating FSx Windows File System (%s): %w", d.Id(), err) } - if err := waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn, d.Id(), d.Timeout(schema.TimeoutUpdate)); err != nil { + if err := waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn, d.Id(), fsx.AdministrativeActionTypeFileSystemUpdate, d.Timeout(schema.TimeoutUpdate)); err != nil { return fmt.Errorf("error waiting for FSx Windows File System (%s) update: %w", d.Id(), err) } } @@ -532,7 +532,7 @@ func expandFsxAliasValues(aliases []*fsx.Alias) []*string { return alternateDNSNames } -func updateFsxAliases(conn *fsx.FSx, identifier string, oldSet *schema.Set, newSet *schema.Set) error { +func updateFsxAliases(conn *fsx.FSx, identifier string, oldSet *schema.Set, newSet *schema.Set, timeout time.Duration) error { if newSet.Len() > 0 { if newAliases := newSet.Difference(oldSet); newAliases.Len() > 0 { @@ -547,10 +547,8 @@ func updateFsxAliases(conn *fsx.FSx, identifier string, oldSet *schema.Set, newS return fmt.Errorf("error associating aliases to FSx file system (%s): %w", identifier, err) } - for _, alias := range newAliases.List() { - if err := waitForFsxWindowsFileSystemAliasAvailable(conn, identifier, alias.(string)); err != nil { - return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias (%s) to be available: %w", identifier, alias.(string), err) - } + if err := waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn, identifier, fsx.AdministrativeActionTypeFileSystemAliasAssociation, timeout); err != nil { + return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias to be associated: %w", identifier, err) } } } @@ -568,10 +566,8 @@ func updateFsxAliases(conn *fsx.FSx, identifier string, oldSet *schema.Set, newS return fmt.Errorf("error disassociating aliases from FSx file system (%s): %w", identifier, err) } - for _, alias := range oldAliases.List() { - if err := waitForFsxWindowsFileSystemAliasDeleted(conn, identifier, alias.(string)); err != nil { - return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias (%s) to delete: %w", identifier, alias.(string), err) - } + if err := waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn, identifier, fsx.AdministrativeActionTypeFileSystemAliasDisassociation, timeout); err != nil { + return fmt.Errorf("Error waiting for FSX Windows filesystem (%s) alias to disassociated: %w", identifier, err) } } } From 8ff6dfe816cf526d722af6668bd825e03a66d1b5 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 15:17:58 +0300 Subject: [PATCH 11/14] revert local changes --- aws/resource_aws_fsx_windows_file_system_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index 99e8bbd9863..a6d83d327a7 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -915,12 +915,12 @@ resource "aws_directory_service_directory" "test" { } func testAccAwsFsxWindowsFileSystemConfigAliases1(alias1 string) string { - return fmt.Sprintf(` + return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { - active_directory_id = "d-92677185a7" + active_directory_id = aws_directory_service_directory.test.id skip_final_backup = true storage_capacity = 32 - subnet_ids = ["subnet-060ab259c291fa28c"] + subnet_ids = [aws_subnet.test1.id] throughput_capacity = 8 aliases = [%[1]q] @@ -929,12 +929,12 @@ resource "aws_fsx_windows_file_system" "test" { } func testAccAwsFsxWindowsFileSystemConfigAliases2(alias1, alias2 string) string { - return fmt.Sprintf(` + return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { - active_directory_id = "d-92677185a7" + active_directory_id = aws_directory_service_directory.test.id skip_final_backup = true storage_capacity = 32 - subnet_ids = ["subnet-060ab259c291fa28c"] + subnet_ids = [aws_subnet.test1.id] throughput_capacity = 8 aliases = [%[1]q, %[2]q] From e8dc87fa890058af2adbad3267f3caf25f3eafe1 Mon Sep 17 00:00:00 2001 From: drfaust92 Date: Fri, 2 Jul 2021 15:25:46 +0300 Subject: [PATCH 12/14] fmt --- aws/resource_aws_fsx_windows_file_system_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws/resource_aws_fsx_windows_file_system_test.go b/aws/resource_aws_fsx_windows_file_system_test.go index a6d83d327a7..f64f2852c64 100644 --- a/aws/resource_aws_fsx_windows_file_system_test.go +++ b/aws/resource_aws_fsx_windows_file_system_test.go @@ -917,7 +917,7 @@ resource "aws_directory_service_directory" "test" { func testAccAwsFsxWindowsFileSystemConfigAliases1(alias1 string) string { return testAccAwsFsxWindowsFileSystemConfigBase() + fmt.Sprintf(` resource "aws_fsx_windows_file_system" "test" { - active_directory_id = aws_directory_service_directory.test.id + active_directory_id = aws_directory_service_directory.test.id skip_final_backup = true storage_capacity = 32 subnet_ids = [aws_subnet.test1.id] From 1914930b037d0d275abd7f099f4c92af55a7c543 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 9 Jul 2021 11:41:17 -0400 Subject: [PATCH 13/14] r/aws_directory_service_directory: Add and use internal finder and waiter packages. --- .../service/directoryservice/finder/finder.go | 48 ++++++++++ .../service/directoryservice/waiter/status.go | 25 +++++ .../service/directoryservice/waiter/waiter.go | 54 +++++++++++ ...esource_aws_directory_service_directory.go | 93 ++++--------------- 4 files changed, 143 insertions(+), 77 deletions(-) create mode 100644 aws/internal/service/directoryservice/finder/finder.go create mode 100644 aws/internal/service/directoryservice/waiter/status.go create mode 100644 aws/internal/service/directoryservice/waiter/waiter.go diff --git a/aws/internal/service/directoryservice/finder/finder.go b/aws/internal/service/directoryservice/finder/finder.go new file mode 100644 index 00000000000..3ce7a870786 --- /dev/null +++ b/aws/internal/service/directoryservice/finder/finder.go @@ -0,0 +1,48 @@ +package finder + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/directoryservice" + "github.com/hashicorp/aws-sdk-go-base/tfawserr" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func DirectoryByID(conn *directoryservice.DirectoryService, id string) (*directoryservice.DirectoryDescription, error) { + input := &directoryservice.DescribeDirectoriesInput{ + DirectoryIds: aws.StringSlice([]string{id}), + } + + output, err := conn.DescribeDirectories(input) + + if tfawserr.ErrCodeEquals(err, directoryservice.ErrCodeEntityDoesNotExistException) { + return nil, &resource.NotFoundError{ + LastError: err, + LastRequest: input, + } + } + + if err != nil { + return nil, err + } + + if output == nil || len(output.DirectoryDescriptions) == 0 || output.DirectoryDescriptions[0] == nil { + return nil, &resource.NotFoundError{ + Message: "Empty result", + LastRequest: input, + } + } + + // TODO Check for multiple results. + // TODO https://github.com/hashicorp/terraform-provider-aws/pull/17613. + + directory := output.DirectoryDescriptions[0] + + if stage := aws.StringValue(directory.Stage); stage == directoryservice.DirectoryStageDeleted { + return nil, &resource.NotFoundError{ + Message: stage, + LastRequest: input, + } + } + + return directory, nil +} diff --git a/aws/internal/service/directoryservice/waiter/status.go b/aws/internal/service/directoryservice/waiter/status.go new file mode 100644 index 00000000000..7f6796238b2 --- /dev/null +++ b/aws/internal/service/directoryservice/waiter/status.go @@ -0,0 +1,25 @@ +package waiter + +import ( + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/directoryservice" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/directoryservice/finder" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" +) + +func DirectoryStage(conn *directoryservice.DirectoryService, id string) resource.StateRefreshFunc { + return func() (interface{}, string, error) { + output, err := finder.DirectoryByID(conn, id) + + if tfresource.NotFound(err) { + return nil, "", nil + } + + if err != nil { + return nil, "", err + } + + return output, aws.StringValue(output.Stage), nil + } +} diff --git a/aws/internal/service/directoryservice/waiter/waiter.go b/aws/internal/service/directoryservice/waiter/waiter.go new file mode 100644 index 00000000000..47ad07a5606 --- /dev/null +++ b/aws/internal/service/directoryservice/waiter/waiter.go @@ -0,0 +1,54 @@ +package waiter + +import ( + "errors" + "time" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/service/directoryservice" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" +) + +const ( + DirectoryCreatedTimeout = 60 * time.Minute + DirectoryDeletedTimeout = 60 * time.Minute +) + +func DirectoryCreated(conn *directoryservice.DirectoryService, id string) (*directoryservice.DirectoryDescription, error) { + stateConf := &resource.StateChangeConf{ + Pending: []string{directoryservice.DirectoryStageRequested, directoryservice.DirectoryStageCreating, directoryservice.DirectoryStageCreated}, + Target: []string{directoryservice.DirectoryStageActive}, + Refresh: DirectoryStage(conn, id), + Timeout: DirectoryCreatedTimeout, + } + + outputRaw, err := stateConf.WaitForState() + + if output, ok := outputRaw.(*directoryservice.DirectoryDescription); ok { + tfresource.SetLastError(err, errors.New(aws.StringValue(output.StageReason))) + + return output, err + } + + return nil, err +} + +func DirectoryDeleted(conn *directoryservice.DirectoryService, id string) (*directoryservice.DirectoryDescription, error) { + stateConf := &resource.StateChangeConf{ + Pending: []string{directoryservice.DirectoryStageActive, directoryservice.DirectoryStageDeleting}, + Target: []string{}, + Refresh: DirectoryStage(conn, id), + Timeout: DirectoryDeletedTimeout, + } + + outputRaw, err := stateConf.WaitForState() + + if output, ok := outputRaw.(*directoryservice.DirectoryDescription); ok { + tfresource.SetLastError(err, errors.New(aws.StringValue(output.StageReason))) + + return output, err + } + + return nil, err +} diff --git a/aws/resource_aws_directory_service_directory.go b/aws/resource_aws_directory_service_directory.go index ca74e62535e..ba64d803008 100644 --- a/aws/resource_aws_directory_service_directory.go +++ b/aws/resource_aws_directory_service_directory.go @@ -3,15 +3,16 @@ package aws import ( "fmt" "log" - "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/directoryservice" "github.com/hashicorp/aws-sdk-go-base/tfawserr" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/directoryservice/finder" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/service/directoryservice/waiter" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func resourceAwsDirectoryServiceDirectory() *schema.Resource { @@ -387,35 +388,10 @@ func resourceAwsDirectoryServiceDirectoryCreate(d *schema.ResourceData, meta int d.SetId(directoryId) - // Wait for creation - log.Printf("[DEBUG] Waiting for DS (%q) to become available", d.Id()) - stateConf := &resource.StateChangeConf{ - Pending: []string{ - directoryservice.DirectoryStageRequested, - directoryservice.DirectoryStageCreating, - directoryservice.DirectoryStageCreated, - }, - Target: []string{directoryservice.DirectoryStageActive}, - Refresh: func() (interface{}, string, error) { - resp, err := dsconn.DescribeDirectories(&directoryservice.DescribeDirectoriesInput{ - DirectoryIds: []*string{aws.String(d.Id())}, - }) - if err != nil { - log.Printf("Error during creation of DS: %q", err.Error()) - return nil, "", err - } - - ds := resp.DirectoryDescriptions[0] - log.Printf("[DEBUG] Creation of DS %q is in following stage: %q.", - d.Id(), *ds.Stage) - return ds, *ds.Stage, nil - }, - Timeout: 60 * time.Minute, - } - if _, err := stateConf.WaitForState(); err != nil { - return fmt.Errorf( - "Error waiting for Directory Service (%s) to become available: %s", - d.Id(), err) + _, err = waiter.DirectoryCreated(dsconn, d.Id()) + + if err != nil { + return fmt.Errorf("error waiting for Directory Service Directory (%s) to create: %w", d.Id(), err) } if v, ok := d.GetOk("alias"); ok { @@ -468,22 +444,18 @@ func resourceAwsDirectoryServiceDirectoryRead(d *schema.ResourceData, meta inter defaultTagsConfig := meta.(*AWSClient).DefaultTagsConfig ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig - input := directoryservice.DescribeDirectoriesInput{ - DirectoryIds: []*string{aws.String(d.Id())}, - } - out, err := dsconn.DescribeDirectories(&input) - if err != nil { - return err - - } + dir, err := finder.DirectoryByID(dsconn, d.Id()) - if len(out.DirectoryDescriptions) == 0 { - log.Printf("[WARN] Directory %s not found", d.Id()) + if !d.IsNewResource() && tfresource.NotFound(err) { + log.Printf("[WARN] Directory Service Directory (%s) not found, removing from state", d.Id()) d.SetId("") return nil } - dir := out.DirectoryDescriptions[0] + if err != nil { + return fmt.Errorf("error reading Directory Service Directory (%s): %w", d.Id(), err) + } + log.Printf("[DEBUG] Received DS directory: %s", dir) d.Set("access_url", dir.AccessUrl) @@ -554,44 +526,11 @@ func resourceAwsDirectoryServiceDirectoryDelete(d *schema.ResourceData, meta int return fmt.Errorf("error deleting Directory Service Directory (%s): %w", d.Id(), err) } - err = waitForDirectoryServiceDirectoryDeletion(conn, d.Id()) + _, err = waiter.DirectoryDeleted(conn, d.Id()) if err != nil { - return fmt.Errorf("error waiting for Directory Service (%s) to be deleted: %w", d.Id(), err) + return fmt.Errorf("error waiting for Directory Service Directory (%s) to delete: %w", d.Id(), err) } return nil } - -func waitForDirectoryServiceDirectoryDeletion(conn *directoryservice.DirectoryService, directoryID string) error { - stateConf := &resource.StateChangeConf{ - Pending: []string{ - directoryservice.DirectoryStageActive, - directoryservice.DirectoryStageDeleting, - }, - Target: []string{directoryservice.DirectoryStageDeleted}, - Refresh: func() (interface{}, string, error) { - resp, err := conn.DescribeDirectories(&directoryservice.DescribeDirectoriesInput{ - DirectoryIds: []*string{aws.String(directoryID)}, - }) - if err != nil { - if isAWSErr(err, directoryservice.ErrCodeEntityDoesNotExistException, "") { - return 42, directoryservice.DirectoryStageDeleted, nil - } - return nil, "error", err - } - - if len(resp.DirectoryDescriptions) == 0 || resp.DirectoryDescriptions[0] == nil { - return 42, directoryservice.DirectoryStageDeleted, nil - } - - ds := resp.DirectoryDescriptions[0] - log.Printf("[DEBUG] Deletion of Directory Service Directory %q is in following stage: %q.", directoryID, aws.StringValue(ds.Stage)) - return ds, aws.StringValue(ds.Stage), nil - }, - Timeout: 60 * time.Minute, - } - _, err := stateConf.WaitForState() - - return err -} From e2fb6ed3e0b30495f1dfa5e2887218f6d91951c2 Mon Sep 17 00:00:00 2001 From: Kit Ewbank Date: Fri, 9 Jul 2021 13:49:37 -0400 Subject: [PATCH 14/14] Report any FailureDetails. --- aws/fsx.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/aws/fsx.go b/aws/fsx.go index 7aa5d989698..9e4cc968e8a 100644 --- a/aws/fsx.go +++ b/aws/fsx.go @@ -1,11 +1,13 @@ package aws import ( + "errors" "time" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/fsx" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/tfresource" ) func describeFsxFileSystem(conn *fsx.FSx, id string) (*fsx.FileSystem, error) { @@ -87,7 +89,13 @@ func waitForFsxFileSystemCreation(conn *fsx.FSx, id string, timeout time.Duratio Delay: 30 * time.Second, } - _, err := stateConf.WaitForState() + outputRaw, err := stateConf.WaitForState() + + if output, ok := outputRaw.(*fsx.FileSystem); ok { + if output.FailureDetails != nil { + tfresource.SetLastError(err, errors.New(aws.StringValue(output.FailureDetails.Message))) + } + } return err } @@ -101,7 +109,13 @@ func waitForFsxFileSystemDeletion(conn *fsx.FSx, id string, timeout time.Duratio Delay: 30 * time.Second, } - _, err := stateConf.WaitForState() + outputRaw, err := stateConf.WaitForState() + + if output, ok := outputRaw.(*fsx.FileSystem); ok { + if output.FailureDetails != nil { + tfresource.SetLastError(err, errors.New(aws.StringValue(output.FailureDetails.Message))) + } + } return err }