Skip to content

Commit

Permalink
refactor: remove use of k8s namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
phillebaba committed May 28, 2024
1 parent ab83d37 commit cf2f23a
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 98 deletions.
17 changes: 12 additions & 5 deletions src/internal/packager/helm/post-render.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"os"
"path/filepath"
"reflect"
"strings"

"github.com/defenseunicorns/pkg/helpers"
"github.com/defenseunicorns/zarf/src/config"
Expand Down Expand Up @@ -117,29 +118,35 @@ func (r *renderer) Run(renderedManifests *bytes.Buffer) (*bytes.Buffer, error) {

func (r *renderer) adoptAndUpdateNamespaces(ctx context.Context) error {
c := r.cluster
existingNamespaces, _ := c.GetNamespaces(ctx)
namespaceList, err := r.cluster.Clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
return err
}
for name, namespace := range r.namespaces {

// Check to see if this namespace already exists
var existingNamespace bool
for _, serverNamespace := range existingNamespaces.Items {
for _, serverNamespace := range namespaceList.Items {
if serverNamespace.Name == name {
existingNamespace = true
}
}

if !existingNamespace {
// This is a new namespace, add it
if _, err := c.CreateNamespace(ctx, namespace); err != nil {
_, err := c.Clientset.CoreV1().Namespaces().Create(ctx, namespace, metav1.CreateOptions{})
if err != nil {
return fmt.Errorf("unable to create the missing namespace %s", name)
}
} else if r.cfg.DeployOpts.AdoptExistingResources {
if r.cluster.IsInitialNamespace(name) {
// IsInitialNamespace returns true if the given namespace name is an initial k8s namespace: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/#initial-namespaces
if name == "default" || strings.HasPrefix(name, "kube-") {
// If this is a K8s initial namespace, refuse to adopt it
message.Warnf("Refusing to adopt the initial namespace: %s", name)
} else {
// This is an existing namespace to adopt
if _, err := c.UpdateNamespace(ctx, namespace); err != nil {
_, err := c.Clientset.CoreV1().Namespaces().Update(ctx, namespace, metav1.UpdateOptions{})
if err != nil {
return fmt.Errorf("unable to adopt the existing namespace %s", name)
}
}
Expand Down
25 changes: 24 additions & 1 deletion src/pkg/cluster/namespace.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,12 @@ package cluster

import (
"context"
"time"

"github.com/defenseunicorns/zarf/src/pkg/k8s"
"github.com/defenseunicorns/zarf/src/pkg/message"
corev1 "k8s.io/api/core/v1"
kerrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

Expand All @@ -18,7 +20,28 @@ func (c *Cluster) DeleteZarfNamespace(ctx context.Context) error {
spinner := message.NewProgressSpinner("Deleting the zarf namespace from this cluster")
defer spinner.Stop()

return c.DeleteNamespace(ctx, ZarfNamespaceName)
gracePeriod := int64(0)
err := c.Clientset.CoreV1().Namespaces().Delete(ctx, ZarfNamespaceName, metav1.DeleteOptions{GracePeriodSeconds: &gracePeriod})
if err != nil && !kerrors.IsNotFound(err) {
return err
}
timer := time.NewTimer(0)
defer timer.Stop()
for {
select {
case <-ctx.Done():
return ctx.Err()
case <-timer.C:
_, err := c.Clientset.CoreV1().Namespaces().Get(ctx, ZarfNamespaceName, metav1.GetOptions{})
if kerrors.IsNotFound(err) {
return nil
}
if err != nil {
return err
}
timer.Reset(1 * time.Second)
}
}
}

// NewZarfManagedNamespace returns a corev1.Namespace with Zarf-managed labels
Expand Down
11 changes: 7 additions & 4 deletions src/pkg/cluster/secrets.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"reflect"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/defenseunicorns/zarf/src/config"
"github.com/defenseunicorns/zarf/src/pkg/k8s"
Expand Down Expand Up @@ -80,11 +81,12 @@ func (c *Cluster) UpdateZarfManagedImageSecrets(ctx context.Context, state *type
spinner := message.NewProgressSpinner("Updating existing Zarf-managed image secrets")
defer spinner.Stop()

if namespaces, err := c.GetNamespaces(ctx); err != nil {
namespaceList, err := c.Clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
spinner.Errorf(err, "Unable to get k8s namespaces")
} else {
// Update all image pull secrets
for _, namespace := range namespaces.Items {
for _, namespace := range namespaceList.Items {
currentRegistrySecret, err := c.GetSecret(ctx, namespace.Name, config.ZarfImagePullSecretName)
if err != nil {
continue
Expand Down Expand Up @@ -115,11 +117,12 @@ func (c *Cluster) UpdateZarfManagedGitSecrets(ctx context.Context, state *types.
spinner := message.NewProgressSpinner("Updating existing Zarf-managed git secrets")
defer spinner.Stop()

if namespaces, err := c.GetNamespaces(ctx); err != nil {
namespaceList, err := c.Clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
spinner.Errorf(err, "Unable to get k8s namespaces")
} else {
// Update all git pull secrets
for _, namespace := range namespaces.Items {
for _, namespace := range namespaceList.Items {
currentGitSecret, err := c.GetSecret(ctx, namespace.Name, config.ZarfGitServerSecretName)
if err != nil {
continue
Expand Down
9 changes: 5 additions & 4 deletions src/pkg/cluster/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ func (c *Cluster) InitZarfState(ctx context.Context, initOptions types.ZarfInitO
// Setup zarf agent PKI
state.AgentTLS = pki.GeneratePKI(config.ZarfAgentHost)

namespaces, err := c.GetNamespaces(ctx)
namespaceList, err := c.Clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
return fmt.Errorf("unable to get the Kubernetes namespaces: %w", err)
}
// Mark existing namespaces as ignored for the zarf agent to prevent mutating resources we don't own.
for _, namespace := range namespaces.Items {
for _, namespace := range namespaceList.Items {
spinner.Updatef("Marking existing namespace %s as ignored by Zarf Agent", namespace.Name)
if namespace.Labels == nil {
// Ensure label map exists to avoid nil panic
Expand All @@ -98,7 +98,8 @@ func (c *Cluster) InitZarfState(ctx context.Context, initOptions types.ZarfInitO
// This label will tell the Zarf Agent to ignore this namespace.
namespace.Labels[k8s.AgentLabel] = "ignore"
namespaceCopy := namespace
if _, err = c.UpdateNamespace(ctx, &namespaceCopy); err != nil {
_, err := c.Clientset.CoreV1().Namespaces().Update(ctx, &namespaceCopy, metav1.UpdateOptions{})
if err != nil {
// This is not a hard failure, but we should log it.
message.WarnErrf(err, "Unable to mark the namespace %s as ignored by Zarf Agent", namespace.Name)
}
Expand All @@ -107,7 +108,7 @@ func (c *Cluster) InitZarfState(ctx context.Context, initOptions types.ZarfInitO
// Try to create the zarf namespace.
spinner.Updatef("Creating the Zarf namespace")
zarfNamespace := NewZarfManagedNamespace(ZarfNamespaceName)
if _, err := c.CreateNamespace(ctx, zarfNamespace); err != nil {
_, err := c.Clientset.CoreV1().Namespaces().Create(ctx,zarfNamespace, metav1.CreateOptions{})
return fmt.Errorf("unable to create the zarf namespace: %w", err)
}

Expand Down
8 changes: 5 additions & 3 deletions src/pkg/cluster/zarf.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,17 @@ func (c *Cluster) StripZarfLabelsAndSecretsFromNamespaces(ctx context.Context) {
LabelSelector: k8s.ZarfManagedByLabel + "=zarf",
}

if namespaces, err := c.GetNamespaces(ctx); err != nil {
namespaceList, err := c.Clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{})
if err != nil {
spinner.Errorf(err, "Unable to get k8s namespaces")
} else {
for _, namespace := range namespaces.Items {
for _, namespace := range namespaceList.Items {
if _, ok := namespace.Labels[k8s.AgentLabel]; ok {
spinner.Updatef("Removing Zarf Agent label for namespace %s", namespace.Name)
delete(namespace.Labels, k8s.AgentLabel)
namespaceCopy := namespace
if _, err = c.UpdateNamespace(ctx, &namespaceCopy); err != nil {
_, err := c.Clientset.CoreV1().Namespaces().Update(ctx, &namespaceCopy, metav1.UpdateOptions{})
if err != nil {
// This is not a hard failure, but we should log it
spinner.Errorf(err, "Unable to update the namespace labels for %s", namespace.Name)
}
Expand Down
79 changes: 0 additions & 79 deletions src/pkg/k8s/namespace.go

This file was deleted.

8 changes: 6 additions & 2 deletions src/pkg/packager/deploy.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,11 @@ import (
"sync"
"time"

corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

"github.com/defenseunicorns/pkg/helpers"

"github.com/defenseunicorns/zarf/src/config"
"github.com/defenseunicorns/zarf/src/config/lang"
"github.com/defenseunicorns/zarf/src/internal/packager/git"
Expand All @@ -32,7 +36,6 @@ import (
"github.com/defenseunicorns/zarf/src/pkg/packager/filters"
"github.com/defenseunicorns/zarf/src/pkg/transform"
"github.com/defenseunicorns/zarf/src/types"
corev1 "k8s.io/api/core/v1"
)

func (p *Packager) resetRegistryHPA(ctx context.Context) {
Expand Down Expand Up @@ -451,7 +454,8 @@ func (p *Packager) setupState(ctx context.Context) (err error) {
// Try to create the zarf namespace
spinner.Updatef("Creating the Zarf namespace")
zarfNamespace := cluster.NewZarfManagedNamespace(cluster.ZarfNamespaceName)
if _, err := p.cluster.CreateNamespace(ctx, zarfNamespace); err != nil {
_, err := p.cluster.Clientset.CoreV1().Namespaces().Create(ctx, zarfNamespace, metav1.CreateOptions{})
if err != nil {
spinner.Fatalf(err, "Unable to create the zarf namespace")
}
}
Expand Down

0 comments on commit cf2f23a

Please sign in to comment.