From 07eda635293e6a545c5aa557e3c032b98b485193 Mon Sep 17 00:00:00 2001 From: Philip Laine Date: Thu, 23 May 2024 14:41:17 +0200 Subject: [PATCH] refactor: remove use of k8s configmap --- src/pkg/cluster/injector.go | 85 +++++++++++++++++++++++++------------ src/pkg/k8s/configmap.go | 62 --------------------------- 2 files changed, 58 insertions(+), 89 deletions(-) delete mode 100644 src/pkg/k8s/configmap.go diff --git a/src/pkg/cluster/injector.go b/src/pkg/cluster/injector.go index b2a8569318..fedd04c88a 100644 --- a/src/pkg/cluster/injector.go +++ b/src/pkg/cluster/injector.go @@ -13,6 +13,14 @@ import ( "regexp" "time" + "github.com/google/go-containerregistry/pkg/crane" + "github.com/mholt/archiver/v3" + corev1 "k8s.io/api/core/v1" + kerrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/resource" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "github.com/defenseunicorns/pkg/helpers" "github.com/defenseunicorns/zarf/src/config" "github.com/defenseunicorns/zarf/src/pkg/k8s" @@ -20,12 +28,6 @@ import ( "github.com/defenseunicorns/zarf/src/pkg/message" "github.com/defenseunicorns/zarf/src/pkg/transform" "github.com/defenseunicorns/zarf/src/pkg/utils" - "github.com/google/go-containerregistry/pkg/crane" - "github.com/mholt/archiver/v3" - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/resource" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/intstr" ) // The chunk size for the tarball chunks. @@ -150,8 +152,19 @@ func (c *Cluster) StopInjectionMadness(ctx context.Context) error { } // Remove the configmaps - labelMatch := map[string]string{"zarf-injector": "payload"} - if err := c.DeleteConfigMapsByLabel(ctx, ZarfNamespaceName, labelMatch); err != nil { + selector, err := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{ + MatchLabels: map[string]string{ + "zarf-injector": "payload", + }, + }) + if err != nil { + return err + } + listOpts := metav1.ListOptions{ + LabelSelector: selector.String(), + } + err = c.Clientset.CoreV1().ConfigMaps(ZarfNamespaceName).DeleteCollection(ctx, metav1.DeleteOptions{}, listOpts) + if err != nil { return err } @@ -226,16 +239,26 @@ func (c *Cluster) createPayloadConfigMaps(ctx context.Context, seedImagesDir, ta // Create a cat-friendly filename fileName := fmt.Sprintf("zarf-payload-%03d", idx) - // Store the binary data - configData := map[string][]byte{ - fileName: data, - } - spinner.Updatef("Adding archive binary configmap %d of %d to the cluster", idx+1, chunkCount) // Attempt to create the configmap in the cluster - if _, err = c.ReplaceConfigmap(ctx, ZarfNamespaceName, fileName, configData); err != nil { - return configMaps, "", err + // TODO: Replace with create or update. + err := c.Clientset.CoreV1().ConfigMaps(ZarfNamespaceName).Delete(ctx, fileName, metav1.DeleteOptions{}) + if err != nil && !kerrors.IsNotFound(err) { + return nil, "", err + } + cm := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: fileName, + Namespace: ZarfNamespaceName, + }, + BinaryData: map[string][]byte{ + fileName: data, + }, + } + _, err = c.Clientset.CoreV1().ConfigMaps(ZarfNamespaceName).Create(ctx, cm, metav1.CreateOptions{}) + if err != nil { + return nil, "", err } // Add the configmap to the configmaps slice for later usage in the pod @@ -286,22 +309,30 @@ func (c *Cluster) injectorIsReady(ctx context.Context, seedImages []transform.Im } func (c *Cluster) createInjectorConfigMap(ctx context.Context, binaryPath string) error { - var err error - configData := make(map[string][]byte) - - // Add the injector binary data to the configmap - if configData["zarf-injector"], err = os.ReadFile(binaryPath); err != nil { + name := "rust-binary" + // TODO: Replace with a create or update. + err := c.Clientset.CoreV1().ConfigMaps(ZarfNamespaceName).Delete(ctx, name, metav1.DeleteOptions{}) + if err != nil && !kerrors.IsNotFound(err) { return err } - - // Try to delete configmap silently - _ = c.DeleteConfigmap(ctx, ZarfNamespaceName, "rust-binary") - - // Attempt to create the configmap in the cluster - if _, err = c.CreateConfigmap(ctx, ZarfNamespaceName, "rust-binary", configData); err != nil { + b, err := os.ReadFile(binaryPath) + if err != nil { + return err + } + configData := map[string][]byte{ + "zarf-injector": b, + } + configMap := &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{ + Name: name, + Namespace: ZarfNamespaceName, + }, + BinaryData: configData, + } + _, err = c.Clientset.CoreV1().ConfigMaps(configMap.Namespace).Create(ctx, configMap, metav1.CreateOptions{}) + if err != nil { return err } - return nil } diff --git a/src/pkg/k8s/configmap.go b/src/pkg/k8s/configmap.go deleted file mode 100644 index 57a72c65ae..0000000000 --- a/src/pkg/k8s/configmap.go +++ /dev/null @@ -1,62 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// SPDX-FileCopyrightText: 2021-Present The Zarf Authors - -// Package k8s provides a client for interacting with a Kubernetes cluster. -package k8s - -import ( - "context" - "fmt" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -// ReplaceConfigmap deletes and recreates a configmap. -func (k *K8s) ReplaceConfigmap(ctx context.Context, namespace, name string, data map[string][]byte) (*corev1.ConfigMap, error) { - if err := k.DeleteConfigmap(ctx, namespace, name); err != nil { - return nil, err - } - return k.CreateConfigmap(ctx, namespace, name, data) -} - -// CreateConfigmap applies a configmap to the cluster. -func (k *K8s) CreateConfigmap(ctx context.Context, namespace, name string, data map[string][]byte) (*corev1.ConfigMap, error) { - configMap := &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - Labels: make(Labels), - }, - BinaryData: data, - } - - createOptions := metav1.CreateOptions{} - return k.Clientset.CoreV1().ConfigMaps(namespace).Create(ctx, configMap, createOptions) -} - -// DeleteConfigmap deletes a configmap by name. -func (k *K8s) DeleteConfigmap(ctx context.Context, namespace, name string) error { - namespaceConfigmap := k.Clientset.CoreV1().ConfigMaps(namespace) - - err := namespaceConfigmap.Delete(ctx, name, metav1.DeleteOptions{}) - if err != nil && !errors.IsNotFound(err) { - return fmt.Errorf("error deleting the configmap: %w", err) - } - - return nil -} - -// DeleteConfigMapsByLabel deletes a configmap by label(s). -func (k *K8s) DeleteConfigMapsByLabel(ctx context.Context, namespace string, labels Labels) error { - labelSelector, _ := metav1.LabelSelectorAsSelector(&metav1.LabelSelector{ - MatchLabels: labels, - }) - metaOptions := metav1.DeleteOptions{} - listOptions := metav1.ListOptions{ - LabelSelector: labelSelector.String(), - } - - return k.Clientset.CoreV1().ConfigMaps(namespace).DeleteCollection(ctx, metaOptions, listOptions) -}