localstack-core 4.4.1.dev67__py3-none-any.whl → 4.4.1.dev69__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.
Files changed (21) hide show
  1. localstack/services/apigateway/legacy/provider.py +1 -1
  2. localstack/services/apigateway/next_gen/execute_api/context.py +8 -2
  3. localstack/services/apigateway/next_gen/execute_api/handlers/parse.py +12 -10
  4. localstack/services/apigateway/next_gen/execute_api/helpers.py +7 -0
  5. localstack/services/apigateway/next_gen/execute_api/moto_helpers.py +14 -1
  6. localstack/services/apigateway/next_gen/execute_api/router.py +33 -0
  7. localstack/services/apigateway/next_gen/execute_api/variables.py +1 -1
  8. localstack/services/apigateway/next_gen/provider.py +4 -1
  9. localstack/utils/analytics/metrics.py +124 -61
  10. localstack/version.py +2 -2
  11. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/METADATA +1 -1
  12. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/RECORD +20 -20
  13. localstack_core-4.4.1.dev69.dist-info/plux.json +1 -0
  14. localstack_core-4.4.1.dev67.dist-info/plux.json +0 -1
  15. {localstack_core-4.4.1.dev67.data → localstack_core-4.4.1.dev69.data}/scripts/localstack +0 -0
  16. {localstack_core-4.4.1.dev67.data → localstack_core-4.4.1.dev69.data}/scripts/localstack-supervisor +0 -0
  17. {localstack_core-4.4.1.dev67.data → localstack_core-4.4.1.dev69.data}/scripts/localstack.bat +0 -0
  18. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/WHEEL +0 -0
  19. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/entry_points.txt +0 -0
  20. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/licenses/LICENSE.txt +0 -0
  21. {localstack_core-4.4.1.dev67.dist-info → localstack_core-4.4.1.dev69.dist-info}/top_level.txt +0 -0
@@ -622,7 +622,7 @@ class ApigatewayProvider(ApigatewayApi, ServiceLifecycleHook):
622
622
  param = param.replace("~1", "/")
623
623
  if op == "remove":
624
624
  integration_response.response_templates.pop(param)
625
- elif op == "add":
625
+ elif op in ("add", "replace"):
626
626
  integration_response.response_templates[param] = value
627
627
 
628
628
  elif "/contentHandling" in path and op == "replace":
@@ -5,7 +5,7 @@ from rolo import Request
5
5
  from rolo.gateway import RequestContext
6
6
  from werkzeug.datastructures import Headers
7
7
 
8
- from localstack.aws.api.apigateway import Integration, Method, Resource
8
+ from localstack.aws.api.apigateway import Integration, Method, Resource, Stage
9
9
  from localstack.services.apigateway.models import RestApiDeployment
10
10
 
11
11
  from .variables import ContextVariableOverrides, ContextVariables, LoggingContextVariables
@@ -79,7 +79,7 @@ class RestApiInvocationContext(RequestContext):
79
79
  api_id: Optional[str]
80
80
  """The REST API identifier of the invoked API"""
81
81
  stage: Optional[str]
82
- """The REST API stage linked to this invocation"""
82
+ """The REST API stage name linked to this invocation"""
83
83
  base_path: Optional[str]
84
84
  """The REST API base path mapped to the stage of this invocation"""
85
85
  deployment_id: Optional[str]
@@ -96,6 +96,10 @@ class RestApiInvocationContext(RequestContext):
96
96
  """The method of the resource the invocation matched"""
97
97
  stage_variables: Optional[dict[str, str]]
98
98
  """The Stage variables, also used in parameters mapping and mapping templates"""
99
+ stage_configuration: Optional[Stage]
100
+ """The Stage configuration, containing canary deployment settings"""
101
+ is_canary: Optional[bool]
102
+ """If the current call was directed to a canary deployment"""
99
103
  context_variables: Optional[ContextVariables]
100
104
  """The $context used in data models, authorizers, mapping templates, and CloudWatch access logging"""
101
105
  context_variable_overrides: Optional[ContextVariableOverrides]
@@ -126,6 +130,8 @@ class RestApiInvocationContext(RequestContext):
126
130
  self.resource_method = None
127
131
  self.integration = None
128
132
  self.stage_variables = None
133
+ self.stage_configuration = None
134
+ self.is_canary = None
129
135
  self.context_variables = None
130
136
  self.logging_context_variables = None
131
137
  self.integration_request = None
@@ -17,7 +17,6 @@ from ..api import RestApiGatewayHandler, RestApiGatewayHandlerChain
17
17
  from ..context import InvocationRequest, RestApiInvocationContext
18
18
  from ..header_utils import should_drop_header_from_invocation
19
19
  from ..helpers import generate_trace_id, generate_trace_parent, parse_trace_id
