osism 0.20250326.0__py3-none-any.whl → 0.20250407.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/openstack.py CHANGED
@@ -1,47 +1,14 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import copy
4
- import ipaddress
5
-
6
3
  from celery import Celery
7
- from celery.signals import worker_process_init
8
- import jinja2
9
- import keystoneauth1
10
- import openstack
11
- from pottery import Redlock
12
- from redis import Redis
13
4
  import tempfile
14
5
 
15
- from osism import settings
16
- from osism.tasks import Config, conductor, netbox, run_command
17
6
  from osism import utils
7
+ from osism.tasks import Config, run_command
18
8
 
19
9
  app = Celery("openstack")
20
10
  app.config_from_object(Config)
21
11
 
22
- redis = None
23
- conn = None
24
-
25
-
26
- @worker_process_init.connect
27
- def celery_init_worker(**kwargs):
28
- global conn
29
- global redis
30
-
31
- redis = Redis(
32
- host=settings.REDIS_HOST,
33
- port=settings.REDIS_PORT,
34
- db=settings.REDIS_DB,
35
- socket_keepalive=True,
36
- )
37
- redis.ping()
38
-
39
- # Parameters come from the environment, OS_*
40
- try:
41
- conn = openstack.connect()
42
- except keystoneauth1.exceptions.auth_plugins.MissingRequiredOptions:
43
- pass
44
-
45
12
 
46
13
  @app.on_after_configure.connect
47
14
  def setup_periodic_tasks(sender, **kwargs):
@@ -50,24 +17,54 @@ def setup_periodic_tasks(sender, **kwargs):
50
17
 
51
18
  @app.task(bind=True, name="osism.tasks.openstack.image_get")
52
19
  def image_get(self, image_name):
20
+ conn = utils.get_openstack_connection()
53
21
  result = conn.image.find_image(image_name)
54
- return result.id
22
+ return result
55
23
 
56
24
 
57
25
  @app.task(bind=True, name="osism.tasks.openstack.network_get")
58
26
  def network_get(self, network_name):
27
+ conn = utils.get_openstack_connection()
59
28
  result = conn.network.find_network(network_name)
60
- return result.id
29
+ return result
30
+
31
+
32
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_create")
33
+ def baremetal_node_create(self, node_name, attributes=None):
34
+ if attributes is None:
35
+ attributes = {}
36
+ attributes.update({"name": node_name})
37
+ conn = utils.get_openstack_connection()
38
+ result = conn.baremetal.create_node(**attributes)
39
+ return result
40
+
41
+
42
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_delete")
43
+ def baremetal_node_delete(self, node_or_id):
44
+ conn = utils.get_openstack_connection()
45
+ result = conn.baremetal.delete_node(node_or_id)
46
+ return result
47
+
48
+
49
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_update")
50
+ def baremetal_node_update(self, node_id_or_name, attributes=None):
51
+ if attributes is None:
52
+ attributes = {}
53
+ conn = utils.get_openstack_connection()
54
+ result = conn.baremetal.update_node(node_id_or_name, **attributes)
55
+ return result
61
56
 
62
57
 
63
58
  @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_show")
64
- def baremetal_node_show(self, node_id_or_name):
65
- result = conn.baremetal.find_node(node_id_or_name)
59
+ def baremetal_node_show(self, node_id_or_name, ignore_missing=False):
60
+ conn = utils.get_openstack_connection()
61
+ result = conn.baremetal.find_node(node_id_or_name, ignore_missing)
66
62
  return result
67
63
 
68
64
 
69
65
  @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_list")
70
66
  def baremetal_node_list(self):
67
+ conn = utils.get_openstack_connection()
71
68
  nodes = conn.baremetal.nodes()
72
69
  result = []
73
70
 
@@ -87,173 +84,97 @@ def baremetal_node_list(self):
87
84
  return result
88
85
 
89
86
 
