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.
@@ -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" or "Eth1/1/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 100G ports: Ethernet0 -> Eth1/1, Ethernet4 -> Eth1/2, Ethernet8 -> Eth1/3
292
- - Regular other speeds: Ethernet0 -> Eth1/1, Ethernet1 -> Eth1/2, Ethernet2 -> Eth1/3
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
- sonic_port_number = int(match.group(1))
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 = (sonic_port_number // 4) * 4 # Get base port (0, 4, 8, 12, ...)
307
- subport = (sonic_port_number % 4) + 1 # Get subport number (1, 2, 3, 4)
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
- return f"Eth{module}/{physical_port}/{subport}"
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
- return f"Eth{module}/{physical_port}"
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
- physical_port_num = (base_port // 4) + 1
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
- spine_groups = find_interconnected_devices(devices, ["spine", "superspine"])
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", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
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.20250621.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.13
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.34.3
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=t3HebSzk6fyY7bLJD9P95oEL1qWYXzpX6Yk1o_nVkMo,4356
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=q645f4qxmOAaUjVD7npzM2aNuOqfptVAkCLfE6x5IV8,16833
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=FaO9dbYjNHYanS98-zC498bx26oU8E3loxCczH9mfKI,12751
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=jy07Qbl219e-WCtWbtV9zh49qHHCjDMm6oVTJM61k1A,1958
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=E1n1kEo6h8J5c7Ns5OHpr0R7i4IU6uj08LE_gt3kBCg,3262
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/plugins/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
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=6iC0EYxeGvitzU2NsRqQzUEDZWW6Il3jgq_IRTN0sZg,1855
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=tIhKH5EWvqzjVtZr32du8_jiVDP_9mFgTkxBjmtEm6g,16487
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=Z2i6SvKp27EI-dK9fkSDo51ghbIIqTgM7qK0-xJtVwU,35098
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=nfsiKV1I5iiXPAUzkZgnFPWuSB_oy8xg3gNEZjn1Hb4,2194
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=MM-HrYlVdh_5fYSKto_38DC4RcfzoqBGEYFxk-Tz760,32233
62
- osism/tasks/conductor/sonic/sync.py,sha256=Jh2xbBv_yyrEJZZZkZRIk7vH0WV-IS4CA-4qQp56I2U,7823
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.20250621.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
65
- osism-0.20250621.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
66
- osism-0.20250621.0.dist-info/METADATA,sha256=0nTzEqeDkHWwUyPJftfn6_Az0MP26rQjhMQNPffXkdM,2903
67
- osism-0.20250621.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
- osism-0.20250621.0.dist-info/entry_points.txt,sha256=X1KbMeQim23k_lGGDFz8ldQIrdCrq8mKnFWgYrrEZI0,3469
69
- osism-0.20250621.0.dist-info/pbr.json,sha256=nvF1nN4eUUNsct1PT2Fq9FvN3QNGbPvpeeWGR0BjJjU,47
70
- osism-0.20250621.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
71
- osism-0.20250621.0.dist-info/RECORD,,
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.sync:Sonic
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}
File without changes
File without changes