volume_mount.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from typing import TYPE_CHECKING
  2. if TYPE_CHECKING:
  3. from render import Render
  4. from storage import IxStorage
  5. try:
  6. from .error import RenderError
  7. from .formatter import merge_dicts_no_overwrite
  8. from .volume_mount_types import BindMountType, VolumeMountType
  9. from .volume_sources import HostPathSource, IxVolumeSource, CifsSource, NfsSource, VolumeSource
  10. except ImportError:
  11. from error import RenderError
  12. from formatter import merge_dicts_no_overwrite
  13. from volume_mount_types import BindMountType, VolumeMountType
  14. from volume_sources import HostPathSource, IxVolumeSource, CifsSource, NfsSource, VolumeSource
  15. class VolumeMount:
  16. def __init__(self, render_instance: "Render", mount_path: str, config: "IxStorage"):
  17. self._render_instance = render_instance
  18. self.mount_path: str = mount_path
  19. storage_type: str = config.get("type", "")
  20. if not storage_type:
  21. raise RenderError("Expected [type] to be set for volume mounts.")
  22. match storage_type:
  23. case "host_path":
  24. spec_type = "bind"
  25. mount_config = config.get("host_path_config")
  26. if mount_config is None:
  27. raise RenderError("Expected [host_path_config] to be set for [host_path] type.")
  28. mount_type_specific_definition = BindMountType(self._render_instance, mount_config).render()
  29. source = HostPathSource(self._render_instance, mount_config).get()
  30. case "ix_volume":
  31. spec_type = "bind"
  32. mount_config = config.get("ix_volume_config")
  33. if mount_config is None:
  34. raise RenderError("Expected [ix_volume_config] to be set for [ix_volume] type.")
  35. mount_type_specific_definition = BindMountType(self._render_instance, mount_config).render()
  36. source = IxVolumeSource(self._render_instance, mount_config).get()
  37. case "nfs":
  38. spec_type = "volume"
  39. mount_config = config.get("nfs_config")
  40. if mount_config is None:
  41. raise RenderError("Expected [nfs_config] to be set for [nfs] type.")
  42. mount_type_specific_definition = VolumeMountType(self._render_instance, mount_config).render()
  43. source = NfsSource(self._render_instance, mount_config).get()
  44. case "cifs":
  45. spec_type = "volume"
  46. mount_config = config.get("cifs_config")
  47. if mount_config is None:
  48. raise RenderError("Expected [cifs_config] to be set for [cifs] type.")
  49. mount_type_specific_definition = VolumeMountType(self._render_instance, mount_config).render()
  50. source = CifsSource(self._render_instance, mount_config).get()
  51. case "volume":
  52. spec_type = "volume"
  53. mount_config = config.get("volume_config")
  54. if mount_config is None:
  55. raise RenderError("Expected [volume_config] to be set for [volume] type.")
  56. mount_type_specific_definition = VolumeMountType(self._render_instance, mount_config).render()
  57. source = VolumeSource(self._render_instance, mount_config).get()
  58. case "temporary":
  59. spec_type = "volume"
  60. mount_config = config.get("volume_config")
  61. if mount_config is None:
  62. raise RenderError("Expected [volume_config] to be set for [temporary] type.")
  63. mount_type_specific_definition = VolumeMountType(self._render_instance, mount_config).render()
  64. source = VolumeSource(self._render_instance, mount_config).get()
  65. case "anonymous":
  66. spec_type = "volume"
  67. mount_config = config.get("volume_config") or {}
  68. mount_type_specific_definition = VolumeMountType(self._render_instance, mount_config).render()
  69. source = None
  70. case _:
  71. raise RenderError(f"Storage type [{storage_type}] is not supported for volume mounts.")
  72. common_spec = {"type": spec_type, "target": self.mount_path, "read_only": config.get("read_only", False)}
  73. if source is not None:
  74. common_spec["source"] = source
  75. self._render_instance.volumes.add_volume(source, storage_type, mount_config) # type: ignore
  76. self.volume_mount_spec = merge_dicts_no_overwrite(common_spec, mount_type_specific_definition)
  77. def render(self) -> dict:
  78. return self.volume_mount_spec