localstack-core 4.8.2.dev3__py3-none-any.whl → 4.8.2.dev4__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.

@@ -19,19 +19,18 @@ The class hierarchy looks as follows:
19
19
  │RequestParser│
20
20
  └─────────────┘
21
21
  ▲ ▲ ▲
22
- ┌─────────────────┘ │ └────────────────────┬───────────────────────┐
23
- ┌────────┴─────────┐ ┌─────────┴───────────┐ ┌──────────┴──────────┐ ┌──────────┴──────────┐
24
- │QueryRequestParser│ │BaseRestRequestParser│ │BaseJSONRequestParser│ │BaseCBORRequestParser│
25
- └──────────────────┘ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘
26
- ▲ ▲ ▲ ▲ ▲ ▲
27
- ┌───────┴────────┐ ┌─────────┴──────────┐ │ │ ┌────────┴────────┐ │
28
- │EC2RequestParser│ │RestXMLRequestParser│ │ │ │JSONRequestParser│ │
29
- └────────────────┘ └────────────────────┘ │ │ └─────────────────┘ │
22
+ ┌─────────────────┘ │ └────────────────────┬───────────────────────┬───────────────────────┐
23
+ ┌────────┴─────────┐ ┌─────────┴───────────┐ ┌──────────┴──────────┐ ┌──────────┴──────────┐ ┌──────────┴───────────┐
24
+ │QueryRequestParser│ │BaseRestRequestParser│ │BaseJSONRequestParser│ │BaseCBORRequestParser│ │BaseRpcV2RequestParser│
25
+ └──────────────────┘ └─────────────────────┘ └─────────────────────┘ └─────────────────────┘ └──────────────────────┘
26
+ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲
27
+ ┌───────┴────────┐ ┌─────────┴──────────┐ │ │ ┌────────┴────────┐ │ ┌───┴─────────────┴────┐
28
+ │EC2RequestParser│ │RestXMLRequestParser│ │ │ │JSONRequestParser│ │ │RpcV2CBORRequestParser│
29
+ └────────────────┘ └────────────────────┘ │ │ └─────────────────┘ │ └──────────────────────┘
30
30
  ┌────────────────┴───┴┐ ▲ │
31
31
  │RestJSONRequestParser│ ┌───┴──────┴──────┐
32
32
  └─────────────────────┘ │CBORRequestParser│
33
33
  └─────────────────┘
34
-
35
34
  ::
36
35
 
37
36
  The ``RequestParser`` contains the logic that is used among all the
@@ -46,6 +45,8 @@ The classes are structured as follows:
46
45
  which is shared among all different protocols.
47
46
  * The ``BaseRestRequestParser`` contains the logic for the REST
48
47
  protocol specifics (i.e. specific HTTP metadata parsing).
48
+ * The ``BaseRpcV2RequestParser`` contains the logic for the RPC v2
49
+ protocol specifics (special path routing, no logic about body decoding)
49
50
  * The ``BaseJSONRequestParser`` contains the logic for the JSON body
50
51
  parsing.
51
52
  * The ``BaseCBORRequestParser`` contains the logic for the CBOR body
@@ -56,8 +57,9 @@ The classes are structured as follows:
56
57
  * The ``CBORRequestParser`` inherits the ``json``-protocol specific
57
58
  logic from the ``JSONRequestParser`` and the CBOR body parsing
58
59
  from the ``BaseCBORRequestParser``.
59
- * The ``QueryRequestParser``, ``RestXMLRequestParser`` and
60
- ``JSONRequestParser`` have a conventional inheritance structure.
60
+ * The ``QueryRequestParser``, ``RestXMLRequestParser``,
61
+ ``RpcV2CBORRequestParser`` and ``JSONRequestParser`` have a
62
+ conventional inheritance structure.
61
63
 
62
64
  The services and their protocols are defined by using AWS's Smithy
