func (c *EC2) WaitUntilKeyPairExists(input *DescribeKeyPairsInput) error { waiterCfg := waiter.Config{ Operation: "DescribeKeyPairs", Delay: 5, MaxAttempts: 6, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "length(KeyPairs[].KeyName) > `0`", Expected: true, }, { State: "retry", Matcher: "error", Argument: "", Expected: "InvalidKeyPairNotFound", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilNetworkInterfaceAvailable(input *DescribeNetworkInterfacesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeNetworkInterfaces", Delay: 20, MaxAttempts: 10, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "NetworkInterfaces[].Status", Expected: "available", }, { State: "failure", Matcher: "error", Argument: "", Expected: "InvalidNetworkInterfaceIDNotFound", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilInstanceTerminated(input *DescribeInstancesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeInstances", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "Reservations[].Instances[].State.Name", Expected: "terminated", }, { State: "failure", Matcher: "pathAny", Argument: "Reservations[].Instances[].State.Name", Expected: "pending", }, { State: "failure", Matcher: "pathAny", Argument: "Reservations[].Instances[].State.Name", Expected: "stopping", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *CloudFormation) WaitUntilStackCreateComplete(input *DescribeStacksInput) error { waiterCfg := waiter.Config{ Operation: "DescribeStacks", Delay: 30, MaxAttempts: 50, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "Stacks[].StackStatus", Expected: "CREATE_COMPLETE", }, { State: "failure", Matcher: "pathAny", Argument: "Stacks[].StackStatus", Expected: "CREATE_FAILED", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *DynamoDB) WaitUntilTableExists(input *DescribeTableInput) error { waiterCfg := waiter.Config{ Operation: "DescribeTable", Delay: 20, MaxAttempts: 25, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "path", Argument: "Table.TableStatus", Expected: "ACTIVE", }, { State: "retry", Matcher: "error", Argument: "", Expected: "ResourceNotFoundException", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *ECS) WaitUntilTasksRunning(input *DescribeTasksInput) error { waiterCfg := waiter.Config{ Operation: "DescribeTasks", Delay: 6, MaxAttempts: 100, Acceptors: []waiter.WaitAcceptor{ { State: "failure", Matcher: "pathAny", Argument: "tasks[].lastStatus", Expected: "STOPPED", }, { State: "failure", Matcher: "pathAny", Argument: "failures[].reason", Expected: "MISSING", }, { State: "success", Matcher: "pathAll", Argument: "tasks[].lastStatus", Expected: "RUNNING", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilCustomerGatewayAvailable(input *DescribeCustomerGatewaysInput) error { waiterCfg := waiter.Config{ Operation: "DescribeCustomerGateways", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "CustomerGateways[].State", Expected: "available", }, { State: "failure", Matcher: "pathAny", Argument: "CustomerGateways[].State", Expected: "deleted", }, { State: "failure", Matcher: "pathAny", Argument: "CustomerGateways[].State", Expected: "deleting", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *IAM) WaitUntilInstanceProfileExists(input *GetInstanceProfileInput) error { waiterCfg := waiter.Config{ Operation: "GetInstanceProfile", Delay: 1, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "status", Argument: "", Expected: 200, }, { State: "retry", Matcher: "status", Argument: "", Expected: 404, }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *ECS) WaitUntilServicesInactive(input *DescribeServicesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeServices", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "failure", Matcher: "pathAny", Argument: "failures[].reason", Expected: "MISSING", }, { State: "success", Matcher: "pathAny", Argument: "services[].status", Expected: "INACTIVE", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *IAM) WaitUntilUserExists(input *GetUserInput) error { waiterCfg := waiter.Config{ Operation: "GetUser", Delay: 1, MaxAttempts: 20, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "status", Argument: "", Expected: 200, }, { State: "retry", Matcher: "error", Argument: "", Expected: "NoSuchEntity", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilInstanceExists(input *DescribeInstancesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeInstances", Delay: 5, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "status", Argument: "", Expected: 200, }, { State: "retry", Matcher: "error", Argument: "", Expected: "InvalidInstanceIDNotFound", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *S3) WaitUntilBucketExists(input *HeadBucketInput) error { waiterCfg := waiter.Config{ Operation: "HeadBucket", Delay: 5, MaxAttempts: 20, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "status", Argument: "", Expected: 200, }, { State: "success", Matcher: "status", Argument: "", Expected: 403, }, { State: "retry", Matcher: "status", Argument: "", Expected: 404, }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilVolumeDeleted(input *DescribeVolumesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeVolumes", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "Volumes[].State", Expected: "deleted", }, { State: "success", Matcher: "error", Argument: "", Expected: "InvalidVolumeNotFound", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilBundleTaskComplete(input *DescribeBundleTasksInput) error { waiterCfg := waiter.Config{ Operation: "DescribeBundleTasks", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "BundleTasks[].State", Expected: "complete", }, { State: "failure", Matcher: "pathAny", Argument: "BundleTasks[].State", Expected: "failed", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilVpnConnectionDeleted(input *DescribeVpnConnectionsInput) error { waiterCfg := waiter.Config{ Operation: "DescribeVpnConnections", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "VpnConnections[].State", Expected: "deleted", }, { State: "failure", Matcher: "pathAny", Argument: "VpnConnections[].State", Expected: "pending", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *RDS) WaitUntilDBInstanceAvailable(input *DescribeDBInstancesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeDBInstances", Delay: 30, MaxAttempts: 60, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "DBInstances[].DBInstanceStatus", Expected: "available", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "deleted", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "deleting", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "failed", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "incompatible-restore", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "incompatible-parameters", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "incompatible-restore", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *RDS) WaitUntilDBInstanceDeleted(input *DescribeDBInstancesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeDBInstances", Delay: 30, MaxAttempts: 60, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "DBInstances[].DBInstanceStatus", Expected: "deleted", }, { State: "success", Matcher: "error", Argument: "", Expected: "DBInstanceNotFound", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "creating", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "modifying", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "rebooting", }, { State: "failure", Matcher: "pathAny", Argument: "DBInstances[].DBInstanceStatus", Expected: "resetting-master-credentials", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func TestWaiterStatus(t *testing.T) { svc := &mockClient{Client: awstesting.NewClient(&aws.Config{ Region: aws.String("mock-region"), })} svc.Handlers.Send.Clear() // mock sending svc.Handlers.Unmarshal.Clear() svc.Handlers.UnmarshalMeta.Clear() svc.Handlers.ValidateResponse.Clear() reqNum := 0 svc.Handlers.Build.PushBack(func(r *request.Request) { reqNum++ }) svc.Handlers.Send.PushBack(func(r *request.Request) { code := 200 if reqNum == 3 { code = 404 } r.HTTPResponse = &http.Response{ StatusCode: code, Status: http.StatusText(code), Body: ioutil.NopCloser(bytes.NewReader([]byte{})), } }) waiterCfg := waiter.Config{ Operation: "Mock", Delay: 0, MaxAttempts: 10, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "status", Argument: "", Expected: 404, }, }, } w := waiter.Waiter{ Client: svc, Input: &MockInput{}, Config: waiterCfg, } err := w.Wait() assert.NoError(t, err) assert.Equal(t, 3, reqNum) }
func (c *EC2) WaitUntilSpotInstanceRequestFulfilled(input *DescribeSpotInstanceRequestsInput) error { waiterCfg := waiter.Config{ Operation: "DescribeSpotInstanceRequests", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "SpotInstanceRequests[].Status.Code", Expected: "fulfilled", }, { State: "failure", Matcher: "pathAny", Argument: "SpotInstanceRequests[].Status.Code", Expected: "schedule-expired", }, { State: "failure", Matcher: "pathAny", Argument: "SpotInstanceRequests[].Status.Code", Expected: "canceled-before-fulfillment", }, { State: "failure", Matcher: "pathAny", Argument: "SpotInstanceRequests[].Status.Code", Expected: "bad-parameters", }, { State: "failure", Matcher: "pathAny", Argument: "SpotInstanceRequests[].Status.Code", Expected: "system-error", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *ECS) WaitUntilServicesStable(input *DescribeServicesInput) error { waiterCfg := waiter.Config{ Operation: "DescribeServices", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "failure", Matcher: "pathAny", Argument: "failures[].reason", Expected: "MISSING", }, { State: "failure", Matcher: "pathAny", Argument: "services[].status", Expected: "DRAINING", }, { State: "failure", Matcher: "pathAny", Argument: "services[].status", Expected: "INACTIVE", }, { State: "success", Matcher: "path", Argument: "services | [@[?length(deployments)!=`1`], @[?desiredCount!=runningCount]][] | length(@) == `0`", Expected: true, }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *Kinesis) WaitUntilStreamExists(input *DescribeStreamInput) error { waiterCfg := waiter.Config{ Operation: "DescribeStream", Delay: 10, MaxAttempts: 18, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "path", Argument: "StreamDescription.StreamStatus", Expected: "ACTIVE", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *ELB) WaitUntilAnyInstanceInService(input *DescribeInstanceHealthInput) error { waiterCfg := waiter.Config{ Operation: "DescribeInstanceHealth", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAny", Argument: "InstanceStates[].State", Expected: "InService", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilConversionTaskDeleted(input *DescribeConversionTasksInput) error { waiterCfg := waiter.Config{ Operation: "DescribeConversionTasks", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "ConversionTasks[].State", Expected: "deleted", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilVpcAvailable(input *DescribeVpcsInput) error { waiterCfg := waiter.Config{ Operation: "DescribeVpcs", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "Vpcs[].State", Expected: "available", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilPasswordDataAvailable(input *GetPasswordDataInput) error { waiterCfg := waiter.Config{ Operation: "GetPasswordData", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "path", Argument: "length(PasswordData) > `0`", Expected: true, }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func (c *EC2) WaitUntilSystemStatusOk(input *DescribeInstanceStatusInput) error { waiterCfg := waiter.Config{ Operation: "DescribeInstanceStatus", Delay: 15, MaxAttempts: 40, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "InstanceStatuses[].SystemStatus.Status", Expected: "ok", }, }, } w := waiter.Waiter{ Client: c, Input: input, Config: waiterCfg, } return w.Wait() }
func TestWaiterError(t *testing.T) { svc := &mockClient{Client: awstesting.NewClient(&aws.Config{ Region: aws.String("mock-region"), })} svc.Handlers.Send.Clear() // mock sending svc.Handlers.Unmarshal.Clear() svc.Handlers.UnmarshalMeta.Clear() svc.Handlers.ValidateResponse.Clear() reqNum := 0 resps := []*MockOutput{ { // Request 1 States: []*MockState{ {State: aws.String("pending")}, {State: aws.String("pending")}, }, }, { // Request 2, error case }, { // Request 3 States: []*MockState{ {State: aws.String("running")}, {State: aws.String("running")}, }, }, } numBuiltReq := 0 svc.Handlers.Build.PushBack(func(r *request.Request) { numBuiltReq++ }) svc.Handlers.Send.PushBack(func(r *request.Request) { if reqNum == 1 { r.Error = awserr.New("MockException", "mock exception message", nil) r.HTTPResponse = &http.Response{ StatusCode: 400, Status: http.StatusText(400), Body: ioutil.NopCloser(bytes.NewReader([]byte{})), } reqNum++ } }) svc.Handlers.Unmarshal.PushBack(func(r *request.Request) { if reqNum >= len(resps) { assert.Fail(t, "too many polling requests made") return } r.Data = resps[reqNum] reqNum++ }) waiterCfg := waiter.Config{ Operation: "Mock", Delay: 0, MaxAttempts: 10, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "States[].State", Expected: "running", }, { State: "retry", Matcher: "error", Argument: "", Expected: "MockException", }, }, } w := waiter.Waiter{ Client: svc, Input: &MockInput{}, Config: waiterCfg, } err := w.Wait() assert.NoError(t, err) assert.Equal(t, 3, numBuiltReq) assert.Equal(t, 3, reqNum) }
func TestWaiterPathAll(t *testing.T) { svc := &mockClient{Client: awstesting.NewClient(&aws.Config{ Region: aws.String("mock-region"), })} svc.Handlers.Send.Clear() // mock sending svc.Handlers.Unmarshal.Clear() svc.Handlers.UnmarshalMeta.Clear() svc.Handlers.ValidateResponse.Clear() reqNum := 0 resps := []*MockOutput{ { // Request 1 States: []*MockState{ {State: aws.String("pending")}, {State: aws.String("pending")}, }, }, { // Request 2 States: []*MockState{ {State: aws.String("running")}, {State: aws.String("pending")}, }, }, { // Request 3 States: []*MockState{ {State: aws.String("running")}, {State: aws.String("running")}, }, }, } numBuiltReq := 0 svc.Handlers.Build.PushBack(func(r *request.Request) { numBuiltReq++ }) svc.Handlers.Unmarshal.PushBack(func(r *request.Request) { if reqNum >= len(resps) { assert.Fail(t, "too many polling requests made") return } r.Data = resps[reqNum] reqNum++ }) waiterCfg := waiter.Config{ Operation: "Mock", Delay: 0, MaxAttempts: 10, Acceptors: []waiter.WaitAcceptor{ { State: "success", Matcher: "pathAll", Argument: "States[].State", Expected: "running", }, }, } w := waiter.Waiter{ Client: svc, Input: &MockInput{}, Config: waiterCfg, } err := w.Wait() assert.NoError(t, err) assert.Equal(t, 3, numBuiltReq) assert.Equal(t, 3, reqNum) }