localstack-core 4.7.1.dev139__py3-none-any.whl → 4.10.1.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. localstack/aws/api/cloudformation/__init__.py +1 -0
  2. localstack/aws/api/cloudwatch/__init__.py +41 -1
  3. localstack/aws/api/config/__init__.py +4 -0
  4. localstack/aws/api/core.py +4 -0
  5. localstack/aws/api/ec2/__init__.py +1113 -56
  6. localstack/aws/api/iam/__init__.py +7 -0
  7. localstack/aws/api/kinesis/__init__.py +19 -0
  8. localstack/aws/api/kms/__init__.py +6 -0
  9. localstack/aws/api/lambda_/__init__.py +13 -0
  10. localstack/aws/api/logs/__init__.py +15 -0
  11. localstack/aws/api/redshift/__init__.py +9 -3
  12. localstack/aws/api/route53/__init__.py +2 -0
  13. localstack/aws/api/s3/__init__.py +12 -0
  14. localstack/aws/api/s3control/__init__.py +32 -0
  15. localstack/aws/api/ssm/__init__.py +2 -0
  16. localstack/aws/client.py +7 -2
  17. localstack/aws/forwarder.py +52 -5
  18. localstack/aws/handlers/analytics.py +1 -1
  19. localstack/aws/handlers/logging.py +12 -2
  20. localstack/aws/handlers/metric_handler.py +41 -1
  21. localstack/aws/handlers/service.py +32 -9
  22. localstack/aws/protocol/parser.py +440 -21
  23. localstack/aws/protocol/serializer.py +684 -64
  24. localstack/aws/protocol/service_router.py +120 -20
  25. localstack/aws/skeleton.py +4 -2
  26. localstack/aws/spec-patches.json +58 -0
  27. localstack/aws/spec.py +33 -13
  28. localstack/cli/exceptions.py +1 -1
  29. localstack/cli/localstack.py +4 -4
  30. localstack/cli/lpm.py +3 -4
  31. localstack/cli/profiles.py +1 -2
  32. localstack/config.py +18 -12
  33. localstack/constants.py +4 -29
  34. localstack/dev/kubernetes/__main__.py +1 -1
  35. localstack/dev/run/paths.py +1 -1
  36. localstack/dns/plugins.py +5 -1
  37. localstack/dns/server.py +12 -3
  38. localstack/packages/api.py +9 -8
  39. localstack/packages/core.py +2 -2
  40. localstack/packages/plugins.py +0 -8
  41. localstack/runtime/init.py +1 -1
  42. localstack/services/apigateway/legacy/provider.py +53 -3
  43. localstack/services/apigateway/next_gen/execute_api/integrations/aws.py +3 -0
  44. localstack/services/apigateway/next_gen/execute_api/integrations/http.py +3 -3
  45. localstack/services/apigateway/next_gen/execute_api/test_invoke.py +50 -6
  46. localstack/services/apigateway/next_gen/provider.py +5 -0
  47. localstack/services/cloudformation/engine/entities.py +12 -1
  48. localstack/services/cloudformation/engine/v2/change_set_model.py +0 -3
  49. localstack/services/cloudformation/engine/v2/change_set_model_describer.py +14 -0
  50. localstack/services/cloudformation/engine/v2/change_set_model_executor.py +13 -15
  51. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +118 -24
  52. localstack/services/cloudformation/engine/v2/change_set_model_transform.py +4 -1
  53. localstack/services/cloudformation/engine/v2/change_set_model_validator.py +5 -14
  54. localstack/services/cloudformation/engine/v2/change_set_model_visitor.py +1 -0
  55. localstack/services/cloudformation/engine/v2/resolving.py +6 -4
  56. localstack/services/cloudformation/engine/yaml_parser.py +9 -2
  57. localstack/services/cloudformation/resource_provider.py +5 -1
  58. localstack/services/cloudformation/resources.py +24149 -0
  59. localstack/services/cloudformation/v2/entities.py +6 -3
  60. localstack/services/cloudformation/v2/provider.py +172 -27
  61. localstack/services/cloudformation/v2/types.py +8 -4
  62. localstack/services/cloudwatch/provider_v2.py +25 -28
  63. localstack/services/dynamodb/packages.py +2 -1
  64. localstack/services/dynamodb/provider.py +42 -0
  65. localstack/services/dynamodb/v2/provider.py +42 -0
  66. localstack/services/ecr/resource_providers/aws_ecr_repository.py +5 -2
  67. localstack/services/es/provider.py +2 -2
  68. localstack/services/events/event_rule_engine.py +31 -13
  69. localstack/services/events/models.py +4 -5
  70. localstack/services/events/target.py +17 -9
  71. localstack/services/iam/provider.py +11 -116
  72. localstack/services/iam/resources/policy_simulator.py +133 -0
  73. localstack/services/kinesis/models.py +15 -2
  74. localstack/services/kinesis/provider.py +77 -0
  75. localstack/services/kms/provider.py +14 -5
  76. localstack/services/lambda_/invocation/internal_sqs_queue.py +5 -9
  77. localstack/services/lambda_/packages.py +1 -1
  78. localstack/services/logs/provider.py +1 -1
  79. localstack/services/moto.py +2 -1
  80. localstack/services/opensearch/cluster.py +15 -7
  81. localstack/services/opensearch/packages.py +26 -7
  82. localstack/services/opensearch/provider.py +6 -1
  83. localstack/services/opensearch/versions.py +56 -7
  84. localstack/services/s3/constants.py +5 -2
  85. localstack/services/s3/cors.py +4 -4
  86. localstack/services/s3/notifications.py +1 -1
  87. localstack/services/s3/presigned_url.py +27 -43
  88. localstack/services/s3/provider.py +67 -11
  89. localstack/services/s3/utils.py +42 -11
  90. localstack/services/ses/provider.py +16 -7
  91. localstack/services/sns/constants.py +7 -1
  92. localstack/services/sns/v2/models.py +167 -0
  93. localstack/services/sns/v2/provider.py +860 -2
  94. localstack/services/sns/v2/utils.py +130 -0
  95. localstack/services/sqs/developer_api.py +205 -0
  96. localstack/services/sqs/models.py +42 -3
  97. localstack/services/sqs/provider.py +8 -309
  98. localstack/services/sqs/query_api.py +1 -1
  99. localstack/services/sqs/utils.py +121 -2
  100. localstack/services/stepfunctions/asl/jsonata/jsonata.py +1 -1
  101. localstack/testing/aws/cloudformation_utils.py +1 -1
  102. localstack/testing/pytest/cloudformation/fixtures.py +3 -3
  103. localstack/testing/pytest/container.py +4 -5
  104. localstack/testing/pytest/fixtures.py +20 -19
  105. localstack/testing/pytest/in_memory_localstack.py +0 -4
  106. localstack/testing/pytest/marking.py +13 -4
  107. localstack/testing/pytest/stepfunctions/utils.py +4 -3
  108. localstack/testing/pytest/util.py +1 -1
  109. localstack/testing/pytest/validation_tracking.py +1 -2
  110. localstack/testing/snapshots/transformer_utility.py +5 -0
  111. localstack/utils/analytics/events.py +2 -2
  112. localstack/utils/analytics/metadata.py +1 -2
  113. localstack/utils/analytics/metrics/counter.py +6 -8
  114. localstack/utils/analytics/publisher.py +1 -2
  115. localstack/utils/analytics/service_request_aggregator.py +2 -2
  116. localstack/utils/archives.py +11 -11
  117. localstack/utils/aws/arns.py +17 -9
  118. localstack/utils/aws/aws_responses.py +7 -7
  119. localstack/utils/aws/aws_stack.py +2 -3
  120. localstack/utils/aws/message_forwarding.py +1 -2
  121. localstack/utils/aws/request_context.py +4 -5
  122. localstack/utils/batch_policy.py +3 -3
  123. localstack/utils/bootstrap.py +7 -7
  124. localstack/utils/catalog/catalog.py +139 -0
  125. localstack/utils/catalog/catalog_loader.py +11 -0
  126. localstack/utils/catalog/common.py +58 -0
  127. localstack/utils/catalog/plugins.py +28 -0
  128. localstack/utils/cloudwatch/cloudwatch_util.py +5 -5
  129. localstack/utils/collections.py +7 -8
  130. localstack/utils/config_listener.py +1 -1
  131. localstack/utils/container_networking.py +2 -3
  132. localstack/utils/container_utils/container_client.py +115 -131
  133. localstack/utils/container_utils/docker_cmd_client.py +42 -42
  134. localstack/utils/container_utils/docker_sdk_client.py +63 -62
  135. localstack/utils/diagnose.py +2 -3
  136. localstack/utils/docker_utils.py +3 -4
  137. localstack/utils/files.py +31 -7
  138. localstack/utils/functions.py +3 -2
  139. localstack/utils/http.py +4 -5
  140. localstack/utils/json.py +19 -5
  141. localstack/utils/kinesis/kinesis_connector.py +2 -1
  142. localstack/utils/net.py +6 -6
  143. localstack/utils/no_exit_argument_parser.py +2 -2
  144. localstack/utils/numbers.py +9 -2
  145. localstack/utils/objects.py +6 -5
  146. localstack/utils/patch.py +2 -1
  147. localstack/utils/run.py +10 -9
  148. localstack/utils/scheduler.py +11 -11
  149. localstack/utils/server/tcp_proxy.py +2 -2
  150. localstack/utils/serving.py +2 -3
  151. localstack/utils/strings.py +10 -11
  152. localstack/utils/sync.py +126 -1
  153. localstack/utils/tagging.py +1 -4
  154. localstack/utils/testutil.py +5 -4
  155. localstack/utils/threads.py +2 -2
  156. localstack/utils/time.py +11 -3
  157. localstack/utils/urls.py +1 -3
  158. localstack/version.py +2 -2
  159. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/METADATA +17 -12
  160. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/RECORD +168 -164
  161. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/entry_points.txt +4 -2
  162. localstack_core-4.10.1.dev7.dist-info/plux.json +1 -0
  163. localstack/packages/terraform.py +0 -46
  164. localstack/services/cloudformation/deploy.html +0 -144
  165. localstack/services/cloudformation/deploy_ui.py +0 -47
  166. localstack/services/cloudformation/plugins.py +0 -12
  167. localstack_core-4.7.1.dev139.dist-info/plux.json +0 -1
  168. {localstack_core-4.7.1.dev139.data → localstack_core-4.10.1.dev7.data}/scripts/localstack +0 -0
  169. {localstack_core-4.7.1.dev139.data → localstack_core-4.10.1.dev7.data}/scripts/localstack-supervisor +0 -0
  170. {localstack_core-4.7.1.dev139.data → localstack_core-4.10.1.dev7.data}/scripts/localstack.bat +0 -0
  171. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/WHEEL +0 -0
  172. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/licenses/LICENSE.txt +0 -0
  173. {localstack_core-4.7.1.dev139.dist-info → localstack_core-4.10.1.dev7.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,167 @@
1
+ import itertools
2
+ import time
3
+ from dataclasses import dataclass, field
4
+ from enum import StrEnum
5
+ from typing import Literal, TypedDict
6
+
7
+ from localstack.aws.api.sns import (
8
+ MessageAttributeMap,
9
+ PlatformApplication,
10
+ PublishBatchRequestEntry,
11
+ TopicAttributesMap,
12
+ subscriptionARN,
13
+ topicARN,
14
+ )
15
+ from localstack.services.stores import (
16
+ AccountRegionBundle,
17
+ BaseStore,
18
+ CrossRegionAttribute,
19
+ LocalAttribute,
20
+ )
21
+ from localstack.utils.objects import singleton_factory
22
+ from localstack.utils.strings import long_uid
23
+ from localstack.utils.tagging import TaggingService
24
+
25
+
26
+ class Topic(TypedDict, total=True):
27
+ arn: str
28
+ name: str
29
+ attributes: TopicAttributesMap
30
+ subscriptions: list[str]
31
+
32
+
33
+ SnsProtocols = Literal[
34
+ "http", "https", "email", "email-json", "sms", "sqs", "application", "lambda", "firehose"
35
+ ]
36
+
37
+ SnsApplicationPlatforms = Literal[
38
+ "APNS", "APNS_SANDBOX", "ADM", "FCM", "Baidu", "GCM", "MPNS", "WNS"
39
+ ]
40
+
41
+
42
+ SMS_ATTRIBUTE_NAMES = [
43
+ "DeliveryStatusIAMRole",
44
+ "DeliveryStatusSuccessSamplingRate",
45
+ "DefaultSenderID",
46
+ "DefaultSMSType",
47
+ "UsageReportS3Bucket",
48
+ ]
49
+ SMS_TYPES = ["Promotional", "Transactional"]
50
+ SMS_DEFAULT_SENDER_REGEX = r"^(?=[A-Za-z0-9]{1,11}$)(?=.*[A-Za-z])[A-Za-z0-9]+$"
51
+ SnsMessageProtocols = Literal[SnsProtocols, SnsApplicationPlatforms]
52
+
53
+
54
+ class SnsSubscription(TypedDict, total=False):
55
+ """
56
+ In SNS, Subscription can be represented with only TopicArn, Endpoint, Protocol, SubscriptionArn and Owner, for
57
+ example in ListSubscriptions. However, when getting a subscription with GetSubscriptionAttributes, it will return
58
+ the Subscription object merged with its own attributes.
59
+ This represents this merged object, for internal use and in GetSubscriptionAttributes
60
+ https://docs.aws.amazon.com/cli/latest/reference/sns/get-subscription-attributes.html
61
+ """
62
+
63
+ TopicArn: topicARN
64
+ Endpoint: str
65
+ Protocol: SnsProtocols
66
+ SubscriptionArn: subscriptionARN
67
+ PendingConfirmation: Literal["true", "false"]
68
+ Owner: str | None
69
+ SubscriptionPrincipal: str | None
70
+ FilterPolicy: str | None
71
+ FilterPolicyScope: Literal["MessageAttributes", "MessageBody"]
72
+ RawMessageDelivery: Literal["true", "false"]
73
+ ConfirmationWasAuthenticated: Literal["true", "false"]
74
+ SubscriptionRoleArn: str | None
75
+ DeliveryPolicy: str | None
76
+
77
+
78
+ @singleton_factory
79
+ def global_sns_message_sequence():
80
+ # creates a 20-digit number used as the start for the global sequence, adds 100 for it to be different from SQS's
81
+ # mostly for testing purpose, both global sequence would be initialized at the same and be identical
82
+ start = int(time.time() + 100) << 33
83
+ # itertools.count is thread safe over the GIL since its getAndIncrement operation is a single python bytecode op
84
+ return itertools.count(start)
85
+
86
+
87
+ def get_next_sequence_number():
88
+ return next(global_sns_message_sequence())
89
+
90
+
91
+ class SnsMessageType(StrEnum):
92
+ Notification = "Notification"
93
+ SubscriptionConfirmation = "SubscriptionConfirmation"
94
+ UnsubscribeConfirmation = "UnsubscribeConfirmation"
95
+
96
+
97
+ @dataclass
98
+ class SnsMessage:
99
+ type: SnsMessageType
100
+ message: (
101
+ str | dict
102
+ ) # can be Dict if after being JSON decoded for validation if structure is `json`
103
+ message_attributes: MessageAttributeMap | None = None
104
+ message_structure: str | None = None
105
+ subject: str | None = None
106
+ message_deduplication_id: str | None = None
107
+ message_group_id: str | None = None
108
+ token: str | None = None
109
+ message_id: str = field(default_factory=long_uid)
110
+ is_fifo: bool | None = False
111
+ sequencer_number: str | None = None
112
+
113
+ def __post_init__(self):
114
+ if self.message_attributes is None:
115
+ self.message_attributes = {}
116
+ if self.is_fifo:
117
+ self.sequencer_number = str(get_next_sequence_number())
118
+
119
+ def message_content(self, protocol: SnsMessageProtocols) -> str:
120
+ """
121
+ Helper function to retrieve the message content for the right protocol if the StructureMessage is `json`
122
+ See https://docs.aws.amazon.com/sns/latest/dg/sns-send-custom-platform-specific-payloads-mobile-devices.html
123
+ https://docs.aws.amazon.com/sns/latest/dg/example_sns_Publish_section.html
124
+ :param protocol:
125
+ :return: message content as string
126
+ """
127
+ if self.message_structure == "json":
128
+ return self.message.get(protocol, self.message.get("default"))
129
+
130
+ return self.message
131
+
132
+ @classmethod
133
+ def from_batch_entry(cls, entry: PublishBatchRequestEntry, is_fifo=False) -> "SnsMessage":
134
+ return cls(
135
+ type=SnsMessageType.Notification,
136
+ message=entry["Message"],
137
+ subject=entry.get("Subject"),
138
+ message_structure=entry.get("MessageStructure"),
139
+ message_attributes=entry.get("MessageAttributes"),
140
+ message_deduplication_id=entry.get("MessageDeduplicationId"),
141
+ message_group_id=entry.get("MessageGroupId"),
142
+ is_fifo=is_fifo,
143
+ )
144
+
145
+
146
+ class SnsStore(BaseStore):
147
+ topics: dict[str, Topic] = LocalAttribute(default=dict)
148
+
149
+ # maps subscription ARN to SnsSubscription
150
+ subscriptions: dict[str, SnsSubscription] = LocalAttribute(default=dict)
151
+
152
+ # filter policy are stored as JSON string in subscriptions, store the decoded result Dict
153
+ subscription_filter_policy: dict[subscriptionARN, dict] = LocalAttribute(default=dict)
154
+
155
+ # maps confirmation token to subscription ARN
156
+ subscription_tokens: dict[str, str] = LocalAttribute(default=dict)
157
+
158
+ # maps platform application arns to platform applications
159
+ platform_applications: dict[str, PlatformApplication] = LocalAttribute(default=dict)
160
+
161
+ # topic/subscription independent default values for sending sms messages
162
+ sms_attributes: dict[str, str] = LocalAttribute(default=dict)
163
+
164
+ TAGS: TaggingService = CrossRegionAttribute(default=TaggingService)
165
+
166
+
167
+ sns_stores = AccountRegionBundle("sns", SnsStore)