Skip to content

Commit f133014

Browse files
committed
fix: attempt to set volume owner on tg upgrade
1 parent 06ae7b9 commit f133014

File tree

3 files changed

+56
-24
lines changed

3 files changed

+56
-24
lines changed

dk-installer.py

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@
7777
TESTGEN_PULL_TIMEOUT = 5
7878
TESTGEN_PULL_RETRIES = 3
7979
TESTGEN_DEFAULT_PORT = 8501
80-
TESTGEN_LATEST_VERSIONS_URL = "https://dk-support-external.s3.us-east-1.amazonaws.com/testgen-observability/testgen-latest-versions.json"
80+
TESTGEN_LATEST_VERSIONS_URL = (
81+
"https://dk-support-external.s3.us-east-1.amazonaws.com/testgen-observability/testgen-latest-versions.json"
82+
)
8183

8284
MIXPANEL_TOKEN = "4eff51580bc1685b8ffe79ffb22d2704"
8385
MIXPANEL_URL = "https://api.mixpanel.com"
@@ -1636,7 +1638,7 @@ class UpdateComposeFileStep(Step):
16361638
label = "Updating the Docker compose file"
16371639

16381640
def __init__(self):
1639-
self.update_version = None
1641+
self.update_version = False
16401642
self.update_analytics = False
16411643
self.update_token = False
16421644
super().__init__()
@@ -1647,7 +1649,9 @@ def pre_execute(self, action, args):
16471649
CONSOLE.space()
16481650

16491651
contents = action.docker_compose_file_path.read_text()
1650-
if not args.skip_verify:
1652+
if args.skip_verify:
1653+
self.update_version = True
1654+
else:
16511655
try:
16521656
output = action.run_cmd(
16531657
"docker",
@@ -1660,30 +1664,30 @@ def pre_execute(self, action, args):
16601664
"--help",
16611665
capture_text=True,
16621666
)
1663-
version_match = re.search(r"TestGen\s([0-9.]*)", output)
1667+
version_match = re.search(r"TestGen\s(?:[a-zA-Z]+\s)*([0-9.]*)", output)
16641668
current_version = version_match.group(1)
16651669

16661670
image_match = re.search(r"image:\s*(datakitchen.+):.+\n", contents)
16671671
docker_image = image_match.group(1)
16681672
latest_version = "unknown"
1669-
1673+
16701674
ssl_context = ssl.create_default_context()
16711675
ssl_context.check_hostname = False
16721676
ssl_context.verify_mode = ssl.CERT_NONE
16731677
resp = urllib.request.urlopen(TESTGEN_LATEST_VERSIONS_URL, timeout=3, context=ssl_context)
16741678
if resp.code == 200:
1675-
json_data = json.loads(resp.read().decode('utf-8'))
1679+
json_data = json.loads(resp.read().decode("utf-8"))
16761680
latest_version = json_data.get("docker", {}).get(docker_image)
16771681
except Exception:
16781682
CONSOLE.msg("Current version: unknown")
16791683
CONSOLE.msg("Latest version: unknown")
1680-
pass
1684+
self.update_version = True
16811685
else:
16821686
CONSOLE.msg(f"Current version: {current_version}")
16831687
CONSOLE.msg(f"Latest version: {latest_version}")
16841688

16851689
if current_version != latest_version:
1686-
self.update_version = latest_version
1690+
self.update_version = True
16871691
else:
16881692
CONSOLE.msg("Application is already up-to-date.")
16891693

@@ -1949,6 +1953,26 @@ class TestGenStartStep(Step):
19491953
label = "Starting docker compose application"
19501954

19511955
def execute(self, action, args):
1956+
if action.args_cmd == "upgrade":
1957+
try:
1958+
# Set testgen user as volume owner in case UID changes
1959+
action.run_cmd(
1960+
"docker",
1961+
"compose",
1962+
"-f",
1963+
action.docker_compose_file_path,
1964+
"run",
1965+
"--entrypoint",
1966+
"/bin/sh -c",
1967+
"--user",
1968+
"root",
1969+
"--rm",
1970+
"engine",
1971+
"chown -R testgen:testgen /var/lib/testgen",
1972+
)
1973+
except Exception:
1974+
pass
1975+
19521976
action.run_cmd(
19531977
"docker",
19541978
"compose",
@@ -2034,7 +2058,7 @@ def on_action_success(self, action, args):
20342058
capture_text=True,
20352059
)
20362060

2037-
match = re.search("This version:(.*)", output)
2061+
match = re.search(r"TestGen\s(?:[a-zA-Z]+\s)*([0-9.]*)", output)
20382062
CONSOLE.msg(f"Application version: {match.group(1)}")
20392063

20402064

tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,12 @@ def stream_iter_mock():
7272
yield si_mock
7373

7474

75+
@pytest.fixture
76+
def version_check_mock():
77+
with patch("urllib.request.urlopen") as mock:
78+
yield mock
79+
80+
7581
@pytest.fixture
7682
def analytics_mock():
7783
with patch("tests.installer.AnalyticsWrapper") as mock:

