98 lines
2.9 KiB
Go
98 lines
2.9 KiB
Go
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)
|
|
}
|
|
|
|
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
|
|
|
|
}
|