deleteCluster: remove cluster details from kubeconfig
- refactoring in pkg/cluster/kubeconfig - new functions to delete a cluster from kubeconfig - call RemoveClusterFromDefaultKubeConfig after deleting cluster
This commit is contained in:
parent
5b637126d7
commit
2d68ef12e4
@ -51,11 +51,16 @@ func NewCmdDeleteCluster() *cobra.Command {
|
|||||||
if err := cluster.DeleteCluster(c, runtimes.SelectedRuntime); err != nil {
|
if err := cluster.DeleteCluster(c, runtimes.SelectedRuntime); err != nil {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
|
log.Infoln("Removing cluster details from default kubeconfig")
|
||||||
|
if err := cluster.RemoveClusterFromDefaultKubeConfig(c); err != nil {
|
||||||
|
log.Warnln("Failed to remove cluster details from default kubeconfig")
|
||||||
|
log.Warnln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Successfully deleted cluster %s!", c.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugln("...Finished")
|
|
||||||
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,11 +56,10 @@ func GetAndWriteKubeConfig(runtime runtimes.Runtime, cluster *k3d.Cluster, outpu
|
|||||||
|
|
||||||
// empty output parameter = write to default
|
// empty output parameter = write to default
|
||||||
if output == "" {
|
if output == "" {
|
||||||
defaultKubeConfigLoadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
|
output, err = GetDefaultKubeConfigPath()
|
||||||
if len(defaultKubeConfigLoadingRules.GetLoadingPrecedence()) > 1 {
|
if err != nil {
|
||||||
return fmt.Errorf("Multiple kubeconfigs specified via KUBECONFIG env var: Please reduce to one entry, unset KUBECONFIG or explicitly choose an output")
|
return err
|
||||||
}
|
}
|
||||||
output = defaultKubeConfigLoadingRules.GetDefaultFilename()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// simply write to the output, ignoring existing contents
|
// simply write to the output, ignoring existing contents
|
||||||
@ -262,18 +261,79 @@ func UpdateKubeConfig(newKubeConfig *clientcmdapi.Config, existingKubeConfig *cl
|
|||||||
|
|
||||||
log.Debugf("Merged KubeConfig:\n%+v", existingKubeConfig)
|
log.Debugf("Merged KubeConfig:\n%+v", existingKubeConfig)
|
||||||
|
|
||||||
// Write updated/merged KubeConfig to new temporary file
|
return WriteKubeConfig(existingKubeConfig, outPath)
|
||||||
mergedConfigPath := fmt.Sprintf("%s.k3d_%s", outPath, time.Now().Format("20060102_150405.000000"))
|
}
|
||||||
if err := clientcmd.WriteToFile(*existingKubeConfig, mergedConfigPath); err != nil {
|
|
||||||
log.Errorf("Failed to write merged kubeconfig to temporary file '%s'", mergedConfigPath)
|
// WriteKubeConfig writes a kubeconfig to a path atomically
|
||||||
|
func WriteKubeConfig(kubeconfig *clientcmdapi.Config, path string) error {
|
||||||
|
tempPath := fmt.Sprintf("%s.k3d_%s", path, time.Now().Format("20060102_150405.000000"))
|
||||||
|
if err := clientcmd.WriteToFile(*kubeconfig, tempPath); err != nil {
|
||||||
|
log.Errorf("Failed to write merged kubeconfig to temporary file '%s'", tempPath)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move temporary file over existing KubeConfig
|
// Move temporary file over existing KubeConfig
|
||||||
if err := os.Rename(mergedConfigPath, outPath); err != nil {
|
if err := os.Rename(tempPath, path); err != nil {
|
||||||
log.Errorf("Failed to overwrite existing KubeConfig '%s' with new KubeConfig '%s'", outPath, mergedConfigPath)
|
log.Errorf("Failed to overwrite existing KubeConfig '%s' with new KubeConfig '%s'", path, tempPath)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetDefaultKubeConfig loads the default KubeConfig file
|
||||||
|
func GetDefaultKubeConfig() (*clientcmdapi.Config, error) {
|
||||||
|
path, err := GetDefaultKubeConfigPath()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return clientcmd.LoadFromFile(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDefaultKubeConfigPath returns the path of the default kubeconfig, but errors if the KUBECONFIG env var specifies more than one file
|
||||||
|
func GetDefaultKubeConfigPath() (string, error) {
|
||||||
|
defaultKubeConfigLoadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
|
||||||
|
if len(defaultKubeConfigLoadingRules.GetLoadingPrecedence()) > 1 {
|
||||||
|
return "", fmt.Errorf("Multiple kubeconfigs specified via KUBECONFIG env var: Please reduce to one entry, unset KUBECONFIG or explicitly choose an output")
|
||||||
|
}
|
||||||
|
return defaultKubeConfigLoadingRules.GetDefaultFilename(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveClusterFromDefaultKubeConfig removes a cluster's details from the default kubeconfig
|
||||||
|
func RemoveClusterFromDefaultKubeConfig(cluster *k3d.Cluster) error {
|
||||||
|
defaultKubeConfigPath, err := GetDefaultKubeConfigPath()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
kubeconfig, err := GetDefaultKubeConfig()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
kubeconfig = RemoveClusterFromKubeConfig(cluster, kubeconfig)
|
||||||
|
return WriteKubeConfig(kubeconfig, defaultKubeConfigPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveClusterFromKubeConfig removes a cluster's details from a given kubeconfig
|
||||||
|
func RemoveClusterFromKubeConfig(cluster *k3d.Cluster, kubeconfig *clientcmdapi.Config) *clientcmdapi.Config {
|
||||||
|
clusterName := fmt.Sprintf("%s-%s", k3d.DefaultObjectNamePrefix, cluster.Name)
|
||||||
|
contextName := fmt.Sprintf("%s-%s", k3d.DefaultObjectNamePrefix, cluster.Name)
|
||||||
|
authInfoName := fmt.Sprintf("admin@%s-%s", k3d.DefaultObjectNamePrefix, cluster.Name)
|
||||||
|
|
||||||
|
// delete elements from kubeconfig if they're present
|
||||||
|
delete(kubeconfig.Contexts, contextName)
|
||||||
|
delete(kubeconfig.Clusters, clusterName)
|
||||||
|
delete(kubeconfig.AuthInfos, authInfoName)
|
||||||
|
|
||||||
|
// set current-context to any other context, if it was set to the given cluster before
|
||||||
|
if kubeconfig.CurrentContext == contextName {
|
||||||
|
for k := range kubeconfig.Contexts {
|
||||||
|
kubeconfig.CurrentContext = k
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// if current-context didn't change, unset it
|
||||||
|
if kubeconfig.CurrentContext == contextName {
|
||||||
|
kubeconfig.CurrentContext = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return kubeconfig
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user