Skip to content

Commit

Permalink
feat(show/nodes): display running pods count(deployment,statefulsets)…
Browse files Browse the repository at this point in the history
… on nodes
  • Loading branch information
anarcher committed Apr 23, 2021
1 parent b557e39 commit b67b1ac
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 0 deletions.
2 changes: 2 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ func main() {
rootCmd, cfg := cmd.NewRootCmd()
restartCmd := cmd.NewRestartCmd(cfg)
drainCmd := cmd.NewDrainCmd(cfg)
showCmd := cmd.NewShowCmd(cfg)

rootCmd.Subcommands = []*ffcli.Command{
restartCmd,
drainCmd,
showCmd,
}

if err := rootCmd.Parse(os.Args[1:]); err != nil {
Expand Down
25 changes: 25 additions & 0 deletions pkg/cmd/show.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package cmd

import (
"context"
"flag"

"github.com/peterbourgon/ff/v3/ffcli"
)

func NewShowCmd(rootCfg *RootConfig) *ffcli.Command {
showNodesCmd := NewShowNodesCmd(rootCfg)

c := &ffcli.Command{
Name: "show",
ShortUsage: "show details of nodes or resources",
ShortHelp: "show details of nodes or resources",
Exec: func(context.Context, []string) error {
return flag.ErrHelp
},
}
c.Subcommands = []*ffcli.Command{
showNodesCmd,
}
return c
}
133 changes: 133 additions & 0 deletions pkg/cmd/show_nodes.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package cmd

import (
"context"
"flag"

"github.com/fatih/color"
"github.com/peterbourgon/ff/v3"
"github.com/peterbourgon/ff/v3/ffcli"
"github.com/rodaine/table"

v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
)

type NodeInfo struct {
Node v1.Node
Deployments []v1.Pod
Statusfulsets []v1.Pod
}

type ShowNodesConfig struct {
rootCfg *RootConfig
labelSelector string
}

func NewShowNodesCmd(rootCfg *RootConfig) *ffcli.Command {
cfg := &ShowNodesConfig{
rootCfg: rootCfg,
}

fs := flag.NewFlagSet("kroller show nodes", flag.ExitOnError)
fs.String("config", "", "config file (optional)")
fs.StringVar(&cfg.labelSelector, "l", "", "selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)")

rootCfg.RegisterFlags(fs)

c := &ffcli.Command{
Name: "nodes",
ShortUsage: "show details of nodes",
ShortHelp: "show details of nodes",
FlagSet: fs,
Options: []ff.Option{
ff.WithEnvVarNoPrefix(),
ff.WithConfigFileFlag("config"),
ff.WithConfigFileParser(ff.PlainParser),
},
Exec: cfg.Exec,
}

return c
}

func (c *ShowNodesConfig) Exec(ctx context.Context, args []string) error {
//verbose := c.rootCfg.Verbose
kubeCli := c.rootCfg.KubeClient

selector, err := fields.ParseSelector(c.labelSelector)
if err != nil {
return err
}

nodes, err := kubeCli.Nodes(ctx, selector)
if err != nil {
return err
}

var nodeInfos []*NodeInfo
for _, n := range nodes.Items {
pods, err := kubeCli.PodsOnNode(ctx, n.Name)
if err != nil {
return err
}

var (
deploys []v1.Pod
sts []v1.Pod
)
for _, p := range pods.Items {
if isDeploymentPod(&p) {
deploys = append(deploys, p)
continue
}
if isStatefulSetPod(&p) {
sts = append(sts, p)
}
}

ni := &NodeInfo{
Node: n,
Deployments: deploys,
Statusfulsets: sts,
}
nodeInfos = append(nodeInfos, ni)
}

tbl := table.New("Node", "Deployment", "Statusfulsets")
headerFmt := color.New(color.FgGreen, color.Underline).SprintfFunc()
columnFmt := color.New(color.FgYellow).SprintfFunc()
tbl.WithHeaderFormatter(headerFmt).WithFirstColumnFormatter(columnFmt)

for _, n := range nodeInfos {
tbl.AddRow(n.Node.Name, len(n.Deployments), len(n.Statusfulsets))
}

tbl.Print()

return nil
}

func isDeploymentPod(p *v1.Pod) bool {
controllerRef := metav1.GetControllerOf(p)
if controllerRef == nil {
return false
}
if controllerRef.Kind == "ReplicaSet" {
return true
}

return false
}

func isStatefulSetPod(p *v1.Pod) bool {
controllerRef := metav1.GetControllerOf(p)
if controllerRef == nil {
return false
}
if controllerRef.Kind == "StatefulSet" {
return true
}
return false
}
11 changes: 11 additions & 0 deletions pkg/kubernetes/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ import (
"k8s.io/apimachinery/pkg/fields"
)

func (c *Client) Nodes(ctx context.Context, labelSelector fields.Selector) (*v1.NodeList, error) {
nodes, err := c.clientset.CoreV1().Nodes().List(ctx, metav1.ListOptions{
LabelSelector: labelSelector.String(),
})
if err != nil {
return nil, errors.Wrap(err, "failed to find nodes")
}

return nodes, nil
}

func (c *Client) Node(ctx context.Context, nodeName string) (*v1.Node, error) {
node, err := c.clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{})
if err != nil {
Expand Down

0 comments on commit b67b1ac

Please sign in to comment.