Skip to content

Commit

Permalink
Merge pull request #8965 from ewbankkit/issue-6562
Browse files Browse the repository at this point in the history
New resource: aws_autoscalingplans_scaling_plan
  • Loading branch information
anGie44 committed Oct 21, 2020
2 parents dd9441d + 543e5d3 commit 43a84a4
Show file tree
Hide file tree
Showing 9 changed files with 1,650 additions and 0 deletions.
26 changes: 26 additions & 0 deletions aws/internal/service/autoscalingplans/finder/finder.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package finder

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/autoscalingplans"
)

// ScalingPlan returns the scaling plan corresponding to the specified name and version.
// Returns nil and potentially an API error if no scaling plan is found.
func ScalingPlan(conn *autoscalingplans.AutoScalingPlans, scalingPlanName string, scalingPlanVersion int) (*autoscalingplans.ScalingPlan, error) {
input := &autoscalingplans.DescribeScalingPlansInput{
ScalingPlanNames: aws.StringSlice([]string{scalingPlanName}),
ScalingPlanVersion: aws.Int64(int64(scalingPlanVersion)),
}

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

if output == nil || len(output.ScalingPlans) == 0 {
return nil, nil
}

return output.ScalingPlans[0], nil
}
41 changes: 41 additions & 0 deletions aws/internal/service/autoscalingplans/waiter/status.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package waiter

import (
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/autoscalingplans"
"github.com/hashicorp/aws-sdk-go-base/tfawserr"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/service/autoscalingplans/finder"
)

const (
scalingPlanStatusNotFound = "NotFound"
scalingPlanStatusUnknown = "Unknown"
)

// ScalingPlanStatus fetches the ScalingPlan and its Status
func ScalingPlanStatus(conn *autoscalingplans.AutoScalingPlans, scalingPlanName string, scalingPlanVersion int) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
scalingPlan, err := finder.ScalingPlan(conn, scalingPlanName, scalingPlanVersion)

if tfawserr.ErrCodeEquals(err, autoscalingplans.ErrCodeObjectNotFoundException) {
return nil, scalingPlanStatusNotFound, nil
}

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

if scalingPlan == nil {
return nil, scalingPlanStatusNotFound, nil
}

if statusMessage := aws.StringValue(scalingPlan.StatusMessage); statusMessage != "" {
log.Printf("[INFO] Auto Scaling Scaling Plan (%s/%d) status message: %s", scalingPlanName, scalingPlanVersion, statusMessage)
}

return scalingPlan, aws.StringValue(scalingPlan.StatusCode), nil
}
}
76 changes: 76 additions & 0 deletions aws/internal/service/autoscalingplans/waiter/waiter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package waiter

import (
"time"

"github.com/aws/aws-sdk-go/service/autoscalingplans"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

const (
// Maximum amount of time to wait for a ScalingPlan to return Created
ScalingPlanCreatedTimeout = 5 * time.Minute

// Maximum amount of time to wait for a ScalingPlan to return Deleted
ScalingPlanDeletedTimeout = 5 * time.Minute

// Maximum amount of time to wait for a ScalingPlan to return Updated
ScalingPlanUpdatedTimeout = 5 * time.Minute
)

// ScalingPlanCreated waits for a ScalingPlan to return Created
func ScalingPlanCreated(conn *autoscalingplans.AutoScalingPlans, scalingPlanName string, scalingPlanVersion int) (*autoscalingplans.ScalingPlan, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{autoscalingplans.ScalingPlanStatusCodeCreationInProgress},
Target: []string{autoscalingplans.ScalingPlanStatusCodeActive, autoscalingplans.ScalingPlanStatusCodeActiveWithProblems},
Refresh: ScalingPlanStatus(conn, scalingPlanName, scalingPlanVersion),
Timeout: ScalingPlanCreatedTimeout,
Delay: 10 * time.Second,
}

outputRaw, err := stateConf.WaitForState()

if v, ok := outputRaw.(*autoscalingplans.ScalingPlan); ok {
return v, err
}

return nil, err
}

// ScalingPlanDeleted waits for a ScalingPlan to return Deleted
func ScalingPlanDeleted(conn *autoscalingplans.AutoScalingPlans, scalingPlanName string, scalingPlanVersion int) (*autoscalingplans.ScalingPlan, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{autoscalingplans.ScalingPlanStatusCodeDeletionInProgress},
Target: []string{},
Refresh: ScalingPlanStatus(conn, scalingPlanName, scalingPlanVersion),
Timeout: ScalingPlanDeletedTimeout,
Delay: 10 * time.Second,
}

outputRaw, err := stateConf.WaitForState()

if v, ok := outputRaw.(*autoscalingplans.ScalingPlan); ok {
return v, err
}

return nil, err
}

// ScalingPlanUpdated waits for a ScalingPlan to return Updated
func ScalingPlanUpdated(conn *autoscalingplans.AutoScalingPlans, scalingPlanName string, scalingPlanVersion int) (*autoscalingplans.ScalingPlan, error) {
stateConf := &resource.StateChangeConf{
Pending: []string{autoscalingplans.ScalingPlanStatusCodeUpdateInProgress},
Target: []string{autoscalingplans.ScalingPlanStatusCodeActive, autoscalingplans.ScalingPlanStatusCodeActiveWithProblems},
Refresh: ScalingPlanStatus(conn, scalingPlanName, scalingPlanVersion),
Timeout: ScalingPlanUpdatedTimeout,
Delay: 10 * time.Second,
}

outputRaw, err := stateConf.WaitForState()

if v, ok := outputRaw.(*autoscalingplans.ScalingPlan); ok {
return v, err
}

return nil, err
}
1 change: 1 addition & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,7 @@ func Provider() *schema.Provider {
"aws_autoscaling_notification": resourceAwsAutoscalingNotification(),
"aws_autoscaling_policy": resourceAwsAutoscalingPolicy(),
"aws_autoscaling_schedule": resourceAwsAutoscalingSchedule(),
"aws_autoscalingplans_scaling_plan": resourceAwsAutoScalingPlansScalingPlan(),
"aws_backup_plan": resourceAwsBackupPlan(),
"aws_backup_selection": resourceAwsBackupSelection(),
"aws_backup_vault": resourceAwsBackupVault(),
Expand Down
31 changes: 31 additions & 0 deletions aws/provider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/aws/aws-sdk-go/aws/arn"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/iam"
"github.com/aws/aws-sdk-go/service/organizations"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand Down Expand Up @@ -617,6 +618,36 @@ func testAccOrganizationsEnabledPreCheck(t *testing.T) {
}
}

func testAccPreCheckIamServiceLinkedRole(t *testing.T, pathPrefix string) {
conn := testAccProvider.Meta().(*AWSClient).iamconn

input := &iam.ListRolesInput{
PathPrefix: aws.String(pathPrefix),
}

var role *iam.Role
err := conn.ListRolesPages(input, func(page *iam.ListRolesOutput, lastPage bool) bool {
for _, r := range page.Roles {
role = r
break
}

return !lastPage
})

if testAccPreCheckSkipError(err) {
t.Skipf("skipping tests: %s", err)
}

if err != nil {
t.Fatalf("error listing IAM roles: %s", err)
}

if role == nil {
t.Skipf("skipping tests; missing IAM service-linked role %s. Please create the role and retry", pathPrefix)
}
}

func testAccAlternateAccountProviderConfig() string {
//lintignore:AT004
return fmt.Sprintf(`
Expand Down

0 comments on commit 43a84a4

Please sign in to comment.