Skip to content

Commit a915481

Browse files
committed
fix: removing code duplication and improving performance in onaws tests
1 parent 56baf97 commit a915481

6 files changed

Lines changed: 169 additions & 144 deletions

tests/onaws/test_multi_asg_termination.py

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from hfmock import HostFactoryMock
1313
from tests.onaws import plugin_io_schemas
1414
from tests.onaws.parse_output import parse_and_print_output
15+
from tests.onaws.test_onaws import get_instances_states
1516
from tests.onaws.template_processor import TemplateProcessor
1617

1718
pytestmark = [ # Apply default markers to every test in this module
@@ -55,20 +56,6 @@
5556
MAX_TIME_WAIT_FOR_CAPACITY_PROVISIONING_SEC = 180
5657

5758

58-
def get_instance_state(instance_id):
59-
"""Check if an EC2 instance exists and return its state."""
60-
try:
61-
response = ec2_client.describe_instances(InstanceIds=[instance_id])
62-
instance_state = response["Reservations"][0]["Instances"][0]["State"]["Name"]
63-
return {"exists": True, "state": instance_state}
64-
except ClientError as e:
65-
if e.response["Error"]["Code"] == "InvalidInstanceID.NotFound":
66-
return {"exists": False, "state": None}
67-
else:
68-
log.error(f"Error checking instance: {e}")
69-
raise
70-
71-
7259
def get_asg_instances(asg_name: str) -> List[str]:
7360
"""Get all instance IDs from an ASG."""
7461
try:
@@ -118,16 +105,15 @@ def verify_asg_instances_detached(instance_ids: List[str]) -> bool:
118105
def check_all_instances_terminating_or_terminated(instance_ids: List[str]) -> bool:
119106
"""Check if all instances are in terminating or terminated state."""
120107
all_terminating = True
108+
instance_states = get_instances_states(instance_ids, ec2_client)
121109

122-
for instance_id in instance_ids:
123-
res = get_instance_state(instance_id)
124-
125-
if res["exists"]:
126-
if res["state"] not in ["shutting-down", "terminated"]:
127-
log.debug(f"Instance {instance_id} state: {res['state']} (not terminating yet)")
110+
for instance_id, state in zip(instance_ids, instance_states):
111+
if state is not None:
112+
if state not in ["shutting-down", "terminated"]:
113+
log.debug(f"Instance {instance_id} state: {state} (not terminating yet)")
128114
all_terminating = False
129115
else:
130-
log.debug(f"Instance {instance_id} state: {res['state']} (terminating)")
116+
log.debug(f"Instance {instance_id} state: {state} (terminating)")
131117
else:
132118
log.debug(f"Instance {instance_id} no longer exists (terminated)")
133119

@@ -305,13 +291,15 @@ def provision_asg_capacity(
305291
assert status_response["requests"][0]["status"] == "complete"
306292
machines = status_response["requests"][0]["machines"]
307293

308-
for machine in machines:
294+
instance_ids = [machine["machineId"] for machine in machines]
295+
instance_states = get_instances_states(instance_ids, ec2_client)
296+
297+
for machine, state in zip(machines, instance_states):
309298
assert machine["status"] in ["running", "pending"]
310299
instance_id = machine["machineId"]
311-
res = get_instance_state(instance_id)
312-
assert res["exists"] == True
313-
assert res["state"] in ["running", "pending"]
314-
log.debug(f"EC2 {instance_id} state: {res['state']}")
300+
assert state is not None
301+
assert state in ["running", "pending"]
302+
log.debug(f"EC2 {instance_id} state: {state}")
315303

316304
log.info(
317305
f"Successfully provisioned {len(machines)} instances for template {template_json['templateId']}"
@@ -476,15 +464,16 @@ def test_multi_asg_termination(setup_multi_asg_templates):
476464
assert status_response["requests"][0]["status"] == "complete"
477465
machines = status_response["requests"][0]["machines"]
478466

479-
for machine in machines:
467+
instance_ids = [machine["machineId"] for machine in machines]
468+
instance_states = get_instances_states(instance_ids, ec2_client)
469+
470+
for machine, state in zip(machines, instance_states):
480471
assert machine["status"] in ["running", "pending"]
481472
instance_id = machine["machineId"]
482-
res = get_instance_state(instance_id)
483-
assert res["exists"] == True
484-
assert res["state"] in ["running", "pending"]
485-
log.debug(f"EC2 {instance_id} state: {res['state']}")
473+
assert state is not None
474+
assert state in ["running", "pending"]
475+
log.debug(f"EC2 {instance_id} state: {state}")
486476

487-
instance_ids = [machine["machineId"] for machine in machines]
488477
all_instance_ids.extend(instance_ids)
489478
all_status_responses.append(status_response)
490479

tests/onaws/test_multi_ec2_fleet_termination.py

Lines changed: 21 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from hfmock import HostFactoryMock
1313
from tests.onaws import plugin_io_schemas
1414
from tests.onaws.parse_output import parse_and_print_output
15+
from tests.onaws.test_onaws import get_instances_states
1516
from tests.onaws.template_processor import TemplateProcessor
1617

1718
pytestmark = [ # Apply default markers to every test in this module
@@ -52,20 +53,6 @@
5253
MAX_TIME_WAIT_FOR_CAPACITY_PROVISIONING_SEC = 180
5354

5455

55-
def get_instance_state(instance_id):
56-
"""Check if an EC2 instance exists and return its state."""
57-
try:
58-
response = ec2_client.describe_instances(InstanceIds=[instance_id])
59-
instance_state = response["Reservations"][0]["Instances"][0]["State"]["Name"]
60-
return {"exists": True, "state": instance_state}
61-
except ClientError as e:
62-
if e.response["Error"]["Code"] == "InvalidInstanceID.NotFound":
63-
return {"exists": False, "state": None}
64-
else:
65-
log.error(f"Error checking instance: {e}")
66-
raise
67-
68-
6956
def get_ec2_fleet_instances(fleet_id: str) -> List[str]:
7057
"""Get all instance IDs from an EC2 Fleet."""
7158
try:
@@ -127,16 +114,15 @@ def verify_ec2_fleet_instances_detached(instance_ids: List[str]) -> bool:
127114
def check_all_instances_terminating_or_terminated(instance_ids: List[str]) -> bool:
128115
"""Check if all instances are in terminating or terminated state."""
129116
all_terminating = True
117+
instance_states = get_instances_states(instance_ids, ec2_client)
130118

131-
for instance_id in instance_ids:
132-
res = get_instance_state(instance_id)
133-
134-
if res["exists"]:
135-
if res["state"] not in ["shutting-down", "terminated"]:
136-
log.debug(f"Instance {instance_id} state: {res['state']} (not terminating yet)")
119+
for instance_id, state in zip(instance_ids, instance_states):
120+
if state is not None:
121+
if state not in ["shutting-down", "terminated"]:
122+
log.debug(f"Instance {instance_id} state: {state} (not terminating yet)")
137123
all_terminating = False
138124
else:
139-
log.debug(f"Instance {instance_id} state: {res['state']} (terminating)")
125+
log.debug(f"Instance {instance_id} state: {state} (terminating)")
140126
else:
141127
log.debug(f"Instance {instance_id} no longer exists (terminated)")
142128

@@ -316,13 +302,15 @@ def provision_ec2_fleet_capacity(
316302
assert status_response["requests"][0]["status"] == "complete"
317303
machines = status_response["requests"][0]["machines"]
318304

319-
for machine in machines:
305+
instance_ids = [machine["machineId"] for machine in machines]
306+
instance_states = get_instances_states(instance_ids, ec2_client)
307+
308+
for machine, state in zip(machines, instance_states):
320309
assert machine["status"] in ["running", "pending"]
321310
instance_id = machine["machineId"]
322-
res = get_instance_state(instance_id)
323-
assert res["exists"] == True
324-
assert res["state"] in ["running", "pending"]
325-
log.debug(f"EC2 {instance_id} state: {res['state']}")
311+
assert state is not None
312+
assert state in ["running", "pending"]
313+
log.debug(f"EC2 {instance_id} state: {state}")
326314

327315
log.info(
328316
f"Successfully provisioned {len(machines)} instances for template {template_json['templateId']}"
@@ -490,15 +478,16 @@ def test_multi_ec2_fleet_termination(setup_multi_ec2_fleet_templates):
490478
assert status_response["requests"][0]["status"] == "complete"
491479
machines = status_response["requests"][0]["machines"]
492480

493-
for machine in machines:
481+
instance_ids = [machine["machineId"] for machine in machines]
482+
instance_states = get_instances_states(instance_ids, ec2_client)
483+
484+
for machine, state in zip(machines, instance_states):
494485
assert machine["status"] in ["running", "pending"]
495486
instance_id = machine["machineId"]
496-
res = get_instance_state(instance_id)
497-
assert res["exists"] == True
498-
assert res["state"] in ["running", "pending"]
499-
log.debug(f"EC2 {instance_id} state: {res['state']}")
487+
assert state is not None
488+
assert state in ["running", "pending"]
489+
log.debug(f"EC2 {instance_id} state: {state}")
500490

501-
instance_ids = [machine["machineId"] for machine in machines]
502491
all_instance_ids.extend(instance_ids)
503492
all_status_responses.append(status_response)
504493

tests/onaws/test_multi_resource_termination.py

Lines changed: 30 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from hfmock import HostFactoryMock
1313
from tests.onaws import plugin_io_schemas
1414
from tests.onaws.parse_output import parse_and_print_output
15+
from tests.onaws.test_onaws import get_instances_states
1516
from tests.onaws.template_processor import TemplateProcessor
1617

1718
pytestmark = [ # Apply default markers to every test in this module
@@ -53,33 +54,18 @@
5354
MAX_TIME_WAIT_FOR_CAPACITY_PROVISIONING_SEC = 180
5455

5556

56-
def get_instance_state(instance_id):
57-
"""Check if an EC2 instance exists and return its state."""
58-
try:
59-
response = ec2_client.describe_instances(InstanceIds=[instance_id])
60-
instance_state = response["Reservations"][0]["Instances"][0]["State"]["Name"]
61-
return {"exists": True, "state": instance_state}
62-
except ClientError as e:
63-
if e.response["Error"]["Code"] == "InvalidInstanceID.NotFound":
64-
return {"exists": False, "state": None}
65-
else:
66-
log.error(f"Error checking instance: {e}")
67-
raise
68-
69-
7057
def check_all_instances_terminating_or_terminated(instance_ids: List[str]) -> bool:
7158
"""Check if all instances are in terminating or terminated state."""
7259
all_terminating = True
60+
instance_states = get_instances_states(instance_ids, ec2_client)
7361

74-
for instance_id in instance_ids:
75-
res = get_instance_state(instance_id)
76-
77-
if res["exists"]:
78-
if res["state"] not in ["shutting-down", "terminated"]:
79-
log.debug(f"Instance {instance_id} state: {res['state']} (not terminating yet)")
62+
for instance_id, state in zip(instance_ids, instance_states):
63+
if state is not None:
64+
if state not in ["shutting-down", "terminated"]:
65+
log.debug(f"Instance {instance_id} state: {state} (not terminating yet)")
8066
all_terminating = False
8167
else:
82-
log.debug(f"Instance {instance_id} state: {res['state']} (terminating)")
68+
log.debug(f"Instance {instance_id} state: {state} (terminating)")
8369
else:
8470
log.debug(f"Instance {instance_id} no longer exists (terminated)")
8571

@@ -334,13 +320,15 @@ def provision_resource_capacity(
334320
assert status_response["requests"][0]["status"] == "complete"
335321
machines = status_response["requests"][0]["machines"]
336322

337-
for machine in machines:
323+
instance_ids = [machine["machineId"] for machine in machines]
324+
instance_states = get_instances_states(instance_ids, ec2_client)
325+
326+
for machine, state in zip(machines, instance_states):
338327
assert machine["status"] in ["running", "pending"]
339328
instance_id = machine["machineId"]
340-
res = get_instance_state(instance_id)
341-
assert res["exists"] == True
342-
assert res["state"] in ["running", "pending"]
343-
log.debug(f"EC2 {instance_id} state: {res['state']}")
329+
assert state is not None
330+
assert state in ["running", "pending"]
331+
log.debug(f"EC2 {instance_id} state: {state}")
344332

345333
log.info(
346334
f"Successfully provisioned {len(machines)} instances for template {template_json['templateId']}"
@@ -524,15 +512,16 @@ def test_multi_resource_termination(setup_multi_resource_templates):
524512
assert status_response["requests"][0]["status"] == "complete"
525513
machines = status_response["requests"][0]["machines"]
526514

527-
for machine in machines:
515+
instance_ids = [machine["machineId"] for machine in machines]
516+
instance_states = get_instances_states(instance_ids, ec2_client)
517+
518+
for machine, state in zip(machines, instance_states):
528519
assert machine["status"] in ["running", "pending"]
529520
instance_id = machine["machineId"]
530-
res = get_instance_state(instance_id)
531-
assert res["exists"] == True
532-
assert res["state"] in ["running", "pending"]
533-
log.debug(f"EC2 {instance_id} state: {res['state']}")
521+
assert state is not None
522+
assert state in ["running", "pending"]
523+
log.debug(f"EC2 {instance_id} state: {state}")
534524

535-
instance_ids = [machine["machineId"] for machine in machines]
536525
all_instance_ids.extend(instance_ids)
537526
all_status_responses.append(status_response)
538527
resource_instance_mapping[resource_type] = instance_ids
@@ -601,11 +590,12 @@ def test_multi_resource_termination(setup_multi_resource_templates):
601590
current_categorization = categorize_instances_by_resource_type(all_instance_ids)
602591
for resource_type, instances in current_categorization.items():
603592
if instances:
604-
terminating_count = 0
605-
for instance_id in instances:
606-
state = get_instance_state(instance_id)
607-
if state["exists"] and state["state"] in ["shutting-down", "terminated"]:
608-
terminating_count += 1
593+
instance_states = get_instances_states(instances, ec2_client)
594+
terminating_count = sum(
595+
1
596+
for state in instance_states
597+
if state in ["shutting-down", "terminated"]
598+
)
609599
log.info(
610600
f" {resource_type}: {terminating_count}/{len(instances)} instances terminating/terminated"
611601
)
@@ -658,11 +648,9 @@ def test_multi_resource_termination(setup_multi_resource_templates):
658648
for resource_type, instances in final_categorization.items():
659649
if instances:
660650
log.info(f" {resource_type}: {len(instances)} instances")
661-
for instance_id in instances:
662-
state = get_instance_state(instance_id)
663-
log.info(
664-
f" {instance_id}: {state['state'] if state['exists'] else 'terminated'}"
665-
)
651+
instance_states = get_instances_states(instances, ec2_client)
652+
for instance_id, state in zip(instances, instance_states):
653+
log.info(f" {instance_id}: {state if state is not None else 'terminated'}")
666654

667655
log.info("=== Multi-Resource Termination Test Completed Successfully ===")
668656
log.info(

0 commit comments

Comments
 (0)