90
- @app.task(
91
- bind=True, name="osism.tasks.openstack.baremetal_introspection_interface_list"
92
- )
93
- def baremetal_introspection_interface_list(self, node_id_or_name):
94
- pass
95
-
96
-
97
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_introspection_status")
98
- def baremetal_introspection_status(self, node_id_or_name):
99
- result = None
87
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_validate")
88
+ def baremetal_node_validate(self, node_id_or_name):
89
+ conn = utils.get_openstack_connection()
90
+ result = conn.baremetal.validate_node(node_id_or_name, required=())
100
91
  return result
101
92
 
102
93
 
103
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_get_network_interface_name")
104
- def baremetal_get_network_interface_name(self, node_name, mac_address):
105
- global conn
106
-
107
- introspection = conn.baremetal_introspection.get_introspection(node_name)
108
-
109
- # Wait up to 5 minutes for the completion of a running introspection
110
- conn.baremetal_introspection.wait_for_introspection(introspection, timeout=30)
111
-
112
- introspection_data = conn.baremetal_introspection.get_introspection_data(
113
- introspection
114
- )
115
- interfaces = introspection_data["inventory"]["interfaces"]
94
+ @app.task(
95
+ bind=True,
96
+ name="osism.tasks.openstack.baremetal_node_wait_for_nodes_provision_state",
97
+ )
98
+ def baremetal_node_wait_for_nodes_provision_state(self, node_id_or_name, state):
99
+ conn = utils.get_openstack_connection()
100
+ result = conn.baremetal.wait_for_nodes_provision_state([node_id_or_name], state)
101
+ if len(result) > 0:
102
+ return result[0]
103
+ else:
104
+ return None
116
105
 
117
- result = None
118
- for interface in interfaces:
119
- if interface["mac_address"].lower() == mac_address.lower():
120
- result = interface["name"]
121
106
 
107
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_node_set_provision_state")
108
+ def baremetal_node_set_provision_state(self, node, state):
109
+ conn = utils.get_openstack_connection()
110
+ result = conn.baremetal.set_node_provision_state(node, state)
122
111
  return result
123
112
 
124
113
 
125
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_set_node_provision_state")
126
- def baremetal_set_node_provision_state(self, node, state):
127
- global conn
128
- conn.baremetal.set_node_provision_state(node, state)
129
-
114
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_port_list")
115
+ def baremetal_port_list(self, details=False, attributes=None):
116
+ if attributes is None:
117
+ attributes = {}
118
+ conn = utils.get_openstack_connection()
119
+ result = conn.baremetal.ports(details=details, **attributes)
120
+ return list(result)
130
121
 
131
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_create_allocations")
132
- def baremetal_create_allocations(self, nodes):
133
- global conn
134
-
135
- for node in nodes:
136
- try:
137
- allocation_a = conn.baremetal.get_allocation(allocation=node)
138
- except openstack.exceptions.ResourceNotFound:
139
- allocation_a = None
140
-
141
- if not allocation_a:
142
- # Get Ironic parameters from the conductor
143
- task = conductor.get_ironic_parameters.delay()
144
- task.wait(timeout=None, interval=0.5)
145
- ironic_parameters = task.get()
146
-
147
- allocation_a = conn.baremetal.create_allocation(
148
- name=node,
149
- candidate_nodes=[node],
150
- resource_class=ironic_parameters["resource_class"],
151
- )
152
- conn.baremetal.wait_for_allocation(allocation=node, timeout=30)
153
122
 
123
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_port_create")
124
+ def baremetal_port_create(self, attributes=None):
125
+ if attributes is None:
126
+ attributes = {}
127
+ conn = utils.get_openstack_connection()
128
+ result = conn.baremetal.create_port(**attributes)
129
+ return result
154
130
 
