github.com/iter8-tools/iter8@v1.1.2/controllers/k8sclient/simple.go (about)

     1  package k8sclient
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  
     7  	"github.com/iter8-tools/iter8/base"
     8  	"github.com/iter8-tools/iter8/base/log"
     9  	"helm.sh/helm/v3/pkg/cli"
    10  
    11  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    12  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    13  	"k8s.io/apimachinery/pkg/runtime/schema"
    14  	"k8s.io/apimachinery/pkg/types"
    15  
    16  	// Import to initialize client auth plugins.
    17  	_ "k8s.io/client-go/plugin/pkg/client/auth"
    18  
    19  	"k8s.io/client-go/dynamic"
    20  	"k8s.io/client-go/kubernetes"
    21  )
    22  
    23  // Client provides typed and dynamic Kubernetes clients
    24  type Client struct {
    25  	// typed Kubernetes client
    26  	*kubernetes.Clientset
    27  	// dynamic Kubernetes client
    28  	*dynamic.DynamicClient
    29  }
    30  
    31  const iter8ControllerFieldManager = "iter8-controller"
    32  
    33  // Patch performs a server-side apply of GVR
    34  func (cl *Client) Patch(gvr schema.GroupVersionResource, objNamespace string, objName string, jsonBytes []byte) (*unstructured.Unstructured, error) {
    35  	return cl.DynamicClient.Resource(gvr).Namespace(objNamespace).Patch(context.TODO(), objName, types.ApplyPatchType, jsonBytes, metav1.PatchOptions{
    36  		FieldManager: iter8ControllerFieldManager,
    37  		Force:        base.BoolPointer(true),
    38  	})
    39  }
    40  
    41  // New creates a new kubernetes client
    42  func New(settings *cli.EnvSettings) (*Client, error) {
    43  	log.Logger.Trace("kubernetes client creation invoked...")
    44  
    45  	// get rest config
    46  	restConfig, err := settings.RESTClientGetter().ToRESTConfig()
    47  	if err != nil {
    48  		e := errors.New("unable to get Kubernetes REST config")
    49  		log.Logger.WithStackTrace(err.Error()).Error(e)
    50  		return nil, e
    51  	}
    52  
    53  	// get clientset
    54  	clientset, err := kubernetes.NewForConfig(restConfig)
    55  	if err != nil {
    56  		e := errors.New("unable to get Kubernetes clientset")
    57  		log.Logger.WithStackTrace(err.Error()).Error(e)
    58  		return nil, e
    59  	}
    60  
    61  	// get dynamic client
    62  	dynamicClient, err := dynamic.NewForConfig(restConfig)
    63  	if err != nil {
    64  		e := errors.New("unable to get Kubernetes dynamic client")
    65  		log.Logger.WithStackTrace(err.Error()).Error(e)
    66  		return nil, e
    67  	}
    68  
    69  	log.Logger.Trace("returning kubernetes client... ")
    70  
    71  	return &Client{
    72  		Clientset:     clientset,
    73  		DynamicClient: dynamicClient,
    74  	}, nil
    75  
    76  }