Skip to content

Commit 2d1cbc5

Browse files
committed
fix!: support GovCloud regions in commercial region list
Since region support requests can now update gov regions with the API, this change allows gov regions to be included in the `region` field. Instead of removing the entire validator, gov regions are excluded from the invalid region list, allowing users to add them to listings. BREAKING-CHANGE: 'all' option in `commercial_regions` field is removed to require users to specify each region explicitly.
1 parent e67d71b commit 2d1cbc5

3 files changed

Lines changed: 53 additions & 9 deletions

File tree

awsmp/models.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,13 @@ class Region(BaseModel):
221221
@field_validator("commercial_regions")
222222
def commercial_region_validator(cls, value):
223223
client = boto3.client("ec2")
224-
available_regions = [region["RegionName"] for region in client.describe_regions()["Regions"]]
225-
if value[0] == "all":
226-
return available_regions
227-
else:
228-
invalid_regions = set(value) - set(available_regions)
229-
if invalid_regions:
230-
raise ValueError(f"{invalid_regions} are not valid for commercial regions")
231-
return value
224+
gov_regions = ["us-gov-east-1", "us-gov-west-1"]
225+
available_regions = [region["RegionName"] for region in client.describe_regions()["Regions"]] + gov_regions
226+
227+
invalid_regions = set(value) - set(available_regions)
228+
if invalid_regions:
229+
raise ValueError(f"{invalid_regions} are not valid for commercial regions")
230+
return value
232231

233232
def future_region_supported(self) -> List[str]:
234233
return ["All" if self.future_region_support else "None"]

tests/test_driver.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1133,7 +1133,7 @@ def test_ami_product_update_region_invalid_values(mock_boto3, mock_get_client, i
11331133
"valid_region_configs",
11341134
[
11351135
({"future_region_support": True}),
1136-
({"commercial_regions": ["all"]}),
1136+
({"commercial_regions": ["eu-north-1"]}),
11371137
],
11381138
)
11391139
@patch("awsmp._driver.get_client")
@@ -1159,6 +1159,39 @@ def test_ami_product_update_region_valid_values(mock_boto3, mock_get_client, val
11591159
] == {"FutureRegionSupport": {"SupportedRegions": ["All"]}}
11601160

11611161

1162+
@patch("awsmp._driver.get_client")
1163+
@patch("awsmp._driver.changesets.models.boto3")
1164+
def test_ami_product_update_region_valid_values_with_gov_regions(mock_boto3, mock_get_client):
1165+
mock_region_config = {
1166+
"commercial_regions": ["us-east-1", "us-gov-east-1"],
1167+
"future_region_support": True,
1168+
}
1169+
mock_boto3.client.return_value.describe_regions.return_value = {
1170+
"Regions": [{"Endpoint": "ec2.us-east-1.amazonaws.com", "RegionName": "us-east-1", "OptInStatus": "opted-in"}]
1171+
}
1172+
ap = _driver.AmiProduct(product_id="testing")
1173+
ap.update_regions(mock_region_config)
1174+
1175+
assert mock_get_client.return_value.start_change_set.call_args_list[0].kwargs["ChangeSet"][0][
1176+
"DetailsDocument"
1177+
] == {"Regions": ["us-east-1", "us-gov-east-1"]}
1178+
1179+
1180+
@patch("awsmp._driver.get_client")
1181+
@patch("awsmp._driver.changesets.models.boto3")
1182+
def test_ami_product_update_region_invalid_values_with_gov_regions(mock_boto3, mock_get_client):
1183+
mock_region_config = {
1184+
"commercial_regions": ["us-east-1", "us-gov-west-2"],
1185+
"future_region_support": True,
1186+
}
1187+
mock_boto3.client.return_value.describe_regions.return_value = {
1188+
"Regions": [{"Endpoint": "ec2.us-east-1.amazonaws.com", "RegionName": "us-east-1", "OptInStatus": "opted-in"}]
1189+
}
1190+
1191+
with pytest.raises(ValidationError):
1192+
_driver.AmiProduct(product_id="testing").update_regions(mock_region_config)
1193+
1194+
11621195
@pytest.mark.parametrize(
11631196
"invalid_version_configs",
11641197
[

tests/test_models.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,18 @@ def test_region_availability_future_region_supported(self, mock_boto3):
7777
region = models.Region(commercial_regions=["us-east-1", "us-east-2"], future_region_support=False)
7878
assert region.future_region_supported() == ["None"]
7979

80+
def test_region_availability_regions(self, mock_boto3):
81+
region = models.Region(commercial_regions=["us-east-1", "us-east-2"], future_region_support=True)
82+
assert region.commercial_regions == ["us-east-1", "us-east-2"]
83+
84+
def test_region_availability_gov_regions(self, mock_boto3):
85+
region = models.Region(commercial_regions=["us-east-1", "us-gov-east-1"], future_region_support=True)
86+
assert region.commercial_regions == ["us-east-1", "us-gov-east-1"]
87+
88+
def test_region_availability_only_gov_regions(self, mock_boto3):
89+
region = models.Region(commercial_regions=["us-gov-west-1", "us-gov-east-1"], future_region_support=True)
90+
assert region.commercial_regions == ["us-gov-west-1", "us-gov-east-1"]
91+
8092

8193
class TestAmiVersion:
8294
def _get_version_details(self):

0 commit comments

Comments
 (0)