63
65
  (a language to define services in a - somewhat - protocol-agnostic
@@ -99,6 +101,7 @@ from cbor2._decoder import loads as cbor2_loads
99
101
  from werkzeug.exceptions import BadRequest, NotFound
100
102
 
101
103
  from localstack.aws.protocol.op_router import RestServiceOperationRouter
104
+ from localstack.aws.spec import ProtocolName
102
105
  from localstack.http import Request
103
106
 
104
107
 
@@ -1200,7 +1203,7 @@ class CBORRequestParser(BaseCBORRequestParser, JSONRequestParser):
1200
1203
  it for now.
1201
1204
  """
1202
1205
 
1203
- # timestamp format is different from traditional CBOR
1206
+ # timestamp format is different from traditional CBOR, and is encoded as a milliseconds integer
1204
1207
  TIMESTAMP_FORMAT = "unixtimestampmillis"
1205
1208
 
1206
1209
  def _do_parse(
@@ -1244,6 +1247,132 @@ class CBORRequestParser(BaseCBORRequestParser, JSONRequestParser):
1244
1247
  return super()._parse_timestamp(request, shape, node, uri_params)
1245
1248
 
1246
1249
 
1250
+ class BaseRpcV2RequestParser(RequestParser):
1251
+ """
1252
+ The ``BaseRpcV2RequestParser`` is the base class for all RPC V2-based AWS service protocols.
1253
+ This base class handles the routing of the request, which is specific based on the path.
1254
+ The body decoding is done in the respective subclasses.
1255
+ """
1256
+
1257
+ @_handle_exceptions
1258
+ def parse(self, request: Request) -> tuple[OperationModel, Any]:
1259
+ # see https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html
1260
+ if request.method != "POST":
1261
+ raise ProtocolParserError("RPC v2 only accepts POST requests.")
1262
+
1263
+ headers = request.headers
1264
+ if "X-Amz-Target" in headers or "X-Amzn-Target" in headers:
1265
+ raise ProtocolParserError(
1266
+ "RPC v2 does not accept 'X-Amz-Target' or 'X-Amzn-Target'. "
1267
+ "Such requests are rejected for security reasons."
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
+ # The Smithy RPCv2 CBOR protocol will only use the last four segments of the URL when routing requests.
1272
+ rpc_v2_params = request.path.lstrip("/").split("/")
1273
+ if len(rpc_v2_params) < 4 or not (
1274
+ operation := self.service.operation_model(rpc_v2_params[-1])
1275
+ ):
1276
+ raise OperationNotFoundParserError(
1277
+ f"Unable to find operation for request to service "
1278
+ f"{self.service.service_name}: {request.method} {request.path}"
1279
+ )
1280
+
1281
+ # there are no URI params in RPC v2
1282
+ uri_params = {}
1283
+ shape: StructureShape = operation.input_shape
1284
+ final_parsed = self._do_parse(request, shape, uri_params)
1285
+ return operation, final_parsed
1286
+
1287
+ @_handle_exceptions
1288
+ def _do_parse(
1289
+ self, request: Request, shape: Shape, uri_params: Mapping[str, Any] = None
1290
+ ) -> dict[str, Any]:
1291
+ parsed = {}
1292
+ if shape is not None:
1293
+ event_stream_name = shape.event_stream_name
1294
+ if event_stream_name:
1295
+ parsed = self._handle_event_stream(request, shape, event_stream_name)
1296
+ else:
1297
+ parsed = {}
1298
+ self._parse_payload(request, shape, parsed, uri_params)
1299
+
1300
+ return parsed
1301
+
1302
+ def _handle_event_stream(self, request: Request, shape: Shape, event_name: str):
1303
+ # TODO handle event streams
1304
+ raise NotImplementedError
1305
+
1306
+ def _parse_structure(
1307
+ self,
1308
+ request: Request,
1309
+ shape: StructureShape,
1310
+ node: dict | None,
1311
+ uri_params: Mapping[str, Any] = None,
1312
+ ):
1313
+ if shape.is_document_type:
1314
+ final_parsed = node
1315
+ else:
1316
+ if node is None:
1317
+ # If the comes across the wire as "null" (None in python),
1318
+ # we should be returning this unchanged, instead of as an
1319
+ # empty dict.
1320
+ return None
1321
+ final_parsed = {}
1322
+ members = shape.members
1323
+ if shape.is_tagged_union:
1324
+ cleaned_value = node.copy()
1325
+ cleaned_value.pop("__type", None)
1326
+ cleaned_value = {k: v for k, v in cleaned_value.items() if v is not None}
1327
+ if len(cleaned_value) != 1:
1328
+ raise ProtocolParserError(
1329
+ f"Invalid service response: {shape.name} must have one and only one member set."
1330
+ )
1331
+
1332
+ for member_name, member_shape in members.items():
1333
+ member_value = node.get(member_name)
1334
+ if member_value is not None:
1335
+ final_parsed[member_name] = self._parse_shape(
1336
+ request, member_shape, member_value, uri_params
1337
+ )
1338
+
1339
+ return final_parsed
1340
+
1341
+ def _parse_payload(
1342
+ self,
1343
+ request: Request,
1344
+ shape: Shape,
1345
+ final_parsed: dict,
1346
+ uri_params: Mapping[str, Any] = None,
1347
+ ) -> None:
1348
+ original_parsed = self._initial_body_parse(request)
1349
+ body_parsed = self._parse_shape(request, shape, original_parsed, uri_params)
1350
+ final_parsed.update(body_parsed)
1351
+
1352
+ def _initial_body_parse(self, request: Request):
1353
+ # This method should do the initial parsing of the
1354
+ # body. We still need to walk the parsed body in order
1355
+ # to convert types, but this method will do the first round
1356
+ # of parsing.
1357
+ raise NotImplementedError("_initial_body_parse")
1358
+
1359
+
1360
+ class RpcV2CBORRequestParser(BaseRpcV2RequestParser, BaseCBORRequestParser):
1361
+ """
1362
+ The ``RpcV2CBORRequestParser`` is responsible for parsing incoming requests for services which use the
1363
+ ``rpc-v2-cbor`` protocol. The requests for these services encode all of their parameters as CBOR in the
1364
+ request body.
1365
+ """
1366
+
1367
+ # TODO: investigate datetime format for RpcV2CBOR protocol, which might be different than Kinesis CBOR
1368
+ def _initial_body_parse(self, request: Request):
1369
+ body_contents = request.data
1370
+ if body_contents == b"":
1371
+ return body_contents
1372
+ body_contents_stream = self.get_peekable_stream_from_bytes(body_contents)
1373
+ return self.parse_data_item(body_contents_stream)
1374
+
1375
+
1247
1376
  class EC2RequestParser(QueryRequestParser):
1248
1377
  """
1249
1378
  The ``EC2RequestParser`` is responsible for parsing incoming requests for services which use the ``ec2``
@@ -1422,11 +1551,12 @@ class SQSQueryRequestParser(QueryRequestParser):
1422
1551
 
1423
1552
 
1424
1553
  @functools.cache
1425
- def create_parser(service: ServiceModel) -> RequestParser:
1554
+ def create_parser(service: ServiceModel, protocol: ProtocolName | None = None) -> RequestParser:
1426
1555
  """
1427
1556
  Creates the right parser for the given service model.
1428
1557
 
1429
1558
  :param service: to create the parser for
1559
+ :param protocol: the protocol for the parser. If not provided, fallback to the service's default protocol
1430
1560
  :return: RequestParser which can handle the protocol of the service
1431
1561
  """
1432
1562
  # Unfortunately, some services show subtle differences in their parsing or operation detection behavior, even though
@@ -1444,17 +1574,22 @@ def create_parser(service: ServiceModel) -> RequestParser:
1444
1574
  "rest-json": RestJSONRequestParser,
1445
1575
  "rest-xml": RestXMLRequestParser,
1446
1576
  "ec2": EC2RequestParser,
1577
+ "smithy-rpc-v2-cbor": RpcV2CBORRequestParser,
1447
1578
  # TODO: implement multi-protocol support for Kinesis, so that it can uses the `cbor` protocol and remove
1448
1579
  # CBOR handling from JSONRequestParser
1449
1580
  # this is not an "official" protocol defined from the spec, but is derived from ``json``
1450
1581
  }
