github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/api/wrappers/deployment_install_client.go (about) 1 //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 deployment_install_client.go InstallStrategyDeploymentInterface 2 package wrappers 3 4 import ( 5 "context" 6 7 "github.com/pkg/errors" 8 appsv1 "k8s.io/api/apps/v1" 9 corev1 "k8s.io/api/core/v1" 10 rbacv1 "k8s.io/api/rbac/v1" 11 apierrors "k8s.io/apimachinery/pkg/api/errors" 12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 13 "k8s.io/apimachinery/pkg/labels" 14 15 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" 16 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" 17 "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" 18 ) 19 20 var ErrNilObject = errors.New("Bad object supplied: <nil>") 21 22 type InstallStrategyDeploymentInterface interface { 23 CreateRole(role *rbacv1.Role) (*rbacv1.Role, error) 24 CreateRoleBinding(roleBinding *rbacv1.RoleBinding) (*rbacv1.RoleBinding, error) 25 EnsureServiceAccount(serviceAccount *corev1.ServiceAccount, owner ownerutil.Owner) (*corev1.ServiceAccount, error) 26 CreateDeployment(deployment *appsv1.Deployment) (*appsv1.Deployment, error) 27 CreateOrUpdateDeployment(deployment *appsv1.Deployment) (*appsv1.Deployment, error) 28 DeleteDeployment(name string) error 29 GetServiceAccountByName(serviceAccountName string) (*corev1.ServiceAccount, error) 30 FindAnyDeploymentsMatchingNames(depNames []string) ([]*appsv1.Deployment, error) 31 FindAnyDeploymentsMatchingLabels(label labels.Selector) ([]*appsv1.Deployment, error) 32 GetOpClient() operatorclient.ClientInterface 33 GetOpLister() operatorlister.OperatorLister 34 } 35 36 type InstallStrategyDeploymentClientForNamespace struct { 37 opClient operatorclient.ClientInterface 38 opLister operatorlister.OperatorLister 39 Namespace string 40 } 41 42 var _ InstallStrategyDeploymentInterface = &InstallStrategyDeploymentClientForNamespace{} 43 44 func NewInstallStrategyDeploymentClient(opClient operatorclient.ClientInterface, opLister operatorlister.OperatorLister, namespace string) InstallStrategyDeploymentInterface { 45 return &InstallStrategyDeploymentClientForNamespace{ 46 opClient: opClient, 47 opLister: opLister, 48 Namespace: namespace, 49 } 50 } 51 52 func (c *InstallStrategyDeploymentClientForNamespace) GetOpClient() operatorclient.ClientInterface { 53 return c.opClient 54 } 55 56 func (c *InstallStrategyDeploymentClientForNamespace) GetOpLister() operatorlister.OperatorLister { 57 return c.opLister 58 } 59 60 func (c *InstallStrategyDeploymentClientForNamespace) CreateRole(role *rbacv1.Role) (*rbacv1.Role, error) { 61 return c.opClient.CreateRole(role) 62 } 63 64 func (c *InstallStrategyDeploymentClientForNamespace) CreateRoleBinding(roleBinding *rbacv1.RoleBinding) (*rbacv1.RoleBinding, error) { 65 return c.opClient.CreateRoleBinding(roleBinding) 66 } 67 68 func (c *InstallStrategyDeploymentClientForNamespace) EnsureServiceAccount(serviceAccount *corev1.ServiceAccount, owner ownerutil.Owner) (*corev1.ServiceAccount, error) { 69 if serviceAccount == nil { 70 return nil, ErrNilObject 71 } 72 73 foundAccount, err := c.opLister.CoreV1().ServiceAccountLister().ServiceAccounts(c.Namespace).Get(serviceAccount.Name) 74 if err != nil && !apierrors.IsNotFound(err) { 75 return nil, errors.Wrap(err, "checking for existing serviceacccount failed") 76 } 77 78 // create if not found 79 if err != nil && apierrors.IsNotFound(err) { 80 serviceAccount.SetNamespace(c.Namespace) 81 createdAccount, err := c.opClient.CreateServiceAccount(serviceAccount) 82 if err != nil && !apierrors.IsAlreadyExists(err) { 83 return nil, errors.Wrap(err, "creating serviceacccount failed") 84 } 85 if apierrors.IsAlreadyExists(err) { 86 return serviceAccount, nil 87 } 88 return createdAccount, nil 89 } 90 91 // if found, ensure ownerreferences 92 if ownerutil.IsOwnedBy(foundAccount, owner) { 93 return foundAccount, nil 94 } 95 // set owner if missing 96 ownerutil.AddNonBlockingOwner(foundAccount, owner) 97 return c.opClient.UpdateServiceAccount(foundAccount) 98 } 99 100 func (c *InstallStrategyDeploymentClientForNamespace) CreateDeployment(deployment *appsv1.Deployment) (*appsv1.Deployment, error) { 101 return c.opClient.CreateDeployment(deployment) 102 } 103 104 func (c *InstallStrategyDeploymentClientForNamespace) DeleteDeployment(name string) error { 105 foregroundDelete := metav1.DeletePropagationForeground // cascading delete 106 // Note(tflannag): See https://bugzilla.redhat.com/show_bug.cgi?id=1939294. 107 immediate := int64(1) 108 immediateForegroundDelete := &metav1.DeleteOptions{GracePeriodSeconds: &immediate, PropagationPolicy: &foregroundDelete} 109 return c.opClient.DeleteDeployment(c.Namespace, name, immediateForegroundDelete) 110 } 111 112 func (c *InstallStrategyDeploymentClientForNamespace) CreateOrUpdateDeployment(deployment *appsv1.Deployment) (*appsv1.Deployment, error) { 113 _, err := c.opClient.GetDeployment(deployment.Namespace, deployment.Name) 114 if err != nil { 115 if !apierrors.IsNotFound(err) { 116 return nil, err 117 } 118 created, err := c.CreateDeployment(deployment) 119 if err != nil { 120 return nil, err 121 } 122 return created, err 123 } 124 return c.opClient.KubernetesInterface().AppsV1().Deployments(deployment.GetNamespace()).Update(context.TODO(), deployment, metav1.UpdateOptions{}) 125 } 126 127 func (c *InstallStrategyDeploymentClientForNamespace) GetServiceAccountByName(serviceAccountName string) (*corev1.ServiceAccount, error) { 128 return c.opLister.CoreV1().ServiceAccountLister().ServiceAccounts(c.Namespace).Get(serviceAccountName) 129 } 130 131 func (c *InstallStrategyDeploymentClientForNamespace) FindAnyDeploymentsMatchingNames(depNames []string) ([]*appsv1.Deployment, error) { 132 var deployments []*appsv1.Deployment 133 for _, depName := range depNames { 134 fetchedDep, err := c.opLister.AppsV1().DeploymentLister().Deployments(c.Namespace).Get(depName) 135 if err == nil { 136 deployments = append(deployments, fetchedDep) 137 } else { 138 // Any errors other than !exists are propagated up 139 if !apierrors.IsNotFound(err) { 140 return deployments, err 141 } 142 } 143 } 144 return deployments, nil 145 } 146 147 func (c *InstallStrategyDeploymentClientForNamespace) FindAnyDeploymentsMatchingLabels(label labels.Selector) ([]*appsv1.Deployment, error) { 148 deployments, err := c.opLister.AppsV1().DeploymentLister().Deployments(c.Namespace).List(label) 149 if err != nil { 150 return nil, err 151 } 152 153 return deployments, nil 154 }