155
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_create_nodes")
156
- def baremetal_create_nodes(self, nodes, ironic_parameters):
157
- global conn
158
-
159
- for node in nodes:
160
- # TODO: Filter on mgmt_only
161
- address_a = utils.nb.ipam.ip_addresses.get(device=node, interface="Ethernet0")
162
-
163
- node_parameters = copy.deepcopy(ironic_parameters)
164
-
165
- if node_parameters["driver"] == "redfish":
166
- remote_board_address = str(ipaddress.ip_interface(address_a["address"]).ip)
167
- t = jinja2.Environment(loader=jinja2.BaseLoader()).from_string(
168
- node_parameters["driver_info"]["redfish_address"]
169
- )
170
- node_parameters["driver_info"]["redfish_address"] = t.render(
171
- remote_board_address=remote_board_address
172
- )
173
-
174
- elif node_parameters["driver"] == "ipmi":
175
- remote_board_address = str(ipaddress.ip_interface(address_a["address"]).ip)
176
- t = jinja2.Environment(loader=jinja2.BaseLoader()).from_string(
177
- node_parameters["driver_info"]["ipmi_address"]
178
- )
179
- node_parameters["driver_info"]["ipmi_address"] = t.render(
180
- remote_board_address=remote_board_address
181
- )
182
131
 
183
- try:
184
- device_a = utils.nb.dcim.devices.get(name=node)
185
- tags = [str(tag) for tag in device_a.tags]
132
+ @app.task(bind=True, name="osism.tasks.openstack.baremetal_port_delete")
133
+ def baremetal_port_delete(self, port_or_id):
134
+ conn = utils.get_openstack_connection()
135
+ result = conn.baremetal.delete_port(port_or_id)
136
+ return result
186
137
 
187
- # NOTE: Internally used nodes are identified by their unique name via the resource class.
188
- # The actual resource class is explicitly overwritten.
189
- if "Managed by Ironic" in tags and "Managed by OSISM" in tags:
190
- node_parameters["resource_class"] = f"osism-{node}"
191
- baremetal_create_internal_flavor(node)
192
138
 
193
- conn.baremetal.create_node(
194
- name=node, provision_state="manageable", **node_parameters
195
- )
196
- conn.baremetal.wait_for_nodes_provision_state([node], "manageable")
139
+ @app.task(bind=True, name="osism.tasks.openstack.compute_flavor_get")
140
+ def compute_flavor_get(self, name_or_id):
141
+ conn = utils.get_openstack_connection()
142
+ result = conn.compute.find_flavor(
143
+ name_or_id, ignore_missing=True, get_extra_specs=True
144
+ )
145
+ return result
197
146
 
198
- if "Managed by Ironic" in tags and "Managed by OSISM" not in tags:
199
- conn.baremetal.set_node_traits(node, ["CUSTOM_GENERAL_USE"])
200
- elif "Managed by Ironic" in tags and "Managed by OSISM" in tags:
201
- conn.baremetal.set_node_traits(node, ["CUSTOM_OSISM_USE"])
202
147
 
203
- conn.baremetal.set_node_provision_state(node, "inspect")
148
+ @app.task(bind=True, name="osism.tasks.openstack.compute_flavor_create")
149
+ def compute_flavor_create(self, name, attributes=None):
150
+ if attributes is None:
151
+ attributes = {}
152
+ attributes.update({"name": name})
153
+ extra_specs = attributes.pop("extra_specs", None)
154
+ conn = utils.get_openstack_connection()
155
+ flavor = conn.compute.create_flavor(**attributes)
156
+ if extra_specs:
157
+ flavor = conn.compute.create_flavor_extra_specs(flavor, extra_specs)
158
+ return flavor
204
159
 
205
- # TODO: Check if the system has been registered correctly
206
- device_a.custom_fields = {
207
- "ironic_state": "registered",
208
- }
209
- device_a.save()
210
-
211
- except openstack.exceptions.ResourceFailure:
212
- # TODO: Do something useful here
213
- pass
214
- except openstack.exceptions.ConflictException:
215
- # The node already exists and has a wronge state in the Netbox
216
- device_a = utils.nb.dcim.devices.get(name=node)
217
- device_a.custom_fields = {
218
- "ironic_state": "registered",
219
- }
220
- device_a.save()
221
160
 
