...

Source file src/sigs.k8s.io/cli-utils/pkg/kstatus/polling/clusterreader/dynamic_reader.go

Documentation: sigs.k8s.io/cli-utils/pkg/kstatus/polling/clusterreader

     1  // Copyright 2022 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package clusterreader
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  
    10  	"k8s.io/apimachinery/pkg/api/meta"
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    13  	"k8s.io/apimachinery/pkg/labels"
    14  	"k8s.io/client-go/dynamic"
    15  	"sigs.k8s.io/controller-runtime/pkg/client"
    16  )
    17  
    18  // DynamicClusterReader is an implementation of the ClusterReader that delegates
    19  // all calls directly to the underlying DynamicClient. No caching.
    20  type DynamicClusterReader struct {
    21  	DynamicClient dynamic.Interface
    22  	Mapper        meta.RESTMapper
    23  }
    24  
    25  func (n *DynamicClusterReader) Get(ctx context.Context, key client.ObjectKey, obj *unstructured.Unstructured) error {
    26  	mapping, err := n.Mapper.RESTMapping(obj.GroupVersionKind().GroupKind())
    27  	if err != nil {
    28  		return fmt.Errorf("failed to map object: %w", err)
    29  	}
    30  
    31  	serverObj, err := n.DynamicClient.Resource(mapping.Resource).
    32  		Namespace(key.Namespace).
    33  		Get(ctx, key.Name, metav1.GetOptions{})
    34  	if err != nil {
    35  		return err
    36  	}
    37  
    38  	serverObj.DeepCopyInto(obj)
    39  	return nil
    40  }
    41  
    42  func (n *DynamicClusterReader) ListNamespaceScoped(ctx context.Context, list *unstructured.UnstructuredList, namespace string, selector labels.Selector) error {
    43  	mapping, err := n.Mapper.RESTMapping(list.GroupVersionKind().GroupKind())
    44  	if err != nil {
    45  		return fmt.Errorf("failed to map object: %w", err)
    46  	}
    47  
    48  	serverObj, err := n.DynamicClient.Resource(mapping.Resource).
    49  		Namespace(namespace).
    50  		List(ctx, metav1.ListOptions{
    51  			LabelSelector: selector.String(),
    52  		})
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	serverObj.DeepCopyInto(list)
    58  	return nil
    59  }
    60  
    61  func (n *DynamicClusterReader) ListClusterScoped(ctx context.Context, list *unstructured.UnstructuredList, selector labels.Selector) error {
    62  	mapping, err := n.Mapper.RESTMapping(list.GroupVersionKind().GroupKind())
    63  	if err != nil {
    64  		return fmt.Errorf("failed to map object: %w", err)
    65  	}
    66  
    67  	serverObj, err := n.DynamicClient.Resource(mapping.Resource).
    68  		List(ctx, metav1.ListOptions{
    69  			LabelSelector: selector.String(),
    70  		})
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	serverObj.DeepCopyInto(list)
    76  	return nil
    77  }
    78  
    79  func (n *DynamicClusterReader) Sync(_ context.Context) error {
    80  	return nil
    81  }
    82  

View as plain text