osism 0.20251004.0__py3-none-any.whl → 0.20251012.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/server.py CHANGED
@@ -108,6 +108,18 @@ class ServerList(Command):
108
108
  parser.add_argument(
109
109
  "--project-domain", help="Domain of the project", type=str, default=None
110
110
  )
111
+ parser.add_argument(
112
+ "--user",
113
+ default=None,
114
+ type=str,
115
+ help="Only list servers for the given user (name or ID)",
116
+ )
117
+ parser.add_argument(
118
+ "--user-domain",
119
+ default=None,
120
+ type=str,
121
+ help="Domain the user belongs to (name or ID)",
122
+ )
111
123
  return parser
112
124
 
113
125
  def take_action(self, parsed_args):
@@ -115,8 +127,31 @@ class ServerList(Command):
115
127
  domain = parsed_args.domain
116
128
  project = parsed_args.project
117
129
  project_domain = parsed_args.project_domain
130
+ user = parsed_args.user
131
+ user_domain = parsed_args.user_domain
118
132
 
119
133
  result = []
134
+
135
+ # Handle user lookup if --user is specified
136
+ user_id = None
137
+ if user:
138
+ user_query = {}
139
+
140
+ if user_domain:
141
+ u_d = conn.identity.find_domain(user_domain, ignore_missing=True)
142
+ if u_d and "id" in u_d:
143
+ user_query = dict(domain_id=u_d.id)
144
+ else:
145
+ logger.error(f"No domain found for {user_domain}")
146
+ return
147
+
148
+ u = conn.identity.find_user(user, ignore_missing=True, **user_query)
149
+ if u and "id" in u:
150
+ user_id = u.id
151
+ else:
152
+ logger.error(f"No user found for {user}")
153
+ return
154
+
120
155
  if domain:
121
156
  _domain = conn.identity.find_domain(domain)
122
157
  if not _domain:
