Skip to content

Commit 4b1e0fe

Browse files
committed
Include storage record testing and fix errors
1 parent eaf801a commit 4b1e0fe

File tree

4 files changed

+204
-1
lines changed

4 files changed

+204
-1
lines changed

caso/record.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ class StorageRecord(_BaseRecord):
289289
EMI StAR
290290
"""
291291

292-
version: str = "0.1"
292+
version: str = pydantic.Field("0.1", exclude=True)
293293

294294
uuid: m_uuid.UUID
295295
name: str
@@ -340,6 +340,7 @@ def map_fields(field: str) -> str:
340340
"status": "Status",
341341
"attached_to": "AttachedTo",
342342
"attached_duration": "AttachedDuration",
343+
"cloud_type": "CloudType",
343344
"compute_service": "CloudComputeService",
344345
}
345346
return d.get(field, field)

caso/tests/conftest.py

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,76 @@
236236
},
237237
]
238238

239+
valid_storage_records_fields = [
240+
dict(
241+
uuid="99cf5d02-a573-46a1-b90d-0f7327126876",
242+
site_name="TEST-Site",
243+
name="Test Volume 1",
244+
user_id="63296dcd-b652-4039-b274-aaa70f9d57e5",
245+
group_id="313c6f62-e05f-4ec7-b0f2-256612db18f5",
246+
fqan="VO 1 FQAN",
247+
compute_service="Fake Cloud Service",
248+
status="in-use",
249+
active_duration=400,
250+
measure_time=now,
251+
start_time=now - datetime.timedelta(days=5),
252+
capacity=322122547200,
253+
user_dn="[email protected]",
254+
),
255+
dict(
256+
uuid="99cf5d02-a573-46a1-b90d-0f7327126876",
257+
site_name="TEST-Site",
258+
name="Test Volume 1",
259+
user_id="63296dcd-b652-4039-b274-aaa70f9d57e5",
260+
group_id="313c6f62-e05f-4ec7-b0f2-256612db18f5",
261+
fqan="VO 2 FQAN",
262+
compute_service="Fake Cloud Service",
263+
status="in-use",
264+
active_duration=400,
265+
measure_time=now,
266+
start_time=now - datetime.timedelta(days=6),
267+
capacity=122122547200,
268+
user_dn="[email protected]",
269+
),
270+
]
271+
272+
valid_storage_records_dict = [
273+
{
274+
"SiteName": "TEST-Site",
275+
"CloudType": cloud_type,
276+
"CloudComputeService": "Fake Cloud Service",
277+
"VolumeUUID": "99cf5d02-a573-46a1-b90d-0f7327126876",
278+
"RecordName": "Test Volume 1",
279+
"LocalUser": "63296dcd-b652-4039-b274-aaa70f9d57e5",
280+
"GlobalUserName": "[email protected]",
281+
"LocalGroup": "313c6f62-e05f-4ec7-b0f2-256612db18f5",
282+
"FQAN": "VO 1 FQAN",
283+
"ActiveDuration": 400,
284+
"CreateTime": "2023-05-25T21:59:06+00:00",
285+
"StartTime": "2023-05-20T21:59:06+00:00",
286+
"Type": "Block Storage (cinder)",
287+
"Status": "in-use",
288+
"Capacity": 322122547200,
289+
},
290+
{
291+
"SiteName": "TEST-Site",
292+
"CloudType": cloud_type,
293+
"CloudComputeService": "Fake Cloud Service",
294+
"VolumeUUID": "99cf5d02-a573-46a1-b90d-0f7327126876",
295+
"RecordName": "Test Volume 2",
296+
"LocalUser": "63296dcd-b652-4039-b274-aaa70f9d57e5",
297+
"GlobalUserName": "[email protected]",
298+
"LocalGroup": "313c6f62-e05f-4ec7-b0f2-256612db18f5",
299+
"FQAN": "VO 2 FQAN",
300+
"ActiveDuration": 400,
301+
"CreateTime": "2023-05-25T21:59:06+00:00",
302+
"StartTime": "2023-05-20T21:59:06+00:00",
303+
"Type": "Block Storage (cinder)",
304+
"Status": "in-use",
305+
"Capacity": 122122547200,
306+
},
307+
]
308+
239309
# Cloud Record fixtures
240310

241311

@@ -362,6 +432,43 @@ def accelerator_record_list(
362432
return [accelerator_record, another_accelerator_record]
363433

364434

435+
# Storage records
436+
437+
438+
@pytest.fixture(scope="module")
439+
def storage_record() -> caso.record.StorageRecord:
440+
"""Get a fixture for the StorageRecord."""
441+
record = caso.record.StorageRecord(**valid_storage_records_fields[0])
442+
return record
443+
444+
445+
@pytest.fixture(scope="module")
446+
def another_storage_record() -> caso.record.StorageRecord:
447+
"""Get another fixture for the StorageRecord."""
448+
record = caso.record.StorageRecord(**valid_storage_records_fields[1])
449+
return record
450+
451+
452+
@pytest.fixture(scope="module")
453+
def valid_storage_record() -> dict:
454+
"""Get a fixture for a valid record."""
455+
return valid_storage_records_dict[0]
456+
457+
458+
@pytest.fixture(scope="module")
459+
def valid_storage_records() -> typing.List[dict]:
460+
"""Get a fixture for valid records as a dict."""
461+
return valid_storage_records_dict
462+
463+
464+
@pytest.fixture(scope="module")
465+
def storage_record_list(
466+
storage_record, another_storage_record
467+
) -> typing.List[caso.record.StorageRecord]:
468+
"""Get a fixture for a list of Storage records."""
469+
return [storage_record, another_storage_record]
470+
471+
365472
# SSM entries
366473

367474

@@ -571,3 +678,48 @@ def expected_message_accelerator() -> str:
571678
"]}"
572679
)
573680
return message
681+
682+
683+
@pytest.fixture
684+
def expected_entries_storage(storage_record_list) -> list[caso.record.StorageRecord]:
685+
"""Get a fixture for all Storage entries."""
686+
ssm_entries = storage_record_list.copy()
687+
return ssm_entries
688+
689+
690+
@pytest.fixture
691+
def expected_message_storage() -> str:
692+
"""Get a fixture for a complete Storage message."""
693+
message = (
694+
'<sr:StorageUsageRecords xmlns:sr="http://eu-emi.eu/namespaces/2011/02/storagerecord">' # noqa
695+
"<sr:StorageUsageRecord>"
696+
'<sr:RecordIdentity sr:createTime="2023-05-25T21:59:06+00:00" sr:recordId="99cf5d02-a573-46a1-b90d-0f7327126876" />' # noqa
697+
"<sr:StorageSystem>Fake Cloud Service</sr:StorageSystem>"
698+
"<sr:Site>TEST-Site</sr:Site>"
699+
"<sr:SubjectIdentity>"
700+
"<sr:LocalUser>63296dcd-b652-4039-b274-aaa70f9d57e5</sr:LocalUser>"
701+
"<sr:LocalGroup>313c6f62-e05f-4ec7-b0f2-256612db18f5</sr:LocalGroup>"
702+
"<sr:UserIdentity>[email protected]</sr:UserIdentity>"
703+
"<sr:Group>VO 1 FQAN</sr:Group>"
704+
"</sr:SubjectIdentity>"
705+
"<sr:StartTime>2023-05-20T21:59:06+00:00</sr:StartTime>"
706+
"<sr:EndTime>2023-05-25T21:59:06+00:00</sr:EndTime>"
707+
"<sr:ResourceCapacityUsed>345876451382054092800</sr:ResourceCapacityUsed>"
708+
"</sr:StorageUsageRecord>"
709+
"<sr:StorageUsageRecord>"
710+
'<sr:RecordIdentity sr:createTime="2023-05-25T21:59:06+00:00" sr:recordId="99cf5d02-a573-46a1-b90d-0f7327126876" />' # noqa
711+
"<sr:StorageSystem>Fake Cloud Service</sr:StorageSystem>"
712+
"<sr:Site>TEST-Site</sr:Site>"
713+
"<sr:SubjectIdentity>"
714+
"<sr:LocalUser>63296dcd-b652-4039-b274-aaa70f9d57e5</sr:LocalUser>"
715+
"<sr:LocalGroup>313c6f62-e05f-4ec7-b0f2-256612db18f5</sr:LocalGroup>"
716+
"<sr:UserIdentity>[email protected]</sr:UserIdentity>"
717+
"<sr:Group>VO 2 FQAN</sr:Group>"
718+
"</sr:SubjectIdentity>"
719+
"<sr:StartTime>2023-05-19T21:59:06+00:00</sr:StartTime>"
720+
"<sr:EndTime>2023-05-25T21:59:06+00:00</sr:EndTime>"
721+
"<sr:ResourceCapacityUsed>131128086582054092800</sr:ResourceCapacityUsed>"
722+
"</sr:StorageUsageRecord>"
723+
"</sr:StorageUsageRecords>"
724+
)
725+
return message.encode("utf-8")

caso/tests/test_record.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,17 @@ def test_accelerator_record_map_opts(accelerator_record, valid_accelerator_recor
119119
"exclude_none": True,
120120
}
121121
assert json.loads(accelerator_record.json(**opts)) == valid_accelerator_record
122+
123+
124+
def test_storage_record(storage_record):
125+
"""Test that an IP record is correctly generated."""
126+
assert isinstance(storage_record.active_duration, int)
127+
128+
129+
def test_storage_record_map_opts(storage_record, valid_storage_record):
130+
"""Test that an IP record is correctly generated."""
131+
opts = {
132+
"by_alias": True,
133+
"exclude_none": True,
134+
}
135+
assert json.loads(storage_record.json(**opts)) == valid_storage_record

caso/tests/test_ssm.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,23 @@ def mock_push(entries_cloud, entries_ip, entries_accelerator, entries_storage):
9393
messenger.push(accelerator_record_list)
9494

9595

96+
def test_storage_records_pushed(
97+
monkeypatch, storage_record_list, expected_entries_storage
98+
):
99+
"""Test that Storage records are correctly rendered."""
100+
101+
def mock_push(entries_cloud, entries_ip, entries_accelerator, entries_storage):
102+
assert entries_storage == expected_entries_storage
103+
104+
with monkeypatch.context() as m:
105+
m.setattr("caso.utils.makedirs", lambda x: None)
106+
m.setattr("dirq.QueueSimple.QueueSimple", lambda x: None)
107+
messenger = ssm.SSMMessenger()
108+
109+
m.setattr(messenger, "_push", mock_push)
110+
messenger.push(storage_record_list)
111+
112+
96113
def test_cloud_ip_records_pushed(
97114
monkeypatch,
98115
cloud_record_list,
@@ -173,3 +190,22 @@ def mock_add(message):
173190

174191
m.setattr(messenger.queue, "add", mock_add)
175192
messenger._push_message_accelerator(expected_entries_accelerator)
193+
194+
195+
def test_complete_storage_message(
196+
monkeypatch, expected_entries_storage, expected_message_storage
197+
):
198+
"""Test a complete cloud message."""
199+
200+
def mock_add(message):
201+
print(message)
202+
print(expected_message_storage)
203+
assert message == expected_message_storage
204+
205+
with monkeypatch.context() as m:
206+
m.setattr("caso.utils.makedirs", lambda x: None)
207+
m.setattr("dirq.QueueSimple.QueueSimple", lambda x: _MockQueue())
208+
messenger = ssm.SSMMessenger()
209+
210+
m.setattr(messenger.queue, "add", mock_add)
211+
messenger._push_message_storage(expected_entries_storage)

0 commit comments

Comments
 (0)