osism 0.20250314.0__py3-none-any.whl → 0.20250326.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/commands/manage.py CHANGED
@@ -1,8 +1,6 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import os
4
3
  from re import findall
5
- import subprocess
6
4
  from urllib.parse import urljoin
7
5
 
8
6
  from cliff.command import Command
@@ -12,6 +10,7 @@ from loguru import logger
12
10
  import requests
13
11
 
14
12
  from osism.data import TEMPLATE_IMAGE_CLUSTERAPI, TEMPLATE_IMAGE_OCTAVIA
13
+ from osism.tasks import openstack, handle_task
15
14
 
16
15
  SUPPORTED_CLUSTERAPI_K8S_IMAGES = ["1.29", "1.30", "1.31"]
17
16
 
@@ -20,6 +19,12 @@ class ImageClusterapi(Command):
20
19
  def get_parser(self, prog_name):
21
20
  parser = super(ImageClusterapi, self).get_parser(prog_name)
22
21
 
22
+ parser.add_argument(
23
+ "--no-wait",
24
+ default=False,
25
+ help="Do not wait until image management has been completed",
26
+ action="store_true",
27
+ )
23
28
  parser.add_argument(
24
29
  "--base-url",
25
30
  type=str,
@@ -56,13 +61,14 @@ class ImageClusterapi(Command):
56
61
  cloud = parsed_args.cloud
57
62
  filter = parsed_args.filter
58
63
  tag = parsed_args.tag
64
+ wait = not parsed_args.no_wait
59
65
 
60
66
  if filter:
61
67
  supported_cluterapi_k8s_images = [filter]
62
68
  else:
63
69
  supported_cluterapi_k8s_images = SUPPORTED_CLUSTERAPI_K8S_IMAGES
64
70
 
65
- os.makedirs("/tmp/clusterapi", exist_ok=True)
71
+ result = []
66
72
  for kubernetes_release in supported_cluterapi_k8s_images:
67
73
  url = urljoin(base_url, f"last-{kubernetes_release}")
68
74
 
@@ -84,18 +90,18 @@ class ImageClusterapi(Command):
84
90
  logger.info(f"checksum: {splitted_checksum[0]}")
85
91
 
86
92
  template = Template(TEMPLATE_IMAGE_CLUSTERAPI)
87
- result = template.render(
88
- image_url=url,
89
- image_checksum=f"sha256:{splitted_checksum[0]}",
90
- image_version=r[0].strip(),
91
- image_builddate=splitted[0],
93
+ result.extend(
94
+ [
95
+ template.render(
96
+ image_url=url,
97
+ image_checksum=f"sha256:{splitted_checksum[0]}",
98
+ image_version=r[0].strip(),
99
+ image_builddate=splitted[0],
100
+ )
101
+ ]
92
102
  )
93
- with open(f"/tmp/clusterapi/k8s-{kubernetes_release}.yml", "w+") as fp:
94
- fp.write(result)
95
103
 
96
104
  args = [
97
- "openstack-image-manager",
98
- "--images=/tmp/clusterapi",
99
105
  "--cloud",
100
106
  cloud,
101
107
  "--filter",
@@ -105,15 +111,32 @@ class ImageClusterapi(Command):
105
111
  args.extend(["--tag", tag])
106
112
  if parsed_args.dry_run:
107
113
  args.append("--dry-run")
108
- subprocess.call(args)
114
+
115
+ task_signature = openstack.image_manager.si(*args, configs=result)
116
+ task = task_signature.apply_async()
117
+ if wait:
118
+ logger.info(
119
+ f"It takes a moment until task {task.task_id} (image-manager) has been started and output is visible here."
120
+ )
121
+
122
+ return handle_task(task, wait, format="script", timeout=3600)
109
123
 
110
124
 
111
125
  class ImageOctavia(Command):
112
126
  def get_parser(self, prog_name):
113
127
  parser = super(ImageOctavia, self).get_parser(prog_name)
128
+ parser.add_argument(
129
+ "--no-wait",
130
+ default=False,
131
+ help="Do not wait until image management has been completed",
132
+ action="store_true",
133
+ )
114
134
 
115
135
  parser.add_argument(
116
- "--cloud", type=str, help="Cloud name in clouds.yaml", default="openstack"
136
+ "--cloud",
137
+ type=str,
138
+ help="Cloud name in clouds.yaml (will be overruled by OS_AUTH_URL envvar)",
139
+ default="octavia",
117
140
  )
118
141
  parser.add_argument(
119
142
  "--base-url",
@@ -124,6 +147,7 @@ class ImageOctavia(Command):
124
147
  return parser
125
148
 
126
149
  def take_action(self, parsed_args):
150
+ wait = not parsed_args.no_wait
127
151
  cloud = parsed_args.cloud
128
152
  base_url = parsed_args.base_url
129
153
 
@@ -147,21 +171,31 @@ class ImageOctavia(Command):
147
171
  logger.info(f"checksum: {splitted_checksum[0]}")
148
172
 
149
173
  template = Template(TEMPLATE_IMAGE_OCTAVIA)
150
- result = template.render(
151
- image_url=url,
152
- image_checksum=f"sha256:{splitted_checksum[0]}",
153
- image_version=splitted[0],
154
- image_builddate=splitted[0],
174
+ result = []
175
+ result.extend(
176
+ [
177
+ template.render(
178
+ image_url=url,
179
+ image_checksum=f"sha256:{splitted_checksum[0]}",
180
+ image_version=splitted[0],
181
+ image_builddate=splitted[0],
182
+ )
183
+ ]
155
184
  )
185
+ arguments = [
186
+ "--cloud",
187
+ cloud,
188
+ "--deactivate",
189
+ ]
156
190
 
157
- os.makedirs("/tmp/octavia", exist_ok=True)
158
- with open("/tmp/octavia/octavia.yml", "w+") as fp:
159
- fp.write(result)
191
+ task_signature = openstack.image_manager.si(*arguments, configs=result)
192
+ task = task_signature.apply_async()
193
+ if wait:
194
+ logger.info(
195
+ f"It takes a moment until task {task.task_id} (image-manager) has been started and output is visible here."
196
+ )
160
197
 
161
- subprocess.call(
162
- "/usr/local/bin/openstack-image-manager --images=/tmp/octavia --cloud octavia --deactivate",
163
- shell=True,
164
- )
198
+ return handle_task(task, wait, format="script", timeout=3600)
165
199
 
166
200
 
167
201
  class Images(Command):
@@ -173,6 +207,12 @@ class Images(Command):
173
207
  # to typer. Then openstack-image-manager can simply be included directly at this
174
208
  # point.
175
209
 
210
+ parser.add_argument(
211
+ "--no-wait",
212
+ default=False,
213
+ help="Do not wait until image management has been completed",
214
+ action="store_true",
215
+ )
176
216
  parser.add_argument(
177
217
  "--dry-run",
178
218
  default=False,
@@ -185,6 +225,12 @@ class Images(Command):
185
225
  help="Hide images that should be deleted",
186
226
  action="store_true",
187
227
  )
228
+ parser.add_argument(
229
+ "--delete",
230
+ default=False,
231
+ help="Delete images that should be deleted",
232
+ action="store_true",
233
+ )
188
234
  parser.add_argument(
189
235
  "--latest",
190
236
  default=False,
@@ -210,35 +256,39 @@ class Images(Command):
210
256
  return parser
211
257
 
212
258
  def take_action(self, parsed_args):
213
- cloud = parsed_args.cloud
214
- dry_run = parsed_args.dry_run
215
- filter = parsed_args.filter
216
- hide = parsed_args.hide
217
- latest = parsed_args.latest
218
- images = parsed_args.images
259
+ wait = not parsed_args.no_wait
219
260
 
220
261
  arguments = []
221
- if cloud:
222
- arguments.append(f"--cloud '{cloud}'")
223
- if filter:
224
- arguments.append(f"--filter '{filter}'")
225
- if dry_run:
262
+ if parsed_args.cloud:
263
+ arguments.append("--cloud")
264
+ arguments.append(parsed_args.cloud)
265
+ if parsed_args.filter:
266
+ arguments.append("--filter")
267
+ arguments.append(parsed_args.filter)
268
+ if parsed_args.delete:
269
+ arguments.append("--delete")
270
+ arguments.append("--yes-i-really-know-what-i-do")
271
+ if parsed_args.dry_run:
226
272
  arguments.append("--dry-run")
227
- if latest:
273
+ if parsed_args.latest:
228
274
  arguments.append("--latest")
229
- if hide:
275
+ if parsed_args.hide:
230
276
  arguments.append("--hide")
231
277
 
232
- if images:
233
- arguments.append(f"--images '{images}'")
278
+ arguments.append("--images")
279
+ if parsed_args.images:
280
+ arguments.append(parsed_args.images)
234
281
  else:
235
- arguments.append("--images /etc/images")
282
+ arguments.append("/etc/images")
236
283
 
237
- joined_arguments = " ".join(arguments)
238
- subprocess.call(
239
- f"/usr/local/bin/openstack-image-manager {joined_arguments}",
240
- shell=True,
241
- )
284
+ task_signature = openstack.image_manager.si(*arguments)
285
+ task = task_signature.apply_async()
286
+ if wait:
287
+ logger.info(
288
+ f"It takes a moment until task {task.task_id} (image-manager) has been started and output is visible here."
289
+ )
290
+
291
+ return handle_task(task, wait, format="script", timeout=3600)
242
292
 
243
293
 
244
294
  class Flavors(Command):
@@ -250,6 +300,12 @@ class Flavors(Command):
250
300
  # to typer. Then openstack-flavor-manager can simply be included directly at this
251
301
  # point.
252
302
 
303
+ parser.add_argument(
304
+ "--no-wait",
305
+ default=False,
306
+ help="Do not wait until flavor management has been completed",
307
+ action="store_true",
308
+ )
253
309
  parser.add_argument(
254
310
  "--cloud", type=str, help="Cloud name in clouds.yaml", default="admin"
255
311
  )
@@ -276,23 +332,29 @@ class Flavors(Command):
276
332
  return parser
277
333
 
278
334
  def take_action(self, parsed_args):
335
+ wait = not parsed_args.no_wait
279
336
  cloud = parsed_args.cloud
280
337
  name = parsed_args.name
281
338
  recommended = parsed_args.recommended
282
339
  url = parsed_args.url
283
340
 
284
- arguments = [f"--name '{name}'"]
341
+ arguments = ["--name", name]
285
342
  if cloud:
286
- arguments.append(f"--cloud '{cloud}'")
343
+ arguments.append("--cloud")
344
+ arguments.append(cloud)
287
345
 
288
346
  if recommended:
289
347
  arguments.append("--recommended")
290
348
 
291
349
  if url:
292
- arguments.append(f"--url '{url}'")
350
+ arguments.append("--url")
351
+ arguments.append(url)
352
+
353
+ task_signature = openstack.flavor_manager.si(*arguments)
354
+ task = task_signature.apply_async()
355
+ if wait:
356
+ logger.info(
357
+ f"It takes a moment until task {task.task_id} (flavor-manager) has been started and output is visible here."
358
+ )
293
359
 
294
- joined_arguments = " ".join(arguments)
295
- subprocess.call(
296
- f"/usr/local/bin/openstack-flavor-manager {joined_arguments}",
297
- shell=True,
298
- )
360
+ return handle_task(task, wait, format="script", timeout=3600)
osism/commands/netbox.py CHANGED
@@ -1,7 +1,5 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import argparse
4
-
5
3
  from cliff.command import Command
6
4
  from loguru import logger
7
5
  from redis import Redis
@@ -14,24 +12,6 @@ redis = Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=settings.RE
14
12
  redis.ping()
15
13
 
16
14
 
17
- class Run(Command):
18
- def get_parser(self, prog_name):
19
- parser = super(Run, self).get_parser(prog_name)
20
- parser.add_argument(
21
- "arguments", nargs=argparse.REMAINDER, help="Other arguments for Ansible"
22
- )
23
- parser.add_argument(
24
- "--no-wait",
25
- default=False,
26
- help="Do not wait until the role has been applied",
27
- action="store_true",
28
- )
29
- return parser
30
-
31
- def take_action(self, parsed_args):
32
- pass
33
-
34
-
35
15
  class Ironic(Command):
36
16
  def get_parser(self, prog_name):
37
17
  parser = super(Ironic, self).get_parser(prog_name)
@@ -89,6 +69,12 @@ class Manage(Command):
89
69
  help="Do not wait for the netbox API to be ready",
90
70
  action="store_true",
91
71
  )
72
+ parser.add_argument(
73
+ "--parallel",
74
+ type=str,
75
+ default=None,
76
+ help="Process up to n files in parallel",
77
+ )
92
78
  parser.add_argument(
93
79
  "--limit",
94
80
  type=str,
@@ -124,8 +110,13 @@ class Manage(Command):
124
110
  else:
125
111
  arguments.append("--wait")
126
112
 
113
+ if parsed_args.parallel:
114
+ arguments.append("--parallel")
115
+ arguments.append(parsed_args.parallel)
116
+
127
117
  if parsed_args.limit:
128
- arguments.append("--limit {parsed_args.limit}")
118
+ arguments.append("--limit")
119
+ arguments.append(parsed_args.limit)
129
120
 
130
121
  if parsed_args.skipdtl:
131
122
  arguments.append("--skipdtl")
osism/tasks/ansible.py CHANGED
@@ -1,25 +1,10 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import functools
4
- from threading import RLock
5
-
6
3
  from celery import Celery
7
- import kombu.utils
8
4
 
9
5
  from osism import settings
10
6
  from osism.tasks import Config, run_ansible_in_environment
11
7
 
12
- # https://github.com/celery/kombu/issues/1804
13
- if not getattr(kombu.utils.cached_property, "lock", None):
14
- setattr(
15
- kombu.utils.cached_property,
16
- "lock",
17
- functools.cached_property(lambda _: RLock()),
18
- )
19
- # Must call __set_name__ here since this cached property is not defined in the context of a class
20
- # Refer to https://docs.python.org/3/reference/datamodel.html#object.__set_name__
21
- kombu.utils.cached_property.lock.__set_name__(kombu.utils.cached_property, "lock")
22
-
23
8
  app = Celery("ansible")
24
9
  app.config_from_object(Config)
25
10
 
osism/tasks/openstack.py CHANGED
@@ -1,34 +1,21 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import functools
4
3
  import copy
5
4
  import ipaddress
6
- from threading import RLock
7
5
 
8
6
  from celery import Celery
9
7
  from celery.signals import worker_process_init
10
8
  import jinja2
11
9
  import keystoneauth1
12
- import kombu.utils
13
10
  import openstack
14
11
  from pottery import Redlock
15
12
  from redis import Redis
13
+ import tempfile
16
14
 
17
15
  from osism import settings
18
- from osism.tasks import Config, conductor, netbox
16
+ from osism.tasks import Config, conductor, netbox, run_command
19
17
  from osism import utils
20
18
 
21
- # https://github.com/celery/kombu/issues/1804
22
- if not getattr(kombu.utils.cached_property, "lock", None):
23
- setattr(
24
- kombu.utils.cached_property,
25
- "lock",
26
- functools.cached_property(lambda _: RLock()),
27
- )
28
- # Must call __set_name__ here since this cached property is not defined in the context of a class
29
- # Refer to https://docs.python.org/3/reference/datamodel.html#object.__set_name__
30
- kombu.utils.cached_property.lock.__set_name__(kombu.utils.cached_property, "lock")
31
-
32
19
  app = Celery("openstack")
33
20
  app.config_from_object(Config)
34
21
 
@@ -267,3 +254,65 @@ def baremetal_create_internal_flavor(self, node):
267
254
  def baremetal_delete_internal_flavor(self, node):
268
255
  flavor = conn.compute.get_flavor(f"osism-{node}")
269
256
  conn.compute.delete_flavor(flavor)
257
+
258
+
259
+ @app.task(bind=True, name="osism.tasks.openstack.image_manager")
260
+ def image_manager(
261
+ self, *arguments, configs=None, publish=True, locking=False, auto_release_time=3600
262
+ ):
263
+ command = "/usr/local/bin/openstack-image-manager"
264
+ if configs:
265
+ with tempfile.TemporaryDirectory() as temp_dir:
266
+ for config in configs:
267
+ with tempfile.NamedTemporaryFile(
268
+ mode="w+", suffix=".yml", dir=temp_dir, delete=False
269
+ ) as temp_file:
270
+ temp_file.write(config)
271
+
272
+ sanitized_args = [
273
+ arg for arg in arguments if not arg.startswith("--images=")
274
+ ]
275
+
276
+ try:
277
+ images_index = sanitized_args.index("--images")
278
+ sanitized_args.pop(images_index)
279
+ sanitized_args.pop(images_index)
280
+ except ValueError:
281
+ pass
282
+ sanitized_args.extend(["--images", temp_dir])
283
+ rc = run_command(
284
+ self.request.id,
285
+ command,
286
+ {},
287
+ *sanitized_args,
288
+ publish=publish,
289
+ locking=locking,
290
+ auto_release_time=auto_release_time,
291
+ )
292
+ return rc
293
+ else:
294
+ return run_command(
295
+ self.request.id,
296
+ command,
297
+ {},
298
+ *arguments,
299
+ publish=publish,
300
+ locking=locking,
301
+ auto_release_time=auto_release_time,
302
+ )
303
+
304
+
305
+ @app.task(bind=True, name="osism.tasks.openstack.flavor_manager")
306
+ def flavor_manager(
307
+ self, *arguments, publish=True, locking=False, auto_release_time=3600
308
+ ):
309
+ command = "/usr/local/bin/openstack-flavor-manager"
310
+ return run_command(
311
+ self.request.id,
312
+ command,
313
+ {},
314
+ *arguments,
315
+ publish=publish,
316
+ locking=locking,
317
+ auto_release_time=auto_release_time,
318
+ )
osism/tasks/reconciler.py CHANGED
@@ -1,32 +1,16 @@
1
1
  # SPDX-License-Identifier: Apache-2.0
2
2
 
3
- import functools
4
3
  import io
5
4
  import subprocess
6
- from threading import RLock
7
5
 
8
6
  from celery import Celery
9
7
  from celery.signals import worker_process_init
10
- import kombu.utils
11
8
  from loguru import logger
12
9
  from pottery import Redlock
13
10
  from redis import Redis
14
-
15
11
  from osism import settings
16
12
  from osism.tasks import Config
17
13
 
18
-
19
- # https://github.com/celery/kombu/issues/1804
20
- if not getattr(kombu.utils.cached_property, "lock", None):
21
- setattr(
22
- kombu.utils.cached_property,
23
- "lock",
24
- functools.cached_property(lambda _: RLock()),
25
- )
26
- # Must call __set_name__ here since this cached property is not defined in the context of a class
27
- # Refer to https://docs.python.org/3/reference/datamodel.html#object.__set_name__
28
- kombu.utils.cached_property.lock.__set_name__(kombu.utils.cached_property, "lock")
29
-
30
14
  app = Celery("reconciler")
31
15
  app.config_from_object(Config)
32
16
 
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20250314.0
3
+ Version: 0.20250326.0
4
4
  Summary: OSISM manager interface
5
5
  Home-page: https://github.com/osism/python-osism
6
6
  Author: OSISM GmbH
@@ -29,28 +29,28 @@ Requires-Dist: PyYAML==6.0.2
29
29
  Requires-Dist: ara==1.7.2
30
30
  Requires-Dist: celery[redis]==5.4.0
31
31
  Requires-Dist: cliff==4.9.1
32
- Requires-Dist: deepdiff==8.3.0
32
+ Requires-Dist: deepdiff==8.4.2
33
33
  Requires-Dist: docker==7.1.0
34
34
  Requires-Dist: dtrack-auditor==1.5.0
35
- Requires-Dist: fastapi==0.115.11
35
+ Requires-Dist: fastapi==0.115.12
36
36
  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.0
40
+ Requires-Dist: kombu==5.5.1
41
41
  Requires-Dist: kubernetes==32.0.1
42
42
  Requires-Dist: loguru==0.7.3
43
43
  Requires-Dist: netmiko==4.5.0
44
44
  Requires-Dist: nornir-ansible==2023.12.28
45
45
  Requires-Dist: nornir==3.5.0
46
46
  Requires-Dist: openstacksdk==4.4.0
47
- Requires-Dist: pottery==3.0.0
47
+ 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
51
  Requires-Dist: pytest-testinfra==10.1.1
52
52
  Requires-Dist: python-dateutil==2.9.0.post0
53
- Requires-Dist: setuptools==76.0.0
53
+ Requires-Dist: setuptools==78.1.0
54
54
  Requires-Dist: sqlmodel==0.0.24
55
55
  Requires-Dist: sushy==5.5.0
56
56
  Requires-Dist: tabulate==0.9.0
@@ -58,8 +58,8 @@ Requires-Dist: transitions==0.9.2
58
58
  Requires-Dist: uvicorn[standard]==0.34.0
59
59
  Requires-Dist: watchdog==6.0.0
60
60
  Provides-Extra: ansible
61
- Requires-Dist: ansible-runner==2.4.0; extra == "ansible"
62
- Requires-Dist: ansible-core==2.18.3; extra == "ansible"
61
+ Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
62
+ Requires-Dist: ansible-core==2.18.4; extra == "ansible"
63
63
  Provides-Extra: openstack-image-manager
64
64
  Requires-Dist: openstack-image-manager==0.20250314.0; extra == "openstack-image-manager"
65
65
  Dynamic: author
@@ -67,6 +67,7 @@ Dynamic: author-email
67
67
  Dynamic: classifier
68
68
  Dynamic: description
69
69
  Dynamic: home-page
70
+ Dynamic: license-file
70
71
  Dynamic: requires-dist
71
72
  Dynamic: requires-python
72
73
  Dynamic: summary
@@ -15,8 +15,8 @@ osism/commands/console.py,sha256=8BPz1hio5Wi6kONVAWFuSqkDRrMcLEYeFIY8dbtN6e4,321
15
15
  osism/commands/container.py,sha256=Fku2GaCM3Idq_FxExUtNqjrEM0XYjpVvXmueSVO8S_c,1601
16
16
  osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
17
17
  osism/commands/log.py,sha256=2IpYuosC7FZwwLvM8HmKSU1NRNIelVVYzqjjVMCrOJk,4072
18
- osism/commands/manage.py,sha256=HGU1VPU7rBJ2oYfaAbg2IzjRjOYatVNRv1gUUDFgEqk,9690
19
- osism/commands/netbox.py,sha256=OJiNAdMObIt2ffc7C80eLRjwqZmD4lgidQ8I8VWtF8s,4900
18
+ osism/commands/manage.py,sha256=SDJyH3zwdaOjVWURIIjm8WMo6zSor1Y_TiTYgeMt4pI,11932
19
+ osism/commands/netbox.py,sha256=DMAgP9o9AUjw1Cf3MLjSQ36vr5NckGKIsAPNQictboc,4702
20
20
  osism/commands/noset.py,sha256=7zDFuFMyNpo7DUOKcNiYV8nodtdMOYFp5LDPcuJhlZ8,1481
21
21
  osism/commands/reconciler.py,sha256=Ja_b86gX6-_Pr3DmrUUvskmEnnJpHQ-XJNQLycMJeyc,2818
22
22
  osism/commands/server.py,sha256=zFXRdYoj4ZNDJNPSaGddMPEWxt8G2GyMomPOcCOaN3c,4137
@@ -38,20 +38,20 @@ osism/plugins/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
38
38
  osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
39
39
  osism/services/listener.py,sha256=JjCdwPG5U9b_xYDpGFQeiLPP4y00GM3Me6NW1tt6Jws,11275
40
40
  osism/tasks/__init__.py,sha256=qZQGMeaaeUN9CUBqVXGEx2pvDZpDJbhudq0jl4-7GRU,9111
41
- osism/tasks/ansible.py,sha256=0c5nY1M0jf_9Me8HMP2Je_Ibjii4rFm-5HW8tmE6aos,1681
41
+ osism/tasks/ansible.py,sha256=RcLxLrjzL5_X6OjNHm3H0lZlmKKlYKIANB0M4_d4chE,1109
42
42
  osism/tasks/ceph.py,sha256=eIQkah3Kj4INtOkF9kTjHbXJ3_J2lg48EWJKfHc-UYw,615
43
43
  osism/tasks/conductor.py,sha256=g9ulqWlGim0DjwQkVgW8Tl8MsXBGuukuQvM12CXbEmM,3892
44
44
  osism/tasks/kolla.py,sha256=wJQpWn_01iWLkr7l7T7RNrQGfRgsgmYi4WQlTmNGvew,618
45
45
  osism/tasks/kubernetes.py,sha256=VzXq_VrYU_CLm4cOruqnE3Kq2ydfO9glZ3p0bp3OYoc,625
46
46
  osism/tasks/netbox.py,sha256=yR8z6VYkNXmNCsHzxP6KGmPtGW5mbpLks8XEw6TUwjk,4692
47
- osism/tasks/openstack.py,sha256=i9dIVz9RPVC38gIhUPIE0oq8Wj2ppf9bHrHLTrsjaJ8,9098
48
- osism/tasks/reconciler.py,sha256=RpepZtRgBgYTwmAkfuT9kIaxU1ITDb8SFalMoShdRNQ,3547
47
+ osism/tasks/openstack.py,sha256=RkP1K-UhD3yJea1YD9cPyc5IWEvS-E8L6CCAiJlEpf8,10463
48
+ osism/tasks/reconciler.py,sha256=q_J825nw8haIcYS-FME5oWlaiSPmDbAGeB6NK6Vj00w,2974
49
49
  osism/utils/__init__.py,sha256=5yng8l5Jd6GhNO4FNi6iYH4569UuTYAynamANgZnm1E,1258
50
- osism-0.20250314.0.dist-info/AUTHORS,sha256=DJIRsjyrFxKjFvmpUNDRDBS04nRiJ5B6FpKcDcfnoGM,36
51
- osism-0.20250314.0.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
52
- osism-0.20250314.0.dist-info/METADATA,sha256=9Yv6LRSN9ZDCXQN5U4KpHrZZK7j7hW4NIJcP11nKO58,2950
53
- osism-0.20250314.0.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
54
- osism-0.20250314.0.dist-info/entry_points.txt,sha256=8yx03jRhfk45lMfGV8t4tZ2Xp95puuj8LEnx9Ogjefc,3050
55
- osism-0.20250314.0.dist-info/pbr.json,sha256=Wlz72FgMvVrweUm0EjV2XpPxCiO9BCUCpb61UvKTyBc,47
56
- osism-0.20250314.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
57
- osism-0.20250314.0.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -40,7 +40,6 @@ manage netbox = osism.commands.netbox:Manage
40
40
  manage server list = osism.commands.server:ServerList
41
41
  manage server migrate = osism.commands.server:ServerMigrate
42
42
  manage volume list = osism.commands.volume:VolumeList
43
- netbox = osism.commands.netbox:Run
44
43
  netbox ping = osism.commands.netbox:Ping
45
44
  netbox sync = osism.commands.netbox:Sync
46
45
  netbox sync ironic = osism.commands.netbox:Ironic
@@ -0,0 +1 @@
1
+ renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
@@ -0,0 +1 @@
1
+ {"git_version": "908ac32", "is_release": false}
@@ -1 +0,0 @@
1
- janhorstmann <horstmann@osism.tech>
@@ -1 +0,0 @@
1
- {"git_version": "73a2ae0", "is_release": false}