Skip to content

Commit faa853e

Browse files
committed
Make the tests work (hopefully)
1 parent e3fa316 commit faa853e

35 files changed

+413
-380
lines changed

sarc/cli/acquire/storages.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,31 @@ def execute(self) -> int:
2222
print(f"Acquiring {cluster_name} storages report...")
2323

2424
cluster = cfg.clusters[cluster_name]
25-
diskusage = cluster.diskusage
26-
if diskusage is None:
25+
diskusage_configs = cluster.diskusage
26+
if diskusage_configs is None:
2727
continue
2828

29-
try:
30-
scraper = get_diskusage_scraper(diskusage.name)
31-
except KeyError as ke:
32-
logger.exception(
33-
"Invalid or absent diskusage scraper name: %s",
34-
diskusage.name,
35-
exc_info=ke,
36-
)
37-
continue
38-
39-
disk_config = scraper.validate_config(diskusage.params)
40-
data = scraper.get_diskusage_report(cluster.ssh, disk_config)
41-
du = scraper.parse_diskusage_report(config, data)
42-
43-
if not self.dry:
44-
collection = get_diskusage_collection()
45-
collection.add(du)
46-
else:
47-
print("Document:")
48-
print(du.model_dump_json(indent=2))
29+
# Process each diskusage configuration
30+
for diskusage_config in diskusage_configs:
31+
try:
32+
scraper = get_diskusage_scraper(diskusage_config.name)
33+
except KeyError as ke:
34+
logger.exception(
35+
"Invalid or absent diskusage scraper name: %s",
36+
diskusage_config.name,
37+
exc_info=ke,
38+
)
39+
continue
40+
41+
disk_config = scraper.validate_config(diskusage_config.params)
42+
data = scraper.get_diskusage_report(cluster.ssh, disk_config)
43+
du = scraper.parse_diskusage_report(disk_config, cluster_name, data)
44+
45+
if not self.dry:
46+
collection = get_diskusage_collection()
47+
collection.add(du)
48+
else:
49+
print("Document:")
50+
print(du.model_dump_json(indent=2))
4951

5052
return 0

sarc/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class ConfigurationError(Exception):
4242
@dataclass
4343
class DiskUsageConfig:
4444
name: str
45-
params: JSON = {}
45+
params: JSON = field(default_factory=dict)
4646

4747

4848
@dataclass

sarc/storage/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
from . import beegfs
1+
from . import beegfs, drac

sarc/storage/beegfs.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import json
66
from dataclasses import dataclass
7-
from datetime import datetime
7+
from datetime import UTC, datetime
88
from typing import cast
99

1010
from fabric import Connection
@@ -76,7 +76,7 @@ def parse_diskusage_report(
7676
return DiskUsage(
7777
cluster_name=cluster_name,
7878
groups=groups,
79-
timestamp=datetime.now(),
79+
timestamp=datetime.now(UTC),
8080
)
8181

8282

sarc/storage/diskusage.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from datetime import UTC, date, datetime
44
from typing import Any
55

6+
from pydantic import field_validator
67
from pydantic_mongo import AbstractRepository, PydanticObjectId
78

89
from sarc.config import config
@@ -17,6 +18,19 @@ class DiskUsageDB(DiskUsage):
1718
# Database ID
1819
id: PydanticObjectId | None = None
1920

21+
@field_validator("timestamp", mode="before")
22+
@classmethod
23+
def _ensure_timestamp_utc(cls, value: str | datetime) -> datetime:
24+
"""Ensure timestamp has UTC timezone when reading from database."""
25+
if isinstance(value, str):
26+
return datetime.fromisoformat(value).replace(tzinfo=UTC)
27+
elif isinstance(value, datetime):
28+
if value.tzinfo is None:
29+
# Convert naive datetime to UTC (from database storage)
30+
return value.replace(tzinfo=UTC)
31+
return value
32+
return value
33+
2034

2135
class ClusterDiskUsageRepository(AbstractRepository[DiskUsageDB]):
2236
class Meta:
@@ -31,6 +45,7 @@ def add(self, disk_usage: DiskUsage):
3145
year=disk_usage.timestamp.year,
3246
month=disk_usage.timestamp.month,
3347
day=disk_usage.timestamp.day,
48+
tzinfo=UTC,
3449
)
3550
disk_usage.timestamp = day_at_midnight
3651
document = self.to_document(DiskUsageDB(**disk_usage.model_dump()))

sarc/storage/drac.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ def _parse_body(L_lines: list[str]) -> list[DiskUsageGroup]:
129129
m = re.match(r"^\s*([\w\.]+)\s+(\d+)\s+([\d\.]+)\s(\w+)\s*", line)
130130
assert m, f"If this line doesn't match, we've got a problem.\n{line}"
131131
username = m.group(1)
132+
133+
# Skip the "Total" line as it's a summary, not a user
134+
if username == "Total":
135+
continue
136+
132137
nbr_files = int(m.group(2))
133138
size = f"{m.group(3)} {m.group(4)}"
134139
LD_results.append(
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"default": ["user1,1500000082,51046633472,107374182400,201276,1000000", "user2,1500000082,51046633472,107374182400,201276,1000000", "user3,1500000082,51046633472,107374182400,201276,1000000"]}

tests/functional/diskusage/mila_reports/report_multiple_user.txt renamed to tests/functional/diskusage/mila_reports/report_user2.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,4 @@
22
Quota information for storage pool Default (ID: 1):
33

44
name,id,size,hard,files,hard
5-
user1,1500000082,51046633472,107374182400,201276,1000000
65
user2,1500000082,51046633472,107374182400,201276,1000000
7-
user3,1500000082,51046633472,107374182400,201276,1000000
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
Quota information for storage pool Default (ID: 1):
3+
4+
name,id,size,hard,files,hard
5+
user3,1500000082,51046633472,107374182400,201276,1000000

0 commit comments

Comments
 (0)