// test that the request is retried after the credentials are expired. func TestRequestRecoverExpiredCreds(t *testing.T) { reqNum := 0 reqs := []http.Response{ http.Response{StatusCode: 400, Body: body(`{"__type":"ExpiredTokenException","message":"expired token"}`)}, http.Response{StatusCode: 200, Body: body(`{"data":"valid"}`)}, } s := NewService(&Config{MaxRetries: 10, Credentials: credentials.NewStaticCredentials("AKID", "SECRET", "")}) s.Handlers.Validate.Clear() s.Handlers.Unmarshal.PushBack(unmarshal) s.Handlers.UnmarshalError.PushBack(unmarshalError) credExpiredBeforeRetry := false credExpiredAfterRetry := false s.Handlers.Retry.PushBack(func(r *Request) { if r.Error != nil && r.Error.(awserr.Error).Code() == "ExpiredTokenException" { credExpiredBeforeRetry = r.Config.Credentials.IsExpired() } }) s.Handlers.AfterRetry.PushBack(func(r *Request) { credExpiredAfterRetry = r.Config.Credentials.IsExpired() }) s.Handlers.Sign.Clear() s.Handlers.Sign.PushBack(func(r *Request) { r.Config.Credentials.Get() }) s.Handlers.Send.Clear() // mock sending s.Handlers.Send.PushBack(func(r *Request) { r.HTTPResponse = &reqs[reqNum] reqNum++ }) out := &testData{} r := NewRequest(s, &Operation{Name: "Operation"}, nil, out) err := r.Send() assert.Nil(t, err) assert.False(t, credExpiredBeforeRetry, "Expect valid creds before retry check") assert.True(t, credExpiredAfterRetry, "Expect expired creds after retry check") assert.False(t, s.Config.Credentials.IsExpired(), "Expect valid creds after cred expired recovery") assert.Equal(t, 1, int(r.RetryCount)) assert.Equal(t, "valid", out.Data) }
func c_aws(accessKey, secretKey, region string) (opentsdb.MultiDataPoint, error) { var md opentsdb.MultiDataPoint creds := credentials.NewStaticCredentials(accessKey, secretKey, "") conf := &aws.Config{ Credentials: creds, Region: region, } ecc := ec2.New(conf) if ecc == nil { return nil, fmt.Errorf("unable to login to EC2") } elb := elb.New(conf) if elb == nil { return nil, fmt.Errorf("unable to login to ELB") } cw := cloudwatch.New(conf) if cw == nil { return nil, fmt.Errorf("unable to login to CloudWatch") } instances, err := awsGetInstances(*ecc) if err != nil { slog.Info("No EC2 Instances found.") } loadBalancers, err := awsGetLoadBalancers(*elb) if err != nil { slog.Info("No ELB Load Balancecrs found.") } for _, loadBalancer := range loadBalancers { awsGetELBLatency(*cw, &md, loadBalancer) awsGetELBHostCounts(*cw, &md, loadBalancer) } for _, instance := range instances { awsGetCPU(*cw, &md, instance) awsGetNetwork(*cw, &md, instance) awsGetDiskBytes(*cw, &md, instance) awsGetDiskOps(*cw, &md, instance) awsGetStatusChecks(*cw, &md, instance) } return md, nil }