Skip to content

Commit d034282

Browse files
committed
[Test] In test_pcluster_configure, assert that head node and compute instance types are taken from the current free tier.
1 parent 2806ab7 commit d034282

File tree

2 files changed

+50
-7
lines changed

2 files changed

+50
-7
lines changed

tests/integration-tests/tests/configure/test_pcluster_configure.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,27 @@
2121
from cfn_stacks_factory import CfnVpcStack
2222
from conftest import inject_additional_config_settings
2323
from conftest_networking import CIDR_FOR_CUSTOM_SUBNETS
24-
from utils import get_instance_info
24+
from utils import get_free_tier_instance_types, get_instance_info, or_regex
2525

2626
PROMPTS = {
2727
"region": lambda region: {"prompt": r"AWS Region ID \[.*\]: ", "response": region},
2828
"key_pair": lambda key_name: {"prompt": r"EC2 Key Pair Name \[.*\]: ", "response": key_name},
2929
"scheduler": lambda scheduler: {"prompt": r"Scheduler \[slurm\]: ", "response": scheduler},
3030
"os": lambda os: {"prompt": r"Operating System \[alinux2\]: ", "response": os, "skip_for_batch": True},
31-
"head_instance_type": lambda instance: {"prompt": r"Head node instance type \[t.\.micro\]: ", "response": instance},
31+
"head_instance_type": lambda free_tier_instance_types, instance: {
32+
"prompt": rf"Head node instance type \[({or_regex(free_tier_instance_types)})\]: ",
33+
"response": instance,
34+
},
3235
"no_of_queues": lambda n: {"prompt": rf"Number of queues \[{n}\]: ", "response": f"{n}", "skip_for_batch": True},
3336
"queue_name": lambda queue, name: {"prompt": rf"Name of queue {queue} \[queue{queue}\]: ", "response": name},
3437
"no_of_compute_resources": lambda queue_name, queue, n: {
3538
"prompt": rf"Number of compute resources for {queue_name} \[{queue}\]: ",
3639
"response": f"{n}",
3740
"skip_for_batch": True,
3841
},
39-
"compute_instance_type": lambda resource, queue_name, instance: {
40-
"prompt": rf"Compute instance type for compute resource {resource} in {queue_name} \[t.\.micro\]: ",
42+
"compute_instance_type": lambda free_tier_instance_types, resource, queue_name, instance: {
43+
"prompt": rf"Compute instance type for compute resource {resource} in {queue_name} "
44+
+ rf"\[({or_regex(free_tier_instance_types)})\]: ",
4145
"response": instance,
4246
"skip_for_batch": True,
4347
},
@@ -161,7 +165,12 @@ def test_efa_and_placement_group(
161165
PROMPTS["no_of_queues"](1),
162166
PROMPTS["queue_name"](queue=1, name="myqueue"),
163167
PROMPTS["no_of_compute_resources"](queue_name="myqueue", queue=1, n=1),
164-
PROMPTS["compute_instance_type"](resource=1, queue_name="myqueue", instance=instance),
168+
PROMPTS["compute_instance_type"](
169+
free_tier_instance_types=get_free_tier_instance_types(region),
170+
resource=1,
171+
queue_name="myqueue",
172+
instance=instance,
173+
),
165174
PROMPTS["enable_efa"](efa_response),
166175
prompt_max_size(scheduler=scheduler),
167176
]
@@ -237,7 +246,10 @@ def standard_first_stage_prompts(region, key_name, scheduler, os, instance):
237246
PROMPTS["key_pair"](key_name),
238247
PROMPTS["scheduler"](scheduler),
239248
PROMPTS["os"](os),
240-
PROMPTS["head_instance_type"](instance),
249+
PROMPTS["head_instance_type"](
250+
free_tier_instance_types=get_free_tier_instance_types(region),
251+
instance=instance,
252+
),
241253
]
242254

243255

@@ -246,7 +258,12 @@ def standard_queue_prompts(scheduler, instance, region, size=""):
246258
PROMPTS["no_of_queues"](1),
247259
PROMPTS["queue_name"](queue=1, name="myqueue"),
248260
PROMPTS["no_of_compute_resources"](queue_name="myqueue", queue=1, n=1),
249-
PROMPTS["compute_instance_type"](resource=1, queue_name="myqueue", instance=instance),
261+
PROMPTS["compute_instance_type"](
262+
free_tier_instance_types=get_free_tier_instance_types(region),
263+
resource=1,
264+
queue_name="myqueue",
265+
instance=instance,
266+
),
250267
]
251268

252269
is_efa_supported = False

tests/integration-tests/utils.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -908,3 +908,29 @@ def find_stack_by_tag(tag, region, stack_prefix):
908908
logging.info(f"Found stack: {name} (created on {creation_date})")
909909
return name
910910
return None
911+
912+
913+
def get_free_tier_instance_types(region: str = None):
914+
instance_types = []
915+
ec2 = boto3.client("ec2", region_name=region)
916+
917+
# Pagination here is not only a best practice; it is required to make DescribeInstanceTypes return
918+
# the expected values when we want to filter all instance types.
919+
# If you remove pagination, this is going to return an empty list of instance types.
920+
paginator = ec2.get_paginator("describe_instance_types")
921+
pages = paginator.paginate(
922+
Filters=[
923+
{"Name": "free-tier-eligible", "Values": ["true"]},
924+
{"Name": "current-generation", "Values": ["true"]},
925+
]
926+
)
927+
928+
for page in pages:
929+
instance_types.extend([instance["InstanceType"] for instance in page["InstanceTypes"]])
930+
931+
logging.info(f"Free tier instance types in region {region}: {instance_types}")
932+
return instance_types
933+
934+
935+
def or_regex(items: list):
936+
return "|".join(map(re.escape, items))

0 commit comments

Comments
 (0)