161
+ @app.task(bind=True, name="osism.tasks.openstack.compute_flavor_delete")
162
+ def compute_flavor_delete(self, flavor):
163
+ conn = utils.get_openstack_connection()
164
+ conn.compute.delete_flavor(flavor, ignore_missing=True)
222
165
 
223
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_check_allocations")
224
- def baremetal_check_allocations(self):
225
- lock = Redlock(
226
- key="lock_osism_tasks_openstack_baremetal_check_allocations",
227
- masters={redis},
228
- auto_release_time=60,
229
- )
230
166
 
231
- if lock.acquire(timeout=20):
232
- netbox.get_devices_that_should_have_an_allocation_in_ironic.apply_async(
233
- (), link=baremetal_create_allocations.s()
234
- )
235
- lock.release()
167
+ @app.task(bind=True, name="osism.tasks.openstack.compute_flavor_update_extra_specs")
168
+ def compute_flavor_update_extra_specs(self, flavor, extra_specs={}):
169
+ conn = utils.get_openstack_connection()
170
+ for key, value in extra_specs.items():
171
+ conn.compute.update_flavor_extra_specs_property(flavor, key, value)
236
172
 
237
173
 
238
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_create_internal_flavor")
239
- def baremetal_create_internal_flavor(self, node):
240
- flavor_a = conn.compute.create_flavor(
241
- name=f"osism-{node}", ram=1, vcpus=1, disk=1, is_public=False
242
- )
243
- specs = {
244
- f"resources:CUSTOM_RESOURCE_CLASS_OSISM_{node.upper()}": 1,
245
- "resources:VCPU": 0,
246
- "resources:MEMORY_MB": 0,
247
- "resources:DISK_GB": 0,
248
- "trait:CUSTOM_OSISM_USE": "required",
249
- }
250
- conn.compute.create_flavor_extra_specs(flavor_a, specs)
251
-
252
-
253
- @app.task(bind=True, name="osism.tasks.openstack.baremetal_delete_internal_flavor")
254
- def baremetal_delete_internal_flavor(self, node):
255
- flavor = conn.compute.get_flavor(f"osism-{node}")
256
- conn.compute.delete_flavor(flavor)
174
+ @app.task(bind=True, name="osism.tasks.openstack.compute_flavor_delete_extra_specs")
175
+ def compute_flavor_delete_extra_specs_property(self, flavor, prop):
176
+ conn = utils.get_openstack_connection()
177
+ conn.compute.delete_flavor_extra_specs_property(flavor, prop)
257
178
 
258
179
 
259
180
  @app.task(bind=True, name="osism.tasks.openstack.image_manager")
osism/tasks/reconciler.py CHANGED
@@ -4,31 +4,14 @@ import io
4
4
  import subprocess
5
5
 
6
6
  from celery import Celery
7
- from celery.signals import worker_process_init
8
7
  from loguru import logger
9
8
  from pottery import Redlock
10
- from redis import Redis
11
- from osism import settings
9
+ from osism import settings, utils
12
10
  from osism.tasks import Config
13
11
 
14
12
  app = Celery("reconciler")
15
13
  app.config_from_object(Config)
16
14
 
17
- redis = None
18
-
19
-
20
- @worker_process_init.connect
21
- def celery_init_worker(**kwargs):
22
- global redis
23
-
24
- redis = Redis(
25
- host=settings.REDIS_HOST,
26
- port=settings.REDIS_PORT,
27
- db=settings.REDIS_DB,
28
- socket_keepalive=True,
29
- )
30
- redis.ping()
31
-
32
15
 
33
16
  @app.on_after_configure.connect
