From 0a6caa2d5445e04a164b09ca0f1e2b016f0c619e Mon Sep 17 00:00:00 2001 From: derailed Date: Tue, 26 Mar 2019 08:13:53 -0600 Subject: [PATCH 1/2] checkpoint rbac --- .goreleaser.yml | 40 ++++++++++++++++++++++++++++++ cmd/info.go | 13 ++++++---- cmd/version.go | 22 +++++++++++------ internal/k8s/rbac.go | 51 +++++++++++++++++++++++++++++++++++++++ internal/k8s/rbac_test.go | 32 ++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 internal/k8s/rbac.go create mode 100644 internal/k8s/rbac_test.go diff --git a/.goreleaser.yml b/.goreleaser.yml index 5ad5e7f6..4f679b79 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -17,6 +17,11 @@ builds: goarch: - 386 - amd64 + - arm + - arm64 + goarm: + - 6 + - 7 ldflags: - -s -w -X github.com/derailed/k9s/cmd.version={{.Version}} -X github.com/derailed/k9s/cmd.commit={{.Commit}} -X github.com/derailed/k9s/cmd.date={{.Date}} @@ -25,6 +30,8 @@ archive: darwin: Darwin linux: Linux windows: Windows + arm: 32-bit + arm64: 64-bit 386: i386 amd64: x86_64 checksum: @@ -52,3 +59,36 @@ brew: description: Kubernetes CLI To Manage Your Clusters In Style! test: | system "k9s version" + +# Snap +snapcraft: + name: k9s + name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" + + replacements: + amd64: 64-bit + 386: 32-bit + darwin: macOS + linux: Tux + + publish: false + + summary: K9s is a CLI to view and manage your Kubernetes clusters. + description: | + K9s is a CLI to view and manage your Kubernetes clusters. + By leveraging a terminal UI, you can easily traverse Kubernetes resources + and view the state of you clusters in a single powerful session. + + grade: devel + confinement: devmode + + apps: + k9s: + plugs: ["home", "network", "home-dir"] + + plugs: + home-dir: + read: + - $HOME/.k9s + write: + - $HOME/.k9s diff --git a/cmd/info.go b/cmd/info.go index a428446c..0d80cc95 100644 --- a/cmd/info.go +++ b/cmd/info.go @@ -21,13 +21,16 @@ func infoCmd() *cobra.Command { } func printInfo() { + const secFmt = "%-15s " + + printLogo() + printTuple(secFmt, "Configuration", config.K9sConfigFile) + printTuple(secFmt, "Logs", config.K9sLogs) +} + +func printLogo() { for _, l := range views.LogoSmall { fmt.Println(printer.Colorize(l, printer.ColorCyan)) } fmt.Println() - fmt.Printf(printer.Colorize(fmt.Sprintf("%-15s", "Configuration:"), printer.ColorCyan)) - fmt.Println(printer.Colorize(config.K9sConfigFile, printer.ColorWhite)) - - fmt.Printf(printer.Colorize(fmt.Sprintf("%-15s", "Logs:"), printer.ColorCyan)) - fmt.Println(printer.Colorize(config.K9sLogs, printer.ColorWhite)) } diff --git a/cmd/version.go b/cmd/version.go index 75868e3f..7eca7d28 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -13,13 +13,21 @@ func versionCmd() *cobra.Command { Short: "Print version info", Long: "Prints version info", Run: func(cmd *cobra.Command, args []string) { - const secFmt = "%-10s" - fmt.Printf(printer.Colorize(fmt.Sprintf(secFmt, "Version:"), printer.ColorMagenta)) - fmt.Println(printer.Colorize(version, printer.ColorDarkGray)) - fmt.Printf(printer.Colorize(fmt.Sprintf(secFmt, "Commit:"), printer.ColorMagenta)) - fmt.Println(printer.Colorize(commit, printer.ColorDarkGray)) - fmt.Printf(printer.Colorize(fmt.Sprintf(secFmt, "Date:"), printer.ColorMagenta)) - fmt.Println(printer.Colorize(date, printer.ColorDarkGray)) + printVersion() }, } } + +func printVersion() { + const secFmt = "%-10s " + + printLogo() + printTuple(secFmt, "Version", version) + printTuple(secFmt, "Commit", commit) + printTuple(secFmt, "Date", date) +} + +func printTuple(format, section, value string) { + fmt.Printf(printer.Colorize(fmt.Sprintf(format, section+":"), printer.ColorCyan)) + fmt.Println(printer.Colorize(value, printer.ColorWhite)) +} diff --git a/internal/k8s/rbac.go b/internal/k8s/rbac.go new file mode 100644 index 00000000..259d7934 --- /dev/null +++ b/internal/k8s/rbac.go @@ -0,0 +1,51 @@ +package k8s + +import ( + "fmt" + "time" + + "github.com/rs/zerolog/log" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + // rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" +) + +func GetFu(c Connection, kind, name string) error { + defer func(t time.Time) { + log.Info().Msgf("Elapsed %v", time.Since(t)) + }(time.Now()) + + crbs, err := c.DialOrDie().RbacV1().ClusterRoleBindings().List(metav1.ListOptions{ + FieldSelector: "metadata.name=cluster-admin", + }) + if err != nil { + return err + } + + log.Info().Msgf("Len %d", len(crbs.Items)) + + var crs []string + for _, crb := range crbs.Items { + log.Info().Msgf("> CRB %s", crb.Name) + for _, s := range crb.Subjects { + // log.Info().Msgf(" Sub %s %s", s.Kind, s.Name) + if s.Kind == kind && s.Name == name { + crs = append(crs, crb.RoleRef.Name) + } + } + } + + fmt.Printf("Find cluster roles %#v\n", crs) + + // Each role has multiple rules + for _, r := range crs { + cr, err := c.DialOrDie().RbacV1().ClusterRoles().Get(r, metav1.GetOptions{}) + if err != nil { + log.Error().Err(err).Msgf("Unable to find cluster role %s ", r) + } + for _, rule := range cr.Rules { + log.Info().Msgf("Found rule %#v", rule.APIGroups) + } + } + + return nil +} diff --git a/internal/k8s/rbac_test.go b/internal/k8s/rbac_test.go new file mode 100644 index 00000000..4dc4eb82 --- /dev/null +++ b/internal/k8s/rbac_test.go @@ -0,0 +1,32 @@ +package k8s + +import ( + "os" + "testing" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/stretchr/testify/assert" + "k8s.io/cli-runtime/pkg/genericclioptions" + _ "k8s.io/client-go/plugin/pkg/client/auth" +) + +func TestRBACFu(t *testing.T) { + con := dial() + assert.Nil(t, GetFu(con, "Group", "system:masters")) +} + +func dial() *APIClient { + zerolog.SetGlobalLevel(zerolog.InfoLevel) + log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) + + // c, u := "gke_k9s", "gke_k9s_user" + c, u := "minikube", "minikube" + + flags := genericclioptions.ConfigFlags{ + ClusterName: &c, + AuthInfoName: &u, + } + cfg := NewConfig(&flags) + return InitConnectionOrDie(cfg, log.Logger) +} From 5f0a5df90a3a3d4bdde8db222333f617472182c5 Mon Sep 17 00:00:00 2001 From: derailed Date: Tue, 26 Mar 2019 10:18:39 -0600 Subject: [PATCH 2/2] fix colors for version cmd + first try arm and snap builds --- .goreleaser.yml | 4 +-- change_logs/release_0.3.3.md | 26 ++++++++++++++++++ internal/k8s/rbac.go | 51 ------------------------------------ internal/k8s/rbac_test.go | 32 ---------------------- 4 files changed, 28 insertions(+), 85 deletions(-) create mode 100644 change_logs/release_0.3.3.md delete mode 100644 internal/k8s/rbac.go delete mode 100644 internal/k8s/rbac_test.go diff --git a/.goreleaser.yml b/.goreleaser.yml index 4f679b79..2491c4c8 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -60,7 +60,7 @@ brew: test: | system "k9s version" -# Snap +# Snapcraft snapcraft: name: k9s name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}" @@ -71,7 +71,7 @@ snapcraft: darwin: macOS linux: Tux - publish: false + publish: true summary: K9s is a CLI to view and manage your Kubernetes clusters. description: | diff --git a/change_logs/release_0.3.3.md b/change_logs/release_0.3.3.md new file mode 100644 index 00000000..de84cd18 --- /dev/null +++ b/change_logs/release_0.3.3.md @@ -0,0 +1,26 @@ +# Release v0.3.3 + +## Notes + +Thank you to all that contributed with flushing out issues with K9s! I'll try +to mark some of these issues as fixed. But if you don't mind grab the latest +rev and see if we're happier with some of the fixes! + +If you've filed an issue please help me verify and close. + +Thank you so much for your support!! + +--- + +## Change Logs + +1. [Feature #131](https://github.com/derailed/k9s/issues/131) + Preliminary support for snapcraft builds ie read trying this out... +2. [Feature #118](https://github.com/derailed/k9s/issues/118) Add arm 32/64 bit builds. + NOTE: will need help vetting this out as my rpi cluster is currently down. + +--- + +## Resolved Bugs + ++ [Feature #132](https://github.com/derailed/k9s/issues/132). With feelings! diff --git a/internal/k8s/rbac.go b/internal/k8s/rbac.go deleted file mode 100644 index 259d7934..00000000 --- a/internal/k8s/rbac.go +++ /dev/null @@ -1,51 +0,0 @@ -package k8s - -import ( - "fmt" - "time" - - "github.com/rs/zerolog/log" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - // rbacv1 "k8s.io/client-go/kubernetes/typed/rbac/v1" -) - -func GetFu(c Connection, kind, name string) error { - defer func(t time.Time) { - log.Info().Msgf("Elapsed %v", time.Since(t)) - }(time.Now()) - - crbs, err := c.DialOrDie().RbacV1().ClusterRoleBindings().List(metav1.ListOptions{ - FieldSelector: "metadata.name=cluster-admin", - }) - if err != nil { - return err - } - - log.Info().Msgf("Len %d", len(crbs.Items)) - - var crs []string - for _, crb := range crbs.Items { - log.Info().Msgf("> CRB %s", crb.Name) - for _, s := range crb.Subjects { - // log.Info().Msgf(" Sub %s %s", s.Kind, s.Name) - if s.Kind == kind && s.Name == name { - crs = append(crs, crb.RoleRef.Name) - } - } - } - - fmt.Printf("Find cluster roles %#v\n", crs) - - // Each role has multiple rules - for _, r := range crs { - cr, err := c.DialOrDie().RbacV1().ClusterRoles().Get(r, metav1.GetOptions{}) - if err != nil { - log.Error().Err(err).Msgf("Unable to find cluster role %s ", r) - } - for _, rule := range cr.Rules { - log.Info().Msgf("Found rule %#v", rule.APIGroups) - } - } - - return nil -} diff --git a/internal/k8s/rbac_test.go b/internal/k8s/rbac_test.go deleted file mode 100644 index 4dc4eb82..00000000 --- a/internal/k8s/rbac_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package k8s - -import ( - "os" - "testing" - - "github.com/rs/zerolog" - "github.com/rs/zerolog/log" - "github.com/stretchr/testify/assert" - "k8s.io/cli-runtime/pkg/genericclioptions" - _ "k8s.io/client-go/plugin/pkg/client/auth" -) - -func TestRBACFu(t *testing.T) { - con := dial() - assert.Nil(t, GetFu(con, "Group", "system:masters")) -} - -func dial() *APIClient { - zerolog.SetGlobalLevel(zerolog.InfoLevel) - log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) - - // c, u := "gke_k9s", "gke_k9s_user" - c, u := "minikube", "minikube" - - flags := genericclioptions.ConfigFlags{ - ClusterName: &c, - AuthInfoName: &u, - } - cfg := NewConfig(&flags) - return InitConnectionOrDie(cfg, log.Logger) -}