Merge branch 'enya-ac868cc4-kind-mount-propagation-fix' into fix/kind-mount-propagation
commit
c64820ad5c
|
|
@ -45,3 +45,4 @@ runtime_class_key = "runtime-class"
|
|||
high_memlock_runtime = "high-memlock"
|
||||
high_memlock_spec_filename = "high-memlock-spec.json"
|
||||
acme_email_key = "acme-email"
|
||||
kind_mount_root_key = "kind-mount-root"
|
||||
|
|
|
|||
|
|
@ -371,7 +371,11 @@ class ClusterInfo:
|
|||
|
||||
if self.spec.is_kind_deployment():
|
||||
host_path = client.V1HostPathVolumeSource(
|
||||
path=get_kind_pv_bind_mount_path(volume_name)
|
||||
path=get_kind_pv_bind_mount_path(
|
||||
volume_name,
|
||||
kind_mount_root=self.spec.get_kind_mount_root(),
|
||||
host_path=volume_path,
|
||||
)
|
||||
)
|
||||
else:
|
||||
host_path = client.V1HostPathVolumeSource(path=volume_path)
|
||||
|
|
|
|||
|
|
@ -456,7 +456,14 @@ def named_volumes_from_pod_files(parsed_pod_files):
|
|||
return named_volumes
|
||||
|
||||
|
||||
def get_kind_pv_bind_mount_path(volume_name: str):
|
||||
def get_kind_pv_bind_mount_path(
|
||||
volume_name: str,
|
||||
kind_mount_root: Optional[str] = None,
|
||||
host_path: Optional[str] = None,
|
||||
):
|
||||
if kind_mount_root and host_path and host_path.startswith(kind_mount_root):
|
||||
rel = os.path.relpath(host_path, kind_mount_root)
|
||||
return f"/mnt/{rel}"
|
||||
return f"/mnt/{volume_name}"
|
||||
|
||||
|
||||
|
|
@ -579,6 +586,7 @@ def _generate_kind_mounts(parsed_pod_files, deployment_dir, deployment_context):
|
|||
volume_definitions = []
|
||||
volume_host_path_map = _get_host_paths_for_volumes(deployment_context)
|
||||
seen_host_path_mounts = set() # Track to avoid duplicate mounts
|
||||
kind_mount_root = deployment_context.spec.get_kind_mount_root()
|
||||
|
||||
# Cluster state backup for offline data recovery (unique per deployment)
|
||||
# etcd contains all k8s state; PKI certs needed to decrypt etcd offline
|
||||
|
|
@ -603,6 +611,18 @@ def _generate_kind_mounts(parsed_pod_files, deployment_dir, deployment_context):
|
|||
f" propagation: HostToContainer\n"
|
||||
)
|
||||
|
||||
# When kind-mount-root is set, emit a single extraMount for the root.
|
||||
# Individual volumes whose host path starts with the root are covered
|
||||
# by this single mount and don't need their own extraMount entries.
|
||||
mount_root_emitted = False
|
||||
if kind_mount_root:
|
||||
volume_definitions.append(
|
||||
f" - hostPath: {kind_mount_root}\n"
|
||||
f" containerPath: /mnt\n"
|
||||
f" propagation: HostToContainer\n"
|
||||
)
|
||||
mount_root_emitted = True
|
||||
|
||||
# Note these paths are relative to the location of the pod files (at present)
|
||||
# So we need to fix up to make them correct and absolute because kind assumes
|
||||
# relative to the cwd.
|
||||
|
|
@ -663,6 +683,11 @@ def _generate_kind_mounts(parsed_pod_files, deployment_dir, deployment_context):
|
|||
volume_host_path_map[volume_name],
|
||||
deployment_dir,
|
||||
)
|
||||
# Skip if covered by mount root
|
||||
if mount_root_emitted and str(host_path).startswith(
|
||||
kind_mount_root
|
||||
):
|
||||
continue
|
||||
container_path = get_kind_pv_bind_mount_path(
|
||||
volume_name
|
||||
)
|
||||
|
|
|
|||
|
|
@ -223,5 +223,8 @@ class Spec:
|
|||
def is_kind_deployment(self):
|
||||
return self.get_deployment_type() in [constants.k8s_kind_deploy_type]
|
||||
|
||||
def get_kind_mount_root(self):
|
||||
return self.obj.get(constants.kind_mount_root_key)
|
||||
|
||||
def is_docker_deployment(self):
|
||||
return self.get_deployment_type() in [constants.compose_deploy_type]
|
||||
|
|
|
|||
Loading…
Reference in New Issue