Best Python code snippet using localstack_python
provider.py
Source:provider.py
...168 return json.dumps(response)169class ValidationError(CommonServiceException):170 def __init__(self, message: str):171 super().__init__("ValidationError", message, 400, True)172def _set_alarm_actions(context, alarm_names, enabled):173 backend = cloudwatch_backends[context.region]174 for name in alarm_names:175 alarm = backend.alarms.get(name)176 if alarm:177 alarm.actions_enabled = enabled178def _cleanup_describe_output(alarm):179 reason_data = alarm.get("StateReasonData")180 if reason_data is not None and reason_data in ("{}", ""):181 alarm.pop("StateReasonData")182 if (183 alarm.get("StateReason", "") == MOTO_INITIAL_UNCHECKED_REASON184 and alarm.get("StateValue") != StateValue.INSUFFICIENT_DATA185 ):186 alarm["StateValue"] = StateValue.INSUFFICIENT_DATA187class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):188 """189 Cloudwatch provider.190 LIMITATIONS:191 - no alarm rule evaluation192 """193 def __init__(self):194 self.tags = TaggingService()195 self.alarm_scheduler = None196 def on_after_init(self):197 ROUTER.add(PATH_GET_RAW_METRICS, self.get_raw_metrics)198 self.alarm_scheduler = AlarmScheduler()199 def on_before_start(self):200 # re-schedule alarms for persistence use-case201 def restart_alarms(*args):202 poll_condition(lambda: SERVICE_PLUGINS.is_running("cloudwatch"))203 self.alarm_scheduler.restart_existing_alarms()204 start_worker_thread(restart_alarms)205 def on_before_stop(self):206 self.alarm_scheduler.shutdown_scheduler()207 def delete_alarms(self, context: RequestContext, alarm_names: AlarmNames) -> None:208 moto.call_moto(context)209 for alarm_name in alarm_names:210 arn = aws_stack.cloudwatch_alarm_arn(alarm_name)211 self.alarm_scheduler.delete_scheduler_for_alarm(arn)212 def get_raw_metrics(self, request: Request):213 region = aws_stack.extract_region_from_auth_header(request.headers)214 backend = cloudwatch_backends[region]215 if backend:216 result = backend.metric_data217 else:218 result = []219 result = [220 {221 "ns": r.namespace,222 "n": r.name,223 "v": r.value,224 "t": r.timestamp,225 "d": [{"n": d.name, "v": d.value} for d in r.dimensions],226 }227 for r in result228 ]229 return {"metrics": result}230 def list_tags_for_resource(231 self, context: RequestContext, resource_arn: AmazonResourceName232 ) -> ListTagsForResourceOutput:233 tags = self.tags.list_tags_for_resource(resource_arn)234 return ListTagsForResourceOutput(Tags=tags.get("Tags", []))235 def untag_resource(236 self, context: RequestContext, resource_arn: AmazonResourceName, tag_keys: TagKeyList237 ) -> UntagResourceOutput:238 self.tags.untag_resource(resource_arn, tag_keys)239 return UntagResourceOutput()240 def tag_resource(241 self, context: RequestContext, resource_arn: AmazonResourceName, tags: TagList242 ) -> TagResourceOutput:243 self.tags.tag_resource(resource_arn, tags)244 return TagResourceOutput()245 @handler("PutMetricAlarm", expand=False)246 def put_metric_alarm(247 self,248 context: RequestContext,249 request: PutMetricAlarmInput,250 ) -> None:251 # missing will be the default, when not set (but it will not explicitly be set)252 if not request.get("TreatMissingData", "missing") in [253 "breaching",254 "notBreaching",255 "ignore",256 "missing",257 ]:258 raise ValidationError(259 f"The value {request['TreatMissingData']} is not supported for TreatMissingData parameter. Supported values are [breaching, notBreaching, ignore, missing]."260 )261 # do some sanity checks:262 if request.get("Period"):263 # Valid values are 10, 30, and any multiple of 60.264 value = request.get("Period")265 if value not in (10, 30):266 if value % 60 != 0:267 raise ValidationError("Period must be 10, 30 or a multiple of 60")268 if request.get("Statistic"):269 if not request.get("Statistic") in [270 "SampleCount",271 "Average",272 "Sum",273 "Minimum",274 "Maximum",275 ]:276 raise ValidationError(277 f"Value '{request.get('Statistic')}' at 'statistic' failed to satisfy constraint: Member must satisfy enum value set: [Maximum, SampleCount, Sum, Minimum, Average]"278 )279 moto.call_moto(context)280 name = request.get("AlarmName")281 arn = aws_stack.cloudwatch_alarm_arn(name)282 self.tags.tag_resource(arn, request.get("Tags"))283 self.alarm_scheduler.schedule_metric_alarm(arn)284 @handler("PutCompositeAlarm", expand=False)285 def put_composite_alarm(286 self,287 context: RequestContext,288 request: PutCompositeAlarmInput,289 ) -> None:290 backend = cloudwatch_backends[context.region]291 backend.put_metric_alarm(292 name=request.get("AlarmName"),293 namespace=None,294 metric_name=None,295 metric_data_queries=None,296 comparison_operator=None,297 evaluation_periods=None,298 datapoints_to_alarm=None,299 period=None,300 threshold=None,301 statistic=None,302 extended_statistic=None,303 description=request.get("AlarmDescription"),304 dimensions=[],305 alarm_actions=request.get("AlarmActions", []),306 ok_actions=request.get("OKActions", []),307 insufficient_data_actions=request.get("InsufficientDataActions", []),308 unit=None,309 actions_enabled=request.get("ActionsEnabled"),310 treat_missing_data=None,311 evaluate_low_sample_count_percentile=None,312 threshold_metric_id=None,313 rule=request.get("AlarmRule"),314 tags=request.get("Tags", []),315 )316 LOG.warning(317 "Composite Alarms configuration is not yet supported, alarm state will not be evaluated"318 )319 @handler("EnableAlarmActions")320 def enable_alarm_actions(self, context: RequestContext, alarm_names: AlarmNames) -> None:321 _set_alarm_actions(context, alarm_names, enabled=True)322 @handler("DisableAlarmActions")323 def disable_alarm_actions(self, context: RequestContext, alarm_names: AlarmNames) -> None:324 _set_alarm_actions(context, alarm_names, enabled=False)325 @handler("DescribeAlarms", expand=False)326 def describe_alarms(327 self, context: RequestContext, request: DescribeAlarmsInput328 ) -> DescribeAlarmsOutput:329 response = moto.call_moto(context)330 for c in response["CompositeAlarms"]:331 _cleanup_describe_output(c)332 for m in response["MetricAlarms"]:333 _cleanup_describe_output(m)...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!