osism 0.20250627.0__py3-none-any.whl → 0.20250701.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.
@@ -0,0 +1,300 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ import json
4
+ from loguru import logger
5
+ from osism.tasks.conductor.utils import get_redfish_connection
6
+
7
+
8
+ def _normalize_redfish_data(data):
9
+ """
10
+ Convert Redfish data values to strings and clean up None values.
11
+
12
+ Args:
13
+ data (dict): Dictionary with Redfish resource data
14
+
15
+ Returns:
16
+ dict: Dictionary with normalized string values, None values removed
17
+ """
18
+ normalized_data = {}
19
+
20
+ for key, value in data.items():
21
+ if value is not None:
22
+ if isinstance(value, (dict, list)):
23
+ # Convert complex objects to JSON strings
24
+ normalized_data[key] = json.dumps(value)
25
+ elif isinstance(value, bool):
26
+ # Convert booleans to lowercase strings
27
+ normalized_data[key] = str(value).lower()
28
+ elif not isinstance(value, str):
29
+ # Convert numbers and other types to strings
30
+ normalized_data[key] = str(value)
31
+ else:
32
+ # Keep strings as-is
33
+ normalized_data[key] = value
34
+
35
+ return normalized_data
36
+
37
+
38
+ def get_resources(hostname, resource_type):
39
+ """
40
+ Get Redfish resources for a specific hostname and resource type.
41
+
42
+ Args:
43
+ hostname (str): The hostname of the target system
44
+ resource_type (str): The type of resource to retrieve (e.g., EthernetInterfaces)
45
+
46
+ Returns:
47
+ list: Retrieved Redfish resources or empty list if failed
48
+ """
49
+ logger.info(
50
+ f"Getting Redfish resources for hostname: {hostname}, resource_type: {resource_type}"
51
+ )
52
+
53
+ if resource_type == "EthernetInterfaces":
54
+ return _get_ethernet_interfaces(hostname)
55
+ elif resource_type == "NetworkAdapters":
56
+ return _get_network_adapters(hostname)
57
+ elif resource_type == "NetworkDeviceFunctions":
58
+ return _get_network_device_functions(hostname)
59
+
60
+ logger.warning(f"Resource type {resource_type} not supported yet")
61
+ return []
62
+
63
+
64
+ def _get_ethernet_interfaces(hostname):
65
+ """
66
+ Get all EthernetInterfaces from a Redfish-enabled system.
67
+
68
+ Args:
69
+ hostname (str): The hostname of the target system
70
+
71
+ Returns:
72
+ list: List of EthernetInterface dictionaries
73
+ """
74
+ try:
75
+ # Get Redfish connection using the utility function
76
+ redfish_conn = get_redfish_connection(hostname, ignore_ssl_errors=True)
77
+
78
+ if not redfish_conn:
79
+ logger.error(f"Could not establish Redfish connection to {hostname}")
80
+ return []
81
+
82
+ ethernet_interfaces = []
83
+
84
+ # Navigate through the Redfish service to find EthernetInterfaces
85
+ # Structure: /redfish/v1/Systems/{system_id}/EthernetInterfaces
86
+ for system in redfish_conn.get_system_collection().get_members():
87
+ logger.debug(f"Processing system: {system.identity}")
88
+
89
+ # Check if the system has EthernetInterfaces
90
+ if hasattr(system, "ethernet_interfaces") and system.ethernet_interfaces:
91
+ for interface in system.ethernet_interfaces.get_members():
92
+ try:
93
+ # Extract relevant information from each EthernetInterface
94
+ interface_data = {
95
+ "id": interface.identity,
96
+ "name": getattr(interface, "name", None),
97
+ "description": getattr(interface, "description", None),
98
+ "mac_address": getattr(interface, "mac_address", None),
99
+ "permanent_mac_address": getattr(
100
+ interface, "permanent_mac_address", None
101
+ ),
102
+ "speed_mbps": getattr(interface, "speed_mbps", None),
103
+ "mtu_size": getattr(interface, "mtu_size", None),
104
+ "link_status": getattr(interface, "link_status", None),
105
+ "interface_enabled": getattr(
106
+ interface, "interface_enabled", None
107
+ ),
108
+ }
109
+
110
+ # Normalize data values to strings and clean up None values
111
+ interface_data = _normalize_redfish_data(interface_data)
112
+
113
+ ethernet_interfaces.append(interface_data)
114
+ logger.debug(
115
+ f"Found EthernetInterface: {interface_data.get('name', interface_data.get('id'))}"
116
+ )
117
+
118
+ except Exception as exc:
119
+ logger.warning(
120
+ f"Error processing EthernetInterface {interface.identity}: {exc}"
121
+ )
122
+ continue
123
+
124
+ logger.info(
125
+ f"Retrieved {len(ethernet_interfaces)} EthernetInterfaces from {hostname}"
126
+ )
127
+ return ethernet_interfaces
128
+
129
+ except Exception as exc:
130
+ logger.error(f"Error retrieving EthernetInterfaces from {hostname}: {exc}")
131
+ return []
132
+
133
+
134
+ def _get_network_adapters(hostname):
135
+ """
136
+ Get all NetworkAdapters from a Redfish-enabled system.
137
+
138
+ Args:
139
+ hostname (str): The hostname of the target system
140
+
141
+ Returns:
142
+ list: List of NetworkAdapter dictionaries
143
+ """
144
+ try:
145
+ # Get Redfish connection using the utility function
146
+ redfish_conn = get_redfish_connection(hostname, ignore_ssl_errors=True)
147
+
148
+ if not redfish_conn:
149
+ logger.error(f"Could not establish Redfish connection to {hostname}")
150
+ return []
151
+
152
+ network_adapters = []
153
+
154
+ # Navigate through the Redfish service to find NetworkAdapters
155
+ # Structure: /redfish/v1/Chassis/{chassis_id}/NetworkAdapters
156
+ for chassis in redfish_conn.get_chassis_collection().get_members():
157
+ logger.debug(f"Processing chassis: {chassis.identity}")
158
+
159
+ # Check if the chassis has NetworkAdapters
160
+ if hasattr(chassis, "network_adapters") and chassis.network_adapters:
161
+ for adapter in chassis.network_adapters.get_members():
162
+ try:
163
+ # Extract relevant information from each NetworkAdapter
164
+ adapter_data = {
165
+ "id": adapter.identity,
166
+ "name": getattr(adapter, "name", None),
167
+ "description": getattr(adapter, "description", None),
168
+ "manufacturer": getattr(adapter, "manufacturer", None),
169
+ "model": getattr(adapter, "model", None),
170
+ "part_number": getattr(adapter, "part_number", None),
171
+ "serial_number": getattr(adapter, "serial_number", None),
172
+ "firmware_version": getattr(
173
+ adapter, "firmware_version", None
174
+ ),
175
+ }
176
+
177
+ # Normalize data values to strings and clean up None values
178
+ adapter_data = _normalize_redfish_data(adapter_data)
179
+
180
+ network_adapters.append(adapter_data)
181
+ logger.debug(
182
+ f"Found NetworkAdapter: {adapter_data.get('name', adapter_data.get('id'))}"
183
+ )
184
+
185
+ except Exception as exc:
186
+ logger.warning(
187
+ f"Error processing NetworkAdapter {adapter.identity}: {exc}"
188
+ )
189
+ continue
190
+
191
+ logger.info(
192
+ f"Retrieved {len(network_adapters)} NetworkAdapters from {hostname}"
193
+ )
194
+ return network_adapters
195
+
196
+ except Exception as exc:
197
+ logger.error(f"Error retrieving NetworkAdapters from {hostname}: {exc}")
198
+ return []
199
+
200
+
201
+ def _get_network_device_functions(hostname):
202
+ """
203
+ Get all NetworkDeviceFunctions from a Redfish-enabled system.
204
+
205
+ Args:
206
+ hostname (str): The hostname of the target system
207
+
208
+ Returns:
209
+ list: List of NetworkDeviceFunction dictionaries with MAC addresses
210
+ """
211
+ try:
212
+ # Get Redfish connection using the utility function
213
+ redfish_conn = get_redfish_connection(hostname, ignore_ssl_errors=True)
214
+
215
+ if not redfish_conn:
216
+ logger.error(f"Could not establish Redfish connection to {hostname}")
217
+ return []
218
+
219
+ network_device_functions = []
220
+
221
+ # Navigate through the Redfish service to find NetworkDeviceFunctions
222
+ # Structure: /redfish/v1/Chassis/{chassis_id}/NetworkAdapters/{adapter_id}/NetworkDeviceFunctions
223
+ for chassis in redfish_conn.get_chassis_collection().get_members():
224
+ logger.debug(f"Processing chassis: {chassis.identity}")
225
+
226
+ # Check if the chassis has NetworkAdapters
227
+ if hasattr(chassis, "network_adapters") and chassis.network_adapters:
228
+ for adapter in chassis.network_adapters.get_members():
229
+ logger.debug(f"Processing NetworkAdapter: {adapter.identity}")
230
+
231
+ try:
232
+ for (
233
+ device_func
234
+ ) in adapter.network_device_functions.get_members():
235
+ try:
236
+ # Extract MAC address from Ethernet configuration
237
+ mac_address = None
238
+ permanent_mac_address = None
239
+
240
+ # Try to get MAC from ethernet configuration
241
+ if (
242
+ hasattr(device_func, "ethernet")
243
+ and device_func.ethernet
244
+ ):
245
+ ethernet_config = device_func.ethernet
246
+ mac_address = getattr(
247
+ ethernet_config, "mac_address", None
248
+ )
249
+ permanent_mac_address = getattr(
250
+ ethernet_config, "permanent_mac_address", None
251
+ )
252
+
253
+ # Extract relevant information from each NetworkDeviceFunction
254
+ device_func_data = {
255
+ "id": device_func.identity,
256
+ "name": getattr(device_func, "name", None),
257
+ "description": getattr(
258
+ device_func, "description", None
259
+ ),
260
+ "device_enabled": getattr(
261
+ device_func, "device_enabled", None
262
+ ),
263
+ "ethernet_enabled": getattr(
264
+ device_func, "ethernet_enabled", None
265
+ ),
266
+ "mac_address": mac_address,
267
+ "permanent_mac_address": permanent_mac_address,
268
+ "adapter_id": adapter.identity,
269
+ "adapter_name": getattr(adapter, "name", None),
270
+ }
271
+
272
+ # Normalize data values to strings and clean up None values
273
+ device_func_data = _normalize_redfish_data(
274
+ device_func_data
275
+ )
276
+
277
+ network_device_functions.append(device_func_data)
278
+ logger.debug(
279
+ f"Found NetworkDeviceFunction: {device_func_data.get('name', device_func_data.get('id'))}"
280
+ )
281
+
282
+ except Exception as exc:
283
+ logger.warning(
284
+ f"Error processing NetworkDeviceFunction {device_func.identity}: {exc}"
285
+ )
286
+ continue
287
+ except Exception as exc:
288
+ logger.warning(
289
+ f"Error processing NetworkAdapter {adapter.identity}: {exc}"
290
+ )
291
+ continue
292
+
293
+ logger.info(
294
+ f"Retrieved {len(network_device_functions)} NetworkDeviceFunctions from {hostname}"
295
+ )
296
+ return network_device_functions
297
+
298
+ except Exception as exc:
299
+ logger.error(f"Error retrieving NetworkDeviceFunctions from {hostname}: {exc}")
300
+ return []
@@ -5,6 +5,8 @@ from ansible.parsing.vault import VaultLib, VaultSecret
5
5
  from loguru import logger
