localstack-core 4.13.2.dev105__py3-none-any.whl → 4.13.2.dev107__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,6 +7,7 @@ from typing import TYPE_CHECKING
7
7
 
8
8
  from localstack.aws.api.cloudwatch import MetricAlarm, MetricDataQuery, MetricStat, StateValue
9
9
  from localstack.aws.connect import connect_to
10
+ from localstack.runtime.shutdown import SHUTDOWN_HANDLERS
10
11
  from localstack.utils.aws import arns, aws_stack
11
12
  from localstack.utils.scheduler import Scheduler
12
13
 
@@ -38,16 +39,26 @@ class AlarmScheduler:
38
39
  """
39
40
  super().__init__()
40
41
  self.scheduler = Scheduler()
41
- self.thread = threading.Thread(target=self.scheduler.run, name="cloudwatch-scheduler")
42
- self.thread.start()
43
42
  self.scheduled_alarms = {}
43
+ self.thread: threading.Thread | None = None
44
44
 
45
- def shutdown_scheduler(self) -> None:
45
+ def start(self) -> None:
46
+ if not (self.thread and self.thread.is_alive()):
47
+ LOG.debug("Starting CloudWatch scheduler")
48
+ self.thread = threading.Thread(target=self.scheduler.run, name="cloudwatch-scheduler")
49
+ self.thread.start()
50
+ SHUTDOWN_HANDLERS.register(self.shutdown)
51
+
52
+ def shutdown(self) -> None:
46
53
  """
47
- Shutsdown the scheduler, must be called before application stops
54
+ Shutdown the scheduler, must be called before application stops
48
55
  """
56
+ LOG.debug("Stopping CloudWatch scheduler")
49
57
  self.scheduler.close()
50
- self.thread.join(10)
58
+ self.scheduled_alarms.clear()
59
+ SHUTDOWN_HANDLERS.unregister(self.shutdown)
60
+ if self.thread:
61
+ self.thread.join(10)
51
62
 
52
63
  def schedule_metric_alarm(self, alarm_arn: str) -> None:
53
64
  """(Re-)schedules the alarm, if the alarm is re-scheduled, the running alarm scheduler will be cancelled before
@@ -305,7 +305,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
305
305
 
306
306
  def __init__(self):
307
307
  self.tags = TaggingService()
308
- self.alarm_scheduler = None
308
+ self.alarm_scheduler = AlarmScheduler()
309
309
 
310
310
  def accept_state_visitor(self, visitor: StateVisitor):
311
311
  visitor.visit(cloudwatch_backends)
@@ -314,19 +314,19 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
314
314
  ROUTER.add(PATH_GET_RAW_METRICS, self.get_raw_metrics)
315
315
 
316
316
  def on_before_start(self):
317
- self.start_alarm_scheduler()
317
+ self.alarm_scheduler.start()
318
318
 
319
319
  def on_before_state_reset(self):
320
- self.shutdown_alarm_scheduler()
320
+ self.alarm_scheduler.shutdown()
321
321
 
322
322
  def on_after_state_reset(self):
323
- self.start_alarm_scheduler()
323
+ self.alarm_scheduler.start()
324
324
 
325
325
  def on_before_state_load(self):
326
- self.shutdown_alarm_scheduler()
326
+ self.alarm_scheduler.shutdown()
327
327
 
328
328
  def on_after_state_load(self):
329
- self.start_alarm_scheduler()
329
+ self.alarm_scheduler.start()
330
330
 
331
331
  def restart_alarms(*args):
332
332
  poll_condition(lambda: SERVICE_PLUGINS.is_running("cloudwatch"))
@@ -335,18 +335,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
335
335
  start_worker_thread(restart_alarms)
336
336
 
337
337
  def on_before_stop(self):
