updates + cleanup

mine
derailed 2019-11-15 18:30:29 -07:00
parent 162e3fe7ed
commit 5b0fd805ce
9 changed files with 85 additions and 76 deletions

View File

@ -118,7 +118,7 @@ func loadConfiguration() *config.Config {
if err := k9sCfg.Refine(k8sFlags); err != nil {
log.Panic().Err(err).Msg("Unable to locate kubeconfig file")
}
k9sCfg.SetConnection(k8s.InitConnectionOrDie(k8sCfg, log.Logger))
k9sCfg.SetConnection(k8s.InitConnectionOrDie(k8sCfg))
// Try to access server version if that fail. Connectivity issue?
if _, err := k9sCfg.GetConnection().ServerVersion(); err != nil {

View File

@ -9,7 +9,6 @@ import (
"k8s.io/client-go/discovery/cached/disk"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
authorizationv1 "k8s.io/api/authorization/v1"
v1 "k8s.io/api/core/v1"
@ -66,24 +65,27 @@ type (
CanIAccess(ns, rvg string, verbs []string) (bool, error)
}
// APIClient represents a Kubernetes api client.
APIClient struct {
clients struct {
client kubernetes.Interface
dClient dynamic.Interface
nsClient dynamic.NamespaceableResourceInterface
mxsClient *versioned.Clientset
cachedDiscovery *disk.CachedDiscoveryClient
}
// APIClient represents a Kubernetes api client.
APIClient struct {
clients
config *Config
useMetricServer bool
log zerolog.Logger
mx sync.Mutex
}
)
// InitConnectionOrDie initialize connection from command line args.
// Checks for connectivity with the api server.
func InitConnectionOrDie(config *Config, logger zerolog.Logger) *APIClient {
conn := APIClient{config: config, log: logger}
func InitConnectionOrDie(config *Config) *APIClient {
conn := APIClient{config: config}
conn.useMetricServer = conn.supportsMxServer()
return &conn
@ -242,7 +244,7 @@ func (a *APIClient) DialOrDie() kubernetes.Interface {
var err error
if a.client, err = kubernetes.NewForConfig(a.RestConfigOrDie()); err != nil {
a.log.Fatal().Msgf("Unable to connect to api server %v", err)
log.Fatal().Msgf("Unable to connect to api server %v", err)
}
return a.client
}
@ -251,7 +253,7 @@ func (a *APIClient) DialOrDie() kubernetes.Interface {
func (a *APIClient) RestConfigOrDie() *restclient.Config {
cfg, err := a.config.RESTConfig()
if err != nil {
a.log.Panic().Msgf("Unable to connect to api server %v", err)
log.Panic().Msgf("Unable to connect to api server %v", err)
}
return cfg
}
@ -281,7 +283,7 @@ func (a *APIClient) DynDialOrDie() dynamic.Interface {
var err error
if a.dClient, err = dynamic.NewForConfig(a.RestConfigOrDie()); err != nil {
a.log.Panic().Err(err)
log.Panic().Err(err)
}
return a.dClient
}
@ -313,7 +315,7 @@ func (a *APIClient) MXDial() (*versioned.Clientset, error) {
}
var err error
if a.mxsClient, err = versioned.NewForConfig(a.RestConfigOrDie()); err != nil {
a.log.Error().Err(err)
log.Error().Err(err)
}
return a.mxsClient, err

View File

@ -123,7 +123,6 @@ func (s *Stack) Peek() []Component {
// ClearHistory clear out the stack history up to most recent.
func (s *Stack) ClearHistory() {
s.DumpStack()
top := s.Top()
for range s.components {
s.Pop()

View File

@ -48,16 +48,22 @@ type (
// RowEvents tracks resource update events.
RowEvents map[string]*RowEvent
// TypeName captures resource names.
TypeName struct {
Singular string
Plural string
ShortNames []string
}
// TypeMeta represents resource type meta data.
TypeMeta struct {
TypeName
Name string
Namespaced bool
Group string
Version string
Kind string
Singular string
Plural string
ShortNames []string
}
// TableData tracks a K8s resource for tabular display.

View File

@ -84,9 +84,6 @@ func (a *App) ActiveView() model.Component {
}
func (a *App) PrevCmd(evt *tcell.EventKey) *tcell.EventKey {
log.Debug().Msgf("------ CONTENT PREVIOUS")
a.Content.DumpStack()
a.Content.DumpPages()
if !a.Content.IsLast() {
a.Content.Pop()
}

View File

@ -65,8 +65,7 @@ func (c *Container) extraActions(aa ui.KeyActions) {
}
func (c *Container) k9sEnv() K9sEnv {
env := c.defaultK9sEnv()
env := defaultK9sEnv(c.app, c.masterPage().GetSelectedItem(), c.masterPage().GetRow())
ns, n := namespaced(*c.path)
env["POD"] = n
env["NAMESPACE"] = ns

View File

@ -9,6 +9,7 @@ import (
"strings"
"github.com/derailed/k9s/internal/model"
"github.com/derailed/k9s/internal/resource"
"github.com/derailed/k9s/internal/ui"
"github.com/derailed/tview"
"github.com/gdamore/tcell"
@ -235,3 +236,44 @@ func keyConv(s string) string {
return strings.Replace(s, "alt", "opt", 1)
}
func defaultK9sEnv(app *App, sel string, row resource.Row) K9sEnv {
ns, n := namespaced(sel)
ctx, err := app.Conn().Config().CurrentContextName()
if err != nil {
ctx = resource.NAValue
}
cluster, err := app.Conn().Config().CurrentClusterName()
if err != nil {
cluster = resource.NAValue
}
user, err := app.Conn().Config().CurrentUserName()
if err != nil {
user = resource.NAValue
}
groups, err := app.Conn().Config().CurrentGroupNames()
if err != nil {
groups = []string{resource.NAValue}
}
var cfg string
kcfg := app.Conn().Config().Flags().KubeConfig
if kcfg != nil && *kcfg != "" {
cfg = *kcfg
}
env := K9sEnv{
"NAMESPACE": ns,
"NAME": n,
"CONTEXT": ctx,
"CLUSTER": cluster,
"USER": user,
"GROUPS": strings.Join(groups, ","),
"KUBECONFIG": cfg,
}
for i, r := range row {
env["COL"+strconv.Itoa(i)] = r
}
return env
}

View File

@ -9,24 +9,31 @@ import (
"github.com/gdamore/tcell"
)
type TableExtender struct {
extraActionsFn func(ui.KeyActions)
colorerFn ui.ColorerFunc
decorateFn decorateFn
enterFn enterFn
}
// MasterDetail presents a master-detail viewer.
type MasterDetail struct {
*PageStack
*TableExtender
enterFn enterFn
extraActionsFn func(ui.KeyActions)
master *Table
details *Details
currentNS string
title string
master *Table
details *Details
currentNS string
title string
}
// NewMasterDetail returns a new master-detail viewer.
func NewMasterDetail(title, ns string) *MasterDetail {
return &MasterDetail{
PageStack: NewPageStack(),
title: title,
currentNS: ns,
PageStack: NewPageStack(),
TableExtender: &TableExtender{},
title: title,
currentNS: ns,
}
}
@ -106,9 +113,6 @@ func (m *MasterDetail) defaultActions(aa ui.KeyActions) {
}
func (m *MasterDetail) backCmd(evt *tcell.EventKey) *tcell.EventKey {
m.DumpPages()
m.DumpStack()
if !m.isMaster() {
return m.app.PrevCmd(evt)
}

View File

@ -28,8 +28,6 @@ type Resource struct {
list resource.List
cancelFn context.CancelFunc
path *string
colorerFn ui.ColorerFunc
decorateFn decorateFn
envFn envFn
gvr string
}
@ -116,15 +114,15 @@ func (r *Resource) update(ctx context.Context) {
}(ctx)
}
// ----------------------------------------------------------------------------
// Actions...
func (r *Resource) backCmd(*tcell.EventKey) *tcell.EventKey {
r.Pop()
return nil
}
// ----------------------------------------------------------------------------
// Actions...
func (r *Resource) cpCmd(evt *tcell.EventKey) *tcell.EventKey {
if !r.masterPage().RowSelected() {
return evt
@ -440,43 +438,5 @@ func (r *Resource) execCmd(bin string, bg bool, args ...string) ui.ActionHandler
}
func (r *Resource) defaultK9sEnv() K9sEnv {
ns, n := namespaced(r.masterPage().GetSelectedItem())
ctx, err := r.app.Conn().Config().CurrentContextName()
if err != nil {
ctx = resource.NAValue
}
cluster, err := r.app.Conn().Config().CurrentClusterName()
if err != nil {
cluster = resource.NAValue
}
user, err := r.app.Conn().Config().CurrentUserName()
if err != nil {
user = resource.NAValue
}
groups, err := r.app.Conn().Config().CurrentGroupNames()
if err != nil {
groups = []string{resource.NAValue}
}
var cfg string
kcfg := r.app.Conn().Config().Flags().KubeConfig
if kcfg != nil && *kcfg != "" {
cfg = *kcfg
}
env := K9sEnv{
"NAMESPACE": ns,
"NAME": n,
"CONTEXT": ctx,
"CLUSTER": cluster,
"USER": user,
"GROUPS": strings.Join(groups, ","),
"KUBECONFIG": cfg,
}
row := r.masterPage().GetRow()
for i, r := range row {
env["COL"+strconv.Itoa(i)] = r
}
return env
return defaultK9sEnv(r.app, r.masterPage().GetSelectedItem(), r.masterPage().GetRow())
}