101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
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(image *types.TrackedImage) (*types.Credentials, error)
|
|
IsEnabled() bool
|
|
}
|
|
|
|
// Common errors
|
|
var (
|
|
ErrCredentialsNotAvailable = errors.New("no credentials available for this registry")
|
|
ErrUnsupportedRegistry = errors.New("unsupported registry")
|
|
)
|
|
|
|
var (
|
|
credHelpersM sync.RWMutex
|
|
credHelpers = make(map[string]CredentialsHelper)
|
|
)
|
|
|
|
// RegisterCredentialsHelper - registering new credentials helper
|
|
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
|
|
}
|
|
|
|
// UnregisterCredentialsHelper - unregister existing credentials helper, used for testing
|
|
func UnregisterCredentialsHelper(name string) {
|
|
if name == "" {
|
|
panic("credentialshelper: could not unregister a Credentials Helper with an empty name")
|
|
}
|
|
|
|
credHelpersM.Lock()
|
|
defer credHelpersM.Unlock()
|
|
|
|
delete(credHelpers, name)
|
|
}
|
|
|
|
// GetCredentials - generic function for getting credentials
|
|
// func (ch *CredentialsHelpers) GetCredentials(image *types.TrackedImage) (*types.Credentials, error) {
|
|
func GetCredentials(image *types.TrackedImage) (creds *types.Credentials) {
|
|
credHelpersM.RLock()
|
|
defer credHelpersM.RUnlock()
|
|
|
|
creds = &types.Credentials{}
|
|
|
|
for name, credHelper := range credHelpers {
|
|
if credHelper.IsEnabled() {
|
|
creds, err := credHelper.GetCredentials(image)
|
|
if err != nil {
|
|
if err == ErrUnsupportedRegistry {
|
|
log.WithFields(log.Fields{
|
|
"helper": name,
|
|
"error": err,
|
|
"tracked_image": image,
|
|
}).Debug("extension.credentialshelper: helper doesn't support this registry")
|
|
} else {
|
|
log.WithFields(log.Fields{
|
|
"helper": name,
|
|
"error": err,
|
|
"tracked_image": image,
|
|
}).Debug("extension.credentialshelper: credentials not found")
|
|
}
|
|
} else {
|
|
return creds
|
|
}
|
|
}
|
|
}
|
|
log.WithFields(log.Fields{
|
|
"tracked_image": image,
|
|
}).Debug("extension.credentialshelper: credentials helper not found")
|
|
return creds
|
|
}
|