6
6
 
7
7
  from osism import utils
8
+ import sushy
9
+ import urllib3
8
10
 
9
11
 
10
12
  def deep_compare(a, b, updates):
@@ -77,3 +79,149 @@ def get_vault():
77
79
  logger.error("Unable to get vault secret. Dropping encrypted entries")
78
80
  vault = VaultLib()
79
81
  return vault
82
+
83
+
84
+ def get_redfish_connection(
85
+ hostname, username=None, password=None, ignore_ssl_errors=True, timeout=None
86
+ ):
87
+ """Create a Redfish connection to the specified hostname."""
88
+ from osism import settings
89
+ from osism.tasks import openstack
90
+
91
+ if not hostname:
92
+ return None
93
+
94
+ # Use configurable timeout if not provided
95
+ if timeout is None:
96
+ timeout = settings.REDFISH_TIMEOUT
97
+
98
+ # Get Redfish address from Ironic driver_info
99
+ base_url = f"https://{hostname}"
100
+ device = None
101
+
102
+ # Try to find NetBox device first for conductor configuration fallback
103
+ if utils.nb:
104
+ try:
105
+ # First try to find device by name
106
+ device = utils.nb.dcim.devices.get(name=hostname)
107
+
108
+ # If not found by name, try by inventory_hostname custom field
109
+ if not device:
110
+ devices = utils.nb.dcim.devices.filter(cf_inventory_hostname=hostname)
111
+ if devices:
112
+ device = devices[0]
113
+ except Exception as exc:
114
+ logger.warning(f"Could not resolve hostname {hostname} via NetBox: {exc}")
115
+
116
+ try:
117
+ ironic_node = openstack.baremetal_node_show(hostname, ignore_missing=True)
118
+ if ironic_node and "driver_info" in ironic_node:
119
+ driver_info = ironic_node["driver_info"]
120
+ # Use redfish_address from driver_info if available (contains full URL)
121
+ if "redfish_address" in driver_info:
122
+ base_url = driver_info["redfish_address"]
123
+ logger.info(f"Using Ironic redfish_address {base_url} for {hostname}")
124
+ else:
125
+ # Fallback to conductor configuration if Ironic driver_info not available
126
+ conductor_address = _get_conductor_redfish_address(device)
127
+ if conductor_address:
128
+ base_url = conductor_address
129
+ logger.info(
130
+ f"Using conductor redfish_address {base_url} for {hostname}"
131
+ )
132
+ except Exception as exc:
133
+ logger.warning(f"Could not get Ironic node for {hostname}: {exc}")
134
+ # Fallback to conductor configuration on Ironic error
135
+ conductor_address = _get_conductor_redfish_address(device)
136
+ if conductor_address:
137
+ base_url = conductor_address
138
+ logger.info(f"Using conductor redfish_address {base_url} for {hostname}")
139
+
140
+ # Get credentials from conductor configuration if not provided
141
+ if not username or not password:
142
+ conductor_username, conductor_password = _get_conductor_redfish_credentials(
143
+ device
144
+ )
145
+ if not username:
146
+ username = conductor_username
147
+ if not password:
148
+ password = conductor_password
149
+
150
+ auth = sushy.auth.SessionOrBasicAuth(username=username, password=password)
151
+
152
+ try:
153
+ if ignore_ssl_errors:
154
+ urllib3.disable_warnings()
155
+ conn = sushy.Sushy(base_url, auth=auth, verify=False)
156
+ else:
157
+ conn = sushy.Sushy(base_url, auth=auth)
158
+
159
+ return conn
160
+ except Exception as exc:
161
+ logger.error(
162
+ f"Unable to connect to Redfish API at {base_url} with timeout {timeout}s: {exc}"
163
+ )
164
+ return None
165
+
166
+
167
+ def _get_conductor_redfish_credentials(device):
168
+ """Get Redfish credentials from conductor configuration and device secrets."""
169
+ from osism.tasks.conductor.config import get_configuration
170
+ from osism.tasks.conductor.ironic import _prepare_node_attributes
171
+
172
+ try:
173
+ if not device:
174
+ return None, None
175
+
176
+ # Use _prepare_node_attributes to get processed node attributes
177
+ def get_ironic_parameters():
178
+ configuration = get_configuration()
179
+ return configuration.get("ironic_parameters", {})
180
+
181
+ node_attributes = _prepare_node_attributes(device, get_ironic_parameters)
182
+
183
+ # Extract Redfish credentials if available
184
+ if (
185
+ "driver_info" in node_attributes
186
+ and node_attributes.get("driver") == "redfish"
187
+ ):
188
+ driver_info = node_attributes["driver_info"]
189
+ username = driver_info.get("redfish_username")
190
+ password = driver_info.get("redfish_password")
191
+ return username, password
192
+
193
+ except Exception as exc:
194
+ logger.warning(f"Could not get conductor Redfish credentials: {exc}")
195
+
196
+ return None, None
197
+
198
+
199
+ def _get_conductor_redfish_address(device):
200
+ """Get Redfish address from conductor configuration and device OOB IP."""
201
+ from osism.tasks.conductor.config import get_configuration
202
+ from osism.tasks.conductor.ironic import _prepare_node_attributes
203
+
204
+ try:
205
+ if not device:
206
+ return None
207
+
208
+ # Use _prepare_node_attributes to get processed node attributes
209
+ def get_ironic_parameters():
210
+ configuration = get_configuration()
211
+ return configuration.get("ironic_parameters", {})
212
+
213
+ node_attributes = _prepare_node_attributes(device, get_ironic_parameters)
214
+
215
+ # Extract Redfish address if available
216
+ if (
217
+ "driver_info" in node_attributes
218
+ and node_attributes.get("driver") == "redfish"
219
+ ):
220
+ driver_info = node_attributes["driver_info"]
221
+ address = driver_info.get("redfish_address")
222
+ return address
223
+
224
+ except Exception as exc:
225
+ logger.warning(f"Could not get conductor Redfish address: {exc}")
226
+
227
+ return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20250627.0
3
+ Version: 0.20250701.0
4
4
  Summary: OSISM manager interface
