diff --git a/test/integration/conftest.py b/test/integration/conftest.py index caac7ca01..459c3319a 100644 --- a/test/integration/conftest.py +++ b/test/integration/conftest.py @@ -1,4 +1,5 @@ import ipaddress +import logging import os import random import time @@ -26,6 +27,7 @@ PlacementGroupType, PostgreSQLDatabase, ) +from linode_api4.errors import ApiError from linode_api4.linode_client import LinodeClient, MonitorClient from linode_api4.objects import Region @@ -36,6 +38,15 @@ RUN_LONG_TESTS = "RUN_LONG_TESTS" SKIP_E2E_FIREWALL = "SKIP_E2E_FIREWALL" +ALL_ACCOUNT_AVAILABILITIES = { + "Linodes", + "NodeBalancers", + "Block Storage", + "Kubernetes", +} + +logger = logging.getLogger(__name__) + def get_token(): return os.environ.get(ENV_TOKEN_NAME, None) @@ -58,9 +69,37 @@ def get_regions( regions = client.regions() + account_regional_availabilities = {} + try: + account_availabilities = client.account.availabilities() + for availability in account_availabilities: + account_regional_availabilities[availability.region] = ( + availability.available + ) + except ApiError: + logger.warning( + "Failed to retrieve account availabilities for regions. " + "Assuming required capabilities are available in all regions for this account. " + "Tests may fail if the account lacks access to necessary capabilities in the selected region." + ) + if capabilities is not None: regions = [ - v for v in regions if set(capabilities).issubset(v.capabilities) + v + for v in regions + if set(capabilities).issubset(v.capabilities) + and set(capabilities) + .intersection(ALL_ACCOUNT_AVAILABILITIES) + .issubset( + account_regional_availabilities.get( + v.id, + ( + [] + if account_regional_availabilities + else ALL_ACCOUNT_AVAILABILITIES + ), + ) + ) ] if site_type is not None: