osism 0.20250701.0__py3-none-any.whl → 0.20250709.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/tasks/__init__.py CHANGED
@@ -1,12 +1,10 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import logging
4
3
  import os
5
4
  import re
6
5
  import subprocess
7
6
 
8
7
  from loguru import logger
9
- from pottery import Redlock
10
8
 
11
9
  from osism import utils
12
10
 
@@ -77,10 +75,8 @@ def run_ansible_in_environment(
77
75
 
78
76
  # NOTE: Consider arguments in the future
79
77
  if locking:
80
- logging.getLogger("redlock").setLevel(logging.WARNING)
81
- lock = Redlock(
78
+ lock = utils.create_redlock(
82
79
  key=f"lock-ansible-{environment}-{role}",
83
- masters={utils.redis},
84
80
  auto_release_time=auto_release_time,
85
81
  )
86
82
 
@@ -195,9 +191,8 @@ def run_command(
195
191
  command_env.update(env)
196
192
 
197
193
  if locking:
198
- lock = Redlock(
194
+ lock = utils.create_redlock(
199
195
  key=f"lock-{command}",
200
- masters={utils.redis},
201
196
  auto_release_time=auto_release_time,
202
197
  )
203
198
 
osism/tasks/ansible.py CHANGED
@@ -1,7 +1,6 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
3
  from celery import Celery
4
- from pottery import Redlock
5
4
 
6
5
  from osism import settings, utils
7
6
  from osism.tasks import Config, run_ansible_in_environment
@@ -12,9 +11,8 @@ app.config_from_object(Config)
12
11
 
13
12
  @app.on_after_configure.connect
14
13
  def setup_periodic_tasks(sender, **kwargs):
15
- lock = Redlock(
14
+ lock = utils.create_redlock(
16
15
  key="lock_osism_tasks_ansible_setup_periodic_tasks",
17
- masters={utils.redis},
18
16
  )
19
17
  if settings.GATHER_FACTS_SCHEDULE > 0 and lock.acquire(timeout=10):
20
18
  sender.add_periodic_task(
@@ -3,7 +3,6 @@
3
3
  import json
4
4
 
5
5
  import jinja2
6
- from pottery import Redlock
7
6
 
8
7
  from osism import utils as osism_utils
9
8
  from osism.tasks import netbox, openstack
@@ -180,9 +179,8 @@ def sync_ironic(request_id, get_ironic_parameters, force_update=False):
180
179
  if interface.enabled and not interface.mgmt_only and interface.mac_address
181
180
  ]
182
181
 
183
- lock = Redlock(
182
+ lock = osism_utils.create_redlock(
184
183
  key=f"lock_osism_tasks_conductor_sync_ironic-{device.name}",
185
- masters={osism_utils.redis},
186
184
  auto_release_time=600,
187
185
  )
188
186
  if lock.acquire(timeout=120):
@@ -201,6 +201,9 @@ def generate_sonic_config(device, hwsku, device_as_mapping=None):
201
201
  # Add NTP server configuration (device-specific)
202
202
  _add_ntp_configuration(config, device)
203
203
 
204
+ # Add DNS server configuration (device-specific)
205
+ _add_dns_configuration(config, device)
206
+
204
207
  # Add VLAN configuration
205
208
  _add_vlan_configuration(config, vlan_info, netbox_interfaces, device)
206
209
 
@@ -694,18 +697,20 @@ def _determine_peer_type(local_device, connected_device, device_as_mapping=None)
694
697
  return "external" # Default to external on error
695
698
 
696
699
 
697
- def _get_ntp_server_for_device(device):
698
- """Get single NTP server IP for a SONiC device based on OOB connection to metalbox.
700
+ def _get_metalbox_ip_for_device(device):
701
+ """Get Metalbox IP for a SONiC device based on OOB connection.
699
702
 
700
703
  Returns the IP address of the metalbox device interface that is connected to the
701
704
  OOB switch. If VLANs are used, returns the IP of the VLAN interface where the
702
705
  SONiC switch management interface (eth0) has access.
703
706
 
707
+ This IP is used for both NTP and DNS services.
708
+
704
709
  Args:
705
710
  device: SONiC device object
706
711
 
707
712
  Returns:
708
- str: IP address of the NTP server or None if not found
713
+ str: IP address of the Metalbox or None if not found
709
714
  """
710
715
  try:
711
716
  # Get the OOB IP configuration for this SONiC device
@@ -726,7 +731,7 @@ def _get_ntp_server_for_device(device):
726
731
  metalbox_devices = utils.nb.dcim.devices.filter(role="metalbox")
727
732
 
728
733
  for metalbox in metalbox_devices:
729
- logger.debug(f"Checking metalbox device {metalbox.name} for NTP server")
734
+ logger.debug(f"Checking metalbox device {metalbox.name} for services")
730
735
 
731
736
  # Get all interfaces on this metalbox
732
737
  interfaces = utils.nb.dcim.interfaces.filter(device_id=metalbox.id)
@@ -765,7 +770,7 @@ def _get_ntp_server_for_device(device):
765
770
  else "interface"
766
771
  )
767
772
  logger.info(
768
- f"Found NTP server {ip_only} on metalbox {metalbox.name} "
773
+ f"Found Metalbox {ip_only} on {metalbox.name} "
769
774
  f"{interface_type} {interface.name} for SONiC device {device.name}"
770
775
  )
771
776
  return ip_only
@@ -773,11 +778,11 @@ def _get_ntp_server_for_device(device):
773
778
  # Skip non-IPv4 addresses
774
779
  continue
775
780
 
776
- logger.warning(f"No suitable NTP server found for SONiC device {device.name}")
781
+ logger.warning(f"No suitable Metalbox found for SONiC device {device.name}")
777
782
  return None
778
783
 
779
784
  except Exception as e:
780
- logger.warning(f"Could not determine NTP server for device {device.name}: {e}")
785
+ logger.warning(f"Could not determine Metalbox IP for device {device.name}: {e}")
781
786
  return None
782
787
 
783
788
 
@@ -846,19 +851,17 @@ def _add_ntp_configuration(config, device):
846
851
  metalbox device interface connected to the OOB switch.
847
852
  """
848
853
  try:
849
- # Get the specific NTP server for this device
850
- ntp_server_ip = _get_ntp_server_for_device(device)
854
+ # Get the Metalbox IP for this device
855
+ metalbox_ip = _get_metalbox_ip_for_device(device)
851
856
 
852
- if ntp_server_ip:
857
+ if metalbox_ip:
853
858
  # Add single NTP server configuration
854
- config["NTP_SERVER"][ntp_server_ip] = {
859
+ config["NTP_SERVER"][metalbox_ip] = {
855
860
  "maxpoll": "10",
856
861
  "minpoll": "6",
857
862
  "prefer": "false",
858
863
  }
859
- logger.info(
860
- f"Added NTP server {ntp_server_ip} to SONiC device {device.name}"
861
- )
864
+ logger.info(f"Added NTP server {metalbox_ip} to SONiC device {device.name}")
862
865
  else:
863
866
  logger.warning(f"No NTP server found for SONiC device {device.name}")
864
867
 
@@ -873,6 +876,27 @@ def clear_ntp_cache():
873
876
  logger.debug("Cleared NTP servers cache")
874
877
 
875
878
 
879
+ def _add_dns_configuration(config, device):
880
+ """Add DNS_NAMESERVER configuration to device config.
881
+
882
+ Each SONiC switch gets exactly one DNS server - the IP address of the
883
+ metalbox device interface connected to the OOB switch.
884
+ """
885
+ try:
886
+ # Get the Metalbox IP for this device
887
+ metalbox_ip = _get_metalbox_ip_for_device(device)
888
+
889
+ if metalbox_ip:
890
+ # Add single DNS server configuration
891
+ config["DNS_NAMESERVER"][metalbox_ip] = {}
892
+ logger.info(f"Added DNS server {metalbox_ip} to SONiC device {device.name}")
893
+ else:
894
+ logger.warning(f"No DNS server found for SONiC device {device.name}")
895
+
896
+ except Exception as e:
897
+ logger.warning(f"Could not add DNS configuration to device {device.name}: {e}")
898
+
899
+
876
900
  def clear_all_caches():
877
901
  """Clear all caches in config_generator module."""
878
902
  clear_ntp_cache()
osism/tasks/netbox.py CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  from celery import Celery
4
4
  from loguru import logger
5
- from pottery import Redlock
6
5
 
7
6
  from osism import settings, utils
8
7
  from osism.tasks import Config, run_command
@@ -30,9 +29,8 @@ def run(self, action, arguments):
30
29
  def set_maintenance(self, device_name, state=True):
31
30
  """Set the maintenance state for a device in the NetBox."""
32
31
 
33
- lock = Redlock(
32
+ lock = utils.create_redlock(
34
33
  key=f"lock_osism_tasks_netbox_set_maintenance_{device_name}",
35
- masters={utils.redis},
36
34
  auto_release_time=60,
37
35
  )
38
36
  if lock.acquire(timeout=20):
@@ -59,9 +57,8 @@ def set_maintenance(self, device_name, state=True):
59
57
  def set_provision_state(self, device_name, state):
60
58
  """Set the provision state for a device in the NetBox."""
61
59
 
62
- lock = Redlock(
60
+ lock = utils.create_redlock(
63
61
  key=f"lock_osism_tasks_netbox_set_provision_state_{device_name}",
64
- masters={utils.redis},
65
62
  auto_release_time=60,
66
63
  )
67
64
  if lock.acquire(timeout=20):
@@ -89,9 +86,8 @@ def set_provision_state(self, device_name, state):
89
86
  def set_power_state(self, device_name, state):
90
87
  """Set the provision state for a device in the NetBox."""
91
88
 
92
- lock = Redlock(
89
+ lock = utils.create_redlock(
93
90
  key=f"lock_osism_tasks_netbox_set_provision_state_{device_name}",
94
- masters={utils.redis},
95
91
  auto_release_time=60,
96
92
  )
97
93
  if lock.acquire(timeout=20):
osism/tasks/reconciler.py CHANGED
@@ -6,7 +6,6 @@ import subprocess
6
6
 
7
7
  from celery import Celery
8
8
  from loguru import logger
9
- from pottery import Redlock
10
9
 
11
10
  from osism import settings, utils
12
11
  from osism.tasks import Config
@@ -17,9 +16,8 @@ app.config_from_object(Config)
17
16
 
18
17
  @app.on_after_configure.connect
19
18
  def setup_periodic_tasks(sender, **kwargs):
20
- lock = Redlock(
19
+ lock = utils.create_redlock(
21
20
  key="lock_osism_tasks_reconciler_setup_periodic_tasks",
22
- masters={utils.redis},
23
21
  )
24
22
  if settings.INVENTORY_RECONCILER_SCHEDULE > 0 and lock.acquire(timeout=10):
25
23
  sender.add_periodic_task(
@@ -29,9 +27,8 @@ def setup_periodic_tasks(sender, **kwargs):
29
27
 
30
28
  @app.task(bind=True, name="osism.tasks.reconciler.run")
31
29
  def run(self, publish=True, flush_cache=False):
32
- lock = Redlock(
30
+ lock = utils.create_redlock(
33
31
  key="lock_osism_tasks_reconciler_run",
34
- masters={utils.redis},
35
32
  auto_release_time=60,
36
33
  )
37
34
 
@@ -64,9 +61,8 @@ def run(self, publish=True, flush_cache=False):
64
61
 
65
62
  @app.task(bind=True, name="osism.tasks.reconciler.run_on_change")
66
63
  def run_on_change(self):
67
- lock = Redlock(
64
+ lock = utils.create_redlock(
68
65
  key="lock_osism_tasks_reconciler_run_on_change",
69
- masters={utils.redis},
70
66
  auto_release_time=60,
71
67
  )
72
68
 
osism/utils/__init__.py CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  import time
4
4
  import os
5
+ from contextlib import redirect_stdout, redirect_stderr
5
6
  from cryptography.fernet import Fernet
6
7
  import keystoneauth1
7
8
  from loguru import logger
8
9
  import openstack
9
10
  import pynetbox
11
+ from pottery import Redlock
10
12
  from redis import Redis
11
13
  import urllib3
12
14
  import yaml
@@ -181,3 +183,29 @@ def finish_task_output(task_id, rc=None):
181
183
  if rc:
182
184
  redis.xadd(task_id, {"type": "rc", "content": rc})
183
185
  redis.xadd(task_id, {"type": "action", "content": "quit"})
186
+
187
+
188
+ def create_redlock(key, auto_release_time=3600):
189
+ """
190
+ Create a Redlock instance with output suppression during initialization.
191
+
192
+ Args:
193
+ key (str): The lock key
194
+ auto_release_time (int): Auto release time in seconds (default: 3600)
195
+
196
+ Returns:
197
+ Redlock: The configured Redlock instance
198
+ """
199
+ import logging
200
+
201
+ # Permanently suppress pottery logger output
202
+ pottery_logger = logging.getLogger("pottery")
203
+ pottery_logger.setLevel(logging.CRITICAL)
204
+
205
+ with open(os.devnull, "w") as devnull:
206
+ with redirect_stdout(devnull), redirect_stderr(devnull):
207
+ return Redlock(
208
+ key=key,
209
+ masters={redis},
210
+ auto_release_time=auto_release_time,
211
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20250701.0
3
+ Version: 0.20250709.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.14
35
+ Requires-Dist: fastapi==0.116.0
36
36
  Requires-Dist: flower==2.0.1
37
37
  Requires-Dist: hiredis==3.2.1
38
38
  Requires-Dist: jc==1.25.5
@@ -52,7 +52,7 @@ Requires-Dist: setuptools==80.9.0
52
52
  Requires-Dist: sqlmodel==0.0.24
53
53
  Requires-Dist: sushy==5.6.0
54
54
  Requires-Dist: tabulate==0.9.0
55
- Requires-Dist: transitions==0.9.2
55
+ Requires-Dist: transitions==0.9.3
56
56
  Requires-Dist: uvicorn[standard]==0.35.0
57
57
  Requires-Dist: validators==0.35.0
58
58
  Requires-Dist: watchdog==6.0.0
@@ -1,6 +1,6 @@
1
1
  osism/__init__.py,sha256=1UiNTBus0V0f2AbZQzAtVtu6zkfCCrw0OTq--NwFAqY,341
2
2
  osism/__main__.py,sha256=ILe4gu61xEISiBsxanqTQIdSkV-YhpZXTRlguCYyssk,141
3
- osism/api.py,sha256=3kEfPJtPwuWD8luDNnEFRx3nEsUY5AeWnmjd4A5ii-A,11079
3
+ osism/api.py,sha256=7BKVedr3aK8QSRf4ZI1WpraYivibimx-SqVKVAzD6bw,11070
4
4
  osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
5
5
  osism/settings.py,sha256=IUbUo8kru8TeiMAnnil5oHwd8SqbkPCY401dVONMygo,1885
6
6
  osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
@@ -13,7 +13,7 @@ osism/commands/console.py,sha256=8BPz1hio5Wi6kONVAWFuSqkDRrMcLEYeFIY8dbtN6e4,321
13
13
  osism/commands/container.py,sha256=Fku2GaCM3Idq_FxExUtNqjrEM0XYjpVvXmueSVO8S_c,1601
14
14
  osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
15
15
  osism/commands/log.py,sha256=2IpYuosC7FZwwLvM8HmKSU1NRNIelVVYzqjjVMCrOJk,4072
16
- osism/commands/manage.py,sha256=uzfmt3R0PJ4HxUw_V945pN0FbKb3zhyiBuD9br1ORYE,23149
16
+ osism/commands/manage.py,sha256=FaO9dbYjNHYanS98-zC498bx26oU8E3loxCczH9mfKI,12751
17
17
  osism/commands/netbox.py,sha256=e65P0kWrjTLw2T9HZthxjDTIRa-KAHgSSJAlvVef7n4,7345
18
18
  osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
19
19
  osism/commands/reconciler.py,sha256=ubQfX8j13s3NuMKnT0Lt6O-szf7Z1V02AfsMQFHmO74,2209
@@ -21,6 +21,7 @@ osism/commands/redfish.py,sha256=oBfxd5UBX4ED8XulEuIYziIYQqTvUKpKfcdGyg_AoiI,843
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
+ osism/commands/sonic.py,sha256=siuYUIlLfNuCKe9BLZ_9Pj2FkzcUCxusBOyaFnwiIF0,35303
24
25
  osism/commands/status.py,sha256=X-Rcj-XuNPDBoxsGkf96NswwpmTognxz1V6E2NX2ZgY,1997
25
26
  osism/commands/sync.py,sha256=jOg-g8NmVOkXBI6rOuiOx2WgUJc1PplLAAAwc0VuIfw,1919
26
27
  osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
@@ -34,37 +35,37 @@ osism/data/enums.py,sha256=gItIjOK6xWuOZSkMxpMdYLRyt4ezyhzkqA7BGiah2o0,10030
34
35
  osism/data/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
35
36
  osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
36
37
  osism/services/listener.py,sha256=Vf8LOZkHzlspm40BZ1az3o1O_ar34_i6C83p-D8KzzM,9783
37
- osism/tasks/__init__.py,sha256=kocG0q2bARhkkSjMBH2xWdFUIJodesdh5qVsV_DqZmE,7148
38
- osism/tasks/ansible.py,sha256=_2zrHwynwwEv9nDnX-LbNCzcwy9dTUGo_yyutt34HyQ,1346
38
+ osism/tasks/__init__.py,sha256=XZhUQLamrS0ikRkYNCxv-H8KQ0I51Uda7fq6botVpXo,6998
39
+ osism/tasks/ansible.py,sha256=-gUe6uZFhPLI3DGZHlpQlghuDKpp4Drn5IEctlV6Sv8,1300
39
40
  osism/tasks/ceph.py,sha256=eIQkah3Kj4INtOkF9kTjHbXJ3_J2lg48EWJKfHc-UYw,615
40
41
  osism/tasks/conductor.py,sha256=WBLsoPtr0iGUzRGERs0Xt7CMYrnHQVEwNV9qXBssI3s,274
41
42
  osism/tasks/kolla.py,sha256=wJQpWn_01iWLkr7l7T7RNrQGfRgsgmYi4WQlTmNGvew,618
42
43
  osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
43
- osism/tasks/netbox.py,sha256=g0gL5QImiRTHqixRxze7LfNqPth7cXqLzVWQDUJLDjE,5928
44
+ osism/tasks/netbox.py,sha256=QGQGz3s0V8WvPvhEJWwo0H24aLFaZrSl-voN-axzRwY,5846
44
45
  osism/tasks/openstack.py,sha256=g15tCll5vP1pC6ysxRCTZxplsdGmXbxaCH3k1Qdv5Xg,6367
45
- osism/tasks/reconciler.py,sha256=phbSV6urILqq9mHGMYDFwSfx8bLZmldwgEi8sMWs8RA,2040
46
+ osism/tasks/reconciler.py,sha256=PnGWfvfmomzbgddvyCdxul-z5ZLXxWAmrQyRCN874-s,1958
46
47
  osism/tasks/conductor/__init__.py,sha256=HW8CXpZOQ6aNgLZ3Ck08YcfQfueoA0ce35Kolh0rWww,1903
47
48
  osism/tasks/conductor/config.py,sha256=tMI0dtEFSWxfueRZdvocpbEq0sIN_PnXG08CuATkPz4,4489
48
- osism/tasks/conductor/ironic.py,sha256=Gx9LuWNMIMae4a3cVFKsTR4Hm_sr4jLf-JO9QBPSYcg,15402
49
+ osism/tasks/conductor/ironic.py,sha256=LyUm9xk1oqjarRona2UVodMO7clIt2sqtiW76elqEak,15352
49
50
  osism/tasks/conductor/netbox.py,sha256=5Nc7wrriDOtSuru1KDLt9QpA54vC7tXDPB2J0JP9GKo,11393
50
51
  osism/tasks/conductor/redfish.py,sha256=hOOS-_l3Qmo_6vLsgjZmJwTxLTf029hhFRVkU0TMLL0,12723
51
52
  osism/tasks/conductor/utils.py,sha256=ZSbQumQr-uL-B9XOwbsscLIX7czJHu6Mq0t_poRpMsw,7769
52
53
  osism/tasks/conductor/sonic/__init__.py,sha256=oxTTl_MGK4iWK9uNDRNlULtGrDGCQHrlJZ04weh_Lh8,777
53
54
  osism/tasks/conductor/sonic/bgp.py,sha256=PC6gGI5bCj2PCXcNGyMV9-EdlJWDsYaodzxigmYSZvw,3088
54
55
  osism/tasks/conductor/sonic/cache.py,sha256=Asv2k3nLJejuq7iB0a_LyK8dEmJzypP9v3OHkNY3GwI,3438
55
- osism/tasks/conductor/sonic/config_generator.py,sha256=Fww6uOC7DplhsqR_jW9PHPB0pAAY1AiTGeNAQ2BUN4k,39259
56
+ osism/tasks/conductor/sonic/config_generator.py,sha256=_B001d6YdhLjAl61WGhlF2xyMXvcyJv0TQ16zuzJjB8,40117
56
57
  osism/tasks/conductor/sonic/connections.py,sha256=NvRjwJv3NF3ry5Xe9qHzk7pQbfDQHYx_j3ATRMUs7gA,14244
57
58
  osism/tasks/conductor/sonic/constants.py,sha256=HjVFwmH-AN3np1qN97ahEAcwz2-4cHa-pA9pXWqWsqs,2219
58
59
  osism/tasks/conductor/sonic/device.py,sha256=ZYJA0bQ8waKWStzWUPxbcwNWa2Z_hMB3pqs8aA_nxXA,2458
59
60
  osism/tasks/conductor/sonic/exporter.py,sha256=25L1vbi84ZQD0xNHNTWk-anTz5QRkGJskCECBkeGQw4,8882
60
61
  osism/tasks/conductor/sonic/interface.py,sha256=318wOwXYSSMKTPP2WSZIps-JvIkCQ2gYdQs9ZYHXwwg,38957
61
62
  osism/tasks/conductor/sonic/sync.py,sha256=fpgsQVwq6Hb7eeDHhLkAqx5BkaK3Ce_m_WvmWEsJyOo,9182
62
- osism/utils/__init__.py,sha256=gN5VtLJfrvyn6_snuTte7YR-vDygkpbORopIV8qSEsA,6064
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,,
63
+ osism/utils/__init__.py,sha256=cMKOYH8mg9PXnIDoSume1KF3OpELhHWhKYL8ScY0_EY,6903
64
+ osism-0.20250709.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
65
+ osism-0.20250709.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
66
+ osism-0.20250709.0.dist-info/METADATA,sha256=yodBqt4lzfRfMB1-pdlKX7shsBBy67vdP4Zl8xfHa_c,2937
67
+ osism-0.20250709.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
68
+ osism-0.20250709.0.dist-info/entry_points.txt,sha256=NlvBIfH7JWQ5xhjcYQeCpQKpP_3RjXxJIW1XK8oYhmk,3802
69
+ osism-0.20250709.0.dist-info/pbr.json,sha256=ux-nCNhP6rA-LJ8vLyJsdbbHawfvybH88tJFSPLDB6Q,47
70
+ osism-0.20250709.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
71
+ osism-0.20250709.0.dist-info/RECORD,,
@@ -46,7 +46,6 @@ manage netbox = osism.commands.netbox:Manage
46
46
  manage redfish list = osism.commands.redfish:List
47
47
  manage server list = osism.commands.server:ServerList
48
48
  manage server migrate = osism.commands.server:ServerMigrate
49
- 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
@@ -58,6 +57,15 @@ service = osism.commands.service:Run
58
57
  set bootstrap = osism.commands.set:Bootstrap
59
58
  set maintenance = osism.commands.set:Maintenance
60
59
  set vault password = osism.commands.vault:SetPassword
60
+ sonic backup = osism.commands.sonic:Backup
61
+ sonic console = osism.commands.sonic:Console
62
+ sonic load = osism.commands.sonic:Load
63
+ sonic reboot = osism.commands.sonic:Reboot
64
+ sonic reload = osism.commands.sonic:Reload
65
+ sonic reset = osism.commands.sonic:Reset
66
+ sonic show = osism.commands.sonic:Show
67
+ sonic sync = osism.commands.sync:Sonic
68
+ sonic ztp = osism.commands.sonic:Ztp
61
69
  sync configuration = osism.commands.configuration:Sync
62
70
  sync dnsmasq = osism.commands.manage:Dnsmasq
63
71
  sync facts = osism.commands.sync:Facts
@@ -0,0 +1 @@
1
+ {"git_version": "ed8c436", "is_release": false}
@@ -1 +0,0 @@
1
- {"git_version": "87129c8", "is_release": false}