1451
1582
 
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
+ service_protocol = protocol or service.protocol
1586
+
1452
1587
  # Try to select a service- and protocol-specific parser implementation
1453
1588
  if (
1454
1589
  service.service_name in service_specific_parsers
1455
- and service.protocol in service_specific_parsers[service.service_name]
1590
+ and service_protocol in service_specific_parsers[service.service_name]
1456
1591
  ):
1457
- return service_specific_parsers[service.service_name][service.protocol](service)
1592
+ return service_specific_parsers[service.service_name][service_protocol](service)
1458
1593
  else:
1459
1594
  # Otherwise, pick the protocol-specific parser for the protocol of the service
1460
- return protocol_specific_parsers[service.protocol](service)
1595
+ return protocol_specific_parsers[service_protocol](service)
@@ -14,21 +14,27 @@ The different protocols have many similarities. The class hierarchy is
14
14
  designed such that the serializers share as much logic as possible.
15
15
  The class hierarchy looks as follows:
16
16
  ::
17
- ┌────────────────────┐
18
- │ ResponseSerializer │
19
- └────────────────────┘
20
-
21
- │ │ └─────────────────────────────────────────────┐
22
- ┌───────────────────────┘ └─────────────────────┐
23
- ┌────────────┴────────────┐ ┌────────────┴─────────────┐ ┌─────────┴────────────┐ ┌────────────┴─────────────┐
24
- BaseXMLResponseSerializer │BaseRestResponseSerializer│ │JSONResponseSerializer│ │BaseCBORResponseSerializer│
25
- └─────────────────────────┘ └──────────────────────────┘ └──────────────────────┘ └──────────────────────────┘
26
- ▲ ▲ ▲ ▲ ▲
27
- ┌──────────────────────┴─┐ ┌┴─────────────┴──────────┐ ┌┴──────────────┴──────────┐ ┌───────────┴────────────┐
28
- QueryResponseSerializer RestXMLResponseSerializer RestJSONResponseSerializer│ │ CBORResponseSerializer │
29
- └────────────────────────┘ └─────────────────────────┘ └──────────────────────────┘ └────────────────────────┘
30
-
31
- ┌──────────┴──────────┐
17
+ ┌────────────────────┐
18
+ │ ResponseSerializer │
19
+ └────────────────────┘
20
+
21
+ ┌─────────────────┬───────┘ └──────────────┬──────────────────────┐
22
+ ┌────────────┴────────────┐ ┌───────┴──────────────┐ ┌────────────┴─────────────┐
23
+ │BaseXMLResponseSerializer│ │ │JSONResponseSerializer│ │ │BaseCBORResponseSerializer│
24
+ └─────────────────────────┘ └──────────────────────┘ └──────────────────────────┘
25
+ ▲ ┌─────────────┴────────────┐ ▲ ┌─────┴─────────────────────┐ ▲ ▲
26
+ │ │BaseRestResponseSerializer│ │ │BaseRpcV2ResponseSerializer│ │ │
27
+ │ │ └──────────────────────────┘ │ └───────────────────────────┘ │ │
28
+ ▲ ▲
29
+ │ │ │ │ │ │ │ │
30
+ │ ┌─┴──────────────┴────────┐ ┌──┴───────────┴───────────┐ ┌──────────┴───────────┴────┐ │
31
+ │ │RestXMLResponseSerializer│ │RestJSONResponseSerializer│ │RpcV2CBORResponseSerializer│ │
32
+ │ └─────────────────────────┘ └──────────────────────────┘ └───────────────────────────┘ │
33
+ ┌─────┴──────────────────┐ ┌──────────┴─────────────┐
34
+ │QueryResponseSerializer │ │ CBORResponseSerializer │
35
+ └────────────────────────┘ └────────────────────────┘
36
+
37
+ ┌─────────┴───────────┐
32
38
  │EC2ResponseSerializer│
33
39
  └─────────────────────┘
34
40
  ::
@@ -49,6 +55,8 @@ The protocols relate to each other in the following ways:
49
55
  the HTTP response's header fields.
50
56
  * The ``ec2`` protocol is basically similar to the ``query`` protocol with a
51
57
  specific error response formatting.
58
+ * The ``smithy-rpc-v2-cbor`` protocol defines a specific way to route request
59
+ to services via the RPC v2 trait, and encodes its body with the CBOR format.
52
60
 
53
61
  The serializer classes in this module correspond directly to the different
54
62
  protocols. ``#create_serializer`` shows the explicit mapping between the
@@ -62,9 +70,15 @@ The classes are structured as follows:
62
70
  and the CBOR serialization respectively.
63
71
  * The ``BaseRestResponseSerializer`` contains the logic for the REST
64
72
  protocol specifics (i.e. specific HTTP header serializations).
73
+ * The ``BaseRpcV2ResponseSerializer`` contains the logic for the RPC v2
74
+ protocol specifics (i.e. pretty bare, does not has any specific
75
+ about body serialization).
65
76
  * The ``RestXMLResponseSerializer`` and the ``RestJSONResponseSerializer``
66
77
  inherit the ReST specific logic from the ``BaseRestResponseSerializer``
