Skip to content

Commit 6fae849

Browse files
committed
🚧 Remove use of static DATA_DIR
Signed-off-by: Muhammed Hussain Karimi <[email protected]>
1 parent 20b1330 commit 6fae849

File tree

10 files changed

+74
-36
lines changed

10 files changed

+74
-36
lines changed

rawfile/consts.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
PROVISIONER_VERSION = os.getenv("PROVISIONER_VERSION") or importlib.metadata.version(
66
"rawfile"
77
)
8-
DATA_DIR = "/data"
98
D_PERMS = 0o700
109
F_PERMS = 0o600
1110
OWNER_UMASK = 0o077
@@ -15,4 +14,3 @@
1514
CSI_K8S_PVC_NAME_KEY = "csi.storage.k8s.io/pvc/name"
1615
GA_ID = "Ry1UWkdQNDY2MThX"
1716
GA_KEY = "OTFKR2RUZzlRd0duN1ktdnZ1TTR6QQ=="
18-
COW_SUPPORTED: bool | None = None

rawfile/internal_svc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ def ExpandRawFile(
5757
is_attached=volume_manager.is_attached(request.volume_id),
5858
status=internal_pb2.ExpandRawFileStatus.OK,
5959
)
60-
61-
if get_capacity() < size_inc:
60+
meta = metadata(request.volume_id)
61+
if get_capacity(meta["storage_pool"]) < request.new_size:
6262
return internal_pb2.ExpandRawFileResponse(
6363
is_attached=volume_manager.is_attached(request.volume_id),
6464
status=internal_pb2.ExpandRawFileStatus.RESOURCE_EXHAUSTED,

rawfile/metrics.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
from prometheus_client.metrics_core import GaugeMetricFamily
44
from utils.storage_pool import get_capacity
55
from utils.volume_manager import manager as volume_manager
6+
from config import config
7+
8+
9+
def get_remaining_capacity():
10+
val = 0
11+
for pool in config.csi_driver.storage_pools.values():
12+
val += get_capacity(pool.path.as_posix())
13+
return val
614

715

816
class VolumeStatsCollector(object):
@@ -28,7 +36,7 @@ def collect(self):
2836
labels=["node", "volume"],
2937
unit="bytes",
3038
)
31-
remaining_capacity.add_metric([self.node], get_capacity())
39+
remaining_capacity.add_metric([self.node], get_remaining_capacity())
3240
for volume_id, stats in volume_manager.get_all_volumes_stats().items():
3341
volume_used.add_metric([self.node, volume_id], stats["used"])
3442
volume_total.add_metric([self.node, volume_id], stats["total"])

rawfile/rawfile.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from internal import internal_pb2_grpc
1313
from metrics import expose_metrics
1414
from utils import task_manager
15-
from utils.rawfile import is_cow_supported
1615
from utils.logs import init as init_logging, logger
1716
from internal_svc import InternalServicer, SignatureInterceptor
1817
import consts
@@ -39,17 +38,16 @@ def node_driver_preflight_checks(task_manager: task_manager.TaskManager):
3938
raise RuntimeError("CSI Driver configuration is missing")
4039
if not config.csi_driver.metadata_dir:
4140
raise RuntimeError("Metadata directory is not set for node plugin")
42-
data_dir = Path(consts.DATA_DIR)
43-
dirs = (
41+
dirs = [
4442
config.csi_driver.metadata_dir,
45-
data_dir,
46-
)
43+
]
44+
dirs.extend([pool.path for pool in config.csi_driver.storage_pools.values()])
4745
for dir in dirs:
4846
__create_and_check_directory(dir)
4947
volume_manager.migrate_metadata_dir()
5048
volume_manager.migrate_all_volume_schemas()
5149
task_manager.migrate_tasks_file_path()
52-
consts.COW_SUPPORTED = is_cow_supported(data_dir)
50+
# consts.COW_SUPPORTED = is_cow_supported(data_dir)
5351

5452

5553
def csi_driver(driver_config: CSIDriverCmd):

rawfile/rawfile_servicer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,7 @@ def CreateVolume(self, request: csi_pb2.CreateVolumeRequest, context):
192192
if copy_on_write_param is not None:
193193
copy_on_write = str_to_bool(copy_on_write_param)
194194
freezefs = str_to_bool(params.get("freezefs", "no"))
195+
storage_pool = params.get("storagepool", config.csi_driver.default_pool)
195196
source_type = None
196197
source_id = None
197198
node_name = None
@@ -240,6 +241,7 @@ def CreateVolume(self, request: csi_pb2.CreateVolumeRequest, context):
240241
TaskName.CREATE_VOLUME,
241242
request.name,
242243
size,
244+
storage_pool,
243245
thin_provision,
244246
freezefs,
245247
copy_on_write,

