From 804ee25b1e1c4da5a310855b12edfcbb6e1d186a Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Tue, 12 Jun 2018 21:39:46 -0700 Subject: [PATCH] Make CredentialProvider config loading deterministic. --- pkg/credentialprovider/plugins.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/credentialprovider/plugins.go b/pkg/credentialprovider/plugins.go index 76c2e724901..c817fefa2b7 100644 --- a/pkg/credentialprovider/plugins.go +++ b/pkg/credentialprovider/plugins.go @@ -17,6 +17,8 @@ limitations under the License. package credentialprovider import ( + "reflect" + "sort" "sync" "github.com/golang/glog" @@ -49,11 +51,17 @@ func NewDockerKeyring() DockerKeyring { Providers: make([]DockerConfigProvider, 0), } - // TODO(mattmoor): iterating over the map is non-deterministic. We should - // introduce the notion of priorities for conflict resolution. - for name, provider := range providers { + keys := reflect.ValueOf(providers).MapKeys() + stringKeys := make([]string, len(keys)) + for ix := range keys { + stringKeys[ix] = keys[ix].String() + } + sort.Strings(stringKeys) + + for _, key := range stringKeys { + provider := providers[key] if provider.Enabled() { - glog.V(4).Infof("Registering credential provider: %v", name) + glog.V(4).Infof("Registering credential provider: %v", key) keyring.Providers = append(keyring.Providers, provider) } }