Skip to content

Commit dc755cb

Browse files
authored
fix: Fixes SD processing issue with extended merge (#809)
1 parent fd519ad commit dc755cb

File tree

13 files changed

+241
-102
lines changed

13 files changed

+241
-102
lines changed

scripts/build_env/__init__.py

Whitespace-only changes.

scripts/build_env/handle_sd.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,11 @@ def calculate_sd_delta(sd_delta):
169169
def multiply_sds_to_single(sds_data, effective_merge_mode):
170170
if effective_merge_mode == MergeType.EXTENDED:
171171
if isinstance(sds_data, list):
172-
raise ValueError("Multiple SDs not supported in extended merge mode")
173-
full_sd_from_pipe = sds_data
172+
if len(sds_data) > 1:
173+
raise ValueError("Multiple SDs not supported in extended merge mode")
174+
full_sd_from_pipe = sds_data[0]
175+
elif isinstance(sds_data, dict):
176+
full_sd_from_pipe = sds_data
174177
else:
175178
sds_data = sds_data if isinstance(sds_data, list) else [sds_data]
176179
cropped_sds = []

scripts/build_env/pytest.ini

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[pytest]
2+
pythonpath = .

scripts/build_env/test_handle_sd.py

Lines changed: 0 additions & 91 deletions
This file was deleted.

scripts/build_env/test_render_envs.py renamed to scripts/build_env/tests/env-build/test_render_envs.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from envgenehelper import *
55

66
from main import render_environment, cleanup_resulting_dir
7-
from test_helper import TestHelpers
7+
from tests.test_helpers import TestHelpers
88

99
test_data = [
1010
# (cluster_name, environment_name, template)
@@ -18,18 +18,18 @@
1818
("cluster03", "rpo-replacement-mode", "simple"),
1919
]
2020

21-
base_dir = Path(__file__).parent.resolve()
22-
g_templates_dir = str((base_dir / "../../test_data/test_templates").resolve())
23-
g_inventory_dir = str((base_dir / "../../test_data/test_environments").resolve())
24-
g_output_dir = str((base_dir / "../../tmp/test_environments").resolve())
21+
base_dir = Path(__file__).resolve().parents[4]
22+
g_templates_dir = str((base_dir / "test_data/test_templates").resolve())
23+
g_inventory_dir = str((base_dir / "test_data/test_environments").resolve())
24+
g_output_dir = str((base_dir / "/tmp/test_environments").resolve())
2525
g_base_dir = get_parent_dir_for_dir(g_inventory_dir)
2626
environ['CI_PROJECT_DIR'] = g_base_dir
2727
os.environ['CI_COMMIT_REF_NAME'] = "branch_name"
2828

2929

3030
@pytest.fixture(autouse=True)
31-
def change_test_dir(request, monkeypatch):
32-
monkeypatch.chdir(request.fspath.dirname + "/../..")
31+
def change_test_dir(monkeypatch):
32+
monkeypatch.chdir(base_dir)
3333

3434

3535
@pytest.mark.parametrize("cluster_name, env_name, version", test_data)
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import os
2+
3+
import pytest
4+
from unittest.mock import patch
5+
from ruamel.yaml import YAML
6+
7+
from test_sd_helpers import do_prerequisites, assert_sd_contents, load_test_pipeline_sd_data
8+
9+
os.environ['ENVIRONMENT_NAME'] = "temporary"
10+
os.environ['CLUSTER_NAME'] = "temporary"
11+
os.environ['CI_PROJECT_DIR'] = "temporary"
12+
13+
from handle_sd import handle_sd
14+
from envgenehelper import *
15+
from envgenehelper.env_helper import Environment
16+
17+
yaml = YAML()
18+
19+
TEST_CASES_POSITIVE = [
20+
"TC-001-098",
21+
]
22+
23+
TEST_CASES_NEGATIVE = {
24+
"TC-001-099": ValueError,
25+
}
26+
27+
test_suits_map = {
28+
"basic_not_first": [],
29+
"basic_first": [],
30+
"exclude": [],
31+
"extended": ["TC-001-098", "TC-001-099"],
32+
"replace": []
33+
}
34+
35+
TEST_SD_DIR = Path(getAbsPath("../../test_data/test_handle_sd"))
36+
OUTPUT_DIR = getAbsPath("../../tmp/test_handle_sd")
37+
SD = "sd.yaml"
38+
39+
40+
@pytest.mark.parametrize("test_case_name", TEST_CASES_POSITIVE)
41+
@patch("handle_sd.download_sd_by_appver")
42+
def test_sd_positive(mock_download_sd, test_case_name):
43+
env = Environment(str(Path(OUTPUT_DIR, test_case_name)), "cluster-01", "env-01")
44+
do_prerequisites(SD, TEST_SD_DIR, OUTPUT_DIR, test_case_name, env, test_suits_map)
45+
logger.info(f"======TEST HANDLE_SD_ARTIFACT_POSITIVE: {test_case_name}======")
46+
logger.info(f"Starting SD test:"
47+
f"\n\tTest case: {test_case_name}")
48+
49+
sd_data, sd_source_type, sd_version, sd_delta, sd_merge_mode = load_test_pipeline_sd_data(TEST_SD_DIR, test_case_name)
50+
51+
file_path = Path(TEST_SD_DIR, test_case_name, f"mock_sd.json")
52+
sd_data = openJson(file_path)
53+
mock_download_sd.return_value = sd_data
54+
55+
handle_sd(env, sd_source_type, sd_version, sd_data, sd_delta, sd_merge_mode)
56+
actual_dir = os.path.join(env.env_path, "Inventory", "solution-descriptor")
57+
58+
assert_sd_contents(TEST_SD_DIR, OUTPUT_DIR, test_case_name, actual_dir, test_suits_map)
59+
logger.info(f"=====SUCCESS - {test_case_name}======")
60+
61+
62+
@pytest.mark.parametrize("test_case_name,expected_exception", [(k, v) for k, v in TEST_CASES_NEGATIVE.items()])
63+
@patch("handle_sd.download_sd_by_appver")
64+
def test_sd_negative(mock_download_sd, test_case_name, expected_exception):
65+
env = Environment(str(Path(OUTPUT_DIR, test_case_name)), "cluster-01", "env-01")
66+
do_prerequisites(SD, TEST_SD_DIR, OUTPUT_DIR, test_case_name, env, test_suits_map)
67+
logger.info(f"======TEST HANDLE_SD_ARTIFACT_NEGATIVE: {test_case_name}======")
68+
logger.info(f"Starting SD test:"
69+
f"\n\tTest case: {test_case_name}")
70+
71+
sd_data, sd_source_type, sd_version, sd_delta, sd_merge_mode = load_test_pipeline_sd_data(TEST_SD_DIR, test_case_name)
72+
73+
file_path = Path(TEST_SD_DIR, test_case_name, f"mock_sd.json")
74+
sd_data = openJson(file_path)
75+
mock_download_sd.return_value = sd_data
76+
77+
with pytest.raises(expected_exception):
78+
handle_sd(env, sd_source_type, sd_version, sd_data, sd_delta, sd_merge_mode)
79+
80+
logger.info(f"=====SUCCESS - {test_case_name}======")
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import os
2+
3+
import pytest
4+
from ruamel.yaml import YAML
5+
6+
from test_sd_helpers import do_prerequisites, assert_sd_contents, load_test_pipeline_sd_data
7+
8+
os.environ['ENVIRONMENT_NAME'] = "temporary"
9+
os.environ['CLUSTER_NAME'] = "temporary"
10+
os.environ['CI_PROJECT_DIR'] = "temporary"
11+
12+
from handle_sd import handle_sd
13+
from envgenehelper import *
14+
from envgenehelper.env_helper import Environment
15+
16+
yaml = YAML()
17+
TEST_CASES_POSITIVE = [
18+
"TC-001-002",
19+
"TC-001-004",
20+
"TC-001-006",
21+
"TC-001-008",
22+
"TC-001-010",
23+
"TC-001-012",
24+
"TC-001-014",
25+
"TC-001-016",
26+
"TC-001-017",
27+
]
28+
29+
test_suits_map = {
30+
"basic_not_first": ["TC-001-010", "TC-001-012"],
31+
"basic_first": ["TC-001-002", "TC-001-004"],
32+
"exclude": ["TC-001-014", "TC-001-016"],
33+
"extended": ["TC-001-017"],
34+
"replace": ["TC-001-008", "TC-001-006"]
35+
}
36+
37+
TEST_SD_DIR = Path(getAbsPath("../../test_data/test_handle_sd"))
38+
OUTPUT_DIR = getAbsPath("../../tmp/test_handle_sd")
39+
SD = "sd.yaml"
40+
41+
42+
@pytest.mark.parametrize("test_case_name", TEST_CASES_POSITIVE)
43+
def test_sd_positive(test_case_name):
44+
env = Environment(str(Path(OUTPUT_DIR, test_case_name)), "cluster-01", "env-01")
45+
do_prerequisites(SD, TEST_SD_DIR, OUTPUT_DIR, test_case_name, env, test_suits_map)
46+
logger.info(f"======TEST HANDLE_SD_LOCAL_POSITIVE: {test_case_name}======")
47+
logger.info(f"Starting SD test:"
48+
f"\n\tTest case: {test_case_name}")
49+
50+
sd_data, sd_source_type, sd_version, sd_delta, sd_merge_mode = load_test_pipeline_sd_data(TEST_SD_DIR, test_case_name)
51+
52+
handle_sd(env, sd_source_type, sd_version, sd_data, sd_delta, sd_merge_mode)
53+
actual_dir = os.path.join(env.env_path, "Inventory", "solution-descriptor")
54+
55+
assert_sd_contents(TEST_SD_DIR, OUTPUT_DIR, test_case_name, actual_dir, test_suits_map)
56+
logger.info(f"=====SUCCESS - {test_case_name}======")
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from pathlib import Path
2+
3+
from envgenehelper import openYaml, writeYamlToFile
4+
from tests.test_helpers import TestHelpers
5+
6+
def load_test_pipeline_sd_data(test_sd_dir, test_case_name):
7+
file_path = Path(test_sd_dir, test_case_name, f"{test_case_name}.yaml")
8+
test_data = openYaml(file_path)
9+
sd_data = test_data.get("SD_DATA", "{}")
10+
sd_source_type = test_data.get("SD_SOURCE_TYPE", "")
11+
sd_version = test_data.get("SD_VERSION", "")
12+
sd_delta = test_data.get("SD_DELTA", "")
13+
sd_merge_mode = test_data.get("SD_REPO_MERGE_MODE", "basic-merge")
14+
return sd_data, sd_source_type, sd_version, sd_delta, sd_merge_mode
15+
16+
def do_prerequisites(sd, test_sd_dir, output_dir, test_case_name, env, test_suits_map):
17+
TestHelpers.clean_test_dir(output_dir)
18+
pr_dir = test_sd_dir.joinpath("prerequisites")
19+
target_sd_dir = Path(env.env_path, "Inventory", "solution-descriptor")
20+
21+
if test_case_name in test_suits_map["replace"]:
22+
writeYamlToFile(target_sd_dir.joinpath(sd), "")
23+
elif test_case_name in test_suits_map["basic_not_first"]:
24+
writeYamlToFile(target_sd_dir.joinpath(sd), openYaml(pr_dir.joinpath("basic").joinpath(sd)))
25+
elif test_case_name in test_suits_map["exclude"]:
26+
writeYamlToFile(target_sd_dir.joinpath(sd), openYaml(pr_dir.joinpath("exclude").joinpath(sd)))
27+
elif test_case_name in test_suits_map["extended"]:
28+
writeYamlToFile(target_sd_dir.joinpath(sd), openYaml(pr_dir.joinpath("extended").joinpath(sd)))
29+
30+
def assert_sd_contents(test_sd_dir, output_dir, test_case_name, actual_dir, test_suits_map):
31+
er_dir = test_sd_dir.joinpath("ER")
32+
33+
expected_subdir = next((name for name, tests in test_suits_map.items() if test_case_name in tests), None)
34+
expected_dir = er_dir.joinpath(expected_subdir)
35+
TestHelpers.assert_dirs_content(expected_dir, actual_dir, True, True)
36+
TestHelpers.clean_test_dir(output_dir)
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import shutil
55
from pathlib import Path
66

7-
from envgenehelper import dump_as_yaml_format, get_all_files_in_dir
8-
from envgenehelper import logger
7+
from envgenehelper import dump_as_yaml_format, get_all_files_in_dir, logger
98

109

1110
class TestHelpers:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
SD_DATA: ''
2+
SD_SOURCE_TYPE: 'artifact'
3+
SD_VERSION: 'Test-single-sd:v0'
4+
SD_REPO_MERGE_MODE: 'extended-merge'

0 commit comments

Comments
 (0)