From 582bb8593401b9b384095d22fc8fde46cc68157e Mon Sep 17 00:00:00 2001 From: Extreme <1403539044@qq.com> Date: Tue, 23 Jan 2024 14:11:04 +0800 Subject: [PATCH] refactor: Add option struct to optimize parameter transfer (#112) Signed-off-by: Extreme <1403539044@qq.com> Co-authored-by: Rob Scott --- pkg/capacity/capacity.go | 25 +++++++++--------- pkg/capacity/options.go | 22 ++++++++++++++++ pkg/cmd/root.go | 56 ++++++++++++++-------------------------- 3 files changed, 54 insertions(+), 49 deletions(-) create mode 100644 pkg/capacity/options.go diff --git a/pkg/capacity/capacity.go b/pkg/capacity/capacity.go index fc9dee7e..0b938eae 100644 --- a/pkg/capacity/capacity.go +++ b/pkg/capacity/capacity.go @@ -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) { diff --git a/pkg/capacity/options.go b/pkg/capacity/options.go new file mode 100644 index 00000000..c2d1f096 --- /dev/null +++ b/pkg/capacity/options.go @@ -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 +} diff --git a/pkg/cmd/root.go b/pkg/cmd/root.go index cd9f4746..1fda6820 100644 --- a/pkg/cmd/root.go +++ b/pkg/cmd/root.go @@ -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", @@ -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") }