diff --git a/requirements.txt b/requirements.txt
index bf4845a1..bbf97b4a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
python-decouple>=3.8
+python-dotenv==1.0.0
GitPython>=3.1.32
tqdm>=4.65.0
python-on-whales>=0.64.0
diff --git a/stack_orchestrator/deploy/deploy_types.py b/stack_orchestrator/deploy/deploy_types.py
index fd14e90e..f97b2649 100644
--- a/stack_orchestrator/deploy/deploy_types.py
+++ b/stack_orchestrator/deploy/deploy_types.py
@@ -13,7 +13,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
-from typing import List
+from typing import List, Mapping
from dataclasses import dataclass
from stack_orchestrator.command_types import CommandOptions
from stack_orchestrator.deploy.deployer import Deployer
@@ -59,3 +59,8 @@ class LaconicStackSetupCommand:
@dataclass
class LaconicStackCreateCommand:
network_dir: str
+
+
+@dataclass
+class DeployEnvVars:
+ map: Mapping[str, str]
diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py
index deb0859d..9275db2b 100644
--- a/stack_orchestrator/deploy/k8s/cluster_info.py
+++ b/stack_orchestrator/deploy/k8s/cluster_info.py
@@ -19,6 +19,8 @@ from typing import Any, List, Set
from stack_orchestrator.opts import opts
from stack_orchestrator.deploy.k8s.helpers import named_volumes_from_pod_files, volume_mounts_for_service, volumes_for_pod_files
from stack_orchestrator.deploy.k8s.helpers import parsed_pod_files_map_from_file_names, get_node_pv_mount_path
+from stack_orchestrator.deploy.k8s.helpers import env_var_map_from_file, envs_from_environment_variables_map
+from stack_orchestrator.deploy.deploy_types import DeployEnvVars
class ClusterInfo:
@@ -26,11 +28,12 @@ class ClusterInfo:
image_set: Set[str] = set()
app_name: str = "test-app"
deployment_name: str = "test-deployment"
+ environment_variables: DeployEnvVars
def __init__(self) -> None:
pass
- def int_from_pod_files(self, pod_files: List[str]):
+ def int(self, pod_files: List[str], compose_env_file):
self.parsed_pod_yaml_map = parsed_pod_files_map_from_file_names(pod_files)
# Find the set of images in the pods
for pod_name in self.parsed_pod_yaml_map:
@@ -42,6 +45,9 @@ class ClusterInfo:
self.image_set.add(image)
if opts.o.debug:
print(f"image_set: {self.image_set}")
+ self.environment_variables = DeployEnvVars(env_var_map_from_file(compose_env_file))
+ if (opts.o.debug):
+ print(f"Env vars: {self.environment_variables.map}")
def get_pvcs(self):
result = []
@@ -97,6 +103,7 @@ class ClusterInfo:
container = client.V1Container(
name=container_name,
image=image,
+ env=envs_from_environment_variables_map(self.environment_variables.map),
ports=[client.V1ContainerPort(container_port=80)],
volume_mounts=volume_mounts,
resources=client.V1ResourceRequirements(
diff --git a/stack_orchestrator/deploy/k8s/deploy_k8s.py b/stack_orchestrator/deploy/k8s/deploy_k8s.py
index 5181e163..bc256b6b 100644
--- a/stack_orchestrator/deploy/k8s/deploy_k8s.py
+++ b/stack_orchestrator/deploy/k8s/deploy_k8s.py
@@ -41,7 +41,7 @@ class K8sDeployer(Deployer):
self.deployment_dir = deployment_dir
self.kind_cluster_name = compose_project_name
self.cluster_info = ClusterInfo()
- self.cluster_info.int_from_pod_files(compose_files)
+ self.cluster_info.int(compose_files, compose_env_file)
def connect_api(self):
config.load_kube_config(context=f"kind-{self.kind_cluster_name}")
diff --git a/stack_orchestrator/deploy/k8s/helpers.py b/stack_orchestrator/deploy/k8s/helpers.py
index ad48957b..db1ef075 100644
--- a/stack_orchestrator/deploy/k8s/helpers.py
+++ b/stack_orchestrator/deploy/k8s/helpers.py
@@ -14,10 +14,11 @@
# along with this program. If not, see .
from kubernetes import client
+from dotenv import dotenv_values
import os
from pathlib import Path
import subprocess
-from typing import Any, Set
+from typing import Any, Set, Mapping, List
from stack_orchestrator.opts import opts
from stack_orchestrator.util import get_yaml
@@ -194,6 +195,13 @@ def _generate_kind_port_mappings(parsed_pod_files):
)
+def envs_from_environment_variables_map(map: Mapping[str, str]) -> List[client.V1EnvVar]:
+ result = []
+ for env_var, env_val in map.items():
+ result.append(client.V1EnvVar(env_var, env_val))
+ return result
+
+
# This needs to know:
# The service ports for the cluster
# The bind mounted volumes for the cluster
@@ -227,3 +235,7 @@ def generate_kind_config(deployment_dir: Path):
f"{port_mappings_yml}\n"
f"{mounts_yml}\n"
)
+
+
+def env_var_map_from_file(file: Path) -> Mapping[str, str]:
+ return dotenv_values(file)