Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

r/fsx_windows_filesystem - support aliases #20054

Merged
merged 14 commits into from
Jul 9, 2021
3 changes: 3 additions & 0 deletions .changelog/20054.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
resource/fsx_windows_file_system: Add `aliases` argument.
```
26 changes: 20 additions & 6 deletions aws/fsx.go
Original file line number Diff line number Diff line change
@@ -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) {
Expand Down Expand Up @@ -48,7 +50,7 @@ func refreshFsxFileSystemLifecycle(conn *fsx.FSx, id string) resource.StateRefre
}
}

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)

Expand All @@ -69,7 +71,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
}
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -120,7 +134,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,
Expand All @@ -130,7 +144,7 @@ func waitForFsxFileSystemUpdateAdministrativeActionsStatusFileSystemUpdate(conn
fsx.StatusCompleted,
fsx.StatusUpdatedOptimizing,
},
Refresh: refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn, id),
Refresh: refreshFsxFileSystemAdministrativeActionsStatusFileSystemUpdate(conn, id, action),
Timeout: timeout,
Delay: 30 * time.Second,
}
Expand Down
48 changes: 48 additions & 0 deletions aws/internal/service/directoryservice/finder/finder.go
Original file line number Diff line number Diff line change
@@ -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
}
25 changes: 25 additions & 0 deletions aws/internal/service/directoryservice/waiter/status.go
Original file line number Diff line number Diff line change
@@ -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
}
}
54 changes: 54 additions & 0 deletions aws/internal/service/directoryservice/waiter/waiter.go
Original file line number Diff line number Diff line change
@@ -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
}
93 changes: 16 additions & 77 deletions aws/resource_aws_directory_service_directory.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
}
Loading