From 3ab7fcc665e3975ed75aefb51e3df679a5422a64 Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Mon, 21 Aug 2017 10:23:33 +0200 Subject: prompt: add fields for active kubectl context and OpenStack credentials --- pkg/prompt/cloud.go | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++ pkg/prompt/main.go | 2 ++ 2 files changed, 85 insertions(+) create mode 100644 pkg/prompt/cloud.go diff --git a/pkg/prompt/cloud.go b/pkg/prompt/cloud.go new file mode 100644 index 0000000..72bd6f9 --- /dev/null +++ b/pkg/prompt/cloud.go @@ -0,0 +1,83 @@ +/******************************************************************************* +* +* Copyright 2017 Stefan Majewsky +* +* This program is free software: you can redistribute it and/or modify it under +* the terms of the GNU General Public License as published by the Free Software +* Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* This program is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +* A PARTICULAR PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with +* this program. If not, see . +* +*******************************************************************************/ + +package prompt + +import ( + "io/ioutil" + "os" + "path/filepath" + "strings" + + yaml "gopkg.in/yaml.v2" +) + +func getKubernetesField() string { + configPaths := filepath.SplitList(os.Getenv("KUBECONFIG")) + + var context string + for _, configPath := range configPaths { + context = getKubernetesContext(configPath) + if context != "" { + break + } + } + if context == "" { + return "" + } + + namespaceBytes, err := ioutil.ReadFile(filepath.Join(os.Getenv("HOME"), ".kubectl-namespace")) + namespace := strings.TrimSpace(string(namespaceBytes)) + if err != nil { + if !os.IsNotExist(err) { + handleError(err) + } + namespace = "" + } + if namespace != "" { + context += "/" + namespace + } + + return withType("kube", context) +} + +func getKubernetesContext(configPath string) string { + buf, err := ioutil.ReadFile(configPath) + if err != nil { + //non-existence is acceptable, just make the caller continue with the next configPath + if !os.IsNotExist(err) { + handleError(err) + } + return "" + } + + var data struct { + CurrentContext string `yaml:"current-context"` + } + err = yaml.Unmarshal(buf, &data) + handleError(err) + return strings.TrimSpace(data.CurrentContext) +} + +func getOpenstackField() string { + cloudName := os.Getenv("CURRENT_OS_CLOUD") + if cloudName == "" { + return "" + } + return withType("cloud", cloudName) +} diff --git a/pkg/prompt/main.go b/pkg/prompt/main.go index 419b704..1dcbbc7 100644 --- a/pkg/prompt/main.go +++ b/pkg/prompt/main.go @@ -39,6 +39,8 @@ func Exec(args []string) int { fields = appendUnlessEmpty(fields, getDeletedMessageField(cwd)) fields = appendUnlessEmpty(fields, getRepoStatusField(cwd.RepoRootPath)) fields = appendUnlessEmpty(fields, getTerminalField()) + fields = appendUnlessEmpty(fields, getOpenstackField()) + fields = appendUnlessEmpty(fields, getKubernetesField()) //this field should always be last if len(args) > 0 { fields = appendUnlessEmpty(fields, getExitCodeField(args[0])) -- cgit v1.3.1