tdl-xoa-driver 1.6.3__py3-none-any.whl → 1.7.1__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.
@@ -15,8 +15,8 @@ from typing import (
15
15
  from xoa_driver import enums, ports
16
16
  from xoa_driver.utils import apply
17
17
  if TYPE_CHECKING:
18
- from xoa_driver.ports import GenericL23Port, Z800FreyaPort, Z1600EdunPort, GenericAnyPort
19
- from xoa_driver.modules import GenericAnyModule, GenericL23Module, ModuleChimera, Z800FreyaModule, Z1600EdunModule
18
+ from xoa_driver.ports import GenericL23Port, Z800FreyaPort, Z1600EdunPort, GenericAnyPort, E100ChimeraPort
19
+ from xoa_driver.modules import GenericAnyModule, GenericL23Module, Z800FreyaModule, Z1600EdunModule, E100ChimeraModule
20
20
  from xoa_driver.testers import L23Tester
21
21
  FreyaEdunModule = Union[Z800FreyaModule, Z1600EdunModule]
22
22
  FreyaEdunPort = Union[Z800FreyaPort, Z1600EdunPort]
@@ -94,7 +94,7 @@ async def get_chassis_sys_uptime(tester: L23Tester) -> int:
94
94
  # region Modules
95
95
 
96
96
 
97
- def obtain_modules_by_ids(tester: L23Tester, module_ids: List[str]) -> Tuple[GenericAnyModule, ...]:
97
+ async def obtain_modules_by_ids(tester: L23Tester, module_ids: List[str], reserve: bool = False) -> Tuple[GenericL23Module | E100ChimeraModule, ...]:
98
98
  """
99
99
  Get the module objects of the tester specified by module index ids
100
100
 
@@ -107,25 +107,76 @@ def obtain_modules_by_ids(tester: L23Tester, module_ids: List[str]) -> Tuple[Gen
107
107
  If the list is empty, return all modules of the tester
108
108
 
109
109
  :type module_ids: List[str]
110
+ :param reserve: should reserve the modules, defaults to False
111
+ :type reserve: bool, optional
110
112
  :raises NoSuchModuleError: No such a module index on the tester
111
113
  :return: module objects
112
- :rtype: List[:class:`~xoa_driver.modules.GenericAnyModule`]
114
+ :rtype: List[:class:`~xoa_driver.modules.GenericL23Module` | :class:`~xoa_driver.modules.E100ChimeraModule`]
113
115
  """
114
116
 
115
- if len(module_ids) == 0:
116
- return tuple(tester.modules)
117
- elif "*" in module_ids:
117
+ if len(module_ids) == 0 or "*" in module_ids:
118
+ module_list = [m for m in tuple(tester.modules)]
119
+ if reserve:
120
+ await reserve_modules(modules=module_list, force=reserve)
118
121
  return tuple(tester.modules)
119
122
  else:
123
+ module_list = [tester.modules.obtain(int(module_id)) for module_id in module_ids]
124
+ if reserve:
125
+ await reserve_modules(modules=module_list, force=reserve)
120
126
  return tuple(tester.modules.obtain(int(module_id)) for module_id in module_ids)
127
+
128
+
129
+ async def obtain_module_by_id(tester: L23Tester, module_id: str, reserve: bool = False) -> Union[GenericL23Module, E100ChimeraModule]:
130
+ """
131
+ Get the module object of the tester specified by module index id
132
+
133
+ :param tester: The tester object
134
+ :type tester: :class:`~xoa_driver.testers.L23Tester`
135
+ :param module_id: the index id of the module.
136
+
137
+ :type module_id: str
138
+ :param reserve: should reserve the module, defaults to False
139
+ :type reserve: bool, optional
140
+ :raises NoSuchModuleError: No such a module index on the tester
141
+ :return: module object
142
+ :rtype: Union[:class:`~xoa_driver.modules.GenericL23Module`, :class:`~xoa_driver.modules.E100ChimeraModule`]
143
+ """
144
+ if reserve:
145
+ await reserve_modules([tester.modules.obtain(int(module_id))], force=reserve)
146
+ return tester.modules.obtain(int(module_id))
147
+
148
+
149
+ async def obtain_module_by_port_id(tester: L23Tester, port_id: str, separator: str = "/", reserve: bool = False) -> Union[GenericL23Module, E100ChimeraModule]:
150
+ """
151
+ Get the module object of the tester specified by the port index id
152
+
153
+ :param tester: The tester object
154
+ :type tester: :class:`~xoa_driver.testers.L23Tester`
155
+ :param port_id: the index id of the port.
156
+
157
+ :type port_id: str
158
+ :param separator: The separator between module index and port index in port id, defaults to "/"
159
+ :type separator: str, optional
160
+ :param reserve: should reserve the module, defaults to False
161
+ :type reserve: bool, optional
162
+ :raises NoSuchModuleError: No such a module index on the tester
163
+ :return: module object
164
+ :rtype: Union[:class:`~xoa_driver.modules.GenericL23Module`, :class:`~xoa_driver.modules.E100ChimeraModule`]
165
+ """
166
+ if separator not in port_id:
167
+ raise ValueError(f"Invalid port_id format: {port_id}. Expected format 'm{separator}p'.")
168
+ module_id = port_id.split(separator)[0]
169
+ if reserve:
170
+ await reserve_modules([tester.modules.obtain(int(module_id))], force=reserve)
171
+ return tester.modules.obtain(int(module_id))
121
172
 
122
173
 
123
- async def reserve_modules(modules: List[GenericAnyModule], force: bool = True) -> None:
174
+ async def reserve_modules(modules: List[GenericL23Module | E100ChimeraModule], force: bool = True) -> None:
124
175
  """
125
176
  Reserve modules regardless whether they are owned by others or not.
126
177
 
127
178
  :param modules: The modules to reserve
128
- :type modules: List[:class:`~xoa_driver.modules.GenericAnyModule`]
179
+ :type modules: List[Union[:class:`~xoa_driver.modules.GenericL23Module`, :class:`~xoa_driver.modules.E100ChimeraModule`]]
129
180
  :param force: Should force reserve the module, defaults to True
130
181
  :type force: boolean
131
182
  :return:
@@ -137,12 +188,12 @@ async def reserve_modules(modules: List[GenericAnyModule], force: bool = True) -
137
188
 
138
189
 
139
190
  async def release_modules(
140
- modules: List[GenericAnyModule], should_release_ports: bool = False
191
+ modules: List[GenericL23Module | E100ChimeraModule], should_release_ports: bool = False
141
192
  ) -> None:
142
193
  """
143
194
  Free modules. If a module is reserved by you, release the module. If a module is reserved by others, relinquish the module. The modules should have no owner afterwards.
144
195
  :param module: The module to free
145
- :type module: :class:`~xoa_driver.modules.GenericAnyModule`
196
+ :type module: Union[:class:`~xoa_driver.modules.GenericL23Module`, :class:`~xoa_driver.modules.E100ChimeraModule`]
146
197
  :param should_release_ports: should ports also be freed, defaults to False
147
198
  :type should_release_ports: bool, optional
148
199
  :return:
@@ -160,13 +211,13 @@ async def release_modules(
160
211
 
161
212
 
162
213
  def get_module_supported_configs(
163
- module: Union[GenericL23Module, ModuleChimera],
214
+ module: Union[GenericL23Module, E100ChimeraModule],
164
215
  ) -> List[Tuple[MediaConfigurationType, int, int]]:
165
216
  """
166
217
  Get the module's supported configurations in a list.
167
218
 
168
219
  :param module: The module object
169
- :type module: Union[GenericL23Module, ModuleChimera]
220
+ :type module: Union[GenericL23Module, E100ChimeraModule]
170
221
  :return: List of tuple(supported media, port count, port speed) (The port speed in Mbps, e.g. 40000 for 40G)
171
222
  :rtype: List[Tuple[MediaConfigurationType, int, int]]
172
223
  """
@@ -179,7 +230,7 @@ def get_module_supported_configs(
179
230
 
180
231
 
181
232
  async def set_module_config(
182
- module: Union[GenericL23Module, ModuleChimera],
233
+ module: Union[GenericL23Module, E100ChimeraModule],
183
234
  media: enums.MediaConfigurationType,
184
235
  port_count: int,
185
236
  port_speed: int,
@@ -188,7 +239,7 @@ async def set_module_config(
188
239
  """Change the module configuration to the target media, port count and port speed.
189
240
 
190
241
  :param module: the module object
191
- :type module: Union[GenericL23Module, ModuleChimera]
242
+ :type module: Union[GenericL23Module, E100ChimeraModule]
192
243
  :param media: the target media for the module
193
244
  :type media: enums.MediaConfigurationType
194
245
  :param port_count: the target port count
@@ -203,7 +254,7 @@ async def set_module_config(
203
254
  await set_module_configs([(module, media, port_count, port_speed)], force)
204
255
 
205
256
 
206
- async def set_module_configs(module_configs: List[Tuple[Union[GenericL23Module, ModuleChimera], enums.MediaConfigurationType, int, int]], force: bool = True) -> None:
257
+ async def set_module_configs(module_configs: List[Tuple[Union[GenericL23Module, E100ChimeraModule], enums.MediaConfigurationType, int, int]], force: bool = True) -> None:
207
258
 
208
259
  """Configure multiple modules with specified media, port count and port speed.
209
260
 
@@ -211,7 +262,7 @@ async def set_module_configs(module_configs: List[Tuple[Union[GenericL23Module,
211
262
 
212
263
  Each tuple contains (module object, target media, target port count, target port speed in Mbps, should forcibly reserve the module)
213
264
 
214
- :type module_configs: List[Tuple[Union[GenericL23Module, ModuleChimera], enums.MediaConfigurationType, int, int, bool]]
265
+ :type module_configs: List[Tuple[Union[GenericL23Module, E100ChimeraModule], enums.MediaConfigurationType, int, int, bool]]
215
266
 
216
267
  :param force: should forcibly reserve the modules, defaults to True
217
268
  :type force: bool, optional
@@ -246,12 +297,12 @@ async def set_module_configs(module_configs: List[Tuple[Union[GenericL23Module,
246
297
  await release_modules([module for (module, _, _, _) in module_configs], False)
247
298
 
248
299
 
249
- async def get_module_eol_date(module: GenericAnyModule) -> str:
300
+ async def get_module_eol_date(module: Union[GenericL23Module, E100ChimeraModule]) -> str:
250
301
  """
251
302
  Get module's End-of-Life date
252
303
 
253
304
  :param module: The module object
254
- :type module: GenericAnyModule
305
+ :type module: Union[GenericL23Module, E100ChimeraModule]
255
306
  :return: Module's EOL date
256
307
  :rtype: str
257
308
  """
@@ -260,12 +311,12 @@ async def get_module_eol_date(module: GenericAnyModule) -> str:
260
311
  return MODULE_EOL_INFO.get(module_key, "2999-01-01")
261
312
 
262
313
 
263
- async def get_module_eol_days(module: GenericAnyModule) -> int:
314
+ async def get_module_eol_days(module: Union[GenericL23Module, E100ChimeraModule]) -> int:
264
315
  """
265
316
  Get days until module's End-of-Life date
266
317
 
267
318
  :param module: The module object
268
- :type module: GenericAnyModule
319
+ :type module: Union[GenericL23Module, E100ChimeraModule]
269
320
  :return: days until module's End-of-Life date
270
321
  :rtype: int
271
322
  """
@@ -314,7 +365,7 @@ async def get_cage_count(module: Union[Z800FreyaModule, Z1600EdunModule]) -> int
314
365
  # region Ports
315
366
 
316
367
 
317
- def obtain_ports_by_ids(tester: L23Tester, port_ids: List[str], separator: str = "/") -> tuple[GenericAnyPort, ...]:
368
+ async def obtain_ports_by_ids(tester: L23Tester, port_ids: List[str], separator: str = "/", reserve: bool = False) -> tuple[Union[GenericL23Port, E100ChimeraPort], ...]:
318
369
  """
319
370
  Get ports of the tester specified by port ids
320
371
 
@@ -335,13 +386,17 @@ def obtain_ports_by_ids(tester: L23Tester, port_ids: List[str], separator: str =
335
386
  :type port_ids: List[str]
336
387
  :param separator: The separator between module index and port index in port id, defaults to `/`
337
388
  :type separator: str, optional
389
+ :param reserve: should reserve the ports, defaults to False
390
+ :type reserve: bool, optional
338
391
  :return: List of port objects
339
- :rtype: tuple[GenericAnyPort]
392
+ :rtype: tuple[Union[GenericL23Port, E100ChimeraPort]]
340
393
  """
341
394
 
342
395
  returned_ports = []
343
396
  if len(port_ids) == 0 or f"*{separator}*" in port_ids or f"*" in port_ids: # [] or ["*/*"] or ["*"]
344
397
  all_ports_ = (m.ports for m in tester.modules)
398
+ if reserve:
399
+ await reserve_ports(list(chain.from_iterable(all_ports_)), force=reserve)
345
400
  return tuple(chain.from_iterable(all_ports_))
346
401
  else:
347
402
  for port_id in port_ids:
@@ -359,10 +414,12 @@ def obtain_ports_by_ids(tester: L23Tester, port_ids: List[str], separator: str =
359
414
  pid = port_id.split(separator)[1]
360
415
  for module in tester.modules:
361
416
  returned_ports.append(module.ports.obtain(int(pid)))
417
+ if reserve:
418
+ await reserve_ports(returned_ports, force=reserve)
362
419
  return tuple(returned_ports)
363
420
 
364
421
 
365
- def obtain_port_by_id(tester: L23Tester, port_id: str, separator: str = "/") -> GenericAnyPort:
422
+ async def obtain_port_by_id(tester: L23Tester, port_id: str, separator: str = "/", reserve: bool = False) -> Union[GenericL23Port, E100ChimeraPort]:
366
423
  """
367
424
  Get a port of the module
368
425
 
@@ -372,23 +429,26 @@ def obtain_port_by_id(tester: L23Tester, port_id: str, separator: str = "/") ->
372
429
  :type port_id: str
373
430
  :param separator: The separator between module index and port index in port id, defaults to "/"
374
431
  :type separator: str, optional
432
+ :param reserve: should reserve the port, defaults to False
433
+ :type reserve: bool, optional
375
434
  :raises NoSuchPortError: No port found with the index
376
435
  :return: The port object
377
- :rtype: GenericAnyPort
436
+ :rtype: Union[GenericL23Port, E100ChimeraPort]
378
437
  """
379
438
  if "*" in port_id:
380
439
  raise ValueError("Wildcard '*' is not allowed in port_id for obtain_port_by_id function.")
381
440
  if separator not in port_id:
382
441
  raise ValueError(f"Invalid port_id format: {port_id}. Expected format 'm{separator}p'.")
383
- return obtain_ports_by_ids(tester, [port_id], separator=separator)[0]
442
+ port_obj = (await obtain_ports_by_ids(tester, [port_id], separator=separator, reserve=reserve))[0]
443
+ return port_obj
384
444
 
385
445
 
386
- async def reserve_ports(ports: list[GenericAnyPort], force: bool = True, reset: bool = False) -> None:
446
+ async def reserve_ports(ports: list[Union[GenericL23Port, E100ChimeraPort]], force: bool = True, reset: bool = False) -> None:
387
447
  """
388
448
  Reserve a port regardless whether it is owned by others or not.
389
449
 
390
450
  :param ports: The ports to reserve
391
- :type ports: list[GenericAnyPort]
451
+ :type ports: list[Union[GenericL23Port, E100ChimeraPort]]
392
452
  :param force: Should force reserve the ports, defaults to True
393
453
  :type force: boolean, optional
394
454
  :param reset: Should reset the ports after reserving, defaults to False
@@ -409,12 +469,12 @@ async def reserve_ports(ports: list[GenericAnyPort], force: bool = True, reset:
409
469
  await port.reset.set()
410
470
 
411
471
 
412
- async def release_ports(ports: List[GenericAnyPort]) -> None:
472
+ async def release_ports(ports: List[Union[GenericL23Port, E100ChimeraPort]]) -> None:
413
473
  """
414
474
  Free a port. If the port is reserved by you, release the port. If the port is reserved by others, relinquish the port. The port should have no owner afterwards.
415
475
 
416
476
  :param port: The port to free
417
- :type port: GenericAnyPort
477
+ :type port: Union[GenericL23Port, E100ChimeraPort]
418
478
  :return:
419
479
  :rtype: None
420
480
  """
@@ -426,12 +486,12 @@ async def release_ports(ports: List[GenericAnyPort]) -> None:
426
486
  await port.reservation.set_release()
427
487
 
428
488
 
429
- async def reset_ports(ports: List[GenericAnyPort]) -> None:
489
+ async def reset_ports(ports: List[Union[GenericL23Port, E100ChimeraPort]]) -> None:
430
490
  """
431
491
  Reset a list of ports.
432
492
 
433
493
  :param ports: The ports to reset
434
- :type ports: List[GenericAnyPort]
494
+ :type ports: List[Union[GenericL23Port, E100ChimeraPort]]
435
495
  :return:
436
496
  :rtype: None
437
497
  """
@@ -459,6 +519,8 @@ __all__ = (
459
519
  "release_tester",
460
520
  "get_chassis_sys_uptime",
461
521
  "obtain_modules_by_ids",
522
+ "obtain_module_by_id",
523
+ "obtain_module_by_port_id",
462
524
  "reserve_modules",
463
525
  "release_modules",
464
526
  "get_module_supported_configs",
xoa_driver/hlfuncs.py CHANGED
@@ -9,6 +9,8 @@ from xoa_driver.functions import (
9
9
  exceptions,
10
10
  headers,
11
11
  cmis,
12
+ layer1_adv,
13
+ async_wrapper,
12
14
  )
13
15
 
14
16
  __all__ = (
@@ -19,4 +21,6 @@ __all__ = (
19
21
  "config_io",
20
22
  "headers",
21
23
  "cmis",
24
+ "layer1_adv",
25
+ "async_wrapper",
22
26
  )
@@ -29,3 +29,4 @@ from .ps_commands import * # noqa: F403,F401
29
29
  from .pt_commands import * # noqa: F403,F401
30
30
  from .px_commands import * # noqa: F403,F401
31
31
  from .pl1_commands import * # noqa: F403,F401
32
+ from .pl1ad_commands import * # noqa: F403,F401
@@ -3309,4 +3309,14 @@ class MACSecPNMode(IntEnum):
3309
3309
  RESET = 1
3310
3310
  """Reset the PN value"""
3311
3311
 
3312
- # endregion
3312
+ # endregion
3313
+
3314
+
3315
+ class TrueFalse(IntEnum):
3316
+ """True or False"""
3317
+
3318
+ FALSE = 0
3319
+ """False"""
3320
+
3321
+ TRUE = 1
3322
+ """True"""
@@ -1,4 +1,4 @@
1
- """Port Advanced Layer 1 Commands"""
1
+ """Port Layer 1 Commands"""
2
2
  from __future__ import annotations
3
3
  from dataclasses import dataclass
4
4
  import typing