Skip to content

Commit 402cfa2

Browse files
authored
Merge pull request #49 from aifoundry-org/namespace
use dedicated namespace
2 parents eba8bf9 + fb84652 commit 402cfa2

File tree

4 files changed

+62
-14
lines changed

4 files changed

+62
-14
lines changed

cmd/root.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ func rootCmd() (*cobra.Command, error) {
4444
kubeconfigPath string
4545
kubeconfigOverwrite bool
4646
controlPlaneSecret string
47+
controlPlaneNamespace string
4748
verbose int
4849
address string
4950
workerExternalIP bool
@@ -159,7 +160,7 @@ func rootCmd() (*cobra.Command, error) {
159160
cluster.NodeSpec{Image: cluster.Image{Name: controlPlaneImageName, Source: controlPlaneImageSource, Blocksize: controlPlaneImageBlocksize}, MemoryGB: int(controlPlaneMemory), CPUCount: int(controlPlaneCPU), ExternalIP: controlPlaneExternalIP, RootDiskSize: int(controlPlaneRootDiskSizeGB * cluster.GB), ExtraDiskSize: int(controlPlaneExtraDiskSizeGB * cluster.GB), TailscaleAuthKey: tailscaleAuthKey, TailscaleTag: tailscaleTag},
160161
cluster.NodeSpec{Image: cluster.Image{Name: workerImageName, Source: workerImageSource, Blocksize: workerImageBlocksize}, MemoryGB: int(workerMemory), CPUCount: int(workerCPU), ExternalIP: workerExternalIP, RootDiskSize: int(workerRootDiskSizeGB * cluster.GB), ExtraDiskSize: int(workerExtraDiskSizeGB * cluster.GB), TailscaleAuthKey: tailscaleAuthKey, TailscaleTag: tailscaleTag},
161162
imageParallelism,
162-
controlPlaneSecret, kubeconfig, pubkey,
163+
controlPlaneNamespace, controlPlaneSecret, kubeconfig, pubkey,
163164
time.Duration(clusterInitWait)*time.Minute,
164165
kubeconfigOverwrite,
165166
tailscaleAPIKey,
@@ -253,7 +254,8 @@ func rootCmd() (*cobra.Command, error) {
253254
cmd.Flags().StringVar(&userSSHPublicKey, "user-ssh-public-key", "", "Path to public key to inject in all deployed cloud instances")
254255
cmd.Flags().StringVar(&kubeconfigPath, "kubeconfig", "~/.kube/oxide-controller-config", "Path to save kubeconfig when generating new cluster, or to use for accessing existing cluster")
255256
cmd.Flags().BoolVar(&kubeconfigOverwrite, "kubeconfig-overwrite", false, "Whether or not to override the kubeconfig file if it already exists and a new cluster is created")
256-
cmd.Flags().StringVar(&controlPlaneSecret, "control-plane-secret", "kube-system/oxide-controller-secret", "secret in Kubernetes cluster where the following are stored: join token, user ssh public key, controller ssh private/public keypair; should be as <namespace>/<name>")
257+
cmd.Flags().StringVar(&controlPlaneSecret, "control-plane-secret", "oxide-controller-secret", "secret in Kubernetes cluster where the following are stored: join token, user ssh public key, controller ssh private/public keypair; will be in namespace provided by --namespace")
258+
cmd.Flags().StringVar(&controlPlaneNamespace, "control-plane-namespace", "oxide-controller-system", "namespace in Kubernetes cluster where the resources live")
257259
cmd.Flags().BoolVar(&workerExternalIP, "worker-external-ip", false, "Whether or not to assign an ephemeral public IP to the worker nodes, useful for debugging")
258260
cmd.Flags().BoolVar(&controlPlaneExternalIP, "control-plane-external-ip", true, "Whether or not to assign an ephemeral public IP to the control plane nodes, needed to access cluster from outside sled, as well as for debugging")
259261
cmd.Flags().IntVarP(&verbose, "verbose", "v", 0, "set log level, 0 is info, 1 is debug, 2 is trace")

pkg/cluster/cluster.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type Cluster struct {
2929
workerCount int
3030
controlPlaneSpec, workerSpec NodeSpec
3131
secretName string
32+
namespace string
3233
kubeconfig, userPubkey []byte
3334
controlPlaneIP string
3435
imageParallelism int
@@ -37,7 +38,7 @@ type Cluster struct {
3738
}
3839

3940
// New creates a new Cluster instance
40-
func New(logger *log.Entry, client *oxide.Client, projectID string, controlPlanePrefix, workerPrefix string, controlPlaneCount, workerCount int, controlPlaneSpec, workerSpec NodeSpec, imageParallelism int, secretName string, kubeconfig, pubkey []byte, clusterInitWait time.Duration, kubeconfigOverwrite bool, tailscaleAPIKey, tailscaleTailnet string) *Cluster {
41+
func New(logger *log.Entry, client *oxide.Client, projectID string, controlPlanePrefix, workerPrefix string, controlPlaneCount, workerCount int, controlPlaneSpec, workerSpec NodeSpec, imageParallelism int, namespace, secretName string, kubeconfig, pubkey []byte, clusterInitWait time.Duration, kubeconfigOverwrite bool, tailscaleAPIKey, tailscaleTailnet string) *Cluster {
4142
c := &Cluster{
4243
logger: logger.WithField("component", "cluster"),
4344
client: client,
@@ -47,6 +48,7 @@ func New(logger *log.Entry, client *oxide.Client, projectID string, controlPlane
4748
controlPlaneSpec: controlPlaneSpec,
4849
workerSpec: workerSpec,
4950
secretName: secretName,
51+
namespace: namespace,
5052
kubeconfig: kubeconfig,
5153
userPubkey: pubkey,
5254
clusterInitWait: clusterInitWait,
@@ -307,9 +309,15 @@ func (c *Cluster) ensureClusterExists(ctx context.Context) (newKubeconfig []byte
307309
secrets[secretKeyWorkerCount] = []byte(fmt.Sprintf("%d", c.workerCount))
308310
}
309311

312+
// ensure we have the namespace we need
313+
namespace := c.namespace
314+
if err := createNamespace(ctx, namespace, c.kubeconfig); err != nil {
315+
return nil, fmt.Errorf("failed to create namespace: %w", err)
316+
}
317+
310318
// save the join token, system ssh key pair, user ssh key to the Kubernetes secret
311-
c.logger.Debugf("Saving secret %s to Kubernetes", secretName)
312-
if err := saveSecret(ctx, c.logger, secretName, c.kubeconfig, secrets); err != nil {
319+
c.logger.Debugf("Saving secret %s/%s to Kubernetes", namespace, secretName)
320+
if err := saveSecret(ctx, c.logger, namespace, secretName, c.kubeconfig, secrets); err != nil {
313321
return nil, fmt.Errorf("failed to save secret: %w", err)
314322
}
315323

pkg/cluster/namespace.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package cluster
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
v1 "k8s.io/api/core/v1"
8+
k8serrors "k8s.io/apimachinery/pkg/api/errors"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
)
11+
12+
// createNamespace ensures a namespace exists or creates it.
13+
func createNamespace(ctx context.Context, namespace string, kubeconfig []byte) error {
14+
clientset, err := getClientset(kubeconfig)
15+
if err != nil {
16+
return fmt.Errorf("failed to get clientset: %w", err)
17+
}
18+
19+
nsClient := clientset.CoreV1().Namespaces()
20+
21+
// Check if the namespace already exists
22+
_, err = nsClient.Get(ctx, namespace, metav1.GetOptions{})
23+
if err == nil {
24+
// Already exists
25+
return nil
26+
}
27+
if !k8serrors.IsNotFound(err) {
28+
return fmt.Errorf("failed to check namespace existence: %w", err)
29+
}
30+
31+
// Create the namespace
32+
ns := &v1.Namespace{
33+
ObjectMeta: metav1.ObjectMeta{
34+
Name: namespace,
35+
},
36+
}
37+
38+
_, err = nsClient.Create(ctx, ns, metav1.CreateOptions{})
39+
if err != nil {
40+
return fmt.Errorf("failed to create namespace %q: %w", namespace, err)
41+
}
42+
43+
return nil
44+
}

pkg/cluster/secret.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (c *Cluster) SetWorkerCount(ctx context.Context, count int) error {
7373
return fmt.Errorf("failed to get secret: %w", err)
7474
}
7575
secretMap[secretKeyWorkerCount] = []byte(fmt.Sprintf("%d", count))
76-
if err := saveSecret(ctx, c.logger, c.secretName, c.kubeconfig, secretMap); err != nil {
76+
if err := saveSecret(ctx, c.logger, c.namespace, c.secretName, c.kubeconfig, secretMap); err != nil {
7777
return fmt.Errorf("failed to save secret: %w", err)
7878
}
7979
return nil
@@ -103,14 +103,8 @@ func getSecret(ctx context.Context, logger *log.Entry, kubeconfigRaw []byte, sec
103103
}
104104

105105
// saveSecret save a secret to the Kubernetes cluster
106-
func saveSecret(ctx context.Context, logger *log.Entry, secretRef string, kubeconfig []byte, data map[string][]byte) error {
107-
logger.Debugf("Saving secret %s with kubeconfig size %d and keymap size %d", secretRef, len(kubeconfig), len(data))
108-
// Parse namespace and name from <namespace>/<name>
109-
parts := strings.SplitN(secretRef, "/", 2)
110-
if len(parts) != 2 {
111-
return fmt.Errorf("invalid secret reference: expected <namespace>/<name>")
112-
}
113-
namespace, name := parts[0], parts[1]
106+
func saveSecret(ctx context.Context, logger *log.Entry, namespace, name string, kubeconfig []byte, data map[string][]byte) error {
107+
logger.Debugf("Saving secret %s with kubeconfig size %d and keymap size %d", name, len(kubeconfig), len(data))
114108

115109
clientset, err := getClientset(kubeconfig)
116110
if err != nil {

0 commit comments

Comments
 (0)