github.com/argoproj/argo-cd/v3@v3.2.1/util/kube/util.go (about)

     1  package kube
     2  
     3  import (
     4  	"context"
     5  
     6  	corev1 "k8s.io/api/core/v1"
     7  	"k8s.io/apimachinery/pkg/api/errors"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  	"k8s.io/client-go/kubernetes"
    10  )
    11  
    12  type kubeUtil struct {
    13  	client      kubernetes.Interface
    14  	ctx         context.Context
    15  	labels      map[string]string
    16  	annotations map[string]string
    17  }
    18  
    19  // updateFn will be called to set data for secret s. new will be true if the
    20  // secret was created by the caller, or false if it has existed before.
    21  type updateFn func(s *corev1.Secret, new bool) error
    22  
    23  // NewKubeUtil NewUtil returns a new kubeUtil receiver
    24  func NewKubeUtil(ctx context.Context, client kubernetes.Interface) *kubeUtil {
    25  	return &kubeUtil{client: client, ctx: ctx}
    26  }
    27  
    28  // CreateOrUpdateSecret creates or updates a secret, using the update function.
    29  // If the secret is created, its labels and annotations are set if non-empty in
    30  // the receiver. If the secret is updated, labels and annotations will not be
    31  // touched.
    32  func (ku *kubeUtil) CreateOrUpdateSecret(ns string, name string, update updateFn) error {
    33  	var s *corev1.Secret
    34  	var err error
    35  	var create bool
    36  
    37  	s, err = ku.client.CoreV1().Secrets(ns).Get(ku.ctx, name, metav1.GetOptions{})
    38  	if err != nil {
    39  		if !errors.IsNotFound(err) {
    40  			return err
    41  		}
    42  		create = true
    43  	}
    44  
    45  	if create {
    46  		s = &corev1.Secret{
    47  			ObjectMeta: metav1.ObjectMeta{
    48  				Name:        name,
    49  				Namespace:   ns,
    50  				Labels:      ku.labels,
    51  				Annotations: ku.annotations,
    52  			},
    53  		}
    54  		s.Data = make(map[string][]byte)
    55  	}
    56  
    57  	err = update(s, create)
    58  	if err != nil {
    59  		return err
    60  	}
    61  
    62  	if create {
    63  		_, err = ku.client.CoreV1().Secrets(ns).Create(ku.ctx, s, metav1.CreateOptions{})
    64  	} else {
    65  		_, err = ku.client.CoreV1().Secrets(ns).Update(ku.ctx, s, metav1.UpdateOptions{})
    66  	}
    67  
    68  	return err
    69  }
    70  
    71  // CreateOrUpdateSecretField creates or updates a secret name in namespace ns, with given value for given field
    72  func (ku *kubeUtil) CreateOrUpdateSecretField(ns string, name string, field string, value string) error {
    73  	err := ku.CreateOrUpdateSecret(ns, name, func(s *corev1.Secret, _ bool) error {
    74  		s.Data[field] = []byte(value)
    75  		return nil
    76  	})
    77  	return err
    78  }
    79  
    80  // CreateOrUpdateSecretData creates or updates a secret name in namespace ns, with given data.
    81  // If merge is true, merges data with the existing data, otherwise overwrites it.
    82  func (ku *kubeUtil) CreateOrUpdateSecretData(ns string, name string, data map[string][]byte, merge bool) error {
    83  	err := ku.CreateOrUpdateSecret(ns, name, func(s *corev1.Secret, new bool) error {
    84  		if !merge || new {
    85  			s.Data = data
    86  		} else {
    87  			for key, val := range data {
    88  				s.Data[key] = val
    89  			}
    90  		}
    91  		return nil
    92  	})
    93  	return err
    94  }
    95  
    96  // DeepCopy returns a copy of ku
    97  func (ku *kubeUtil) DeepCopy() *kubeUtil {
    98  	kun := &kubeUtil{
    99  		client:      ku.client,
   100  		ctx:         ku.ctx,
   101  		labels:      ku.labels,
   102  		annotations: ku.annotations,
   103  	}
   104  	return kun
   105  }
   106  
   107  // WithLabels returns a copy of ku with labels attached
   108  func (ku *kubeUtil) WithLabels(labels map[string]string) *kubeUtil {
   109  	kun := ku.DeepCopy()
   110  	kun.labels = labels
   111  	return kun
   112  }
   113  
   114  // WithAnnotations returns a copy of ku with annotations attached
   115  func (ku *kubeUtil) WithAnnotations(annotations map[string]string) *kubeUtil {
   116  	kun := ku.DeepCopy()
   117  	kun.annotations = annotations
   118  	return kun
   119  }