github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/lib/operatorclient/client.go (about)

     1  //go:generate go run github.com/golang/mock/mockgen -source client.go -destination operatorclientmocks/mock_client.go -package operatorclientmocks
     2  package operatorclient
     3  
     4  import (
     5  	"github.com/sirupsen/logrus"
     6  	appsv1 "k8s.io/api/apps/v1"
     7  	v1 "k8s.io/api/core/v1"
     8  	rbacv1 "k8s.io/api/rbac/v1"
     9  	apiextensions "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset"
    10  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    11  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    12  	"k8s.io/apimachinery/pkg/labels"
    13  	corev1ac "k8s.io/client-go/applyconfigurations/core/v1"
    14  	rbacv1ac "k8s.io/client-go/applyconfigurations/rbac/v1"
    15  	"k8s.io/client-go/kubernetes"
    16  	"k8s.io/client-go/rest"
    17  	"k8s.io/client-go/tools/clientcmd"
    18  	apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
    19  	apiregistration "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset"
    20  )
    21  
    22  type ClientInterface interface {
    23  	KubernetesInterface() kubernetes.Interface
    24  	ApiextensionsInterface() apiextensions.Interface
    25  	ApiregistrationV1Interface() apiregistration.Interface
    26  	APIServiceClient
    27  	CustomResourceClient
    28  	SecretClient
    29  	ServiceClient
    30  	ServiceAccountClient
    31  	RoleClient
    32  	RoleBindingClient
    33  	ClusterRoleBindingClient
    34  	ClusterRoleClient
    35  	DeploymentClient
    36  	ConfigMapClient
    37  }
    38  
    39  // CustomResourceClient contains methods for the Custom Resource.
    40  type CustomResourceClient interface {
    41  	GetCustomResource(apiGroup, version, namespace, resourceKind, resourceName string) (*unstructured.Unstructured, error)
    42  	GetCustomResourceRaw(apiGroup, version, namespace, resourceKind, resourceName string) ([]byte, error)
    43  	CreateCustomResource(item *unstructured.Unstructured) error
    44  	CreateCustomResourceRaw(apiGroup, version, namespace, kind string, data []byte) error
    45  	CreateCustomResourceRawIfNotFound(apiGroup, version, namespace, kind, name string, data []byte) (bool, error)
    46  	UpdateCustomResource(item *unstructured.Unstructured) error
    47  	UpdateCustomResourceRaw(apiGroup, version, namespace, resourceKind, resourceName string, data []byte) error
    48  	CreateOrUpdateCustomeResourceRaw(apiGroup, version, namespace, resourceKind, resourceName string, data []byte) error
    49  	DeleteCustomResource(apiGroup, version, namespace, resourceKind, resourceName string) error
    50  	AtomicModifyCustomResource(apiGroup, version, namespace, resourceKind, resourceName string, f CustomResourceModifier, data interface{}) error
    51  	ListCustomResource(apiGroup, version, namespace, resourceKind string) (*CustomResourceList, error)
    52  }
    53  
    54  // APIServiceClient contains methods for manipulating APIServiceBindings.
    55  type APIServiceClient interface {
    56  	CreateAPIService(*apiregistrationv1.APIService) (*apiregistrationv1.APIService, error)
    57  	GetAPIService(name string) (*apiregistrationv1.APIService, error)
    58  	UpdateAPIService(modified *apiregistrationv1.APIService) (*apiregistrationv1.APIService, error)
    59  	DeleteAPIService(name string, options *metav1.DeleteOptions) error
    60  }
    61  
    62  // SecretClient contains methods for manipulating Secrets
    63  type SecretClient interface {
    64  	CreateSecret(*v1.Secret) (*v1.Secret, error)
    65  	GetSecret(namespace, name string) (*v1.Secret, error)
    66  	UpdateSecret(modified *v1.Secret) (*v1.Secret, error)
    67  	DeleteSecret(namespace, name string, options *metav1.DeleteOptions) error
    68  }
    69  
    70  // ServiceClient contains methods for manipulating Services
    71  type ServiceClient interface {
    72  	ApplyService(*corev1ac.ServiceApplyConfiguration, metav1.ApplyOptions) (*v1.Service, error)
    73  	CreateService(*v1.Service) (*v1.Service, error)
    74  	GetService(namespace, name string) (*v1.Service, error)
    75  	UpdateService(modified *v1.Service) (*v1.Service, error)
    76  	DeleteService(namespace, name string, options *metav1.DeleteOptions) error
    77  }
    78  
    79  // ServiceAccountClient contains methods for manipulating ServiceAccounts.
    80  type ServiceAccountClient interface {
    81  	CreateServiceAccount(*v1.ServiceAccount) (*v1.ServiceAccount, error)
    82  	GetServiceAccount(namespace, name string) (*v1.ServiceAccount, error)
    83  	UpdateServiceAccount(modified *v1.ServiceAccount) (*v1.ServiceAccount, error)
    84  	DeleteServiceAccount(namespace, name string, options *metav1.DeleteOptions) error
    85  }
    86  
    87  // RoleClient contains methods for manipulating Roles.
    88  type RoleClient interface {
    89  	CreateRole(*rbacv1.Role) (*rbacv1.Role, error)
    90  	GetRole(namespace, name string) (*rbacv1.Role, error)
    91  	UpdateRole(modified *rbacv1.Role) (*rbacv1.Role, error)
    92  	DeleteRole(namespace, name string, options *metav1.DeleteOptions) error
    93  }
    94  
    95  // RoleBindingClient contains methods for manipulating RoleBindings.
    96  type RoleBindingClient interface {
    97  	ApplyRoleBinding(applyConfig *rbacv1ac.RoleBindingApplyConfiguration, applyOptions metav1.ApplyOptions) (*rbacv1.RoleBinding, error)
    98  	CreateRoleBinding(*rbacv1.RoleBinding) (*rbacv1.RoleBinding, error)
    99  	GetRoleBinding(namespace, name string) (*rbacv1.RoleBinding, error)
   100  	UpdateRoleBinding(modified *rbacv1.RoleBinding) (*rbacv1.RoleBinding, error)
   101  	DeleteRoleBinding(namespace, name string, options *metav1.DeleteOptions) error
   102  }
   103  
   104  // ClusterRoleClient contains methods for manipulating ClusterRoleBindings.
   105  type ClusterRoleClient interface {
   106  	CreateClusterRole(*rbacv1.ClusterRole) (*rbacv1.ClusterRole, error)
   107  	GetClusterRole(name string) (*rbacv1.ClusterRole, error)
   108  	UpdateClusterRole(modified *rbacv1.ClusterRole) (*rbacv1.ClusterRole, error)
   109  	DeleteClusterRole(name string, options *metav1.DeleteOptions) error
   110  }
   111  
   112  // ClusterRoleBindingClient contains methods for manipulating ClusterRoleBindings.
   113  type ClusterRoleBindingClient interface {
   114  	ApplyClusterRoleBinding(applyConfig *rbacv1ac.ClusterRoleBindingApplyConfiguration, applyOptions metav1.ApplyOptions) (*rbacv1.ClusterRoleBinding, error)
   115  	CreateClusterRoleBinding(*rbacv1.ClusterRoleBinding) (*rbacv1.ClusterRoleBinding, error)
   116  	GetClusterRoleBinding(name string) (*rbacv1.ClusterRoleBinding, error)
   117  	UpdateClusterRoleBinding(modified *rbacv1.ClusterRoleBinding) (*rbacv1.ClusterRoleBinding, error)
   118  	DeleteClusterRoleBinding(name string, options *metav1.DeleteOptions) error
   119  }
   120  
   121  // DeploymentClient contains methods for the Deployment resource.
   122  type DeploymentClient interface {
   123  	GetDeployment(namespace, name string) (*appsv1.Deployment, error)
   124  	CreateDeployment(*appsv1.Deployment) (*appsv1.Deployment, error)
   125  	DeleteDeployment(namespace, name string, options *metav1.DeleteOptions) error
   126  	UpdateDeployment(*appsv1.Deployment) (*appsv1.Deployment, bool, error)
   127  	PatchDeployment(*appsv1.Deployment, *appsv1.Deployment) (*appsv1.Deployment, bool, error)
   128  	RollingUpdateDeployment(*appsv1.Deployment) (*appsv1.Deployment, bool, error)
   129  	RollingPatchDeployment(*appsv1.Deployment, *appsv1.Deployment) (*appsv1.Deployment, bool, error)
   130  	RollingUpdateDeploymentMigrations(namespace, name string, f UpdateFunction) (*appsv1.Deployment, bool, error)
   131  	RollingPatchDeploymentMigrations(namespace, name string, f PatchFunction) (*appsv1.Deployment, bool, error)
   132  	CreateOrRollingUpdateDeployment(*appsv1.Deployment) (*appsv1.Deployment, bool, error)
   133  	ListDeploymentsWithLabels(namespace string, labels labels.Set) (*appsv1.DeploymentList, error)
   134  }
   135  
   136  // ConfigMapClient contains methods for the ConfigMap resource
   137  type ConfigMapClient interface {
   138  	CreateConfigMap(*v1.ConfigMap) (*v1.ConfigMap, error)
   139  	GetConfigMap(namespace, name string) (*v1.ConfigMap, error)
   140  	UpdateConfigMap(modified *v1.ConfigMap) (*v1.ConfigMap, error)
   141  	DeleteConfigMap(namespace, name string, options *metav1.DeleteOptions) error
   142  }
   143  
   144  // Interface assertion.
   145  var _ ClientInterface = &Client{}
   146  
   147  // Client is a kubernetes client that can talk to the API server.
   148  type Client struct {
   149  	kubernetes.Interface
   150  	extInterface apiextensions.Interface
   151  	regInterface apiregistration.Interface
   152  }
   153  
   154  // NewClient creates a kubernetes client or bails out on on failures.
   155  func NewClientFromConfig(kubeconfig string, logger *logrus.Logger) ClientInterface {
   156  	var config *rest.Config
   157  	var err error
   158  
   159  	if kubeconfig != "" {
   160  		logger.Infof("Loading kube client config from path %q", kubeconfig)
   161  		config, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
   162  	} else {
   163  		logger.Infof("Using in-cluster kube client config")
   164  		config, err = rest.InClusterConfig()
   165  	}
   166  
   167  	if err != nil {
   168  		logger.Fatalf("Cannot load config for REST client: %v", err)
   169  	}
   170  
   171  	return &Client{kubernetes.NewForConfigOrDie(config), apiextensions.NewForConfigOrDie(config), apiregistration.NewForConfigOrDie(config)}
   172  }
   173  
   174  func NewClientFromRestConfig(config *rest.Config) (client ClientInterface, err error) {
   175  	kubernetes, err := kubernetes.NewForConfig(config)
   176  	if err != nil {
   177  		return
   178  	}
   179  
   180  	apiextensions, err := apiextensions.NewForConfig(config)
   181  	if err != nil {
   182  		return
   183  	}
   184  
   185  	apiregistration, err := apiregistration.NewForConfig(config)
   186  	if err != nil {
   187  		return
   188  	}
   189  
   190  	client = &Client{
   191  		kubernetes,
   192  		apiextensions,
   193  		apiregistration,
   194  	}
   195  
   196  	return
   197  }
   198  
   199  // NewClient creates a kubernetes client
   200  func NewClient(k8sClient kubernetes.Interface, extclient apiextensions.Interface, regclient apiregistration.Interface) ClientInterface {
   201  	return &Client{k8sClient, extclient, regclient}
   202  }
   203  
   204  // KubernetesInterface returns the Kubernetes interface.
   205  func (c *Client) KubernetesInterface() kubernetes.Interface {
   206  	return c.Interface
   207  }
   208  
   209  // ApiextensionsInterface returns the API extension interface.
   210  func (c *Client) ApiextensionsInterface() apiextensions.Interface {
   211  	return c.extInterface
   212  }
   213  
   214  // ApiregistrationV1Interface returns the API registration (aggregated apiserver) interface
   215  func (c *Client) ApiregistrationV1Interface() apiregistration.Interface {
   216  	return c.regInterface
   217  }