Skip to content

Commit

Permalink
simplify repo by moving client initialisation to the new method
Browse files Browse the repository at this point in the history
  • Loading branch information
bergerx committed Aug 11, 2024
1 parent dfea047 commit e25445c
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 76 deletions.
97 changes: 25 additions & 72 deletions pkg/input/input.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,17 +54,26 @@ func (u Objects) Swap(i, j int) {
u[i], u[j] = u[j], u[i]
}

func NewResourceRepo(factory util.Factory) *ResourceRepo {
return &ResourceRepo{
f: factory,
func NewResourceRepo(factory util.Factory) (*ResourceRepo, error) {
dynamicClient, err := factory.DynamicClient()
if err != nil {
return nil, err
}
kubernetesClientSet, err := factory.KubernetesClientSet()
if err != nil {
return nil, err
}
return &ResourceRepo{
f: factory,
dynamicClient: dynamicClient,
kubernetesClientSet: kubernetesClientSet,
}, nil
}

type ResourceRepo struct {
f util.Factory

client dynamic.Interface
clientSet *kubernetes.Clientset
f util.Factory
dynamicClient dynamic.Interface
kubernetesClientSet *kubernetes.Clientset
}

func (r *ResourceRepo) newBaseBuilder() *resource.Builder {
Expand Down Expand Up @@ -184,12 +193,7 @@ func (r *ResourceRepo) FirstObject(namespace string, args []string, labelSelecto
}

func (r *ResourceRepo) ObjectEvents(u *unstructured.Unstructured) (*corev1.EventList, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
klog.V(3).ErrorS(err, "error getting events", "r", r)
return nil, err
}
eventList, err := clientSet.CoreV1().Events(u.GetNamespace()).Search(scheme.Scheme, u)
eventList, err := r.kubernetesClientSet.CoreV1().Events(u.GetNamespace()).Search(scheme.Scheme, u)
if err != nil {
klog.V(3).ErrorS(err, "error getting events", "r", r)
return nil, err
Expand All @@ -198,34 +202,8 @@ func (r *ResourceRepo) ObjectEvents(u *unstructured.Unstructured) (*corev1.Event
return eventList, nil
}

func (r *ResourceRepo) kubernetesClientSet() (*kubernetes.Clientset, error) {
if r.clientSet == nil {
var err error
r.clientSet, err = r.f.KubernetesClientSet()
if err != nil {
return nil, err
}
}
return r.clientSet, nil
}

func (r *ResourceRepo) dynamicClient() (dynamic.Interface, error) {
if r.client == nil {
var err error
r.client, err = r.f.DynamicClient()
if err != nil {
return nil, err
}
}
return r.client, nil
}

func (r *ResourceRepo) DynamicObject(gvr schema.GroupVersionResource, namespace string, name string) (Object, error) {
dynamicClient, err := r.dynamicClient()
if err != nil {
return nil, err
}
u, err := dynamicClient.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
u, err := r.dynamicClient.Resource(gvr).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
if err != nil {
return nil, err
}
Expand All @@ -237,11 +215,7 @@ func (r *ResourceRepo) DynamicObject(gvr schema.GroupVersionResource, namespace
}

func (r *ResourceRepo) DynamicObjects(gvr schema.GroupVersionResource, namespace string) (Objects, error) {
dynamicClient, err := r.dynamicClient()
if err != nil {
return nil, err
}
unstructuredList, err := dynamicClient.Resource(gvr).Namespace(namespace).List(context.TODO(), metav1.ListOptions{})
unstructuredList, err := r.dynamicClient.Resource(gvr).Namespace(namespace).List(context.TODO(), metav1.ListOptions{})
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -312,46 +286,26 @@ func (r *ResourceRepo) mappingFor(resourceOrKindArg string) (*meta.RESTMapping,
}

func (r *ResourceRepo) Ingresses(namespace string) (*netv1.IngressList, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
return nil, err
}
return clientSet.NetworkingV1().Ingresses(namespace).List(context.TODO(), metav1.ListOptions{})
return r.kubernetesClientSet.NetworkingV1().Ingresses(namespace).List(context.TODO(), metav1.ListOptions{})
}

func (r *ResourceRepo) Services(namespace string) (*corev1.ServiceList, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
return nil, err
}
return clientSet.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{})
return r.kubernetesClientSet.CoreV1().Services(namespace).List(context.TODO(), metav1.ListOptions{})
}

func (r *ResourceRepo) Service(namespace, name string) (*corev1.Service, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
return nil, err
}
return clientSet.CoreV1().Services(namespace).Get(context.TODO(), name, metav1.GetOptions{})
return r.kubernetesClientSet.CoreV1().Services(namespace).Get(context.TODO(), name, metav1.GetOptions{})
}

func (r *ResourceRepo) Endpoints(namespace string) (*corev1.EndpointsList, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
return nil, err
}
return clientSet.CoreV1().Endpoints(namespace).List(context.TODO(), metav1.ListOptions{})
return r.kubernetesClientSet.CoreV1().Endpoints(namespace).List(context.TODO(), metav1.ListOptions{})
}

// KubeGetNodeStatsSummary returns this structure
// > kubectl get --raw /api/v1/nodes/{nodeName}/proxy/stats/summary
// The endpoint that this function uses will be disabled soon: https://github.com/kubernetes/kubernetes/issues/68522
func (r *ResourceRepo) KubeGetNodeStatsSummary(nodeName string) (Object, error) {
clientSet, err := r.kubernetesClientSet()
if err != nil {
return nil, err
}
getBytes, err := clientSet.CoreV1().RESTClient().Get().
getBytes, err := r.kubernetesClientSet.CoreV1().RESTClient().Get().
Resource("nodes").
SubResource("proxy").
Name(nodeName).
Expand All @@ -366,7 +320,6 @@ func (r *ResourceRepo) KubeGetNodeStatsSummary(nodeName string) (Object, error)
}

func (r *ResourceRepo) NonTerminatedPodsOnTheNode(nodeName string) (Objects, error) {
clientSet, _ := r.kubernetesClientSet()
fieldSelector, err := fields.ParseSelector("spec.nodeName=" + nodeName +
",status.phase!=" + string(corev1.PodSucceeded) +
",status.phase!=" + string(corev1.PodFailed))
Expand All @@ -375,7 +328,7 @@ func (r *ResourceRepo) NonTerminatedPodsOnTheNode(nodeName string) (Objects, err
"r", r, "nodeName", nodeName)
return nil, err
}
nodeNonTerminatedPodsList, err := clientSet.CoreV1().
nodeNonTerminatedPodsList, err := r.kubernetesClientSet.CoreV1().
Pods(""). // Search in all namespaces
List(context.TODO(), metav1.ListOptions{FieldSelector: fieldSelector.String()})
if err != nil {
Expand Down
6 changes: 5 additions & 1 deletion pkg/plugin/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@ func Run(f util.Factory, streams genericiooptions.IOStreams, args []string) erro
} else if viper.Get("color") == "never" {
color.NoColor = true
}
repo := input.NewResourceRepo(f)
repo, err := input.NewResourceRepo(f)
if err != nil {
klog.V(2).ErrorS(err, "Error creating repo")
return err
}
engine, err := newRenderEngine(streams)
if err != nil {
klog.V(2).ErrorS(err, "Error creating engine")
Expand Down
12 changes: 9 additions & 3 deletions pkg/plugin/templates_common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,21 @@ import (
"strings"
"testing"

"k8s.io/cli-runtime/pkg/genericclioptions"
"k8s.io/cli-runtime/pkg/genericiooptions"
"k8s.io/kubectl/pkg/cmd/util"
"k8s.io/client-go/rest/fake"
cmdtesting "k8s.io/kubectl/pkg/cmd/testing"

"github.com/bergerx/kubectl-status/pkg/input"
)

func checkTemplate(t *testing.T, templateName string, obj map[string]interface{}, shouldContain string, useRenderable bool) {
t.Helper()
tmpl, _ := getTemplate()
repo := input.NewResourceRepo(util.NewFactory(genericclioptions.NewTestConfigFlags()))
f := cmdtesting.NewTestFactory().WithNamespace("test")
f.Client = &fake.RESTClient{}
f.UnstructuredClient = f.Client
t.Cleanup(func() { f.Cleanup() })
repo, _ := input.NewResourceRepo(f)
e, _ := newRenderEngine(genericiooptions.NewTestIOStreamsDiscard())
e.Template = *tmpl
r := newRenderableObject(obj, e, repo)
Expand Down Expand Up @@ -118,6 +123,7 @@ func TestSuspendTemplate(t *testing.T) {
})
}
}

func TestOwnersTemplate(t *testing.T) {
tests := []struct {
name string
Expand Down

0 comments on commit e25445c

Please sign in to comment.