localstack-core 4.8.2.dev11__py3-none-any.whl → 4.8.2.dev12__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.
Potentially problematic release.
This version of localstack-core might be problematic. Click here for more details.
- localstack/aws/api/core.py +4 -0
- localstack/aws/handlers/service.py +7 -4
- localstack/aws/protocol/parser.py +0 -4
- localstack/aws/protocol/serializer.py +1 -4
- localstack/aws/protocol/service_router.py +120 -20
- localstack/aws/skeleton.py +4 -2
- localstack/aws/spec.py +32 -12
- localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +3 -0
- localstack/services/sqs/query_api.py +1 -1
- localstack/version.py +2 -2
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/METADATA +1 -1
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/RECORD +20 -20
- localstack_core-4.8.2.dev12.dist-info/plux.json +1 -0
- localstack_core-4.8.2.dev11.dist-info/plux.json +0 -1
- {localstack_core-4.8.2.dev11.data → localstack_core-4.8.2.dev12.data}/scripts/localstack +0 -0
- {localstack_core-4.8.2.dev11.data → localstack_core-4.8.2.dev12.data}/scripts/localstack-supervisor +0 -0
- {localstack_core-4.8.2.dev11.data → localstack_core-4.8.2.dev12.data}/scripts/localstack.bat +0 -0
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/WHEEL +0 -0
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/entry_points.txt +0 -0
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/licenses/LICENSE.txt +0 -0
- {localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/top_level.txt +0 -0
localstack/aws/api/core.py
CHANGED
|
@@ -13,6 +13,7 @@ from botocore.model import OperationModel, ServiceModel
|
|
|
13
13
|
from rolo.gateway import RequestContext as RoloRequestContext
|
|
14
14
|
|
|
15
15
|
from localstack.aws.connect import InternalRequestParameters
|
|
16
|
+
from localstack.aws.spec import ProtocolName
|
|
16
17
|
from localstack.http import Request, Response
|
|
17
18
|
from localstack.utils.strings import long_uid
|
|
18
19
|
|
|
@@ -88,6 +89,8 @@ class RequestContext(RoloRequestContext):
|
|
|
88
89
|
"""The underlying incoming HTTP request."""
|
|
89
90
|
service: ServiceModel | None
|
|
90
91
|
"""The botocore ServiceModel of the service the request is made to."""
|
|
92
|
+
protocol: ProtocolName | None
|
|
93
|
+
"""The botocore Protocol for the service the request is made to."""
|
|
91
94
|
operation: OperationModel | None
|
|
92
95
|
"""The botocore OperationModel of the AWS operation being invoked."""
|
|
93
96
|
region: str
|
|
@@ -112,6 +115,7 @@ class RequestContext(RoloRequestContext):
|
|
|
112
115
|
def __init__(self, request: Request):
|
|
113
116
|
super().__init__(request)
|
|
114
117
|
self.service = None
|
|
118
|
+
self.protocol = None
|
|
115
119
|
self.operation = None
|
|
116
120
|
self.region = None # type: ignore[assignment] # type=str, because we know it will always be set downstream
|
|
117
121
|
self.partition = "aws" # Sensible default - will be overwritten by region-handler
|
|
@@ -17,7 +17,7 @@ from ..chain import CompositeResponseHandler, ExceptionHandler, Handler, Handler
|
|
|
17
17
|
from ..client import parse_response, parse_service_exception
|
|
18
18
|
from ..protocol.parser import RequestParser, create_parser
|
|
19
19
|
from ..protocol.serializer import create_serializer
|
|
20
|
-
from ..protocol.service_router import determine_aws_service_model
|
|
20
|
+
from ..protocol.service_router import determine_aws_protocol, determine_aws_service_model
|
|
21
21
|
from ..skeleton import Skeleton, create_skeleton
|
|
22
22
|
|
|
23
23
|
LOG = logging.getLogger(__name__)
|
|
@@ -33,6 +33,8 @@ class ServiceNameParser(Handler):
|
|
|
33
33
|
# example). If it is already set, we can skip the parsing of the request. It is very important for S3, because
|
|
34
34
|
# parsing the request will consume the data stream and prevent streaming.
|
|
35
35
|
if context.service:
|
|
36
|
+
if not context.protocol:
|
|
37
|
+
context.protocol = determine_aws_protocol(context.request, context.service)
|
|
36
38
|
return
|
|
37
39
|
|
|
38
40
|
service_model = determine_aws_service_model(context.request)
|
|
@@ -41,6 +43,7 @@ class ServiceNameParser(Handler):
|
|
|
41
43
|
return
|
|
42
44
|
|
|
43
45
|
context.service = service_model
|
|
46
|
+
context.protocol = determine_aws_protocol(context.request, service_model)
|
|
44
47
|
|
|
45
48
|
|
|
46
49
|
class ServiceRequestParser(Handler):
|
|
@@ -63,7 +66,7 @@ class ServiceRequestParser(Handler):
|
|
|
63
66
|
return self.parse_and_enrich(context)
|
|
64
67
|
|
|
65
68
|
def parse_and_enrich(self, context: RequestContext):
|
|
66
|
-
parser = create_parser(context.service)
|
|
69
|
+
parser = create_parser(context.service, context.protocol)
|
|
67
70
|
operation, instance = parser.parse(context.request)
|
|
68
71
|
|
|
69
72
|
# enrich context
|
|
@@ -137,7 +140,7 @@ class ServiceRequestRouter(Handler):
|
|
|
137
140
|
operation_name = operation.name
|
|
138
141
|
message = f"no handler for operation '{operation_name}' on service '{service_name}'"
|
|
139
142
|
error = CommonServiceException("InternalFailure", message, status_code=501)
|
|
140
|
-
serializer = create_serializer(context.service)
|
|
143
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
141
144
|
return serializer.serialize_error_to_response(
|
|
142
145
|
error, operation, context.request.headers, context.request_id
|
|
143
146
|
)
|
|
@@ -209,7 +212,7 @@ class ServiceExceptionSerializer(ExceptionHandler):
|
|
|
209
212
|
).with_traceback(exception.__traceback__)
|
|
210
213
|
context.service_exception = error
|
|
211
214
|
|
|
212
|
-
serializer = create_serializer(context.service)
|
|
215
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
213
216
|
return serializer.serialize_error_to_response(
|
|
214
217
|
error, operation, context.request.headers, context.request_id
|
|
215
218
|
)
|
|
@@ -1266,8 +1266,6 @@ class BaseRpcV2RequestParser(RequestParser):
|
|
|
1266
1266
|
"RPC v2 does not accept 'X-Amz-Target' or 'X-Amzn-Target'. "
|
|
1267
1267
|
"Such requests are rejected for security reasons."
|
|
1268
1268
|
)
|
|
1269
|
-
# TODO: add this special path handling to the ServiceNameParser to allow RPC v2 service to be properly extracted
|
|
1270
|
-
# path = '/service/{service_name}/operation/{operation_name}'
|
|
1271
1269
|
# The Smithy RPCv2 CBOR protocol will only use the last four segments of the URL when routing requests.
|
|
1272
1270
|
rpc_v2_params = request.path.lstrip("/").split("/")
|
|
1273
1271
|
if len(rpc_v2_params) < 4 or not (
|
|
@@ -1580,8 +1578,6 @@ def create_parser(service: ServiceModel, protocol: ProtocolName | None = None) -
|
|
|
1580
1578
|
# this is not an "official" protocol defined from the spec, but is derived from ``json``
|
|
1581
1579
|
}
|
|
1582
1580
|
|
|
1583
|
-
# TODO: do we want to add a check if the user-defined protocol is part of the available ones in the ServiceModel?
|
|
1584
|
-
# or should it be checked once
|
|
1585
1581
|
service_protocol = protocol or service.protocol
|
|
1586
1582
|
|
|
1587
1583
|
# Try to select a service- and protocol-specific parser implementation
|
|
@@ -2263,9 +2263,6 @@ def create_serializer(
|
|
|
2263
2263
|
# CBOR handling from JSONResponseParser
|
|
2264
2264
|
# this is not an "official" protocol defined from the spec, but is derived from ``json``
|
|
2265
2265
|
}
|
|
2266
|
-
# TODO: even though our Service Name Parser will only use a protocol that is available for the service, we might
|
|
2267
|
-
# want to verify if the given protocol here is available for that service, in case we are manually calling
|
|
2268
|
-
# this factory. Revisit once we implement multi-protocol support
|
|
2269
2266
|
service_protocol = protocol or service.protocol
|
|
2270
2267
|
|
|
2271
2268
|
# Try to select a service- and protocol-specific serializer implementation
|
|
@@ -2307,7 +2304,7 @@ def aws_response_serializer(
|
|
|
2307
2304
|
def _decorate(fn):
|
|
2308
2305
|
service_model = load_service(service_name, protocol=protocol)
|
|
2309
2306
|
operation_model = service_model.operation_model(operation)
|
|
2310
|
-
serializer = create_serializer(service_model)
|
|
2307
|
+
serializer = create_serializer(service_model, protocol=protocol)
|
|
2311
2308
|
|
|
2312
2309
|
def _proxy(*args, **kwargs) -> WerkzeugResponse:
|
|
2313
2310
|
# extract request from function invocation (decorator can be used for methods as well as for functions).
|
|
@@ -6,9 +6,11 @@ from werkzeug.exceptions import RequestEntityTooLarge
|
|
|
6
6
|
from werkzeug.http import parse_dict_header
|
|
7
7
|
|
|
8
8
|
from localstack.aws.spec import (
|
|
9
|
+
ProtocolName,
|
|
9
10
|
ServiceCatalog,
|
|
10
11
|
ServiceModelIdentifier,
|
|
11
12
|
get_service_catalog,
|
|
13
|
+
is_protocol_in_service_model_identifier,
|
|
12
14
|
)
|
|
13
15
|
from localstack.http import Request
|
|
14
16
|
from localstack.services.s3.utils import uses_host_addressing
|
|
@@ -17,6 +19,23 @@ from localstack.utils.strings import to_bytes
|
|
|
17
19
|
|
|
18
20
|
LOG = logging.getLogger(__name__)
|
|
19
21
|
|
|
22
|
+
_PROTOCOL_DETECTION_PRIORITY: list[ProtocolName] = [
|
|
23
|
+
"smithy-rpc-v2-cbor",
|
|
24
|
+
"json",
|
|
25
|
+
"query",
|
|
26
|
+
"ec2",
|
|
27
|
+
"rest-json",
|
|
28
|
+
"rest-xml",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ProtocolError(Exception):
|
|
33
|
+
"""
|
|
34
|
+
Error which is thrown if we cannot detect the protocol for the request.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
pass
|
|
38
|
+
|
|
20
39
|
|
|
21
40
|
class _ServiceIndicators(NamedTuple):
|
|
22
41
|
"""
|
|
@@ -43,6 +62,7 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
|
43
62
|
"""Extracts all different fields that might indicate which service a request is targeting."""
|
|
44
63
|
x_amz_target = request.headers.get("x-amz-target")
|
|
45
64
|
authorization = request.headers.get("authorization")
|
|
65
|
+
is_rpc_v2 = "rpc-v2-cbor" in request.headers.get("Smithy-Protocol", "")
|
|
46
66
|
|
|
47
67
|
signing_name = None
|
|
48
68
|
if authorization:
|
|
@@ -55,7 +75,15 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
|
55
75
|
except (ValueError, KeyError):
|
|
56
76
|
LOG.debug("auth header could not be parsed for service routing: %s", authorization)
|
|
57
77
|
pass
|
|
58
|
-
if
|
|
78
|
+
if is_rpc_v2:
|
|
79
|
+
# https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#requests
|
|
80
|
+
rpc_v2_params = request.path.lstrip("/").split("/")
|
|
81
|
+
if len(rpc_v2_params) >= 4:
|
|
82
|
+
*_, service_shape_name, __, operation = rpc_v2_params
|
|
83
|
+
target_prefix = service_shape_name.split("#")[-1]
|
|
84
|
+
else:
|
|
85
|
+
target_prefix, operation = None, None
|
|
86
|
+
elif x_amz_target:
|
|
59
87
|
if "." in x_amz_target:
|
|
60
88
|
target_prefix, operation = x_amz_target.split(".", 1)
|
|
61
89
|
else:
|
|
@@ -67,6 +95,48 @@ def _extract_service_indicators(request: Request) -> _ServiceIndicators:
|
|
|
67
95
|
return _ServiceIndicators(signing_name, target_prefix, operation, request.host, request.path)
|
|
68
96
|
|
|
69
97
|
|
|
98
|
+
def _matches_protocol(request: Request, protocol: ProtocolName) -> bool:
|
|
99
|
+
headers = request.headers
|
|
100
|
+
mimetype = request.mimetype.lower()
|
|
101
|
+
match protocol:
|
|
102
|
+
case "smithy-rpc-v2-cbor":
|
|
103
|
+
# Every request for the rpcv2Cbor protocol MUST contain a `Smithy-Protocol` header with the value
|
|
104
|
+
# of `rpc-v2-cbor`.
|
|
105
|
+
# https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html
|
|
106
|
+
return headers.get("Smithy-Protocol", "") == "rpc-v2-cbor"
|
|
107
|
+
case "json":
|
|
108
|
+
return mimetype.startswith("application/x-amz-json")
|
|
109
|
+
case "query" | "ec2":
|
|
110
|
+
# https://smithy.io/2.0/aws/protocols/aws-query-protocol.html#request-serialization
|
|
111
|
+
return (
|
|
112
|
+
mimetype.startswith("application/x-www-form-urlencoded") or "Action" in request.args
|
|
113
|
+
)
|
|
114
|
+
case "rest-xml" | "rest-json":
|
|
115
|
+
# `rest-json` and `rest-xml` can accept any kind of Content-Type, and it can be configured on the operation
|
|
116
|
+
# level.
|
|
117
|
+
# https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html
|
|
118
|
+
return True
|
|
119
|
+
case _:
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def match_available_protocols(
|
|
124
|
+
request: Request, available_protocols: list[ProtocolName]
|
|
125
|
+
) -> ProtocolName | None:
|
|
126
|
+
"""
|
|
127
|
+
Tries to match the current request and determine the protocol used amongst the available protocols given.
|
|
128
|
+
We use a priority order to try to determine the protocol, as some protocols are more permissive that others.
|
|
129
|
+
:param request: the incoming request
|
|
130
|
+
:param available_protocols: the available protocols of the Service the request is directed to
|
|
131
|
+
:return: the protocol matched, if any
|
|
132
|
+
"""
|
|
133
|
+
for protocol in _PROTOCOL_DETECTION_PRIORITY:
|
|
134
|
+
if protocol in available_protocols and _matches_protocol(request, protocol):
|
|
135
|
+
return protocol
|
|
136
|
+
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
|
|
70
140
|
signing_name_path_prefix_rules = {
|
|
71
141
|
# custom rules based on URI path prefixes that are not easily generalizable
|
|
72
142
|
"apigateway": {
|
|
@@ -248,10 +318,10 @@ def resolve_conflicts(
|
|
|
248
318
|
# The `application/x-amz-json-1.0` header is mandatory for requests targeting SQS with the `json` protocol. We
|
|
249
319
|
# can safely route them to the `sqs` JSON parser/serializer. If not present, route the request to the
|
|
250
320
|
# sqs-query protocol.
|
|
251
|
-
|
|
321
|
+
protocol = match_available_protocols(request, available_protocols=["json", "query"])
|
|
252
322
|
return (
|
|
253
323
|
ServiceModelIdentifier("sqs")
|
|
254
|
-
if
|
|
324
|
+
if protocol == "json"
|
|
255
325
|
else ServiceModelIdentifier("sqs", "query")
|
|
256
326
|
)
|
|
257
327
|
|
|
@@ -266,7 +336,25 @@ def determine_aws_service_model_for_data_plane(
|
|
|
266
336
|
custom_host_match = custom_host_addressing_rules(request.host)
|
|
267
337
|
if custom_host_match:
|
|
268
338
|
services = services or get_service_catalog()
|
|
269
|
-
return services.get(
|
|
339
|
+
return services.get(custom_host_match.name, custom_host_match.protocol)
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def determine_aws_protocol(request: Request, service_model: ServiceModel) -> ProtocolName:
|
|
343
|
+
if not (protocols := service_model.metadata.get("protocols")):
|
|
344
|
+
# if the service does not define multiple protocols, return the `protocol` defined for the service
|
|
345
|
+
return service_model.protocol
|
|
346
|
+
|
|
347
|
+
if len(protocols) == 1:
|
|
348
|
+
return protocols[0]
|
|
349
|
+
|
|
350
|
+
if protocol := match_available_protocols(request, available_protocols=protocols):
|
|
351
|
+
return protocol
|
|
352
|
+
|
|
353
|
+
raise ProtocolError(
|
|
354
|
+
f"Could not determine the protocol for the request: "
|
|
355
|
+
f"{request.method} {request.path} for the service '{service_model.service_name}' "
|
|
356
|
+
f"(available protocols: {protocols})"
|
|
357
|
+
)
|
|
270
358
|
|
|
271
359
|
|
|
272
360
|
def determine_aws_service_model(
|
|
@@ -287,12 +375,13 @@ def determine_aws_service_model(
|
|
|
287
375
|
signing_name_candidates = services.by_signing_name(signing_name)
|
|
288
376
|
if len(signing_name_candidates) == 1:
|
|
289
377
|
# a unique signing-name -> service name mapping is the case for ~75% of service operations
|
|
290
|
-
|
|
378
|
+
candidate = signing_name_candidates[0]
|
|
379
|
+
return services.get(candidate.name, candidate.protocol)
|
|
291
380
|
|
|
292
381
|
# try to find a match with the custom signing name rules
|
|
293
382
|
custom_match = custom_signing_name_rules(signing_name, path)
|
|
294
383
|
if custom_match:
|
|
295
|
-
return services.get(
|
|
384
|
+
return services.get(custom_match.name, custom_match.protocol)
|
|
296
385
|
|
|
297
386
|
# still ambiguous - add the services to the list of candidates
|
|
298
387
|
candidates.update(signing_name_candidates)
|
|
@@ -302,33 +391,34 @@ def determine_aws_service_model(
|
|
|
302
391
|
target_candidates = services.by_target_prefix(target_prefix)
|
|
303
392
|
if len(target_candidates) == 1:
|
|
304
393
|
# a unique target prefix
|
|
305
|
-
|
|
394
|
+
candidate = target_candidates[0]
|
|
395
|
+
return services.get(candidate.name, candidate.protocol)
|
|
306
396
|
|
|
307
397
|
# still ambiguous - add the services to the list of candidates
|
|
308
398
|
candidates.update(target_candidates)
|
|
309
399
|
|
|
310
400
|
# exclude services where the operation is not contained in the service spec
|
|
311
401
|
for service_identifier in list(candidates):
|
|
312
|
-
service = services.get(
|
|
402
|
+
service = services.get(service_identifier.name, service_identifier.protocol)
|
|
313
403
|
if operation not in service.operation_names:
|
|
314
404
|
candidates.remove(service_identifier)
|
|
315
405
|
else:
|
|
316
406
|
# exclude services which have a target prefix (the current request does not have one)
|
|
317
407
|
for service_identifier in list(candidates):
|
|
318
|
-
service = services.get(
|
|
408
|
+
service = services.get(service_identifier.name, service_identifier.protocol)
|
|
319
409
|
if service.metadata.get("targetPrefix") is not None:
|
|
320
410
|
candidates.remove(service_identifier)
|
|
321
411
|
|
|
322
412
|
if len(candidates) == 1:
|
|
323
413
|
service_identifier = candidates.pop()
|
|
324
|
-
return services.get(
|
|
414
|
+
return services.get(service_identifier.name, service_identifier.protocol)
|
|
325
415
|
|
|
326
416
|
# 3. check the path if it is set and not a trivial root path
|
|
327
417
|
if path and path != "/":
|
|
328
418
|
# try to find a match with the custom path rules
|
|
329
419
|
custom_path_match = custom_path_addressing_rules(path)
|
|
330
420
|
if custom_path_match:
|
|
331
|
-
return services.get(
|
|
421
|
+
return services.get(custom_path_match.name, custom_path_match.protocol)
|
|
332
422
|
|
|
333
423
|
# 4. check the host (custom host addressing rules)
|
|
334
424
|
if host:
|
|
@@ -337,12 +427,14 @@ def determine_aws_service_model(
|
|
|
337
427
|
# this prevents a virtual host addressed bucket to be wrongly recognized
|
|
338
428
|
if host.startswith(f"{prefix}.") and ".s3." not in host:
|
|
339
429
|
if len(services_per_prefix) == 1:
|
|
340
|
-
|
|
430
|
+
candidate = services_per_prefix[0]
|
|
431
|
+
return services.get(candidate.name, candidate.protocol)
|
|
341
432
|
candidates.update(services_per_prefix)
|
|
342
433
|
|
|
343
434
|
custom_host_match = custom_host_addressing_rules(host)
|
|
344
435
|
if custom_host_match:
|
|
345
|
-
|
|
436
|
+
candidate = custom_host_match[0]
|
|
437
|
+
return services.get(candidate.name, candidate.protocol)
|
|
346
438
|
|
|
347
439
|
if request.shallow:
|
|
348
440
|
# from here on we would need access to the request body, which doesn't exist for shallow requests like
|
|
@@ -357,21 +449,28 @@ def determine_aws_service_model(
|
|
|
357
449
|
query_candidates = [
|
|
358
450
|
service
|
|
359
451
|
for service in services.by_operation(values["Action"])
|
|
360
|
-
if
|
|
452
|
+
if any(
|
|
453
|
+
is_protocol_in_service_model_identifier(protocol, service)
|
|
454
|
+
for protocol in ("ec2", "query")
|
|
455
|
+
)
|
|
361
456
|
]
|
|
362
457
|
|
|
363
458
|
if len(query_candidates) == 1:
|
|
364
|
-
|
|
459
|
+
candidate = query_candidates[0]
|
|
460
|
+
return services.get(candidate.name, candidate.protocol)
|
|
365
461
|
|
|
366
462
|
if "Version" in values:
|
|
367
463
|
for service_identifier in list(query_candidates):
|
|
368
|
-
service_model = services.get(
|
|
464
|
+
service_model = services.get(
|
|
465
|
+
service_identifier.name, service_identifier.protocol
|
|
466
|
+
)
|
|
369
467
|
if values["Version"] != service_model.api_version:
|
|
370
468
|
# the combination of Version and Action is not unique, add matches to the candidates
|
|
371
469
|
query_candidates.remove(service_identifier)
|
|
372
470
|
|
|
373
471
|
if len(query_candidates) == 1:
|
|
374
|
-
|
|
472
|
+
candidate = query_candidates[0]
|
|
473
|
+
return services.get(candidate.name, candidate.protocol)
|
|
375
474
|
|
|
376
475
|
candidates.update(query_candidates)
|
|
377
476
|
|
|
@@ -387,15 +486,16 @@ def determine_aws_service_model(
|
|
|
387
486
|
# 6. resolve service spec conflicts
|
|
388
487
|
resolved_conflict = resolve_conflicts(candidates, request)
|
|
389
488
|
if resolved_conflict:
|
|
390
|
-
return services.get(
|
|
489
|
+
return services.get(resolved_conflict.name, resolved_conflict.protocol)
|
|
391
490
|
|
|
392
491
|
# 7. check the legacy S3 rules in the end
|
|
393
492
|
legacy_match = legacy_s3_rules(request)
|
|
394
493
|
if legacy_match:
|
|
395
|
-
return services.get(
|
|
494
|
+
return services.get(legacy_match.name, legacy_match.protocol)
|
|
396
495
|
|
|
397
496
|
if signing_name:
|
|
398
497
|
return services.get(name=signing_name)
|
|
399
498
|
if candidates:
|
|
400
|
-
|
|
499
|
+
candidate = candidates.pop()
|
|
500
|
+
return services.get(candidate.name, candidate.protocol)
|
|
401
501
|
return None
|
localstack/aws/skeleton.py
CHANGED
|
@@ -130,14 +130,16 @@ class Skeleton:
|
|
|
130
130
|
self.dispatch_table = create_dispatch_table(implementation)
|
|
131
131
|
|
|
132
132
|
def invoke(self, context: RequestContext) -> Response:
|
|
133
|
-
serializer = create_serializer(context.service)
|
|
133
|
+
serializer = create_serializer(context.service, context.protocol)
|
|
134
134
|
|
|
135
135
|
if context.operation and context.service_request:
|
|
136
136
|
# if the parsed request is already set in the context, re-use them
|
|
137
137
|
operation, instance = context.operation, context.service_request
|
|
138
138
|
else:
|
|
139
139
|
# otherwise, parse the incoming HTTPRequest
|
|
140
|
-
operation, instance = create_parser(context.service).parse(
|
|
140
|
+
operation, instance = create_parser(context.service, context.protocol).parse(
|
|
141
|
+
context.request
|
|
142
|
+
)
|
|
141
143
|
context.operation = operation
|
|
142
144
|
|
|
143
145
|
try:
|
localstack/aws/spec.py
CHANGED
|
@@ -33,6 +33,7 @@ class ServiceModelIdentifier(NamedTuple):
|
|
|
33
33
|
|
|
34
34
|
name: ServiceName
|
|
35
35
|
protocol: ProtocolName | None = None
|
|
36
|
+
protocols: tuple[ProtocolName] | None = None
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
spec_patches_json = os.path.join(os.path.dirname(__file__), "spec-patches.json")
|
|
@@ -114,9 +115,13 @@ def load_service(
|
|
|
114
115
|
:raises: UnknownServiceProtocolError if the specific protocol of the service cannot be found
|
|
115
116
|
"""
|
|
116
117
|
service_description = loader.load_service_model(service, "service-2", version)
|
|
118
|
+
service_metadata = service_description.get("metadata", {})
|
|
119
|
+
service_protocols = {service_metadata.get("protocol")}
|
|
120
|
+
if protocols := service_metadata.get("protocols"):
|
|
121
|
+
service_protocols.update(protocols)
|
|
117
122
|
|
|
118
123
|
# check if the protocol is defined, and if so, if the loaded service defines this protocol
|
|
119
|
-
if protocol is not None and protocol
|
|
124
|
+
if protocol is not None and protocol not in service_protocols:
|
|
120
125
|
# if the protocol is defined, but not the one of the currently loaded service,
|
|
121
126
|
# check if we already loaded the custom spec based on the naming convention (<service>-<protocol>),
|
|
122
127
|
# f.e. "sqs-query"
|
|
@@ -132,7 +137,7 @@ def load_service(
|
|
|
132
137
|
|
|
133
138
|
# remove potential protocol names from the service name
|
|
134
139
|
# FIXME add more protocols here if we have to internalize more than just sqs-query
|
|
135
|
-
# TODO this should not contain specific internalized
|
|
140
|
+
# TODO this should not contain specific internalized service names
|
|
136
141
|
service = {"sqs-query": "sqs"}.get(service, service)
|
|
137
142
|
return ServiceModel(service_description, service)
|
|
138
143
|
|
|
@@ -149,6 +154,27 @@ def iterate_service_operations() -> Generator[tuple[ServiceModel, OperationModel
|
|
|
149
154
|
yield service, service.operation_model(op_name)
|
|
150
155
|
|
|
151
156
|
|
|
157
|
+
def is_protocol_in_service_model_identifier(
|
|
158
|
+
protocol: ProtocolName, service_model_identifier: ServiceModelIdentifier
|
|
159
|
+
) -> bool:
|
|
160
|
+
"""
|
|
161
|
+
:param protocol: the protocol name to check
|
|
162
|
+
:param service_model_identifier:
|
|
163
|
+
:return: boolean to indicate if the protocol is available for that service
|
|
164
|
+
"""
|
|
165
|
+
protocols = service_model_identifier.protocols or []
|
|
166
|
+
return protocol in protocols or protocol == service_model_identifier.protocol
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def get_service_model_identifier(service_model: ServiceModel) -> ServiceModelIdentifier:
|
|
170
|
+
protocols = service_model.metadata.get("protocols")
|
|
171
|
+
return ServiceModelIdentifier(
|
|
172
|
+
name=service_model.service_name,
|
|
173
|
+
protocol=service_model.protocol,
|
|
174
|
+
protocols=tuple(protocols) if protocols else None,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
152
178
|
@dataclasses.dataclass
|
|
153
179
|
class ServiceCatalogIndex:
|
|
154
180
|
"""
|
|
@@ -178,9 +204,7 @@ class LazyServiceCatalogIndex:
|
|
|
178
204
|
for service_model in service_models:
|
|
179
205
|
target_prefix = service_model.metadata.get("targetPrefix")
|
|
180
206
|
if target_prefix:
|
|
181
|
-
result[target_prefix].append(
|
|
182
|
-
ServiceModelIdentifier(service_model.service_name, service_model.protocol)
|
|
183
|
-
)
|
|
207
|
+
result[target_prefix].append(get_service_model_identifier(service_model))
|
|
184
208
|
return dict(result)
|
|
185
209
|
|
|
186
210
|
@cached_property
|
|
@@ -189,7 +213,7 @@ class LazyServiceCatalogIndex:
|
|
|
189
213
|
for service_models in self._services.values():
|
|
190
214
|
for service_model in service_models:
|
|
191
215
|
result[service_model.signing_name].append(
|
|
192
|
-
|
|
216
|
+
get_service_model_identifier(service_model)
|
|
193
217
|
)
|
|
194
218
|
return dict(result)
|
|
195
219
|
|
|
@@ -201,11 +225,7 @@ class LazyServiceCatalogIndex:
|
|
|
201
225
|
operations = service_model.operation_names
|
|
202
226
|
if operations:
|
|
203
227
|
for operation in operations:
|
|
204
|
-
result[operation].append(
|
|
205
|
-
ServiceModelIdentifier(
|
|
206
|
-
service_model.service_name, service_model.protocol
|
|
207
|
-
)
|
|
208
|
-
)
|
|
228
|
+
result[operation].append(get_service_model_identifier(service_model))
|
|
209
229
|
return dict(result)
|
|
210
230
|
|
|
211
231
|
@cached_property
|
|
@@ -214,7 +234,7 @@ class LazyServiceCatalogIndex:
|
|
|
214
234
|
for service_models in self._services.values():
|
|
215
235
|
for service_model in service_models:
|
|
216
236
|
result[service_model.endpoint_prefix].append(
|
|
217
|
-
|
|
237
|
+
get_service_model_identifier(service_model)
|
|
218
238
|
)
|
|
219
239
|
return dict(result)
|
|
220
240
|
|
|
@@ -211,6 +211,9 @@ class RestApiAwsIntegration(RestApiIntegration):
|
|
|
211
211
|
action = parsed_uri["path"]
|
|
212
212
|
|
|
213
213
|
if target := self.get_action_service_target(service_name, action):
|
|
214
|
+
# TODO: properly implement the auto-`Content-Type` headers depending on the service protocol
|
|
215
|
+
# e.g. `x-amz-json-1.0` for DynamoDB
|
|
216
|
+
# this is needed to properly support multi-protocol
|
|
214
217
|
headers["X-Amz-Target"] = target
|
|
215
218
|
|
|
216
219
|
query_params["Action"] = action
|
localstack/version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '4.8.2.
|
|
32
|
-
__version_tuple__ = version_tuple = (4, 8, 2, '
|
|
31
|
+
__version__ = version = '4.8.2.dev12'
|
|
32
|
+
__version_tuple__ = version_tuple = (4, 8, 2, 'dev12')
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=78Sf99fgH3ckJ20a9SMqsu01r1cm5GgcomkuY4yDMDo,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=
|
|
7
|
+
localstack/version.py,sha256=rak1zdSWnASuIFwX9QBxTVDlKFdZPVjeRb0f4DBXyXI,719
|
|
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
|
|
@@ -17,11 +17,11 @@ localstack/aws/gateway.py,sha256=d_Tm0N2-mAnuvE4puXfRjgzMHwR3EuuOQH5IIWX-vAQ,903
|
|
|
17
17
|
localstack/aws/mocking.py,sha256=JZZ7ZyAmlCGzywTF8jH4IelPGIiLqyz_ltDtO046a3E,13683
|
|
18
18
|
localstack/aws/patches.py,sha256=r5EDhDE_OL25fQzT6oEhV7LvpBzTisOqxdn-JD_ZfrI,1883
|
|
19
19
|
localstack/aws/scaffold.py,sha256=9GLeSaWQdCWBpFJghj92tFuGZ2CaCNE9iqJ020vs8a0,20029
|
|
20
|
-
localstack/aws/skeleton.py,sha256=
|
|
20
|
+
localstack/aws/skeleton.py,sha256=N_siYCImRXn_ckr0f2oRFhdox6grAGXi5q02LOxgGDA,8241
|
|
21
21
|
localstack/aws/spec-patches.json,sha256=9zIgusH52V72SmOaRHTlWcu4aX5GEb2SzX1U9EL7SpU,42563
|
|
22
|
-
localstack/aws/spec.py,sha256=
|
|
22
|
+
localstack/aws/spec.py,sha256=EHioKRZyVuDMyP6iOf0O51Tyc2MTfD2eodhnJquhjno,14988
|
|
23
23
|
localstack/aws/api/__init__.py,sha256=JspwCauxfTTdLNVAr7AkQaPu1lELdBQ1miB9B9sndOo,297
|
|
24
|
-
localstack/aws/api/core.py,sha256=
|
|
24
|
+
localstack/aws/api/core.py,sha256=7qi_hFySJTnOSh1Kv-FCAp2JNpK5jP8sucoG-VTyH4k,6913
|
|
25
25
|
localstack/aws/api/acm/__init__.py,sha256=67OHJbngmz4nKaXm9grkLW_Rl4RLRCeOBffhh3u1z0k,19079
|
|
26
26
|
localstack/aws/api/apigateway/__init__.py,sha256=30pTFfEn2VzlJeTm78Rjrj4MYtkVdobS-1hoOnnTZ0I,79884
|
|
27
27
|
localstack/aws/api/cloudcontrol/__init__.py,sha256=rVF7U2eYowakBDklAocYNjDzLtLNZqGgK1IBfnh_cG0,11595
|
|
@@ -77,16 +77,16 @@ localstack/aws/handlers/proxy.py,sha256=SnLQ70IWxPrrN_rhTaNGUy79kiysWaF0qrOMNavA
|
|
|
77
77
|
localstack/aws/handlers/region.py,sha256=EV4QhpzJRYFrS6h5ntUAO9uwwsRv_RBbNpGOwR7XgCM,3550
|
|
78
78
|
localstack/aws/handlers/response.py,sha256=gc0jooGNt1Jtqn7cx-9Jw6CHDYBk6DcpCun3O3qfiPc,934
|
|
79
79
|
localstack/aws/handlers/routes.py,sha256=O4NfJy3_SACxdKGOt9hcQurGmlv7blOheKR9JBbOBDI,84
|
|
80
|
-
localstack/aws/handlers/service.py,sha256=
|
|
80
|
+
localstack/aws/handlers/service.py,sha256=jFNkVagbIPiDGSEH24U_KQo5i6ugkc82lk2Lh2sorlg,11909
|
|
81
81
|
localstack/aws/handlers/service_plugin.py,sha256=9dOZIkgeF7zKM-ThhetMgVEhbgdSrutStbNcaOAKlrE,3596
|
|
82
82
|
localstack/aws/handlers/tracing.py,sha256=y_BUJKjNgaRGebm88NSqni4GFCQ_ZgB2JBRnEt5V9z4,1407
|
|
83
83
|
localstack/aws/handlers/validation.py,sha256=4iyHdJx3ijd49rySwMQNx2UW0XNN5fnkFQxdUO7-AQM,4386
|
|
84
84
|
localstack/aws/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
85
85
|
localstack/aws/protocol/op_router.py,sha256=2nSpL6H9seK1h_AuIZlBG1yYa_ykARIgJJrKm4Hkc0s,12039
|
|
86
|
-
localstack/aws/protocol/parser.py,sha256=
|
|
86
|
+
localstack/aws/protocol/parser.py,sha256=e8uJsV9H_zQMQ6-cC0a85ojRnkI51mTeKImjhPF0tGA,70565
|
|
87
87
|
localstack/aws/protocol/routing.py,sha256=x9AFpMQsVHD7JadtLHR7zjfBw3AJBayITNAYiUtnlwQ,3217
|
|
88
|
-
localstack/aws/protocol/serializer.py,sha256=
|
|
89
|
-
localstack/aws/protocol/service_router.py,sha256=
|
|
88
|
+
localstack/aws/protocol/serializer.py,sha256=c4h3CrRrU6beLaV27YaAiVsT6yVlibGhXQ_Qb-4p2fI,103218
|
|
89
|
+
localstack/aws/protocol/service_router.py,sha256=M5iQ8XKUaPV65DyKewlVYHYNmu4k17Zn_p6_Jdj2Bw8,20705
|
|
90
90
|
localstack/aws/protocol/validate.py,sha256=j3HJAQEKS6V_arrmvlPmP2jbge3LutxwEXDNabDlDdY,5285
|
|
91
91
|
localstack/aws/serving/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
92
|
localstack/aws/serving/asgi.py,sha256=_6x0o8nn6d5ZmorSS6p00LyW6KldUaZw_8fJYPOFi1c,76
|
|
@@ -223,7 +223,7 @@ localstack/services/apigateway/next_gen/execute_api/handlers/parse.py,sha256=KOp
|
|
|
223
223
|
localstack/services/apigateway/next_gen/execute_api/handlers/resource_router.py,sha256=HY9VLQuFvYrpXhlURtGdbLHYQ20qjrYY_O-mxHeukBU,6503
|
|
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
|
|
226
|
-
localstack/services/apigateway/next_gen/execute_api/integrations/aws.py,sha256=
|
|
226
|
+
localstack/services/apigateway/next_gen/execute_api/integrations/aws.py,sha256=FpCxjUZStRRYHz5t6K0-deJUcZYiBPJwDZ88MB625AE,24482
|
|
227
227
|
localstack/services/apigateway/next_gen/execute_api/integrations/core.py,sha256=Kl0gzTT2LdboY5zw1aJdSLGOjZNMEUXq4wns_TgDh-A,572
|
|
228
228
|
localstack/services/apigateway/next_gen/execute_api/integrations/http.py,sha256=siakDGFWvmfidpuKonJCbTAdxlNBn6I7XkZAf0i0eE0,6381
|
|
229
229
|
localstack/services/apigateway/next_gen/execute_api/integrations/mock.py,sha256=rf00sXwDpRA683Zn0Z1WPgV1PpPVipEORDu2RmZ7g3Q,4238
|
|
@@ -763,7 +763,7 @@ localstack/services/sqs/constants.py,sha256=9MLAOW4-hcbZlP2qYMY3giUnubHD_mgoORT0
|
|
|
763
763
|
localstack/services/sqs/exceptions.py,sha256=aMmTD1Mex37NKndt6_hpj_d0JAZeN3eX0g7r8BlNO7M,570
|
|
764
764
|
localstack/services/sqs/models.py,sha256=sGaL5lZjw1_cUcvfGjXQAj2XjelOOJH0nuTS1KDoN4g,50536
|
|
765
765
|
localstack/services/sqs/provider.py,sha256=ZpJEdgdytatIRGnnok1_-xtL3nede5qZ6if3w0bdQs0,77491
|
|
766
|
-
localstack/services/sqs/query_api.py,sha256=
|
|
766
|
+
localstack/services/sqs/query_api.py,sha256=5elf1kDdWlUuH5FJzhs8vWdiB85fziYvFsbivuN5OQQ,8655
|
|
767
767
|
localstack/services/sqs/queue.py,sha256=Y5lVjrv71WTDU75VevTOKHSkfVzF1k_j1X0AOZ0-Xz4,1730
|
|
768
768
|
localstack/services/sqs/utils.py,sha256=_s_SC5pI6zZwOcf5PqyMoAPbSkCMi1kOoqF-F5-MgG4,6707
|
|
769
769
|
localstack/services/sqs/resource_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1294,13 +1294,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
|
|
|
1294
1294
|
localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1295
1295
|
localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
|
|
1296
1296
|
localstack/utils/xray/traceid.py,sha256=GKO-R2sMMjlrH2UaLPXlQlZ6flbE7ZKb6IZMtMu_M5U,1110
|
|
1297
|
-
localstack_core-4.8.2.
|
|
1298
|
-
localstack_core-4.8.2.
|
|
1299
|
-
localstack_core-4.8.2.
|
|
1300
|
-
localstack_core-4.8.2.
|
|
1301
|
-
localstack_core-4.8.2.
|
|
1302
|
-
localstack_core-4.8.2.
|
|
1303
|
-
localstack_core-4.8.2.
|
|
1304
|
-
localstack_core-4.8.2.
|
|
1305
|
-
localstack_core-4.8.2.
|
|
1306
|
-
localstack_core-4.8.2.
|
|
1297
|
+
localstack_core-4.8.2.dev12.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
|
|
1298
|
+
localstack_core-4.8.2.dev12.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
|
|
1299
|
+
localstack_core-4.8.2.dev12.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
|
|
1300
|
+
localstack_core-4.8.2.dev12.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
|
|
1301
|
+
localstack_core-4.8.2.dev12.dist-info/METADATA,sha256=PG60xwdb2AfbFLOBbI0eGxNzROHRZ-vIc_fx7IMtmEI,5538
|
|
1302
|
+
localstack_core-4.8.2.dev12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1303
|
+
localstack_core-4.8.2.dev12.dist-info/entry_points.txt,sha256=5IoyjalZoY-PWY5Lk_AeEjEEQ-rKQJhijLe697GVlnM,20953
|
|
1304
|
+
localstack_core-4.8.2.dev12.dist-info/plux.json,sha256=YiWX0dyrOKc6MFSNN-AWVVesoLjDAD077CgR4jHJi7I,21181
|
|
1305
|
+
localstack_core-4.8.2.dev12.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
|
|
1306
|
+
localstack_core-4.8.2.dev12.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"localstack.cloudformation.resource_providers": ["AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "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::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "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::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "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::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin"], "localstack.hooks.on_infra_start": ["_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "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", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "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", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "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", "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", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.on_infra_shutdown": ["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", "stop_server=localstack.dns.plugins:stop_server", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics"], "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:engine-legacy=localstack.services.providers:cloudformation", "cloudformation:default=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", "sns:v2=localstack.services.providers:sns_v2", "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.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "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", "publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment"], "localstack.utils.catalog": ["aws-catalog-remote-state=localstack.utils.catalog.catalog:AwsCatalogRemoteStatePlugin", "aws-catalog-runtime-only=localstack.utils.catalog.catalog:AwsCatalogRuntimePlugin"], "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.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"localstack.hooks.on_infra_start": ["conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "eager_load_services=localstack.services.plugins:eager_load_services", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "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", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "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_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings"], "localstack.packages": ["lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package"], "localstack.hooks.on_infra_shutdown": ["remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "publish_metrics=localstack.utils.analytics.metrics.publisher: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", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.cloudformation.resource_providers": ["AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "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::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "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::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin"], "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.utils.catalog": ["aws-catalog-remote-state=localstack.utils.catalog.catalog:AwsCatalogRemoteStatePlugin", "aws-catalog-runtime-only=localstack.utils.catalog.catalog:AwsCatalogRuntimePlugin"], "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:engine-legacy=localstack.services.providers:cloudformation", "cloudformation:default=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", "sns:v2=localstack.services.providers:sns_v2", "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.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.hooks.on_infra_ready": ["publish_provider_assignment=localstack.utils.analytics.service_providers:publish_provider_assignment", "_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"]}
|
|
File without changes
|
{localstack_core-4.8.2.dev11.data → localstack_core-4.8.2.dev12.data}/scripts/localstack-supervisor
RENAMED
|
File without changes
|
{localstack_core-4.8.2.dev11.data → localstack_core-4.8.2.dev12.data}/scripts/localstack.bat
RENAMED
|
File without changes
|
|
File without changes
|
{localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|
{localstack_core-4.8.2.dev11.dist-info → localstack_core-4.8.2.dev12.dist-info}/top_level.txt
RENAMED
|
File without changes
|