Skip to content

Commit

Permalink
Merge pull request #20054 from DrFaust92/r/fsx_win_alias
Browse files Browse the repository at this point in the history
r/fsx_windows_filesystem - support `aliases`
  • Loading branch information
ewbankkit authored Jul 9, 2021
2 parents 7a3e7ed + e2fb6ed commit fdceca8
Show file tree
Hide file tree
Showing 9 changed files with 332 additions and 85 deletions.
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

0 comments on commit fdceca8

Please sign in to comment.