diff --git a/flux_local/values.py b/flux_local/values.py index eb341740..6f84e3be 100644 --- a/flux_local/values.py +++ b/flux_local/values.py @@ -168,7 +168,7 @@ def _lookup_value_reference( elif (found_value := found_data.get(ref.values_key)) is None: raise InvalidValuesReference( - "Unable to find key {ref.values_key} in {namespace}/{ref.name}" + f"Unable to find key {ref.values_key} in {namespace}/{ref.name}" ) return found_value @@ -230,7 +230,7 @@ def expand_value_references( if not helm_release.values_from: return helm_release - values = helm_release.values or {} + values: dict[str, Any] = {} cluster_config = ks_cluster_config([kustomization]) for ref in helm_release.values_from: _LOGGER.debug("Expanding value reference %s", ref) @@ -257,6 +257,9 @@ def expand_value_references( f"Error building HelmRelease '{helm_release.namespaced_name}': {err}" ) + if helm_release.values: + values = _deep_merge(values, helm_release.values) + helm_release.values = values return helm_release diff --git a/tests/test_values.py b/tests/test_values.py index fb56bc63..b54bfcc6 100644 --- a/tests/test_values.py +++ b/tests/test_values.py @@ -2,6 +2,8 @@ import base64 from pathlib import Path +import yaml +from typing import Any import pytest from syrupy.assertion import SnapshotAssertion @@ -101,6 +103,75 @@ def test_values_references_with_values_key() -> None: } + +@pytest.mark.parametrize( + ("inline_values", "expected_values"), + [ + ( + { + "redis": { + "enabled": True, + } + }, + { + "redis": { + "enabled": True, + } + } + ), + ( + {}, + { + "redis": { + "enabled": False, + } + } + ) + ] +) +def test_value_reference_ordering(inline_values: dict[str, Any], expected_values: dict[str, Any]) -> None: + """Test for expanding a value reference with inline values that overwrite.""" + hr = HelmRelease( + name="test", + namespace="test", + chart=HelmChart( + repo_name="test-repo", + repo_namespace="flux-system", + name="test-chart", + version="test-version", + ), + values={ + **inline_values, + }, + values_from=[ + ValuesReference( + kind="ConfigMap", + name="test-binary-data-configmap", + values_key="some-key", + ), + ], + ) + ks = Kustomization( + name="test", + namespace="test", + path="example/path", + helm_releases=[hr], + config_maps=[ + ConfigMap( + name="test-binary-data-configmap", + namespace="test", + binary_data={ + "some-key": base64.b64encode( + "redis:\n enabled: False".encode("utf-8") + ) + }, + ), + ], + ) + updated_hr = expand_value_references(hr, ks) + assert updated_hr.values == expected_values + + def test_values_references_with_missing_values_key() -> None: """Test for expanding a value reference with a values key that is missing.""" hr = HelmRelease( @@ -300,11 +371,12 @@ def test_values_reference_invalid_target_path() -> None: name="test-chart", version="test-version", ), - values={ - "test": "test", - "target": ["a", "b", "c"], - }, + values={}, values_from=[ + ValuesReference( + kind="ConfigMap", + name="test-values-original-configmap", + ), ValuesReference( kind="ConfigMap", name="test-values-configmap", @@ -324,6 +396,16 @@ def test_values_reference_invalid_target_path() -> None: name="test-values-configmap", namespace="test", data={"some-key": "example_value"}, + ), + ConfigMap( + name="test-values-original-configmap", + namespace="test", + data={ + "values.yaml": yaml.dump({ + "test": "test", + "target": ["a", "b", "c"], + }), + } ) ], ) diff --git a/tests/testdata/cluster8/apps/podinfo-values.yaml b/tests/testdata/cluster8/apps/podinfo-values.yaml index b4f3e312..7e57b5c3 100644 --- a/tests/testdata/cluster8/apps/podinfo-values.yaml +++ b/tests/testdata/cluster8/apps/podinfo-values.yaml @@ -7,7 +7,6 @@ metadata: data: values.yaml: |- redis: - enabled: true repository: public.ecr.aws/docker/library/redis tag: 7.0.5 ingress: diff --git a/tests/testdata/cluster8/apps/podinfo.yaml b/tests/testdata/cluster8/apps/podinfo.yaml index 214f6378..371a0fa7 100644 --- a/tests/testdata/cluster8/apps/podinfo.yaml +++ b/tests/testdata/cluster8/apps/podinfo.yaml @@ -28,6 +28,9 @@ spec: install: remediation: retries: 3 + values: + redis: + enabled: true valuesFrom: - kind: ConfigMap name: podinfo-values diff --git a/tests/tool/__snapshots__/test_build.ambr b/tests/tool/__snapshots__/test_build.ambr index db48e61c..2730aad1 100644 --- a/tests/tool/__snapshots__/test_build.ambr +++ b/tests/tool/__snapshots__/test_build.ambr @@ -945,6 +945,9 @@ retries: 3 interval: 50m releaseName: podinfo + values: + redis: + enabled: true valuesFrom: - kind: ConfigMap name: podinfo-values @@ -968,7 +971,6 @@ tag: 7.0.6 values.yaml: |- redis: - enabled: true repository: public.ecr.aws/docker/library/redis tag: 7.0.5 ingress: @@ -6340,6 +6342,9 @@ retries: 3 interval: 50m releaseName: podinfo + values: + redis: + enabled: true valuesFrom: - kind: ConfigMap name: podinfo-values @@ -6363,7 +6368,6 @@ tag: 7.0.6 values.yaml: |- redis: - enabled: true repository: public.ecr.aws/docker/library/redis tag: 7.0.5 ingress: