updates + cleanup
parent
162e3fe7ed
commit
5b0fd805ce
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue