Skip to content

Commit

Permalink
refactor: Add option struct to optimize parameter transfer (#112)
Browse files Browse the repository at this point in the history
Signed-off-by: Extreme <1403539044@qq.com>
Co-authored-by: Rob Scott <rob.scott87@gmail.com>
  • Loading branch information
Forget-C and robscott committed Jan 23, 2024
1 parent 6ec65b2 commit 582bb85
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 49 deletions.
25 changes: 12 additions & 13 deletions pkg/capacity/capacity.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,44 +19,43 @@ import (
"fmt"
"os"

"k8s.io/client-go/kubernetes"
metrics "k8s.io/metrics/pkg/client/clientset/versioned"

"github.com/robscott/kube-capacity/pkg/kube"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
v1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1"
metrics "k8s.io/metrics/pkg/client/clientset/versioned"
)

// FetchAndPrint gathers cluster resource data and outputs it
func FetchAndPrint(showContainers, showPods, showUtil, showPodCount, excludeTainted, availableFormat bool, podLabels, nodeLabels, namespaceLabels, namespace, kubeContext, kubeConfig, impersonateUser string, impersonateGroup string, output, sortBy string) {
clientset, err := kube.NewClientSet(kubeContext, kubeConfig, impersonateUser, impersonateGroup)
func FetchAndPrint(opts Options) {
clientset, err := kube.NewClientSet(opts.KubeConfig, opts.KubeContext, opts.ImpersonateUser, opts.ImpersonateGroup)
if err != nil {
fmt.Printf("Error connecting to Kubernetes: %v\n", err)
os.Exit(1)
}

podList, nodeList := getPodsAndNodes(clientset, excludeTainted, podLabels, nodeLabels, namespaceLabels, namespace)
podList, nodeList := getPodsAndNodes(clientset, opts.ExcludeTainted, opts.PodLabels, opts.NodeLabels, opts.NamespaceLabels, opts.Namespace)
var pmList *v1beta1.PodMetricsList
var nmList *v1beta1.NodeMetricsList

if showUtil {
mClientset, err := kube.NewMetricsClientSet(kubeContext, kubeConfig)
if opts.ShowUtil {
mClientset, err := kube.NewMetricsClientSet(opts.KubeContext, opts.KubeConfig)
if err != nil {
fmt.Printf("Error connecting to Metrics API: %v\n", err)
os.Exit(4)
}

pmList = getPodMetrics(mClientset, namespace)
if namespace == "" && namespaceLabels == "" {
nmList = getNodeMetrics(mClientset, nodeLabels)
pmList = getPodMetrics(mClientset, opts.Namespace)
if opts.Namespace == "" && opts.NamespaceLabels == "" {
nmList = getNodeMetrics(mClientset, opts.NodeLabels)
}
}

cm := buildClusterMetric(podList, pmList, nodeList, nmList)
showNamespace := namespace == ""
showNamespace := opts.Namespace == ""

printList(&cm, showContainers, showPods, showUtil, showPodCount, showNamespace, output, sortBy, availableFormat)
printList(&cm, opts.ShowContainers, opts.ShowPods, opts.ShowUtil, opts.ShowPodCount, showNamespace, opts.OutputFormat, opts.SortBy, opts.AvailableFormat)
}

func getPodsAndNodes(clientset kubernetes.Interface, excludeTainted bool, podLabels, nodeLabels, namespaceLabels, namespace string) (*corev1.PodList, *corev1.NodeList) {
Expand Down
22 changes: 22 additions & 0 deletions pkg/capacity/options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package capacity

// Options is a struct containing the command line options
// FetchAndPrint depends on
type Options struct {
ShowContainers bool
ShowPods bool
ShowUtil bool
ShowPodCount bool
PodLabels string
NodeLabels string
ExcludeTainted bool
NamespaceLabels string
Namespace string
KubeContext string
KubeConfig string
OutputFormat string
SortBy string
AvailableFormat bool
ImpersonateUser string
ImpersonateGroup string
}
56 changes: 20 additions & 36 deletions pkg/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,7 @@ import (
"github.com/spf13/cobra"
)

var showContainers bool
var showPods bool
var showUtil bool
var showPodCount bool
var podLabels string
var nodeLabels string
var excludeTainted bool
var namespaceLabels string
var namespace string
var kubeContext string
var kubeConfig string
var outputFormat string
var sortBy string
var availableFormat bool
var impersonateUser string
var impersonateGroup string
var opts capacity.Options

var rootCmd = &cobra.Command{
Use: "kube-capacity",
Expand All @@ -48,50 +33,49 @@ var rootCmd = &cobra.Command{
fmt.Printf("Error parsing flags: %v", err)
}

if err := validateOutputType(outputFormat); err != nil {
if err := validateOutputType(opts.OutputFormat); err != nil {
fmt.Println(err)
os.Exit(1)
}

capacity.FetchAndPrint(showContainers, showPods, showUtil, showPodCount, excludeTainted, availableFormat, podLabels,
nodeLabels, namespaceLabels, namespace, kubeContext, kubeConfig, impersonateUser, impersonateGroup, outputFormat, sortBy)
capacity.FetchAndPrint(opts)
},
}

func init() {
rootCmd.PersistentFlags().BoolVarP(&showContainers,
rootCmd.PersistentFlags().BoolVarP(&opts.ShowContainers,
"containers", "c", false, "includes containers in output")
rootCmd.PersistentFlags().BoolVarP(&showPods,
rootCmd.PersistentFlags().BoolVarP(&opts.ShowPods,
"pods", "p", false, "includes pods in output")
rootCmd.PersistentFlags().BoolVarP(&showUtil,
rootCmd.PersistentFlags().BoolVarP(&opts.ShowUtil,
"util", "u", false, "includes resource utilization in output")
rootCmd.PersistentFlags().BoolVarP(&showPodCount,
rootCmd.PersistentFlags().BoolVarP(&opts.ShowPodCount,
"pod-count", "", false, "includes pod count per node in output")
rootCmd.PersistentFlags().BoolVarP(&availableFormat,
"available", "a", false, "includes quantity available instead of percentage used (ignored with csv or tsv output types)")
rootCmd.PersistentFlags().StringVarP(&podLabels,
rootCmd.PersistentFlags().BoolVarP(&opts.AvailableFormat,
"available", "a", false, "includes quantity available instead of percentage used")
rootCmd.PersistentFlags().StringVarP(&opts.PodLabels,
"pod-labels", "l", "", "labels to filter pods with")
rootCmd.PersistentFlags().StringVarP(&nodeLabels,
rootCmd.PersistentFlags().StringVarP(&opts.NodeLabels,
"node-labels", "", "", "labels to filter nodes with")
rootCmd.PersistentFlags().BoolVarP(&excludeTainted,
rootCmd.PersistentFlags().BoolVarP(&opts.ExcludeTainted,
"no-taint", "", false, "exclude nodes with taints")
rootCmd.PersistentFlags().StringVarP(&namespaceLabels,
rootCmd.PersistentFlags().StringVarP(&opts.NamespaceLabels,
"namespace-labels", "", "", "labels to filter namespaces with")
rootCmd.PersistentFlags().StringVarP(&namespace,
rootCmd.PersistentFlags().StringVarP(&opts.Namespace,
"namespace", "n", "", "only include pods from this namespace")
rootCmd.PersistentFlags().StringVarP(&kubeContext,
rootCmd.PersistentFlags().StringVarP(&opts.KubeContext,
"context", "", "", "context to use for Kubernetes config")
rootCmd.PersistentFlags().StringVarP(&kubeConfig,
rootCmd.PersistentFlags().StringVarP(&opts.KubeConfig,
"kubeconfig", "", "", "kubeconfig file to use for Kubernetes config")
rootCmd.PersistentFlags().StringVarP(&sortBy,
rootCmd.PersistentFlags().StringVarP(&opts.SortBy,
"sort", "", "name",
fmt.Sprintf("attribute to sort results by (supports: %v)", capacity.SupportedSortAttributes))
rootCmd.PersistentFlags().StringVarP(&outputFormat,
rootCmd.PersistentFlags().StringVarP(&opts.OutputFormat,
"output", "o", capacity.TableOutput,
fmt.Sprintf("output format for information (supports: %v)", capacity.SupportedOutputs()))
rootCmd.PersistentFlags().StringVarP(&impersonateUser,
rootCmd.PersistentFlags().StringVarP(&opts.ImpersonateUser,
"as", "", "", "user to impersonate kube-capacity with")
rootCmd.PersistentFlags().StringVarP(&impersonateGroup,
rootCmd.PersistentFlags().StringVarP(&opts.ImpersonateGroup,
"as-group", "", "", "group to impersonate kube-capacity with")
}

Expand Down

0 comments on commit 582bb85

Please sign in to comment.