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  }