Skip to content

Commit a73aae9

Browse files
committed
feat: Install Observability using docker compose
1 parent fb98a23 commit a73aae9

File tree

9 files changed

+722
-1015
lines changed

9 files changed

+722
-1015
lines changed

dk-installer.py

Lines changed: 603 additions & 817 deletions
Large diffs are not rendered by default.

tests/conftest.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def demo_config_path(tmp_data_folder):
126126

127127
@pytest.fixture
128128
def compose_path(tmp_data_folder):
129-
return Path(tmp_data_folder).joinpath("docker-compose.yml")
129+
return Path(tmp_data_folder).joinpath("test-compose.yml")
130130

131131

132132
@pytest.fixture
@@ -165,26 +165,24 @@ def args_mock():
165165
ns.send_analytics_data = True
166166
ns.debug = False
167167

168+
# Compose defaults
169+
ns.prod_name = "Compose Product"
170+
ns.compose_project_name = "test-project"
171+
ns.compose_file_name = "test-compose.yml"
172+
ns.port = 8501
173+
ns.keep_images = False
174+
ns.keep_config = False
175+
ns.skip_verify = False
176+
168177
# TestGen defaults
169178
ns.pull_timeout = 10
170179
ns.ssl_key_file = None
171180
ns.ssl_cert_file = None
172181
ns.image = TESTGEN_DEFAULT_IMAGE
173-
ns.port = 8501
174-
ns.keep_images = False
175-
ns.keep_config = False
176182
ns.obs_export = False
177-
ns.skip_verify = False
178183

179184
# Observability defaults
180-
ns.profile = "dk-observability"
181-
ns.namespace = "datakitchen"
182-
ns.driver = "docker"
183-
ns.memory = "4096m"
184-
ns.helm_timeout = 10
185-
ns.svc_values = None
186-
ns.app_values = None
187-
ns.docker_username = None
188-
ns.docker_password = None
185+
ns.ui_image = "datakitchen/dataops-observability-ui:v2"
186+
ns.be_image = "datakitchen/dataops-observability-be:v2"
189187

190188
yield ns
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33

44
import pytest
55

6-
from tests.installer import TestgenDeleteAction, AbortAction, CommandFailed
6+
from tests.installer import AbortAction, CommandFailed, ComposeDeleteAction
77

88

99
@pytest.fixture
10-
def tg_delete_action(action_cls, args_mock, tmp_data_folder, start_cmd_mock):
11-
action = TestgenDeleteAction()
10+
def compose_delete_action(action_cls, args_mock, tmp_data_folder, start_cmd_mock):
11+
action = ComposeDeleteAction()
1212
args_mock.prod = "tg"
1313
args_mock.action = "delete"
1414
with patch.object(action, "execute", new=partial(action.execute, args_mock)):
@@ -17,15 +17,15 @@ def tg_delete_action(action_cls, args_mock, tmp_data_folder, start_cmd_mock):
1717

1818
@pytest.mark.integration
1919
@pytest.mark.parametrize("fail_network", (False, True))
20-
def test_tg_delete(fail_network, tg_delete_action, start_cmd_mock, stdout_mock):
20+
def test_compose_delete(fail_network, compose_delete_action, start_cmd_mock, stdout_mock):
2121
stdout_mock.side_effect = [
2222
[],
23-
['{"Labels":"com.docker.compose.project=testgen,", "Status":"N/A", "Name": "postgresql"}'],
23+
['{"Labels":"com.docker.compose.project=test-project,", "Status":"N/A", "Name": "postgresql"}'],
2424
[],
2525
]
2626
start_cmd_mock.__exit__.side_effect = [CommandFailed if fail_network else None, None, None]
2727

28-
tg_delete_action.execute()
28+
compose_delete_action.execute()
2929

