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  }