20
- from ..moto_helpers import get_stage_variables
21
20
  from ..variables import (
22
21
  ContextVariableOverrides,
23
22
  ContextVariables,
@@ -53,7 +52,7 @@ class InvocationRequestParser(RestApiGatewayHandler):
53
52
  # TODO: maybe adjust the logging
54
53
  LOG.debug("Initializing $context='%s'", context.context_variables)
55
54
  # then populate the stage variables
56
- context.stage_variables = self.fetch_stage_variables(context)
55
+ context.stage_variables = self.get_stage_variables(context)
57
56
  LOG.debug("Initializing $stageVariables='%s'", context.stage_variables)
58
57
 
59
58
  context.trace_id = self.populate_trace_id(context.request.headers)
@@ -173,18 +172,21 @@ class InvocationRequestParser(RestApiGatewayHandler):
173
172
  requestTimeEpoch=int(now.timestamp() * 1000),
174
173
  stage=context.stage,
175
174
  )
175
+ if context.is_canary is not None:
176
+ context_variables["isCanaryRequest"] = context.is_canary
177
+
176
178
  return context_variables
177
179
 
178
180
  @staticmethod
179
- def fetch_stage_variables(context: RestApiInvocationContext) -> Optional[dict[str, str]]:
180
- stage_variables = get_stage_variables(
181
- account_id=context.account_id,
182
- region=context.region,
183
- api_id=context.api_id,
184
- stage_name=context.stage,
185
- )
181
+ def get_stage_variables(context: RestApiInvocationContext) -> Optional[dict[str, str]]:
182
+ stage_variables = context.stage_configuration.get("variables")
183
+ if context.is_canary:
184
+ overrides = (
185
+ context.stage_configuration["canarySettings"].get("stageVariableOverrides") or {}
186
+ )
187
+ stage_variables = (stage_variables or {}) | overrides
188
+
186
189
  if not stage_variables:
187
- # we need to set the stage variables to None in the context if we don't have at least one
188
190
  return None
189
191
 
190
192
  return stage_variables
@@ -1,5 +1,6 @@
1
1
  import copy
2
2
  import logging
3
+ import random
3
4
  import re
4
5
  import time
5
6
  from secrets import token_hex