3030
kwargs = dict(raise_on_non_zero=True, env=None)
3131
start_cmd_mock.assert_has_calls(
@@ -42,12 +42,12 @@ def test_tg_delete(fail_network, tg_delete_action, start_cmd_mock, stdout_mock):
4242
@pytest.mark.parametrize("keep_images, expected_down_args", ((False, ["--rmi", "all"]), (True, [])))
4343
@pytest.mark.parametrize("keep_config", (False, True))
4444
@pytest.mark.parametrize("fail_network", (False, True))
45-
def test_tg_delete_compose(
45+
def test_compose_delete_compose(
4646
fail_network,
4747
keep_config,
4848
keep_images,
4949
expected_down_args,
50-
tg_delete_action,
50+
compose_delete_action,
5151
start_cmd_mock,
5252
stdout_mock,
5353
args_mock,
@@ -58,7 +58,7 @@ def test_tg_delete_compose(
5858
compose_path.touch()
5959
start_cmd_mock.__exit__.side_effect = [None, CommandFailed if fail_network else None]
6060

61-
tg_delete_action.execute()
61+
compose_delete_action.execute()
6262

6363
kwargs = dict(raise_on_non_zero=True, env=None)
6464
start_cmd_mock.assert_has_calls(
@@ -73,24 +73,24 @@ def test_tg_delete_compose(
7373

7474

7575
@pytest.mark.integration
76-
def test_tg_delete_abort(tg_delete_action, start_cmd_mock, compose_path, stdout_mock, console_msg_mock):
76+
def test_compose_delete_abort(compose_delete_action, start_cmd_mock, compose_path, stdout_mock, console_msg_mock):
7777
stdout_mock.side_effect = [
7878
[],
79-
['{"Labels":"com.docker.compose.project=testgen,", "Status":"N/A", "Name": "postgresql"}'],
79+
['{"Labels":"com.docker.compose.project=test-project,", "Status":"N/A", "Name": "postgresql"}'],
8080
[],
8181
]
8282
start_cmd_mock.__exit__.side_effect = [None, None, CommandFailed]
8383
with pytest.raises(AbortAction):
84-
tg_delete_action.execute()
84+
compose_delete_action.execute()
8585

8686
console_msg_mock.assert_any_msg_contains("Could NOT delete docker volumes. Please delete them manually")
8787

8888

8989
@pytest.mark.integration
90-
def test_tg_delete_compose_abort(tg_delete_action, start_cmd_mock, compose_path, console_msg_mock):
90+
def test_compose_delete_compose_abort(compose_delete_action, start_cmd_mock, compose_path, console_msg_mock):
9191
compose_path.touch()
9292
start_cmd_mock.__exit__.side_effect = [CommandFailed, None]
9393
with pytest.raises(AbortAction):
94-
tg_delete_action.execute()
94+
compose_delete_action.execute()
9595

9696
console_msg_mock.assert_any_msg_contains("Could NOT delete the Docker resources")

tests/test_obs_delete.py

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

tests/test_obs_expose.py

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

tests/test_obs_install.py

Lines changed: 19 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
import pytest
77

8-
from tests.installer import ObsInstallAction, MinikubeProfileStep, AbortAction
8+
from tests.installer import ObsInstallAction, AbortAction, ComposeVerifyExistingInstallStep
99

1010

1111
@pytest.fixture
@@ -21,14 +21,12 @@ def obs_install_action(action_cls, args_mock, tmp_data_folder, start_cmd_mock):
2121

2222

2323
@pytest.mark.integration
24-
def test_obs_install(obs_install_action, start_cmd_mock, tmp_data_folder, stdout_mock):
24+
def test_obs_install(obs_install_action, start_cmd_mock, tmp_data_folder, stdout_mock, compose_path):
2525
def _stdout_side_effect():
2626
for idx in count():
2727
if idx == 0:
2828
yield ["{}"]
29-
elif idx == 7:
30-
yield ['[{"Name": "observability-ui", "URLs": ["http://localhost:8501"]}]']
31-
elif idx == 8:
29+
elif idx == 5:
3230
yield ['{"service_account_key": "demo-account-key", "project_id": "test-project-id"}']
3331
else:
3432
yield []
@@ -39,69 +37,24 @@ def _stdout_side_effect():
3937
def_call = partial(call, raise_on_non_zero=True, env=None)
4038
start_cmd_mock.assert_has_calls(
4139
[
42-
def_call("minikube", "-p", "dk-observability", "status", "-o", "json", raise_on_non_zero=False),
40+
def_call("docker", "compose", "ls", "--format=json"),
4341
def_call("docker", "network", "inspect", "datakitchen-network"),
42+
call("docker", "compose", "-f", compose_path, "pull", "--policy", "always"),
43+
def_call("docker", "compose", "-f", compose_path, "up", "--wait"),
4444
def_call(
45-
"minikube",
46-
"start",
47-
"--memory=4096m",
48-
"--profile=dk-observability",
49-
"--namespace=datakitchen",
50-
"--driver=docker",
51-
"--kubernetes-version=v1.32.0",
52-
"--network=datakitchen-network",
53-
"--static-ip=192.168.60.5",
54-
"--embed-certs",
55-
"--extra-config=apiserver.service-node-port-range=1-65535",
56-
"--extra-config=kubelet.allowed-unsafe-sysctls=net.core.somaxconn",
57-
),
58-
def_call(
59-
"helm",
60-
"repo",
61-
"add",
62-
"datakitchen",
63-
"https://datakitchen.github.io/dataops-observability/",
64-
"--force-update",
65-
),
66-
def_call("helm", "repo", "update"),
67-
def_call(
68-
"helm",
69-
"install",
70-
"dataops-observability-services",
71-
"datakitchen/dataops-observability-services",
72-
"--namespace=datakitchen",
73-
"--create-namespace",
74-
"--wait",
75-
"--timeout=10m",
76-
),
77-
def_call(
78-
"helm",
79-
"install",
80-
"dataops-observability-app",
81-
"datakitchen/dataops-observability-app",
82-
"--namespace=datakitchen",
83-
"--create-namespace",
84-
"--wait",
85-
"--timeout=10m",
86-
),
87-
def_call(
88-
"minikube",
89-
"kubectl",
90-
"--profile",
91-
"dk-observability",
92-
"--",
93-
"--namespace",
94-
"datakitchen",
45+
"docker",
46+
"compose",
47+
"-f",
48+
compose_path,
9549
"exec",
96-
"-i",
97-
"deployments/agent-api",
98-
"--",
50+
"-it",
51+
"observability_backend",
9952
"/dk/bin/cli",
10053
"init",
10154
"--demo",
55+
"--topics",
10256
"--json",
10357
),
104-
def_call("minikube", "profile", "dk-observability"),
10558
],
10659
any_order=True,
10760
)
@@ -111,8 +64,11 @@ def _stdout_side_effect():
11164

11265

11366
@pytest.mark.integration
114-
def test_obs_existing_install_abort(obs_install_action, stdout_mock):
115-
stdout_mock.side_effect = [['{"Name":"dk-observability","Host":"Running","Kubelet":"Running"}']]
116-
with patch.object(obs_install_action, "steps", new=[MinikubeProfileStep]):
67+
def test_obs_existing_install_abort(obs_install_action, compose_path, stdout_mock):
68+
stdout_mock.side_effect = [
69+
[f'[{{"Name":"test-project","Status":"running(4)","ConfigFiles":"{compose_path}"}}]'],
70+
[],
71+
]
72+
with patch.object(obs_install_action, "steps", new=[ComposeVerifyExistingInstallStep]):
11773
with pytest.raises(AbortAction):
11874
obs_install_action.execute()

0 commit comments

Comments
 (0)