Core: Parameter handling: fix parsing of >= 10 members (#7056)
This commit is contained in:
parent
b3c3883a78
commit
7c83ca157f
@ -326,16 +326,19 @@ def extract_region_from_aws_authorization(string: str) -> Optional[str]:
|
|||||||
return region
|
return region
|
||||||
|
|
||||||
|
|
||||||
def params_sort_function(item: Tuple[str, Any]) -> Tuple[str, Any]:
|
def params_sort_function(item: Tuple[str, Any]) -> Tuple[str, int, str]:
|
||||||
"""
|
"""
|
||||||
Comparison function used to sort params appropriately taking tags non
|
sort by <string-prefix>.member.<integer>.<string-postfix>:
|
||||||
alphabetical order into consideration
|
in case there are more than 10 members, the default-string sort would lead to IndexError when parsing the content.
|
||||||
|
|
||||||
|
Note: currently considers only the first occurence of `member`, but there may be cases with nested members
|
||||||
"""
|
"""
|
||||||
key, _ = item
|
key, _ = item
|
||||||
if key.startswith("Tags.member"):
|
|
||||||
member_num = int(key.split(".")[2])
|
match = re.search(r"(.*?member)\.(\d+)(.*)", key)
|
||||||
return ("Tags.member", member_num)
|
if match:
|
||||||
return item
|
return (match.group(1), int(match.group(2)), match.group(3))
|
||||||
|
return (key, 0, "")
|
||||||
|
|
||||||
|
|
||||||
def gzip_decompress(body: bytes) -> bytes:
|
def gzip_decompress(body: bytes) -> bytes:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import copy
|
||||||
|
|
||||||
import boto3
|
import boto3
|
||||||
|
|
||||||
from moto import mock_autoscaling, mock_ec2
|
from moto import mock_autoscaling, mock_ec2
|
||||||
@ -231,6 +233,39 @@ def test_describe_tags_filter_by_propgateatlaunch():
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@mock_autoscaling
|
||||||
|
def test_create_20_tags_auto_scaling_group():
|
||||||
|
"""test to verify that the tag-members are sorted correctly, and there is no regression for
|
||||||
|
https://github.com/getmoto/moto/issues/6033
|
||||||
|
"""
|
||||||
|
subnet = setup_networking()["subnet1"]
|
||||||
|
client = boto3.client("autoscaling", region_name="us-east-1")
|
||||||
|
original = {
|
||||||
|
"ResourceId": "test_asg",
|
||||||
|
"PropagateAtLaunch": True,
|
||||||
|
}
|
||||||
|
tags = []
|
||||||
|
for i in range(0, 20):
|
||||||
|
cp = copy.deepcopy(original)
|
||||||
|
cp["Key"] = f"test_key{i}"
|
||||||
|
cp["Value"] = f"random-value-{i}"
|
||||||
|
tags.append(cp)
|
||||||
|
client.create_launch_configuration(
|
||||||
|
LaunchConfigurationName="test_launch_configuration",
|
||||||
|
ImageId=EXAMPLE_AMI_ID,
|
||||||
|
InstanceType="t2.medium",
|
||||||
|
)
|
||||||
|
client.create_auto_scaling_group(
|
||||||
|
AutoScalingGroupName="test_asg",
|
||||||
|
LaunchConfigurationName="test_launch_configuration",
|
||||||
|
MinSize=0,
|
||||||
|
MaxSize=20,
|
||||||
|
DesiredCapacity=5,
|
||||||
|
Tags=tags,
|
||||||
|
VPCZoneIdentifier=subnet,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def create_asgs(client, subnet):
|
def create_asgs(client, subnet):
|
||||||
_ = client.create_launch_configuration(
|
_ = client.create_launch_configuration(
|
||||||
LaunchConfigurationName="test_launch_configuration",
|
LaunchConfigurationName="test_launch_configuration",
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import copy
|
||||||
|
|
||||||
import boto3
|
import boto3
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
@ -1903,3 +1905,41 @@ def test_get_metric_data_with_custom_label():
|
|||||||
)
|
)
|
||||||
assert len(metric_result_data) == 1
|
assert len(metric_result_data) == 1
|
||||||
assert metric_result_data[0]["Label"] == expected_value
|
assert metric_result_data[0]["Label"] == expected_value
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cloudwatch
|
||||||
|
def test_get_metric_data_queries():
|
||||||
|
"""
|
||||||
|
verify that >= 10 queries can still be parsed
|
||||||
|
there was an error with the order of parsing items, leading to IndexError
|
||||||
|
"""
|
||||||
|
now = datetime.utcnow().replace(microsecond=0)
|
||||||
|
start_time = now - timedelta(minutes=10)
|
||||||
|
end_time = now + timedelta(minutes=5)
|
||||||
|
original_query = {
|
||||||
|
"MetricStat": {
|
||||||
|
"Metric": {
|
||||||
|
"Namespace": "AWS/RDS",
|
||||||
|
"MetricName": "CPUUtilization",
|
||||||
|
"Dimensions": [{"Name": "DBInstanceIdentifier", "Value": ""}],
|
||||||
|
},
|
||||||
|
"Period": 1,
|
||||||
|
"Stat": "Average",
|
||||||
|
"Unit": "Percent",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
queries = []
|
||||||
|
for i in range(0, 20):
|
||||||
|
query = copy.deepcopy(original_query)
|
||||||
|
query["Id"] = f"q{i}"
|
||||||
|
query["MetricStat"]["Metric"]["Dimensions"][0]["Value"] = f"id-{i}"
|
||||||
|
queries.append(query)
|
||||||
|
|
||||||
|
assert len(queries) == 20
|
||||||
|
response = boto3.client("cloudwatch", "eu-west-1").get_metric_data(
|
||||||
|
StartTime=start_time, EndTime=end_time, MetricDataQueries=queries
|
||||||
|
)
|
||||||
|
|
||||||
|
# we expect twenty results
|
||||||
|
assert len(response["MetricDataResults"]) == 20
|
||||||
|
Loading…
x
Reference in New Issue
Block a user