rawfile/utils/rawfile.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,14 @@ def img_file(volume_id):
5151
def snapshots_dir(volume_id: str, temporary: bool = False):
5252
from utils.volume_manager import manager as volume_manager
5353

54+
meta = metadata(volume_id)
5455
if temporary:
55-
return Path(f"{volume_manager._get_volume_path(volume_id)}/snapshots/temp")
56-
return Path(f"{volume_manager._get_volume_path(volume_id)}/snapshots")
56+
return Path(
57+
f"{volume_manager._get_volume_path(meta['storage_pool'], volume_id)}/snapshots/temp"
58+
)
59+
return Path(
60+
f"{volume_manager._get_volume_path(meta['storage_pool'], volume_id)}/snapshots"
61+
)
5762

5863

5964
def img_size(volume_id) -> int:
@@ -94,7 +99,8 @@ def update_permissions(volume_id: str) -> None:
9499
from utils.volume_manager import manager as volume_manager
95100
from itertools import chain
96101

97-
_img_dir = volume_manager._get_volume_path(volume_id)
102+
meta = metadata(volume_id)
103+
_img_dir = volume_manager._get_volume_path(meta["storage_pool"], volume_id)
98104
if not _img_dir.exists():
99105
return
100106
_img_dir.chmod(D_PERMS)