5
5
  Home-page: https://github.com/osism/python-osism
6
6
  Author: OSISM GmbH
@@ -53,7 +53,8 @@ Requires-Dist: sqlmodel==0.0.24
53
53
  Requires-Dist: sushy==5.6.0
54
54
  Requires-Dist: tabulate==0.9.0
55
55
  Requires-Dist: transitions==0.9.2
56
- Requires-Dist: uvicorn[standard]==0.34.3
56
+ Requires-Dist: uvicorn[standard]==0.35.0
57
+ Requires-Dist: validators==0.35.0
57
58
  Requires-Dist: watchdog==6.0.0
58
59
  Provides-Extra: ansible
59
60
  Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
@@ -1,12 +1,11 @@
1
1
  osism/__init__.py,sha256=1UiNTBus0V0f2AbZQzAtVtu6zkfCCrw0OTq--NwFAqY,341
2
2
  osism/__main__.py,sha256=ILe4gu61xEISiBsxanqTQIdSkV-YhpZXTRlguCYyssk,141
3
- osism/api.py,sha256=cvFLczibM6Hrc3KWDNN4daUauyLF7zpuU1jll-5ywPI,5585
3
+ osism/api.py,sha256=3kEfPJtPwuWD8luDNnEFRx3nEsUY5AeWnmjd4A5ii-A,11079
4
4
  osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
