Skip to content

Commit 02c8af8

Browse files
authored
Use setup_cloud_environment() for OpenStack connections in manage commands (#1900)
Replace direct get_cloud_connection() calls with setup_cloud_environment() and cleanup_cloud_environment() pattern in all manage commands. This ensures proper cloud configuration by: - Copying /etc/openstack/clouds.yaml to /tmp - Loading passwords securely from vault via get_cloud_password() - Creating /tmp/secure.yml with decrypted credentials - Properly cleaning up temporary files after execution Affected commands: - manage loadbalancer list/reset/delete - manage amphora restore/rotate - manage volume list/repair - manage server migrate/list/clean Also adds --cloud parameter to ServerMigrate for consistency. AI-assisted: Claude Code Signed-off-by: Christian Berendt <berendt@osism.tech>
1 parent 07b5e74 commit 02c8af8

4 files changed

Lines changed: 711 additions & 559 deletions

File tree

osism/commands/amphora.py

Lines changed: 71 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from loguru import logger
99
import openstack
1010

11-
from osism.commands import get_cloud_connection
1211
from osism.commands.octavia import wait_for_amphora_boot, wait_for_amphora_delete
12+
from osism.tasks.openstack import cleanup_cloud_environment, setup_cloud_environment
1313

1414
# Default age threshold for rotation (30 days in seconds)
1515
DEFAULT_ROTATION_AGE_SECONDS = 2592000
@@ -38,24 +38,32 @@ def take_action(self, parsed_args):
3838
cloud = parsed_args.cloud
3939
loadbalancer_id = parsed_args.loadbalancer
4040

41-
conn = get_cloud_connection(cloud)
41+
temp_files, original_cwd, success = setup_cloud_environment(cloud)
42+
if not success:
43+
logger.error(f"Failed to setup cloud environment for '{cloud}'")
44+
return 1
4245

43-
if loadbalancer_id:
44-
amphorae = conn.load_balancer.amphorae(
45-
status="ERROR", loadbalancer_id=loadbalancer_id
46-
)
47-
else:
48-
amphorae = conn.load_balancer.amphorae(status="ERROR")
46+
try:
47+
conn = openstack.connect(cloud=cloud)
4948

50-
for amphora in amphorae:
51-
logger.info(
52-
f"Amphora {amphora.id} of loadbalancer {amphora.loadbalancer_id} is in state ERROR, trigger amphora failover"
53-
)
54-
conn.load_balancer.failover_amphora(amphora.id)
55-
sleep(10) # wait for the octavia API
49+
if loadbalancer_id:
50+
amphorae = conn.load_balancer.amphorae(
51+
status="ERROR", loadbalancer_id=loadbalancer_id
52+
)
53+
else:
54+
amphorae = conn.load_balancer.amphorae(status="ERROR")
55+
56+
for amphora in amphorae:
57+
logger.info(
58+
f"Amphora {amphora.id} of loadbalancer {amphora.loadbalancer_id} is in state ERROR, trigger amphora failover"
59+
)
60+
conn.load_balancer.failover_amphora(amphora.id)
61+
sleep(10) # wait for the octavia API
5662

57-
wait_for_amphora_boot(conn, amphora.loadbalancer_id)
58-
wait_for_amphora_delete(conn, amphora.loadbalancer_id)
63+
wait_for_amphora_boot(conn, amphora.loadbalancer_id)
64+
wait_for_amphora_delete(conn, amphora.loadbalancer_id)
65+
finally:
66+
cleanup_cloud_environment(temp_files, original_cwd)
5967

6068

6169
class AmphoraRotate(Command):
@@ -88,48 +96,58 @@ def take_action(self, parsed_args):
8896
loadbalancer_id = parsed_args.loadbalancer
8997
force = parsed_args.force
9098

91-
conn = get_cloud_connection(cloud)
92-
93-
done = []
99+
temp_files, original_cwd, success = setup_cloud_environment(cloud)
100+
if not success:
101+
logger.error(f"Failed to setup cloud environment for '{cloud}'")
102+
return 1
94103

95-
if loadbalancer_id:
96-
amphorae = conn.load_balancer.amphorae(
97-
status="ALLOCATED", loadbalancer_id=loadbalancer_id
98-
)
99-
else:
100-
amphorae = conn.load_balancer.amphorae(status="ALLOCATED")
104+
try:
105+
conn = openstack.connect(cloud=cloud)
101106

102-
for amphora in amphorae:
103-
rotate = False
107+
done = []
104108

105-
if amphora.loadbalancer_id in done:
106-
continue
107-
108-
duration = datetime.now(timezone.utc) - dateutil_parser.parse(
109-
amphora.created_at
110-
)
111-
if duration.total_seconds() > DEFAULT_ROTATION_AGE_SECONDS:
112-
logger.info(f"Amphora {amphora.id} is older than 30 days")
113-
rotate = True
114-
elif force:
115-
logger.info(f"Force rotation of Amphora {amphora.id}")
116-
rotate = True
109+
if loadbalancer_id:
110+
amphorae = conn.load_balancer.amphorae(
111+
status="ALLOCATED", loadbalancer_id=loadbalancer_id
112+
)
117113
else:
118-
continue
114+
amphorae = conn.load_balancer.amphorae(status="ALLOCATED")
119115

120-
if rotate:
121-
logger.info(
122-
f"Amphora {amphora.id} of loadbalancer {amphora.loadbalancer_id} is rotated by a loadbalancer failover"
123-
)
124-
try:
125-
conn.load_balancer.failover_load_balancer(amphora.loadbalancer_id)
126-
sleep(10) # wait for the octavia API
116+
for amphora in amphorae:
117+
rotate = False
127118

128-
done.append(amphora.loadbalancer_id)
119+
if amphora.loadbalancer_id in done:
120+
continue
129121

130-
wait_for_amphora_boot(conn, amphora.loadbalancer_id)
131-
wait_for_amphora_delete(conn, amphora.loadbalancer_id)
132-
except openstack.exceptions.ConflictException:
133-
logger.warning(
134-
f"Conflict while rotating loadbalancer {amphora.loadbalancer_id}, skipping"
122+
duration = datetime.now(timezone.utc) - dateutil_parser.parse(
123+
amphora.created_at
124+
)
125+
if duration.total_seconds() > DEFAULT_ROTATION_AGE_SECONDS:
126+
logger.info(f"Amphora {amphora.id} is older than 30 days")
127+
rotate = True
128+
elif force:
129+
logger.info(f"Force rotation of Amphora {amphora.id}")
130+
rotate = True
131+
else:
132+
continue
133+
134+
if rotate:
135+
logger.info(
136+
f"Amphora {amphora.id} of loadbalancer {amphora.loadbalancer_id} is rotated by a loadbalancer failover"
135137
)
138+
try:
139+
conn.load_balancer.failover_load_balancer(
140+
amphora.loadbalancer_id
141+
)
142+
sleep(10) # wait for the octavia API
143+
144+
done.append(amphora.loadbalancer_id)
145+
146+
wait_for_amphora_boot(conn, amphora.loadbalancer_id)
147+
wait_for_amphora_delete(conn, amphora.loadbalancer_id)
148+
except openstack.exceptions.ConflictException:
149+
logger.warning(
150+
f"Conflict while rotating loadbalancer {amphora.loadbalancer_id}, skipping"
151+
)
152+
finally:
153+
cleanup_cloud_environment(temp_files, original_cwd)

0 commit comments

Comments
 (0)