github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/creds/retryable_secrets.go (about) 1 package creds 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/concourse/retryhttp" 8 ) 9 10 type SecretRetryConfig struct { 11 Attempts int `long:"secret-retry-attempts" default:"5" description:"The number of attempts secret will be retried to be fetched, in case a retryable error happens."` 12 Interval time.Duration `long:"secret-retry-interval" default:"1s" description:"The interval between secret retry retrieval attempts."` 13 } 14 15 type RetryableSecrets struct { 16 secrets Secrets 17 retryConfig SecretRetryConfig 18 } 19 20 func NewRetryableSecrets(secrets Secrets, retryConfig SecretRetryConfig) Secrets { 21 return &RetryableSecrets{secrets: secrets, retryConfig: retryConfig} 22 } 23 24 // Get retrieves the value and expiration of an individual secret 25 func (rs RetryableSecrets) Get(secretPath string) (interface{}, *time.Time, bool, error) { 26 r := &retryhttp.DefaultRetryer{} 27 for i := 0; i < rs.retryConfig.Attempts-1; i++ { 28 result, expiration, exists, err := rs.secrets.Get(secretPath) 29 if err != nil && r.IsRetryable(err) { 30 time.Sleep(rs.retryConfig.Interval) 31 continue 32 } 33 return result, expiration, exists, err 34 } 35 result, expiration, exists, err := rs.secrets.Get(secretPath) 36 if err != nil { 37 err = fmt.Errorf("%s (after %d retries)", err, rs.retryConfig.Attempts) 38 } 39 return result, expiration, exists, err 40 } 41 42 // NewSecretLookupPaths defines how variables will be searched in the underlying secret manager 43 func (rs RetryableSecrets) NewSecretLookupPaths(teamName string, pipelineName string, allowRootPath bool) []SecretLookupPath { 44 return rs.secrets.NewSecretLookupPaths(teamName, pipelineName, allowRootPath) 45 }