Core: Add RequestId-header to all responses (#7210)
This commit is contained in:
		
							parent
							
								
									168b869350
								
							
						
					
					
						commit
						1f1e0caca3
					
				| @ -1,6 +1,7 @@ | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.core.utils import iso_8601_datetime_with_milliseconds | ||||
| from moto.utilities.aws_headers import amz_crc32, amzn_request_id | ||||
| from moto.utilities.aws_headers import amz_crc32 | ||||
| 
 | ||||
| from .models import AutoScalingBackend, autoscaling_backends | ||||
| 
 | ||||
| @ -13,6 +14,10 @@ class AutoScalingResponse(BaseResponse): | ||||
|     def autoscaling_backend(self) -> AutoScalingBackend: | ||||
|         return autoscaling_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     def call_action(self) -> TYPE_RESPONSE: | ||||
|         return super().call_action() | ||||
| 
 | ||||
|     def create_launch_configuration(self) -> str: | ||||
|         instance_monitoring_string = self._get_param("InstanceMonitoring.Enabled") | ||||
|         if instance_monitoring_string == "true": | ||||
| @ -139,8 +144,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_SCALING_ACTIVITIES_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def attach_instances(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         instance_ids = self._get_multi_param("InstanceIds.member") | ||||
| @ -148,8 +151,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(ATTACH_INSTANCES_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def set_instance_health(self) -> str: | ||||
|         instance_id = self._get_param("InstanceId") | ||||
|         health_status = self._get_param("HealthStatus") | ||||
| @ -159,8 +160,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(SET_INSTANCE_HEALTH_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def detach_instances(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         instance_ids = self._get_multi_param("InstanceIds.member") | ||||
| @ -175,8 +174,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(DETACH_INSTANCES_TEMPLATE) | ||||
|         return template.render(detached_instances=detached_instances) | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def attach_load_balancer_target_groups(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         target_group_arns = self._get_multi_param("TargetGroupARNs.member") | ||||
| @ -187,8 +184,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(ATTACH_LOAD_BALANCER_TARGET_GROUPS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def describe_load_balancer_target_groups(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         target_group_arns = ( | ||||
| @ -197,8 +192,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LOAD_BALANCER_TARGET_GROUPS) | ||||
|         return template.render(target_group_arns=target_group_arns) | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def detach_load_balancer_target_groups(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         target_group_arns = self._get_multi_param("TargetGroupARNs.member") | ||||
| @ -347,8 +340,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(EXECUTE_POLICY_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def attach_load_balancers(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         load_balancer_names = self._get_multi_param("LoadBalancerNames.member") | ||||
| @ -356,16 +347,12 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(ATTACH_LOAD_BALANCERS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def describe_load_balancers(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         load_balancers = self.autoscaling_backend.describe_load_balancers(group_name) | ||||
|         template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE) | ||||
|         return template.render(load_balancers=load_balancers) | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def detach_load_balancers(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         load_balancer_names = self._get_multi_param("LoadBalancerNames.member") | ||||
| @ -373,8 +360,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(DETACH_LOAD_BALANCERS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def enter_standby(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         instance_ids = self._get_multi_param("InstanceIds.member") | ||||
| @ -399,8 +384,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|             timestamp=iso_8601_datetime_with_milliseconds(), | ||||
|         ) | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def exit_standby(self) -> str: | ||||
|         group_name = self._get_param("AutoScalingGroupName") | ||||
|         instance_ids = self._get_multi_param("InstanceIds.member") | ||||
| @ -445,8 +428,6 @@ class AutoScalingResponse(BaseResponse): | ||||
|         template = self.response_template(SET_INSTANCE_PROTECTION_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def terminate_instance_in_auto_scaling_group(self) -> str: | ||||
|         instance_id = self._get_param("InstanceId") | ||||
|         should_decrement_string = self._get_param("ShouldDecrementDesiredCapacity") | ||||
|  | ||||
| @ -5,7 +5,7 @@ from urllib.parse import unquote | ||||
| 
 | ||||
| from moto.core.responses import TYPE_RESPONSE, BaseResponse | ||||
| from moto.core.utils import path_url | ||||
| from moto.utilities.aws_headers import amz_crc32, amzn_request_id | ||||
| from moto.utilities.aws_headers import amz_crc32 | ||||
| 
 | ||||
| from .exceptions import ( | ||||
|     FunctionAlreadyExists, | ||||
| @ -129,9 +129,8 @@ class LambdaResponse(BaseResponse): | ||||
|             raise ValueError("Cannot handle request") | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def invoke(  # type: ignore | ||||
|         self, request=None, full_url="", headers=None | ||||
|     def invoke( | ||||
|         self, request: Any, full_url: str, headers: Any | ||||
|     ) -> Tuple[int, Dict[str, str], Union[str, bytes]]: | ||||
|         self.setup_class(request, full_url, headers) | ||||
|         if request.method == "POST": | ||||
| @ -140,7 +139,6 @@ class LambdaResponse(BaseResponse): | ||||
|             raise ValueError("Cannot handle request") | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def invoke_async( | ||||
|         self, request: Any, full_url: str, headers: Any | ||||
|     ) -> Tuple[int, Dict[str, str], Union[str, bytes]]: | ||||
|  | ||||
| @ -3,7 +3,6 @@ from urllib.parse import unquote, urlsplit | ||||
| 
 | ||||
| from moto.core.models import default_user_config | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import BatchBackend, batch_backends | ||||
| 
 | ||||
| @ -25,8 +24,6 @@ class BatchResponse(BaseResponse): | ||||
|         # Return element after the /v1/* | ||||
|         return urlsplit(self.uri).path.lstrip("/").split("/")[1] | ||||
| 
 | ||||
|     # CreateComputeEnvironment | ||||
|     @amzn_request_id | ||||
|     def createcomputeenvironment(self) -> str: | ||||
|         compute_env_name = self._get_param("computeEnvironmentName") | ||||
|         compute_resource = self._get_param("computeResources") | ||||
| @ -46,8 +43,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DescribeComputeEnvironments | ||||
|     @amzn_request_id | ||||
|     def describecomputeenvironments(self) -> str: | ||||
|         compute_environments = self._get_param("computeEnvironments") | ||||
| 
 | ||||
| @ -56,8 +51,6 @@ class BatchResponse(BaseResponse): | ||||
|         result = {"computeEnvironments": envs} | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DeleteComputeEnvironment | ||||
|     @amzn_request_id | ||||
|     def deletecomputeenvironment(self) -> str: | ||||
|         compute_environment = self._get_param("computeEnvironment") | ||||
| 
 | ||||
| @ -65,8 +58,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return "" | ||||
| 
 | ||||
|     # UpdateComputeEnvironment | ||||
|     @amzn_request_id | ||||
|     def updatecomputeenvironment(self) -> str: | ||||
|         compute_env_name = self._get_param("computeEnvironment") | ||||
|         compute_resource = self._get_param("computeResources") | ||||
| @ -84,8 +75,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # CreateJobQueue | ||||
|     @amzn_request_id | ||||
|     def createjobqueue(self) -> str: | ||||
|         compute_env_order = self._get_param("computeEnvironmentOrder") | ||||
|         queue_name = self._get_param("jobQueueName") | ||||
| @ -107,8 +96,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DescribeJobQueues | ||||
|     @amzn_request_id | ||||
|     def describejobqueues(self) -> str: | ||||
|         job_queues = self._get_param("jobQueues") | ||||
| 
 | ||||
| @ -117,8 +104,6 @@ class BatchResponse(BaseResponse): | ||||
|         result = {"jobQueues": queues} | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # UpdateJobQueue | ||||
|     @amzn_request_id | ||||
|     def updatejobqueue(self) -> str: | ||||
|         compute_env_order = self._get_param("computeEnvironmentOrder") | ||||
|         queue_name = self._get_param("jobQueue") | ||||
| @ -138,8 +123,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DeleteJobQueue | ||||
|     @amzn_request_id | ||||
|     def deletejobqueue(self) -> str: | ||||
|         queue_name = self._get_param("jobQueue") | ||||
| 
 | ||||
| @ -147,8 +130,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return "" | ||||
| 
 | ||||
|     # RegisterJobDefinition | ||||
|     @amzn_request_id | ||||
|     def registerjobdefinition(self) -> str: | ||||
|         container_properties = self._get_param("containerProperties") | ||||
|         node_properties = self._get_param("nodeProperties") | ||||
| @ -181,8 +162,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DeregisterJobDefinition | ||||
|     @amzn_request_id | ||||
|     def deregisterjobdefinition(self) -> str: | ||||
|         queue_name = self._get_param("jobDefinition") | ||||
| 
 | ||||
| @ -190,8 +169,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return "" | ||||
| 
 | ||||
|     # DescribeJobDefinitions | ||||
|     @amzn_request_id | ||||
|     def describejobdefinitions(self) -> str: | ||||
|         job_def_name = self._get_param("jobDefinitionName") | ||||
|         job_def_list = self._get_param("jobDefinitions") | ||||
| @ -204,8 +181,6 @@ class BatchResponse(BaseResponse): | ||||
|         result = {"jobDefinitions": [job.describe() for job in job_defs]} | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # SubmitJob | ||||
|     @amzn_request_id | ||||
|     def submitjob(self) -> str: | ||||
|         container_overrides = self._get_param("containerOverrides") | ||||
|         depends_on = self._get_param("dependsOn") | ||||
| @ -229,15 +204,11 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # DescribeJobs | ||||
|     @amzn_request_id | ||||
|     def describejobs(self) -> str: | ||||
|         jobs = self._get_param("jobs") | ||||
| 
 | ||||
|         return json.dumps({"jobs": self.batch_backend.describe_jobs(jobs)}) | ||||
| 
 | ||||
|     # ListJobs | ||||
|     @amzn_request_id | ||||
|     def listjobs(self) -> str: | ||||
|         job_queue = self._get_param("jobQueue") | ||||
|         job_status = self._get_param("jobStatus") | ||||
| @ -248,8 +219,6 @@ class BatchResponse(BaseResponse): | ||||
|         result = {"jobSummaryList": [job.describe_short() for job in jobs]} | ||||
|         return json.dumps(result) | ||||
| 
 | ||||
|     # TerminateJob | ||||
|     @amzn_request_id | ||||
|     def terminatejob(self) -> str: | ||||
|         job_id = self._get_param("jobId") | ||||
|         reason = self._get_param("reason") | ||||
| @ -258,8 +227,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return "" | ||||
| 
 | ||||
|     # CancelJob | ||||
|     @amzn_request_id | ||||
|     def canceljob(self) -> str: | ||||
|         job_id = self._get_param("jobId") | ||||
|         reason = self._get_param("reason") | ||||
| @ -267,7 +234,6 @@ class BatchResponse(BaseResponse): | ||||
| 
 | ||||
|         return "" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def tags(self) -> str: | ||||
|         resource_arn = unquote(self.path).split("/v1/tags/")[-1] | ||||
|         tags = self._get_param("tags") | ||||
| @ -281,7 +247,6 @@ class BatchResponse(BaseResponse): | ||||
|             self.batch_backend.untag_resource(resource_arn, tag_keys)  # type: ignore[arg-type] | ||||
|         return "" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def createschedulingpolicy(self) -> str: | ||||
|         body = json.loads(self.body) | ||||
|         name = body.get("name") | ||||
| @ -292,26 +257,22 @@ class BatchResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(policy.to_dict(create=True)) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describeschedulingpolicies(self) -> str: | ||||
|         body = json.loads(self.body) | ||||
|         arns = body.get("arns") or [] | ||||
|         policies = self.batch_backend.describe_scheduling_policies(arns) | ||||
|         return json.dumps({"schedulingPolicies": [pol.to_dict() for pol in policies]}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def listschedulingpolicies(self) -> str: | ||||
|         arns = self.batch_backend.list_scheduling_policies() | ||||
|         return json.dumps({"schedulingPolicies": [{"arn": arn} for arn in arns]}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def deleteschedulingpolicy(self) -> str: | ||||
|         body = json.loads(self.body) | ||||
|         arn = body["arn"] | ||||
|         self.batch_backend.delete_scheduling_policy(arn) | ||||
|         return "" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def updateschedulingpolicy(self) -> str: | ||||
|         body = json.loads(self.body) | ||||
|         arn = body.get("arn") | ||||
|  | ||||
| @ -8,7 +8,6 @@ from yaml.scanner import ScannerError  # pylint:disable=c-extension-no-member | ||||
| 
 | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.s3.exceptions import S3ClientError | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .exceptions import MissingParameterError, ValidationError | ||||
| from .models import CloudFormationBackend, FakeStack, cloudformation_backends | ||||
| @ -153,7 +152,6 @@ class CloudFormationResponse(BaseResponse): | ||||
|                 return True | ||||
|         return False | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_change_set(self) -> str: | ||||
|         stack_name = self._get_param("StackName") | ||||
|         change_set_name = self._get_param("ChangeSetName") | ||||
| @ -220,7 +218,6 @@ class CloudFormationResponse(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_CHANGE_SET_RESPONSE_TEMPLATE) | ||||
|         return template.render(change_set=change_set) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def execute_change_set(self) -> str: | ||||
|         stack_name = self._get_param("StackName") | ||||
|         change_set_name = self._get_param("ChangeSetName") | ||||
|  | ||||
| @ -4,7 +4,6 @@ from typing import Dict, Iterable, List, Tuple, Union | ||||
| from dateutil.parser import parse as dtparse | ||||
| 
 | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .exceptions import InvalidParameterCombination, ValidationError | ||||
| from .models import ( | ||||
| @ -32,7 +31,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(ERROR_RESPONSE_TEMPLATE) | ||||
|         return template.render(code=code, message=message), dict(status=status) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def put_metric_alarm(self) -> str: | ||||
|         name = self._get_param("AlarmName") | ||||
|         namespace = self._get_param("Namespace") | ||||
| @ -132,7 +130,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(PUT_METRIC_ALARM_TEMPLATE) | ||||
|         return template.render(alarm=alarm) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_alarms(self) -> str: | ||||
|         action_prefix = self._get_param("ActionPrefix") | ||||
|         alarm_name_prefix = self._get_param("AlarmNamePrefix") | ||||
| @ -160,14 +157,12 @@ class CloudWatchResponse(BaseResponse): | ||||
|             metric_alarms=metric_alarms, composite_alarms=composite_alarms | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_alarms(self) -> str: | ||||
|         alarm_names = self._get_multi_param("AlarmNames.member") | ||||
|         self.cloudwatch_backend.delete_alarms(alarm_names) | ||||
|         template = self.response_template(DELETE_METRIC_ALARMS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def put_metric_data(self) -> str: | ||||
|         namespace = self._get_param("Namespace") | ||||
|         metric_data = self._get_multi_param("MetricData.member") | ||||
| @ -175,7 +170,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(PUT_METRIC_DATA_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_metric_data(self) -> str: | ||||
|         params = self._get_params() | ||||
|         start = dtparse(params["StartTime"]) | ||||
| @ -196,7 +190,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(GET_METRIC_DATA_TEMPLATE) | ||||
|         return template.render(results=results) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_metric_statistics(self) -> str: | ||||
|         namespace = self._get_param("Namespace") | ||||
|         metric_name = self._get_param("MetricName") | ||||
| @ -228,7 +221,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(GET_METRIC_STATISTICS_TEMPLATE) | ||||
|         return template.render(label=metric_name, datapoints=datapoints) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_metrics(self) -> str: | ||||
|         namespace = self._get_param("Namespace") | ||||
|         metric_name = self._get_param("MetricName") | ||||
| @ -240,7 +232,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(LIST_METRICS_TEMPLATE) | ||||
|         return template.render(metrics=metrics, next_token=next_token) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_dashboards(self) -> Union[str, ERROR_RESPONSE]: | ||||
|         dashboards = self._get_multi_param("DashboardNames.member") | ||||
|         if dashboards is None: | ||||
| @ -253,7 +244,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(DELETE_DASHBOARD_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_alarm_history(self) -> None: | ||||
|         raise NotImplementedError() | ||||
| 
 | ||||
| @ -268,7 +258,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|                 metric_filtered_alarms.append(alarm) | ||||
|         return metric_filtered_alarms | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_alarms_for_metric(self) -> str: | ||||
|         alarms = self.cloudwatch_backend.get_all_alarms() | ||||
|         namespace = self._get_param("Namespace") | ||||
| @ -277,15 +266,12 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_METRIC_ALARMS_TEMPLATE) | ||||
|         return template.render(alarms=filtered_alarms) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def disable_alarm_actions(self) -> str: | ||||
|         raise NotImplementedError() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def enable_alarm_actions(self) -> str: | ||||
|         raise NotImplementedError() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_dashboard(self) -> Union[str, ERROR_RESPONSE]: | ||||
|         dashboard_name = self._get_param("DashboardName") | ||||
| 
 | ||||
| @ -296,7 +282,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(GET_DASHBOARD_TEMPLATE) | ||||
|         return template.render(dashboard=dashboard) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_dashboards(self) -> str: | ||||
|         prefix = self._get_param("DashboardNamePrefix", "") | ||||
| 
 | ||||
| @ -305,7 +290,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(LIST_DASHBOARD_RESPONSE) | ||||
|         return template.render(dashboards=dashboards) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def put_dashboard(self) -> Union[str, ERROR_RESPONSE]: | ||||
|         name = self._get_param("DashboardName") | ||||
|         body = self._get_param("DashboardBody") | ||||
| @ -320,7 +304,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(PUT_DASHBOARD_RESPONSE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def set_alarm_state(self) -> str: | ||||
|         alarm_name = self._get_param("AlarmName") | ||||
|         reason = self._get_param("StateReason") | ||||
| @ -334,7 +317,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(SET_ALARM_STATE_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_tags_for_resource(self) -> str: | ||||
|         resource_arn = self._get_param("ResourceARN") | ||||
| 
 | ||||
| @ -343,7 +325,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(LIST_TAGS_FOR_RESOURCE_TEMPLATE) | ||||
|         return template.render(tags=tags) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def tag_resource(self) -> str: | ||||
|         resource_arn = self._get_param("ResourceARN") | ||||
|         tags = self._get_multi_param("Tags.member") | ||||
| @ -353,7 +334,6 @@ class CloudWatchResponse(BaseResponse): | ||||
|         template = self.response_template(TAG_RESOURCE_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def untag_resource(self) -> str: | ||||
|         resource_arn = self._get_param("ResourceARN") | ||||
|         tag_keys = self._get_multi_param("TagKeys.member") | ||||
|  | ||||
| @ -37,6 +37,7 @@ from moto.core.utils import ( | ||||
|     params_sort_function, | ||||
|     utcfromtimestamp, | ||||
| ) | ||||
| from moto.utilities.aws_headers import gen_amzn_requestid_long | ||||
| from moto.utilities.utils import load_resource, load_resource_as_bytes | ||||
| 
 | ||||
| log = logging.getLogger(__name__) | ||||
| @ -267,7 +268,15 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): | ||||
| 
 | ||||
|         @functools.wraps(to_call)  # type: ignore | ||||
|         def _inner(request: Any, full_url: str, headers: Any) -> TYPE_RESPONSE: | ||||
|             return getattr(cls(), to_call.__name__)(request, full_url, headers) | ||||
|             response = getattr(cls(), to_call.__name__)(request, full_url, headers) | ||||
|             if isinstance(response, str): | ||||
|                 status = 200 | ||||
|                 body = response | ||||
|                 headers = {} | ||||
|             else: | ||||
|                 status, headers, body = response | ||||
|             headers, body = cls._enrich_response(headers, body) | ||||
|             return status, headers, body | ||||
| 
 | ||||
|         return _inner | ||||
| 
 | ||||
| @ -538,7 +547,10 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): | ||||
|             self._authenticate_and_authorize_normal_action(resource) | ||||
|         except HTTPException as http_error: | ||||
|             response = http_error.description, dict(status=http_error.code) | ||||
|             return self._send_response(headers, response) | ||||
|             status, headers, body = self._transform_response(headers, response) | ||||
|             headers, body = self._enrich_response(headers, body) | ||||
| 
 | ||||
|             return status, headers, body | ||||
| 
 | ||||
|         action = camelcase_to_underscores(self._get_action()) | ||||
|         method_names = method_names_from_class(self.__class__) | ||||
| @ -555,9 +567,14 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): | ||||
|                 response = http_error.description, response_headers  # type: ignore[assignment] | ||||
| 
 | ||||
|             if isinstance(response, str): | ||||
|                 return 200, headers, response | ||||
|                 status = 200 | ||||
|                 body = response | ||||
|             else: | ||||
|                 return self._send_response(headers, response) | ||||
|                 status, headers, body = self._transform_response(headers, response) | ||||
| 
 | ||||
|             headers, body = self._enrich_response(headers, body) | ||||
| 
 | ||||
|             return status, headers, body | ||||
| 
 | ||||
|         if not action: | ||||
|             return 404, headers, "" | ||||
| @ -565,19 +582,33 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): | ||||
|         raise NotImplementedError(f"The {action} action has not been implemented") | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _send_response(headers: Dict[str, str], response: Any) -> Tuple[int, Dict[str, str], str]:  # type: ignore[misc] | ||||
|     def _transform_response(headers: Dict[str, str], response: Any) -> TYPE_RESPONSE:  # type: ignore[misc] | ||||
|         if response is None: | ||||
|             response = "", {} | ||||
|         if len(response) == 2: | ||||
|             body, new_headers = response | ||||
|         else: | ||||
|             status, new_headers, body = response | ||||
|         status = new_headers.get("status", 200) | ||||
|         status = int(new_headers.get("status", 200)) | ||||
|         headers.update(new_headers) | ||||
|         return status, headers, body | ||||
| 
 | ||||
|     @staticmethod | ||||
|     def _enrich_response(  # type: ignore[misc] | ||||
|         headers: Dict[str, str], body: Any | ||||
|     ) -> Tuple[Dict[str, str], Any]: | ||||
|         # Cast status to string | ||||
|         if "status" in headers: | ||||
|             headers["status"] = str(headers["status"]) | ||||
|         return status, headers, body | ||||
|         # add request id | ||||
|         request_id = gen_amzn_requestid_long(headers) | ||||
| 
 | ||||
|         # Update request ID in XML | ||||
|         try: | ||||
|             body = re.sub(r"(?<=<RequestId>).*(?=<\/RequestId>)", request_id, body) | ||||
|         except Exception:  # Will just ignore if it cant work | ||||
|             pass | ||||
|         return headers, body | ||||
| 
 | ||||
|     def _get_param(self, param_name: str, if_none: Any = None) -> Any: | ||||
|         val = self.querystring.get(param_name) | ||||
|  | ||||
| @ -3,7 +3,6 @@ from typing import Any, Dict | ||||
| from urllib.parse import unquote | ||||
| 
 | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import DataBrewBackend, databrew_backends | ||||
| 
 | ||||
| @ -22,7 +21,6 @@ class DataBrewResponse(BaseResponse): | ||||
|     def parameters(self) -> Dict[str, Any]:  # type: ignore[misc] | ||||
|         return json.loads(self.body) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_recipe(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_CreateRecipe.html | ||||
|         recipe_description = self.parameters.get("Description") | ||||
| @ -35,7 +33,6 @@ class DataBrewResponse(BaseResponse): | ||||
|             ).as_dict() | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_recipe_version(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_DeleteRecipeVersion.html | ||||
|         split_path = self._get_path().strip("/").split("/") | ||||
| @ -47,7 +44,6 @@ class DataBrewResponse(BaseResponse): | ||||
|     def _get_path(self) -> str: | ||||
|         return unquote(self.parsed_url.path) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_recipes(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipes.html | ||||
|         next_token = self._get_param("NextToken", self._get_param("nextToken")) | ||||
| @ -71,7 +67,6 @@ class DataBrewResponse(BaseResponse): | ||||
|             } | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_recipe_versions(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRecipeVersions.html | ||||
|         recipe_name = self._get_param("Name", self._get_param("name")) | ||||
| @ -91,7 +86,6 @@ class DataBrewResponse(BaseResponse): | ||||
|             } | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def publish_recipe(self) -> str: | ||||
|         recipe_name = self._get_path().strip("/").split("/", 2)[1] | ||||
|         recipe_description = self.parameters.get("Description") | ||||
| @ -123,7 +117,6 @@ class DataBrewResponse(BaseResponse): | ||||
| 
 | ||||
|     # region Rulesets | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_ruleset(self) -> str: | ||||
|         ruleset_description = self.parameters.get("Description") | ||||
|         ruleset_rules = self.parameters.get("Rules") | ||||
| @ -162,7 +155,6 @@ class DataBrewResponse(BaseResponse): | ||||
|         self.databrew_backend.delete_ruleset(ruleset_name) | ||||
|         return json.dumps({"Name": ruleset_name}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_rulesets(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_ListRulesets.html | ||||
|         next_token = self._get_param("NextToken", self._get_param("nextToken")) | ||||
| @ -185,7 +177,6 @@ class DataBrewResponse(BaseResponse): | ||||
| 
 | ||||
|     # region Datasets | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_dataset(self) -> str: | ||||
|         dataset_name = self.parameters.get("Name") | ||||
|         dataset_format = self.parameters.get("Format") | ||||
| @ -205,7 +196,6 @@ class DataBrewResponse(BaseResponse): | ||||
|             ).as_dict() | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_datasets(self) -> str: | ||||
|         next_token = self._get_param("NextToken", self._get_param("nextToken")) | ||||
|         max_results = self._get_int_param( | ||||
| @ -224,7 +214,6 @@ class DataBrewResponse(BaseResponse): | ||||
|             } | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_dataset(self) -> str: | ||||
|         dataset_name = self._get_path().split("/")[-1] | ||||
|         dataset_format = self.parameters.get("Format") | ||||
| @ -243,13 +232,11 @@ class DataBrewResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(dataset.as_dict()) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_dataset(self) -> str: | ||||
|         dataset_name = self._get_path().split("/")[-1] | ||||
|         self.databrew_backend.delete_dataset(dataset_name) | ||||
|         return json.dumps({"Name": dataset_name}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_dataset(self) -> str: | ||||
|         dataset_name = self._get_path().split("/")[-1] | ||||
|         dataset = self.databrew_backend.describe_dataset(dataset_name) | ||||
| @ -258,7 +245,6 @@ class DataBrewResponse(BaseResponse): | ||||
|     # endregion | ||||
| 
 | ||||
|     # region Jobs | ||||
|     @amzn_request_id | ||||
|     def list_jobs(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_ListJobs.html | ||||
|         dataset_name = self._get_param("datasetName") | ||||
| @ -291,7 +277,6 @@ class DataBrewResponse(BaseResponse): | ||||
|         self.databrew_backend.delete_job(job_name) | ||||
|         return json.dumps({"Name": job_name}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_profile_job(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_CreateProfileJob.html | ||||
|         kwargs = { | ||||
| @ -331,7 +316,6 @@ class DataBrewResponse(BaseResponse): | ||||
|         } | ||||
|         return json.dumps(self.databrew_backend.update_profile_job(**kwargs).as_dict()) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_recipe_job(self) -> str: | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_CreateRecipeJob.html | ||||
|         kwargs = { | ||||
| @ -353,7 +337,6 @@ class DataBrewResponse(BaseResponse): | ||||
|         } | ||||
|         return json.dumps(self.databrew_backend.create_recipe_job(**kwargs).as_dict()) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_recipe_job(self) -> str: | ||||
|         name = self._get_path().rstrip("/").rsplit("/", 1)[1] | ||||
|         # https://docs.aws.amazon.com/databrew/latest/dg/API_UpdateRecipeJob.html | ||||
|  | ||||
| @ -6,12 +6,11 @@ from typing import Any, Callable, Dict, List, Optional, Union | ||||
| 
 | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.core.utils import camelcase_to_underscores | ||||
| from moto.dynamodb.models import DynamoDBBackend, Table, dynamodb_backends | ||||
| from moto.dynamodb.models.utilities import dynamo_json_dump | ||||
| from moto.dynamodb.parsing.key_condition_expression import parse_expression | ||||
| from moto.dynamodb.parsing.reserved_keywords import ReservedKeywords | ||||
| from moto.utilities.aws_headers import amz_crc32, amzn_request_id | ||||
| from moto.utilities.aws_headers import amz_crc32 | ||||
| 
 | ||||
| from .exceptions import ( | ||||
|     KeyIsEmptyStringException, | ||||
| @ -40,10 +39,12 @@ def include_consumed_capacity( | ||||
|             expected_capacity = handler.body.get("ReturnConsumedCapacity", "NONE") | ||||
|             if expected_capacity not in ["NONE", "TOTAL", "INDEXES"]: | ||||
|                 type_ = "ValidationException" | ||||
|                 headers = handler.response_headers.copy() | ||||
|                 headers["status"] = "400" | ||||
|                 message = f"1 validation error detected: Value '{expected_capacity}' at 'returnConsumedCapacity' failed to satisfy constraint: Member must satisfy enum value set: [INDEXES, TOTAL, NONE]" | ||||
|                 return ( | ||||
|                     400, | ||||
|                     handler.response_headers, | ||||
|                     headers, | ||||
|                     dynamo_json_dump({"__type": type_, "message": message}), | ||||
|                 ) | ||||
|             table_name = handler.body.get("TableName", "") | ||||
| @ -189,22 +190,9 @@ class DynamoHandler(BaseResponse): | ||||
|         return dynamodb_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amz_crc32 | ||||
|     @amzn_request_id | ||||
|     def call_action(self) -> TYPE_RESPONSE: | ||||
|         self.body = json.loads(self.body or "{}") | ||||
|         endpoint = self.get_endpoint_name(self.headers) | ||||
|         if endpoint: | ||||
|             endpoint = camelcase_to_underscores(endpoint) | ||||
|             response = getattr(self, endpoint)() | ||||
|             if isinstance(response, str): | ||||
|                 return 200, self.response_headers, response | ||||
| 
 | ||||
|             else: | ||||
|                 status_code, new_headers, response_content = response | ||||
|                 self.response_headers.update(new_headers) | ||||
|                 return status_code, self.response_headers, response_content | ||||
|         else: | ||||
|             return 404, self.response_headers, "" | ||||
|         return super().call_action() | ||||
| 
 | ||||
|     def list_tables(self) -> str: | ||||
|         body = self.body | ||||
|  | ||||
| @ -1,6 +1,5 @@ | ||||
| from moto.core.exceptions import RESTError | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .exceptions import ListenerOrBalancerMissingError, TargetGroupNotFoundError | ||||
| from .models import ELBv2Backend, elbv2_backends | ||||
| @ -375,7 +374,6 @@ class ELBV2Response(BaseResponse): | ||||
|     def elbv2_backend(self) -> ELBv2Backend: | ||||
|         return elbv2_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_load_balancer(self) -> str: | ||||
|         params = self._get_params() | ||||
|         load_balancer_name = params.get("Name") | ||||
| @ -398,7 +396,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(CREATE_LOAD_BALANCER_TEMPLATE) | ||||
|         return template.render(load_balancer=load_balancer) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_rule(self) -> str: | ||||
|         params = self._get_params() | ||||
|         rules = self.elbv2_backend.create_rule( | ||||
| @ -412,7 +409,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(CREATE_RULE_TEMPLATE) | ||||
|         return template.render(rules=rules) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_target_group(self) -> str: | ||||
|         params = self._get_params() | ||||
|         name = params.get("Name") | ||||
| @ -456,7 +452,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(CREATE_TARGET_GROUP_TEMPLATE) | ||||
|         return template.render(target_group=target_group) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_listener(self) -> str: | ||||
|         params = self._get_params() | ||||
|         load_balancer_arn = self._get_param("LoadBalancerArn") | ||||
| @ -486,7 +481,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(CREATE_LISTENER_TEMPLATE) | ||||
|         return template.render(listener=listener) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_load_balancers(self) -> str: | ||||
|         arns = self._get_multi_param("LoadBalancerArns.member") | ||||
|         names = self._get_multi_param("Names.member") | ||||
| @ -510,7 +504,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LOAD_BALANCERS_TEMPLATE) | ||||
|         return template.render(load_balancers=load_balancers_resp, marker=next_marker) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_rules(self) -> str: | ||||
|         listener_arn = self._get_param("ListenerArn") | ||||
|         rule_arns = ( | ||||
| @ -539,7 +532,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_RULES_TEMPLATE) | ||||
|         return template.render(rules=rules_resp, marker=next_marker) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_target_groups(self) -> str: | ||||
|         load_balancer_arn = self._get_param("LoadBalancerArn") | ||||
|         target_group_arns = self._get_multi_param("TargetGroupArns.member") | ||||
| @ -551,7 +543,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_TARGET_GROUPS_TEMPLATE) | ||||
|         return template.render(target_groups=target_groups) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_target_group_attributes(self) -> str: | ||||
|         target_group_arn = self._get_param("TargetGroupArn") | ||||
|         target_group = self.elbv2_backend.target_groups.get(target_group_arn) | ||||
| @ -560,7 +551,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_TARGET_GROUP_ATTRIBUTES_TEMPLATE) | ||||
|         return template.render(attributes=target_group.attributes) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_listeners(self) -> str: | ||||
|         load_balancer_arn = self._get_param("LoadBalancerArn") | ||||
|         listener_arns = self._get_multi_param("ListenerArns.member") | ||||
| @ -573,35 +563,30 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LISTENERS_TEMPLATE) | ||||
|         return template.render(listeners=listeners) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_load_balancer(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         self.elbv2_backend.delete_load_balancer(arn) | ||||
|         template = self.response_template(DELETE_LOAD_BALANCER_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_rule(self) -> str: | ||||
|         arn = self._get_param("RuleArn") | ||||
|         self.elbv2_backend.delete_rule(arn) | ||||
|         template = self.response_template(DELETE_RULE_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_target_group(self) -> str: | ||||
|         arn = self._get_param("TargetGroupArn") | ||||
|         self.elbv2_backend.delete_target_group(arn) | ||||
|         template = self.response_template(DELETE_TARGET_GROUP_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_listener(self) -> str: | ||||
|         arn = self._get_param("ListenerArn") | ||||
|         self.elbv2_backend.delete_listener(arn) | ||||
|         template = self.response_template(DELETE_LISTENER_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def modify_rule(self) -> str: | ||||
|         rule_arn = self._get_param("RuleArn") | ||||
|         params = self._get_params() | ||||
| @ -613,7 +598,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(MODIFY_RULE_TEMPLATE) | ||||
|         return template.render(rules=rules) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def modify_target_group_attributes(self) -> str: | ||||
|         target_group_arn = self._get_param("TargetGroupArn") | ||||
|         attrs = self._get_list_prefix("Attributes.member") | ||||
| @ -623,7 +607,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(MODIFY_TARGET_GROUP_ATTRIBUTES_TEMPLATE) | ||||
|         return template.render(attributes=attributes) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def register_targets(self) -> str: | ||||
|         target_group_arn = self._get_param("TargetGroupArn") | ||||
|         targets = self._get_list_prefix("Targets.member") | ||||
| @ -632,7 +615,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(REGISTER_TARGETS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def deregister_targets(self) -> str: | ||||
|         target_group_arn = self._get_param("TargetGroupArn") | ||||
|         targets = self._get_list_prefix("Targets.member") | ||||
| @ -641,7 +623,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DEREGISTER_TARGETS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_target_health(self) -> str: | ||||
|         target_group_arn = self._get_param("TargetGroupArn") | ||||
|         targets = self._get_list_prefix("Targets.member") | ||||
| @ -652,7 +633,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_TARGET_HEALTH_TEMPLATE) | ||||
|         return template.render(target_health_descriptions=target_health_descriptions) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def set_rule_priorities(self) -> str: | ||||
|         rule_priorities = self._get_list_prefix("RulePriorities.member") | ||||
|         for rule_priority in rule_priorities: | ||||
| @ -661,7 +641,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(SET_RULE_PRIORITIES_TEMPLATE) | ||||
|         return template.render(rules=rules) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def add_tags(self) -> str: | ||||
|         resource_arns = self._get_multi_param("ResourceArns.member") | ||||
|         tags = self._get_params().get("Tags") | ||||
| @ -671,7 +650,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(ADD_TAGS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def remove_tags(self) -> str: | ||||
|         resource_arns = self._get_multi_param("ResourceArns.member") | ||||
|         tag_keys = self._get_multi_param("TagKeys.member") | ||||
| @ -681,7 +659,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(REMOVE_TAGS_TEMPLATE) | ||||
|         return template.render() | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_tags(self) -> str: | ||||
|         resource_arns = self._get_multi_param("ResourceArns.member") | ||||
|         resource_tags = self.elbv2_backend.describe_tags(resource_arns) | ||||
| @ -689,7 +666,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_TAGS_TEMPLATE) | ||||
|         return template.render(resource_tags=resource_tags) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_account_limits(self) -> str: | ||||
|         # Supports paging but not worth implementing yet | ||||
|         # marker = self._get_param('Marker') | ||||
| @ -709,7 +685,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LIMITS_TEMPLATE) | ||||
|         return template.render(limits=limits) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_ssl_policies(self) -> str: | ||||
|         names = self._get_multi_param("Names.member.") | ||||
|         # Supports paging but not worth implementing yet | ||||
| @ -723,7 +698,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_SSL_POLICIES_TEMPLATE) | ||||
|         return template.render(policies=policies) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def set_ip_address_type(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         ip_type = self._get_param("IpAddressType") | ||||
| @ -733,7 +707,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(SET_IP_ADDRESS_TYPE_TEMPLATE) | ||||
|         return template.render(ip_type=ip_type) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def set_security_groups(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         sec_groups = self._get_multi_param("SecurityGroups.member.") | ||||
| @ -743,7 +716,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(SET_SECURITY_GROUPS_TEMPLATE) | ||||
|         return template.render(sec_groups=sec_groups) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def set_subnets(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         subnets = self._get_multi_param("Subnets.member.") | ||||
| @ -754,7 +726,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(SET_SUBNETS_TEMPLATE) | ||||
|         return template.render(subnets=subnet_zone_list) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def modify_load_balancer_attributes(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         attrs = self._get_map_prefix( | ||||
| @ -766,7 +737,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(MODIFY_LOADBALANCER_ATTRS_TEMPLATE) | ||||
|         return template.render(attrs=all_attrs) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_load_balancer_attributes(self) -> str: | ||||
|         arn = self._get_param("LoadBalancerArn") | ||||
|         attrs = self.elbv2_backend.describe_load_balancer_attributes(arn) | ||||
| @ -774,7 +744,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LOADBALANCER_ATTRS_TEMPLATE) | ||||
|         return template.render(attrs=attrs) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def modify_target_group(self) -> str: | ||||
|         arn = self._get_param("TargetGroupArn") | ||||
| 
 | ||||
| @ -806,7 +775,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(MODIFY_TARGET_GROUP_TEMPLATE) | ||||
|         return template.render(target_group=target_group) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def modify_listener(self) -> str: | ||||
|         arn = self._get_param("ListenerArn") | ||||
|         port = self._get_param("Port") | ||||
| @ -828,7 +796,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(MODIFY_LISTENER_TEMPLATE) | ||||
|         return template.render(listener=listener) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def add_listener_certificates(self) -> str: | ||||
|         arn = self._get_param("ListenerArn") | ||||
|         certificates = self._get_list_prefix("Certificates.member") | ||||
| @ -839,7 +806,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(ADD_LISTENER_CERTIFICATES_TEMPLATE) | ||||
|         return template.render(certificates=certificate_arns) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_listener_certificates(self) -> str: | ||||
|         arn = self._get_param("ListenerArn") | ||||
|         certificates = self.elbv2_backend.describe_listener_certificates(arn) | ||||
| @ -847,7 +813,6 @@ class ELBV2Response(BaseResponse): | ||||
|         template = self.response_template(DESCRIBE_LISTENER_CERTIFICATES_TEMPLATE) | ||||
|         return template.render(certificates=certificates) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def remove_listener_certificates(self) -> str: | ||||
|         arn = self._get_param("ListenerArn") | ||||
|         certificates = self._get_list_prefix("Certificates.member") | ||||
|  | ||||
| @ -2,7 +2,6 @@ import json | ||||
| 
 | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import ForecastBackend, forecast_backends | ||||
| 
 | ||||
| @ -15,7 +14,6 @@ class ForecastResponse(BaseResponse): | ||||
|     def forecast_backend(self) -> ForecastBackend: | ||||
|         return forecast_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_dataset_group(self) -> TYPE_RESPONSE: | ||||
|         dataset_group_name = self._get_param("DatasetGroupName") | ||||
|         domain = self._get_param("Domain") | ||||
| @ -31,7 +29,6 @@ class ForecastResponse(BaseResponse): | ||||
|         response = {"DatasetGroupArn": dataset_group.arn} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_dataset_group(self) -> TYPE_RESPONSE: | ||||
|         dataset_group_arn = self._get_param("DatasetGroupArn") | ||||
| 
 | ||||
| @ -49,20 +46,17 @@ class ForecastResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_dataset_group(self) -> TYPE_RESPONSE: | ||||
|         dataset_group_arn = self._get_param("DatasetGroupArn") | ||||
|         self.forecast_backend.delete_dataset_group(dataset_group_arn) | ||||
|         return 200, {}, "" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_dataset_group(self) -> TYPE_RESPONSE: | ||||
|         dataset_group_arn = self._get_param("DatasetGroupArn") | ||||
|         dataset_arns = self._get_param("DatasetArns") | ||||
|         self.forecast_backend.update_dataset_group(dataset_group_arn, dataset_arns) | ||||
|         return 200, {}, "" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_dataset_groups(self) -> TYPE_RESPONSE: | ||||
|         list_all = sorted( | ||||
|             [ | ||||
|  | ||||
| @ -21,7 +21,6 @@ from moto.s3bucket_path.utils import ( | ||||
| from moto.s3bucket_path.utils import ( | ||||
|     parse_key_name as bucketpath_parse_key_name, | ||||
| ) | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .exceptions import ( | ||||
|     AccessForbidden, | ||||
| @ -284,7 +283,6 @@ class S3Response(BaseResponse): | ||||
|             # Using path-based buckets | ||||
|             return self.bucket_response(request, full_url, headers) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def bucket_response( | ||||
|         self, request: Any, full_url: str, headers: Any | ||||
|     ) -> TYPE_RESPONSE: | ||||
| @ -1246,7 +1244,6 @@ class S3Response(BaseResponse): | ||||
|         # last line should equal | ||||
|         # amz-checksum-sha256:<..>\r\n | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def key_response( | ||||
|         self, request: Any, full_url: str, headers: Dict[str, Any] | ||||
|     ) -> TYPE_RESPONSE: | ||||
|  | ||||
| @ -7,7 +7,6 @@ from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.s3.exceptions import S3ClientError | ||||
| from moto.s3.responses import S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import S3ControlBackend, s3control_backends | ||||
| 
 | ||||
| @ -20,7 +19,6 @@ class S3ControlResponse(BaseResponse): | ||||
|     def backend(self) -> S3ControlBackend: | ||||
|         return s3control_backends[self.current_account]["global"] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def public_access_block(self, request: Any, full_url: str, headers: Any) -> TYPE_RESPONSE:  # type: ignore | ||||
|         self.setup_class(request, full_url, headers) | ||||
|         try: | ||||
|  | ||||
| @ -4,7 +4,6 @@ from typing import Any | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.sagemaker.exceptions import AWSValidationException | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import SageMakerModelBackend, sagemaker_backends | ||||
| 
 | ||||
| @ -52,7 +51,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         models = self.sagemaker_backend.list_models() | ||||
|         return json.dumps({"Models": [model.response_object for model in models]}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_notebook_instance(self) -> TYPE_RESPONSE: | ||||
|         sagemaker_notebook = self.sagemaker_backend.create_notebook_instance( | ||||
|             notebook_instance_name=self._get_param("NotebookInstanceName"), | ||||
| @ -72,7 +70,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps({"NotebookInstanceArn": sagemaker_notebook.arn}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_notebook_instance(self) -> str: | ||||
|         notebook_instance_name = self._get_param("NotebookInstanceName") | ||||
|         notebook_instance = self.sagemaker_backend.get_notebook_instance( | ||||
| @ -80,25 +77,21 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(notebook_instance.to_dict()) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def start_notebook_instance(self) -> TYPE_RESPONSE: | ||||
|         notebook_instance_name = self._get_param("NotebookInstanceName") | ||||
|         self.sagemaker_backend.start_notebook_instance(notebook_instance_name) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def stop_notebook_instance(self) -> TYPE_RESPONSE: | ||||
|         notebook_instance_name = self._get_param("NotebookInstanceName") | ||||
|         self.sagemaker_backend.stop_notebook_instance(notebook_instance_name) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_notebook_instance(self) -> TYPE_RESPONSE: | ||||
|         notebook_instance_name = self._get_param("NotebookInstanceName") | ||||
|         self.sagemaker_backend.delete_notebook_instance(notebook_instance_name) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_notebook_instances(self) -> str: | ||||
|         sort_by = self._get_param("SortBy", "Name") | ||||
|         sort_order = self._get_param("SortOrder", "Ascending") | ||||
| @ -121,7 +114,6 @@ class SageMakerResponse(BaseResponse): | ||||
|             } | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_tags(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("ResourceArn") | ||||
|         max_results = self._get_param("MaxResults") | ||||
| @ -134,21 +126,18 @@ class SageMakerResponse(BaseResponse): | ||||
|             response["NextToken"] = next_token | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def add_tags(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("ResourceArn") | ||||
|         tags = self._get_param("Tags") | ||||
|         tags = self.sagemaker_backend.add_tags(arn, tags) | ||||
|         return 200, {}, json.dumps({"Tags": tags}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_tags(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("ResourceArn") | ||||
|         tag_keys = self._get_param("TagKeys") | ||||
|         self.sagemaker_backend.delete_tags(arn, tag_keys) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_endpoint_config(self) -> TYPE_RESPONSE: | ||||
|         endpoint_config = self.sagemaker_backend.create_endpoint_config( | ||||
|             endpoint_config_name=self._get_param("EndpointConfigName"), | ||||
| @ -163,19 +152,16 @@ class SageMakerResponse(BaseResponse): | ||||
|             json.dumps({"EndpointConfigArn": endpoint_config.endpoint_config_arn}), | ||||
|         ) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_endpoint_config(self) -> str: | ||||
|         endpoint_config_name = self._get_param("EndpointConfigName") | ||||
|         response = self.sagemaker_backend.describe_endpoint_config(endpoint_config_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_endpoint_config(self) -> TYPE_RESPONSE: | ||||
|         endpoint_config_name = self._get_param("EndpointConfigName") | ||||
|         self.sagemaker_backend.delete_endpoint_config(endpoint_config_name) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_endpoint(self) -> TYPE_RESPONSE: | ||||
|         endpoint = self.sagemaker_backend.create_endpoint( | ||||
|             endpoint_name=self._get_param("EndpointName"), | ||||
| @ -184,19 +170,16 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps({"EndpointArn": endpoint.endpoint_arn}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_endpoint(self) -> str: | ||||
|         endpoint_name = self._get_param("EndpointName") | ||||
|         response = self.sagemaker_backend.describe_endpoint(endpoint_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_endpoint(self) -> TYPE_RESPONSE: | ||||
|         endpoint_name = self._get_param("EndpointName") | ||||
|         self.sagemaker_backend.delete_endpoint(endpoint_name) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_processing_job(self) -> TYPE_RESPONSE: | ||||
|         processing_job = self.sagemaker_backend.create_processing_job( | ||||
|             app_specification=self._get_param("AppSpecification"), | ||||
| @ -212,13 +195,11 @@ class SageMakerResponse(BaseResponse): | ||||
|         response = {"ProcessingJobArn": processing_job.processing_job_arn} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_processing_job(self) -> str: | ||||
|         processing_job_name = self._get_param("ProcessingJobName") | ||||
|         response = self.sagemaker_backend.describe_processing_job(processing_job_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_transform_job(self) -> TYPE_RESPONSE: | ||||
|         transform_job = self.sagemaker_backend.create_transform_job( | ||||
|             transform_job_name=self._get_param("TransformJobName"), | ||||
| @ -241,7 +222,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_transform_job(self) -> str: | ||||
|         transform_job_name = self._get_param("TransformJobName") | ||||
|         response = self.sagemaker_backend.describe_transform_job( | ||||
| @ -249,7 +229,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_training_job(self) -> TYPE_RESPONSE: | ||||
|         training_job = self.sagemaker_backend.create_training_job( | ||||
|             training_job_name=self._get_param("TrainingJobName"), | ||||
| @ -280,13 +259,11 @@ class SageMakerResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_training_job(self) -> str: | ||||
|         training_job_name = self._get_param("TrainingJobName") | ||||
|         response = self.sagemaker_backend.describe_training_job(training_job_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_notebook_instance_lifecycle_config(self) -> TYPE_RESPONSE: | ||||
|         lifecycle_configuration = ( | ||||
|             self.sagemaker_backend.create_notebook_instance_lifecycle_config( | ||||
| @ -302,7 +279,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_notebook_instance_lifecycle_config(self) -> str: | ||||
|         response = self.sagemaker_backend.describe_notebook_instance_lifecycle_config( | ||||
|             notebook_instance_lifecycle_config_name=self._get_param( | ||||
| @ -311,7 +287,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_notebook_instance_lifecycle_config(self) -> TYPE_RESPONSE: | ||||
|         self.sagemaker_backend.delete_notebook_instance_lifecycle_config( | ||||
|             notebook_instance_lifecycle_config_name=self._get_param( | ||||
| @ -320,7 +295,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def search(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.search( | ||||
|             resource=self._get_param("Resource"), | ||||
| @ -328,7 +302,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_experiments(self) -> TYPE_RESPONSE: | ||||
|         MaxResults = self._get_param("MaxResults") | ||||
|         NextToken = self._get_param("NextToken") | ||||
| @ -356,28 +329,24 @@ class SageMakerResponse(BaseResponse): | ||||
| 
 | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_experiment(self) -> TYPE_RESPONSE: | ||||
|         self.sagemaker_backend.delete_experiment( | ||||
|             experiment_name=self._get_param("ExperimentName") | ||||
|         ) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_experiment(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.create_experiment( | ||||
|             experiment_name=self._get_param("ExperimentName") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_experiment(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.describe_experiment( | ||||
|             experiment_name=self._get_param("ExperimentName") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_trials(self) -> TYPE_RESPONSE: | ||||
|         MaxResults = self._get_param("MaxResults") | ||||
|         NextToken = self._get_param("NextToken") | ||||
| @ -408,7 +377,6 @@ class SageMakerResponse(BaseResponse): | ||||
| 
 | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_trial(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.create_trial( | ||||
|             trial_name=self._get_param("TrialName"), | ||||
| @ -416,7 +384,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_trial_components(self) -> TYPE_RESPONSE: | ||||
|         MaxResults = self._get_param("MaxResults") | ||||
|         NextToken = self._get_param("NextToken") | ||||
| @ -446,7 +413,6 @@ class SageMakerResponse(BaseResponse): | ||||
| 
 | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_trial_component(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.create_trial_component( | ||||
|             trial_component_name=self._get_param("TrialComponentName"), | ||||
| @ -454,31 +420,26 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_trial(self) -> str: | ||||
|         trial_name = self._get_param("TrialName") | ||||
|         response = self.sagemaker_backend.describe_trial(trial_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_trial(self) -> TYPE_RESPONSE: | ||||
|         trial_name = self._get_param("TrialName") | ||||
|         self.sagemaker_backend.delete_trial(trial_name) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_trial_component(self) -> TYPE_RESPONSE: | ||||
|         trial_component_name = self._get_param("TrialComponentName") | ||||
|         self.sagemaker_backend.delete_trial_component(trial_component_name) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_trial_component(self) -> str: | ||||
|         trial_component_name = self._get_param("TrialComponentName") | ||||
|         response = self.sagemaker_backend.describe_trial_component(trial_component_name) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def associate_trial_component(self) -> TYPE_RESPONSE: | ||||
|         trial_name = self._get_param("TrialName") | ||||
|         trial_component_name = self._get_param("TrialComponentName") | ||||
| @ -487,7 +448,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def disassociate_trial_component(self) -> TYPE_RESPONSE: | ||||
|         trial_component_name = self._get_param("TrialComponentName") | ||||
|         trial_name = self._get_param("TrialName") | ||||
| @ -496,14 +456,12 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_pipeline(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.describe_pipeline( | ||||
|             self._get_param("PipelineName") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def start_pipeline_execution(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.start_pipeline_execution( | ||||
|             self._get_param("PipelineName"), | ||||
| @ -515,35 +473,30 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_pipeline_execution(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.describe_pipeline_execution( | ||||
|             self._get_param("PipelineExecutionArn") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_pipeline_definition_for_execution(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.describe_pipeline_definition_for_execution( | ||||
|             self._get_param("PipelineExecutionArn") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_pipeline_parameters_for_execution(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.list_pipeline_parameters_for_execution( | ||||
|             self._get_param("PipelineExecutionArn") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_pipeline_executions(self) -> TYPE_RESPONSE: | ||||
|         response = self.sagemaker_backend.list_pipeline_executions( | ||||
|             self._get_param("PipelineName") | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_pipeline(self) -> TYPE_RESPONSE: | ||||
|         pipeline = self.sagemaker_backend.create_pipeline( | ||||
|             pipeline_name=self._get_param("PipelineName"), | ||||
| @ -563,7 +516,6 @@ class SageMakerResponse(BaseResponse): | ||||
| 
 | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_pipeline(self) -> TYPE_RESPONSE: | ||||
|         pipeline_arn = self.sagemaker_backend.delete_pipeline( | ||||
|             pipeline_name=self._get_param("PipelineName"), | ||||
| @ -571,7 +523,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         response = {"PipelineArn": pipeline_arn} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_pipeline(self) -> TYPE_RESPONSE: | ||||
|         pipeline_arn = self.sagemaker_backend.update_pipeline( | ||||
|             pipeline_name=self._get_param("PipelineName"), | ||||
| @ -588,7 +539,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         response = {"PipelineArn": pipeline_arn} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_pipelines(self) -> TYPE_RESPONSE: | ||||
|         max_results_range = range(1, 101) | ||||
|         allowed_sort_by = ("Name", "CreationTime") | ||||
| @ -631,7 +581,6 @@ class SageMakerResponse(BaseResponse): | ||||
| 
 | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_processing_jobs(self) -> TYPE_RESPONSE: | ||||
|         max_results_range = range(1, 101) | ||||
|         allowed_sort_by = ["Name", "CreationTime", "Status"] | ||||
| @ -684,7 +633,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_transform_jobs(self) -> TYPE_RESPONSE: | ||||
|         max_results_range = range(1, 101) | ||||
|         allowed_sort_by = ["Name", "CreationTime", "Status"] | ||||
| @ -737,7 +685,6 @@ class SageMakerResponse(BaseResponse): | ||||
|         ) | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_training_jobs(self) -> TYPE_RESPONSE: | ||||
|         max_results_range = range(1, 101) | ||||
|         allowed_sort_by = ["Name", "CreationTime", "Status"] | ||||
|  | ||||
| @ -12,7 +12,7 @@ from moto.core.utils import ( | ||||
|     camelcase_to_underscores, | ||||
|     underscores_to_camelcase, | ||||
| ) | ||||
| from moto.utilities.aws_headers import amz_crc32, amzn_request_id | ||||
| from moto.utilities.aws_headers import amz_crc32 | ||||
| from moto.utilities.constants import JSON_TYPES | ||||
| 
 | ||||
| from .constants import ( | ||||
| @ -134,7 +134,6 @@ class SQSResponse(BaseResponse): | ||||
|         return visibility_timeout | ||||
| 
 | ||||
|     @amz_crc32  # crc last as request_id can edit XML | ||||
|     @amzn_request_id | ||||
|     def call_action(self) -> TYPE_RESPONSE: | ||||
|         status_code, headers, body = super().call_action() | ||||
|         if status_code == 404: | ||||
|  | ||||
| @ -2,7 +2,6 @@ import json | ||||
| 
 | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import StepFunctionBackend, stepfunctions_backends | ||||
| 
 | ||||
| @ -15,7 +14,6 @@ class StepFunctionResponse(BaseResponse): | ||||
|     def stepfunction_backend(self) -> StepFunctionBackend: | ||||
|         return stepfunctions_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_state_machine(self) -> TYPE_RESPONSE: | ||||
|         name = self._get_param("name") | ||||
|         definition = self._get_param("definition") | ||||
| @ -30,7 +28,6 @@ class StepFunctionResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_state_machines(self) -> TYPE_RESPONSE: | ||||
|         max_results = self._get_int_param("maxResults") | ||||
|         next_token = self._get_param("nextToken") | ||||
| @ -50,12 +47,10 @@ class StepFunctionResponse(BaseResponse): | ||||
|             response["nextToken"] = next_token | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_state_machine(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("stateMachineArn") | ||||
|         return self._describe_state_machine(arn) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def _describe_state_machine(self, state_machine_arn: str) -> TYPE_RESPONSE: | ||||
|         state_machine = self.stepfunction_backend.describe_state_machine( | ||||
|             state_machine_arn | ||||
| @ -70,13 +65,11 @@ class StepFunctionResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_state_machine(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("stateMachineArn") | ||||
|         self.stepfunction_backend.delete_state_machine(arn) | ||||
|         return 200, {}, json.dumps("{}") | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_state_machine(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("stateMachineArn") | ||||
|         definition = self._get_param("definition") | ||||
| @ -89,28 +82,24 @@ class StepFunctionResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_tags_for_resource(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("resourceArn") | ||||
|         tags = self.stepfunction_backend.list_tags_for_resource(arn) | ||||
|         response = {"tags": tags} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def tag_resource(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("resourceArn") | ||||
|         tags = self._get_param("tags", []) | ||||
|         self.stepfunction_backend.tag_resource(arn, tags) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def untag_resource(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("resourceArn") | ||||
|         tag_keys = self._get_param("tagKeys", []) | ||||
|         self.stepfunction_backend.untag_resource(arn, tag_keys) | ||||
|         return 200, {}, json.dumps({}) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def start_execution(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("stateMachineArn") | ||||
|         name = self._get_param("name") | ||||
| @ -124,7 +113,6 @@ class StepFunctionResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_executions(self) -> TYPE_RESPONSE: | ||||
|         max_results = self._get_int_param("maxResults") | ||||
|         next_token = self._get_param("nextToken") | ||||
| @ -153,7 +141,6 @@ class StepFunctionResponse(BaseResponse): | ||||
|             response["nextToken"] = next_token | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_execution(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("executionArn") | ||||
|         execution = self.stepfunction_backend.describe_execution(arn) | ||||
| @ -168,20 +155,17 @@ class StepFunctionResponse(BaseResponse): | ||||
|         } | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def describe_state_machine_for_execution(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("executionArn") | ||||
|         execution = self.stepfunction_backend.describe_execution(arn) | ||||
|         return self._describe_state_machine(execution.state_machine_arn) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def stop_execution(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("executionArn") | ||||
|         execution = self.stepfunction_backend.stop_execution(arn) | ||||
|         response = {"stopDate": execution.stop_date} | ||||
|         return 200, {}, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_execution_history(self) -> TYPE_RESPONSE: | ||||
|         execution_arn = self._get_param("executionArn") | ||||
|         execution_history = self.stepfunction_backend.get_execution_history( | ||||
|  | ||||
| @ -1,7 +1,6 @@ | ||||
| import json | ||||
| 
 | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import TranscribeBackend, transcribe_backends | ||||
| 
 | ||||
| @ -14,7 +13,6 @@ class TranscribeResponse(BaseResponse): | ||||
|     def transcribe_backend(self) -> TranscribeBackend: | ||||
|         return transcribe_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def start_transcription_job(self) -> str: | ||||
|         name = self._get_param("TranscriptionJobName") | ||||
|         response = self.transcribe_backend.start_transcription_job( | ||||
| @ -37,7 +35,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def start_medical_transcription_job(self) -> str: | ||||
|         name = self._get_param("MedicalTranscriptionJobName") | ||||
|         response = self.transcribe_backend.start_medical_transcription_job( | ||||
| @ -54,7 +51,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_transcription_jobs(self) -> str: | ||||
|         state_equals = self._get_param("Status") | ||||
|         job_name_contains = self._get_param("JobNameContains") | ||||
| @ -69,7 +65,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_medical_transcription_jobs(self) -> str: | ||||
|         status = self._get_param("Status") | ||||
|         job_name_contains = self._get_param("JobNameContains") | ||||
| @ -84,7 +79,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_transcription_job(self) -> str: | ||||
|         transcription_job_name = self._get_param("TranscriptionJobName") | ||||
|         response = self.transcribe_backend.get_transcription_job( | ||||
| @ -92,7 +86,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_medical_transcription_job(self) -> str: | ||||
|         medical_transcription_job_name = self._get_param("MedicalTranscriptionJobName") | ||||
|         response = self.transcribe_backend.get_medical_transcription_job( | ||||
| @ -100,7 +93,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_transcription_job(self) -> str: | ||||
|         transcription_job_name = self._get_param("TranscriptionJobName") | ||||
|         self.transcribe_backend.delete_transcription_job( | ||||
| @ -108,7 +100,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_medical_transcription_job(self) -> str: | ||||
|         medical_transcription_job_name = self._get_param("MedicalTranscriptionJobName") | ||||
|         self.transcribe_backend.delete_medical_transcription_job( | ||||
| @ -116,7 +107,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         language_code = self._get_param("LanguageCode") | ||||
| @ -130,7 +120,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_medical_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         language_code = self._get_param("LanguageCode") | ||||
| @ -142,7 +131,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         response = self.transcribe_backend.get_vocabulary( | ||||
| @ -150,7 +138,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_medical_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         response = self.transcribe_backend.get_medical_vocabulary( | ||||
| @ -158,7 +145,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_vocabularies(self) -> str: | ||||
|         state_equals = self._get_param("StateEquals") | ||||
|         name_contains = self._get_param("NameContains") | ||||
| @ -173,7 +159,6 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_medical_vocabularies(self) -> str: | ||||
|         state_equals = self._get_param("StateEquals") | ||||
|         name_contains = self._get_param("NameContains") | ||||
| @ -188,13 +173,11 @@ class TranscribeResponse(BaseResponse): | ||||
|         ) | ||||
|         return json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         self.transcribe_backend.delete_vocabulary(vocabulary_name=vocabulary_name) | ||||
|         return "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_medical_vocabulary(self) -> str: | ||||
|         vocabulary_name = self._get_param("VocabularyName") | ||||
|         self.transcribe_backend.delete_medical_vocabulary( | ||||
|  | ||||
| @ -7,9 +7,6 @@ else: | ||||
|     Protocol = object | ||||
| 
 | ||||
| import binascii | ||||
| import re | ||||
| 
 | ||||
| from moto.moto_api._internal import mock_random as random | ||||
| 
 | ||||
| TypeDec = TypeVar("TypeDec", bound=Callable[..., Any]) | ||||
| 
 | ||||
| @ -32,6 +29,8 @@ def gen_amz_crc32(response: Any, headerdict: Optional[Dict[str, Any]] = None) -> | ||||
| 
 | ||||
| 
 | ||||
| def gen_amzn_requestid_long(headerdict: Optional[Dict[str, Any]] = None) -> str: | ||||
|     from moto.moto_api._internal import mock_random as random | ||||
| 
 | ||||
|     req_id = random.get_random_string(length=52) | ||||
| 
 | ||||
|     if headerdict is not None and isinstance(headerdict, dict): | ||||
| @ -53,7 +52,7 @@ def amz_crc32(f: TypeDec) -> GenericFunction: | ||||
|         else: | ||||
|             if len(response) == 2: | ||||
|                 body, new_headers = response | ||||
|                 status = new_headers.get("status", 200) | ||||
|                 status = new_headers.get("status", status) | ||||
|             else: | ||||
|                 status, new_headers, body = response | ||||
|             headers.update(new_headers) | ||||
| @ -66,34 +65,3 @@ def amz_crc32(f: TypeDec) -> GenericFunction: | ||||
|         return status, headers, body | ||||
| 
 | ||||
|     return _wrapper | ||||
| 
 | ||||
| 
 | ||||
| def amzn_request_id(f: TypeDec) -> GenericFunction: | ||||
|     @wraps(f) | ||||
|     def _wrapper(*args: Any, **kwargs: Any) -> Any:  # type: ignore[misc] | ||||
|         response = f(*args, **kwargs) | ||||
| 
 | ||||
|         headers = {} | ||||
|         status = 200 | ||||
| 
 | ||||
|         if isinstance(response, str): | ||||
|             body = response | ||||
|         else: | ||||
|             if len(response) == 2: | ||||
|                 body, new_headers = response | ||||
|                 status = new_headers.get("status", 200) | ||||
|             else: | ||||
|                 status, new_headers, body = response | ||||
|             headers.update(new_headers) | ||||
| 
 | ||||
|         request_id = gen_amzn_requestid_long(headers) | ||||
| 
 | ||||
|         # Update request ID in XML | ||||
|         try: | ||||
|             body = re.sub(r"(?<=<RequestId>).*(?=<\/RequestId>)", request_id, body) | ||||
|         except Exception:  # Will just ignore if it cant work | ||||
|             pass | ||||
| 
 | ||||
|         return status, headers, body | ||||
| 
 | ||||
|     return _wrapper | ||||
|  | ||||
| @ -2,7 +2,6 @@ import json | ||||
| 
 | ||||
| from moto.core.common_types import TYPE_RESPONSE | ||||
| from moto.core.responses import BaseResponse | ||||
| from moto.utilities.aws_headers import amzn_request_id | ||||
| 
 | ||||
| from .models import GLOBAL_REGION, WAFV2Backend, wafv2_backends | ||||
| 
 | ||||
| @ -15,7 +14,6 @@ class WAFV2Response(BaseResponse): | ||||
|     def wafv2_backend(self) -> WAFV2Backend: | ||||
|         return wafv2_backends[self.current_account][self.region] | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def associate_web_acl(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         web_acl_arn = body["WebACLArn"] | ||||
| @ -23,14 +21,12 @@ class WAFV2Response(BaseResponse): | ||||
|         self.wafv2_backend.associate_web_acl(web_acl_arn, resource_arn) | ||||
|         return 200, {}, "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def disassociate_web_acl(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         resource_arn = body["ResourceArn"] | ||||
|         self.wafv2_backend.disassociate_web_acl(resource_arn) | ||||
|         return 200, {}, "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_web_acl_for_resource(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         resource_arn = body["ResourceArn"] | ||||
| @ -39,7 +35,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def create_web_acl(self) -> TYPE_RESPONSE: | ||||
|         """https://docs.aws.amazon.com/waf/latest/APIReference/API_CreateWebACL.html (response syntax section)""" | ||||
| 
 | ||||
| @ -64,7 +59,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def delete_web_acl(self) -> TYPE_RESPONSE: | ||||
|         scope = self._get_param("Scope") | ||||
|         if scope == "CLOUDFRONT": | ||||
| @ -75,7 +69,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def get_web_acl(self) -> TYPE_RESPONSE: | ||||
|         scope = self._get_param("Scope") | ||||
|         if scope == "CLOUDFRONT": | ||||
| @ -87,7 +80,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_web_ac_ls(self) -> TYPE_RESPONSE: | ||||
|         """https://docs.aws.amazon.com/waf/latest/APIReference/API_ListWebACLs.html (response syntax section)""" | ||||
| 
 | ||||
| @ -99,7 +91,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_rule_groups(self) -> TYPE_RESPONSE: | ||||
|         scope = self._get_param("Scope") | ||||
|         if scope == "CLOUDFRONT": | ||||
| @ -109,7 +100,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def list_tags_for_resource(self) -> TYPE_RESPONSE: | ||||
|         arn = self._get_param("ResourceARN") | ||||
|         self.region = arn.split(":")[3] | ||||
| @ -118,7 +108,6 @@ class WAFV2Response(BaseResponse): | ||||
|         response_headers = {"Content-Type": "application/json"} | ||||
|         return 200, response_headers, json.dumps(response) | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def tag_resource(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         arn = body.get("ResourceARN") | ||||
| @ -127,7 +116,6 @@ class WAFV2Response(BaseResponse): | ||||
|         self.wafv2_backend.tag_resource(arn, tags) | ||||
|         return 200, {}, "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def untag_resource(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         arn = body.get("ResourceARN") | ||||
| @ -136,7 +124,6 @@ class WAFV2Response(BaseResponse): | ||||
|         self.wafv2_backend.untag_resource(arn, tag_keys) | ||||
|         return 200, {}, "{}" | ||||
| 
 | ||||
|     @amzn_request_id | ||||
|     def update_web_acl(self) -> TYPE_RESPONSE: | ||||
|         body = json.loads(self.body) | ||||
|         name = body.get("Name") | ||||
|  | ||||
| @ -296,6 +296,7 @@ def test_create_resource(): | ||||
|     # this is hard to match against, so remove it | ||||
|     root_resource["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     root_resource["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     root_resource["ResponseMetadata"].pop("RequestId") | ||||
|     assert root_resource == { | ||||
|         "path": "/", | ||||
|         "id": root_id, | ||||
| @ -340,6 +341,7 @@ def test_child_resource(): | ||||
|     # this is hard to match against, so remove it | ||||
|     child_resource["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     child_resource["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     child_resource["ResponseMetadata"].pop("RequestId") | ||||
|     assert child_resource == { | ||||
|         "path": "/users/tags", | ||||
|         "pathPart": "tags", | ||||
| @ -373,6 +375,7 @@ def test_create_method(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "httpMethod": "GET", | ||||
|         "authorizationType": "none", | ||||
| @ -407,6 +410,7 @@ def test_create_method_apikeyrequired(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "httpMethod": "GET", | ||||
|         "authorizationType": "none", | ||||
| @ -431,7 +435,7 @@ def test_create_method_response(): | ||||
|         restApiId=api_id, resourceId=root_id, httpMethod="GET", authorizationType="none" | ||||
|     ) | ||||
| 
 | ||||
|     response = client.get_method(restApiId=api_id, resourceId=root_id, httpMethod="GET") | ||||
|     client.get_method(restApiId=api_id, resourceId=root_id, httpMethod="GET") | ||||
| 
 | ||||
|     response = client.put_method_response( | ||||
|         restApiId=api_id, resourceId=root_id, httpMethod="GET", statusCode="200" | ||||
| @ -439,6 +443,7 @@ def test_create_method_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "ResponseMetadata": {"HTTPStatusCode": 201}, | ||||
|         "statusCode": "200", | ||||
| @ -450,6 +455,7 @@ def test_create_method_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "ResponseMetadata": {"HTTPStatusCode": 200}, | ||||
|         "statusCode": "200", | ||||
| @ -461,6 +467,7 @@ def test_create_method_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == {"ResponseMetadata": {"HTTPStatusCode": 204}} | ||||
| 
 | ||||
| 
 | ||||
| @ -540,6 +547,7 @@ def test_integrations(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "ResponseMetadata": {"HTTPStatusCode": 201}, | ||||
|         "httpMethod": "POST", | ||||
| @ -560,6 +568,7 @@ def test_integrations(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "ResponseMetadata": {"HTTPStatusCode": 200}, | ||||
|         "httpMethod": "POST", | ||||
| @ -578,6 +587,7 @@ def test_integrations(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response["resourceMethods"]["GET"]["httpMethod"] == "GET" | ||||
|     assert response["resourceMethods"]["GET"]["authorizationType"] == "none" | ||||
|     assert response["resourceMethods"]["GET"]["methodIntegration"] == { | ||||
| @ -678,6 +688,7 @@ def test_integration_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "statusCode": "200", | ||||
|         "selectionPattern": "foobar", | ||||
| @ -695,6 +706,7 @@ def test_integration_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "statusCode": "200", | ||||
|         "selectionPattern": "foobar", | ||||
| @ -710,6 +722,7 @@ def test_integration_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response["methodIntegration"]["integrationResponses"] == { | ||||
|         "200": { | ||||
|             "responseTemplates": {},  # Note: TF compatibility | ||||
| @ -760,6 +773,7 @@ def test_integration_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "statusCode": "200", | ||||
|         "selectionPattern": "foobar", | ||||
| @ -774,6 +788,7 @@ def test_integration_response(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "statusCode": "200", | ||||
|         "selectionPattern": "foobar", | ||||
| @ -810,6 +825,7 @@ def test_update_authorizer_configuration(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "id": authorizer_id, | ||||
|         "name": authorizer_name, | ||||
| @ -903,6 +919,7 @@ def test_create_authorizer(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "id": authorizer_id, | ||||
|         "name": authorizer_name, | ||||
| @ -928,6 +945,7 @@ def test_create_authorizer(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
| 
 | ||||
|     assert response["items"][0]["id"] in [authorizer_id, authorizer_id2] | ||||
|     assert response["items"][1]["id"] in [authorizer_id, authorizer_id2] | ||||
| @ -945,6 +963,7 @@ def test_create_authorizer(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
| 
 | ||||
|     assert response == { | ||||
|         "name": new_authorizer_name_with_vars, | ||||
| @ -992,6 +1011,7 @@ def test_delete_authorizer(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "id": authorizer_id, | ||||
|         "name": authorizer_name, | ||||
| @ -1069,6 +1089,7 @@ def test_put_integration_response_with_response_template(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "statusCode": "200", | ||||
|         "selectionPattern": "foobar", | ||||
|  | ||||
| @ -187,6 +187,7 @@ def test_create_function_from_zipfile(): | ||||
|     result["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     # Botocore inserts retry attempts not seen in Python27 | ||||
|     result["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     result["ResponseMetadata"].pop("RequestId") | ||||
|     result.pop("LastModified") | ||||
| 
 | ||||
|     assert result == { | ||||
| @ -800,6 +801,7 @@ def test_delete_function(): | ||||
|     success_result["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     # Botocore inserts retry attempts not seen in Python27 | ||||
|     success_result["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     success_result["ResponseMetadata"].pop("RequestId") | ||||
| 
 | ||||
|     assert success_result == {"ResponseMetadata": {"HTTPStatusCode": 204}} | ||||
| 
 | ||||
| @ -1028,6 +1030,7 @@ def test_list_create_list_get_delete_list(): | ||||
|     func["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     # Botocore inserts retry attempts not seen in Python27 | ||||
|     func["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     func["ResponseMetadata"].pop("RequestId") | ||||
|     func["Configuration"].pop("LastModified") | ||||
|     func["Configuration"].pop("FunctionArn") | ||||
| 
 | ||||
|  | ||||
| @ -36,6 +36,8 @@ def test_create_user_pool(): | ||||
|     assert result["UserPool"]["Name"] == name | ||||
|     assert result["UserPool"]["LambdaConfig"]["PreSignUp"] == value | ||||
| 
 | ||||
|     assert "RequestId" in result["ResponseMetadata"] | ||||
| 
 | ||||
| 
 | ||||
| @mock_aws | ||||
| def test_create_user_pool__overwrite_template_messages(): | ||||
|  | ||||
| @ -1985,6 +1985,7 @@ def test_put_evaluations(): | ||||
|     # this is hard to match against, so remove it | ||||
|     response["ResponseMetadata"].pop("HTTPHeaders", None) | ||||
|     response["ResponseMetadata"].pop("RetryAttempts", None) | ||||
|     response["ResponseMetadata"].pop("RequestId") | ||||
|     assert response == { | ||||
|         "FailedEvaluations": [], | ||||
|         "ResponseMetadata": {"HTTPStatusCode": 200}, | ||||
|  | ||||
| @ -41,7 +41,7 @@ class TestDifferentAccountsDoesNotBreakSeeding: | ||||
|         instances = self.ec2_client.run_instances(MaxCount=1, MinCount=1)["Instances"] | ||||
| 
 | ||||
|         instance_ids = [instance["InstanceId"] for instance in instances] | ||||
|         assert instance_ids == ["i-dc50244d2b9e8e0b7"] | ||||
|         assert instance_ids == ["i-0df6e943394d7fdb0"] | ||||
| 
 | ||||
|     def test_1(self) -> None: | ||||
|         # Create some data in a different account (111111111111) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user