67
78
  and the XML / JSON body serialization from their second super class.
79
+ * The ``RpcV2CBORResponseSerializer`` inherits the RPC v2 specific logic
80
+ from the ``BaseRpcV2ResponseSerializer`` and the CBOR body serialization
81
+ from its second super class.
68
82
  * The ``CBORResponseSerializer`` contains the logic specific to the
69
83
  non-official ``cbor`` protocol, mirroring the ``json`` protocol but
70
84
  with CBOR encoded body
@@ -81,6 +95,7 @@ be sent back to the calling client.
81
95
  import abc
82
96
  import base64
83
97
  import copy
98
+ import datetime
84
99
  import functools
85
100
  import json
86
101
  import logging
@@ -90,7 +105,6 @@ import struct
90
105
  from abc import ABC
91
106
  from binascii import crc32
92
107
  from collections.abc import Iterable, Iterator
93
- from datetime import datetime
94
108
  from email.utils import formatdate
95
109
  from struct import pack
96
110
  from typing import IO, Any
@@ -524,7 +538,7 @@ class ResponseSerializer(abc.ABC):
524
538
  # Some extra utility methods subclasses can use.
525
539
 
526
540
  @staticmethod
527
- def _timestamp_iso8601(value: datetime) -> str:
541
+ def _timestamp_iso8601(value: datetime.datetime) -> str:
528
542
  if value.microsecond > 0:
529
543
  timestamp_format = ISO8601_MICRO
530
544
  else:
@@ -532,15 +546,17 @@ class ResponseSerializer(abc.ABC):
532
546
  return value.strftime(timestamp_format)
533
547
 
534
548
  @staticmethod
535
- def _timestamp_unixtimestamp(value: datetime) -> float:
549
+ def _timestamp_unixtimestamp(value: datetime.datetime) -> float:
536
550
  return value.timestamp()
537
551
 
538
- def _timestamp_rfc822(self, value: datetime) -> str:
539
- if isinstance(value, datetime):
552
+ def _timestamp_rfc822(self, value: datetime.datetime) -> str:
553
+ if isinstance(value, datetime.datetime):
540
554
  value = self._timestamp_unixtimestamp(value)
541
555
  return formatdate(value, usegmt=True)
542
556
 
543
- def _convert_timestamp_to_str(self, value: int | str | datetime, timestamp_format=None) -> str:
557
+ def _convert_timestamp_to_str(
558
+ self, value: int | str | datetime.datetime, timestamp_format=None
559
+ ) -> str:
544
560
  if timestamp_format is None:
545
561
  timestamp_format = self.TIMESTAMP_FORMAT
546
562
  timestamp_format = timestamp_format.lower()
