Skip to content

Commit 6217d08

Browse files
authored
Merge pull request #1100 from projectsyn/fix/multi-version-verification
Fix component multi-version verification
2 parents 62d7637 + d2c548e commit 6217d08

File tree

4 files changed

+106
-54
lines changed

4 files changed

+106
-54
lines changed

commodore/compile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ def setup_compile_environment(config: Config) -> tuple[dict[str, Any], Iterable[
236236
create_component_library_aliases(config, cluster_parameters)
237237

238238
# Verify that all aliased components support instantiation
239-
config.verify_component_aliases(cluster_parameters)
239+
config.verify_component_aliases(inventory)
240240
config.register_component_deprecations(cluster_parameters)
241241
# Raise exception if component version override without URL is present in the
242242
# hierarchy.

commodore/component/compile.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def compile_component(
8282

8383
# Verify component alias
8484
nodes = kapitan_inventory(config)
85-
config.verify_component_aliases(nodes[instance_name]["parameters"])
85+
config.verify_component_aliases(nodes, bootstrap_target=instance_name)
8686

8787
cluster_params = nodes[instance_name]["parameters"]
8888
create_component_library_aliases(config, cluster_params)

commodore/config.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,12 @@ def get_component_aliases(self):
379379
def register_component_aliases(self, aliases: dict[str, str]):
380380
self._component_aliases.update(aliases)
381381

382-
def verify_component_aliases(self, cluster_parameters: dict):
382+
def verify_component_aliases(
383+
self, inventory: dict, bootstrap_target: Optional[str] = None
384+
):
385+
if bootstrap_target is None:
386+
bootstrap_target = self.inventory.bootstrap_target
387+
cluster_parameters = inventory[bootstrap_target]["parameters"]
383388
for alias, cn in self._component_aliases.items():
384389
if alias != cn:
385390
if not _component_is_aliasable(cluster_parameters, cn):
@@ -391,8 +396,9 @@ def verify_component_aliases(self, cluster_parameters: dict):
391396
alias_has_version = (
392397
cv.get("url") is not None or cv.get("version") is not None
393398
)
399+
ap = inventory.get(alias, {}).get("parameters", {})
394400
if alias_has_version and not _component_supports_alias_version(
395-
cluster_parameters, cn, alias
401+
cluster_parameters, ap, cn, alias
396402
):
397403
raise click.ClickException(
398404
f"Component {cn} with alias {alias} does not support overriding instance version."
@@ -467,13 +473,14 @@ def _component_is_aliasable(cluster_parameters: dict, component_name: str):
467473

468474
def _component_supports_alias_version(
469475
cluster_parameters: dict,
476+
alias_parameters: dict,
470477
component_name: str,
471478
alias: str,
472479
):
473480
ckey = component_parameters_key(component_name)
474481
cmeta = cluster_parameters[ckey].get("_metadata", {})
475-
akey = component_parameters_key(alias)
476-
ameta = cluster_parameters.get(akey, {}).get("_metadata", {})
482+
# NOTE(sg): We access the merged alias parameters, so we need to lookup the component key.
483+
ameta = alias_parameters[ckey].get("_metadata", {})
477484
return cmeta.get("multi_version", False) and ameta.get("multi_version", False)
478485

479486

tests/test_config.py

Lines changed: 93 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -24,38 +24,51 @@
2424
from commodore.multi_dependency import dependency_key
2525

2626

27+
def make_inventory(cluster_params: dict) -> dict:
28+
return {"cluster": {"parameters": cluster_params}}
29+
30+
2731
def test_verify_component_aliases_no_instance(config):
2832
alias_data = {"bar": "bar"}
2933
config.register_component_aliases(alias_data)
30-
params = {"bar": {"namespace": "syn-bar"}}
34+
params = make_inventory({"bar": {"namespace": "syn-bar"}})
3135

3236
config.verify_component_aliases(params)
3337

3438

3539
def test_verify_component_aliases_explicit_no_instance(config):
3640
alias_data = {"bar": "bar"}
3741
config.register_component_aliases(alias_data)
38-
params = {"bar": {"_metadata": {"multi_instance": False}, "namespace": "syn-bar"}}
42+
params = make_inventory(
43+
{"bar": {"_metadata": {"multi_instance": False}, "namespace": "syn-bar"}}
44+
)
3945

4046
config.verify_component_aliases(params)
4147

4248

4349
def test_verify_component_aliases_explicit_no_multiversion_exception(config):
4450
alias_data = {"baz": "bar"}
4551
config.register_component_aliases(alias_data)
46-
params = {
47-
"components": {
48-
"bar": {"url": "foo", "version": "v1.0.0"},
49-
"baz": {"version": "v1.1.0"},
50-
},
51-
"bar": {
52-
"_metadata": {"multi_instance": True, "multi_version": False},
53-
"namespace": "syn-bar",
54-
},
55-
"baz": {
56-
"_metadata": {"multi_instance": True, "multi_version": False},
57-
"namespace": "syn-baz",
58-
},
52+
params = make_inventory(
53+
{
54+
"components": {
55+
"bar": {"url": "foo", "version": "v1.0.0"},
56+
"baz": {"version": "v1.1.0"},
57+
},
58+
"bar": {
59+
"_metadata": {"multi_instance": True, "multi_version": False},
60+
"namespace": "syn-bar",
61+
},
62+
}
63+
)
64+
# Simulate merged target params for `baz` -> parameters key is `bar`
65+
params["baz"] = {
66+
"parameters": {
67+
"bar": {
68+
"_metadata": {"multi_instance": True, "multi_version": False},
69+
"namespace": "syn-baz",
70+
},
71+
}
5972
}
6073

6174
with pytest.raises(click.ClickException) as e:
@@ -70,19 +83,26 @@ def test_verify_component_aliases_explicit_no_multiversion_exception(config):
7083
def test_verify_component_aliases_explicit_no_multiversion_in_alias_exception(config):
7184
alias_data = {"baz": "bar"}
7285
config.register_component_aliases(alias_data)
73-
params = {
74-
"components": {
75-
"bar": {"url": "foo", "version": "v1.0.0"},
76-
"baz": {"version": "v1.1.0"},
77-
},
78-
"bar": {
79-
"_metadata": {"multi_instance": True, "multi_version": True},
80-
"namespace": "syn-bar",
81-
},
82-
"baz": {
83-
"_metadata": {"multi_instance": True, "multi_version": False},
84-
"namespace": "syn-baz",
85-
},
86+
params = make_inventory(
87+
{
88+
"components": {
89+
"bar": {"url": "foo", "version": "v1.0.0"},
90+
"baz": {"version": "v1.1.0"},
91+
},
92+
"bar": {
93+
"_metadata": {"multi_instance": True, "multi_version": True},
94+
"namespace": "syn-bar",
95+
},
96+
}
97+
)
98+
# Simulate merged target params for `baz` -> parameters key is `bar`
99+
params["baz"] = {
100+
"parameters": {
101+
"bar": {
102+
"_metadata": {"multi_instance": True, "multi_version": False},
103+
"namespace": "syn-baz",
104+
},
105+
}
86106
}
87107

88108
with pytest.raises(click.ClickException) as e:
@@ -97,12 +117,23 @@ def test_verify_component_aliases_explicit_no_multiversion_in_alias_exception(co
97117
def test_verify_component_multiversion_exception(config):
98118
alias_data = {"baz": "bar"}
99119
config.register_component_aliases(alias_data)
100-
params = {
101-
"components": {
102-
"bar": {"url": "foo", "version": "v1.0.0"},
103-
"baz": {"version": "v1.1.0"},
104-
},
105-
"bar": {"_metadata": {"multi_instance": True}},
120+
params = make_inventory(
121+
{
122+
"components": {
123+
"bar": {"url": "foo", "version": "v1.0.0"},
124+
"baz": {"version": "v1.1.0"},
125+
},
126+
"bar": {"_metadata": {"multi_instance": True}},
127+
}
128+
)
129+
# Simulate merged target params for `baz` -> parameters key is `bar`
130+
params["baz"] = {
131+
"parameters": {
132+
"bar": {
133+
"_metadata": {"multi_instance": True},
134+
"namespace": "syn-baz",
135+
},
136+
}
106137
}
107138

108139
with pytest.raises(click.ClickException) as e:
@@ -117,16 +148,26 @@ def test_verify_component_multiversion_exception(config):
117148
def test_verify_component_multiversion(config):
118149
alias_data = {"baz": "bar"}
119150
config.register_component_aliases(alias_data)
120-
params = {
121-
"components": {
122-
"bar": {"url": "foo", "version": "v1.0.0"},
123-
"baz": {"version": "v1.1.0"},
124-
},
125-
"bar": {
126-
"_metadata": {"multi_instance": True, "multi_version": True},
127-
"namespace": "syn-bar",
128-
},
129-
"baz": {"_metadata": {"multi_version": True}, "namespace": "syn-baz"},
151+
params = make_inventory(
152+
{
153+
"components": {
154+
"bar": {"url": "foo", "version": "v1.0.0"},
155+
"baz": {"version": "v1.1.0"},
156+
},
157+
"bar": {
158+
"_metadata": {"multi_instance": True, "multi_version": True},
159+
"namespace": "syn-bar",
160+
},
161+
}
162+
)
163+
# Simulate merged target params for `baz` -> parameters key is `bar`
164+
params["baz"] = {
165+
"parameters": {
166+
"bar": {
167+
"_metadata": {"multi_instance": True, "multi_version": True},
168+
"namespace": "syn-baz",
169+
},
170+
}
130171
}
131172

132173
config.verify_component_aliases(params)
@@ -135,7 +176,9 @@ def test_verify_component_multiversion(config):
135176
def test_verify_component_aliases_metadata(config):
136177
alias_data = {"baz": "bar"}
137178
config.register_component_aliases(alias_data)
138-
params = {"bar": {"_metadata": {"multi_instance": True}, "namespace": "syn-bar"}}
179+
params = make_inventory(
180+
{"bar": {"_metadata": {"multi_instance": True}, "namespace": "syn-bar"}}
181+
)
139182

140183
config.verify_component_aliases(params)
141184

@@ -145,7 +188,7 @@ def test_verify_component_aliases_metadata(config):
145188
def test_verify_toplevel_component_aliases_exception(config):
146189
alias_data = {"baz": "bar"}
147190
config.register_component_aliases(alias_data)
148-
params = {"bar": {"multi_instance": True, "namespace": "syn-bar"}}
191+
params = make_inventory({"bar": {"multi_instance": True, "namespace": "syn-bar"}})
149192

150193
with pytest.raises(click.ClickException) as e:
151194
config.verify_component_aliases(params)
@@ -158,7 +201,7 @@ def test_verify_toplevel_component_aliases_exception(config):
158201
def test_verify_component_aliases_error(config):
159202
alias_data = {"baz": "bar"}
160203
config.register_component_aliases(alias_data)
161-
params = {"bar": {"namespace": "syn-bar"}}
204+
params = make_inventory({"bar": {"namespace": "syn-bar"}})
162205

163206
with pytest.raises(click.ClickException):
164207
config.verify_component_aliases(params)
@@ -167,7 +210,9 @@ def test_verify_component_aliases_error(config):
167210
def test_verify_component_aliases_explicit_no_instance_error(config):
168211
alias_data = {"baz": "bar"}
169212
config.register_component_aliases(alias_data)
170-
params = {"bar": {"_metadata": {"multi_instance": False}, "namespace": "syn-bar"}}
213+
params = make_inventory(
214+
{"bar": {"_metadata": {"multi_instance": False}, "namespace": "syn-bar"}}
215+
)
171216

172217
with pytest.raises(click.ClickException):
173218
config.verify_component_aliases(params)

0 commit comments

Comments
 (0)