volume_sources.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from typing import TYPE_CHECKING
  2. if TYPE_CHECKING:
  3. from render import Render
  4. from storage import IxStorageHostPathConfig, IxStorageIxVolumeConfig, IxStorageVolumeConfig
  5. try:
  6. from .error import RenderError
  7. from .formatter import get_hashed_name_for_volume
  8. from .validations import valid_fs_path_or_raise, allowed_fs_host_path_or_raise
  9. except ImportError:
  10. from error import RenderError
  11. from formatter import get_hashed_name_for_volume
  12. from validations import valid_fs_path_or_raise, allowed_fs_host_path_or_raise
  13. class HostPathSource:
  14. def __init__(self, render_instance: "Render", config: "IxStorageHostPathConfig"):
  15. self._render_instance = render_instance
  16. self.source: str = ""
  17. if not config:
  18. raise RenderError("Expected [host_path_config] to be set for [host_path] type.")
  19. path = ""
  20. if config.get("acl_enable", False):
  21. acl_path = config.get("acl", {}).get("path")
  22. if not acl_path:
  23. raise RenderError("Expected [host_path_config.acl.path] to be set for [host_path] type.")
  24. path = valid_fs_path_or_raise(acl_path)
  25. else:
  26. path = valid_fs_path_or_raise(config.get("path", ""))
  27. path = path.rstrip("/")
  28. self.source = allowed_fs_host_path_or_raise(path)
  29. def get(self):
  30. return self.source
  31. class IxVolumeSource:
  32. def __init__(self, render_instance: "Render", config: "IxStorageIxVolumeConfig"):
  33. self._render_instance = render_instance
  34. self.source: str = ""
  35. if not config:
  36. raise RenderError("Expected [ix_volume_config] to be set for [ix_volume] type.")
  37. dataset_name = config.get("dataset_name")
  38. if not dataset_name:
  39. raise RenderError("Expected [ix_volume_config.dataset_name] to be set for [ix_volume] type.")
  40. ix_volumes = self._render_instance.values.get("ix_volumes", {})
  41. if dataset_name not in ix_volumes:
  42. available = ", ".join(ix_volumes.keys())
  43. raise RenderError(
  44. f"Expected the key [{dataset_name}] to be set in [ix_volumes] for [ix_volume] type. "
  45. f"Available keys: [{available}]."
  46. )
  47. path = valid_fs_path_or_raise(ix_volumes[dataset_name].rstrip("/"))
  48. self.source = allowed_fs_host_path_or_raise(path, True)
  49. def get(self):
  50. return self.source
  51. class CifsSource:
  52. def __init__(self, render_instance: "Render", config: dict):
  53. self._render_instance = render_instance
  54. self.source: str = ""
  55. if not config:
  56. raise RenderError("Expected [cifs_config] to be set for [cifs] type.")
  57. self.source = get_hashed_name_for_volume("cifs", config)
  58. def get(self):
  59. return self.source
  60. class NfsSource:
  61. def __init__(self, render_instance: "Render", config: dict):
  62. self._render_instance = render_instance
  63. self.source: str = ""
  64. if not config:
  65. raise RenderError("Expected [nfs_config] to be set for [nfs] type.")
  66. self.source = get_hashed_name_for_volume("nfs", config)
  67. def get(self):
  68. return self.source
  69. class VolumeSource:
  70. def __init__(self, render_instance: "Render", config: "IxStorageVolumeConfig"):
  71. self._render_instance = render_instance
  72. self.source: str = ""
  73. if not config:
  74. raise RenderError("Expected [volume_config] to be set for [volume] type.")
  75. volume_name: str = config.get("volume_name", "")
  76. if not volume_name:
  77. raise RenderError("Expected [volume_config.volume_name] to be set for [volume] type.")
  78. self.source = volume_name
  79. def get(self):
  80. return self.source