feat: use clientcmd instead of kubectl to minimize binary size

This commit is contained in:
Marc Nuri
2025-02-17 05:40:01 +01:00
parent 5af6c3b6c4
commit 183f72522c
5 changed files with 28 additions and 133 deletions

View File

@@ -1,33 +1,27 @@
package kubernetes
import (
"bytes"
"k8s.io/cli-runtime/pkg/genericiooptions"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/component-base/cli/flag"
"k8s.io/kubectl/pkg/cmd/config"
clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
"k8s.io/client-go/tools/clientcmd/api/latest"
)
func ConfigurationView() (string, error) {
outBuffer := &bytes.Buffer{}
// TODO: consider in cluster run mode (current approach only shows kubeconfig)
pathOptions := clientcmd.NewDefaultPathOptions()
ioStreams := genericiooptions.IOStreams{In: nil, Out: outBuffer, ErrOut: outBuffer}
o := &config.ViewOptions{
IOStreams: ioStreams,
ConfigAccess: pathOptions,
PrintFlags: defaultPrintFlags(),
Flatten: true,
Minify: true,
Merge: flag.True,
}
printer, err := o.PrintFlags.ToPrinter()
cfg, err := pathOptions.GetStartingConfig()
if err != nil {
return "", err
}
o.PrintObject = printer.PrintObj
err = o.Run()
if err = clientcmdapi.MinifyConfig(cfg); err != nil {
return "", err
}
if err = clientcmdapi.FlattenConfig(cfg); err != nil {
return "", err
}
convertedObj, err := latest.Scheme.ConvertToVersion(cfg, latest.ExternalVersion)
if err != nil {
return "", err
}
return outBuffer.String(), nil
return marshal(convertedObj)
}

View File

@@ -1,11 +1,11 @@
package kubernetes
import (
"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/client-go/rest"
"k8s.io/client-go/restmapper"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/kubectl/pkg/scheme"
"sigs.k8s.io/yaml"
)
type Kubernetes struct {
@@ -21,10 +21,20 @@ func NewKubernetes() (*Kubernetes, error) {
return &Kubernetes{cfg: cfg}, nil
}
func defaultPrintFlags() *genericclioptions.PrintFlags {
return genericclioptions.NewPrintFlags("").
WithTypeSetter(scheme.Scheme).
WithDefaultOutput("yaml")
func marshal(v any) (string, error) {
switch t := v.(type) {
case []unstructured.Unstructured:
for i := range t {
t[i].SetManagedFields(nil)
}
case unstructured.Unstructured:
t.SetManagedFields(nil)
}
ret, err := yaml.Marshal(v)
if err != nil {
return "", err
}
return string(ret), nil
}
func resolveClientConfig() (*rest.Config, error) {

View File

@@ -3,13 +3,11 @@ package kubernetes
import (
"context"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/runtime/schema"
"k8s.io/client-go/discovery"
memory "k8s.io/client-go/discovery/cached"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/restmapper"
"sigs.k8s.io/yaml"
)
// TODO: WIP
@@ -29,22 +27,6 @@ func (k *Kubernetes) ResourcesList(ctx context.Context, gvk *schema.GroupVersion
return marshal(rl.Items)
}
func marshal(v any) (string, error) {
switch t := v.(type) {
case []unstructured.Unstructured:
for i := range t {
t[i].SetManagedFields(nil)
}
case unstructured.Unstructured:
t.SetManagedFields(nil)
}
ret, err := yaml.Marshal(v)
if err != nil {
return "", err
}
return string(ret), nil
}
func (k *Kubernetes) resourceFor(gvk *schema.GroupVersionKind) (*schema.GroupVersionResource, error) {
if k.deferredDiscoveryRESTMapper == nil {
d, err := discovery.NewDiscoveryClientForConfig(k.cfg)