5
- osism/settings.py,sha256=bebPBT6Hd1-KhJfwZdFR-s8eMwV4B1IFr-WrQBkOrWw,1786
6
- osism/actions/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
5
+ osism/settings.py,sha256=IUbUo8kru8TeiMAnnil5oHwd8SqbkPCY401dVONMygo,1885
7
6
  osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
8
- osism/commands/apply.py,sha256=q645f4qxmOAaUjVD7npzM2aNuOqfptVAkCLfE6x5IV8,16833
9
- osism/commands/baremetal.py,sha256=w1LyZDms-DtULsF_76JsauOYHc2tcvoMRP6F9dYby9E,10688
7
+ osism/commands/apply.py,sha256=GWUccZAXlgkPYqylrCmdWcj8FCkDsPEipIIG937MeII,16833
8
+ osism/commands/baremetal.py,sha256=yxCb0UwBfERinoGvlD9bvsGPEdDcHhq48Mn6u5b2aM8,12037
10
9
  osism/commands/compose.py,sha256=iqzG7mS9E1VWaLNN6yQowjOqiHn3BMdj-yfXb3Dc4Ok,1200
11
10
  osism/commands/compute.py,sha256=cgqXWJa5wAvn-7e3FWCgX6hie_aK0yrKRkcNzjLXwDY,25799
