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  }