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 }