generic cred helper
parent
b4003ae693
commit
8b76743ddb
|
@ -0,0 +1,84 @@
|
||||||
|
package credentialshelper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/keel-hq/keel/types"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CredentialsHelper is a generic interface for implementing cloud vendor specific
|
||||||
|
// authorization code
|
||||||
|
type CredentialsHelper interface {
|
||||||
|
GetCredentials(registry string) (*types.Credentials, error)
|
||||||
|
IsEnabled() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// Common errors
|
||||||
|
var (
|
||||||
|
ErrCredentialsNotAvailable = errors.New("no credentials available for this registry")
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
credHelpersM sync.RWMutex
|
||||||
|
credHelpers = make(map[string]CredentialsHelper)
|
||||||
|
)
|
||||||
|
|
||||||
|
func RegisterCredentialsHelper(name string, ch CredentialsHelper) {
|
||||||
|
if name == "" {
|
||||||
|
panic("credentialshelper: could not register a Credentials Helper with an empty name")
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch == nil {
|
||||||
|
panic("credentialshelper: could not register a nil Credentials Helper")
|
||||||
|
}
|
||||||
|
|
||||||
|
credHelpersM.Lock()
|
||||||
|
defer credHelpersM.Unlock()
|
||||||
|
|
||||||
|
if _, dup := credHelpers[name]; dup {
|
||||||
|
panic("credentialshelper: RegisterCredentialsHelper called twice for " + name)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"name": name,
|
||||||
|
}).Info("extension.credentialshelper: helper registered")
|
||||||
|
|
||||||
|
credHelpers[name] = ch
|
||||||
|
}
|
||||||
|
|
||||||
|
// CredentialsHelpers
|
||||||
|
type CredentialsHelpers struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a combined list of credential helpers
|
||||||
|
func New() *CredentialsHelpers {
|
||||||
|
return &CredentialsHelpers{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ch *CredentialsHelpers) GetCredentials(registry string) (*types.Credentials, error) {
|
||||||
|
credHelpersM.RLock()
|
||||||
|
defer credHelpersM.RUnlock()
|
||||||
|
|
||||||
|
for name, credHelper := range credHelpers {
|
||||||
|
if credHelper.IsEnabled() {
|
||||||
|
creds, err := ch.GetCredentials(registry)
|
||||||
|
if err != nil {
|
||||||
|
if err == ErrCredentialsNotAvailable {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log.WithFields(log.Fields{
|
||||||
|
"helper": name,
|
||||||
|
"error": err,
|
||||||
|
"registry": registry,
|
||||||
|
}).Error("extension.credentialshelper: credentials not found")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return creds, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, ErrCredentialsNotAvailable
|
||||||
|
}
|
Loading…
Reference in New Issue