123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840 |
- import json
- import pytest
- from render import Render
- @pytest.fixture
- def mock_values():
- return {
- "images": {
- "test_image": {
- "repository": "nginx",
- "tag": "latest",
- }
- },
- }
- def test_add_postgres_missing_config(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.postgres(
- "pg_container",
- "test_image",
- {"user": "test_user", "password": "test_password", "database": "test_database"}, # type: ignore
- )
- def test_add_postgres_unsupported_repo(mock_values):
- mock_values["images"]["pg_image"] = {"repository": "unsupported_repo", "tag": "16"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.postgres(
- "pg_container",
- "pg_image",
- {
- "user": "test_user",
- "password": "test_@password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- def test_add_postgres(mock_values):
- mock_values["images"]["pg_image"] = {"repository": "postgres", "tag": "16"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- p = render.deps.postgres(
- "pg_container",
- "pg_image",
- {
- "user": "test_user",
- "password": "test_@password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- p.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert (
- p.get_url("postgres") == "postgres://test_user:test_%40password@pg_container:5432/test_database?sslmode=disable"
- )
- assert "devices" not in output["services"]["pg_container"]
- assert "reservations" not in output["services"]["pg_container"]["deploy"]["resources"]
- assert output["services"]["pg_container"]["image"] == "postgres:16"
- assert output["services"]["pg_container"]["user"] == "999:999"
- assert output["services"]["pg_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["pg_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["pg_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "pg_isready",
- "-h",
- "127.0.0.1",
- "-p",
- "5432",
- "-U",
- "test_user",
- "-d",
- "test_database",
- ],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["pg_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/var/lib/postgresql/data",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["pg_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "POSTGRES_USER": "test_user",
- "POSTGRES_PASSWORD": "test_@password",
- "POSTGRES_DB": "test_database",
- "PGPORT": "5432",
- }
- assert output["services"]["pg_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"},
- "pg_container_upgrade": {"condition": "service_completed_successfully"},
- }
- assert output["services"]["perms_container"]["restart"] == "on-failure:1"
- def test_add_redis_missing_config(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.redis(
- "redis_container",
- "test_image",
- {"password": "test_password", "volume": {}}, # type: ignore
- )
- def test_add_redis_unsupported_repo(mock_values):
- mock_values["images"]["redis_image"] = {"repository": "unsupported_repo", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.redis(
- "redis_container",
- "redis_image",
- {
- "password": "test&password@",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- def test_add_redis_with_password_with_spaces(mock_values):
- mock_values["images"]["redis_image"] = {"repository": "redis", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.redis(
- "redis_container",
- "redis_image",
- {"password": "test password", "volume": {}}, # type: ignore
- )
- def test_add_redis(mock_values):
- mock_values["images"]["redis_image"] = {"repository": "valkey/valkey", "tag": "latest"}
- mock_values["run_as"] = {"user": 0, "group": 0}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- r = render.deps.redis(
- "redis_container",
- "redis_image",
- {
- "password": "test&password@",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- c1.environment.add_env("REDIS_URL", r.get_url("redis"))
- if perms_container.has_actions():
- perms_container.activate()
- r.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert "devices" not in output["services"]["redis_container"]
- assert "reservations" not in output["services"]["redis_container"]["deploy"]["resources"]
- assert (
- output["services"]["test_container"]["environment"]["REDIS_URL"]
- == "redis://default:test%26password%40@redis_container:6379"
- )
- assert output["services"]["redis_container"]["image"] == "valkey/valkey:latest"
- assert output["services"]["redis_container"]["user"] == "568:568"
- assert output["services"]["redis_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["redis_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["redis_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "redis-cli",
- "-h",
- "127.0.0.1",
- "-p",
- "6379",
- "-a",
- "test&password@",
- "ping",
- ],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["redis_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/data",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["redis_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "REDIS_PASSWORD": "test&password@",
- }
- assert output["services"]["redis_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"}
- }
- def test_add_mariadb_missing_config(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.mariadb(
- "mariadb_container",
- "test_image",
- {"user": "test_user", "password": "test_password", "database": "test_database"}, # type: ignore
- )
- def test_add_mariadb_unsupported_repo(mock_values):
- mock_values["images"]["mariadb_image"] = {"repository": "unsupported_repo", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.mariadb(
- "mariadb_container",
- "mariadb_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- def test_add_mariadb(mock_values):
- mock_values["images"]["mariadb_image"] = {"repository": "mariadb", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- m = render.deps.mariadb(
- "mariadb_container",
- "mariadb_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- m.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert "devices" not in output["services"]["mariadb_container"]
- assert "reservations" not in output["services"]["mariadb_container"]["deploy"]["resources"]
- assert output["services"]["mariadb_container"]["image"] == "mariadb:latest"
- assert output["services"]["mariadb_container"]["user"] == "999:999"
- assert output["services"]["mariadb_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["mariadb_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["mariadb_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "mariadb-admin",
- "--user=root",
- "--host=127.0.0.1",
- "--port=3306",
- "--password=test_password",
- "ping",
- ],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["mariadb_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/var/lib/mysql",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["mariadb_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "MARIADB_USER": "test_user",
- "MARIADB_PASSWORD": "test_password",
- "MARIADB_ROOT_PASSWORD": "test_password",
- "MARIADB_DATABASE": "test_database",
- "MARIADB_AUTO_UPGRADE": "true",
- }
- assert output["services"]["mariadb_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"}
- }
- def test_add_perms_container(mock_values):
- mock_values["ix_volumes"] = {
- "test_dataset1": "/mnt/test/1",
- "test_dataset2": "/mnt/test/2",
- "test_dataset3": "/mnt/test/3",
- }
- mock_values["images"]["postgres_image"] = {"repository": "postgres", "tag": "17"}
- mock_values["images"]["redis_image"] = {"repository": "valkey/valkey", "tag": "latest"}
- mock_values["images"]["mariadb_image"] = {"repository": "mariadb", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- # fmt: off
- volume_perms = {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}}
- volume_no_perms = {"type": "volume", "volume_config": {"volume_name": "test_volume"}}
- host_path_perms = {"type": "host_path", "host_path_config": {"path": "/mnt/test", "auto_permissions": True}}
- host_path_no_perms = {"type": "host_path", "host_path_config": {"path": "/mnt/test"}}
- host_path_acl_perms = {"type": "host_path", "host_path_config": {"acl": {"path": "/mnt/test"}, "acl_enable": True, "auto_permissions": True}} # noqa
- ix_volume_no_perms = {"type": "ix_volume", "ix_volume_config": {"dataset_name": "test_dataset1"}}
- ix_volume_perms = {"type": "ix_volume", "ix_volume_config": {"dataset_name": "test_dataset2", "auto_permissions": True}} # noqa
- ix_volume_acl_perms = {"type": "ix_volume", "ix_volume_config": {"dataset_name": "test_dataset3", "acl_enable": True, "auto_permissions": True}} # noqa
- temp_volume = {"type": "temporary", "volume_config": {"volume_name": "test_temp_volume"}}
- read_only_volume = {"type": "volume", "read_only": True, "volume_config": {"volume_name": "test_read_only_volume", "auto_permissions": True}} # noqa
- # fmt: on
- c1.add_storage("/some/path1", volume_perms)
- c1.add_storage("/some/path2", volume_no_perms)
- c1.add_storage("/some/path3", host_path_perms)
- c1.add_storage("/some/path4", host_path_no_perms)
- c1.add_storage("/some/path5", host_path_acl_perms)
- c1.add_storage("/some/path6", ix_volume_no_perms)
- c1.add_storage("/some/path7", ix_volume_perms)
- c1.add_storage("/some/path8", ix_volume_acl_perms)
- c1.add_storage("/some/path9", temp_volume)
- c1.add_storage("/some/path10", read_only_volume)
- perms_container = render.deps.perms("test_perms_container")
- perms_container.add_or_skip_action("data", volume_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data2", volume_no_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data3", host_path_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data4", host_path_no_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data5", host_path_acl_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data6", ix_volume_no_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data7", ix_volume_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data8", ix_volume_acl_perms, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data9", temp_volume, {"uid": 1000, "gid": 1000, "mode": "check"})
- perms_container.add_or_skip_action("data10", read_only_volume, {"uid": 1000, "gid": 1000, "mode": "check"})
- postgres = render.deps.postgres(
- "postgres_container",
- "postgres_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- redis = render.deps.redis(
- "redis_container",
- "redis_image",
- {
- "password": "test_password",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- mariadb = render.deps.mariadb(
- "mariadb_container",
- "mariadb_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- c1.depends.add_dependency("test_perms_container", "service_completed_successfully")
- postgres.container.depends.add_dependency("test_perms_container", "service_completed_successfully")
- redis.container.depends.add_dependency("test_perms_container", "service_completed_successfully")
- mariadb.container.depends.add_dependency("test_perms_container", "service_completed_successfully")
- output = render.render()
- assert output["services"]["test_perms_container"]["network_mode"] == "none"
- assert output["services"]["test_container"]["depends_on"] == {
- "test_perms_container": {"condition": "service_completed_successfully"}
- }
- assert output["configs"]["permissions_run_script"]["content"] != ""
- # fmt: off
- content = [
- {"read_only": False, "mount_path": "/mnt/permission/data", "is_temporary": False, "identifier": "data", "recursive": False, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/data3", "is_temporary": False, "identifier": "data3", "recursive": False, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/data6", "is_temporary": False, "identifier": "data6", "recursive": False, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/data7", "is_temporary": False, "identifier": "data7", "recursive": False, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/data9", "is_temporary": True, "identifier": "data9", "recursive": True, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": True, "mount_path": "/mnt/permission/data10", "is_temporary": False, "identifier": "data10", "recursive": False, "mode": "check", "uid": 1000, "gid": 1000, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/postgres_container_postgres_data", "is_temporary": False, "identifier": "postgres_container_postgres_data", "recursive": False, "mode": "check", "uid": 999, "gid": 999, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/redis_container_redis_data", "is_temporary": False, "identifier": "redis_container_redis_data", "recursive": False, "mode": "check", "uid": 568, "gid": 568, "chmod": None}, # noqa
- {"read_only": False, "mount_path": "/mnt/permission/mariadb_container_mariadb_data", "is_temporary": False, "identifier": "mariadb_container_mariadb_data", "recursive": False, "mode": "check", "uid": 999, "gid": 999, "chmod": None}, # noqa
- ]
- # fmt: on
- assert output["configs"]["permissions_actions_data"]["content"] == json.dumps(content)
- def test_add_duplicate_perms_action(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- vol_config = {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}}
- c1.add_storage("/some/path", vol_config)
- perms_container = render.deps.perms("test_perms_container")
- perms_container.add_or_skip_action("data", vol_config, {"uid": 1000, "gid": 1000, "mode": "check"})
- with pytest.raises(Exception):
- perms_container.add_or_skip_action("data", vol_config, {"uid": 1000, "gid": 1000, "mode": "check"})
- def test_add_perm_action_without_auto_perms_enabled(mock_values):
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- vol_config = {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": False}}
- c1.add_storage("/some/path", vol_config)
- perms_container = render.deps.perms("test_perms_container")
- perms_container.add_or_skip_action("data", vol_config, {"uid": 1000, "gid": 1000, "mode": "check"})
- if perms_container.has_actions():
- perms_container.activate()
- c1.depends.add_dependency("test_perms_container", "service_completed_successfully")
- output = render.render()
- assert "configs" not in output
- assert "ix-test_perms_container" not in output["services"]
- assert "depends_on" not in output["services"]["test_container"]
- def test_add_unsupported_postgres_version(mock_values):
- mock_values["images"]["pg_image"] = {"repository": "postgres", "tag": "99"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.postgres(
- "test_container",
- "test_image",
- {"user": "test_user", "password": "test_password", "database": "test_database"}, # type: ignore
- )
- def test_add_postgres_with_invalid_tag(mock_values):
- mock_values["images"]["pg_image"] = {"repository": "postgres", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- with pytest.raises(Exception):
- render.deps.postgres(
- "pg_container",
- "pg_image",
- {"user": "test_user", "password": "test_password", "database": "test_database"}, # type: ignore
- )
- def test_no_upgrade_container_with_non_postgres_image(mock_values):
- mock_values["images"]["postgres_image"] = {"repository": "tensorchord/pgvecto-rs", "tag": "pg15-v0.2.0"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("test_perms_container")
- pg = render.deps.postgres(
- "postgres_container",
- "postgres_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- pg.add_dependency("test_perms_container", "service_completed_successfully")
- output = render.render()
- assert len(output["services"]) == 3 # c1, pg, perms
- assert output["services"]["postgres_container"]["depends_on"] == {
- "test_perms_container": {"condition": "service_completed_successfully"}
- }
- def test_postgres_with_upgrade_container(mock_values):
- mock_values["images"]["pg_image"] = {"repository": "postgres", "tag": 16.6}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("test_perms_container")
- pg = render.deps.postgres(
- "postgres_container",
- "pg_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- pg.add_dependency("test_perms_container", "service_completed_successfully")
- output = render.render()
- pg = output["services"]["postgres_container"]
- pgup = output["services"]["postgres_container_upgrade"]
- assert pg["volumes"] == pgup["volumes"]
- assert pg["user"] == pgup["user"]
- assert pgup["environment"]["TARGET_VERSION"] == "16"
- assert pgup["environment"]["DATA_DIR"] == "/var/lib/postgresql/data"
- pgup_env = pgup["environment"]
- pgup_env.pop("TARGET_VERSION")
- pgup_env.pop("DATA_DIR")
- assert pg["environment"] == pgup_env
- assert pg["depends_on"] == {
- "test_perms_container": {"condition": "service_completed_successfully"},
- "postgres_container_upgrade": {"condition": "service_completed_successfully"},
- }
- assert pgup["depends_on"] == {"test_perms_container": {"condition": "service_completed_successfully"}}
- assert pgup["restart"] == "on-failure:1"
- assert pgup["healthcheck"] == {"disable": True}
- assert pgup["image"] == "ixsystems/postgres-upgrade:1.0.1"
- assert pgup["entrypoint"] == ["/bin/bash", "-c", "/upgrade.sh"]
- def test_add_mongodb(mock_values):
- mock_values["images"]["mongodb_image"] = {"repository": "mongodb", "tag": "latest"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- m = render.deps.mongodb(
- "mongodb_container",
- "mongodb_image",
- {
- "user": "test_user",
- "password": "test_password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- m.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert "devices" not in output["services"]["mongodb_container"]
- assert "reservations" not in output["services"]["mongodb_container"]["deploy"]["resources"]
- assert output["services"]["mongodb_container"]["image"] == "mongodb:latest"
- assert output["services"]["mongodb_container"]["user"] == "999:999"
- assert output["services"]["mongodb_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["mongodb_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["mongodb_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "mongosh",
- "--host",
- "127.0.0.1",
- "--port",
- "27017",
- "test_database",
- "--eval",
- 'db.adminCommand("ping")',
- "--quiet",
- ],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["mongodb_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/data/db",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["mongodb_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "MONGO_INITDB_ROOT_USERNAME": "test_user",
- "MONGO_INITDB_ROOT_PASSWORD": "test_password",
- "MONGO_INITDB_DATABASE": "test_database",
- }
- assert output["services"]["mongodb_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"}
- }
- def test_add_mongodb_unsupported_repo(mock_values):
- mock_values["images"]["mongo_image"] = {"repository": "unsupported_repo", "tag": "7"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.mongodb(
- "mongo_container",
- "mongo_image",
- {
- "user": "test_user",
- "password": "test_@password",
- "database": "test_database",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- def test_add_meilisearch(mock_values):
- mock_values["images"]["meili_image"] = {"repository": "getmeili/meilisearch", "tag": "v1.17.0"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- m = render.deps.meilisearch(
- "meili_container",
- "meili_image",
- {
- "master_key": "test_master_key",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- m.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert "devices" not in output["services"]["meili_container"]
- assert "reservations" not in output["services"]["meili_container"]["deploy"]["resources"]
- assert output["services"]["meili_container"]["image"] == "getmeili/meilisearch:v1.17.0"
- assert output["services"]["meili_container"]["user"] == "568:568"
- assert output["services"]["meili_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["meili_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["meili_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "curl",
- "--request",
- "GET",
- "--silent",
- "--output",
- "/dev/null",
- "--show-error",
- "--fail",
- "http://127.0.0.1:7700/health",
- ],
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["meili_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/meili_data",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["meili_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "MEILI_MASTER_KEY": "test_master_key",
- "MEILI_HTTP_ADDR": "0.0.0.0:7700",
- "MEILI_NO_ANALYTICS": "true",
- "MEILI_EXPERIMENTAL_DUMPLESS_UPGRADE": "true",
- }
- assert output["services"]["meili_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"}
- }
- def test_add_meilisearch_unsupported_repo(mock_values):
- mock_values["images"]["meili_image"] = {"repository": "unsupported_repo", "tag": "7"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.meilisearch(
- "meili_container",
- "meili_image",
- {
- "master_key": "test_master_key",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- def test_add_elasticsearch(mock_values):
- mock_values["images"]["elastic_image"] = {
- "repository": "docker.elastic.co/elasticsearch/elasticsearch",
- "tag": "9.1.2",
- }
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- m = render.deps.elasticsearch(
- "elastic_container",
- "elastic_image",
- {
- "password": "test_password",
- "node_name": "some_test_node",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
- if perms_container.has_actions():
- perms_container.activate()
- m.container.depends.add_dependency("perms_container", "service_completed_successfully")
- output = render.render()
- assert "devices" not in output["services"]["elastic_container"]
- assert "reservations" not in output["services"]["elastic_container"]["deploy"]["resources"]
- assert output["services"]["elastic_container"]["image"] == "docker.elastic.co/elasticsearch/elasticsearch:9.1.2"
- assert output["services"]["elastic_container"]["user"] == "1000:1000"
- assert output["services"]["elastic_container"]["deploy"]["resources"]["limits"]["cpus"] == "2.0"
- assert output["services"]["elastic_container"]["deploy"]["resources"]["limits"]["memory"] == "4096M"
- assert output["services"]["elastic_container"]["healthcheck"] == {
- "test": [
- "CMD",
- "curl",
- "--request",
- "GET",
- "--silent",
- "--output",
- "/dev/null",
- "--show-error",
- "--fail",
- "--header",
- "Authorization: Basic ZWxhc3RpYzp0ZXN0X3Bhc3N3b3Jk",
- "http://127.0.0.1:9200/_cluster/health?local=true",
- ], # noqa
- "interval": "30s",
- "timeout": "5s",
- "retries": 5,
- "start_period": "15s",
- "start_interval": "2s",
- }
- assert output["services"]["elastic_container"]["volumes"] == [
- {
- "type": "volume",
- "source": "test_volume",
- "target": "/usr/share/elasticsearch/data",
- "read_only": False,
- "volume": {"nocopy": False},
- }
- ]
- assert output["services"]["elastic_container"]["environment"] == {
- "TZ": "Etc/UTC",
- "UMASK": "002",
- "UMASK_SET": "002",
- "NVIDIA_VISIBLE_DEVICES": "void",
- "ELASTIC_PASSWORD": "test_password",
- "http.port": "9200",
- "path.data": "/usr/share/elasticsearch/data",
- "path.repo": "/usr/share/elasticsearch/data/snapshots",
- "node.name": "some_test_node",
- "discovery.type": "single-node",
- "xpack.security.enabled": "true",
- "xpack.security.transport.ssl.enabled": "false",
- }
- assert output["services"]["elastic_container"]["depends_on"] == {
- "perms_container": {"condition": "service_completed_successfully"}
- }
- def test_add_elasticsearch_unsupported_repo(mock_values):
- mock_values["images"]["elastic_image"] = {"repository": "unsupported_repo", "tag": "7"}
- render = Render(mock_values)
- c1 = render.add_container("test_container", "test_image")
- c1.healthcheck.disable()
- perms_container = render.deps.perms("perms_container")
- with pytest.raises(Exception):
- render.deps.elasticsearch(
- "elastic_container",
- "elastic_image",
- {
- "password": "test_password",
- "node_name": "some_test_node",
- "volume": {"type": "volume", "volume_config": {"volume_name": "test_volume", "auto_permissions": True}},
- },
- perms_container,
- )
|