34
17
  def setup_periodic_tasks(sender, **kwargs):
@@ -40,7 +23,9 @@ def setup_periodic_tasks(sender, **kwargs):
40
23
  @app.task(bind=True, name="osism.tasks.reconciler.run")
41
24
  def run(self, publish=True):
42
25
  lock = Redlock(
43
- key="lock_osism_tasks_reconciler_run", masters={redis}, auto_release_time=60
26
+ key="lock_osism_tasks_reconciler_run",
27
+ masters={utils.redis},
28
+ auto_release_time=60,
44
29
  )
45
30
 
46
31
  if lock.acquire(timeout=20):
@@ -51,13 +36,13 @@ def run(self, publish=True):
51
36
 
52
37
  for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
53
38
  if publish:
54
- redis.xadd(self.request.id, {"type": "stdout", "content": line})
39
+ utils.redis.xadd(self.request.id, {"type": "stdout", "content": line})
55
40
 
56
41
  rc = p.wait(timeout=60)
57
42
 
58
43
  if publish:
59
- redis.xadd(self.request.id, {"type": "rc", "content": rc})
60
- redis.xadd(self.request.id, {"type": "action", "content": "quit"})
44
+ utils.redis.xadd(self.request.id, {"type": "rc", "content": rc})
45
+ utils.redis.xadd(self.request.id, {"type": "action", "content": "quit"})
61
46
 
62
47
  lock.release()
63
48
 
@@ -66,7 +51,7 @@ def run(self, publish=True):
66
51
  def run_on_change(self):
67
52
  lock = Redlock(
68
53
  key="lock_osism_tasks_reconciler_run_on_change",
69
- masters={redis},
54
+ masters={utils.redis},
70
55
  auto_release_time=60,
71
56
  )
72
57
 
@@ -84,7 +69,7 @@ def run_on_change(self):
84
69
  def sync_inventory_with_netbox(self):
85
70
  lock = Redlock(
86
71
  key="lock_osism_tasks_reconciler_sync_inventory_with_netbox",
87
- masters={redis},
72
+ masters={utils.redis},
88
73
  auto_release_time=60,
89
74
  )
90
75
 
@@ -98,13 +83,13 @@ def sync_inventory_with_netbox(self):
98
83
 
99
84
  for line in io.TextIOWrapper(p.stdout, encoding="utf-8"):
100
85
  # NOTE: use task_id or request_id in future