rawfile/utils/snapshot_manager.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
from pathlib import Path
33
import time
44
from dataclasses import dataclass
5-
import consts
65
from utils.commands import run
7-
6+
from config import config
87
from utils.errors import FsFreezeNotSupportedOnBlockVolumes, SnapshotCreateVolumeInUse
98
from utils.lock import VolLock
109
from utils.rawfile import (
@@ -139,10 +138,21 @@ def list_snapshots(
139138
) -> SnapshotList:
140139
"""List available snapshots"""
141140
subdir = "snapshots/temp" if temporary else "snapshots"
142-
pattern = f"{consts.DATA_DIR}/{volume_id if volume_id else '**'}/{subdir}/{snapshot_name if snapshot_name else '*'}.img"
143-
141+
patterns = []
142+
if volume_id:
143+
patterns = [
144+
f"{metadata(volume_id)['storage_pool']}/{volume_id if volume_id else '**'}/{subdir}/{snapshot_name if snapshot_name else '*'}.img"
145+
]
146+
else:
147+
for pool in config.csi_driver.storage_pools.values():
148+
patterns.append(
149+
f"{pool.path}/**/{subdir}/{snapshot_name if snapshot_name else '*'}.img"
150+
)
144151
snapshots = []
145-
snapshot_files = sorted(glob(pattern, recursive=True))
152+
snapshot_files = []
153+
for pattern in patterns:
154+
snapshot_files.extend(sorted(glob(pattern, recursive=True)))
155+
146156
count = 0
147157
idx = 0
148158
for idx, snap_filename in enumerate(snapshot_files):

rawfile/utils/storage_pool.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from utils.devices import path_stats
22
from utils.volume_manager import manager as volume_manager
33
from config import config
4-
from consts import DATA_DIR
54

65

7-
def get_capacity():
8-
disk_free_size = path_stats(DATA_DIR, config.capacity_override)["fs_avail"]
6+
def get_capacity(storage_pool: str | None = None):
7+
if not storage_pool:
8+
storage_pool = config.csi_driver.default_pool
9+
pool = config.csi_driver.storage_pools[storage_pool]
10+
disk_free_size = path_stats(pool.path, pool.capacity_override)["fs_avail"]
911
capacity = disk_free_size
1012
for volume_stat in volume_manager.get_all_volumes_stats().values():
1113
capacity -= volume_stat["total"] - volume_stat["used"]
12-
if isinstance(config.reserved_capacity, str):
13-
capacity -= capacity * int(config.reserved_capacity[:-1]) / 100
14+
if isinstance(pool.reserved_capacity, str):
15+
capacity -= capacity * int(pool.reserved_capacity[:-1]) / 100
1416
else:
15-
capacity -= config.reserved_capacity.to("B")
17+
capacity -= pool.reserved_capacity.to("B")
1618
return max(capacity, 0)

rawfile/utils/task_manager.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import shutil
44
from typing import Callable, TypedDict
55
import time
6-
import consts
6+
from config import config
77
from utils.snapshot_manager import manager as snapshot_manager
88
from utils.volume_manager import manager as volume_manager
99
from pathlib import Path
@@ -203,7 +203,9 @@ def shutdown(self, timeout: int):
203203
self._executor.shutdown(wait=False, cancel_futures=True)
204204

205205
def migrate_tasks_file_path(self):
206-
src = Path(f"{consts.DATA_DIR}/tasks.json")
206+
src = Path(
207+
f"{config.csi_driver.storage_pools[config.csi_driver.default_pool].path}/tasks.json"
208+
)
207209
dst = self._tasks_store_path
208210
if src.exists():
209211
shutil.move(src, dst)

rawfile/utils/volume_manager.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,15 @@ class VolumeStats(TypedDict):
3939

4040

4141
class VolumeManager:
42-
def _get_volume_path(self, volume_id: str) -> Path:
43-
return Path(f"{consts.DATA_DIR}/{volume_id}")
42+
def _get_volume_path(self, storage_pool: str, volume_id: str) -> Path:
43+
return Path(f"{config.csi_driver.storage_pools[storage_pool].path}/{volume_id}")
4444

4545
def create_volume(
4646
self,
4747
volume_id: str,
4848
size: int,
4949
thin_provision: bool,
50+
storage_pool: str,
5051
freezefs: bool | None = None,
5152
copy_on_write: bool | None = None,
5253
source_type: VolumeSource | None = None,
@@ -56,11 +57,16 @@ def create_volume(
5657
raise SourceTypeRequired(source_id)
5758
snapshot_name = None
5859
source_volume_id = None
59-
img_data_dir = self._get_volume_path(volume_id)
60+
img_data_dir = self._get_volume_path(storage_pool, volume_id)
6061
img_data_dir.mkdir(mode=consts.D_PERMS, exist_ok=True)
6162
meta_dir(volume_id).mkdir(exist_ok=True, parents=True)
6263
patch_metadata(
63-
volume_id, {"ready": False, "schema_version": LATEST_SCHEMA_VERSION}
64+
volume_id,
65+
{
66+
"schema_version": LATEST_SCHEMA_VERSION,
67+
"storage_pool": storage_pool,
68+
"ready": False,
69+
},
6470
)
6571
try:
6672
if source_type == VolumeSource.snapshot:
@@ -185,7 +191,7 @@ def rmdir(path: Path):
185191
for file in meta_dir(volume_id).glob("*"):
186192
file.unlink(missing_ok=True)
187193
rmdir(meta_dir(volume_id))
188-
rmdir(self._get_volume_path(volume_id))
194+
rmdir(self._get_volume_path(meta["storage_pool"], volume_id))
189195

190196
def gc_if_needed(self, volume_id, dry_run=True):
191197
with VolLock(volume_id):
@@ -201,7 +207,8 @@ def gc_if_needed(self, volume_id, dry_run=True):
201207
return False
202208

203209
def delete_volume(self, volume_id):
204-
img_data_dir = self._get_volume_path(volume_id)
210+
meta = metadata_or(volume_id)
211+
img_data_dir = self._get_volume_path(meta["storage_pool"], volume_id)
205212
if not img_data_dir.exists():
206213
return 0
207214
vol_img_file = img_file(volume_id)
@@ -259,14 +266,18 @@ def migrate_metadata(self, volume_id, target_version):
259266
return update_metadata(volume_id, new_data)
260267

261268
def migrate_metadata_dir(self):
262-
for old_meta in glob(f"{consts.DATA_DIR}/**/disk.meta"):
269+
for old_meta in glob(
270+
f"{config.csi_driver.storage_pools[config.csi_driver.default_pool].path}/**/disk.meta"
271+
):
263272
volume_id = basename(dirname(old_meta))
264273
for f in (
265274
"disk.meta",
266275
"disk.meta.tmp",
267276
"disk.lock",
268277
):
269-
src = Path(f"{consts.DATA_DIR}/{volume_id}/{f}")
278+
src = Path(
279+
f"{config.csi_driver.storage_pools[config.csi_driver.default_pool].path}/{volume_id}/{f}"
280+
)
270281
if src.exists():
271282
dst = meta_dir(volume_id) / f
272283
dst.parent.mkdir(parents=True, exist_ok=True)
@@ -278,7 +289,8 @@ def migrate_all_volume_schemas(self):
278289
self.migrate_metadata(volume_id, target_version)
279290

280291
def is_attached(self, volume_id):
281-
vol_img_dir = self._get_volume_path(volume_id)
292+
meta = metadata_or(volume_id)
293+
vol_img_dir = self._get_volume_path(meta["storage_pool"], volume_id)
282294
if not vol_img_dir.exists():
283295
return False
284296

0 commit comments

Comments
 (0)