Skip to content

Commit 18bf866

Browse files
feat(secret-resolver): revert changes on the read_from_mount_and_fallback_to_env_var method
1 parent 8c339bc commit 18bf866

7 files changed

Lines changed: 33 additions & 21 deletions

File tree

src/sap_cloud_sdk/core/auditlog/config.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,11 @@ def _load_config_from_env() -> AuditLogConfig:
109109
binding_data: BindingData = BindingData("", "")
110110

111111
read_from_mount_and_fallback_to_env_var(
112-
module="auditlog", instance="default", target=binding_data
112+
base_volume_mount="/etc/secrets/appfnd",
113+
base_var_name="CLOUD_SDK_CFG",
114+
module="auditlog",
115+
instance="default",
116+
target=binding_data
113117
)
114118

115119
binding_data.validate()

src/sap_cloud_sdk/core/secret_resolver/resolver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,11 @@ def _load_from_env(base_var_name: str, module: str, instance: str, target: Any)
125125

126126

127127
def read_from_mount_and_fallback_to_env_var(
128+
base_volume_mount: str,
129+
base_var_name: str,
128130
module: str,
129131
instance: str,
130132
target: Any,
131-
base_volume_mount: str = BASE_MOUNT_PATH,
132-
base_var_name: str = CLOUD_SDK_ENV_PREFIX,
133133
) -> None:
134134
"""
135135
Load secrets for a given module and instance into the provided dataclass instance `target`.

src/sap_cloud_sdk/destination/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,8 @@ def load_from_env_or_mount(instance: Optional[str] = None) -> DestinationConfig:
132132
# 1) Try mount at /etc/secrets/appfnd/destination/{instance}/...
133133
# 2) Fallback to env: CLOUD_SDK_CFG_DESTINATION_{INSTANCE}_{FIELD_KEY}
134134
read_from_mount_and_fallback_to_env_var(
135+
base_volume_mount="/etc/secrets/appfnd",
136+
base_var_name="CLOUD_SDK_CFG",
135137
module="destination",
136138
instance=inst,
137139
target=binding,

src/sap_cloud_sdk/dms/config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ def load_sdm_config_from_env_or_mount(instance: Optional[str] = None) -> DMSCred
121121
# 1) Try mount at /etc/secrets/appfnd/destination/{instance}/...
122122
# 2) Fallback to env: CLOUD_SDK_CFG_SDM_{INSTANCE}_{FIELD_KEY}
123123
read_from_mount_and_fallback_to_env_var(
124+
base_volume_mount="/etc/secrets/appfnd",
125+
base_var_name="CLOUD_SDK_CFG",
124126
module="sdm",
125127
instance=inst,
126128
target=binding,

tests/core/unit/auditlog/unit/test_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ def mock_read_side_effect(*args, **kwargs):
216216
assert config.service_url == "https://service.example.com"
217217

218218
mock_read.assert_called_once_with(
219+
base_volume_mount="/etc/secrets/appfnd",
220+
base_var_name="CLOUD_SDK_CFG",
219221
module="auditlog",
220222
instance="default",
221223
target=mock_read.call_args.kwargs["target"]

tests/core/unit/secret_resolver/unit/test_secret_resolver.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,21 @@ class TestSecretResolver:
2525
def test_validate_inputs_empty_module(self):
2626
config = SampleConfig()
2727
with pytest.raises(ValueError, match="module name cannot be empty"):
28-
read_from_mount_and_fallback_to_env_var("", "instance", config, base_volume_mount="/path", base_var_name="VAR")
28+
read_from_mount_and_fallback_to_env_var("/path", "VAR", "", "instance", config)
2929

3030
def test_validate_inputs_empty_instance(self):
3131
config = SampleConfig()
3232
with pytest.raises(ValueError, match="instance name cannot be empty"):
33-
read_from_mount_and_fallback_to_env_var("module", "", config, base_volume_mount="/path", base_var_name="VAR")
33+
read_from_mount_and_fallback_to_env_var("/path", "VAR", "module", "", config)
3434

3535
def test_non_dataclass_target(self):
3636
with pytest.raises(RuntimeError, match="failed to read secrets.*target must be a dataclass instance"):
37-
read_from_mount_and_fallback_to_env_var("module", "instance", "not_dataclass", base_volume_mount="/path", base_var_name="VAR")
37+
read_from_mount_and_fallback_to_env_var("/path", "VAR", "module", "instance", "not_dataclass")
3838

3939
def test_non_string_field_error(self):
4040
config = NonStringConfig()
4141
with pytest.raises(RuntimeError, match="failed to read secrets.*is not a string"):
42-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/path", base_var_name="VAR")
42+
read_from_mount_and_fallback_to_env_var("/path", "VAR", "module", "instance", config)
4343

4444
@patch('os.path.isdir', return_value=True)
4545
@patch('os.stat')
@@ -52,7 +52,7 @@ def test_load_from_mount_success(self, mock_file, mock_stat, mock_isdir):
5252
]
5353

5454
config = SampleConfig()
55-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/secrets", base_var_name="VAR")
55+
read_from_mount_and_fallback_to_env_var("/secrets", "VAR", "module", "instance", config)
5656

5757
assert config.username == "test_user"
5858
assert config.password == "test_pass"
@@ -64,20 +64,20 @@ def test_load_from_mount_success(self, mock_file, mock_stat, mock_isdir):
6464
def test_load_from_mount_file_not_found(self, mock_file, mock_stat, mock_isdir):
6565
config = SampleConfig()
6666
with pytest.raises(RuntimeError, match="failed to read secrets.*failed to read secret file"):
67-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/secrets", base_var_name="VAR")
67+
read_from_mount_and_fallback_to_env_var("/secrets", "VAR", "module", "instance", config)
6868

6969
@patch('os.stat', side_effect=FileNotFoundError("Path not found"))
7070
def test_validate_path_not_exists(self, mock_stat):
7171
config = SampleConfig()
7272
with pytest.raises(RuntimeError, match="mount failed"):
73-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/nonexistent", base_var_name="VAR")
73+
read_from_mount_and_fallback_to_env_var("/nonexistent", "VAR", "module", "instance", config)
7474

7575
@patch('os.path.isdir', return_value=False)
7676
@patch('os.stat')
7777
def test_validate_path_not_directory(self, mock_stat, mock_isdir):
7878
config = SampleConfig()
7979
with pytest.raises(RuntimeError, match="mount failed"):
80-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/file", base_var_name="VAR")
80+
read_from_mount_and_fallback_to_env_var("/file", "VAR", "module", "instance", config)
8181

8282
@patch.dict(os.environ, {
8383
"VAR_MODULE_INSTANCE_USER": "env_user",
@@ -88,7 +88,7 @@ def test_load_from_env_success(self):
8888
config = SampleConfig()
8989
with patch('os.path.isdir', return_value=False), \
9090
patch('os.stat', side_effect=FileNotFoundError()):
91-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/nonexistent", base_var_name="VAR")
91+
read_from_mount_and_fallback_to_env_var("/nonexistent", "VAR", "module", "instance", config)
9292

9393
assert config.username == "env_user"
9494
assert config.password == "env_pass"
@@ -100,7 +100,7 @@ def test_load_from_env_missing_var(self):
100100
with patch('os.path.isdir', return_value=False), \
101101
patch('os.stat', side_effect=FileNotFoundError()):
102102
with pytest.raises(RuntimeError, match="env var failed"):
103-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/nonexistent", base_var_name="VAR")
103+
read_from_mount_and_fallback_to_env_var("/nonexistent", "VAR", "module", "instance", config)
104104

105105
@patch('os.path.isdir', return_value=True)
106106
@patch('os.stat')
@@ -113,7 +113,7 @@ def test_mount_success_no_env_fallback(self, mock_file, mock_stat, mock_isdir):
113113
]
114114

115115
config = SampleConfig()
116-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/secrets", base_var_name="VAR")
116+
read_from_mount_and_fallback_to_env_var("/secrets", "VAR", "module", "instance", config)
117117

118118
assert config.username == "mount_user"
119119

@@ -123,7 +123,7 @@ def test_both_fail_aggregated_error(self):
123123
with patch('os.path.isdir', return_value=False), \
124124
patch('os.stat', side_effect=FileNotFoundError()):
125125
with pytest.raises(RuntimeError, match="mount failed.*env var failed"):
126-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/nonexistent", base_var_name="VAR")
126+
read_from_mount_and_fallback_to_env_var("/nonexistent", "VAR", "module", "instance", config)
127127

128128
@patch('os.path.isdir', return_value=True)
129129
@patch('os.stat')
@@ -136,7 +136,7 @@ def test_preserves_newlines(self, mock_file, mock_stat, mock_isdir):
136136
]
137137

138138
config = SampleConfig()
139-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/secrets", base_var_name="VAR")
139+
read_from_mount_and_fallback_to_env_var("/secrets", "VAR", "module", "instance", config)
140140

141141
assert config.username == "user\nwith\nnewlines"
142142

@@ -149,7 +149,7 @@ class CaseConfig:
149149
config = CaseConfig()
150150
with patch('os.path.isdir', return_value=False), \
151151
patch('os.stat', side_effect=FileNotFoundError()):
152-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/nonexistent", base_var_name="VAR")
152+
read_from_mount_and_fallback_to_env_var("/nonexistent", "VAR", "module", "instance", config)
153153

154154
assert config.testfield == "test_value"
155155

@@ -164,7 +164,7 @@ def test_metadata_secret_priority(self, mock_file, mock_stat, mock_isdir):
164164
]
165165

166166
config = SampleConfig()
167-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/secrets", base_var_name="VAR")
167+
read_from_mount_and_fallback_to_env_var("/secrets", "VAR", "module", "instance", config)
168168

169169
assert config.username == "metadata_user"
170170

@@ -179,7 +179,7 @@ def test_env_instance_name_hyphen_normalization(self):
179179
with patch('os.path.isdir', return_value=False), \
180180
patch('os.stat', side_effect=FileNotFoundError()):
181181
read_from_mount_and_fallback_to_env_var(
182-
"module", "my-instance", config, base_volume_mount="/nonexistent", base_var_name="VAR"
182+
"/nonexistent", "VAR", "module", "my-instance", config
183183
)
184184

185185
assert config.username == "env_user_hyphen"
@@ -197,7 +197,7 @@ def test_service_binding_root_overrides_base_mount(self, mock_file, mock_stat, m
197197
mock_open(read_data="e").return_value,
198198
]
199199
config = SampleConfig()
200-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/etc/secrets/appfnd", base_var_name="VAR")
200+
read_from_mount_and_fallback_to_env_var("/etc/secrets/appfnd", "VAR", "module", "instance", config)
201201
first_call_path = mock_file.call_args_list[0][0][0]
202202
assert first_call_path.startswith("/custom/root")
203203

@@ -212,6 +212,6 @@ def test_default_base_mount_used_when_no_service_binding_root(self, mock_file, m
212212
mock_open(read_data="e").return_value,
213213
]
214214
config = SampleConfig()
215-
read_from_mount_and_fallback_to_env_var("module", "instance", config, base_volume_mount="/etc/secrets/appfnd", base_var_name="VAR")
215+
read_from_mount_and_fallback_to_env_var("/etc/secrets/appfnd", "VAR", "module", "instance", config)
216216
first_call_path = mock_file.call_args_list[0][0][0]
217217
assert first_call_path.startswith("/etc/secrets/appfnd")

tests/destination/unit/test_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ def fake_read_side_effect(*args, **kwargs):
126126
# Verify resolver called with expected parameters
127127
assert mock_read.call_count == 1
128128
_, kwargs = mock_read.call_args
129+
assert kwargs["base_volume_mount"] == "/etc/secrets/appfnd"
130+
assert kwargs["base_var_name"] == "CLOUD_SDK_CFG"
129131
assert kwargs["module"] == "destination"
130132
assert kwargs["instance"] == "default"
131133
assert isinstance(kwargs["target"], BindingData)

0 commit comments

Comments
 (0)