From 641052558a99ad74e9da5a129b65ab3bedcf97d3 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale 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 2ebf96f2..088292ca 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -513,6 +513,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_resources = self._resolve_container_resources( container_name, service_info, global_resources ) diff --git a/stack_orchestrator/deploy/spec.py b/stack_orchestrator/deploy/spec.py index bd62779e..e77b9581 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", {})