12
11
  osism/commands/configuration.py,sha256=sPe8b0dVKFRbr30xoeVdAnHbGwCwgUh0xa_Vzv5pSQQ,954
@@ -18,22 +17,21 @@ osism/commands/manage.py,sha256=uzfmt3R0PJ4HxUw_V945pN0FbKb3zhyiBuD9br1ORYE,2314
18
17
  osism/commands/netbox.py,sha256=e65P0kWrjTLw2T9HZthxjDTIRa-KAHgSSJAlvVef7n4,7345
19
18
  osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
20
19
  osism/commands/reconciler.py,sha256=ubQfX8j13s3NuMKnT0Lt6O-szf7Z1V02AfsMQFHmO74,2209
20
+ osism/commands/redfish.py,sha256=oBfxd5UBX4ED8XulEuIYziIYQqTvUKpKfcdGyg_AoiI,8431
21
21
  osism/commands/server.py,sha256=avmoOv5rjOi-fN2A-27cPwOtiy2Q2j6UFtCh3QrfWAI,7512
22
22
  osism/commands/service.py,sha256=A1lgAlGeCJpbFFqF55DRWPcCirIgpU0dzjzVLZ0mz3k,2649
23
23
  osism/commands/set.py,sha256=xLBi2DzbVQo2jb3-cOIE9In5UB3vFxquQJkDN-EsfhM,1425
