localstack-core 4.5.1.dev21__py3-none-any.whl → 4.5.1.dev23__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.
- localstack/services/apigateway/analytics.py +2 -2
- localstack/services/apigateway/next_gen/execute_api/handlers/analytics.py +3 -3
- localstack/services/cloudformation/{usage.py → analytics.py} +2 -2
- localstack/services/cloudformation/engine/v2/change_set_model_executor.py +25 -18
- localstack/services/cloudformation/resource_provider.py +3 -3
- localstack/services/cloudformation/v2/entities.py +3 -0
- localstack/services/cloudformation/v2/provider.py +44 -8
- localstack/services/events/analytics.py +4 -2
- localstack/services/kinesis/resource_providers/aws_kinesis_stream.py +1 -1
- localstack/services/lambda_/analytics.py +4 -4
- localstack/services/sns/analytics.py +4 -2
- localstack/services/stepfunctions/{usage.py → analytics.py} +2 -2
- localstack/services/stepfunctions/asl/static_analyser/usage_metrics_static_analyser.py +2 -2
- localstack/utils/analytics/metrics/__init__.py +6 -0
- localstack/utils/analytics/metrics/api.py +42 -0
- localstack/utils/analytics/metrics/counter.py +209 -0
- localstack/utils/analytics/metrics/publisher.py +36 -0
- localstack/utils/analytics/metrics/registry.py +97 -0
- localstack/version.py +2 -2
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/METADATA +1 -1
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/RECORD +29 -25
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/entry_points.txt +1 -1
- localstack_core-4.5.1.dev23.dist-info/plux.json +1 -0
- localstack/utils/analytics/metrics.py +0 -373
- localstack_core-4.5.1.dev21.dist-info/plux.json +0 -1
- {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack +0 -0
- {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/WHEEL +0 -0
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/top_level.txt +0 -0
@@ -1,373 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
import datetime
|
4
|
-
import logging
|
5
|
-
import threading
|
6
|
-
from abc import ABC, abstractmethod
|
7
|
-
from collections import defaultdict
|
8
|
-
from dataclasses import dataclass
|
9
|
-
from typing import Any, Optional, Union, overload
|
10
|
-
|
11
|
-
from localstack import config
|
12
|
-
from localstack.runtime import hooks
|
13
|
-
from localstack.utils.analytics import get_session_id
|
14
|
-
from localstack.utils.analytics.events import Event, EventMetadata
|
15
|
-
from localstack.utils.analytics.publisher import AnalyticsClientPublisher
|
16
|
-
|
17
|
-
LOG = logging.getLogger(__name__)
|
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
|
-
|
73
|
-
class MetricRegistry:
|
74
|
-
"""
|
75
|
-
A Singleton class responsible for managing all registered metrics.
|
76
|
-
Provides methods for retrieving and collecting metrics.
|
77
|
-
"""
|
78
|
-
|
79
|
-
_instance: "MetricRegistry" = None
|
80
|
-
_mutex: threading.Lock = threading.Lock()
|
81
|
-
|
82
|
-
def __new__(cls):
|
83
|
-
# avoid locking if the instance already exist
|
84
|
-
if cls._instance is None:
|
85
|
-
with cls._mutex:
|
86
|
-
# Prevents race conditions when multiple threads enter the first check simultaneously
|
87
|
-
if cls._instance is None:
|
88
|
-
cls._instance = super().__new__(cls)
|
89
|
-
return cls._instance
|
90
|
-
|
91
|
-
def __init__(self):
|
92
|
-
if not hasattr(self, "_registry"):
|
93
|
-
self._registry = dict()
|
94
|
-
|
95
|
-
@property
|
96
|
-
def registry(self) -> dict[MetricRegistryKey, "Metric"]:
|
97
|
-
return self._registry
|
98
|
-
|
99
|
-
def register(self, metric: Metric) -> None:
|
100
|
-
"""
|
101
|
-
Registers a new metric.
|
102
|
-
|
103
|
-
:param metric: The metric instance to register.
|
104
|
-
:type metric: Metric
|
105
|
-
:raises TypeError: If the provided metric is not an instance of `Metric`.
|
106
|
-
:raises ValueError: If a metric with the same name already exists.
|
107
|
-
"""
|
108
|
-
if not isinstance(metric, Metric):
|
109
|
-
raise TypeError("Only subclasses of `Metric` can be registered.")
|
110
|
-
|
111
|
-
if not metric.namespace:
|
112
|
-
raise ValueError("Metric 'namespace' must be defined and non-empty.")
|
113
|
-
|
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
|
-
)
|
119
|
-
|
120
|
-
self._registry[registry_unique_key] = metric
|
121
|
-
|
122
|
-
def collect(self) -> MetricPayload:
|
123
|
-
"""
|
124
|
-
Collects all registered metrics.
|
125
|
-
"""
|
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)
|
133
|
-
|
134
|
-
|
135
|
-
class Metric(ABC):
|
136
|
-
"""
|
137
|
-
Base class for all metrics (e.g., Counter, Gauge).
|
138
|
-
|
139
|
-
Each subclass must implement the `collect()` method.
|
140
|
-
"""
|
141
|
-
|
142
|
-
_namespace: str
|
143
|
-
_name: str
|
144
|
-
|
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
|
-
|
150
|
-
if not name or name.strip() == "":
|
151
|
-
raise ValueError("Metric name must be non-empty string.")
|
152
|
-
self._name = name
|
153
|
-
|
154
|
-
@property
|
155
|
-
def namespace(self) -> str:
|
156
|
-
return self._namespace
|
157
|
-
|
158
|
-
@property
|
159
|
-
def name(self) -> str:
|
160
|
-
return self._name
|
161
|
-
|
162
|
-
@abstractmethod
|
163
|
-
def collect(
|
164
|
-
self,
|
165
|
-
) -> list[CounterPayload]: # support for other metric types may be added in the future.
|
166
|
-
"""
|
167
|
-
Collects and returns metric data. Subclasses must implement this to return collected metric data.
|
168
|
-
"""
|
169
|
-
pass
|
170
|
-
|
171
|
-
|
172
|
-
class BaseCounter:
|
173
|
-
"""
|
174
|
-
A thread-safe counter for any kind of tracking.
|
175
|
-
This class should not be instantiated directly, use the Counter class instead.
|
176
|
-
"""
|
177
|
-
|
178
|
-
_mutex: threading.Lock
|
179
|
-
_count: int
|
180
|
-
|
181
|
-
def __init__(self):
|
182
|
-
super(BaseCounter, self).__init__()
|
183
|
-
self._mutex = threading.Lock()
|
184
|
-
self._count = 0
|
185
|
-
|
186
|
-
@property
|
187
|
-
def count(self) -> int:
|
188
|
-
return self._count
|
189
|
-
|
190
|
-
def increment(self, value: int = 1) -> None:
|
191
|
-
"""Increments the counter unless events are disabled."""
|
192
|
-
if config.DISABLE_EVENTS:
|
193
|
-
return
|
194
|
-
|
195
|
-
if value <= 0:
|
196
|
-
raise ValueError("Increment value must be positive.")
|
197
|
-
|
198
|
-
with self._mutex:
|
199
|
-
self._count += value
|
200
|
-
|
201
|
-
def reset(self) -> None:
|
202
|
-
"""Resets the counter to zero unless events are disabled."""
|
203
|
-
if config.DISABLE_EVENTS:
|
204
|
-
return
|
205
|
-
|
206
|
-
with self._mutex:
|
207
|
-
self._count = 0
|
208
|
-
|
209
|
-
|
210
|
-
class CounterMetric(Metric, BaseCounter):
|
211
|
-
"""
|
212
|
-
A thread-safe counter for tracking occurrences of an event without labels.
|
213
|
-
This class should not be instantiated directly, use the Counter class instead.
|
214
|
-
"""
|
215
|
-
|
216
|
-
_type: str
|
217
|
-
|
218
|
-
def __init__(self, namespace: str, name: str):
|
219
|
-
Metric.__init__(self, namespace=namespace, name=name)
|
220
|
-
BaseCounter.__init__(self)
|
221
|
-
|
222
|
-
self._type = "counter"
|
223
|
-
MetricRegistry().register(self)
|
224
|
-
|
225
|
-
def collect(self) -> list[CounterPayload]:
|
226
|
-
"""Collects the metric unless events are disabled."""
|
227
|
-
if config.DISABLE_EVENTS:
|
228
|
-
return list()
|
229
|
-
|
230
|
-
if self._count == 0:
|
231
|
-
# Return an empty list if the count is 0, as there are no metrics to send to the analytics backend.
|
232
|
-
return list()
|
233
|
-
|
234
|
-
return [
|
235
|
-
CounterPayload(
|
236
|
-
namespace=self._namespace, name=self.name, value=self._count, type=self._type
|
237
|
-
)
|
238
|
-
]
|
239
|
-
|
240
|
-
|
241
|
-
class LabeledCounterMetric(Metric):
|
242
|
-
"""
|
243
|
-
A labeled counter that tracks occurrences of an event across different label combinations.
|
244
|
-
This class should not be instantiated directly, use the Counter class instead.
|
245
|
-
"""
|
246
|
-
|
247
|
-
_type: str
|
248
|
-
_unit: str
|
249
|
-
_labels: list[str]
|
250
|
-
_label_values: tuple[Optional[Union[str, float]], ...]
|
251
|
-
_counters_by_label_values: defaultdict[tuple[Optional[Union[str, float]], ...], BaseCounter]
|
252
|
-
|
253
|
-
def __init__(self, namespace: str, name: str, labels: list[str]):
|
254
|
-
super(LabeledCounterMetric, self).__init__(namespace=namespace, name=name)
|
255
|
-
|
256
|
-
if not labels:
|
257
|
-
raise ValueError("At least one label is required; the labels list cannot be empty.")
|
258
|
-
|
259
|
-
if any(not label for label in labels):
|
260
|
-
raise ValueError("Labels must be non-empty strings.")
|
261
|
-
|
262
|
-
if len(labels) > 6:
|
263
|
-
raise ValueError("Too many labels: counters allow a maximum of 6.")
|
264
|
-
|
265
|
-
self._type = "counter"
|
266
|
-
self._labels = labels
|
267
|
-
self._counters_by_label_values = defaultdict(BaseCounter)
|
268
|
-
MetricRegistry().register(self)
|
269
|
-
|
270
|
-
def labels(self, **kwargs: Union[str, float, None]) -> BaseCounter:
|
271
|
-
"""
|
272
|
-
Create a scoped counter instance with specific label values.
|
273
|
-
|
274
|
-
This method assigns values to the predefined labels of a labeled counter and returns
|
275
|
-
a BaseCounter object that allows tracking metrics for that specific
|
276
|
-
combination of label values.
|
277
|
-
|
278
|
-
:raises ValueError:
|
279
|
-
- If the set of keys provided labels does not match the expected set of labels.
|
280
|
-
"""
|
281
|
-
if set(self._labels) != set(kwargs.keys()):
|
282
|
-
raise ValueError(f"Expected labels {self._labels}, got {list(kwargs.keys())}")
|
283
|
-
|
284
|
-
_label_values = tuple(kwargs[label] for label in self._labels)
|
285
|
-
|
286
|
-
return self._counters_by_label_values[_label_values]
|
287
|
-
|
288
|
-
def collect(self) -> list[CounterPayload]:
|
289
|
-
if config.DISABLE_EVENTS:
|
290
|
-
return list()
|
291
|
-
|
292
|
-
payload = []
|
293
|
-
num_labels = len(self._labels)
|
294
|
-
|
295
|
-
for label_values, counter in self._counters_by_label_values.items():
|
296
|
-
if counter.count == 0:
|
297
|
-
continue # Skip items with a count of 0, as they should not be sent to the analytics backend.
|
298
|
-
|
299
|
-
if len(label_values) != num_labels:
|
300
|
-
raise ValueError(
|
301
|
-
f"Label count mismatch: expected {num_labels} labels {self._labels}, "
|
302
|
-
f"but got {len(label_values)} values {label_values}."
|
303
|
-
)
|
304
|
-
|
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
|
-
}
|
310
|
-
|
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
|
-
)
|
320
|
-
|
321
|
-
return payload
|
322
|
-
|
323
|
-
|
324
|
-
class Counter:
|
325
|
-
"""
|
326
|
-
A factory class for creating counter instances.
|
327
|
-
|
328
|
-
This class provides a flexible way to create either a simple counter
|
329
|
-
(`CounterMetric`) or a labeled counter (`LabeledCounterMetric`) based on
|
330
|
-
whether labels are provided.
|
331
|
-
"""
|
332
|
-
|
333
|
-
@overload
|
334
|
-
def __new__(cls, namespace: str, name: str) -> CounterMetric:
|
335
|
-
return CounterMetric(namespace=namespace, name=name)
|
336
|
-
|
337
|
-
@overload
|
338
|
-
def __new__(cls, namespace: str, name: str, labels: list[str]) -> LabeledCounterMetric:
|
339
|
-
return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
|
340
|
-
|
341
|
-
def __new__(
|
342
|
-
cls, namespace: str, name: str, labels: Optional[list[str]] = None
|
343
|
-
) -> Union[CounterMetric, LabeledCounterMetric]:
|
344
|
-
if labels is not None:
|
345
|
-
return LabeledCounterMetric(namespace=namespace, name=name, labels=labels)
|
346
|
-
return CounterMetric(namespace=namespace, name=name)
|
347
|
-
|
348
|
-
|
349
|
-
@hooks.on_infra_shutdown()
|
350
|
-
def publish_metrics() -> None:
|
351
|
-
"""
|
352
|
-
Collects all the registered metrics and immediately sends them to the analytics service.
|
353
|
-
Skips execution if event tracking is disabled (`config.DISABLE_EVENTS`).
|
354
|
-
|
355
|
-
This function is automatically triggered on infrastructure shutdown.
|
356
|
-
"""
|
357
|
-
if config.DISABLE_EVENTS:
|
358
|
-
return
|
359
|
-
|
360
|
-
collected_metrics = MetricRegistry().collect()
|
361
|
-
if not collected_metrics.payload: # Skip publishing if no metrics remain after filtering
|
362
|
-
return
|
363
|
-
|
364
|
-
metadata = EventMetadata(
|
365
|
-
session_id=get_session_id(),
|
366
|
-
client_time=str(datetime.datetime.now()),
|
367
|
-
)
|
368
|
-
|
369
|
-
if collected_metrics:
|
370
|
-
publisher = AnalyticsClientPublisher()
|
371
|
-
publisher.publish(
|
372
|
-
[Event(name="ls_metrics", metadata=metadata, payload=collected_metrics.as_dict())]
|
373
|
-
)
|
@@ -1 +0,0 @@
|
|
1
|
-
{"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.hooks.on_infra_shutdown": ["_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "stop_server=localstack.dns.plugins:stop_server", "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"], "localstack.hooks.on_infra_start": ["_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "eager_load_services=localstack.services.plugins:eager_load_services", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "_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", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.cloudformation.resource_providers": ["AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "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::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "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::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "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::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::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin"], "localstack.packages": ["ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "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.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "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.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"]}
|
File without changes
|
{localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack-supervisor
RENAMED
File without changes
|
{localstack_core-4.5.1.dev21.data → localstack_core-4.5.1.dev23.data}/scripts/localstack.bat
RENAMED
File without changes
|
File without changes
|
{localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/licenses/LICENSE.txt
RENAMED
File without changes
|
{localstack_core-4.5.1.dev21.dist-info → localstack_core-4.5.1.dev23.dist-info}/top_level.txt
RENAMED
File without changes
|