Skip to content

Commit b2b1dc5

Browse files
authored
Add stress command (#1749)
AI-assisted: Claude Code Signed-off-by: Christian Berendt <[email protected]>
1 parent 0ff1b22 commit b2b1dc5

File tree

2 files changed

+214
-0
lines changed

2 files changed

+214
-0
lines changed

osism/commands/stress.py

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

setup.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ osism.commands:
8484
manage netbox = osism.commands.netbox:Manage
8585
manage redfish list = osism.commands.redfish:List
8686
manage server list = osism.commands.server:ServerList
87+
openstack stress = osism.commands.stress:OpenStackStress
8788
manage server migrate = osism.commands.server:ServerMigrate
8889
manage volume list = osism.commands.volume:VolumeList
8990
manage baremetal list = osism.commands.baremetal:BaremetalList

0 commit comments

Comments
 (0)