@@ -174,3 +175,9 @@ def mime_type_matches_binary_media_types(mime_type: str | None, binary_media_typ
174
175
  return True
175
176
 
176
177
  return False
178
+
179
+
180
+ def should_divert_to_canary(percent_traffic: float) -> bool:
181
+ if int(percent_traffic) == 100:
182
+ return True
183
+ return percent_traffic > random.random() * 100
@@ -1,7 +1,13 @@
1
1
  from moto.apigateway.models import APIGatewayBackend, apigateway_backends
2
2
  from moto.apigateway.models import RestAPI as MotoRestAPI
3
3
 
4
- from localstack.aws.api.apigateway import ApiKey, ListOfUsagePlan, ListOfUsagePlanKey, Resource
4
+ from localstack.aws.api.apigateway import (
5
+ ApiKey,
6
+ ListOfUsagePlan,
7
+ ListOfUsagePlanKey,
8
+ Resource,
9
+ Stage,
10
+ )
5
11
 
6
12
 
7
13
  def get_resources_from_moto_rest_api(moto_rest_api: MotoRestAPI) -> dict[str, Resource]:
@@ -40,6 +46,13 @@ def get_stage_variables(
40
46
  return stage.variables
41
47
 
42
48
 
49
+ def get_stage_configuration(account_id: str, region: str, api_id: str, stage_name: str) -> Stage:
50
+ apigateway_backend: APIGatewayBackend = apigateway_backends[account_id][region]
51
+ moto_rest_api = apigateway_backend.get_rest_api(api_id)
52
+ stage = moto_rest_api.stages[stage_name]
53
+ return stage.to_json()
54
+
55
+
43
56
  def get_usage_plans(account_id: str, region_name: str) -> ListOfUsagePlan:
44
57
  """
45
58
  Will return a list of usage plans from the moto store.
@@ -5,6 +5,7 @@ from rolo import Request, Router
5
5
  from rolo.routing.handler import Handler
6
6
  from werkzeug.routing import Rule
7
7
 
8
+ from localstack.aws.api.apigateway import Stage
8
9
  from localstack.constants import APPLICATION_JSON, AWS_REGION_US_EAST_1, DEFAULT_AWS_ACCOUNT_ID
9
10
  from localstack.deprecations import deprecated_endpoint
10
11
  from localstack.http import Response
@@ -14,6 +15,8 @@ from localstack.services.stores import AccountRegionBundle
14
15
 
15
16
  from .context import RestApiInvocationContext
16
17
  from .gateway import RestApiGateway
18
+ from .helpers import should_divert_to_canary
19
+ from .moto_helpers import get_stage_configuration
17
20
 
18
21
  LOG = logging.getLogger(__name__)
19
22
 
@@ -88,11 +91,41 @@ class ApiGatewayEndpoint:
88
91
  # TODO: find proper error when trying to hit an API with no deployment/stage linked
89
92
  return
90
93
 
94
+ stage_configuration = self.fetch_stage_configuration(
95
+ account_id=frozen_deployment.account_id,
96
+ region=frozen_deployment.region,
97
+ api_id=api_id,
98
+ stage_name=stage,
99
+ )
100
+ if canary_settings := stage_configuration.get("canarySettings"):
101
+ if should_divert_to_canary(canary_settings["percentTraffic"]):
102
+ deployment_id = canary_settings["deploymentId"]
103
+ frozen_deployment = self._global_store.internal_deployments[api_id][deployment_id]
104
+ context.is_canary = True
105
+ else:
106
+ context.is_canary = False
107
+
91
108
  context.deployment = frozen_deployment
92
109
  context.api_id = api_id
93
110
  context.stage = stage
111
+ context.stage_configuration = stage_configuration
94
112
  context.deployment_id = deployment_id
95
113
 
114
+ @staticmethod
115
+ def fetch_stage_configuration(
116
+ account_id: str, region: str, api_id: str, stage_name: str
117
+ ) -> Stage:
118
+ # this will be migrated once we move away from Moto, so we won't need the helper anymore and the logic will
119
+ # be implemented here
120
+ stage_variables = get_stage_configuration(
121
+ account_id=account_id,
122
+ region=region,
123
+ api_id=api_id,
124
+ stage_name=stage_name,
125
+ )
126
+
127
+ return stage_variables
128
+
96
129
  @staticmethod
97
130
  def create_response(request: Request) -> Response:
98
131
  # Creates a default apigw response.
@@ -112,7 +112,7 @@ class ContextVariables(TypedDict, total=False):
112
112
  httpMethod: str
113
113
  """The HTTP method used"""
114
114
  identity: Optional[ContextVarsIdentity]
115
- isCanaryRequest: Optional[bool | str] # TODO: verify type
115
+ isCanaryRequest: Optional[bool]
116
116
  """Indicates if the request was directed to the canary"""
117
117
  path: str
118
118
  """The request path."""
@@ -216,6 +216,9 @@ class ApigatewayNextGenProvider(ApigatewayProvider):
216
216
  "useStageCache": False,
217
217
  }
218
218
  default_canary_settings.update(canary_settings)
219
+ default_canary_settings["percentTraffic"] = float(
220
+ default_canary_settings["percentTraffic"]
221
+ )
219
222
  moto_stage_copy.canary_settings = default_canary_settings
220
223
 
221
224
  moto_rest_api.stages[stage_name] = moto_stage_copy
@@ -291,7 +294,6 @@ class ApigatewayNextGenProvider(ApigatewayProvider):
291
294
 
292
295
  if stage_name:
293
296
  moto_stage = moto_rest_api.stages[stage_name]
294
- store.active_deployments.setdefault(router_api_id, {})[stage_name] = deployment_id
295
297
  if canary_settings:
296
298
  moto_stage = current_stage
297
299
  moto_rest_api.stages[stage_name] = current_stage
@@ -304,6 +306,7 @@ class ApigatewayNextGenProvider(ApigatewayProvider):
304
306
  default_settings.update(canary_settings)
305
307
  moto_stage.canary_settings = default_settings
306
308
  else:
309
+ store.active_deployments.setdefault(router_api_id, {})[stage_name] = deployment_id
307
310
  moto_stage.canary_settings = None
308
311
 
309
312
  if variables:
@@ -5,7 +5,8 @@ import logging
5
5
  import threading
6
6
  from abc import ABC, abstractmethod
7
7
  from collections import defaultdict
8
- from typing import Dict, List, Optional, Tuple, Union, overload
8
+ from dataclasses import dataclass
9
+ from typing import Any, Optional, Union, overload
9
10
 
10
11
  from localstack import config
11
12
  from localstack.runtime import hooks
@@ -16,6 +17,59 @@ from localstack.utils.analytics.publisher import AnalyticsClientPublisher
16
17
  LOG = logging.getLogger(__name__)
17
18
 
18
19
 
20
+ @dataclass(frozen=True)
21
+ class MetricRegistryKey:
22
+ namespace: str
23
+ name: str
24
+
25
+
26
+ @dataclass(frozen=True)
27
+ class CounterPayload:
28
+ """An immutable snapshot of a counter metric at the time of collection."""
29
+
30
+ namespace: str
31
+ name: str
32
+ value: int
33
+ type: str
34
+ labels: Optional[dict[str, Union[str, float]]] = None
35
+
36
+ def as_dict(self) -> dict[str, Any]:
37
+ result = {
38
+ "namespace": self.namespace,
39
+ "name": self.name,
40
+ "value": self.value,
41
+ "type": self.type,
42
+ }
43
+
44
+ if self.labels:
45
+ # Convert labels to the expected format (label_1, label_1_value, etc.)
46
+ for i, (label_name, label_value) in enumerate(self.labels.items(), 1):
47
+ result[f"label_{i}"] = label_name
48
+ result[f"label_{i}_value"] = label_value
49
+
50
+ return result
51
+
52
+
53
+ @dataclass
54
+ class MetricPayload:
55
+ """
56
+ Stores all metric payloads collected during the execution of the LocalStack emulator.
57
+ Currently, supports only counter-type metrics, but designed to accommodate other types in the future.
58
+ """
59
+
60
+ _payload: list[CounterPayload] # support for other metric types may be added in the future.
61
+
62
+ @property
63
+ def payload(self) -> list[CounterPayload]:
64
+ return self._payload
65
+
66
+ def __init__(self, payload: list[CounterPayload]):
67
+ self._payload = payload
68
+
69
+ def as_dict(self) -> dict[str, list[dict[str, Any]]]:
70
+ return {"metrics": [payload.as_dict() for payload in self._payload]}
71
+
72
+
19
73
  class MetricRegistry:
20
74
  """
21
75
  A Singleton class responsible for managing all registered metrics.
@@ -39,7 +93,7 @@ class MetricRegistry:
39
93
  self._registry = dict()
40
94
 
41
95
  @property
42
- def registry(self) -> Dict[str, "Metric"]:
96
+ def registry(self) -> dict[MetricRegistryKey, "Metric"]:
43
97
  return self._registry
44
98
 
45
99
  def register(self, metric: Metric) -> None:
@@ -54,22 +108,28 @@ class MetricRegistry:
54
108
  if not isinstance(metric, Metric):
55
109
  raise TypeError("Only subclasses of `Metric` can be registered.")
56
110
 
57
- if metric.name in self._registry:
58
- raise ValueError(f"Metric '{metric.name}' already exists.")
111
+ if not metric.namespace:
112
+ raise ValueError("Metric 'namespace' must be defined and non-empty.")
59
113
 
60
- self._registry[metric.name] = metric
114
+ registry_unique_key = MetricRegistryKey(namespace=metric.namespace, name=metric.name)
115
+ if registry_unique_key in self._registry:
116
+ raise ValueError(
117
+ f"A metric named '{metric.name}' already exists in the '{metric.namespace}' namespace"
118
+ )
61
119
 
62
- def collect(self) -> Dict[str, List[Dict[str, Union[str, int]]]]:
120
+ self._registry[registry_unique_key] = metric
121
+
122
+ def collect(self) -> MetricPayload:
63
123
  """
64
124
  Collects all registered metrics.
65
125
  """
66
- return {
67
- "metrics": [
68
- metric
69
- for metric_instance in self._registry.values()
70
- for metric in metric_instance.collect()
71
- ]
72
- }
126
+ payload = [
127
+ metric
128
+ for metric_instance in self._registry.values()
129
+ for metric in metric_instance.collect()
130
+ ]
131
+
132
+ return MetricPayload(payload=payload)
73
133
 
74
134
 
75
135
  class Metric(ABC):
@@ -79,20 +139,30 @@ class Metric(ABC):
79
139
  Each subclass must implement the `collect()` method.
80
140
  """
81
141
 
142
+ _namespace: str
82
143
  _name: str
83
144
 
84
- def __init__(self, name: str):
145
+ def __init__(self, namespace: str, name: str):
146
+ if not namespace or namespace.strip() == "":
147
+ raise ValueError("Namespace must be non-empty string.")
148
+ self._namespace = namespace
149
+
85
150
  if not name or name.strip() == "":
86
151
  raise ValueError("Metric name must be non-empty string.")
87
-
88
152
  self._name = name
89
153
 
154
+ @property
155
+ def namespace(self) -> str:
156
+ return self._namespace
157
+
90
158
  @property
91
159
  def name(self) -> str:
92
160
  return self._name
93
161
 
94
162
  @abstractmethod
95
- def collect(self) -> List[Dict[str, Union[str, int]]]:
163
+ def collect(
164
+ self,
165
+ ) -> list[CounterPayload]: # support for other metric types may be added in the future.
96
166
  """
97
167
  Collects and returns metric data. Subclasses must implement this to return collected metric data.
98
168
  """
@@ -143,18 +213,16 @@ class CounterMetric(Metric, BaseCounter):
143
213
  This class should not be instantiated directly, use the Counter class instead.
144
214
  """
145
215
 
146
- _namespace: Optional[str]
147
216
  _type: str
148
217
 
149
- def __init__(self, name: str, namespace: Optional[str] = ""):
150
- Metric.__init__(self, name=name)
218
+ def __init__(self, namespace: str, name: str):
219
+ Metric.__init__(self, namespace=namespace, name=name)
151
220
  BaseCounter.__init__(self)
152
221
 
153
- self._namespace = namespace.strip() if namespace else ""
154
222
  self._type = "counter"
155
223
  MetricRegistry().register(self)
156
224
 
157
- def collect(self) -> List[Dict[str, Union[str, int]]]:
225
+ def collect(self) -> list[CounterPayload]:
158
226
  """Collects the metric unless events are disabled."""
159
227
  if config.DISABLE_EVENTS:
160
228
  return list()
@@ -162,13 +230,11 @@ class CounterMetric(Metric, BaseCounter):
162
230
  if self._count == 0:
163
231
  # Return an empty list if the count is 0, as there are no metrics to send to the analytics backend.
164
232
  return list()
233
+
165
234
  return [
166
- {
167
- "namespace": self._namespace,
168
- "name": self.name,
169
- "value": self._count,
170
- "type": self._type,
171
- }
235
+ CounterPayload(
236
+ namespace=self._namespace, name=self.name, value=self._count, type=self._type
237
+ )
172
238
  ]
173
239
 
174
240
 
@@ -178,15 +244,14 @@ class LabeledCounterMetric(Metric):
178
244
  This class should not be instantiated directly, use the Counter class instead.
179
245
  """
180
246
 
181
- _namespace: Optional[str]
182
247
  _type: str
183
248
  _unit: str
184
249
  _labels: list[str]
185
- _label_values: Tuple[Optional[Union[str, float]], ...]
186
- _counters_by_label_values: defaultdict[Tuple[Optional[Union[str, float]], ...], BaseCounter]
250
+ _label_values: tuple[Optional[Union[str, float]], ...]
251
+ _counters_by_label_values: defaultdict[tuple[Optional[Union[str, float]], ...], BaseCounter]
187
252
 
188
- def __init__(self, name: str, labels: List[str], namespace: Optional[str] = ""):
189
- super(LabeledCounterMetric, self).__init__(name=name)
253
+ def __init__(self, namespace: str, name: str, labels: list[str]):
254
+ super(LabeledCounterMetric, self).__init__(namespace=namespace, name=name)
190
255
 
191
256
  if not labels:
192
257
  raise ValueError("At least one label is required; the labels list cannot be empty.")
@@ -197,7 +262,6 @@ class LabeledCounterMetric(Metric):
197
262
  if len(labels) > 8:
198
263
  raise ValueError("A maximum of 8 labels are allowed.")
199
264
 
200
- self._namespace = namespace.strip() if namespace else ""
201
265
  self._type = "counter"
202
266
  self._labels = labels
203
267
  self._counters_by_label_values = defaultdict(BaseCounter)
@@ -221,13 +285,12 @@ class LabeledCounterMetric(Metric):
221
285
 
222
286
  return self._counters_by_label_values[_label_values]
223
287
 
224
- def _as_list(self) -> List[Dict[str, Union[str, int]]]:
225
- num_labels = len(self._labels)
226
-
227
- static_key_label_value = [f"label_{i + 1}_value" for i in range(num_labels)]
228
- static_key_label = [f"label_{i + 1}" for i in range(num_labels)]
288
+ def collect(self) -> list[CounterPayload]:
289
+ if config.DISABLE_EVENTS:
290
+ return list()
229
291
 
230
- collected_metrics = []
292
+ payload = []
293
+ num_labels = len(self._labels)
231
294
 
232
295
  for label_values, counter in self._counters_by_label_values.items():
233
296
  if counter.count == 0:
@@ -239,23 +302,23 @@ class LabeledCounterMetric(Metric):
239
302
  f"but got {len(label_values)} values {label_values}."
240
303
  )
241
304
 
242
- collected_metrics.append(
243
- {
244
- "namespace": self._namespace,
245
- "name": self.name,
246
- "value": counter.count,
247
- "type": self._type,
248
- **dict(zip(static_key_label_value, label_values)),
249
- **dict(zip(static_key_label, self._labels)),
250
- }
251
- )
305
+ # Create labels dictionary
306
+ labels_dict = {
307
+ label_name: label_value
308
+ for label_name, label_value in zip(self._labels, label_values)
309
+ }
252
310
 
253
- return collected_metrics
311
+ payload.append(
312
+ CounterPayload(
313
+ namespace=self._namespace,
314
+ name=self.name,
315
+ value=counter.count,
316
+ type=self._type,
317
+ labels=labels_dict,
318
+ )
319
+ )
254
320
 
255
- def collect(self) -> List[Dict[str, Union[str, int]]]:
256
- if config.DISABLE_EVENTS:
257
- return list()
258
- return self._as_list()
321
+ return payload
259
322
 
260
323
 
261
324
  class Counter:
@@ -268,17 +331,15 @@ class Counter:
268
331
  """
269
332
 
270
333
  @overload
271
- def __new__(cls, name: str, namespace: Optional[str] = "") -> CounterMetric:
334
+ def __new__(cls, namespace: str, name: str) -> CounterMetric:
272
335
  return CounterMetric(namespace=namespace, name=name)
273
336
 
274
337
  @overload
275
- def __new__(
276
- cls, name: str, labels: List[str], namespace: Optional[str] = ""
277
- ) -> LabeledCounterMetric:
338
+ def __new__(cls, namespace: str, name: str, labels: list[str]) -> LabeledCounterMetric:
278
339
  return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
279
340
 
280
341
  def __new__(
281
- cls, name: str, namespace: Optional[str] = "", labels: Optional[List[str]] = None
342
+ cls, namespace: str, name: str, labels: Optional[list[str]] = None
282
343
  ) -> Union[CounterMetric, LabeledCounterMetric]:
283
344
  if labels is not None:
284
345
  return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
@@ -297,7 +358,7 @@ def publish_metrics() -> None:
297
358
  return
298
359
 
299
360
  collected_metrics = MetricRegistry().collect()
300
- if not collected_metrics["metrics"]: # Skip publishing if no metrics remain after filtering
361
+ if not collected_metrics.payload: # Skip publishing if no metrics remain after filtering
301
362
  return
302
363
 
303
364
  metadata = EventMetadata(
@@ -307,4 +368,6 @@ def publish_metrics() -> None:
307
368
 
308
369
  if collected_metrics:
309
370
  publisher = AnalyticsClientPublisher()
310
- publisher.publish([Event(name="ls_metrics", metadata=metadata, payload=collected_metrics)])
371
+ publisher.publish(
372
+ [Event(name="ls_metrics", metadata=metadata, payload=collected_metrics.as_dict())]
373
+ )
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.4.1.dev67'
21
- __version_tuple__ = version_tuple = (4, 4, 1, 'dev67')
20
+ __version__ = version = '4.4.1.dev69'
21
+ __version_tuple__ = version_tuple = (4, 4, 1, 'dev69')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.4.1.dev67
3
+ Version: 4.4.1.dev69
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=mNXTebZ8kSbQjFKz0LbT-g1Kdr0CE8bhEgZfHV3IX0s,15
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
6
  localstack/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- localstack/version.py,sha256=KzByaA7Pnpr9ZwP_IYGFSOt8hgpr-vsiYS_XpVgRNZk,526
7
+ localstack/version.py,sha256=z9Kz5prke3b1wuadhqes9iPHbLh5UsCrHdh40ZzQTYg,526
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
@@ -192,24 +192,24 @@ localstack/services/apigateway/legacy/context.py,sha256=rAxA3Hsse8uDpDWsbJPvQUyD
192
192
  localstack/services/apigateway/legacy/helpers.py,sha256=NXqO51XF84JNhfiACs2GS7IkZrVDD9THmq-j5oNkn-I,27714
193
193
  localstack/services/apigateway/legacy/integration.py,sha256=huAXczErE_txGt29zLLm6Sl8GDemLTdI9Ku94uAZ0Y4,48669
194
194
  localstack/services/apigateway/legacy/invocations.py,sha256=rowiOycXuehS6JC-WPipLTuNVoGS4lC-Y2VPy7pxUK0,15310
195
- localstack/services/apigateway/legacy/provider.py,sha256=LxMgWYXuc4tNTxxFqC6U3Awp9EU4RbzQbpBbBaxQhZU,121861
195
+ localstack/services/apigateway/legacy/provider.py,sha256=nYsGMbwCMZfx5LmXcaPN9-OnC6rbfDjXMmt_JLjXfE0,121874
196
196
  localstack/services/apigateway/legacy/router_asf.py,sha256=-hf0eRxn0BXiSf_-1j2N2JtY6dVeoY19eckB8JTCPwI,6102
197
197
  localstack/services/apigateway/legacy/templates.py,sha256=LiK-LRO0hadI3_JgzbwMsybD-2XEGvgn06KcUEjL0Uo,15065
198
198
  localstack/services/apigateway/next_gen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
199
- localstack/services/apigateway/next_gen/provider.py,sha256=AdOIEeuxKA1xjcYxU3XIaLQlTP7EOXgk5OsBZtKHdp4,21349
199
+ localstack/services/apigateway/next_gen/provider.py,sha256=bTso2VEQ2qHwQee4o81H5YrU9isQ4y-1f_BtfftarJU,21500
200
200
  localstack/services/apigateway/next_gen/execute_api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
201
201
  localstack/services/apigateway/next_gen/execute_api/api.py,sha256=4hBm-VYLhctVocblhap2g9HxbDu2HoMW0LkvxaMVFCA,550
202
- localstack/services/apigateway/next_gen/execute_api/context.py,sha256=33967H4AtpVzdwLkJ2yEWmsQ_OVh1HkTW-vNGAAA-Wc,5193
202
+ localstack/services/apigateway/next_gen/execute_api/context.py,sha256=GDXZqH88Xx9wsoxPsKfXBObZFJ_08QHnBQbNl2zNt_M,5485
203
203
  localstack/services/apigateway/next_gen/execute_api/gateway.py,sha256=8ZOqyrm5BiXpCQd2oxH5THN8WIALM7B-F5xAinDccmU,1791
204
204
  localstack/services/apigateway/next_gen/execute_api/gateway_response.py,sha256=MxBDid0utvBhOPVYDav9eo4biHb-4EhXy9UvNFg3ZMU,10304
205
205
  localstack/services/apigateway/next_gen/execute_api/header_utils.py,sha256=XViyp3Ku6-9LZrN792iROojVWqDSV1iq21C0BOOoGA8,1716
206
- localstack/services/apigateway/next_gen/execute_api/helpers.py,sha256=LeCbwKw9tv4PxbrObrhAiKvq6K9pEO6PV9-Kf1k6uPE,5934
207
- localstack/services/apigateway/next_gen/execute_api/moto_helpers.py,sha256=TIoKSLAYMNtguXgto2yctSo0VNdJuyTiB1UKj3e_lD0,2547
206
+ localstack/services/apigateway/next_gen/execute_api/helpers.py,sha256=aH6coQ3Uth2EUQUWijYnGSK0kBFjsfDZZyRB2vrTdKA,6118
207
+ localstack/services/apigateway/next_gen/execute_api/moto_helpers.py,sha256=1_ww5oVj5vhGbex1kheY4eCPBc0Q0QBWeb2RGNSs77s,2895
208
208
  localstack/services/apigateway/next_gen/execute_api/parameters_mapping.py,sha256=iDkI7WIp9xBnKQx--Xpao5bmTNpdDfu6Iz3HRfl6ykc,12173
209
- localstack/services/apigateway/next_gen/execute_api/router.py,sha256=VDrfYSulZs5jQVdvBuYOcKlzL_Q0rNIm2cghqVmHEQg,7717
209
+ localstack/services/apigateway/next_gen/execute_api/router.py,sha256=MyBM_f3DpFuFxDEvzJmauBVED4szgY2bWTn0mJUQDlA,9058
210
210
  localstack/services/apigateway/next_gen/execute_api/template_mapping.py,sha256=i5tysGpcaIQxtXTwaBTkOeXtlqv3OiI3-Sxl3v8IX5o,10147
211
211
  localstack/services/apigateway/next_gen/execute_api/test_invoke.py,sha256=vzaCUu4RdVNdipcl-Iro3IOpoBkm_m-aAI1XxwgbztA,9574
212
- localstack/services/apigateway/next_gen/execute_api/variables.py,sha256=ARlPW2Aldg96ft2ufwE9_o-doqyfg68xV-23Sr1D958,7930
212
+ localstack/services/apigateway/next_gen/execute_api/variables.py,sha256=ixEXZWYEjf7RFqPCr1sEZq2PiarvQZjVAD69i7BOhRc,7903
213
213
  localstack/services/apigateway/next_gen/execute_api/handlers/__init__.py,sha256=6a7jt0l36AifxHho9WGBBiQZoEtHiiYsSYLBWUSBNJ4,1338
214
214
  localstack/services/apigateway/next_gen/execute_api/handlers/analytics.py,sha256=5vVSXK3fPRiXt4WwuSoH1s8p2lQr27um7Te-jBZobsc,1733
215
215
  localstack/services/apigateway/next_gen/execute_api/handlers/api_key_validation.py,sha256=Kz_1CqIHv4assRWoO_SPCxe1EZqDjH-kxuXqhfi4oXs,4916
@@ -219,7 +219,7 @@ localstack/services/apigateway/next_gen/execute_api/handlers/integration_request
219
219
  localstack/services/apigateway/next_gen/execute_api/handlers/integration_response.py,sha256=bBhk6Nokk16DX_nCDyzsI2__4E-TUmBZ_Lzp4MliWnk,13640
220
220
  localstack/services/apigateway/next_gen/execute_api/handlers/method_request.py,sha256=AA8ZxvqUOoyEKxDg-HscE1C7TNn_l2d_PqZq2wpG64Y,5651
221
221
  localstack/services/apigateway/next_gen/execute_api/handlers/method_response.py,sha256=bgBNX1r9ZoZywh9bfx6XuYq5_GvYQGmhcdx-nhMKlGg,3264
222
- localstack/services/apigateway/next_gen/execute_api/handlers/parse.py,sha256=6Dg0wU3aHF_GFG7lmoro-Tp2nrcRTmtxfHNHQyzFZL0,8645
222
+ localstack/services/apigateway/next_gen/execute_api/handlers/parse.py,sha256=nH_rmKKJA2t3tZIF1r5J1rDKGDEpodPevL6mF_dw6YA,8702
223
223
  localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py,sha256=uipAChGDPqXssQecUBBxydNgQSLo_0HrRieOY9Tgjug,6540
224
224
  localstack/services/apigateway/next_gen/execute_api/handlers/response_enricher.py,sha256=XNCJQ0OpfxIw_hrPhJ_UKbJuTWbrHe5ZNwbIWDATiGw,1145
225
225
  localstack/services/apigateway/next_gen/execute_api/integrations/__init__.py,sha256=-eU2l2ktfSZoLAXNjsmbsFoDKjSV885Faqr1UHBmy00,562
@@ -1246,7 +1246,7 @@ localstack/utils/analytics/client.py,sha256=6bUWMpS42dUCRcRhkJuqHhlx_OSJegQJ4WJo
1246
1246
  localstack/utils/analytics/events.py,sha256=XMzrrcJc-p-6DxQfALHWO4lZco_I30dt_5MbCR_sKJc,582
1247
1247
  localstack/utils/analytics/logger.py,sha256=-sA_zjptY7o2kOXP2sDduQPzfNwULYIRnoqwKGgsg2Q,1397
1248
1248
  localstack/utils/analytics/metadata.py,sha256=tup9FurX-SlDGGY0at4YBcfdavz5C4pLet-gaqZltfM,7151
1249
- localstack/utils/analytics/metrics.py,sha256=xDfmDwWEt-WmB2goY96X0J1WhqlYkjFUTLwcgEja5KM,10130
1249
+ localstack/utils/analytics/metrics.py,sha256=1PIHZSZtGjcl6uTYto-HVeq3gdUnF4z389IeWttF4M8,11837
1250
1250
  localstack/utils/analytics/publisher.py,sha256=Y_xbaM-cZjZVtTRSCQWpGLU4KrSiLJ7TC-iaIyBOufw,8629
1251
1251
  localstack/utils/analytics/service_request_aggregator.py,sha256=QhgvA79wDjrXq3FI7EP9ziTHYEOspot7fy6D0yfVKDw,3926
1252
1252
  localstack/utils/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1279,13 +1279,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1279
1279
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1280
1280
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1281
1281
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1282
- localstack_core-4.4.1.dev67.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
- localstack_core-4.4.1.dev67.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
- localstack_core-4.4.1.dev67.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
- localstack_core-4.4.1.dev67.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
- localstack_core-4.4.1.dev67.dist-info/METADATA,sha256=ssCIAMylWBo_NGnTkReY0MY1qlKt_tbRDrnzboWRFwE,5539
1287
- localstack_core-4.4.1.dev67.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1288
- localstack_core-4.4.1.dev67.dist-info/entry_points.txt,sha256=K5M7il9Vwev64SlQiOaZVUhYpVNIE6IFHiWJ0znpbHQ,20491
1289
- localstack_core-4.4.1.dev67.dist-info/plux.json,sha256=v_aQTmb3sViGbf8WqGJCRoTSZORjSJwECKzvc2AiSI8,20712
1290
- localstack_core-4.4.1.dev67.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
- localstack_core-4.4.1.dev67.dist-info/RECORD,,
1282
+ localstack_core-4.4.1.dev69.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1283
+ localstack_core-4.4.1.dev69.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1284
+ localstack_core-4.4.1.dev69.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1285
+ localstack_core-4.4.1.dev69.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1286
+ localstack_core-4.4.1.dev69.dist-info/METADATA,sha256=jglL1BtkPDgzYzTzCBy7UP5nFhkGvVhD2r-Xq2S4X4w,5539
1287
+ localstack_core-4.4.1.dev69.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1288
+ localstack_core-4.4.1.dev69.dist-info/entry_points.txt,sha256=K5M7il9Vwev64SlQiOaZVUhYpVNIE6IFHiWJ0znpbHQ,20491
1289
+ localstack_core-4.4.1.dev69.dist-info/plux.json,sha256=S46RdA2rCgjmixNLFzp8_6aHQbspCkQFSgmy9HpCLdg,20712
1290
+ localstack_core-4.4.1.dev69.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1291
+ localstack_core-4.4.1.dev69.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.hooks.on_infra_start": ["setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui"], "localstack.hooks.on_infra_shutdown": ["stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_start": ["delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package"], "localstack.hooks.on_infra_shutdown": ["publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudformation:engine-v2=localstack.services.providers:cloudformation_v2", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"]}