From 7537f6dc70c6254857762a3b5657b2e84ed61b0e Mon Sep 17 00:00:00 2001 From: Travis Illig Date: Thu, 15 Oct 2020 10:48:41 -0700 Subject: [PATCH] feat: kubectl context display segment Segment displays the current Kubernetes context name when available. --- docs/docs/segment-kubectl.md | 24 +++++++++++++++++++++ docs/sidebars.js | 1 + segment.go | 3 +++ segment_kubectl.go | 24 +++++++++++++++++++++ segment_kubectl_test.go | 42 ++++++++++++++++++++++++++++++++++++ 5 files changed, 94 insertions(+) create mode 100644 docs/docs/segment-kubectl.md create mode 100644 segment_kubectl.go create mode 100755 segment_kubectl_test.go diff --git a/docs/docs/segment-kubectl.md b/docs/docs/segment-kubectl.md new file mode 100644 index 000000000000..93f647c25c12 --- /dev/null +++ b/docs/docs/segment-kubectl.md @@ -0,0 +1,24 @@ +--- +id: kubectl +title: Kubectl Context +sidebar_label: Kubectl +--- + +## What + +Display the currently active Kubernetes context name. + +## Sample Configuration + +```json +{ + "type": "kubectl", + "style": "powerline", + "powerline_symbol": "", + "foreground": "#000000", + "background": "#ebcc34", + "properties": { + "prefix": " ⎈ " + } +} +``` diff --git a/docs/sidebars.js b/docs/sidebars.js index cfc7a7d7f76e..ac2ad9923452 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -20,6 +20,7 @@ module.exports = { "environment", "exit", "git", + "kubectl", "node", "os", "path", diff --git a/segment.go b/segment.go index 36037c9c4b2d..91fb77bcae5f 100644 --- a/segment.go +++ b/segment.go @@ -65,6 +65,8 @@ const ( EnvVar SegmentType = "envvar" //Az writes the Azure subscription info we're currently in Az SegmentType = "az" + //Kubectl writes the Kubernetes context we're currently in + Kubectl SegmentType = "kubectl" //Powerline writes it Powerline style Powerline SegmentStyle = "powerline" //Plain writes it without ornaments @@ -120,6 +122,7 @@ func (segment *Segment) mapSegmentWithWriter(env environmentInfo) error { Os: &osInfo{}, EnvVar: &envvar{}, Az: &az{}, + Kubectl: &kubectl{}, } if writer, ok := functions[segment.Type]; ok { props := &properties{ diff --git a/segment_kubectl.go b/segment_kubectl.go new file mode 100644 index 000000000000..1ea71288895e --- /dev/null +++ b/segment_kubectl.go @@ -0,0 +1,24 @@ +package main + +type kubectl struct { + props *properties + env environmentInfo + contextName string +} + +func (k *kubectl) string() string { + return k.contextName +} + +func (k *kubectl) init(props *properties, env environmentInfo) { + k.props = props + k.env = env +} + +func (k *kubectl) enabled() bool { + if !k.env.hasCommand("kubectl") { + return false + } + k.contextName = k.env.runCommand("kubectl", "config", "current-context") + return true +} diff --git a/segment_kubectl_test.go b/segment_kubectl_test.go new file mode 100755 index 000000000000..74fe2ca6c476 --- /dev/null +++ b/segment_kubectl_test.go @@ -0,0 +1,42 @@ +package main + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +type kubectlArgs struct { + enabled bool + contextName string +} + +func bootStrapKubectlTest(args *kubectlArgs) *kubectl { + env := new(MockedEnvironment) + env.On("hasCommand", "kubectl").Return(args.enabled) + env.On("runCommand", "kubectl", []string{"config", "current-context"}).Return(args.contextName) + k := &kubectl{ + env: env, + props: &properties{}, + } + return k +} + +func TestKubectlWriterDisabled(t *testing.T) { + args := &kubectlArgs{ + enabled: false, + } + kubectl := bootStrapKubectlTest(args) + assert.False(t, kubectl.enabled()) +} + +func TestKubectlEnabled(t *testing.T) { + expected := "context-name" + args := &kubectlArgs{ + enabled: true, + contextName: expected, + } + kubectl := bootStrapKubectlTest(args) + assert.True(t, kubectl.enabled()) + assert.Equal(t, expected, kubectl.string()) +}