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 }