338
- self.shutdown_alarm_scheduler()
339
-
340
- def start_alarm_scheduler(self):
341
- if not self.alarm_scheduler:
342
- LOG.debug("starting cloudwatch scheduler")
343
- self.alarm_scheduler = AlarmScheduler()
344
-
345
- def shutdown_alarm_scheduler(self):
346
- if self.alarm_scheduler:
347
- LOG.debug("stopping cloudwatch scheduler")
348
- self.alarm_scheduler.shutdown_scheduler()
349
- self.alarm_scheduler = None
338
+ self.alarm_scheduler.shutdown()
350
339
 
351
340
  def delete_alarms(self, context: RequestContext, alarm_names: AlarmNames, **kwargs) -> None:
352
341
  moto.call_moto(context)
@@ -148,9 +148,9 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
148
148
  """
149
149
 
150
150
  def __init__(self):
151
- self.alarm_scheduler: AlarmScheduler = None
152
151
  self.store = None
153
152
  self.cloudwatch_database = CloudwatchDatabase()
153
+ self.alarm_scheduler = AlarmScheduler()
154
154
 
155
155
  @staticmethod
156
156
  def get_store(account_id: str, region: str) -> CloudWatchStore:
@@ -164,21 +164,21 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
164
164
  ROUTER.add(PATH_GET_RAW_METRICS, self.get_raw_metrics)
165
165
 
166
166
  def on_before_start(self):
167
- self.start_alarm_scheduler()
167
+ self.alarm_scheduler.start()
168
168
 
169
169
  def on_before_state_reset(self):
170
- self.shutdown_alarm_scheduler()
170
+ self.alarm_scheduler.shutdown()
171
171
  self.cloudwatch_database.clear_tables()
172
172
 
173
173
  def on_after_state_reset(self):
174
174
  self.cloudwatch_database = CloudwatchDatabase()
175
- self.start_alarm_scheduler()
175
+ self.alarm_scheduler.start()
176
176
 
177
177
  def on_before_state_load(self):
178
- self.shutdown_alarm_scheduler()
178
+ self.alarm_scheduler.shutdown()
179
179
 
180
180
  def on_after_state_load(self):
181
- self.start_alarm_scheduler()
181
+ self.alarm_scheduler.start()
182
182
 
183
183
  def restart_alarms(*args):
184
184
  poll_condition(lambda: SERVICE_PLUGINS.is_running("cloudwatch"))
@@ -187,18 +187,7 @@ class CloudwatchProvider(CloudwatchApi, ServiceLifecycleHook):
187
187
  start_worker_thread(restart_alarms)
188
188
 
189
189
  def on_before_stop(self):
190
- self.shutdown_alarm_scheduler()
191
-
192
- def start_alarm_scheduler(self):
193
- if not self.alarm_scheduler:
194
- LOG.debug("starting cloudwatch scheduler")
195
- self.alarm_scheduler = AlarmScheduler()
196
-
197
- def shutdown_alarm_scheduler(self):
198
- if self.alarm_scheduler:
199
- LOG.debug("stopping cloudwatch scheduler")
200
- self.alarm_scheduler.shutdown_scheduler()
201
- self.alarm_scheduler = None
190
+ self.alarm_scheduler.shutdown()
202
191
 
203
192
  def delete_alarms(self, context: RequestContext, alarm_names: AlarmNames, **kwargs) -> None:
204
193
  """
@@ -102,13 +102,11 @@ def get_custom_key_material(request: CreateKeyRequest | None) -> bytes | None:
102
102
  if not request:
103
103
  return None
104
104
 
105
- custom_key_material = None
106
105
  tags = request.get("Tags", [])
107
106
  for tag in tags:
108
107
  if tag["TagKey"] == TAG_KEY_CUSTOM_KEY_MATERIAL:
109
- custom_key_material = base64.b64decode(tag["TagValue"])
110
-
111
- return custom_key_material
108
+ return base64.b64decode(tag["TagValue"])
109
+ return None
112
110
 
113
111
 
114
112
  def get_custom_key_id(request: CreateKeyRequest | None) -> bytes | None:
