From 9b91213bf8b2e9747914277c4a2bc3a29304a836 Mon Sep 17 00:00:00 2001 From: Dev Date: Fri, 27 Feb 2026 09:25:57 +0000 Subject: [PATCH] feat: add secrets support for k8s deployments Adds a `secrets:` key to spec.yml that references pre-existing k8s Secrets by name. SO mounts them as envFrom.secretRef on all pod containers. Secret contents are managed out-of-band by the operator. Co-Authored-By: Claude Opus 4.6 --- stack_orchestrator/constants.py | 1 + stack_orchestrator/deploy/deployment_create.py | 3 +++ stack_orchestrator/deploy/k8s/cluster_info.py | 10 ++++++++++ stack_orchestrator/deploy/spec.py | 3 +++ 4 files changed, 17 insertions(+) diff --git a/stack_orchestrator/constants.py b/stack_orchestrator/constants.py index 75bd0ebc..5e7b59bf 100644 --- a/stack_orchestrator/constants.py +++ b/stack_orchestrator/constants.py @@ -29,6 +29,7 @@ network_key = "network" http_proxy_key = "http-proxy" image_registry_key = "image-registry" configmaps_key = "configmaps" +secrets_key = "secrets" resources_key = "resources" volumes_key = "volumes" security_key = "security" diff --git a/stack_orchestrator/deploy/deployment_create.py b/stack_orchestrator/deploy/deployment_create.py index 511445be..ffbc2872 100644 --- a/stack_orchestrator/deploy/deployment_create.py +++ b/stack_orchestrator/deploy/deployment_create.py @@ -477,6 +477,9 @@ def init_operation( spec_file_content["volumes"] = {**volume_descriptors, **orig_volumes} if configmap_descriptors: spec_file_content["configmaps"] = configmap_descriptors + if "k8s" in deployer_type: + if "secrets" not in spec_file_content: + spec_file_content["secrets"] = {} if opts.o.debug: print( diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py index da24bdc2..e3aaf959 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -483,6 +483,16 @@ class ClusterInfo: ) ) ] + # Mount user-declared secrets from spec.yml + for user_secret_name in self.spec.get_secrets(): + env_from.append( + client.V1EnvFromSource( + secret_ref=client.V1SecretEnvSource( + name=user_secret_name, + optional=True, + ) + ) + ) container = client.V1Container( name=container_name, image=image_to_use, diff --git a/stack_orchestrator/deploy/spec.py b/stack_orchestrator/deploy/spec.py index e5647b04..816cf07b 100644 --- a/stack_orchestrator/deploy/spec.py +++ b/stack_orchestrator/deploy/spec.py @@ -115,6 +115,9 @@ class Spec: def get_configmaps(self): return self.obj.get(constants.configmaps_key, {}) + def get_secrets(self): + return self.obj.get(constants.secrets_key, {}) + def get_container_resources(self): return Resources( self.obj.get(constants.resources_key, {}).get("containers", {})