redfish-python-sdk 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- redfish_python_sdk-1.0.0.dist-info/METADATA +164 -0
- redfish_python_sdk-1.0.0.dist-info/RECORD +56 -0
- redfish_python_sdk-1.0.0.dist-info/WHEEL +5 -0
- redfish_python_sdk-1.0.0.dist-info/licenses/LICENSE +29 -0
- redfish_python_sdk-1.0.0.dist-info/top_level.txt +1 -0
- redfish_sdk/__init__.py +63 -0
- redfish_sdk/client.py +1894 -0
- redfish_sdk/exceptions.py +56 -0
- redfish_sdk/http_client.py +452 -0
- redfish_sdk/managers/__init__.py +21 -0
- redfish_sdk/managers/_log_helpers.py +144 -0
- redfish_sdk/managers/account.py +96 -0
- redfish_sdk/managers/chassis.py +327 -0
- redfish_sdk/managers/event.py +264 -0
- redfish_sdk/managers/managers.py +120 -0
- redfish_sdk/managers/registries.py +48 -0
- redfish_sdk/managers/session.py +130 -0
- redfish_sdk/managers/systems.py +630 -0
- redfish_sdk/managers/task.py +89 -0
- redfish_sdk/managers/update.py +99 -0
- redfish_sdk/managers/update_strategies/__init__.py +51 -0
- redfish_sdk/managers/update_strategies/base.py +101 -0
- redfish_sdk/managers/update_strategies/h3c.py +140 -0
- redfish_sdk/managers/update_strategies/inspur.py +89 -0
- redfish_sdk/managers/update_strategies/lenovo.py +59 -0
- redfish_sdk/managers/update_strategies/nettrix.py +56 -0
- redfish_sdk/managers/update_strategies/registry.py +72 -0
- redfish_sdk/managers/update_strategies/vendor_detect.py +111 -0
- redfish_sdk/managers/update_strategies/xfusion.py +60 -0
- redfish_sdk/managers/update_strategies/zte.py +68 -0
- redfish_sdk/models/__init__.py +55 -0
- redfish_sdk/models/account.py +60 -0
- redfish_sdk/models/chassis.py +86 -0
- redfish_sdk/models/check.py +231 -0
- redfish_sdk/models/common.py +102 -0
- redfish_sdk/models/drive.py +53 -0
- redfish_sdk/models/event.py +64 -0
- redfish_sdk/models/fru.py +59 -0
- redfish_sdk/models/gpu.py +33 -0
- redfish_sdk/models/logs.py +56 -0
- redfish_sdk/models/managers.py +153 -0
- redfish_sdk/models/memory.py +50 -0
- redfish_sdk/models/network_adapter.py +76 -0
- redfish_sdk/models/oem.py +173 -0
- redfish_sdk/models/pcie_device.py +89 -0
- redfish_sdk/models/power.py +92 -0
- redfish_sdk/models/processor.py +50 -0
- redfish_sdk/models/registry.py +34 -0
- redfish_sdk/models/resource_key.py +70 -0
- redfish_sdk/models/root.py +50 -0
- redfish_sdk/models/session.py +42 -0
- redfish_sdk/models/storage.py +77 -0
- redfish_sdk/models/systems.py +194 -0
- redfish_sdk/models/task.py +54 -0
- redfish_sdk/models/thermal.py +111 -0
- redfish_sdk/models/update.py +55 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Managers manager — manages BMC (Baseboard Management Controller) resources.
|
|
3
|
+
|
|
4
|
+
Provides access to:
|
|
5
|
+
- Manager info (BMC firmware version, model, etc.)
|
|
6
|
+
- Log services and log entries
|
|
7
|
+
- Network protocol configuration
|
|
8
|
+
- Ethernet interfaces
|
|
9
|
+
- Host interfaces
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import logging
|
|
15
|
+
from typing import TYPE_CHECKING, List, Optional
|
|
16
|
+
|
|
17
|
+
from ..models.logs import Log, LogEntry
|
|
18
|
+
from ..models.managers import EthernetInterface, HostInterface, Manager, NetworkProtocol
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from ..client import RedfishClient
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ManagersManager:
|
|
27
|
+
"""
|
|
28
|
+
Manages Redfish Manager resources (BMC).
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, client: RedfishClient):
|
|
34
|
+
self._client = client
|
|
35
|
+
self._http = client._http_client
|
|
36
|
+
|
|
37
|
+
def get(self, manager_id: str = "1") -> Manager:
|
|
38
|
+
"""
|
|
39
|
+
Get a manager (BMC) resource by ID.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
manager_id: Manager ID (default "1")
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
Manager resource
|
|
48
|
+
"""
|
|
49
|
+
managers_odata_id = self._client._get_managers_collection_odata_id()
|
|
50
|
+
return self._http.get(
|
|
51
|
+
f"{managers_odata_id}/{manager_id}", Manager
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def log_services(self, manager_id: str = "1") -> List[Log]:
|
|
55
|
+
"""
|
|
56
|
+
Get the list of log services for a manager (BMC).
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
"""
|
|
60
|
+
from ._log_helpers import require_log_services_link
|
|
61
|
+
|
|
62
|
+
manager = self.get(manager_id)
|
|
63
|
+
odata_id = require_log_services_link(manager, f"Manager {manager.id!r}")
|
|
64
|
+
return self._client._get_collection(odata_id, Log)
|
|
65
|
+
|
|
66
|
+
def log_entries(
|
|
67
|
+
self,
|
|
68
|
+
log_id: Optional[str] = None,
|
|
69
|
+
manager_id: str = "1",
|
|
70
|
+
) -> List[LogEntry]:
|
|
71
|
+
"""
|
|
72
|
+
Get log entries for a manager (BMC) log service.
|
|
73
|
+
|
|
74
|
+
Dynamic Entries link discovery + per-entry GET fallback;
|
|
75
|
+
``log_id`` is optional. See
|
|
76
|
+
:meth:`SystemsManager.log_entries` for the full behaviour contract.
|
|
77
|
+
"""
|
|
78
|
+
from ._log_helpers import (
|
|
79
|
+
fetch_log_entries,
|
|
80
|
+
require_log_services_link,
|
|
81
|
+
resolve_log_service,
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
manager = self.get(manager_id)
|
|
85
|
+
odata_id = require_log_services_link(manager, f"Manager {manager.id!r}")
|
|
86
|
+
log = resolve_log_service(self._client, odata_id, log_id)
|
|
87
|
+
return fetch_log_entries(self._client, log)
|
|
88
|
+
|
|
89
|
+
def network_protocol(self, manager_id: str = "1") -> NetworkProtocol:
|
|
90
|
+
"""
|
|
91
|
+
Get network protocol configuration for a manager.
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
manager = self.get(manager_id)
|
|
96
|
+
return self._http.get(
|
|
97
|
+
f"{manager.odata_id}/NetworkProtocol", NetworkProtocol
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
def ethernet_interfaces(self, manager_id: str = "1") -> List[EthernetInterface]:
|
|
101
|
+
"""
|
|
102
|
+
Get the list of Ethernet interfaces for a manager (BMC).
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
manager = self.get(manager_id)
|
|
107
|
+
return self._client._get_collection(
|
|
108
|
+
manager.ethernet_interfaces.odata_id, EthernetInterface
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
def host_interfaces(self, manager_id: str = "1") -> List[HostInterface]:
|
|
112
|
+
"""
|
|
113
|
+
Get the list of host interfaces for a manager.
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
"""
|
|
117
|
+
manager = self.get(manager_id)
|
|
118
|
+
return self._client._get_collection(
|
|
119
|
+
manager.host_interfaces.odata_id, HostInterface
|
|
120
|
+
)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Registries manager — manages Redfish message registries.
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import TYPE_CHECKING, List
|
|
9
|
+
|
|
10
|
+
from ..models.registry import Registry
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from ..client import RedfishClient
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class RegistriesManager:
|
|
19
|
+
"""
|
|
20
|
+
Manages Redfish message registries.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, client: RedfishClient):
|
|
26
|
+
self._client = client
|
|
27
|
+
self._http = client._http_client
|
|
28
|
+
|
|
29
|
+
def registries(self) -> List[Registry]:
|
|
30
|
+
"""
|
|
31
|
+
Get the list of message registries.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
return self._client._get_registries_collection()
|
|
36
|
+
|
|
37
|
+
def get(self, registry_id: str) -> Registry:
|
|
38
|
+
"""
|
|
39
|
+
Get a specific message registry by ID.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
registry_id: Registry ID (e.g., "Base.1.15.0")
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Registry resource
|
|
46
|
+
"""
|
|
47
|
+
registries_odata_id = self._client._get_registries_collection_odata_id()
|
|
48
|
+
return self._http.get(f"{registries_odata_id}/{registry_id}", Registry)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Session service manager — manages active BMC sessions.
|
|
3
|
+
|
|
4
|
+
Provides:
|
|
5
|
+
- List sessions
|
|
6
|
+
- Get session
|
|
7
|
+
- Create session (login)
|
|
8
|
+
- Delete session (logout)
|
|
9
|
+
|
|
10
|
+
Session creation returns an X-Auth-Token in the response header.
|
|
11
|
+
The SDK can optionally switch to token-based auth after login.
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import logging
|
|
17
|
+
from typing import TYPE_CHECKING, List
|
|
18
|
+
|
|
19
|
+
from ..models.session import Session
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING:
|
|
22
|
+
from ..client import RedfishClient
|
|
23
|
+
|
|
24
|
+
logger = logging.getLogger(__name__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SessionServiceManager:
|
|
28
|
+
"""
|
|
29
|
+
Manages Redfish Session resources.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def __init__(self, client: RedfishClient):
|
|
35
|
+
self._client = client
|
|
36
|
+
self._http = client._http_client
|
|
37
|
+
|
|
38
|
+
def sessions(self) -> List[Session]:
|
|
39
|
+
"""
|
|
40
|
+
Get the list of active sessions.
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
"""
|
|
44
|
+
session_service = self._client._get_session_service()
|
|
45
|
+
return self._client._get_collection(session_service.sessions.odata_id, Session)
|
|
46
|
+
|
|
47
|
+
def get(self, session_id: str) -> Session:
|
|
48
|
+
"""
|
|
49
|
+
Get a specific session by ID.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
session_service = self._client._get_session_service()
|
|
54
|
+
path = f"{session_service.sessions.odata_id}/{session_id}"
|
|
55
|
+
return self._http.get(path, Session)
|
|
56
|
+
|
|
57
|
+
def create(
|
|
58
|
+
self,
|
|
59
|
+
username: str,
|
|
60
|
+
password: str,
|
|
61
|
+
switch_to_token_auth: bool = False,
|
|
62
|
+
) -> Session:
|
|
63
|
+
"""
|
|
64
|
+
Create a new session (login to the BMC).
|
|
65
|
+
|
|
66
|
+
The Redfish spec requires posting to the Sessions collection directly
|
|
67
|
+
(not via SessionService), which may be at /redfish/v1/SessionService/Sessions
|
|
68
|
+
or /redfish/v1/Sessions.
|
|
69
|
+
|
|
70
|
+
After creation, the X-Auth-Token is returned in the response header.
|
|
71
|
+
If switch_to_token_auth=True, the SDK client will use this token
|
|
72
|
+
for subsequent requests instead of Basic Auth.
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
Args:
|
|
77
|
+
username: BMC username
|
|
78
|
+
password: BMC password
|
|
79
|
+
switch_to_token_auth: If True, switch client to token-based auth
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Session resource with x_auth_token populated
|
|
83
|
+
"""
|
|
84
|
+
# Use the Sessions link from the root service links (direct sessions endpoint)
|
|
85
|
+
root = self._client._get_root()
|
|
86
|
+
sessions_url = None
|
|
87
|
+
|
|
88
|
+
if root.links and root.links.sessions:
|
|
89
|
+
sessions_url = root.links.sessions.odata_id
|
|
90
|
+
else:
|
|
91
|
+
# Fallback to session service
|
|
92
|
+
session_service = self._client._get_session_service()
|
|
93
|
+
sessions_url = session_service.sessions.odata_id
|
|
94
|
+
|
|
95
|
+
body = {"UserName": username, "Password": password}
|
|
96
|
+
|
|
97
|
+
response = self._http.post_raw(sessions_url, body=body)
|
|
98
|
+
|
|
99
|
+
# Parse the session from response body
|
|
100
|
+
session_data = response.json()
|
|
101
|
+
session = Session.model_validate(session_data)
|
|
102
|
+
|
|
103
|
+
# Extract X-Auth-Token from response headers
|
|
104
|
+
token = response.headers.get("X-Auth-Token") or response.headers.get("x-auth-token")
|
|
105
|
+
if token:
|
|
106
|
+
session.x_auth_token = token
|
|
107
|
+
logger.info("Session created successfully, token acquired")
|
|
108
|
+
|
|
109
|
+
if switch_to_token_auth:
|
|
110
|
+
self._http.set_auth_token(token)
|
|
111
|
+
|
|
112
|
+
return session
|
|
113
|
+
|
|
114
|
+
def delete(self, session_id: str) -> str:
|
|
115
|
+
"""
|
|
116
|
+
Delete a session (logout).
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
session_id: Session ID to delete
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
Response body (usually empty)
|
|
125
|
+
"""
|
|
126
|
+
session_service = self._client._get_session_service()
|
|
127
|
+
path = f"{session_service.sessions.odata_id}/{session_id}"
|
|
128
|
+
result = self._http.delete(path)
|
|
129
|
+
logger.info("Session %s deleted", session_id)
|
|
130
|
+
return result
|