@@ -131,6 +166,7 @@ class ServerList(Command):
131
166
  [
132
167
  project.name,
133
168
  project.id,
169
+ server.user_id if hasattr(server, "user_id") else None,
134
170
  server.id,
135
171
  server.name,
136
172
  server.flavor["original_name"],
@@ -141,7 +177,15 @@ class ServerList(Command):
141
177
  print(
142
178
  tabulate(
143
179
  result,
144
- headers=["Project", "Project ID", "ID", "Name", "Flavor", "Status"],
180
+ headers=[
181
+ "Project",
182
+ "Project ID",
183
+ "User ID",
184
+ "ID",
185
+ "Name",
186
+ "Flavor",
187
+ "Status",
188
+ ],
145
189
  tablefmt="psql",
146
190
  )
147
191
  )
@@ -161,9 +205,20 @@ class ServerList(Command):
161
205
  return
162
206
  query = {"project_id": _project.id}
163
207
 
208
+ # Get domain name from project
209
+ domain_name = None
210
+ if hasattr(_project, "domain_id") and _project.domain_id:
211
+ try:
212
+ _domain = conn.identity.get_domain(_project.domain_id)
213
+ domain_name = _domain.name if _domain else _project.domain_id
214
+ except Exception:
215
+ domain_name = _project.domain_id
216
+
164
217
  for server in conn.compute.servers(all_projects=True, **query):
165
218
  result.append(
166
219
  [
220
+ domain_name,
221
+ server.user_id if hasattr(server, "user_id") else None,
167
222
  server.id,
168
223
  server.name,
169
224
  server.flavor["original_name"],
@@ -174,7 +229,47 @@ class ServerList(Command):
174
229
  print(
175
230
  tabulate(
176
231
  result,
177
- headers=["ID", "Name", "Flavor", "Status"],
232
+ headers=["Domain", "User ID", "ID", "Name", "Flavor", "Status"],
233
+ tablefmt="psql",
234
+ )
235
+ )
236
+
237
+ elif user_id:
238
+ query = {"user_id": user_id}
239
+
240
+ for server in conn.compute.servers(all_projects=True, **query):
241
+ # Get domain name from project
242
+ domain_name = None
243
+ if hasattr(server, "project_id") and server.project_id:
244
+ try:
245
+ _project = conn.identity.get_project(server.project_id)
246
+ if (
247
+ _project
248
+ and hasattr(_project, "domain_id")
249
+ and _project.domain_id
250
+ ):
251
+ _domain = conn.identity.get_domain(_project.domain_id)
252
+ domain_name = (
253
+ _domain.name if _domain else _project.domain_id
254
+ )
255
+ except Exception:
256
+ domain_name = None
257
+
258
+ result.append(
259
+ [
260
+ domain_name,
261
+ server.project_id if hasattr(server, "project_id") else None,
262
+ server.id,
263
+ server.name,
264
+ server.flavor["original_name"],
265
+ server.status,
266
+ ]
267
+ )
268
+
269
+ print(
270
+ tabulate(
271
+ result,
272
+ headers=["Domain", "Project ID", "ID", "Name", "Flavor", "Status"],
178
273
  tablefmt="psql",
179
274
  )
180
275
  )
@@ -0,0 +1,213 @@
1
+ # SPDX-License-Identifier: Apache-2.0
2
+
3
+ import subprocess
4
+
5
+ from cliff.command import Command
6
+ from loguru import logger
7
+
8
+
9
+ class OpenStackStress(Command):
10
+ """Run OpenStack stress testing tool"""
11
+
12
+ def get_parser(self, prog_name):
13
+ parser = super(OpenStackStress, self).get_parser(prog_name)
14
+
15
+ # Boolean flags
16
+ parser.add_argument(
17
+ "--no-cleanup",
18
+ action="store_true",
19
+ help="Do not clean up resources after test",
20
+ )
21
+ parser.add_argument(
22
+ "--debug",
23
+ action="store_true",
24
+ help="Enable debug mode",
25
+ )
26
+ parser.add_argument(
27
+ "--no-delete",
28
+ action="store_true",
29
+ help="Do not delete resources",
30
+ )
31
+ parser.add_argument(
32
+ "--no-volume",
33
+ action="store_true",
34
+ help="Do not create volumes",
35
+ )
36
+ parser.add_argument(
37
+ "--no-boot-volume",
38
+ action="store_true",
39
+ help="Do not use boot volumes",
40
+ )
41
+ parser.add_argument(
42
+ "--no-wait",
43
+ action="store_true",
44
+ help="Do not wait for resources",
45
+ )
46
+
47
+ # Integer parameters with defaults
48
+ parser.add_argument(
49
+ "--interval",
50
+ type=int,
51
+ default=10,
52
+ help="Interval in seconds (default: %(default)s)",
53
+ )
54
+ parser.add_argument(
55
+ "--number",
56
+ type=int,
57
+ default=1,
58
+ help="Number of instances (default: %(default)s)",
59
+ )
60
+ parser.add_argument(
61
+ "--parallel",
62
+ type=int,
63
+ default=1,
64
+ help="Parallel operations (default: %(default)s)",
65
+ )
66
+ parser.add_argument(
67
+ "--timeout",
68
+ type=int,
69
+ default=600,
70
+ help="Timeout in seconds (default: %(default)s)",
71
+ )
72
+ parser.add_argument(
73
+ "--volume-number",
74
+ type=int,
75
+ default=1,
76
+ help="Number of volumes per instance (default: %(default)s)",
77
+ )
78
+ parser.add_argument(
79
+ "--volume-size",
80
+ type=int,
81
+ default=1,
82
+ help="Volume size in GB (default: %(default)s)",
83
+ )
84
+ parser.add_argument(
85
+ "--boot-volume-size",
86
+ type=int,
87
+ default=20,
88
+ help="Boot volume size in GB (default: %(default)s)",
89
+ )
90
+
91
+ # String parameters with defaults
92
+ parser.add_argument(
93
+ "--cloud",
94
+ type=str,
95
+ default="simple-stress",
96
+ help="Cloud name in clouds.yaml (default: %(default)s)",
97
+ )
98
+ parser.add_argument(
99
+ "--flavor",
100
+ type=str,
101
+ default="SCS-1V-2",
102
+ help="Flavor name (default: %(default)s)",
103
+ )
104
+ parser.add_argument(
105
+ "--image",
106
+ type=str,
107
+ default="Ubuntu 24.04",
108
+ help="Image name (default: %(default)s)",
109
+ )
110
+ parser.add_argument(
111
+ "--subnet-cidr",
112
+ type=str,
113
+ default="10.100.0.0/16",
114
+ help="Subnet CIDR (default: %(default)s)",
115
+ )
116
+ parser.add_argument(
117
+ "--prefix",
118
+ type=str,
119
+ default="simple-stress",
120
+ help="Resource name prefix (default: %(default)s)",
121
+ )
122
+ parser.add_argument(
123
+ "--compute-zone",
124
+ type=str,
125
+ default="nova",
126
+ help="Compute availability zone (default: %(default)s)",
127
+ )
128
+ parser.add_argument(
129
+ "--storage-zone",
130
+ type=str,
131
+ default="nova",
132
+ help="Storage availability zone (default: %(default)s)",
133
+ )
134
+ parser.add_argument(
135
+ "--affinity",
136
+ type=str,
137
+ default="soft-anti-affinity",
138
+ choices=[
139
+ "soft-affinity",
140
+ "soft-anti-affinity",
141
+ "affinity",
142
+ "anti-affinity",
143
+ ],
144
+ help="Server group policy (default: %(default)s)",
145
+ )
146
+ parser.add_argument(
147
+ "--volume-type",
148
+ type=str,
149
+ default="__DEFAULT__",
150
+ help="Volume type (default: %(default)s)",
151
+ )
152
+
153
+ return parser
154
+
155
+ def take_action(self, parsed_args):
156
+ """Execute the OpenStack stress testing tool"""
157
+
158
+ # Build the command
159
+ command = [
160
+ "python3",
161
+ "/openstack-simple-stress/openstack_simple_stress/main.py",
162
+ ]
163
+
164
+ # Add boolean flags
165
+ if parsed_args.no_cleanup:
166
+ command.append("--no-cleanup")
167
+ if parsed_args.debug:
168
+ command.append("--debug")
169
+ if parsed_args.no_delete:
170
+ command.append("--no-delete")
171
+ if parsed_args.no_volume:
172
+ command.append("--no-volume")
173
+ if parsed_args.no_boot_volume:
174
+ command.append("--no-boot-volume")
175
+ if parsed_args.no_wait:
176
+ command.append("--no-wait")
177
+
178
+ # Add integer parameters
179
+ command.extend(["--interval", str(parsed_args.interval)])
180
+ command.extend(["--number", str(parsed_args.number)])
181
+ command.extend(["--parallel", str(parsed_args.parallel)])
182
+ command.extend(["--timeout", str(parsed_args.timeout)])
183
+ command.extend(["--volume-number", str(parsed_args.volume_number)])
184
+ command.extend(["--volume-size", str(parsed_args.volume_size)])
185
+ command.extend(["--boot-volume-size", str(parsed_args.boot_volume_size)])
186
+
187
+ # Add string parameters
188
+ command.extend(["--cloud", parsed_args.cloud])
189
+ command.extend(["--flavor", parsed_args.flavor])
190
+ command.extend(["--image", parsed_args.image])
191
+ command.extend(["--subnet-cidr", parsed_args.subnet_cidr])
192
+ command.extend(["--prefix", parsed_args.prefix])
193
+ command.extend(["--compute-zone", parsed_args.compute_zone])
194
+ command.extend(["--storage-zone", parsed_args.storage_zone])
195
+ command.extend(["--affinity", parsed_args.affinity])
196
+ command.extend(["--volume-type", parsed_args.volume_type])
197
+
198
+ logger.debug(
199
+ f"Executing OpenStack stress test with command: {' '.join(command)}"
200
+ )
201
+
202
+ # Execute the stress tool
203
+ try:
204
+ result = subprocess.run(command, check=False)
205
+ return result.returncode
206
+ except FileNotFoundError:
207
+ logger.error(
208
+ "OpenStack stress tool not found at /openstack-simple-stress/openstack_simple_stress/main.py"
209
+ )
210
+ return 1
211
+ except Exception as e:
212
+ logger.error(f"Error executing OpenStack stress tool: {e}")
213
+ return 1
osism/data/__init__.py CHANGED
@@ -101,3 +101,37 @@ images:
101
101
  build_date: {{ image_builddate }}
102
102
 
103
103
  """
104
+
105
+ TEMPLATE_IMAGE_CLUSTERAPI_GARDENER = """---
106
+ images:
107
+ - name: ubuntu-capi-image-gardener
108
+ enable: true
109
+ keep: true
110
+ separator: "-"
111
+ format: qcow2
112
+ login: ubuntu
113
+ min_disk: 20
114
+ min_ram: 512
115
+ status: active
116
+ visibility: public
117
+ multi: false
118
+ meta:
119
+ architecture: x86_64
120
+ hw_disk_bus: scsi
121
+ hw_rng_model: virtio
122
+ hw_scsi_model: virtio-scsi
123
+ hw_watchdog_action: reset
124
+ hypervisor_type: qemu
125
+ os_distro: ubuntu
126
+ replace_frequency: never
127
+ uuid_validity: none
128
+ provided_until: none
129
+ os_purpose: k8snode
130
+ tags: []
131
+ versions:
132
+ - version: "v{{ image_version }}"
133
+ url: "{{ image_url }}"
134
+ checksum: "{{ image_checksum }}"
135
+ build_date: {{ image_builddate }}
136
+
137
+ """
osism/data/enums.py CHANGED
@@ -132,7 +132,7 @@ MAP_ROLE2ROLE = {
132
132
  [
133
133
  "keystone",
134
134
  [
135
- ["neutron", ["wait-for-nova", ["octavia"]]],
135
+ ["neutron", [["wait-for-nova", ["octavia"]]]],
136
136
  "barbican",
137
137
  "designate",
138
138
  "ironic",
@@ -207,7 +207,7 @@ MAP_ROLE2ROLE = {
207
207
  [
208
208
  "glance",
209
209
  "cinder",
210
- ["neutron", ["octavia"]],
210
+ ["neutron", [["wait-for-nova", ["octavia"]]]],
211
211
  "designate",
212
212
  ["placement", ["nova"]],
213
213
  ],
@@ -220,10 +220,9 @@ MAP_ROLE2ROLE = {
220
220
  [
221
221
  "glance",
222
222
  "cinder",
223
- "neutron",
224
223
  "barbican",
225
224
  "designate",
226
- "octavia",
225
+ ["neutron", [["wait-for-nova", ["octavia"]]]],
227
226
  "ironic",
228
227
  "kolla-ceph-rgw",
229
228
  "magnum",
@@ -300,4 +299,55 @@ MAP_ROLE2ROLE = {
300
299
  ],
301
300
  ],
302
301
  ],
302
+ "cloudpod-infrastructure": [
303
+ "openstackclient",
304
+ "phpmyadmin",
305
+ [
306
+ "common",
307
+ [
308
+ ["loadbalancer", ["letsencrypt", "opensearch", "mariadb-ng"]],
309
+ ["openvswitch", ["ovn"]],
310
+ "memcached",
311
+ "redis",
312
+ "rabbitmq-ng",
313
+ ],
314
+ ],
315
+ ],
316
+ "cloudpod-openstack": [
317
+ "horizon",
318
+ [
319
+ "keystone",
320
+ [
321
+ "glance",
322
+ "cinder",
323
+ ["neutron", [["wait-for-nova", ["octavia"]]]],
324
+ ["placement", ["nova"]],
325
+ "designate",
326
+ "skyline",
327
+ "kolla-ceph-rgw",
328
+ ],
329
+ ],
330
+ ],
331
+ "cloudpod-ceph": [
332
+ [
333
+ "ceph-create-lvm-devices",
334
+ [
335
+ "facts",
336
+ [
337
+ "ceph",
338
+ [
339
+ [
340
+ "ceph-pools",
341
+ [
342
+ [
343
+ "copy-ceph-keys",
344
+ [["cephclient", ["ceph-bootstrap-dashboard"]]],
345
+ ]
346
+ ],
347
+ ],
348
+ ],
349
+ ],
350
+ ],
351
+ ],
352
+ ],
303
353
  }
osism/tasks/openstack.py CHANGED
@@ -452,3 +452,83 @@ def flavor_manager(
452
452
  locking=locking,
453
453
  auto_release_time=auto_release_time,
454
454
  )
455
+
456
+
457
+ @app.task(bind=True, name="osism.tasks.openstack.project_manager")
458
+ def project_manager(
459
+ self,
460
+ *arguments,
461
+ publish=True,
462
+ locking=False,
463
+ auto_release_time=3600,
464
+ cloud=None,
465
+ ):
466
+ # Check if tasks are locked before execution
467
+ utils.check_task_lock_and_exit()
468
+
469
+ command = "/usr/local/bin/python3"
470
+ script_path = "/openstack-project-manager/openstack_project_manager/create.py"
471
+ # Prepend script path to arguments
472
+ full_arguments = [script_path] + list(arguments)
473
+
474
+ # Setup cloud environment (changes to /tmp)
475
+ temp_files_to_cleanup, original_cwd, cloud_setup_success = setup_cloud_environment(
476
+ cloud
477
+ )
478
+
479
+ try:
480
+ # Change to working directory required by openstack-project-manager
481
+ os.chdir("/openstack-project-manager")
482
+
483
+ return run_command(
484
+ self.request.id,
485
+ command,
486
+ {},
487
+ *full_arguments,
488
+ publish=publish,
489
+ locking=locking,
490
+ auto_release_time=auto_release_time,
491
+ ignore_env=True,
492
+ )
493
+ finally:
494
+ cleanup_cloud_environment(temp_files_to_cleanup, original_cwd)
495
+
496
+
497
+ @app.task(bind=True, name="osism.tasks.openstack.project_manager_sync")
498
+ def project_manager_sync(
499
+ self,
500
+ *arguments,
501
+ publish=True,
502
+ locking=False,
503
+ auto_release_time=3600,
504
+ cloud=None,
505
+ ):
506
+ # Check if tasks are locked before execution
507
+ utils.check_task_lock_and_exit()
508
+
509
+ command = "/usr/local/bin/python3"
510
+ script_path = "/openstack-project-manager/openstack_project_manager/manage.py"
511
+ # Prepend script path to arguments
512
+ full_arguments = [script_path] + list(arguments)
513
+
514
+ # Setup cloud environment (changes to /tmp)
515
+ temp_files_to_cleanup, original_cwd, cloud_setup_success = setup_cloud_environment(
516
+ cloud
517
+ )
518
+
519
+ try:
520
+ # Change to working directory required by openstack-project-manager
521
+ os.chdir("/openstack-project-manager")
522
+
523
+ return run_command(
524
+ self.request.id,
525
+ command,
526
+ {},
527
+ *full_arguments,
528
+ publish=publish,
529
+ locking=locking,
530
+ auto_release_time=auto_release_time,
531
+ ignore_env=True,
532
+ )
533
+ finally:
534
+ cleanup_cloud_environment(temp_files_to_cleanup, original_cwd)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: osism
3
- Version: 0.20251004.0
3
+ Version: 0.20251012.0
4
4
  Summary: OSISM manager interface
5
5
  Home-page: https://github.com/osism/python-osism
6
6
  Author: OSISM GmbH
@@ -59,7 +59,7 @@ Requires-Dist: watchdog==6.0.0
59
59
  Requires-Dist: websockets==15.0.1
60
60
  Provides-Extra: ansible
61
61
  Requires-Dist: ansible-runner==2.4.1; extra == "ansible"
62
- Requires-Dist: ansible-core==2.19.2; extra == "ansible"
62
+ Requires-Dist: ansible-core==2.19.3; extra == "ansible"
63
63
  Provides-Extra: openstack-image-manager
64
64
  Requires-Dist: openstack-image-manager==0.20250912.0; extra == "openstack-image-manager"
65
65
  Dynamic: author
@@ -4,7 +4,7 @@ osism/api.py,sha256=wVPLhPPdBcFx6vss5pX1Y2JxbaNSMh_Bqo4AB529QWI,16945
4
4
  osism/main.py,sha256=Dt2-9sLXcS-Ny4DAz7hrha-KRc7zd7BFUTRdfs_X8z4,893
5
5
  osism/settings.py,sha256=VZT1muZVYWM5Ov1eFRC7a4ZGYIdI2AFmudCm0wZ1C2Q,1898
6
6
  osism/commands/__init__.py,sha256=Ag4wX_DCgXRdoLn6t069jqb3DdRylsX2nyYkiyCx4uk,456
7
- osism/commands/apply.py,sha256=OtZ4zoSM5uAXc5-GIq7WN8Uwv6idR7Eb8xLw5JS6u38,16953
7
+ osism/commands/apply.py,sha256=TmVgiycVGClcptPHOv1KStWashfWZsSVXxqVNo3GIyE,18279
8
8
  osism/commands/baremetal.py,sha256=TeXwg4lYfxel0YkWC3z8bv9qTsJQmsI2QD6u1K4vhIM,24821
9
9
  osism/commands/compose.py,sha256=76HL9wzTJ7bFPhZk-uyfWq0n6Z74lOHn4RE0zzkHgYE,1241
10
10
  osism/commands/compute.py,sha256=cgqXWJa5wAvn-7e3FWCgX6hie_aK0yrKRkcNzjLXwDY,25799
@@ -14,16 +14,17 @@ osism/commands/container.py,sha256=jHk5A0PXBzHGIm-1d5HQZI_POANAq7An1lZGRbqBvr0,1
14
14
  osism/commands/get.py,sha256=ryytjtXWmlMV0NucP5tGkMZu0nIlC4xVtjRk4iMZ06c,8967
15
15
  osism/commands/lock.py,sha256=MrZ5Ku6xJkic8Nlnv285V89EAgi0NQ8HZioU8urpWXA,3220
16
16
  osism/commands/log.py,sha256=QnnTTNiAoa8oj4kDOcggh0QrRAD6onxcEpLXBy7CvDg,4113
17
- osism/commands/manage.py,sha256=mYPXha5LmLyzHMc04jBJZ0Bva0I2fyPorrUuGoTWtSg,17135
17
+ osism/commands/manage.py,sha256=aBh2NfxPZilplOlJCvT9_43wlGBpkl0vLZ0W1-7gRyQ,40096
18
18
  osism/commands/netbox.py,sha256=dxljfrQ07qHdUgWWRiAxzihlRmXI2JeWWPicuuKTRww,8659
19
19
  osism/commands/noset.py,sha256=0_5-LruRIbmzKP8UfV6r25DaYf0sWC958GZAl5nj04g,1697
20
20
  osism/commands/reconciler.py,sha256=2svFOFEQtPd2z14_lMd0yGrKLgGJ9dh0bCnyCHhl7ms,2305
21
21
  osism/commands/redfish.py,sha256=dcGMF7r4MnKrU95Iy-LFTpHZS2RGQ4kiYN2L1qBvUgg,8551
22
- osism/commands/server.py,sha256=avmoOv5rjOi-fN2A-27cPwOtiy2Q2j6UFtCh3QrfWAI,7512
22
+ osism/commands/server.py,sha256=Si4Bjpz-CWrn7nysAS42WbuZSBEIkkCAyzXutwmooRs,11012
23
23
  osism/commands/service.py,sha256=aWcWoTKFWB7IU10IRRaFN0Oo-Hy0MbaEWjXASV744As,2769
24
24
  osism/commands/set.py,sha256=Qbq46_jWkL9ilMtRadtjDYayd9W2XaAQlodfRy2hEiw,1641
25
25
  osism/commands/sonic.py,sha256=_-pxkgddxFrEJ-6QqSSxv2_fDA5x9U4lt8esGWDa0Ds,43718
26
26
  osism/commands/status.py,sha256=X-Rcj-XuNPDBoxsGkf96NswwpmTognxz1V6E2NX2ZgY,1997
27
+ osism/commands/stress.py,sha256=TQun4TpGKk-eSthdILl-SYd7v8mHTSVDfJe2hEsWRxQ,6796
27
28
  osism/commands/sync.py,sha256=C7jVtm33VhC9Mmxi1St1k3Cfgl0gFul3BSEseIv_se8,2135
28
29
  osism/commands/task.py,sha256=mwJJ7a71Lw3o_FX7j3rR0-NbPdPwMDOjbOAiiXE4uGc,543
29
30
  osism/commands/validate.py,sha256=xZ0XRvxel9L9-C6qDUy1SMfwSo8bL-5eTnKGPg5ZuDA,3358
@@ -31,8 +32,8 @@ osism/commands/vault.py,sha256=llaqNN8UH8t8cCu2KmdaURvprA4zeG6izCen_W7ulPs,2029
31
32
  osism/commands/volume.py,sha256=l6oAk__dFM8KKdLTWOvuSiI7tLh9wAPZp8hwmYF-NX0,6595
32
33
  osism/commands/wait.py,sha256=2Ncx63M0AFq4fq40VZVClf1LS-WHetD8iC_mG2dY_Cw,5275
33
34
  osism/commands/worker.py,sha256=S8EBBVHSP6qQ4nek5fPclxdeHtjY4AFQF43YK0Kyly4,1777
34
- osism/data/__init__.py,sha256=biSDzdL9QvXjbRpXROVKaNToHzDe74kqCITYRhic444,2310
35
- osism/data/enums.py,sha256=gItIjOK6xWuOZSkMxpMdYLRyt4ezyhzkqA7BGiah2o0,10030
35
+ osism/data/__init__.py,sha256=EI8NfVtlXJpNDVUKRgA19zfhE6XZ9fRRjnCyYn1pOxk,3081
36
+ osism/data/enums.py,sha256=S3b7OnnrepFOxVhVC_p5DADB9TkSa1fMPBzUI2Llg8k,11419
36
37
  osism/data/playbooks.py,sha256=M3T3ajV-8Lt-orsRO3jAoukhaoYFr4EZ2dzYXQjt1kg,728
37
38
  osism/services/__init__.py,sha256=bG7Ffen4LvQtgnYPFEpFccsWs81t4zqqeqn9ZeirH6E,38
38
39
  osism/services/event_bridge.py,sha256=roV90o9UgTnwoVbXnPR3muBk04IriVYCO_fewZ46Mq8,12016
@@ -45,7 +46,7 @@ osism/tasks/conductor.py,sha256=WBLsoPtr0iGUzRGERs0Xt7CMYrnHQVEwNV9qXBssI3s,274
45
46
  osism/tasks/kolla.py,sha256=1p0SZBTYpUvIg09czwUmnMh6LIBhleB6O1WSX1mkmJo,729
46
47
  osism/tasks/kubernetes.py,sha256=LyFKjtByQryNl67ZgKjnr-csEODDqYf3LvjURf_qhK0,742
47
48
  osism/tasks/netbox.py,sha256=FjEGQUZDzAVqA9cc3eQqaPv5-hPj3iI9lEc9SkuDO7M,6278
48
- osism/tasks/openstack.py,sha256=c5PyVlSzn69Xw-nFgUf1cX3a3E_STSCNrIectiDzqPI,14871
49
+ osism/tasks/openstack.py,sha256=AFB92ULZqAvpbv0BzRNbzV3uK8NW-Dn3-gAZ1jRk8Mk,17171
49
50
  osism/tasks/reconciler.py,sha256=vlPdOr7nbqggfVMSNez-JHZmKw8L7YmqKQnLF7TOXuQ,2045
50
51
  osism/tasks/conductor/__init__.py,sha256=pS0jJqmSRIY0fHd3982KSuvCwI1gDzfj5iSFxaSMTyM,2215
51
52
  osism/tasks/conductor/config.py,sha256=n1H9_8DY90p5E4mygzKyJUl8G3WdDuGHFTp-SrmZmgU,4543
@@ -65,11 +66,11 @@ osism/tasks/conductor/sonic/interface.py,sha256=M876LHdFqGxUfTizzDusdzvCkDI0vCgq
65
66
  osism/tasks/conductor/sonic/sync.py,sha256=fpgsQVwq6Hb7eeDHhLkAqx5BkaK3Ce_m_WvmWEsJyOo,9182
66
67
  osism/utils/__init__.py,sha256=IEr0sR1HKg-QI_u84fs4gMldC6-EPSxvMBh2zMGu5dU,9939
67
68
  osism/utils/ssh.py,sha256=nxeEgwjJWvQCybKDp-NelMeWyODCYpaXFCBchAv4-bg,8691
68
- osism-0.20251004.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
69
- osism-0.20251004.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
70
- osism-0.20251004.0.dist-info/METADATA,sha256=AyzRodVxbpGRzpJZM9nl7_8BBf-iAjb25mOWR8sl3UM,2971
71
- osism-0.20251004.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
72
- osism-0.20251004.0.dist-info/entry_points.txt,sha256=W45YQ7MJ7BCAPZXl3F6d2FSi6An0moZQbzLn_BwGnRE,4618
73
- osism-0.20251004.0.dist-info/pbr.json,sha256=O4D8iZGKdlEwIsuOJIdJnESPh6JYeG__nO6RBvorNPU,47
74
- osism-0.20251004.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
75
- osism-0.20251004.0.dist-info/RECORD,,
69
+ osism-0.20251012.0.dist-info/licenses/AUTHORS,sha256=oWotd63qsnNR945QLJP9mEXaXNtCMaesfo8ZNuLjwpU,39
70
+ osism-0.20251012.0.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
71
+ osism-0.20251012.0.dist-info/METADATA,sha256=k4gkQRVuJLjBmHTc7IzsewKiPougYGAr6YlhlzSCrOg,2971
72
+ osism-0.20251012.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
+ osism-0.20251012.0.dist-info/entry_points.txt,sha256=UWnl75zOJFPm_NhCYzMVDEd-tgHQlsadhmeamweL7gQ,4872
74
+ osism-0.20251012.0.dist-info/pbr.json,sha256=xWKCPZ8His4ht_BbI6-N5OSCGI06dLEqWyOFhZmmrac,47
75
+ osism-0.20251012.0.dist-info/top_level.txt,sha256=8L8dsI9hcaGHsdnR4k_LN9EM78EhwrXRFHyAryPXZtY,6
76
+ osism-0.20251012.0.dist-info/RECORD,,
@@ -51,10 +51,13 @@ manage compute stop = osism.commands.compute:ComputeStop
51
51
  manage dnsmasq = osism.commands.manage:Dnsmasq
52
52
  manage flavors = osism.commands.manage:Flavors
53
53
  manage image clusterapi = osism.commands.manage:ImageClusterapi
54
+ manage image clusterapi gardener = osism.commands.manage:ImageClusterapiGardener
54
55
  manage image gardenlinux = osism.commands.manage:ImageGardenlinux
55
56
  manage image octavia = osism.commands.manage:ImageOctavia
56
57
  manage images = osism.commands.manage:Images
57
58
  manage netbox = osism.commands.netbox:Manage
59
+ manage project create = osism.commands.manage:ProjectCreate
60
+ manage project sync = osism.commands.manage:ProjectSync
58
61
  manage redfish list = osism.commands.redfish:List
59
62
  manage server list = osism.commands.server:ServerList
60
63
  manage server migrate = osism.commands.server:ServerMigrate
@@ -63,6 +66,7 @@ netbox = osism.commands.netbox:Console
63
66
  noset bootstrap = osism.commands.noset:NoBootstrap
64
67
  noset maintenance = osism.commands.noset:NoMaintenance
65
68
  noset vault password = osism.commands.vault:UnsetPassword
69
+ openstack stress = osism.commands.stress:OpenStackStress
66
70
  reconciler = osism.commands.reconciler:Run
67
71
  reconciler sync = osism.commands.reconciler:Sync
68
72
  service = osism.commands.service:Run
@@ -0,0 +1 @@
1
+ {"git_version": "6558db6", "is_release": false}
@@ -1 +0,0 @@
1
- {"git_version": "e546bf8", "is_release": false}