Merge pull request #7000 from deads2k/deads-allow-many-modifications

allow multiple changes in kubeconfig modifyconfig
pull/6/head
Brendan Burns 2015-04-20 10:46:12 -07:00
commit 29875191ad
1 changed files with 79 additions and 80 deletions

View File

@ -186,7 +186,7 @@ func (o *PathOptions) GetExplicitFile() string {
// ModifyConfig takes a Config object, iterates through Clusters, AuthInfos, and Contexts, uses the LocationOfOrigin if specified or
// uses the default destination file to write the results into. This results in multiple file reads, but it's very easy to follow.
// Preferences and CurrentContext should always be set in the default destination file. Since we can't distinguish between empty and missing values
// (no nil strings), we're forced have separate handling for them. In all the currently known cases, newConfig should have, at most, one difference,
// (no nil strings), we're forced have separate handling for them. In the kubeconfig cases, newConfig should have at most one difference,
// that means that this code will only write into a single file.
func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config) error {
startingConfig, err := configAccess.GetStartingConfig()
@ -194,25 +194,26 @@ func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config) erro
return err
}
// at this point, config and startingConfig should have, at most, one difference. We need to chase the difference until we find it
// then we'll build a partial config object to call write upon. Special case the test for current context and preferences since those
// always write to the default file.
switch {
case reflect.DeepEqual(*startingConfig, newConfig):
// We need to find all differences, locate their original files, read a partial config to modify only that stanza and write out the file.
// Special case the test for current context and preferences since those always write to the default file.
if reflect.DeepEqual(*startingConfig, newConfig) {
// nothing to do
return nil
}
case startingConfig.CurrentContext != newConfig.CurrentContext:
if startingConfig.CurrentContext != newConfig.CurrentContext {
if err := writeCurrentContext(configAccess, newConfig.CurrentContext); err != nil {
return err
}
}
case !reflect.DeepEqual(startingConfig.Preferences, newConfig.Preferences):
if !reflect.DeepEqual(startingConfig.Preferences, newConfig.Preferences) {
if err := writePreferences(configAccess, newConfig.Preferences); err != nil {
return err
}
}
default:
// something is different. Search every cluster, authInfo, and context. First from new to old for differences, then from old to new for deletions
// Search every cluster, authInfo, and context. First from new to old for differences, then from old to new for deletions
for key, cluster := range newConfig.Clusters {
startingCluster, exists := startingConfig.Clusters[key]
if !reflect.DeepEqual(cluster, startingCluster) || !exists {
@ -312,8 +313,6 @@ func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config) erro
}
}
}
return nil
}