@@ -1426,6 +1442,20 @@ class RestJSONResponseSerializer(BaseRestResponseSerializer, JSONResponseSeriali
1426
1442
 
1427
1443
 
1428
1444
  class BaseCBORResponseSerializer(ResponseSerializer):
1445
+ """
1446
+ The ``BaseCBORResponseSerializer`` performs the basic logic for the CBOR response serialization.
1447
+
1448
+ There are two types of map/list in CBOR, indefinite length types and "defined" ones:
1449
+ You can use the `\xbf` byte marker to indicate a map with indefinite length, then `\xff` to indicate the end
1450
+ of the map.
1451
+ You can also use, for example, `\xa4` to indicate a map with exactly 4 things in it, so `\xff` is not
1452
+ required at the end.
1453
+ AWS, for both Kinesis and `smithy-rpc-v2-cbor` services, is using indefinite data structures when returning
1454
+ responses.
1455
+ """
1456
+
1457
+ SUPPORTED_MIME_TYPES = [APPLICATION_CBOR, APPLICATION_AMZ_CBOR_1_1]
1458
+
1429
1459
  UNSIGNED_INT_MAJOR_TYPE = 0
1430
1460
  NEGATIVE_INT_MAJOR_TYPE = 1
1431
1461
  BLOB_MAJOR_TYPE = 2
@@ -1435,6 +1465,10 @@ class BaseCBORResponseSerializer(ResponseSerializer):
1435
1465
  TAG_MAJOR_TYPE = 6
1436
1466
  FLOAT_AND_SIMPLE_MAJOR_TYPE = 7
1437
1467
 
1468
+ INDEFINITE_ITEM_ADDITIONAL_INFO = 31
1469
+ BREAK_CODE = b"\xff"
1470
+ USE_INDEFINITE_DATA_STRUCTURE = True
1471
+
1438
1472
  def _serialize_data_item(
1439
1473
  self, serialized: bytearray, value: Any, shape: Shape | None, name: str | None = None
1440
1474
  ) -> None:
@@ -1503,32 +1537,34 @@ class BaseCBORResponseSerializer(ResponseSerializer):
1503
1537
  serialized.extend(initial_byte + length.to_bytes(num_bytes, "big") + encoded)
1504
1538
 
1505
1539
  def _serialize_type_list(
1506
- self, serialized: bytearray, value: str, shape: Shape | None, name: str | None = None
1540
+ self, serialized: bytearray, value: list, shape: Shape | None, name: str | None = None
1507
1541
  ) -> None:
1508
- length = len(value)
1509
- additional_info, num_bytes = self._get_additional_info_and_num_bytes(length)
1510
- initial_byte = self._get_initial_byte(self.LIST_MAJOR_TYPE, additional_info)
1511
- if num_bytes == 0:
1512
- serialized.extend(initial_byte)
1513
- else:
1514
- serialized.extend(initial_byte + length.to_bytes(num_bytes, "big"))
1542
+ initial_bytes, closing_bytes = self._get_bytes_for_data_structure(
1543
+ value, self.LIST_MAJOR_TYPE
1544
+ )
1545
+ serialized.extend(initial_bytes)
1546
+
1515
1547
  for item in value:
1516
1548
  self._serialize_data_item(serialized, item, shape.member)
1517
1549
 
1550
+ if closing_bytes is not None:
1551
+ serialized.extend(closing_bytes)
1552
+
1518
1553
  def _serialize_type_map(
1519
1554
  self, serialized: bytearray, value: dict, shape: Shape | None, name: str | None = None
1520
1555
  ) -> None:
1521
- length = len(value)
1522
- additional_info, num_bytes = self._get_additional_info_and_num_bytes(length)
1523
- initial_byte = self._get_initial_byte(self.MAP_MAJOR_TYPE, additional_info)
1524
- if num_bytes == 0:
1525
- serialized.extend(initial_byte)
1526
- else:
1527
- serialized.extend(initial_byte + length.to_bytes(num_bytes, "big"))
1556
+ initial_bytes, closing_bytes = self._get_bytes_for_data_structure(
1557
+ value, self.MAP_MAJOR_TYPE
1558
+ )
1559
+ serialized.extend(initial_bytes)
1560
+
1528
1561
  for key_item, item in value.items():
1529
1562
  self._serialize_data_item(serialized, key_item, shape.key)
1530
1563
  self._serialize_data_item(serialized, item, shape.value)
1531
1564
 
1565
+ if closing_bytes is not None:
1566
+ serialized.extend(closing_bytes)
1567
+
1532
1568
  def _serialize_type_structure(
1533
1569
  self, serialized: bytearray, value: dict, shape: Shape | None, name: str | None = None
1534
1570
  ) -> None:
@@ -1539,13 +1575,10 @@ class BaseCBORResponseSerializer(ResponseSerializer):
1539
1575
  # Remove `None` values from the dictionary
1540
1576
  value = {k: v for k, v in value.items() if v is not None}
1541
1577
 
1542
- map_length = len(value)
1543
- additional_info, num_bytes = self._get_additional_info_and_num_bytes(map_length)
1544
- initial_byte = self._get_initial_byte(self.MAP_MAJOR_TYPE, additional_info)
1545
- if num_bytes == 0:
1546
- serialized.extend(initial_byte)
1547
- else:
1548
- serialized.extend(initial_byte + map_length.to_bytes(num_bytes, "big"))
1578
+ initial_bytes, closing_bytes = self._get_bytes_for_data_structure(
1579
+ value, self.MAP_MAJOR_TYPE
1580
+ )
1581
+ serialized.extend(initial_bytes)
1549
1582
 
1550
1583
  members = shape.members
1551
1584
  for member_key, member_value in value.items():
@@ -1556,25 +1589,29 @@ class BaseCBORResponseSerializer(ResponseSerializer):
1556
1589
  self._serialize_type_string(serialized, member_key, None, None)
1557
1590
  self._serialize_data_item(serialized, member_value, member_shape)
1558
1591
 
1592
+ if closing_bytes is not None:
1593
+ serialized.extend(closing_bytes)
1594
+
1559
1595
  def _serialize_type_timestamp(
1560
1596
  self,
1561
1597
  serialized: bytearray,
1562
- value: int | str | datetime,
1598
+ value: int | str | datetime.datetime,
1563
1599
  shape: Shape | None,
1564
1600
  name: str | None = None,
1565
1601
  ) -> None:
1566
- timestamp = int(self._convert_timestamp_to_str(value))
1602
+ # https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#timestamp-type-serialization
1567
1603
  tag = 1 # Use tag 1 for unix timestamp
1568
1604
  initial_byte = self._get_initial_byte(self.TAG_MAJOR_TYPE, tag)
1569
1605
  serialized.extend(initial_byte) # Tagging the timestamp
1570
- additional_info, num_bytes = self._get_additional_info_and_num_bytes(timestamp)
1571
1606
 
1572
- if num_bytes == 0:
1573
- initial_byte = self._get_initial_byte(self.UNSIGNED_INT_MAJOR_TYPE, timestamp)
1574
- serialized.extend(initial_byte)
1575
- else:
1576
- initial_byte = self._get_initial_byte(self.UNSIGNED_INT_MAJOR_TYPE, additional_info)
1577
- serialized.extend(initial_byte + timestamp.to_bytes(num_bytes, "big"))
1607
+ # we encode the timestamp as a double, like the Go SDK
1608
+ # https://github.com/aws/aws-sdk-go-v2/blob/5d7c17325a2581afae4455c150549174ebfd9428/internal/protocoltest/smithyrpcv2cbor/serializers.go#L664-L669
1609
+ # Currently, the Botocore serializer using unsigned integers, but it does not conform to the Smithy specs:
1610
+ # > This protocol uses epoch-seconds, also known as Unix timestamps, with millisecond
1611
+ # > (1/1000th of a second) resolution.
1612
+ timestamp = float(self._convert_timestamp_to_str(value))
1613
+ initial_byte = self._get_initial_byte(self.FLOAT_AND_SIMPLE_MAJOR_TYPE, 27)
1614
+ serialized.extend(initial_byte + struct.pack(">d", timestamp))
1578
1615
 
1579
1616
  def _serialize_type_float(
1580
1617
  self, serialized: bytearray, value: float, shape: Shape | None, name: str | None = None
@@ -1653,6 +1690,21 @@ class BaseCBORResponseSerializer(ResponseSerializer):
1653
1690
  elif math.isnan(value):
1654
1691
  return initial_byte + struct.pack(">H", 0x7E00)
1655
1692
 
1693
+ def _get_bytes_for_data_structure(
1694
+ self, value: list | dict, major_type: int
1695
+ ) -> tuple[bytes, bytes | None]:
1696
+ if self.USE_INDEFINITE_DATA_STRUCTURE:
1697
+ additional_info = self.INDEFINITE_ITEM_ADDITIONAL_INFO
1698
+ return self._get_initial_byte(major_type, additional_info), self.BREAK_CODE
1699
+ else:
1700
+ length = len(value)
1701
+ additional_info, num_bytes = self._get_additional_info_and_num_bytes(length)
1702
+ initial_byte = self._get_initial_byte(major_type, additional_info)
1703
+ if num_bytes != 0:
1704
+ initial_byte = initial_byte + length.to_bytes(num_bytes, "big")
1705
+
1706
+ return initial_byte, None
1707
+
1656
1708
 
1657
1709
  class CBORResponseSerializer(BaseCBORResponseSerializer):
1658
1710
  """
@@ -1661,8 +1713,6 @@ class CBORResponseSerializer(BaseCBORResponseSerializer):
1661
1713
  conceptually from the ``JSONResponseSerializer``
1662
1714
  """
1663
1715
 
1664
- SUPPORTED_MIME_TYPES = [APPLICATION_CBOR, APPLICATION_AMZ_CBOR_1_1]
1665
-
1666
1716
  TIMESTAMP_FORMAT = "unixtimestamp"
1667
1717
 
1668
1718
  def _serialize_error(
@@ -1737,6 +1787,113 @@ class CBORResponseSerializer(BaseCBORResponseSerializer):
1737
1787
  return response
1738
1788
 
1739
1789
 
1790
+ class BaseRpcV2ResponseSerializer(ResponseSerializer):
1791
+ """
1792
+ The BaseRpcV2ResponseSerializer performs the basic logic for the RPC V2 response serialization.
1793
+ The only variance between the various RPCv2 protocols is the way the body is serialized for regular responses,
1794
+ and the way they will encode exceptions.
1795
+ """
1796
+
1797
+ def _serialize_response(
1798
+ self,
1799
+ parameters: dict,
1800
+ response: Response,
1801
+ shape: Shape | None,
1802
+ shape_members: dict,
1803
+ operation_model: OperationModel,
1804
+ mime_type: str,
1805
+ request_id: str,
1806
+ ) -> None:
1807
+ response.content_type = mime_type
1808
+ response.set_response(
1809
+ self._serialize_body_params(parameters, shape, operation_model, mime_type, request_id)
1810
+ )
1811
+
1812
+ def _serialize_body_params(
1813
+ self,
1814
+ params: dict,
1815
+ shape: Shape,
1816
+ operation_model: OperationModel,
1817
+ mime_type: str,
1818
+ request_id: str,
1819
+ ) -> bytes | None:
1820
+ raise NotImplementedError
1821
+
1822
+
1823
+ class RpcV2CBORResponseSerializer(BaseRpcV2ResponseSerializer, BaseCBORResponseSerializer):
1824
+ """
1825
+ The RpcV2CBORResponseSerializer implements the CBOR body serialization part for the RPC v2 protocol, and implements the
1826
+ specific exception serialization.
1827
+ https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html
1828
+ """
1829
+
1830
+ # the Smithy spec defines that only `application/cbor` is supported for RPC v2 CBOR
1831
+ SUPPORTED_MIME_TYPES = [APPLICATION_CBOR]
1832
+ TIMESTAMP_FORMAT = "unixtimestamp"
1833
+
1834
+ def _serialize_body_params(
1835
+ self,
1836
+ params: dict,
1837
+ shape: Shape,
1838
+ operation_model: OperationModel,
1839
+ mime_type: str,
1840
+ request_id: str,
1841
+ ) -> bytes | None:
1842
+ body = bytearray()
1843
+ self._serialize_data_item(body, params, shape)
1844
+ return bytes(body)
1845
+
1846
+ def _serialize_error(
1847
+ self,
1848
+ error: ServiceException,
1849
+ response: Response,
1850
+ shape: StructureShape,
1851
+ operation_model: OperationModel,
1852
+ mime_type: str,
1853
+ request_id: str,
1854
+ ) -> None:
1855
+ body = bytearray()
1856
+ response.content_type = mime_type # can only be 'application/cbor'
1857
+ # TODO: the Botocore parser is able to look at the `x-amzn-query-error` header for the RpcV2 CBOR protocol
1858
+ # we'll need to investigate which services need it
1859
+ # Responses for the rpcv2Cbor protocol SHOULD NOT contain the X-Amzn-ErrorType header.
1860
+ # Type information is always serialized in the payload. This is different than `json` protocol
1861
+
1862
+ if shape:
1863
+ # FIXME: we need to manually add the `__type` field to the shape as it is not part of the specs
1864
+ # think about a better way, this is very hacky
1865
+ # Error responses in the rpcv2Cbor protocol MUST be serialized identically to standard responses with one
1866
+ # additional component to distinguish which error is contained: a body field named __type.
1867
+ shape_copy = copy.deepcopy(shape)
1868
+ shape_copy.members["__type"] = StringShape(
1869
+ shape_name="__type", shape_model={"type": "string"}
1870
+ )
1871
+ remaining_params = {"__type": error.code}
1872
+
1873
+ for member_name in shape_copy.members:
1874
+ if hasattr(error, member_name):
1875
+ remaining_params[member_name] = getattr(error, member_name)
1876
+ # Default error message fields can sometimes have different casing in the specs
1877
+ elif member_name.lower() in ["code", "message"] and hasattr(
1878
+ error, member_name.lower()
1879
+ ):
1880
+ remaining_params[member_name] = getattr(error, member_name.lower())
1881
+
1882
+ self._serialize_data_item(body, remaining_params, shape_copy, None)
1883
+
1884
+ response.set_response(bytes(body))
1885
+
1886
+ def _prepare_additional_traits_in_response(
1887
+ self, response: Response, operation_model: OperationModel, request_id: str
1888
+ ):
1889
+ response.headers["x-amzn-requestid"] = request_id
1890
+ response.headers["Smithy-Protocol"] = "rpc-v2-cbor"
1891
+ response = super()._prepare_additional_traits_in_response(
1892
+ response, operation_model, request_id
1893
+ )
1894
+ return response
1895
+
1896
+
1740
1897
  class S3ResponseSerializer(RestXMLResponseSerializer):
1741
1898
  """
1742
1899
  The ``S3ResponseSerializer`` adds some minor logic to handle S3 specific peculiarities with the error response
@@ -1903,7 +2060,7 @@ class S3ResponseSerializer(RestXMLResponseSerializer):
1903
2060
  root.attrib["xmlns"] = self.XML_NAMESPACE
1904
2061
 
1905
2062
  @staticmethod
1906
- def _timestamp_iso8601(value: datetime) -> str:
2063
+ def _timestamp_iso8601(value: datetime.datetime) -> str:
1907
2064
  """
1908
2065
  This is very specific to S3, S3 returns an ISO8601 timestamp but with milliseconds always set to 000
1909
2066
  Some SDKs are very picky about the length
@@ -2074,11 +2231,14 @@ def gen_amzn_requestid():
2074
2231
 
2075
2232
 
2076
2233
  @functools.cache
2077
- def create_serializer(service: ServiceModel) -> ResponseSerializer:
2234
+ def create_serializer(
2235
+ service: ServiceModel, protocol: ProtocolName | None = None
2236
+ ) -> ResponseSerializer:
2078
2237
  """
2079
2238
  Creates the right serializer for the given service model.
2080
2239
 
2081
2240
  :param service: to create the serializer for
2241
+ :param protocol: the protocol for the serializer. If not provided, fallback to the service's default protocol
2082
2242
  :return: ResponseSerializer which can handle the protocol of the service
2083
2243
  """
2084
2244
 
@@ -2098,20 +2258,25 @@ def create_serializer(service: ServiceModel) -> ResponseSerializer:
2098
2258
  "rest-json": RestJSONResponseSerializer,
2099
2259
  "rest-xml": RestXMLResponseSerializer,
2100
2260
  "ec2": EC2ResponseSerializer,
2261
+ "smithy-rpc-v2-cbor": RpcV2CBORResponseSerializer,
2101
2262
  # TODO: implement multi-protocol support for Kinesis, so that it can uses the `cbor` protocol and remove
2102
2263
  # CBOR handling from JSONResponseParser
2103
2264
  # this is not an "official" protocol defined from the spec, but is derived from ``json``
2104
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
+ service_protocol = protocol or service.protocol
2105
2270
 
2106
2271
  # Try to select a service- and protocol-specific serializer implementation
2107
2272
  if (
2108
2273
  service.service_name in service_specific_serializers
2109
- and service.protocol in service_specific_serializers[service.service_name]
2274
+ and service_protocol in service_specific_serializers[service.service_name]
2110
2275
  ):
2111
- return service_specific_serializers[service.service_name][service.protocol]()
2276
+ return service_specific_serializers[service.service_name][service_protocol]()
2112
2277
  else:
2113
2278
  # Otherwise, pick the protocol-specific serializer for the protocol of the service
2114
- return protocol_specific_serializers[service.protocol]()
2279
+ return protocol_specific_serializers[service_protocol]()
2115
2280
 
2116
2281
 
2117
2282
  def aws_response_serializer(
localstack/aws/spec.py CHANGED
@@ -21,7 +21,7 @@ from localstack.utils.objects import singleton_factory
21
21
  LOG = logging.getLogger(__name__)
22
22
 
23
23
  ServiceName = str
24
- ProtocolName = Literal["query", "json", "rest-json", "rest-xml", "ec2"]
24
+ ProtocolName = Literal["query", "json", "rest-json", "rest-xml", "ec2", "smithy-rpc-v2-cbor"]
25
25
 
26
26
 
27
27
  class ServiceModelIdentifier(NamedTuple):
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.dev3'
32
- __version_tuple__ = version_tuple = (4, 8, 2, 'dev3')
31
+ __version__ = version = '4.8.2.dev4'
32
+ __version_tuple__ = version_tuple = (4, 8, 2, 'dev4')
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack-core
3
- Version: 4.8.2.dev3
3
+ Version: 4.8.2.dev4
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -4,7 +4,7 @@ localstack/deprecations.py,sha256=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=kaeG6D7EsDHfixIw0CEh3TtxAkDCOIA0bXuITH_66fg,717
7
+ localstack/version.py,sha256=dEShIS0YnMM6AaeRar-VlvtQTnsKfZXEz0okcPb46Ng,717
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
@@ -19,7 +19,7 @@ localstack/aws/patches.py,sha256=r5EDhDE_OL25fQzT6oEhV7LvpBzTisOqxdn-JD_ZfrI,188
19
19
  localstack/aws/scaffold.py,sha256=9GLeSaWQdCWBpFJghj92tFuGZ2CaCNE9iqJ020vs8a0,20029
20
20
  localstack/aws/skeleton.py,sha256=zlbzAEiMV-tS5EQz5MxqflInalK613BrTOFviyT4X5Y,8175
21
21
  localstack/aws/spec-patches.json,sha256=9zIgusH52V72SmOaRHTlWcu4aX5GEb2SzX1U9EL7SpU,42563
22
- localstack/aws/spec.py,sha256=u68ApxdHIs6EhHBLL4c9lZhoGMunK1Jb0Y5CGUCEid4,14233
22
+ localstack/aws/spec.py,sha256=61aAB3bqJ5rVJKh35ApLJR6cSGUGIgElKSnN2n2i8w8,14255
23
23
  localstack/aws/api/__init__.py,sha256=JspwCauxfTTdLNVAr7AkQaPu1lELdBQ1miB9B9sndOo,297
24
24
  localstack/aws/api/core.py,sha256=5BdwwThfkrZThxgGIbIabXdtMSPZfElzNdzRlw224m4,6733
25
25
  localstack/aws/api/acm/__init__.py,sha256=67OHJbngmz4nKaXm9grkLW_Rl4RLRCeOBffhh3u1z0k,19079
@@ -83,9 +83,9 @@ localstack/aws/handlers/tracing.py,sha256=y_BUJKjNgaRGebm88NSqni4GFCQ_ZgB2JBRnEt
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=0GbN2Jp4mf7zvaf0Mz3bOX9miDnIJzsk-s_Y2Kgw4vo,64489
86
+ localstack/aws/protocol/parser.py,sha256=yVM8SSa2ZoaJDAMV7n-wG77xiwKDWE90dmwgqm7VpPg,70911
87
87
  localstack/aws/protocol/routing.py,sha256=x9AFpMQsVHD7JadtLHR7zjfBw3AJBayITNAYiUtnlwQ,3217
88
- localstack/aws/protocol/serializer.py,sha256=ODwltli1RAh8AcaiMxwDtEV9Ax6Vx5sVQB0v61l9bBI,95906
88
+ localstack/aws/protocol/serializer.py,sha256=UXIOyB--iQcv2s8AazaSFrvk1eAPJOcqNqiv25wT3R8,103498
89
89
  localstack/aws/protocol/service_router.py,sha256=nJK1s9oCPax5rBWBDry5RgLqGojRJSkQscZuNzPut_M,16418
90
90
  localstack/aws/protocol/validate.py,sha256=j3HJAQEKS6V_arrmvlPmP2jbge3LutxwEXDNabDlDdY,5285
91
91
  localstack/aws/serving/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1291,13 +1291,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1291
1291
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1292
1292
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1293
1293
  localstack/utils/xray/traceid.py,sha256=GKO-R2sMMjlrH2UaLPXlQlZ6flbE7ZKb6IZMtMu_M5U,1110
1294
- localstack_core-4.8.2.dev3.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1295
- localstack_core-4.8.2.dev3.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1296
- localstack_core-4.8.2.dev3.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1297
- localstack_core-4.8.2.dev3.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1298
- localstack_core-4.8.2.dev3.dist-info/METADATA,sha256=9-5hy1pbLVQNU8csnUd-1Tt0HBybAlnzAxi-rsxX05Q,5536
1299
- localstack_core-4.8.2.dev3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
- localstack_core-4.8.2.dev3.dist-info/entry_points.txt,sha256=_ZJMdzN2FZoPbjxM2Q2yVTF6eucmoJsNpwav9_UyfTA,20821
1301
- localstack_core-4.8.2.dev3.dist-info/plux.json,sha256=QV16zZYfrphFqS5jqJfWyE89B2FMh_eKyLgOkS5mCpI,21046
1302
- localstack_core-4.8.2.dev3.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1303
- localstack_core-4.8.2.dev3.dist-info/RECORD,,
1294
+ localstack_core-4.8.2.dev4.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1295
+ localstack_core-4.8.2.dev4.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1296
+ localstack_core-4.8.2.dev4.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1297
+ localstack_core-4.8.2.dev4.dist-info/licenses/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1298
+ localstack_core-4.8.2.dev4.dist-info/METADATA,sha256=qwfd4oIn9XE075Z-Cc6KrYEDvDaXpir1_QNmq2HCebE,5536
1299
+ localstack_core-4.8.2.dev4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1300
+ localstack_core-4.8.2.dev4.dist-info/entry_points.txt,sha256=_ZJMdzN2FZoPbjxM2Q2yVTF6eucmoJsNpwav9_UyfTA,20821
1301
+ localstack_core-4.8.2.dev4.dist-info/plux.json,sha256=3QSP83ZkCNWnZaZfCE9FPTQWXlRfjyf4Dzhsk1kBGno,21046
1302
+ localstack_core-4.8.2.dev4.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1303
+ localstack_core-4.8.2.dev4.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "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::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin"], "localstack.packages": ["vosk/community=localstack.services.transcribe.plugins:vosk_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "localstack.hooks.on_infra_start": ["conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "_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", "delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "_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", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "init_response_mutation_handler=localstack.aws.handlers.response:init_response_mutation_handler", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints"], "localstack.hooks.on_infra_shutdown": ["run_on_after_service_shutdown_handlers=localstack.runtime.shutdown:run_on_after_service_shutdown_handlers", "run_shutdown_handlers=localstack.runtime.shutdown:run_shutdown_handlers", "shutdown_services=localstack.runtime.shutdown:shutdown_services", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "stop_server=localstack.dns.plugins:stop_server"], "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.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"], "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.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"]}
@@ -1 +0,0 @@
1
- {"localstack.cloudformation.resource_providers": ["AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::EC2::RouteTable=localstack.services.ec2.resource_providers.aws_ec2_routetable_plugin:EC2RouteTableProviderPlugin", "AWS::SSM::PatchBaseline=localstack.services.ssm.resource_providers.aws_ssm_patchbaseline_plugin:SSMPatchBaselineProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "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::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "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::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "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::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin"], "localstack.packages": ["elasticsearch/community=localstack.services.es.plugins:elasticsearch_package", "kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package"], "localstack.hooks.on_infra_start": ["register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_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", "_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", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "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", "eager_load_services=localstack.services.plugins:eager_load_services", "_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", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server"], "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.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.hooks.on_infra_shutdown": ["_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "publish_metrics=localstack.utils.analytics.metrics.publisher:publish_metrics", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "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.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"]}