Skip to content

Commit d1b6570

Browse files
authored
fix: Load step settings from prefixed environment variables in Argo backend (#194)
1 parent 56e2594 commit d1b6570

2 files changed

Lines changed: 45 additions & 3 deletions

File tree

tests/step/backend_test.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
from wurzel.backend.backend_argo import ArgoBackend, ArgoBackendSettings, EnvVar
1616
from wurzel.datacontract.common import MarkdownDataContract
17-
from wurzel.step import Settings, TypedStep
17+
from wurzel.step import NoSettings, Settings, TypedStep
18+
from wurzel.steps.manual_markdown import ManualMarkdownStep
1819
from wurzel.utils.meta_settings import WZ
1920

2021

@@ -102,6 +103,34 @@ def test_env_vars_in_task_container(argo_backend: ArgoBackend):
102103
assert len(templates[2]["container"]["env"]) == 3
103104

104105

106+
def test_create_envs_from_step_settings_loads_prefixed_env(argo_backend: ArgoBackend, env, tmp_path):
107+
step = WZ(ManualMarkdownStep)
108+
folder = tmp_path / "docs"
109+
folder.mkdir()
110+
env.set("MANUALMARKDOWNSTEP__FOLDER_PATH", str(folder))
111+
112+
envs = argo_backend._create_envs_from_step_settings(step)
113+
env_dict = {e.name: e.value for e in envs}
114+
115+
assert env_dict["MANUALMARKDOWNSTEP__FOLDER_PATH"] == str(folder)
116+
117+
118+
def test_create_envs_from_step_with_no_settings(argo_backend: ArgoBackend):
119+
"""Verify that steps with NoSettings don't cause a crash and return no envs."""
120+
121+
class NoSettingsStep(TypedStep[NoSettings, None, MarkdownDataContract]):
122+
def run(self, inpt: None) -> MarkdownDataContract:
123+
return super().run(inpt)
124+
125+
step = WZ(NoSettingsStep)
126+
127+
# This call should not raise an exception
128+
envs = argo_backend._create_envs_from_step_settings(step)
129+
130+
# Expect an empty list of environment variables
131+
assert envs == []
132+
133+
105134
def test_argo_settings(env):
106135
settings = ArgoBackendSettings()
107136
assert settings.IMAGE == "ghcr.io/telekom/wurzel"

wurzel/backend/backend_argo.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,18 @@
55
import logging
66
from functools import cache
77
from pathlib import Path
8+
from types import NoneType
89
from typing import Any
910

1011
from hera.workflows import DAG, ConfigMapEnvFrom, Container, CronWorkflow, S3Artifact, SecretEnvFrom, Task, Workflow
1112
from hera.workflows.archive import NoneArchiveStrategy
1213
from hera.workflows.models import EnvVar, SecurityContext
13-
from pydantic import Field, SecretStr
14+
from pydantic import Field, SecretStr, ValidationError
1415
from pydantic_settings import SettingsConfigDict
1516

1617
from wurzel.backend.backend import Backend
1718
from wurzel.cli import generate_cli_call
19+
from wurzel.exceptions import EnvSettingsError
1820
from wurzel.step import TypedStep
1921
from wurzel.step.settings import SettingsBase, SettingsLeaf
2022
from wurzel.step_executor import BaseStepExecutor, PrometheusStepExecutor
@@ -98,7 +100,18 @@ def _create_envs_from_step_settings(self, step: "TypedStep[Any, Any, Any]") -> l
98100

99101
env_vars = []
100102

101-
for field_name, field_value in step.settings_class().model_dump().items():
103+
if step.settings_class == NoneType:
104+
return env_vars
105+
106+
settings_cls = step.settings_class.with_prefix(f"{step.__class__.__name__.upper()}__")
107+
try:
108+
settings_instance = settings_cls()
109+
except ValidationError as err: # type: ignore [attr-defined]
110+
e = EnvSettingsError(f"could not create {step.settings_class.__name__} from env for {step.__class__.__name__}")
111+
e.add_note("To fix these issues setup env vars in the format <step_name>__<var>")
112+
raise e from err
113+
114+
for field_name, field_value in settings_instance.model_dump().items():
102115
# Skip fields with sensitive keywords in their names
103116
if isinstance(field_value, SecretStr):
104117
log.info(f"skipped config {field_name} due to secret detection")

0 commit comments

Comments
 (0)