deps_mariadb.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from typing import TYPE_CHECKING, TypedDict, NotRequired
  2. if TYPE_CHECKING:
  3. from render import Render
  4. from storage import IxStorage
  5. try:
  6. from .error import RenderError
  7. from .deps_perms import PermsContainer
  8. from .validations import valid_port_or_raise
  9. except ImportError:
  10. from error import RenderError
  11. from deps_perms import PermsContainer
  12. from validations import valid_port_or_raise
  13. class MariadbConfig(TypedDict):
  14. user: str
  15. password: str
  16. database: str
  17. root_password: NotRequired[str]
  18. port: NotRequired[int]
  19. auto_upgrade: NotRequired[bool]
  20. volume: "IxStorage"
  21. class MariadbContainer:
  22. def __init__(
  23. self, render_instance: "Render", name: str, image: str, config: MariadbConfig, perms_instance: PermsContainer
  24. ):
  25. self._render_instance = render_instance
  26. self._name = name
  27. self._config = config
  28. for key in ("user", "password", "database", "volume"):
  29. if key not in config:
  30. raise RenderError(f"Expected [{key}] to be set for mariadb")
  31. port = valid_port_or_raise(self.get_port())
  32. root_password = config.get("root_password") or config["password"]
  33. auto_upgrade = config.get("auto_upgrade", True)
  34. self._get_repo(image, ("mariadb"))
  35. c = self._render_instance.add_container(name, image)
  36. c.set_user(999, 999)
  37. c.healthcheck.set_test("mariadb", {"password": root_password})
  38. c.remove_devices()
  39. c.add_storage("/var/lib/mysql", config["volume"])
  40. perms_instance.add_or_skip_action(
  41. f"{self._name}_mariadb_data", config["volume"], {"uid": 999, "gid": 999, "mode": "check"}
  42. )
  43. c.environment.add_env("MARIADB_USER", config["user"])
  44. c.environment.add_env("MARIADB_PASSWORD", config["password"])
  45. c.environment.add_env("MARIADB_ROOT_PASSWORD", root_password)
  46. c.environment.add_env("MARIADB_DATABASE", config["database"])
  47. c.environment.add_env("MARIADB_AUTO_UPGRADE", str(auto_upgrade).lower())
  48. c.set_command(["--port", str(port)])
  49. # Store container for further configuration
  50. # For example: c.depends.add_dependency("other_container", "service_started")
  51. self._container = c
  52. def _get_repo(self, image, supported_repos):
  53. images = self._render_instance.values["images"]
  54. if image not in images:
  55. raise RenderError(f"Image [{image}] not found in values. Available images: [{', '.join(images.keys())}]")
  56. repo = images[image].get("repository")
  57. if not repo:
  58. raise RenderError("Could not determine repo")
  59. if repo not in supported_repos:
  60. raise RenderError(f"Unsupported repo [{repo}] for mariadb. Supported repos: {', '.join(supported_repos)}")
  61. return repo
  62. def get_port(self):
  63. return self._config.get("port") or 3306
  64. @property
  65. def container(self):
  66. return self._container