Skip to content

Commit

Permalink
Fix Helm diff output (#434)
Browse files Browse the repository at this point in the history
  • Loading branch information
disrupted authored Jan 23, 2024
1 parent af978b5 commit 08aff76
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 56 deletions.
4 changes: 2 additions & 2 deletions kpops/component_handlers/helm_wrapper/helm_diff.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ def log_helm_diff(
) -> None:
for change in self.calculate_changes(current_release, new_release):
if diff := render_diff(
change.old_value,
change.new_value,
change.old_value.data,
change.new_value.data,
ignore=self.config.ignore,
):
logger.info("\n" + diff)
22 changes: 15 additions & 7 deletions tests/component_handlers/helm_wrapper/test_dry_run_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@ def test_should_print_helm_diff_when_release_is_new(
caplog: LogCaptureFixture,
):
helm_mock.get_manifest.return_value = iter(())
new_release = iter(
[HelmTemplate(Path("path.yaml"), KubernetesManifest({"a": 1}))]
)
mock_load_manifest = mocker.patch(
"kpops.component_handlers.helm_wrapper.dry_run_handler.Helm.load_manifest",
return_value=iter(
[HelmTemplate(Path("path.yaml"), KubernetesManifest({"a": 1}))]
),
return_value=new_release,
)
log.addHandler(caplog.handler)

Expand All @@ -50,6 +51,7 @@ def test_should_print_helm_diff_when_release_is_new(
)
assert "Helm release a-release-name does not exist" in caplog.text
mock_load_manifest.assert_called_once_with("A test stdout")
helm_diff_mock.log_helm_diff.assert_called_once_with(log, [], new_release)

def test_should_print_helm_diff_when_release_exists(
self,
Expand All @@ -58,14 +60,17 @@ def test_should_print_helm_diff_when_release_exists(
mocker: MockerFixture,
caplog: LogCaptureFixture,
):
helm_mock.get_manifest.return_value = iter(
current_release = [
HelmTemplate(Path("path.yaml"), KubernetesManifest({"a": 1}))
]

helm_mock.get_manifest.return_value = iter(current_release)
new_release = iter(
[HelmTemplate(Path("path.yaml"), KubernetesManifest({"a": 1}))]
)
mock_load_manifest = mocker.patch(
"kpops.component_handlers.helm_wrapper.dry_run_handler.Helm.load_manifest",
return_value=iter(
[HelmTemplate(Path("path.yaml"), KubernetesManifest({"a": 1}))]
),
return_value=iter(new_release),
)
log.addHandler(caplog.handler)

Expand All @@ -77,3 +82,6 @@ def test_should_print_helm_diff_when_release_exists(
)
assert "Helm release a-release-name already exists" in caplog.text
mock_load_manifest.assert_called_once_with("A test stdout")
helm_diff_mock.log_helm_diff.assert_called_once_with(
log, current_release, new_release
)
114 changes: 67 additions & 47 deletions tests/component_handlers/helm_wrapper/test_helm_diff.py
Original file line number Diff line number Diff line change
@@ -1,56 +1,76 @@
import logging
from pathlib import Path

import pytest
from pytest import LogCaptureFixture

from kpops.component_handlers.helm_wrapper.helm_diff import HelmDiff
from kpops.component_handlers.helm_wrapper.model import HelmDiffConfig, HelmTemplate
from kpops.component_handlers.kubernetes.model import KubernetesManifest
from kpops.utils.dict_differ import Change

logger = logging.getLogger("TestHelmDiff")

def test_diff():
helm_diff = HelmDiff(HelmDiffConfig())
templates = [HelmTemplate(Path("a.yaml"), KubernetesManifest())]
assert list(helm_diff.calculate_changes(templates, templates)) == [
Change(
old_value={},
new_value={},
),
]

# test matching corresponding template files based on their filename
assert list(
helm_diff.calculate_changes(
[
HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 1})),
HelmTemplate(Path("b.yaml"), KubernetesManifest({"b": 1})),
],
[
HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 2})),
HelmTemplate(Path("c.yaml"), KubernetesManifest({"c": 1})),
],
)
) == [
Change(
old_value={"a": 1},
new_value={"a": 2},
),
Change(
old_value={"b": 1},
new_value={},
),
Change(
old_value={},
new_value={"c": 1},
),
]

# test no current release
assert list(
helm_diff.calculate_changes(
(), [HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 1}))]

class TestHelmDiff:
@pytest.fixture()
def helm_diff(self) -> HelmDiff:
return HelmDiff(HelmDiffConfig())

def test_calculate_changes_unchanged(self, helm_diff: HelmDiff):
templates = [HelmTemplate(Path("a.yaml"), KubernetesManifest())]
assert list(helm_diff.calculate_changes(templates, templates)) == [
Change(
old_value={},
new_value={},
),
]

def test_calculate_changes_matching(self, helm_diff: HelmDiff):
# test matching corresponding template files based on their filename
assert list(
helm_diff.calculate_changes(
[
HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 1})),
HelmTemplate(Path("b.yaml"), KubernetesManifest({"b": 1})),
],
[
HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 2})),
HelmTemplate(Path("c.yaml"), KubernetesManifest({"c": 1})),
],
)
) == [
Change(
old_value={"a": 1},
new_value={"a": 2},
),
Change(
old_value={"b": 1},
new_value={},
),
Change(
old_value={},
new_value={"c": 1},
),
]

def test_calculate_changes_new_release(self, helm_diff: HelmDiff):
# test no current release
assert list(
helm_diff.calculate_changes(
(), [HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 1}))]
)
) == [
Change(
old_value={},
new_value={"a": 1},
),
]

def test_log_helm_diff(self, helm_diff: HelmDiff, caplog: LogCaptureFixture):
helm_diff.log_helm_diff(
logger,
(),
[HelmTemplate(Path("a.yaml"), KubernetesManifest({"a": 1}))],
)
) == [
Change(
old_value={},
new_value={"a": 1},
),
]
assert caplog.messages == ["\n\x1b[32m+ a: 1\n\x1b[0m"]

0 comments on commit 08aff76

Please sign in to comment.