|
8 | 8 | from loguru import logger |
9 | 9 | import openstack |
10 | 10 |
|
11 | | -from osism.commands import get_cloud_connection |
12 | 11 | 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 |
13 | 13 |
|
14 | 14 | # Default age threshold for rotation (30 days in seconds) |
15 | 15 | DEFAULT_ROTATION_AGE_SECONDS = 2592000 |
@@ -38,24 +38,32 @@ def take_action(self, parsed_args): |
38 | 38 | cloud = parsed_args.cloud |
39 | 39 | loadbalancer_id = parsed_args.loadbalancer |
40 | 40 |
|
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 |
42 | 45 |
|
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) |
49 | 48 |
|
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 |
56 | 62 |
|
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) |
59 | 67 |
|
60 | 68 |
|
61 | 69 | class AmphoraRotate(Command): |
@@ -88,48 +96,58 @@ def take_action(self, parsed_args): |
88 | 96 | loadbalancer_id = parsed_args.loadbalancer |
89 | 97 | force = parsed_args.force |
90 | 98 |
|
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 |
94 | 103 |
|
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) |
101 | 106 |
|
102 | | - for amphora in amphorae: |
103 | | - rotate = False |
| 107 | + done = [] |
104 | 108 |
|
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 | + ) |
117 | 113 | else: |
118 | | - continue |
| 114 | + amphorae = conn.load_balancer.amphorae(status="ALLOCATED") |
119 | 115 |
|
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 |
127 | 118 |
|
128 | | - done.append(amphora.loadbalancer_id) |
| 119 | + if amphora.loadbalancer_id in done: |
| 120 | + continue |
129 | 121 |
|
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" |
135 | 137 | ) |
| 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