github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/monitor/internal/kubernetes/client.go (about)

     1  // +build !windows
     2  
     3  package kubernetesmonitor
     4  
     5  import (
     6  	"fmt"
     7  
     8  	"go.uber.org/zap"
     9  	api "k8s.io/api/core/v1"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/apimachinery/pkg/fields"
    12  	"k8s.io/apimachinery/pkg/runtime"
    13  	"k8s.io/client-go/kubernetes"
    14  	kubecache "k8s.io/client-go/tools/cache"
    15  	"k8s.io/client-go/tools/clientcmd"
    16  )
    17  
    18  // NewKubeClient Generate and initialize a Kubernetes client based on the parameter kubeconfig
    19  func NewKubeClient(kubeconfig string) (*kubernetes.Clientset, error) {
    20  	config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    21  	if err != nil {
    22  		return nil, fmt.Errorf("Error Building config from Kubeconfig: %v", err)
    23  	}
    24  
    25  	return kubernetes.NewForConfig(config)
    26  }
    27  
    28  // CreateResourceController creates a controller for a specific ressource and namespace.
    29  // The parameter function will be called on Add/Delete/Update events
    30  func CreateResourceController(client kubecache.Getter, resource string, namespace string, apiStruct runtime.Object, selector fields.Selector,
    31  	addFunc func(addedApiStruct interface{}), deleteFunc func(deletedApiStruct interface{}), updateFunc func(oldApiStruct, updatedApiStruct interface{})) (kubecache.Store, kubecache.Controller) {
    32  
    33  	handlers := kubecache.ResourceEventHandlerFuncs{
    34  		AddFunc:    addFunc,
    35  		DeleteFunc: deleteFunc,
    36  		UpdateFunc: updateFunc,
    37  	}
    38  
    39  	listWatch := kubecache.NewListWatchFromClient(client, resource, namespace, selector)
    40  	store, controller := kubecache.NewInformer(listWatch, apiStruct, 0, handlers)
    41  	return store, controller
    42  }
    43  
    44  // CreateLocalPodController creates a controller specifically for Pods.
    45  func (m *KubernetesMonitor) CreateLocalPodController(namespace string,
    46  	addFunc func(addedApiStruct *api.Pod) error, deleteFunc func(deletedApiStruct *api.Pod) error, updateFunc func(oldApiStruct, updatedApiStruct *api.Pod) error) (kubecache.Store, kubecache.Controller) {
    47  
    48  	return CreateResourceController(m.kubeClient.CoreV1().RESTClient(), "pods", namespace, &api.Pod{}, m.localNodeSelector(),
    49  		func(addedApiStruct interface{}) {
    50  			if err := addFunc(addedApiStruct.(*api.Pod)); err != nil {
    51  				zap.L().Error("Error while handling Add Pod", zap.Error(err))
    52  			}
    53  		},
    54  		func(deletedApiStruct interface{}) {
    55  			if err := deleteFunc(deletedApiStruct.(*api.Pod)); err != nil {
    56  				zap.L().Error("Error while handling Delete Pod", zap.Error(err))
    57  			}
    58  		},
    59  		func(oldApiStruct, updatedApiStruct interface{}) {
    60  			if err := updateFunc(oldApiStruct.(*api.Pod), updatedApiStruct.(*api.Pod)); err != nil {
    61  				zap.L().Error("Error while handling Update Pod", zap.Error(err))
    62  			}
    63  		})
    64  }
    65  
    66  func (m *KubernetesMonitor) localNodeSelector() fields.Selector {
    67  	return fields.Set(map[string]string{
    68  		"spec.nodeName": m.localNode,
    69  	}).AsSelector()
    70  }
    71  
    72  // Pod returns the full pod object.
    73  func (m *KubernetesMonitor) Pod(podName string, namespace string) (*api.Pod, error) {
    74  	targetPod, err := m.kubeClient.CoreV1().Pods(namespace).Get(podName, metav1.GetOptions{})
    75  	if err != nil {
    76  		return nil, fmt.Errorf("error getting Kubernetes labels & IP for pod %v : %v ", podName, err)
    77  	}
    78  	return targetPod, nil
    79  }