@@ -121,13 +119,11 @@ def get_custom_key_id(request: CreateKeyRequest | None) -> bytes | None:
121
119
  if not request:
122
120
  return None
123
121
 
124
- custom_key_id = None
125
122
  tags = request.get("Tags", [])
126
123
  for tag in tags:
127
124
  if tag["TagKey"] == TAG_KEY_CUSTOM_ID:
128
- custom_key_id = tag["TagValue"]
129
-
130
- return custom_key_id
125
+ return tag["TagValue"]
126
+ return None
131
127
 
132
128
 
133
129
  def execute_dry_run_capable[T](func: Callable[..., T], dry_run: bool, *args, **kwargs) -> T:
@@ -27,21 +27,16 @@ from localstack.aws.api.route53 import (
27
27
  from localstack.aws.connect import connect_to
28
28
  from localstack.services.moto import call_moto
29
29
  from localstack.services.plugins import ServiceLifecycleHook
30
- from localstack.services.route53.models import Route53Store, route53_stores
30
+ from localstack.services.route53.models import route53_stores
31
31
  from localstack.state import StateVisitor
32
32
 
33
33
 
34
34
  class Route53Provider(Route53Api, ServiceLifecycleHook):
35
35
  def accept_state_visitor(self, visitor: StateVisitor):
36
- from localstack.services.route53.models import route53_stores
37
36
 
38
37
  visitor.visit(route53_backends)
39
38
  visitor.visit(route53_stores)
40
39
 
41
- @staticmethod
42
- def get_route53_store(account_id: str, region: str) -> Route53Store:
43
- return route53_stores[account_id][region]
44
-
45
40
  # No tag deletion logic to handle in Community. Overwritten in Pro implementation.
46
41
  def remove_resource_tags(
47
42
  self, context: RequestContext, resource_type: str, resource_id: str
@@ -75,7 +75,7 @@ class Tags:
75
75
  _tags if the resource has been deleted.
76
76
 
77
77
  This distinction is important to maintain parity with the Resource Groups Tagging API (RGTA) which will tap into
78
- supported service's `Tags` dataclass within it's store.
78
+ supported service's `Tags` dataclass within its store.
79
79
  """
80
80
 
81
81
  _tags: dict[ResourceARN, TagMap] = field(default_factory=dict)
localstack/version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '4.13.2.dev105'
32
- __version_tuple__ = version_tuple = (4, 13, 2, 'dev105')
31
+ __version__ = version = '4.13.2.dev107'
32
+ __version_tuple__ = version_tuple = (4, 13, 2, 'dev107')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.13.2.dev105
3
+ Version: 4.13.2.dev107
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=g0E-_q3apmHlOET2Gg5_biUtN2b4XygnI5aeeaZm6ZY,15
4
4
  localstack/openapi.yaml,sha256=jFUzv-NKkJttxb8HRrmKiNYOmJD-zVfPxG3DDMrRwfg,30865
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=yXTYdVQOPUeNV3JHThjluWL20XEPTdwUNJCkPzyTKbY,723
7
+ localstack/version.py,sha256=YHdJl32h52phmub-Zgz6ycMdlMvFMGO3M6Skcn62pjg,723
8
8
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
10
10
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -337,11 +337,11 @@ localstack/services/cloudformation/v2/provider.py,sha256=1cr_3flqALbY-H40lrVCcIq
337
337
  localstack/services/cloudformation/v2/types.py,sha256=jsfvn2z6weqruaDvv6qtSILtFiOTRl9fIjl0vXvl108,1060
338
338
  localstack/services/cloudformation/v2/utils.py,sha256=U1-YK7BEfA2lRKuUzDUVQ_dXUXybTHciNZA1G3xuZI8,202
339
339
  localstack/services/cloudwatch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
340
- localstack/services/cloudwatch/alarm_scheduler.py,sha256=HPzQgZvDVXIXaEkjJ39L-jBwlOi_-ZlAyJ3D_suWngk,15761
340
+ localstack/services/cloudwatch/alarm_scheduler.py,sha256=6C3LIdgoeiALBSglTILsqxx4jHwlaP81JeS_tVycjiM,16233
341
341
  localstack/services/cloudwatch/cloudwatch_database_helper.py,sha256=IK_MgxG3xTkpKbBe-Buv_6wUuHEc3MGQOqMAqHoEOzk,17270
342
342
  localstack/services/cloudwatch/models.py,sha256=gy6kNsAjBggpTgzSX-MfUKYnkpkZ2yanNNNcGYSLASw,4063
343
- localstack/services/cloudwatch/provider.py,sha256=Ss7Mc6XAQhXabUoz_loonp_UcA-VCi5IXCyvqXfn5kw,19701
344
- localstack/services/cloudwatch/provider_v2.py,sha256=vCpcWVTM6Wilm_Jt_x-3vYaD1eVNX9dDzleJ5D5J3pw,44930
343
+ localstack/services/cloudwatch/provider.py,sha256=YTtjQLKOLaRVbkUOrkAPCk7Tf8gydncrdQhU3UOHjdI,19308
344
+ localstack/services/cloudwatch/provider_v2.py,sha256=fkxU9Wx-fjYTrBp1nBihuKtctN_ImAB4btlGptuHykQ,44521
345
345
  localstack/services/cloudwatch/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
346
346
  localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.py,sha256=T0P5uTDjQO3lNw5w4wcdBgzFthGDjJXUkPtHo1BP13I,5172
347
347
  localstack/services/cloudwatch/resource_providers/aws_cloudwatch_alarm.schema.json,sha256=8Nam5WqGfyW85m55UVCwJF17Re4tPOIJY_m6Wq37y8k,3829
@@ -530,7 +530,7 @@ localstack/services/kms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
530
530
  localstack/services/kms/exceptions.py,sha256=BgmFaOgGcBheRPQyZFFjn7_W8i6ChJXvJoSh_yV-Ti0,535
531
531
  localstack/services/kms/models.py,sha256=lglxgXk45R9hYU_r22rtpGZKtDqpC7ExGyAayi2mowc,37239
532
532
  localstack/services/kms/provider.py,sha256=z707GU_EAp2Pu6tl9iJePBHc6e_Xznh2Dwmm7nX14nE,75766
533
- localstack/services/kms/utils.py,sha256=Jrd4lh2HfK0NCyYdyhqlBq3nNnxL5NSOYa_9FAwtl1g,5288
533
+ localstack/services/kms/utils.py,sha256=VNmGwrMwQwF8nUc1D-5i4W0UEHLSCIGpZ0I-0Du5ueY,5182
534
534
  localstack/services/kms/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
535
535
  localstack/services/kms/resource_providers/aws_kms_alias.py,sha256=LsvRlZMrzMlGq1_KcMlxz9RE16tUe7bcqQ3qQYE-vtg,2614
536
536
  localstack/services/kms/resource_providers/aws_kms_alias.schema.json,sha256=i3PJRVJ7jnE1PzxitVBFz40dyk8M7O8sRzBSPL-kHsM,1795
@@ -668,7 +668,7 @@ localstack/services/resourcegroupstaggingapi/__init__.py,sha256=47DEQpj8HBSa-_TI
668
668
  localstack/services/resourcegroupstaggingapi/provider.py,sha256=E-5Ao3Vxre6mtezoE6s7HBCRKKkSsZ8LMOHvng2hx8o,590
669
669
  localstack/services/route53/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
670
670
  localstack/services/route53/models.py,sha256=4pFJA_y_mSvN415rmzThun4xmD51FD8t3SsjZR7a2dM,490
671
- localstack/services/route53/provider.py,sha256=Mp0yPccJDUvri5tVK6bkE_Fyj2M-n57Teso8vpfBJ7A,5803
671
+ localstack/services/route53/provider.py,sha256=k6txmv9H0wZewIzIxsWJIDqT06Zra5FhlYzy9L0qcrI,5577
672
672
  localstack/services/route53/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
673
673
  localstack/services/route53/resource_providers/aws_route53_healthcheck.py,sha256=BWq8e2R3uU_chO1wfDxErstgLvs3pSKtF6-KByO6Oao,3602
674
674
  localstack/services/route53/resource_providers/aws_route53_healthcheck.schema.json,sha256=N1iHZx1lCYI-O-f4_pHaEImDeIgTIzFgaBwfCm-G8JI,6368
@@ -1259,7 +1259,7 @@ localstack/utils/serving.py,sha256=wo1jTiqvuNUacuV0aYv2RfDyRd7lxoshrNQ59wjzx8s,5
1259
1259
  localstack/utils/ssl.py,sha256=RGAca4iIYc0tFYcfsev4ea1wOaWE4GuggghcfB8K5Lo,2510
1260
1260
  localstack/utils/strings.py,sha256=CrEoxX_VS51v0xFxhAArnp6_MUFTOR8vR02sWjVn-Ig,7757
1261
1261
  localstack/utils/sync.py,sha256=Q0IscaZX8wdoR4wI7e9VDVBDgIW3YdrY0Av-BJjgQ68,6598
1262
- localstack/utils/tagging.py,sha256=LX83_qMU4QCuxiMR25knEe2WoTAv3awSd26mcV6UHsA,5375
1262
+ localstack/utils/tagging.py,sha256=S8uALmOsLwXGVcOynSpe-z4E7gmFZ-X7kzQr5Vgu1NQ,5374
1263
1263
  localstack/utils/testutil.py,sha256=_YG81sqwl3kFj2kaqbADQUUM61a7TiOGK_1qpxIQnAk,21555
1264
1264
  localstack/utils/threads.py,sha256=6rG43WQnitKkmuAGtIGAzGrRd_sVFQpw1UIRZSSU8JU,5265
1265
1265
  localstack/utils/time.py,sha256=G9GFVkyRNXyqG2SPPARLC-wAcCHXuJLWSqXrnhqNNy8,2260
@@ -1311,10 +1311,10 @@ localstack/utils/server/tcp_proxy.py,sha256=y2NJAmvftTiAYsLU_8qe4W5LGqwUw21i90Pu
1311
1311
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1312
1312
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1313
1313
  localstack/utils/xray/traceid.py,sha256=GKO-R2sMMjlrH2UaLPXlQlZ6flbE7ZKb6IZMtMu_M5U,1110
1314
- localstack_core-4.13.2.dev105.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1315
- localstack_core-4.13.2.dev105.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1316
- localstack_core-4.13.2.dev105.dist-info/METADATA,sha256=OZqRam24anuzBnbna40ntLlG1u7AWAeJUU4SCwS3AP0,5868
1317
- localstack_core-4.13.2.dev105.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
1318
- localstack_core-4.13.2.dev105.dist-info/entry_points.txt,sha256=59aAnn8KVHWAHkMg2dOgmgYtRZ-xTX9T4UiIchWgK6k,20975
1319
- localstack_core-4.13.2.dev105.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1320
- localstack_core-4.13.2.dev105.dist-info/RECORD,,
1314
+ localstack_core-4.13.2.dev107.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1315
+ localstack_core-4.13.2.dev107.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1316
+ localstack_core-4.13.2.dev107.dist-info/METADATA,sha256=E2gkToL3bvSW56wNceg0ygNO9g1fdL6w5S2DU-lmMqk,5868
1317
+ localstack_core-4.13.2.dev107.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
1318
+ localstack_core-4.13.2.dev107.dist-info/entry_points.txt,sha256=59aAnn8KVHWAHkMg2dOgmgYtRZ-xTX9T4UiIchWgK6k,20975
1319
+ localstack_core-4.13.2.dev107.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1320
+ localstack_core-4.13.2.dev107.dist-info/RECORD,,