tests/test_tg_upgrade.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def tg_upgrade_action(action_cls, args_mock, tmp_data_folder, start_cmd_mock, re
1818
def tg_upgrade_stdout_side_effect(stdout_mock):
1919
side_effect = [
2020
# Pre-execute calls
21-
[b"This version: 1.0.0\n", b"Latest version: 1.1.0\n"], # Version check
21+
[b"TestGen 1.0.0\n"], # Version check
2222
# Execute calls
2323
[], # Down
2424
[], # Pull
2525
[], # Up
2626
[], # Upgrade DB
2727
# Post-execute calls
28-
[b"This version: 1.1.0\n", b"Latest version: 1.1.0\n"], # Confirmation version check
28+
[b"TestGen 1.1.0\n"], # Confirmation version check
2929
[b"[]"], # Image data collection
3030
]
3131

@@ -59,7 +59,7 @@ def get_compose_content(*extra_vars):
5959

6060
@pytest.mark.integration
6161
def test_tg_upgrade_compose_missing(tg_upgrade_action, args_mock, start_cmd_mock, console_msg_mock):
62-
start_cmd_mock.__exit__.side_effect = [None, None, None, CommandFailed]
62+
start_cmd_mock.__exit__.side_effect = [None, None, CommandFailed]
6363

6464
with pytest.raises(AbortAction, match=""):
6565
tg_upgrade_action._check_requirements(args_mock)
@@ -68,7 +68,9 @@ def test_tg_upgrade_compose_missing(tg_upgrade_action, args_mock, start_cmd_mock
6868

6969

7070
@pytest.mark.integration
71-
def test_tg_upgrade(tg_upgrade_action, compose_path, start_cmd_mock, tg_upgrade_stdout_side_effect, args_mock):
71+
def test_tg_upgrade(tg_upgrade_action, compose_path, start_cmd_mock, tg_upgrade_stdout_side_effect, args_mock, version_check_mock):
72+
version_check_mock.return_value.code = 200
73+
version_check_mock.return_value.read.return_value = b"{\"docker\": {\"datakitchen/dataops-testgen\": \"1.1.0\"}}"
7274
compose_path.write_text(get_compose_content())
7375

7476
tg_upgrade_action.execute(args_mock)
@@ -93,21 +95,17 @@ def test_tg_upgrade(tg_upgrade_action, compose_path, start_cmd_mock, tg_upgrade_
9395

9496

9597
@pytest.mark.integration
96-
@pytest.mark.parametrize(
97-
"skip_verify, latest_version",
98-
((True, b"1.0.0"), (True, b"1.1.0"), (False, b"1.0.0")),
99-
)
10098
def test_tg_upgrade_abort(
101-
skip_verify,
102-
latest_version,
10399
tg_upgrade_action,
104100
compose_path,
105101
start_cmd_mock,
106102
tg_upgrade_stdout_side_effect,
107103
args_mock,
104+
version_check_mock,
108105
):
109-
args_mock.skip_verify = skip_verify
110-
tg_upgrade_stdout_side_effect[0][1] = b"Latest version: %b\n" % latest_version
106+
args_mock.skip_verify = False
107+
version_check_mock.return_value.code = 200
108+
version_check_mock.return_value.read.return_value = b"{\"docker\": {\"datakitchen/dataops-testgen\": \"1.0.0\"}}"
111109
initial_compose_content = get_compose_content("TG_INSTANCE_ID: test-instance-id")
112110
compose_path.write_text(initial_compose_content)
113111

@@ -116,7 +114,7 @@ def test_tg_upgrade_abort(
116114

117115
compose_content = compose_path.read_text()
118116
assert compose_content == initial_compose_content
119-
assert start_cmd_mock.call_count == 0 if skip_verify else 1
117+
assert start_cmd_mock.call_count == 1
120118

121119

122120
@pytest.mark.integration
@@ -130,8 +128,10 @@ def test_tg_upgrade_enable_analytics(
130128
args_mock,
131129
console_msg_mock,
132130
analytics_mock,
131+
version_check_mock,
133132
):
134-
tg_upgrade_stdout_side_effect[0][1] = b"Latest version: 1.0.0\n"
133+
version_check_mock.return_value.code = 200
134+
version_check_mock.return_value.read.return_value = b"{\"docker\": {\"datakitchen/dataops-testgen\": \"1.0.0\"}}"
135135
compose_path.write_text(get_compose_content("TG_ANALYTICS: no" if re_enable else ""))
136136
analytics_mock.get_instance_id.return_value = "test-instance-id"
137137

@@ -153,9 +153,11 @@ def test_tg_upgrade_disable_analytics(
153153
tg_upgrade_stdout_side_effect,
154154
args_mock,
155155
console_msg_mock,
156+
version_check_mock,
156157
):
157158
args_mock.send_analytics_data = False
158-
tg_upgrade_stdout_side_effect[0][1] = b"Latest version: 1.0.0\n"
159+
version_check_mock.return_value.code = 200
160+
version_check_mock.return_value.read.return_value = b"{\"docker\": {\"datakitchen/dataops-testgen\": \"1.0.0\"}}"
159161
compose_path.write_text(
160162
get_compose_content("TG_INSTANCE_ID: test-instance-id", "TG_ANALYTICS: yes" if explicitly_enabled else "")
161163
)

0 commit comments

Comments
 (0)