package k8sutil import ( "fmt" apiextclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" apiextbeta1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/kubernetes" v1beta1 "k8s.io/client-go/kubernetes/typed/apps/v1beta1" v1core "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/pkg/api" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "github.com/zalando-incubator/postgres-operator/pkg/util/constants" ) // KubernetesClient describes getters for Kubernetes objects type KubernetesClient struct { v1core.SecretsGetter v1core.ServicesGetter v1core.EndpointsGetter v1core.PodsGetter v1core.PersistentVolumesGetter v1core.PersistentVolumeClaimsGetter v1core.ConfigMapsGetter v1beta1.StatefulSetsGetter apiextbeta1.CustomResourceDefinitionsGetter RESTClient rest.Interface CRDREST rest.Interface } // RestConfig creates REST config func RestConfig(kubeConfig string, outOfCluster bool) (*rest.Config, error) { if outOfCluster { return clientcmd.BuildConfigFromFlags("", kubeConfig) } return rest.InClusterConfig() } // ResourceAlreadyExists checks if error corresponds to Already exists error func ResourceAlreadyExists(err error) bool { return apierrors.IsAlreadyExists(err) } // ResourceNotFound checks if error corresponds to Not found error func ResourceNotFound(err error) bool { return apierrors.IsNotFound(err) } // NewFromConfig create Kubernets Interface using REST config func NewFromConfig(cfg *rest.Config) (KubernetesClient, error) { kubeClient := KubernetesClient{} client, err := kubernetes.NewForConfig(cfg) if err != nil { return kubeClient, fmt.Errorf("could not get clientset: %v", err) } kubeClient.PodsGetter = client.CoreV1() kubeClient.ServicesGetter = client.CoreV1() kubeClient.EndpointsGetter = client.CoreV1() kubeClient.SecretsGetter = client.CoreV1() kubeClient.ConfigMapsGetter = client.CoreV1() kubeClient.PersistentVolumeClaimsGetter = client.CoreV1() kubeClient.PersistentVolumesGetter = client.CoreV1() kubeClient.StatefulSetsGetter = client.AppsV1beta1() kubeClient.RESTClient = client.CoreV1().RESTClient() cfg2 := *cfg cfg2.GroupVersion = &schema.GroupVersion{ Group: constants.CRDGroup, Version: constants.CRDApiVersion, } cfg2.APIPath = constants.K8sAPIPath cfg2.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: api.Codecs} crd, err := rest.RESTClientFor(&cfg2) if err != nil { return kubeClient, fmt.Errorf("could not get rest client: %v", err) } kubeClient.CRDREST = crd apiextClient, err := apiextclient.NewForConfig(cfg) if err != nil { return kubeClient, fmt.Errorf("could not create api client:%v", err) } kubeClient.CustomResourceDefinitionsGetter = apiextClient.ApiextensionsV1beta1() return kubeClient, nil }