// SpotInstanceStateRefreshFunc returns a resource.StateRefreshFunc that is used to watch // an EC2 spot instance request func SpotInstanceStateRefreshFunc( conn *ec2.EC2, sir ec2.SpotInstanceRequest) resource.StateRefreshFunc { return func() (interface{}, string, error) { resp, err := conn.DescribeSpotInstanceRequests(&ec2.DescribeSpotInstanceRequestsInput{ SpotInstanceRequestIDs: []*string{sir.SpotInstanceRequestID}, }) if err != nil { if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidSpotInstanceRequestID.NotFound" { // Set this to nil as if we didn't find anything. resp = nil } else { log.Printf("Error on StateRefresh: %s", err) return nil, "", err } } if resp == nil || len(resp.SpotInstanceRequests) == 0 { // Sometimes AWS just has consistency issues and doesn't see // our request yet. Return an empty state. return nil, "", nil } req := resp.SpotInstanceRequests[0] return req, *req.Status.Code, nil } }
// SpotRequestStateRefreshFunc returns a StateRefreshFunc that is used to watch // a spot request for state changes. func SpotRequestStateRefreshFunc(conn *ec2.EC2, spotRequestId string) StateRefreshFunc { return func() (interface{}, string, error) { resp, err := conn.DescribeSpotInstanceRequests(&ec2.DescribeSpotInstanceRequestsInput{ SpotInstanceRequestIDs: []*string{&spotRequestId}, }) if err != nil { if ec2err, ok := err.(awserr.Error); ok && ec2err.Code() == "InvalidSpotInstanceRequestID.NotFound" { // Set this to nil as if we didn't find anything. resp = nil } else if isTransientNetworkError(err) { // Transient network error, treat it as if we didn't find anything resp = nil } else { log.Printf("Error on SpotRequestStateRefresh: %s", err) return nil, "", err } } if resp == nil || len(resp.SpotInstanceRequests) == 0 { // Sometimes AWS has consistency issues and doesn't see the // SpotRequest. Return an empty state. return nil, "", nil } i := resp.SpotInstanceRequests[0] return i, *i.State, nil } }
// Describes all available Spot instance requests for the user // Other input parameters can be configured by uncommenting the appropriate portion of the code func (p *Parameters) DescribeSpotInstanceRequests(svc *ec2.EC2) (string, error) { // paramsforReq := &ec2.DescribeSpotInstanceRequestsInput{ // DryRun: aws.Bool(true), // Filters: []*ec2.Filter{ // { // Required // Name: aws.String("String"), // Values: []*string{ // aws.String("String"), // Required // // More values... // }, // }, // // More values... // }, // SpotInstanceRequestIds: []*string{ // aws.String("String"), // Required // // More values... // }, // } resp, err := svc.DescribeSpotInstanceRequests(nil) if err != nil { return "", err } return fmt.Sprintln(resp), nil }