Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions aws/internal/service/directoryservice/finder/finder.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package finder

import (
"context"
"fmt"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/directoryservice"
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
Expand Down Expand Up @@ -46,3 +49,26 @@ func DirectoryByID(conn *directoryservice.DirectoryService, id string) (*directo

return directory, nil
}

func ShareDirectoryByID(ctx context.Context, conn *directoryservice.DirectoryService, directoryID, sharedDirectoryID string) (*directoryservice.SharedDirectory, error) {
input := &directoryservice.DescribeSharedDirectoriesInput{
SharedDirectoryIds: aws.StringSlice([]string{sharedDirectoryID}),
OwnerDirectoryId: aws.String(directoryID),
}

output, err := conn.DescribeSharedDirectoriesWithContext(ctx, input)
if err != nil {
return nil, err
}

var directory *directoryservice.SharedDirectory
if len(output.SharedDirectories) > 1 {
return nil, fmt.Errorf("[ERROR] got more than one shared directory with the shared id: %s and directory id: %s", sharedDirectoryID, directoryID)
}

if len(output.SharedDirectories) == 1 {
directory = output.SharedDirectories[0]
}

return directory, nil
}
18 changes: 18 additions & 0 deletions aws/internal/service/directoryservice/waiter/status.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package waiter

import (
"context"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/directoryservice"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand All @@ -23,3 +25,19 @@ func DirectoryStage(conn *directoryservice.DirectoryService, id string) resource
return output, aws.StringValue(output.Stage), nil
}
}

func ShareDirectoryStatus(ctx context.Context, conn *directoryservice.DirectoryService, directoryID, sharedDirectoryID string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
output, err := finder.ShareDirectoryByID(ctx, conn, directoryID, sharedDirectoryID)

if err != nil {
return nil, "", err
}

if output == nil {
return output, directoryservice.ShareStatusDeleted, nil
}

return output, aws.StringValue(output.ShareStatus), nil
}
}
43 changes: 41 additions & 2 deletions aws/internal/service/directoryservice/waiter/waiter.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package waiter

import (
"context"
"errors"
"time"

Expand All @@ -11,8 +12,10 @@ import (
)

const (
DirectoryCreatedTimeout = 60 * time.Minute
DirectoryDeletedTimeout = 60 * time.Minute
DirectoryCreatedTimeout = 60 * time.Minute
DirectoryDeletedTimeout = 60 * time.Minute
ShareDirectoryOperationTimeout = 4 * time.Minute
ShareDirectoryDeletedTimeout = 5 * time.Minute
)

func DirectoryCreated(conn *directoryservice.DirectoryService, id string) (*directoryservice.DirectoryDescription, error) {
Expand Down Expand Up @@ -52,3 +55,39 @@ func DirectoryDeleted(conn *directoryservice.DirectoryService, id string) (*dire

return nil, err
}

func ShareDirectoryShared(ctx context.Context, conn *directoryservice.DirectoryService, directoryID, sharedDirectoryID string) (*directoryservice.SharedDirectory, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{directoryservice.ShareStatusSharing},
Target: []string{directoryservice.ShareStatusShared, directoryservice.ShareStatusShareFailed},
Refresh: ShareDirectoryStatus(ctx, conn, directoryID, sharedDirectoryID),
Timeout: ShareDirectoryDeletedTimeout,
}

outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*directoryservice.SharedDirectory); ok {
tfresource.SetLastError(err, errors.New(aws.StringValue(output.ShareStatus)))

return output, err
}

return nil, err
}

func ShareDirectoryDeleted(ctx context.Context, conn *directoryservice.DirectoryService, directoryID, sharedDirectoryID string) (*directoryservice.SharedDirectory, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{directoryservice.ShareStatusDeleting},
Target: []string{directoryservice.ShareStatusDeleted},
Refresh: ShareDirectoryStatus(ctx, conn, directoryID, sharedDirectoryID),
Timeout: ShareDirectoryDeletedTimeout,
}

outputRaw, err := stateConf.WaitForStateContext(ctx)

if output, ok := outputRaw.(*directoryservice.SharedDirectory); ok {
return output, err
}

return nil, err
}
2 changes: 2 additions & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,8 @@ func Provider() *schema.Provider {
"aws_directory_service_directory": resourceAwsDirectoryServiceDirectory(),
"aws_directory_service_conditional_forwarder": resourceAwsDirectoryServiceConditionalForwarder(),
"aws_directory_service_log_subscription": resourceAwsDirectoryServiceLogSubscription(),
"aws_directory_service_share_directory": resourceAwsDirectoryServiceShareDirectory(),
"aws_directory_service_share_directory_accepter": resourceAwsDirectoryServiceShareDirectoryAccepter(),
"aws_dlm_lifecycle_policy": resourceAwsDlmLifecyclePolicy(),
"aws_dms_certificate": resourceAwsDmsCertificate(),
"aws_dms_endpoint": resourceAwsDmsEndpoint(),
Expand Down
Loading