osism 0.20250621.0__py3-none-any.whl → 0.20250628.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.
- osism/api.py +264 -94
- osism/commands/apply.py +2 -2
- osism/commands/manage.py +251 -0
- osism/commands/reconciler.py +8 -1
- osism/commands/validate.py +1 -1
- osism/tasks/conductor/ironic.py +15 -17
- osism/tasks/conductor/sonic/config_generator.py +133 -41
- osism/tasks/conductor/sonic/constants.py +1 -0
- osism/tasks/conductor/sonic/interface.py +167 -16
- osism/tasks/conductor/sonic/sync.py +26 -1
- osism/tasks/reconciler.py +12 -2
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/METADATA +4 -4
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/RECORD +21 -24
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/entry_points.txt +1 -2
- osism-0.20250628.0.dist-info/pbr.json +1 -0
- osism/actions/__init__.py +0 -1
- osism/core/__init__.py +0 -1
- osism/plugins/__init__.py +0 -1
- osism-0.20250621.0.dist-info/pbr.json +0 -1
- /osism/{core → data}/enums.py +0 -0
- /osism/{core → data}/playbooks.py +0 -0
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/WHEEL +0 -0
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/licenses/AUTHORS +0 -0
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/licenses/LICENSE +0 -0
- {osism-0.20250621.0.dist-info → osism-0.20250628.0.dist-info}/top_level.txt +0 -0
@@ -237,23 +237,43 @@ def _find_sonic_name_by_alias_mapping(interface_name, port_config):
|
|
237
237
|
- tenGigE1 alias maps to Eth1/1/1 or Eth1/1
|
238
238
|
- tenGigE48 alias maps to Eth1/48/1 or Eth1/48
|
239
239
|
- hundredGigE49 alias maps to Eth1/49/1 or Eth1/49
|
240
|
+
- Eth1(Port1) -> Ethernet0, Eth2(Port2) -> Ethernet1, Eth3(Port) -> Ethernet2
|
240
241
|
|
241
242
|
Args:
|
242
|
-
interface_name: NetBox interface name (e.g., "Eth1/1"
|
243
|
+
interface_name: NetBox interface name (e.g., "Eth1/1", "Eth1/1/1", or "Eth1(Port1)")
|
243
244
|
port_config: Port configuration dictionary
|
244
245
|
|
245
246
|
Returns:
|
246
247
|
str: SONiC interface name or original name if not found
|
247
248
|
"""
|
249
|
+
logger.debug(f"Finding SONiC name for interface: '{interface_name}'")
|
250
|
+
logger.debug(f"Port config contains {len(port_config)} entries")
|
251
|
+
|
252
|
+
# Handle new Eth1(Port1) format first
|
253
|
+
paren_match = re.match(r"Eth(\d+)\(Port(\d*)\)", interface_name)
|
254
|
+
if paren_match:
|
255
|
+
eth_num = int(paren_match.group(1))
|
256
|
+
# Map EthX(PortY) to EthernetX-1 (1-based to 0-based conversion)
|
257
|
+
ethernet_num = eth_num - 1
|
258
|
+
sonic_name = f"Ethernet{ethernet_num}"
|
259
|
+
logger.debug(
|
260
|
+
f"Alias mapping: {interface_name} -> {sonic_name} via Eth(Port) format (eth_num={eth_num}, ethernet_num={ethernet_num})"
|
261
|
+
)
|
262
|
+
return sonic_name
|
263
|
+
|
248
264
|
# Create reverse mapping: expected NetBox name -> alias -> SONiC name
|
249
265
|
for sonic_port, config in port_config.items():
|
250
266
|
alias = config.get("alias", "")
|
251
267
|
if not alias:
|
268
|
+
logger.debug(f"Skipping {sonic_port}: no alias")
|
252
269
|
continue
|
253
270
|
|
254
271
|
# Extract number from alias (e.g., tenGigE1 -> 1, hundredGigE49 -> 49)
|
255
272
|
alias_match = re.search(r"(\d+)$", alias)
|
256
273
|
if not alias_match:
|
274
|
+
logger.debug(
|
275
|
+
f"Skipping {sonic_port}: alias '{alias}' has no trailing number"
|
276
|
+
)
|
257
277
|
continue
|
258
278
|
|
259
279
|
alias_num = int(alias_match.group(1))
|
@@ -264,18 +284,25 @@ def _find_sonic_name_by_alias_mapping(interface_name, port_config):
|
|
264
284
|
f"Eth1/{alias_num}/1", # Breakout format (first subport)
|
265
285
|
]
|
266
286
|
|
287
|
+
logger.debug(
|
288
|
+
f"Checking {sonic_port} (alias='{alias}', alias_num={alias_num}) against expected_names: {expected_names}"
|
289
|
+
)
|
290
|
+
|
267
291
|
if interface_name in expected_names:
|
268
292
|
logger.debug(
|
269
293
|
f"Alias mapping: {interface_name} -> {sonic_port} via alias {alias}"
|
270
294
|
)
|
271
295
|
return sonic_port
|
272
296
|
|
273
|
-
logger.warning(f"No alias mapping found for {interface_name}")
|
297
|
+
logger.warning(f"No alias mapping found for '{interface_name}'")
|
298
|
+
logger.debug(
|
299
|
+
f"Available aliases in port_config: {[(sonic_port, config.get('alias', '')) for sonic_port, config in port_config.items()]}"
|
300
|
+
)
|
274
301
|
return interface_name
|
275
302
|
|
276
303
|
|
277
304
|
def convert_sonic_interface_to_alias(
|
278
|
-
sonic_interface_name, interface_speed=None, is_breakout=False
|
305
|
+
sonic_interface_name, interface_speed=None, is_breakout=False, port_config=None
|
279
306
|
):
|
280
307
|
"""Convert SONiC interface name to NetBox-style alias.
|
281
308
|
|
@@ -283,28 +310,134 @@ def convert_sonic_interface_to_alias(
|
|
283
310
|
sonic_interface_name: SONiC interface name (e.g., "Ethernet0", "Ethernet4")
|
284
311
|
interface_speed: Interface speed in Mbps (optional, for speed-based calculation)
|
285
312
|
is_breakout: Whether this is a breakout port (adds subport notation)
|
313
|
+
port_config: Port configuration dictionary (optional, for alias-based calculation)
|
286
314
|
|
287
315
|
Returns:
|
288
316
|
str: NetBox-style alias (e.g., "Eth1/1", "Eth1/2" or "Eth1/1/1", "Eth1/1/2" for breakout)
|
289
317
|
|
290
318
|
Examples:
|
291
|
-
- Regular
|
292
|
-
-
|
293
|
-
- Breakout ports: Ethernet0 -> Eth1/1/1, Ethernet1 -> Eth1/1/2, Ethernet2 -> Eth1/1/3, Ethernet3 -> Eth1/1/4
|
319
|
+
- Regular ports: Ethernet0 with alias "twentyFiveGigE1" -> Eth1/1
|
320
|
+
- Breakout ports: Ethernet2 with base port alias "twentyFiveGigE1" -> Eth1/1/3
|
294
321
|
"""
|
322
|
+
logger.debug(
|
323
|
+
f"Converting SONiC interface to alias: {sonic_interface_name}, speed={interface_speed}, is_breakout={is_breakout}"
|
324
|
+
)
|
325
|
+
|
295
326
|
# Extract port number from SONiC format (Ethernet0, Ethernet4, etc.)
|
296
327
|
match = re.match(r"Ethernet(\d+)", sonic_interface_name)
|
297
328
|
if not match:
|
298
329
|
# If it doesn't match expected pattern, return as-is
|
330
|
+
logger.debug(
|
331
|
+
f"Interface {sonic_interface_name} doesn't match Ethernet pattern, returning as-is"
|
332
|
+
)
|
299
333
|
return sonic_interface_name
|
300
334
|
|
301
|
-
|
335
|
+
ethernet_num = int(match.group(1))
|
336
|
+
logger.debug(f"Extracted ethernet_num: {ethernet_num}")
|
337
|
+
|
338
|
+
# If port_config is provided, use alias-based calculation
|
339
|
+
if port_config:
|
340
|
+
return _convert_using_port_config(
|
341
|
+
sonic_interface_name, ethernet_num, is_breakout, port_config
|
342
|
+
)
|
343
|
+
|
344
|
+
# Fallback to legacy speed-based calculation
|
345
|
+
return _convert_using_speed_calculation(ethernet_num, interface_speed, is_breakout)
|
346
|
+
|
347
|
+
|
348
|
+
def _convert_using_port_config(
|
349
|
+
sonic_interface_name, ethernet_num, is_breakout, port_config
|
350
|
+
):
|
351
|
+
"""Convert using port config alias information."""
|
352
|
+
if is_breakout:
|
353
|
+
# For breakout ports, find the base port in port_config
|
354
|
+
base_port_name = _find_base_port_for_breakout(ethernet_num, port_config)
|
355
|
+
if base_port_name and base_port_name in port_config:
|
356
|
+
base_alias = port_config[base_port_name].get("alias", "")
|
357
|
+
# Extract port number from base alias
|
358
|
+
sonic_port_number = _extract_port_number_from_alias(base_alias)
|
359
|
+
if sonic_port_number is not None:
|
360
|
+
# Calculate subport number: how many ports after the base port
|
361
|
+
base_ethernet_num = int(base_port_name.replace("Ethernet", ""))
|
362
|
+
subport = (ethernet_num - base_ethernet_num) + 1
|
363
|
+
|
364
|
+
module = 1
|
365
|
+
result = f"Eth{module}/{sonic_port_number}/{subport}"
|
366
|
+
logger.debug(
|
367
|
+
f"Breakout conversion using port config: {sonic_interface_name} -> {result} "
|
368
|
+
f"(base_port={base_port_name}, base_alias={base_alias}, sonic_port_number={sonic_port_number}, subport={subport})"
|
369
|
+
)
|
370
|
+
return result
|
371
|
+
|
372
|
+
# Fallback if base port not found
|
373
|
+
logger.warning(
|
374
|
+
f"Could not find base port for breakout interface {sonic_interface_name}"
|
375
|
+
)
|
376
|
+
return _convert_using_speed_calculation(ethernet_num, None, is_breakout)
|
377
|
+
else:
|
378
|
+
# For regular ports, get alias directly
|
379
|
+
if sonic_interface_name in port_config:
|
380
|
+
alias = port_config[sonic_interface_name].get("alias", "")
|
381
|
+
sonic_port_number = _extract_port_number_from_alias(alias)
|
382
|
+
if sonic_port_number is not None:
|
383
|
+
module = 1
|
384
|
+
result = f"Eth{module}/{sonic_port_number}"
|
385
|
+
logger.debug(
|
386
|
+
f"Regular conversion using port config: {sonic_interface_name} -> {result} "
|
387
|
+
f"(alias={alias}, sonic_port_number={sonic_port_number})"
|
388
|
+
)
|
389
|
+
return result
|
390
|
+
|
391
|
+
# Fallback if not in port config
|
392
|
+
logger.warning(f"Interface {sonic_interface_name} not found in port config")
|
393
|
+
return _convert_using_speed_calculation(ethernet_num, None, is_breakout)
|
394
|
+
|
395
|
+
|
396
|
+
def _find_base_port_for_breakout(ethernet_num, port_config):
|
397
|
+
"""Find the base port for a breakout interface.
|
398
|
+
|
399
|
+
The base port is the next smaller or equal port that exists in port_config.
|
400
|
+
E.g., for Ethernet2 -> check Ethernet2, Ethernet1, Ethernet0 until found.
|
401
|
+
"""
|
402
|
+
for base_num in range(ethernet_num, -1, -1):
|
403
|
+
base_port_name = f"Ethernet{base_num}"
|
404
|
+
if base_port_name in port_config:
|
405
|
+
logger.debug(
|
406
|
+
f"Found base port {base_port_name} for breakout interface Ethernet{ethernet_num}"
|
407
|
+
)
|
408
|
+
return base_port_name
|
409
|
+
|
410
|
+
logger.warning(f"No base port found for breakout interface Ethernet{ethernet_num}")
|
411
|
+
return None
|
412
|
+
|
413
|
+
|
414
|
+
def _extract_port_number_from_alias(alias):
|
415
|
+
"""Extract the port number from the end of an alias.
|
416
|
+
|
417
|
+
E.g., "twentyFiveGigE1" -> 1, "hundredGigE49" -> 49
|
418
|
+
"""
|
419
|
+
if not alias:
|
420
|
+
return None
|
421
|
+
|
422
|
+
match = re.search(r"(\d+)$", alias)
|
423
|
+
if match:
|
424
|
+
port_number = int(match.group(1))
|
425
|
+
logger.debug(f"Extracted port number {port_number} from alias '{alias}'")
|
426
|
+
return port_number
|
427
|
+
|
428
|
+
logger.warning(f"Could not extract port number from alias '{alias}'")
|
429
|
+
return None
|
430
|
+
|
431
|
+
|
432
|
+
def _convert_using_speed_calculation(ethernet_num, interface_speed, is_breakout):
|
433
|
+
"""Legacy speed-based conversion (fallback)."""
|
434
|
+
logger.debug(f"Using legacy speed-based calculation for Ethernet{ethernet_num}")
|
302
435
|
|
303
436
|
if is_breakout:
|
304
437
|
# For breakout ports: Ethernet0 -> Eth1/1/1, Ethernet1 -> Eth1/1/2, etc.
|
305
438
|
# Calculate base port (master port) and subport number
|
306
|
-
base_port = (
|
307
|
-
subport = (
|
439
|
+
base_port = (ethernet_num // 4) * 4 # Get base port (0, 4, 8, 12, ...)
|
440
|
+
subport = (ethernet_num % 4) + 1 # Get subport number (1, 2, 3, 4)
|
308
441
|
|
309
442
|
# Calculate physical port number for the base port
|
310
443
|
physical_port = (base_port // 4) + 1 # Convert to 1-based indexing
|
@@ -312,7 +445,11 @@ def convert_sonic_interface_to_alias(
|
|
312
445
|
# Assume module 1 for now - could be extended for multi-module systems
|
313
446
|
module = 1
|
314
447
|
|
315
|
-
|
448
|
+
result = f"Eth{module}/{physical_port}/{subport}"
|
449
|
+
logger.debug(
|
450
|
+
f"Breakout conversion: base_port={base_port}, subport={subport}, physical_port={physical_port}, result={result}"
|
451
|
+
)
|
452
|
+
return result
|
316
453
|
else:
|
317
454
|
# For regular ports: use speed-based calculation
|
318
455
|
# Determine speed category and multiplier
|
@@ -323,15 +460,21 @@ def convert_sonic_interface_to_alias(
|
|
323
460
|
# Default for 1G, 10G, 25G ports - sequential numbering
|
324
461
|
multiplier = 1
|
325
462
|
|
463
|
+
logger.debug(
|
464
|
+
f"Regular port calculation: interface_speed={interface_speed}, in_high_speed={interface_speed in HIGH_SPEED_PORTS if interface_speed else False}, multiplier={multiplier}"
|
465
|
+
)
|
466
|
+
|
326
467
|
# Calculate physical port number
|
327
|
-
physical_port = (
|
328
|
-
sonic_port_number // multiplier
|
329
|
-
) + 1 # Convert to 1-based indexing
|
468
|
+
physical_port = (ethernet_num // multiplier) + 1 # Convert to 1-based indexing
|
330
469
|
|
331
470
|
# Assume module 1 for now - could be extended for multi-module systems
|
332
471
|
module = 1
|
333
472
|
|
334
|
-
|
473
|
+
result = f"Eth{module}/{physical_port}"
|
474
|
+
logger.debug(
|
475
|
+
f"Regular conversion: ethernet_num={ethernet_num}, physical_port={physical_port}, result={result}"
|
476
|
+
)
|
477
|
+
return result
|
335
478
|
|
336
479
|
|
337
480
|
def get_port_config(hwsku):
|
@@ -558,9 +701,14 @@ def detect_breakout_ports(device):
|
|
558
701
|
)
|
559
702
|
continue
|
560
703
|
|
704
|
+
# Calculate physical port number (1/1 -> port 1, 1/2 -> port 2, etc.)
|
705
|
+
physical_port_num = f"{module}/{port}"
|
706
|
+
|
561
707
|
# Add breakout config for master port
|
562
708
|
breakout_cfgs[master_port] = {
|
709
|
+
"breakout_owner": "MANUAL",
|
563
710
|
"brkout_mode": brkout_mode,
|
711
|
+
"port": physical_port_num,
|
564
712
|
}
|
565
713
|
|
566
714
|
# Add all subports to breakout_ports
|
@@ -634,12 +782,15 @@ def detect_breakout_ports(device):
|
|
634
782
|
else:
|
635
783
|
continue # Skip unsupported speeds
|
636
784
|
|
637
|
-
# Calculate physical port number
|
638
|
-
|
785
|
+
# Calculate physical port number (Ethernet0-3 -> port 1/1, Ethernet4-7 -> port 1/2, etc.)
|
786
|
+
physical_port_index = (base_port // 4) + 1
|
787
|
+
physical_port_num = f"1/{physical_port_index}"
|
639
788
|
|
640
789
|
# Add breakout config for master port
|
641
790
|
breakout_cfgs[master_port] = {
|
791
|
+
"breakout_owner": "MANUAL",
|
642
792
|
"brkout_mode": brkout_mode,
|
793
|
+
"port": physical_port_num,
|
643
794
|
}
|
644
795
|
|
645
796
|
# Add all ports to breakout_ports
|
@@ -82,7 +82,32 @@ def sync_sonic(device_name=None, task_id=None, show_diff=True):
|
|
82
82
|
logger.info(f"Found {len(devices)} devices matching criteria")
|
83
83
|
|
84
84
|
# Find interconnected spine/superspine groups for special AS calculation
|
85
|
-
|
85
|
+
# When processing a single device, we need to consider all spine/superspine devices
|
86
|
+
# to properly detect interconnected groups, not just the requested device
|
87
|
+
if device_name and devices:
|
88
|
+
# Check if the single device is a spine/superspine
|
89
|
+
target_device = devices[0]
|
90
|
+
if target_device.role and target_device.role.slug in ["spine", "superspine"]:
|
91
|
+
# Fetch ALL spine/superspine devices to properly detect groups
|
92
|
+
logger.debug(
|
93
|
+
"Single spine/superspine device detected, fetching all spine/superspine devices for group detection"
|
94
|
+
)
|
95
|
+
all_spine_devices = []
|
96
|
+
nb_device_query_list = get_nb_device_query_list_sonic()
|
97
|
+
for nb_device_query in nb_device_query_list:
|
98
|
+
for device in utils.nb.dcim.devices.filter(**nb_device_query):
|
99
|
+
if device.role and device.role.slug in ["spine", "superspine"]:
|
100
|
+
all_spine_devices.append(device)
|
101
|
+
spine_groups = find_interconnected_devices(
|
102
|
+
all_spine_devices, ["spine", "superspine"]
|
103
|
+
)
|
104
|
+
else:
|
105
|
+
# For non-spine devices, use the original logic
|
106
|
+
spine_groups = find_interconnected_devices(devices, ["spine", "superspine"])
|
107
|
+
else:
|
108
|
+
# For multi-device processing, use the original logic
|
109
|
+
spine_groups = find_interconnected_devices(devices, ["spine", "superspine"])
|
110
|
+
|
86
111
|
logger.info(f"Found {len(spine_groups)} interconnected spine/superspine groups")
|
87
112
|
|
88
113
|
# Create mapping from device ID to its assigned AS number
|
osism/tasks/reconciler.py
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# SPDX-License-Identifier: Apache-2.0
|
2
2
|
|
3
3
|
import io
|
4
|
+
import os
|
4
5
|
import subprocess
|
5
6
|
|
6
7
|
from celery import Celery
|
@@ -27,7 +28,7 @@ def setup_periodic_tasks(sender, **kwargs):
|
|
27
28
|
|
28
29
|
|
29
30
|
@app.task(bind=True, name="osism.tasks.reconciler.run")
|
30
|
-
def run(self, publish=True):
|
31
|
+
def run(self, publish=True, flush_cache=False):
|
31
32
|
lock = Redlock(
|
32
33
|
key="lock_osism_tasks_reconciler_run",
|
33
34
|
masters={utils.redis},
|
@@ -36,8 +37,17 @@ def run(self, publish=True):
|
|
36
37
|
|
37
38
|
if lock.acquire(timeout=20):
|
38
39
|
logger.info("RUN /run.sh")
|
40
|
+
|
41
|
+
env = os.environ.copy()
|
42
|
+
if flush_cache:
|
43
|
+
env["FLUSH_CACHE"] = "true"
|
44
|
+
|
39
45
|
p = subprocess.Popen(
|
40
|
-
"/run.sh",
|
46
|
+
"/run.sh",
|
47
|
+
shell=True,
|
48
|
+
stdout=subprocess.PIPE,
|
49
|
+
stderr=subprocess.STDOUT,
|
50
|
+
env=env,
|
41
51
|
)
|
42
52
|
|
43
53
|
if publish:
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: osism
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.20250628.0
|
4
4
|
Summary: OSISM manager interface
|
5
5
|
Home-page: https://github.com/osism/python-osism
|
6
6
|
Author: OSISM GmbH
|
@@ -32,7 +32,7 @@ Requires-Dist: cliff==4.10.0
|
|
32
32
|
Requires-Dist: deepdiff==8.5.0
|
33
33
|
Requires-Dist: docker==7.1.0
|
34
34
|
Requires-Dist: dtrack-auditor==1.5.0
|
35
|
-
Requires-Dist: fastapi==0.115.
|
35
|
+
Requires-Dist: fastapi==0.115.14
|
36
36
|
Requires-Dist: flower==2.0.1
|
37
37
|
Requires-Dist: hiredis==3.2.1
|
38
38
|
Requires-Dist: jc==1.25.5
|
@@ -41,8 +41,8 @@ Requires-Dist: kombu==5.5.4
|
|
41
41
|
Requires-Dist: kubernetes==33.1.0
|
42
42
|
Requires-Dist: loguru==0.7.3
|
43
43
|
Requires-Dist: nbcli==0.10.0.dev2
|
44
|
-
Requires-Dist: netmiko==4.5.0
|
45
44
|
Requires-Dist: openstacksdk==4.6.0
|
45
|
+
Requires-Dist: paramiko==3.5.1
|
46
46
|
Requires-Dist: pottery==3.0.1
|
47
47
|
Requires-Dist: prompt-toolkit==3.0.51
|
48
48
|
Requires-Dist: pynetbox==7.5.0
|
@@ -53,7 +53,7 @@ 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.
|
56
|
+
Requires-Dist: uvicorn[standard]==0.35.0
|
57
57
|
Requires-Dist: watchdog==6.0.0
|
58
58
|
Provides-Extra: ansible
|
59
59
|
Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
|
@@ -1,11 +1,10 @@
|
|
1
1
|
osism/__init__.py,sha256=1UiNTBus0V0f2AbZQzAtVtu6zkfCCrw0OTq--NwFAqY,341
|
2
2
|
osism/__main__.py,sha256=ILe4gu61xEISiBsxanqTQIdSkV-YhpZXTRlguCYyssk,141
|
3
|
-
osism/api.py,sha256=
|
3
|
+
osism/api.py,sha256=3kEfPJtPwuWD8luDNnEFRx3nEsUY5AeWnmjd4A5ii-A,11079
|
4
4
|
osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
|
5
5
|
osism/settings.py,sha256=bebPBT6Hd1-KhJfwZdFR-s8eMwV4B1IFr-WrQBkOrWw,1786
|
6
|
-
osism/actions/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
7
6
|
osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
|
8
|
-
osism/commands/apply.py,sha256=
|
7
|
+
osism/commands/apply.py,sha256=GWUccZAXlgkPYqylrCmdWcj8FCkDsPEipIIG937MeII,16833
|
9
8
|
osism/commands/baremetal.py,sha256=w1LyZDms-DtULsF_76JsauOYHc2tcvoMRP6F9dYby9E,10688
|
10
9
|
osism/commands/compose.py,sha256=iqzG7mS9E1VWaLNN6yQowjOqiHn3BMdj-yfXb3Dc4Ok,1200
|
11
10
|
osism/commands/compute.py,sha256=cgqXWJa5wAvn-7e3FWCgX6hie_aK0yrKRkcNzjLXwDY,25799
|
@@ -14,26 +13,24 @@ osism/commands/console.py,sha256=8BPz1hio5Wi6kONVAWFuSqkDRrMcLEYeFIY8dbtN6e4,321
|
|
14
13
|
osism/commands/container.py,sha256=Fku2GaCM3Idq_FxExUtNqjrEM0XYjpVvXmueSVO8S_c,1601
|
15
14
|
osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
|
16
15
|
osism/commands/log.py,sha256=2IpYuosC7FZwwLvM8HmKSU1NRNIelVVYzqjjVMCrOJk,4072
|
17
|
-
osism/commands/manage.py,sha256=
|
16
|
+
osism/commands/manage.py,sha256=uzfmt3R0PJ4HxUw_V945pN0FbKb3zhyiBuD9br1ORYE,23149
|
18
17
|
osism/commands/netbox.py,sha256=e65P0kWrjTLw2T9HZthxjDTIRa-KAHgSSJAlvVef7n4,7345
|
19
18
|
osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
|
20
|
-
osism/commands/reconciler.py,sha256=
|
19
|
+
osism/commands/reconciler.py,sha256=ubQfX8j13s3NuMKnT0Lt6O-szf7Z1V02AfsMQFHmO74,2209
|
21
20
|
osism/commands/server.py,sha256=avmoOv5rjOi-fN2A-27cPwOtiy2Q2j6UFtCh3QrfWAI,7512
|
22
21
|
osism/commands/service.py,sha256=A1lgAlGeCJpbFFqF55DRWPcCirIgpU0dzjzVLZ0mz3k,2649
|
23
22
|
osism/commands/set.py,sha256=xLBi2DzbVQo2jb3-cOIE9In5UB3vFxquQJkDN-EsfhM,1425
|
24
23
|
osism/commands/status.py,sha256=X-Rcj-XuNPDBoxsGkf96NswwpmTognxz1V6E2NX2ZgY,1997
|
25
24
|
osism/commands/sync.py,sha256=jOg-g8NmVOkXBI6rOuiOx2WgUJc1PplLAAAwc0VuIfw,1919
|
26
25
|
osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
|
27
|
-
osism/commands/validate.py,sha256=
|
26
|
+
osism/commands/validate.py,sha256=ifdkelYptCXp18KX076Rb-CqluUN20bunG9ZeLs4AV8,3262
|
28
27
|
osism/commands/vault.py,sha256=llaqNN8UH8t8cCu2KmdaURvprA4zeG6izCen_W7ulPs,2029
|
29
28
|
osism/commands/volume.py,sha256=l6oAk__dFM8KKdLTWOvuSiI7tLh9wAPZp8hwmYF-NX0,6595
|
30
29
|
osism/commands/wait.py,sha256=2Ncx63M0AFq4fq40VZVClf1LS-WHetD8iC_mG2dY_Cw,5275
|
31
30
|
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
31
|
osism/data/__init__.py,sha256=izXdh0J3vPLQI7kBhJI7ibJQzPqU_nlONP0L4Cf_k6A,1504
|
36
|
-
osism/
|
32
|
+
osism/data/enums.py,sha256=gItIjOK6xWuOZSkMxpMdYLRyt4ezyhzkqA7BGiah2o0,10030
|
33
|
+
osism/data/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
|
37
34
|
osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
|
38
35
|
osism/services/listener.py,sha256=Vf8LOZkHzlspm40BZ1az3o1O_ar34_i6C83p-D8KzzM,9783
|
39
36
|
osism/tasks/__init__.py,sha256=kocG0q2bARhkkSjMBH2xWdFUIJodesdh5qVsV_DqZmE,7148
|
@@ -44,28 +41,28 @@ osism/tasks/kolla.py,sha256=wJQpWn_01iWLkr7l7T7RNrQGfRgsgmYi4WQlTmNGvew,618
|
|
44
41
|
osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
|
45
42
|
osism/tasks/netbox.py,sha256=g0gL5QImiRTHqixRxze7LfNqPth7cXqLzVWQDUJLDjE,5928
|
46
43
|
osism/tasks/openstack.py,sha256=g15tCll5vP1pC6ysxRCTZxplsdGmXbxaCH3k1Qdv5Xg,6367
|
47
|
-
osism/tasks/reconciler.py,sha256=
|
44
|
+
osism/tasks/reconciler.py,sha256=phbSV6urILqq9mHGMYDFwSfx8bLZmldwgEi8sMWs8RA,2040
|
48
45
|
osism/tasks/conductor/__init__.py,sha256=eBkisjRj0YRT0AArvuvpIHGNEqEijsNvR_55BuVX62I,1600
|
49
46
|
osism/tasks/conductor/config.py,sha256=tvfuYNgvw0F_ZbvrjqnyHfrj3vF6z0zhsRtGNu-Lgvo,3410
|
50
|
-
osism/tasks/conductor/ironic.py,sha256=
|
47
|
+
osism/tasks/conductor/ironic.py,sha256=VT8JyYNh4IDWJ8QTIo46IokILKpGhINfLHjQvwz4FSU,16337
|
51
48
|
osism/tasks/conductor/netbox.py,sha256=5Nc7wrriDOtSuru1KDLt9QpA54vC7tXDPB2J0JP9GKo,11393
|
52
49
|
osism/tasks/conductor/utils.py,sha256=-a0-pRuhV4Fjj0SgdgBqtRJtAdGdqck5pzfi6NYBApU,2338
|
53
50
|
osism/tasks/conductor/sonic/__init__.py,sha256=oxTTl_MGK4iWK9uNDRNlULtGrDGCQHrlJZ04weh_Lh8,777
|
54
51
|
osism/tasks/conductor/sonic/bgp.py,sha256=PC6gGI5bCj2PCXcNGyMV9-EdlJWDsYaodzxigmYSZvw,3088
|
55
52
|
osism/tasks/conductor/sonic/cache.py,sha256=Asv2k3nLJejuq7iB0a_LyK8dEmJzypP9v3OHkNY3GwI,3438
|
56
|
-
osism/tasks/conductor/sonic/config_generator.py,sha256=
|
53
|
+
osism/tasks/conductor/sonic/config_generator.py,sha256=Fww6uOC7DplhsqR_jW9PHPB0pAAY1AiTGeNAQ2BUN4k,39259
|
57
54
|
osism/tasks/conductor/sonic/connections.py,sha256=NvRjwJv3NF3ry5Xe9qHzk7pQbfDQHYx_j3ATRMUs7gA,14244
|
58
|
-
osism/tasks/conductor/sonic/constants.py,sha256=
|
55
|
+
osism/tasks/conductor/sonic/constants.py,sha256=HjVFwmH-AN3np1qN97ahEAcwz2-4cHa-pA9pXWqWsqs,2219
|
59
56
|
osism/tasks/conductor/sonic/device.py,sha256=ZYJA0bQ8waKWStzWUPxbcwNWa2Z_hMB3pqs8aA_nxXA,2458
|
60
57
|
osism/tasks/conductor/sonic/exporter.py,sha256=25L1vbi84ZQD0xNHNTWk-anTz5QRkGJskCECBkeGQw4,8882
|
61
|
-
osism/tasks/conductor/sonic/interface.py,sha256=
|
62
|
-
osism/tasks/conductor/sonic/sync.py,sha256=
|
58
|
+
osism/tasks/conductor/sonic/interface.py,sha256=318wOwXYSSMKTPP2WSZIps-JvIkCQ2gYdQs9ZYHXwwg,38957
|
59
|
+
osism/tasks/conductor/sonic/sync.py,sha256=fpgsQVwq6Hb7eeDHhLkAqx5BkaK3Ce_m_WvmWEsJyOo,9182
|
63
60
|
osism/utils/__init__.py,sha256=gN5VtLJfrvyn6_snuTte7YR-vDygkpbORopIV8qSEsA,6064
|
64
|
-
osism-0.
|
65
|
-
osism-0.
|
66
|
-
osism-0.
|
67
|
-
osism-0.
|
68
|
-
osism-0.
|
69
|
-
osism-0.
|
70
|
-
osism-0.
|
71
|
-
osism-0.
|
61
|
+
osism-0.20250628.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
|
62
|
+
osism-0.20250628.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
63
|
+
osism-0.20250628.0.dist-info/METADATA,sha256=rcVQq1RFwIJWgeRM4C6m33wkVLBrIWRr6uxb32HlP14,2904
|
64
|
+
osism-0.20250628.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
65
|
+
osism-0.20250628.0.dist-info/entry_points.txt,sha256=eRq0DXdl4z2DdmPta6dqpzMe1M0DaUCNw9i4Jgdfhf0,3426
|
66
|
+
osism-0.20250628.0.dist-info/pbr.json,sha256=NkG2tM3T6XeLebmfw4oRVNN2ALTn2QIvqsXacP_lLJU,47
|
67
|
+
osism-0.20250628.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
|
68
|
+
osism-0.20250628.0.dist-info/RECORD,,
|
@@ -42,11 +42,10 @@ manage flavors = osism.commands.manage:Flavors
|
|
42
42
|
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
|
-
manage ironic = osism.commands.netbox:Ironic
|
46
45
|
manage netbox = osism.commands.netbox:Manage
|
47
46
|
manage server list = osism.commands.server:ServerList
|
48
47
|
manage server migrate = osism.commands.server:ServerMigrate
|
49
|
-
manage sonic = osism.commands.
|
48
|
+
manage sonic = osism.commands.manage:Sonic
|
50
49
|
manage volume list = osism.commands.volume:VolumeList
|
51
50
|
netbox = osism.commands.netbox:Console
|
52
51
|
noset bootstrap = osism.commands.noset:NoBootstrap
|
@@ -0,0 +1 @@
|
|
1
|
+
{"git_version": "f3fe7d7", "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": "ed0a34c", "is_release": false}
|
/osism/{core → data}/enums.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|