24
24
  osism/commands/status.py,sha256=X-Rcj-XuNPDBoxsGkf96NswwpmTognxz1V6E2NX2ZgY,1997
25
25
  osism/commands/sync.py,sha256=jOg-g8NmVOkXBI6rOuiOx2WgUJc1PplLAAAwc0VuIfw,1919
26
26
  osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
27
- osism/commands/validate.py,sha256=E1n1kEo6h8J5c7Ns5OHpr0R7i4IU6uj08LE_gt3kBCg,3262
27
+ osism/commands/validate.py,sha256=ifdkelYptCXp18KX076Rb-CqluUN20bunG9ZeLs4AV8,3262
28
28
  osism/commands/vault.py,sha256=llaqNN8UH8t8cCu2KmdaURvprA4zeG6izCen_W7ulPs,2029
29
29
  osism/commands/volume.py,sha256=l6oAk__dFM8KKdLTWOvuSiI7tLh9wAPZp8hwmYF-NX0,6595
30
30
  osism/commands/wait.py,sha256=2Ncx63M0AFq4fq40VZVClf1LS-WHetD8iC_mG2dY_Cw,5275
31
31
  osism/commands/worker.py,sha256=iraCOEhCp7WgfjfZ0-12XQYQPUjpi9rSJK5Z9JfNJk4,1651
32
- osism/core/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
33
- osism/core/enums.py,sha256=gItIjOK6xWuOZSkMxpMdYLRyt4ezyhzkqA7BGiah2o0,10030
34
- osism/core/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
35
32
  osism/data/__init__.py,sha256=izXdh0J3vPLQI7kBhJI7ibJQzPqU_nlONP0L4Cf_k6A,1504
36
- osism/plugins/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
33
+ osism/data/enums.py,sha256=gItIjOK6xWuOZSkMxpMdYLRyt4ezyhzkqA7BGiah2o0,10030
34
+ osism/data/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
37
35
  osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
38
36
  osism/services/listener.py,sha256=Vf8LOZkHzlspm40BZ1az3o1O_ar34_i6C83p-D8KzzM,9783
39
37
  osism/tasks/__init__.py,sha256=kocG0q2bARhkkSjMBH2xWdFUIJodesdh5qVsV_DqZmE,7148
@@ -45,11 +43,12 @@ osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
45
43
  osism/tasks/netbox.py,sha256=g0gL5QImiRTHqixRxze7LfNqPth7cXqLzVWQDUJLDjE,5928
46
44
  osism/tasks/openstack.py,sha256=g15tCll5vP1pC6ysxRCTZxplsdGmXbxaCH3k1Qdv5Xg,6367
47
45
  osism/tasks/reconciler.py,sha256=phbSV6urILqq9mHGMYDFwSfx8bLZmldwgEi8sMWs8RA,2040
48
- osism/tasks/conductor/__init__.py,sha256=eBkisjRj0YRT0AArvuvpIHGNEqEijsNvR_55BuVX62I,1600
49
- osism/tasks/conductor/config.py,sha256=tvfuYNgvw0F_ZbvrjqnyHfrj3vF6z0zhsRtGNu-Lgvo,3410
50
- osism/tasks/conductor/ironic.py,sha256=VT8JyYNh4IDWJ8QTIo46IokILKpGhINfLHjQvwz4FSU,16337
46
+ osism/tasks/conductor/__init__.py,sha256=HW8CXpZOQ6aNgLZ3Ck08YcfQfueoA0ce35Kolh0rWww,1903
47
+ osism/tasks/conductor/config.py,sha256=tMI0dtEFSWxfueRZdvocpbEq0sIN_PnXG08CuATkPz4,4489
48
+ osism/tasks/conductor/ironic.py,sha256=Gx9LuWNMIMae4a3cVFKsTR4Hm_sr4jLf-JO9QBPSYcg,15402
51
49
  osism/tasks/conductor/netbox.py,sha256=5Nc7wrriDOtSuru1KDLt9QpA54vC7tXDPB2J0JP9GKo,11393
