github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/k8s/configmap.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2021-Present The Jackal Authors 3 4 // Package k8s provides a client for interacting with a Kubernetes cluster. 5 package k8s 6 7 import ( 8 "context" 9 "fmt" 10 11 "github.com/defenseunicorns/pkg/helpers" 12 corev1 "k8s.io/api/core/v1" 13 "k8s.io/apimachinery/pkg/api/errors" 14 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 15 ) 16 17 // ReplaceConfigmap deletes and recreates a configmap. 18 func (k *K8s) ReplaceConfigmap(namespace, name string, data map[string][]byte) (*corev1.ConfigMap, error) { 19 if err := k.DeleteConfigmap(namespace, name); err != nil { 20 return nil, err 21 } 22 23 return k.CreateConfigmap(namespace, name, data) 24 } 25 26 // CreateConfigmap applies a configmap to the cluster. 27 func (k *K8s) CreateConfigmap(namespace, name string, data map[string][]byte) (*corev1.ConfigMap, error) { 28 configMap := &corev1.ConfigMap{ 29 ObjectMeta: metav1.ObjectMeta{ 30 Name: name, 31 Namespace: namespace, 32 }, 33 BinaryData: data, 34 } 35 36 // Merge in common labels so that later modifications to the namespace can't mutate them 37 configMap.ObjectMeta.Labels = helpers.MergeMap[string](k.Labels, configMap.ObjectMeta.Labels) 38 39 createOptions := metav1.CreateOptions{} 40 return k.Clientset.CoreV1().ConfigMaps(namespace).Create(context.TODO(), configMap, createOptions) 41 } 42 43 // DeleteConfigmap deletes a configmap by name. 44 func (k *K8s) DeleteConfigmap(namespace, name string) error { 45 namespaceConfigmap := k.Clientset.CoreV1().ConfigMaps(namespace) 46 47 err := namespaceConfigmap.Delete(context.TODO(), name, metav1.DeleteOptions{}) 48 if err != nil && !errors.IsNotFound(err) { 49 return fmt.Errorf("error deleting the configmap: %w", err) 50 } 51 52 return nil 53 } 54 55 // DeleteConfigMapsByLabel deletes a configmap by label(s). 56 func (k *K8s) DeleteConfigMapsByLabel(namespace string, labels Labels) error { 57 labelSelector, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{ 58 MatchLabels: labels, 59 }) 60 metaOptions := metav1.DeleteOptions{} 61 listOptions := metav1.ListOptions{ 62 LabelSelector: labelSelector.String(), 63 } 64 65 return k.Clientset.CoreV1().ConfigMaps(namespace).DeleteCollection(context.TODO(), metaOptions, listOptions) 66 }