1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
#!/bin/sh
[ "$1" = "python3-rtslib-fb" ] || exit 0
python3 - << EOF
import sys
# Verify key classes and exceptions are importable
from rtslib_fb import (
RTSLibError,
RTSLibNotInCFSError,
FabricModule,
RTSRoot,
Target,
TPG,
LUN,
NetworkPortal,
NodeACL,
BlockStorageObject,
FileIOStorageObject,
RDMCPStorageObject,
)
# Test pure utility functions (no kernel/configfs required)
from rtslib_fb.utils import colonize, generate_wwn, normalize_wwn
# colonize: inserts colons every 2 hex characters
assert colonize("aabbccdd") == "aa:bb:cc:dd", f"Unexpected: {colonize('aabbccdd')}"
assert colonize("112233445566") == "11:22:33:44:55:66"
assert colonize("ab") == "ab"
# generate_wwn: returns correctly formatted WWNs
import re
iqn = generate_wwn("iqn")
assert iqn.startswith("iqn."), f"IQN should start with 'iqn.': {iqn}"
assert re.match(r"iqn\.\d{4}-\d{2}\.", iqn), f"IQN format invalid: {iqn}"
naa = generate_wwn("naa")
assert naa.startswith("naa."), f"NAA should start with 'naa.': {naa}"
serial = generate_wwn("unit_serial")
assert re.match(r"[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$", serial), \
f"unit_serial format invalid: {serial}"
# normalize_wwn: accepts various representations and normalizes them
wwn, wwn_type = normalize_wwn(["naa"], "naa.5000c50012345678")
assert wwn_type == "naa", f"Expected naa, got {wwn_type}"
assert wwn == "naa.5000c50012345678", f"Unexpected: {wwn}"
# NAA without prefix gets one added
wwn2, _ = normalize_wwn(["naa"], "5000c50012345678")
assert wwn2 == "naa.5000c50012345678", f"Unexpected: {wwn2}"
# RTSLibError is a proper exception
try:
raise RTSLibError("test error")
except RTSLibError as e:
assert str(e) == "test error"
# RTSLibNotInCFSError is a subclass of RTSLibError
assert issubclass(RTSLibNotInCFSError, RTSLibError)
sys.exit(0)
EOF
|