52
- osism/tasks/conductor/utils.py,sha256=-a0-pRuhV4Fjj0SgdgBqtRJtAdGdqck5pzfi6NYBApU,2338
50
+ osism/tasks/conductor/redfish.py,sha256=hOOS-_l3Qmo_6vLsgjZmJwTxLTf029hhFRVkU0TMLL0,12723
51
+ osism/tasks/conductor/utils.py,sha256=ZSbQumQr-uL-B9XOwbsscLIX7czJHu6Mq0t_poRpMsw,7769
53
52
  osism/tasks/conductor/sonic/__init__.py,sha256=oxTTl_MGK4iWK9uNDRNlULtGrDGCQHrlJZ04weh_Lh8,777
54
53
  osism/tasks/conductor/sonic/bgp.py,sha256=PC6gGI5bCj2PCXcNGyMV9-EdlJWDsYaodzxigmYSZvw,3088
55
54
  osism/tasks/conductor/sonic/cache.py,sha256=Asv2k3nLJejuq7iB0a_LyK8dEmJzypP9v3OHkNY3GwI,3438
@@ -61,11 +60,11 @@ osism/tasks/conductor/sonic/exporter.py,sha256=25L1vbi84ZQD0xNHNTWk-anTz5QRkGJsk
61
60
  osism/tasks/conductor/sonic/interface.py,sha256=318wOwXYSSMKTPP2WSZIps-JvIkCQ2gYdQs9ZYHXwwg,38957
62
61
  osism/tasks/conductor/sonic/sync.py,sha256=fpgsQVwq6Hb7eeDHhLkAqx5BkaK3Ce_m_WvmWEsJyOo,9182
63
62
  osism/utils/__init__.py,sha256=gN5VtLJfrvyn6_snuTte7YR-vDygkpbORopIV8qSEsA,6064
64
- osism-0.20250627.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
65
- osism-0.20250627.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
66
- osism-0.20250627.0.dist-info/METADATA,sha256=z9qQh_i8ZIPgWTACdHuDa5mZKbmi9vWrTPQ5xUivpUI,2904
67
- osism-0.20250627.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
- osism-0.20250627.0.dist-info/entry_points.txt,sha256=eRq0DXdl4z2DdmPta6dqpzMe1M0DaUCNw9i4Jgdfhf0,3426
69
- osism-0.20250627.0.dist-info/pbr.json,sha256=rZRiHfI7rgnmVfh2COv00pQVKhMCCu6cw0bifLp9cVw,47
70
- osism-0.20250627.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
71
- osism-0.20250627.0.dist-info/RECORD,,
63
+ osism-0.20250701.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
64
+ osism-0.20250701.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
65
+ osism-0.20250701.0.dist-info/METADATA,sha256=3Wd0oo4ezSU0A8zyKit87P9kOS1UANr07qNf_H5Y_QI,2938
66
+ osism-0.20250701.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
67
+ osism-0.20250701.0.dist-info/entry_points.txt,sha256=xpOV8qyAEuJ6-jrVDnVUUcTCyfBQQ_EOoj5ImcynClM,3476
68
+ osism-0.20250701.0.dist-info/pbr.json,sha256=oc9bmpZsjLQNk1EI_gOw4MlbegkQGf47icU8U5FB0iY,47
69
+ osism-0.20250701.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
70
+ osism-0.20250701.0.dist-info/RECORD,,
@@ -43,6 +43,7 @@ manage image clusterapi = osism.commands.manage:ImageClusterapi
43
43
  manage image octavia = osism.commands.manage:ImageOctavia
44
44
  manage images = osism.commands.manage:Images
45
45
  manage netbox = osism.commands.netbox:Manage
46
+ manage redfish list = osism.commands.redfish:List
46
47
  manage server list = osism.commands.server:ServerList
47
48
  manage server migrate = osism.commands.server:ServerMigrate
48
49
  manage sonic = osism.commands.manage:Sonic
@@ -0,0 +1 @@
1
+ {"git_version": "87129c8", "is_release": false}
osism/actions/__init__.py DELETED
@@ -1 +0,0 @@
1
- # SPDX-License-Identifier: Apache-2.0
osism/core/__init__.py DELETED
@@ -1 +0,0 @@
1
- # SPDX-License-Identifier: Apache-2.0
osism/plugins/__init__.py DELETED
@@ -1 +0,0 @@
1
- # SPDX-License-Identifier: Apache-2.0
@@ -1 +0,0 @@
1
- {"git_version": "e1bd41d", "is_release": false}
File without changes
File without changes