101
- redis.publish(
86
+ utils.redis.publish(
102
87
  "netbox-sync-inventory-with-netbox", {"type": "stdout", "content": line}
103
88
  )
104
89
 
105
90
  lock.release()
106
91
 
107
92
  # NOTE: use task_id or request_id in future
108
- redis.publish(
93
+ utils.redis.publish(
109
94
  "netbox-sync-inventory-with-netbox", {"type": "action", "content": "quit"}
110
95
  )
osism/utils/__init__.py CHANGED
@@ -1,5 +1,7 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
+ import keystoneauth1
4
+ import openstack
3
5
  import pynetbox
4
6
  from redis import Redis
5
7
  import urllib3
@@ -29,6 +31,15 @@ else:
29
31
  nb = None
30
32
 
31
33
 
34
+ def get_openstack_connection():
35
+ try:
36
+ conn = openstack.connect()
37
+ except keystoneauth1.exceptions.auth_plugins.MissingRequiredOptions:
38
+ pass
39
+
40
+ return conn
41
+
42
+
32
43
  # https://stackoverflow.com/questions/2361426/get-the-first-item-from-an-iterable-that-matches-a-condition
33
44
  def first(iterable, condition=lambda x: True):
34
45
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20250326.0
3
+ Version: 0.20250407.0
4
4
  Summary: OSISM manager interface
5
5
  Home-page: https://github.com/osism/python-osism
6
6
  Author: OSISM GmbH
@@ -27,7 +27,7 @@ Requires-Dist: GitPython==3.1.44
27
27
  Requires-Dist: Jinja2==3.1.6
28
28
  Requires-Dist: PyYAML==6.0.2
29
29
  Requires-Dist: ara==1.7.2
30
- Requires-Dist: celery[redis]==5.4.0
30
+ Requires-Dist: celery[redis]==5.5.0
31
31
  Requires-Dist: cliff==4.9.1
32
32
  Requires-Dist: deepdiff==8.4.2
33
33
  Requires-Dist: docker==7.1.0
@@ -37,7 +37,7 @@ Requires-Dist: flower==2.0.1
37
37
  Requires-Dist: hiredis==3.1.0
38
38
  Requires-Dist: jc==1.25.4
39
39
  Requires-Dist: keystoneauth1==5.10.0
40
- Requires-Dist: kombu==5.5.1
40
+ Requires-Dist: kombu==5.5.2
41
41
  Requires-Dist: kubernetes==32.0.1
42
42
  Requires-Dist: loguru==0.7.3
43
43
  Requires-Dist: netmiko==4.5.0
@@ -48,7 +48,7 @@ Requires-Dist: pottery==3.0.1
48
48
  Requires-Dist: prompt-toolkit==3.0.50
49
49
  Requires-Dist: pydantic==1.10.21
50
50
  Requires-Dist: pynetbox==7.4.1
51
- Requires-Dist: pytest-testinfra==10.1.1
51
+ Requires-Dist: pytest-testinfra==10.2.2
52
52
  Requires-Dist: python-dateutil==2.9.0.post0
53
53
  Requires-Dist: setuptools==78.1.0
54
54
  Requires-Dist: sqlmodel==0.0.24
@@ -61,7 +61,7 @@ Provides-Extra: ansible
61
61
  Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
62
62
  Requires-Dist: ansible-core==2.18.4; extra == "ansible"
63
63
  Provides-Extra: openstack-image-manager
64
- Requires-Dist: openstack-image-manager==0.20250314.0; extra == "openstack-image-manager"
64
+ Requires-Dist: openstack-image-manager==0.20250407.0; extra == "openstack-image-manager"
65
65
  Dynamic: author
66
66
  Dynamic: author-email
67
67
  Dynamic: classifier
@@ -1,11 +1,9 @@
1
1
  osism/__init__.py,sha256=1UiNTBus0V0f2AbZQzAtVtu6zkfCCrw0OTq--NwFAqY,341
2
2
  osism/__main__.py,sha256=ILe4gu61xEISiBsxanqTQIdSkV-YhpZXTRlguCYyssk,141
3
- osism/api.py,sha256=X3IVLWbKMtfozJ5sEx6sLEZ1rD4U9s3uNnLLwxiwDjs,4802
3
+ osism/api.py,sha256=Lvkdd92tvv9RtoMs9RtvqsN3DiSKPdSll24J3wRzbBY,4793
4
4
  osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
5
5
  osism/settings.py,sha256=m__DltxKQo5D-vDKKwY8RNBVs5bverYdJmtyVyln_6o,1049
6
6
  osism/actions/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
7
- osism/actions/manage_device.py,sha256=joQwPnwEUw5V1ZRRbdrM0FjfNlG4vPNc0r8FBRTOJiA,3541
8
- osism/actions/manage_interface.py,sha256=iDp7zY16XXtwdLk1sxa-TBAkpdPxmtbVeEvMZuP5h4s,472
9
7
  osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
10
8
  osism/commands/apply.py,sha256=n3lLb1cS3GahQqRT0723di98hg47MjVzDzkAoeZX7qU,16780
11
9
  osism/commands/compose.py,sha256=iqzG7mS9E1VWaLNN6yQowjOqiHn3BMdj-yfXb3Dc4Ok,1200
@@ -15,8 +13,8 @@ osism/commands/console.py,sha256=8BPz1hio5Wi6kONVAWFuSqkDRrMcLEYeFIY8dbtN6e4,321
15
13
  osism/commands/container.py,sha256=Fku2GaCM3Idq_FxExUtNqjrEM0XYjpVvXmueSVO8S_c,1601
16
14
  osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
17
15
  osism/commands/log.py,sha256=2IpYuosC7FZwwLvM8HmKSU1NRNIelVVYzqjjVMCrOJk,4072
18
- osism/commands/manage.py,sha256=SDJyH3zwdaOjVWURIIjm8WMo6zSor1Y_TiTYgeMt4pI,11932
19
- osism/commands/netbox.py,sha256=DMAgP9o9AUjw1Cf3MLjSQ36vr5NckGKIsAPNQictboc,4702
16
+ osism/commands/manage.py,sha256=E0ZF4Bf91cgttkSVt1dOQ4nQbRUSDAgsgPOjJMDsGBk,11932
17
+ osism/commands/netbox.py,sha256=_2-j6XM9JvH0DXnbct6rG9T6hT8KEpm3vazQC28Rt7I,4529
20
18
  osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
21
19
  osism/commands/reconciler.py,sha256=Ja_b86gX6-_Pr3DmrUUvskmEnnJpHQ-XJNQLycMJeyc,2818
22
20
  osism/commands/server.py,sha256=zFXRdYoj4ZNDJNPSaGddMPEWxt8G2GyMomPOcCOaN3c,4137
@@ -28,30 +26,30 @@ osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
28
26
  osism/commands/validate.py,sha256=hIQB0zk4xIBZJORtBp_tWrXTRKKhB2qi6j-mznDxKR4,4191
29
27
  osism/commands/vault.py,sha256=Ip0IMR7zaBkPbLJenXr4ZwxM6FnozZ9wn9rwHmFHo8s,1818
30
28
  osism/commands/volume.py,sha256=SqD9pYgtcYnMu6sB2pG8lfrLHRq6GzOb_-RkWOOVZPo,3156
31
- osism/commands/wait.py,sha256=LFs0xuA4VXTfVw_BXiZB2rPfb33B8orFdpxJdtwMTKA,6857
29
+ osism/commands/wait.py,sha256=mKFDqEXcaLlKw1T3MuBEZpNh7CeL3lpUXgubD2_f8es,6580
32
30
  osism/commands/worker.py,sha256=iraCOEhCp7WgfjfZ0-12XQYQPUjpi9rSJK5Z9JfNJk4,1651
33
31
  osism/core/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
34
- osism/core/enums.py,sha256=kfETfN2_gH6Rv_dYoqX1AafI_3F-y87N3Gajsyd0EQo,9568
32
+ osism/core/enums.py,sha256=ldH2wM0mea7oHBSCrxEyCqkjH_R2kc8wmdI2J9eb6sM,9952
35
33
  osism/core/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
36
34
  osism/data/__init__.py,sha256=izXdh0J3vPLQI7kBhJI7ibJQzPqU_nlONP0L4Cf_k6A,1504
37
35
  osism/plugins/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
38
36
  osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
39
- osism/services/listener.py,sha256=JjCdwPG5U9b_xYDpGFQeiLPP4y00GM3Me6NW1tt6Jws,11275
40
- osism/tasks/__init__.py,sha256=qZQGMeaaeUN9CUBqVXGEx2pvDZpDJbhudq0jl4-7GRU,9111
37
+ osism/services/listener.py,sha256=eEamlQsJqCuU9K2QFmk3yM9LAJZEanVcTLtGMsNCKjs,9783
38
+ osism/tasks/__init__.py,sha256=lrSkcZtbzhWsLS4hWadKfpP_tCd1pX1IhvrBU3EhKmM,8605
41
39
  osism/tasks/ansible.py,sha256=RcLxLrjzL5_X6OjNHm3H0lZlmKKlYKIANB0M4_d4chE,1109
42
40
  osism/tasks/ceph.py,sha256=eIQkah3Kj4INtOkF9kTjHbXJ3_J2lg48EWJKfHc-UYw,615
43
- osism/tasks/conductor.py,sha256=g9ulqWlGim0DjwQkVgW8Tl8MsXBGuukuQvM12CXbEmM,3892
41
+ osism/tasks/conductor.py,sha256=Qg4ic9j5khHGumXCRaosrDiphs4-Eqk02BCb78zuTkM,19162
44
42
  osism/tasks/kolla.py,sha256=wJQpWn_01iWLkr7l7T7RNrQGfRgsgmYi4WQlTmNGvew,618
45
43
  osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
46
- osism/tasks/netbox.py,sha256=yR8z6VYkNXmNCsHzxP6KGmPtGW5mbpLks8XEw6TUwjk,4692
47
- osism/tasks/openstack.py,sha256=RkP1K-UhD3yJea1YD9cPyc5IWEvS-E8L6CCAiJlEpf8,10463
48
- osism/tasks/reconciler.py,sha256=q_J825nw8haIcYS-FME5oWlaiSPmDbAGeB6NK6Vj00w,2974
49
- osism/utils/__init__.py,sha256=5yng8l5Jd6GhNO4FNi6iYH4569UuTYAynamANgZnm1E,1258
50
- osism-0.20250326.0.dist-info/licenses/AUTHORS,sha256=EKFIR9F27AvoEXp1cA6FkGbjEOFt4Rcbipr5RJc7jSs,64
51
- osism-0.20250326.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
52
- osism-0.20250326.0.dist-info/METADATA,sha256=7k0X9KTHpjfEgTKYV-Rw3biNu57oWLwLlEXT5EtG2vE,2972
53
- osism-0.20250326.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
54
- osism-0.20250326.0.dist-info/entry_points.txt,sha256=DlfrvU14rI55WuTrwNRoce9FY3ric4HeZKZx_Z3NzCw,3015
55
- osism-0.20250326.0.dist-info/pbr.json,sha256=i-cyCN-68l6O9MTObxxZqkRCTq2ElZumvNW_esL1WmI,47
56
- osism-0.20250326.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
57
- osism-0.20250326.0.dist-info/RECORD,,
44
+ osism/tasks/netbox.py,sha256=qT3-0GWDPCnejLGAhNp7InMSxBTk7qmKwfdNn1in3FM,4857
45
+ osism/tasks/openstack.py,sha256=ZFdgudp02a9I4AiJae2Pu0_k9REYi4P7wTLA5rzx8is,7825
46
+ osism/tasks/reconciler.py,sha256=RGUcax2gDuyVLw1nGRQn5izXclnPBo9MRl0ndLDiiYQ,2707
47
+ osism/utils/__init__.py,sha256=DP2D7xyXnfWuH-c26elIwdwrMSY-oSkVsLFKsQfna9w,1477
48
+ osism-0.20250407.0.dist-info/licenses/AUTHORS,sha256=EKFIR9F27AvoEXp1cA6FkGbjEOFt4Rcbipr5RJc7jSs,64
49
+ osism-0.20250407.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
50
+ osism-0.20250407.0.dist-info/METADATA,sha256=TIDKl4LiJsyH7yJLztBxKbVc3BWnaKMdHxXRZ377Reg,2972
51
+ osism-0.20250407.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
52
+ osism-0.20250407.0.dist-info/entry_points.txt,sha256=DlfrvU14rI55WuTrwNRoce9FY3ric4HeZKZx_Z3NzCw,3015
53
+ osism-0.20250407.0.dist-info/pbr.json,sha256=7g2xfwKFA8HvM2aPcqC5h0SXZ_VjJYyEL03mJcdLU6A,47
54
+ osism-0.20250407.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
55
+ osism-0.20250407.0.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"git_version": "976a50a", "is_release": false}