hy-app-monitor/tests/test_service_release.py

169 lines
7.0 KiB
Python

from __future__ import annotations
import unittest
from unittest.mock import patch
from core.config import HARBOR_PROJECT, HARBOR_REGISTRY
from monitors.yumi.service_release import build_update_targets_payload
class ServiceReleaseTargetsTests(unittest.TestCase):
@patch("monitors.yumi.service_release.gateway_clb_configuration_error", return_value="gateway CLB protection requires .env")
@patch("monitors.yumi.service_release.frontend_release_enabled", return_value=False)
@patch("monitors.yumi.service_release.service_repository_ref", side_effect=lambda service: f"repo/{service}")
@patch("monitors.yumi.service_release.buildable_service_names", return_value=["gateway"])
@patch("monitors.yumi.service_release.service_records_by_name")
@patch("monitors.yumi.service_release.load_local_host_compose_model")
def test_build_update_targets_payload_adds_gateway_clb_warning(
self,
load_local_host_compose_model_mock,
service_records_by_name_mock,
buildable_service_names_mock,
service_repository_ref_mock,
frontend_release_enabled_mock,
gateway_clb_configuration_error_mock,
) -> None:
del buildable_service_names_mock
del service_repository_ref_mock
del frontend_release_enabled_mock
del gateway_clb_configuration_error_mock
service_records_by_name_mock.return_value = {
"gateway": [
{
"host": "gateway-1",
"ip": "10.0.0.1",
"instanceId": "ins-gateway-1",
"port": 8080,
"path": "/health",
}
]
}
load_local_host_compose_model_mock.return_value = {
"services": {
"gateway": {"image": "registry/gateway:main"},
}
}
payload = build_update_targets_payload()
self.assertTrue(payload["ok"])
self.assertEqual(payload["items"][0]["warnings"], ["gateway CLB protection requires .env"])
@patch("monitors.yumi.service_release.frontend_release_enabled", return_value=False)
@patch("monitors.yumi.service_release.service_repository_ref", side_effect=lambda service: f"repo/{service}")
@patch("monitors.yumi.service_release.buildable_service_names", return_value=["auth", "gateway"])
@patch("monitors.yumi.service_release.service_records_by_name")
@patch("monitors.yumi.service_release.load_local_host_compose_model")
def test_build_update_targets_payload_reuses_host_compose_model(
self,
load_local_host_compose_model_mock,
service_records_by_name_mock,
buildable_service_names_mock,
service_repository_ref_mock,
frontend_release_enabled_mock,
) -> None:
del buildable_service_names_mock, service_repository_ref_mock, frontend_release_enabled_mock
service_records_by_name_mock.return_value = {
"auth": [
{
"host": "app-1",
"ip": "10.0.0.1",
"instanceId": "ins-app-1",
"port": 8080,
"path": "/auth",
}
],
"gateway": [
{
"host": "app-1",
"ip": "10.0.0.1",
"instanceId": "ins-app-1",
"port": 9000,
"path": "/gateway",
}
],
}
load_local_host_compose_model_mock.return_value = {
"services": {
"auth": {"image": "registry/auth:main"},
"gateway": {"image": "registry/gateway:main"},
}
}
payload = build_update_targets_payload()
self.assertTrue(payload["ok"])
self.assertEqual(load_local_host_compose_model_mock.call_count, 1)
self.assertEqual([item["service"] for item in payload["items"]], ["auth", "gateway"])
self.assertEqual(payload["items"][0]["currentImages"], ["registry/auth:main"])
self.assertEqual(payload["items"][1]["currentImages"], ["registry/gateway:main"])
@patch("monitors.yumi.service_release.frontend_release_enabled", return_value=False)
@patch("monitors.yumi.service_release.service_repository_ref", side_effect=lambda service: f"repo/{service}")
@patch("monitors.yumi.service_release.buildable_service_names", return_value=["auth"])
@patch("monitors.yumi.service_release.service_records_by_name")
@patch("monitors.yumi.service_release.load_local_host_compose_model", side_effect=RuntimeError("broken compose"))
def test_build_update_targets_payload_keeps_items_when_compose_unavailable(
self,
load_local_host_compose_model_mock,
service_records_by_name_mock,
buildable_service_names_mock,
service_repository_ref_mock,
frontend_release_enabled_mock,
) -> None:
del load_local_host_compose_model_mock
del buildable_service_names_mock, service_repository_ref_mock, frontend_release_enabled_mock
service_records_by_name_mock.return_value = {
"auth": [
{
"host": "app-1",
"ip": "10.0.0.1",
"instanceId": "ins-app-1",
"port": 8080,
"path": "/auth",
}
]
}
payload = build_update_targets_payload()
self.assertTrue(payload["ok"])
self.assertEqual(len(payload["items"]), 1)
self.assertEqual(payload["items"][0]["currentImages"], [])
self.assertEqual(payload["items"][0]["warnings"], ["app-1: broken compose"])
@patch("monitors.yumi.service_release.frontend_release_enabled", return_value=False)
@patch("monitors.yumi.service_release.buildable_service_names", return_value=["auth"])
@patch("monitors.yumi.service_release.service_records_by_name")
@patch("monitors.yumi.service_release.load_local_host_compose_model", side_effect=RuntimeError("broken compose"))
def test_build_update_targets_payload_falls_back_repository_when_compose_unavailable(
self,
load_local_host_compose_model_mock,
service_records_by_name_mock,
buildable_service_names_mock,
frontend_release_enabled_mock,
) -> None:
del load_local_host_compose_model_mock
del buildable_service_names_mock, frontend_release_enabled_mock
service_records_by_name_mock.return_value = {
"auth": [
{
"host": "app-1",
"ip": "10.0.0.1",
"instanceId": "ins-app-1",
"port": 8080,
"path": "/auth",
}
]
}
payload = build_update_targets_payload()
self.assertTrue(payload["ok"])
self.assertEqual(len(payload["items"]), 1)
self.assertEqual(payload["items"][0]["repository"], f"{HARBOR_REGISTRY}/{HARBOR_PROJECT}/java/chatapp3-auth")
if __name__ == "__main__":
unittest.main()