|
12 | 12 | from hfmock import HostFactoryMock |
13 | 13 | from tests.onaws import plugin_io_schemas |
14 | 14 | from tests.onaws.parse_output import parse_and_print_output |
| 15 | +from tests.onaws.test_onaws import get_instances_states |
15 | 16 | from tests.onaws.template_processor import TemplateProcessor |
16 | 17 |
|
17 | 18 | pytestmark = [ # Apply default markers to every test in this module |
|
53 | 54 | MAX_TIME_WAIT_FOR_CAPACITY_PROVISIONING_SEC = 180 |
54 | 55 |
|
55 | 56 |
|
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 | | - |
70 | 57 | def check_all_instances_terminating_or_terminated(instance_ids: List[str]) -> bool: |
71 | 58 | """Check if all instances are in terminating or terminated state.""" |
72 | 59 | all_terminating = True |
| 60 | + instance_states = get_instances_states(instance_ids, ec2_client) |
73 | 61 |
|
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)") |
80 | 66 | all_terminating = False |
81 | 67 | else: |
82 | | - log.debug(f"Instance {instance_id} state: {res['state']} (terminating)") |
| 68 | + log.debug(f"Instance {instance_id} state: {state} (terminating)") |
83 | 69 | else: |
84 | 70 | log.debug(f"Instance {instance_id} no longer exists (terminated)") |
85 | 71 |
|
@@ -334,13 +320,15 @@ def provision_resource_capacity( |
334 | 320 | assert status_response["requests"][0]["status"] == "complete" |
335 | 321 | machines = status_response["requests"][0]["machines"] |
336 | 322 |
|
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): |
338 | 327 | assert machine["status"] in ["running", "pending"] |
339 | 328 | 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}") |
344 | 332 |
|
345 | 333 | log.info( |
346 | 334 | f"Successfully provisioned {len(machines)} instances for template {template_json['templateId']}" |
@@ -524,15 +512,16 @@ def test_multi_resource_termination(setup_multi_resource_templates): |
524 | 512 | assert status_response["requests"][0]["status"] == "complete" |
525 | 513 | machines = status_response["requests"][0]["machines"] |
526 | 514 |
|
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): |
528 | 519 | assert machine["status"] in ["running", "pending"] |
529 | 520 | 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}") |
534 | 524 |
|
535 | | - instance_ids = [machine["machineId"] for machine in machines] |
536 | 525 | all_instance_ids.extend(instance_ids) |
537 | 526 | all_status_responses.append(status_response) |
538 | 527 | resource_instance_mapping[resource_type] = instance_ids |
@@ -601,11 +590,12 @@ def test_multi_resource_termination(setup_multi_resource_templates): |
601 | 590 | current_categorization = categorize_instances_by_resource_type(all_instance_ids) |
602 | 591 | for resource_type, instances in current_categorization.items(): |
603 | 592 | 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 | + ) |
609 | 599 | log.info( |
610 | 600 | f" {resource_type}: {terminating_count}/{len(instances)} instances terminating/terminated" |
611 | 601 | ) |
@@ -658,11 +648,9 @@ def test_multi_resource_termination(setup_multi_resource_templates): |
658 | 648 | for resource_type, instances in final_categorization.items(): |
659 | 649 | if instances: |
660 | 650 | 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'}") |
666 | 654 |
|
667 | 655 | log.info("=== Multi-Resource Termination Test Completed Successfully ===") |
668 | 656 | log.info( |
|
0 commit comments