]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blob - vendor/github.com/aws/aws-sdk-go/aws/credentials/chain_provider.go
Initial transfer of provider code
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / aws / aws-sdk-go / aws / credentials / chain_provider.go
1 package credentials
2
3 import (
4 "github.com/aws/aws-sdk-go/aws/awserr"
5 )
6
7 var (
8 // ErrNoValidProvidersFoundInChain Is returned when there are no valid
9 // providers in the ChainProvider.
10 //
11 // This has been deprecated. For verbose error messaging set
12 // aws.Config.CredentialsChainVerboseErrors to true
13 //
14 // @readonly
15 ErrNoValidProvidersFoundInChain = awserr.New("NoCredentialProviders",
16 `no valid providers in chain. Deprecated.
17 For verbose messaging see aws.Config.CredentialsChainVerboseErrors`,
18 nil)
19 )
20
21 // A ChainProvider will search for a provider which returns credentials
22 // and cache that provider until Retrieve is called again.
23 //
24 // The ChainProvider provides a way of chaining multiple providers together
25 // which will pick the first available using priority order of the Providers
26 // in the list.
27 //
28 // If none of the Providers retrieve valid credentials Value, ChainProvider's
29 // Retrieve() will return the error ErrNoValidProvidersFoundInChain.
30 //
31 // If a Provider is found which returns valid credentials Value ChainProvider
32 // will cache that Provider for all calls to IsExpired(), until Retrieve is
33 // called again.
34 //
35 // Example of ChainProvider to be used with an EnvProvider and EC2RoleProvider.
36 // In this example EnvProvider will first check if any credentials are available
37 // via the environment variables. If there are none ChainProvider will check
38 // the next Provider in the list, EC2RoleProvider in this case. If EC2RoleProvider
39 // does not return any credentials ChainProvider will return the error
40 // ErrNoValidProvidersFoundInChain
41 //
42 // creds := credentials.NewChainCredentials(
43 // []credentials.Provider{
44 // &credentials.EnvProvider{},
45 // &ec2rolecreds.EC2RoleProvider{
46 // Client: ec2metadata.New(sess),
47 // },
48 // })
49 //
50 // // Usage of ChainCredentials with aws.Config
51 // svc := ec2.New(session.Must(session.NewSession(&aws.Config{
52 // Credentials: creds,
53 // })))
54 //
55 type ChainProvider struct {
56 Providers []Provider
57 curr Provider
58 VerboseErrors bool
59 }
60
61 // NewChainCredentials returns a pointer to a new Credentials object
62 // wrapping a chain of providers.
63 func NewChainCredentials(providers []Provider) *Credentials {
64 return NewCredentials(&ChainProvider{
65 Providers: append([]Provider{}, providers...),
66 })
67 }
68
69 // Retrieve returns the credentials value or error if no provider returned
70 // without error.
71 //
72 // If a provider is found it will be cached and any calls to IsExpired()
73 // will return the expired state of the cached provider.
74 func (c *ChainProvider) Retrieve() (Value, error) {
75 var errs []error
76 for _, p := range c.Providers {
77 creds, err := p.Retrieve()
78 if err == nil {
79 c.curr = p
80 return creds, nil
81 }
82 errs = append(errs, err)
83 }
84 c.curr = nil
85
86 var err error
87 err = ErrNoValidProvidersFoundInChain
88 if c.VerboseErrors {
89 err = awserr.NewBatchError("NoCredentialProviders", "no valid providers in chain", errs)
90 }
91 return Value{}, err
92 }
93
94 // IsExpired will returned the expired state of the currently cached provider
95 // if there is one. If there is no current provider, true will be returned.
96 func (c *ChainProvider) IsExpired() bool {
97 if c.curr != nil {
98 return c.curr.IsExpired()
99 }
100
101 return true
102 }