localstack-core 4.11.2.dev14__py3-none-any.whl → 4.12.1.dev18__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.

Files changed (77) hide show
  1. localstack/aws/api/ec2/__init__.py +13 -0
  2. localstack/aws/api/iam/__init__.py +1 -0
  3. localstack/aws/api/lambda_/__init__.py +616 -0
  4. localstack/aws/api/logs/__init__.py +188 -0
  5. localstack/aws/api/opensearch/__init__.py +11 -0
  6. localstack/aws/api/route53/__init__.py +3 -0
  7. localstack/aws/api/s3/__init__.py +2 -0
  8. localstack/aws/api/s3control/__init__.py +19 -0
  9. localstack/aws/api/secretsmanager/__init__.py +9 -0
  10. localstack/aws/connect.py +35 -15
  11. localstack/config.py +8 -0
  12. localstack/constants.py +3 -0
  13. localstack/dev/kubernetes/__main__.py +39 -14
  14. localstack/runtime/analytics.py +11 -0
  15. localstack/services/acm/provider.py +13 -1
  16. localstack/services/cloudformation/engine/v2/change_set_model.py +9 -0
  17. localstack/services/cloudformation/engine/v2/change_set_model_preproc.py +3 -1
  18. localstack/services/cloudformation/engine/v2/change_set_resource_support_checker.py +114 -0
  19. localstack/services/cloudformation/provider.py +26 -1
  20. localstack/services/cloudformation/provider_utils.py +20 -0
  21. localstack/services/cloudformation/resource_provider.py +5 -4
  22. localstack/services/cloudformation/scaffolding/__main__.py +94 -22
  23. localstack/services/cloudformation/v2/provider.py +41 -0
  24. localstack/services/kinesis/packages.py +1 -1
  25. localstack/services/kms/models.py +6 -2
  26. localstack/services/lambda_/analytics.py +11 -2
  27. localstack/services/lambda_/invocation/event_manager.py +15 -11
  28. localstack/services/lambda_/invocation/lambda_models.py +4 -0
  29. localstack/services/lambda_/invocation/lambda_service.py +11 -0
  30. localstack/services/lambda_/provider.py +70 -13
  31. localstack/services/opensearch/packages.py +34 -20
  32. localstack/services/route53/provider.py +7 -0
  33. localstack/services/route53resolver/provider.py +5 -0
  34. localstack/services/s3/constants.py +5 -0
  35. localstack/services/s3/exceptions.py +9 -0
  36. localstack/services/s3/models.py +9 -1
  37. localstack/services/s3/provider.py +25 -30
  38. localstack/services/s3/utils.py +46 -1
  39. localstack/services/s3control/provider.py +6 -0
  40. localstack/services/scheduler/provider.py +4 -2
  41. localstack/services/secretsmanager/provider.py +4 -0
  42. localstack/services/ses/provider.py +4 -0
  43. localstack/services/sns/constants.py +13 -0
  44. localstack/services/sns/provider.py +5 -0
  45. localstack/services/sns/v2/models.py +3 -0
  46. localstack/services/sns/v2/provider.py +100 -0
  47. localstack/services/sqs/constants.py +6 -0
  48. localstack/services/sqs/provider.py +9 -1
  49. localstack/services/sqs/resource_providers/aws_sqs_queue.py +61 -46
  50. localstack/services/ssm/provider.py +6 -0
  51. localstack/services/stepfunctions/asl/static_analyser/test_state/test_state_analyser.py +193 -107
  52. localstack/services/stepfunctions/backend/execution.py +4 -5
  53. localstack/services/stepfunctions/provider.py +21 -14
  54. localstack/services/sts/provider.py +7 -0
  55. localstack/services/support/provider.py +5 -1
  56. localstack/services/swf/provider.py +5 -1
  57. localstack/services/transcribe/provider.py +7 -0
  58. localstack/testing/aws/lambda_utils.py +1 -1
  59. localstack/testing/aws/util.py +2 -1
  60. localstack/testing/config.py +1 -0
  61. localstack/utils/aws/client_types.py +2 -4
  62. localstack/utils/bootstrap.py +2 -2
  63. localstack/utils/catalog/catalog.py +3 -2
  64. localstack/utils/container_utils/container_client.py +22 -13
  65. localstack/utils/container_utils/docker_cmd_client.py +6 -6
  66. localstack/version.py +2 -2
  67. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/METADATA +6 -6
  68. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/RECORD +76 -75
  69. localstack_core-4.12.1.dev18.dist-info/plux.json +1 -0
  70. localstack_core-4.11.2.dev14.dist-info/plux.json +0 -1
  71. {localstack_core-4.11.2.dev14.data → localstack_core-4.12.1.dev18.data}/scripts/localstack +0 -0
  72. {localstack_core-4.11.2.dev14.data → localstack_core-4.12.1.dev18.data}/scripts/localstack-supervisor +0 -0
  73. {localstack_core-4.11.2.dev14.data → localstack_core-4.12.1.dev18.data}/scripts/localstack.bat +0 -0
  74. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/WHEEL +0 -0
  75. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/entry_points.txt +0 -0
  76. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/licenses/LICENSE.txt +0 -0
  77. {localstack_core-4.11.2.dev14.dist-info → localstack_core-4.12.1.dev18.dist-info}/top_level.txt +0 -0
@@ -20,6 +20,9 @@ ClientToken = str
20
20
  CollectionRetentionDays = int
21
21
  Column = str
22
22
  DataProtectionPolicyDocument = str
23
+ DataSourceName = str
24
+ DataSourceType = str
25
+ DataType = str
23
26
  Days = int
24
27
  DefaultValue = float
25
28
  DeletionProtectionEnabled = bool
@@ -69,6 +72,8 @@ ForceUpdate = bool
69
72
  FromKey = str
70
73
  GetScheduledQueryHistoryMaxResults = int
71
74
  GrokMatch = str
75
+ GroupingIdentifierKey = str
76
+ GroupingIdentifierValue = str
72
77
  IncludeLinkedAccounts = bool
73
78
  InferredTokenName = str
74
79
  Integer = int
@@ -85,10 +90,14 @@ ListAnomaliesLimit = int
85
90
  ListLimit = int
86
91
  ListLogAnomalyDetectorsLimit = int
87
92
  ListLogGroupsForQueryMaxResults = int
93
+ ListLogGroupsRequestLimit = int
88
94
  ListScheduledQueriesMaxResults = int
95
+ ListSourcesForS3TableIntegrationMaxResults = int
89
96
  Locale = str
90
97
  LogEventIndex = int
98
+ LogFieldName = str
91
99
  LogGroupArn = str
100
+ LogGroupCount = int
92
101
  LogGroupIdentifier = str
93
102
  LogGroupName = str
94
103
  LogGroupNamePattern = str
@@ -133,6 +142,8 @@ RequestId = str
133
142
  ResourceIdentifier = str
134
143
  ResourceType = str
135
144
  RoleArn = str
145
+ S3TableIntegrationSourceIdentifier = str
146
+ S3TableIntegrationSourceStatusReason = str
136
147
  S3Uri = str
137
148
  ScheduleExpression = str
138
149
  ScheduleTimezone = str
@@ -257,6 +268,11 @@ class IndexSource(StrEnum):
257
268
  LOG_GROUP = "LOG_GROUP"
258
269
 
259
270
 
271
+ class IndexType(StrEnum):
272
+ FACET = "FACET"
273
+ FIELD_INDEX = "FIELD_INDEX"
274
+
275
+
260
276
  class InheritedProperty(StrEnum):
261
277
  ACCOUNT_DATA_PROTECTION = "ACCOUNT_DATA_PROTECTION"
262
278
 
@@ -271,6 +287,11 @@ class IntegrationType(StrEnum):
271
287
  OPENSEARCH = "OPENSEARCH"
272
288
 
273
289
 
290
+ class ListAggregateLogGroupSummariesGroupBy(StrEnum):
291
+ DATA_SOURCE_NAME_TYPE_AND_FORMAT = "DATA_SOURCE_NAME_TYPE_AND_FORMAT"
292
+ DATA_SOURCE_NAME_AND_TYPE = "DATA_SOURCE_NAME_AND_TYPE"
293
+
294
+
274
295
  class LogGroupClass(StrEnum):
275
296
  STANDARD = "STANDARD"
276
297
  INFREQUENT_ACCESS = "INFREQUENT_ACCESS"
@@ -330,6 +351,13 @@ class QueryStatus(StrEnum):
330
351
  Unknown = "Unknown"
331
352
 
332
353
 
354
+ class S3TableIntegrationSourceStatus(StrEnum):
355
+ ACTIVE = "ACTIVE"
356
+ UNHEALTHY = "UNHEALTHY"
357
+ FAILED = "FAILED"
358
+ DATA_SOURCE_DELETE_IN_PROGRESS = "DATA_SOURCE_DELETE_IN_PROGRESS"
359
+
360
+
333
361
  class ScheduledQueryDestinationType(StrEnum):
334
362
  S3 = "S3"
335
363
 
@@ -572,6 +600,20 @@ class AddKeys(TypedDict, total=False):
572
600
  entries: AddKeyEntries
573
601
 
574
602
 
603
+ class GroupingIdentifier(TypedDict, total=False):
604
+ key: GroupingIdentifierKey | None
605
+ value: GroupingIdentifierValue | None
606
+
607
+
608
+ GroupingIdentifiers = list[GroupingIdentifier]
609
+
610
+
611
+ class AggregateLogGroupSummary(TypedDict, total=False):
612
+ logGroupCount: LogGroupCount | None
613
+ groupingIdentifiers: GroupingIdentifiers | None
614
+
615
+
616
+ AggregateLogGroupSummaries = list[AggregateLogGroupSummary]
575
617
  AllowedFieldDelimiters = list[FieldDelimiter]
576
618
 
577
619
 
@@ -656,6 +698,20 @@ class AssociateKmsKeyRequest(ServiceRequest):
656
698
  resourceIdentifier: ResourceIdentifier | None
657
699
 
658
700
 
701
+ class DataSource(TypedDict, total=False):
702
+ name: DataSourceName
703
+ type: DataSourceType | None
704
+
705
+
706
+ class AssociateSourceToS3TableIntegrationRequest(ServiceRequest):
707
+ integrationArn: Arn
708
+ dataSource: DataSource
709
+
710
+
711
+ class AssociateSourceToS3TableIntegrationResponse(TypedDict, total=False):
712
+ identifier: S3TableIntegrationSourceIdentifier | None
713
+
714
+
659
715
  Columns = list[Column]
660
716
 
661
717
 
@@ -827,6 +883,14 @@ class CreateScheduledQueryResponse(TypedDict, total=False):
827
883
 
828
884
  DashboardViewerPrincipals = list[Arn]
829
885
  Data = bytes
886
+
887
+
888
+ class DataSourceFilter(TypedDict, total=False):
889
+ name: DataSourceName
890
+ type: DataSourceType | None
891
+
892
+
893
+ DataSourceFilters = list[DataSourceFilter]
830
894
  MatchPatterns = list[MatchPattern]
831
895
 
832
896
 
@@ -1116,6 +1180,7 @@ class FieldIndex(TypedDict, total=False):
1116
1180
  lastScanTime: Timestamp | None
1117
1181
  firstEventTime: Timestamp | None
1118
1182
  lastEventTime: Timestamp | None
1183
+ type: IndexType | None
1119
1184
 
1120
1185
 
1121
1186
  FieldIndexes = list[FieldIndex]
@@ -1373,6 +1438,14 @@ class DisassociateKmsKeyRequest(ServiceRequest):
1373
1438
  resourceIdentifier: ResourceIdentifier | None
1374
1439
 
1375
1440
 
1441
+ class DisassociateSourceFromS3TableIntegrationRequest(ServiceRequest):
1442
+ identifier: S3TableIntegrationSourceIdentifier
1443
+
1444
+
1445
+ class DisassociateSourceFromS3TableIntegrationResponse(TypedDict, total=False):
1446
+ identifier: S3TableIntegrationSourceIdentifier | None
1447
+
1448
+
1376
1449
  EntityAttributes = dict[EntityAttributesKey, EntityAttributesValue]
1377
1450
  EntityKeyAttributes = dict[EntityKeyAttributesKey, EntityKeyAttributesValue]
1378
1451
 
@@ -1385,6 +1458,7 @@ class Entity(TypedDict, total=False):
1385
1458
  EventNumber = int
1386
1459
  ExecutionStatusList = list[ExecutionStatus]
1387
1460
  ExtractedValues = dict[Token, Value]
1461
+ FieldIndexNames = list[FieldIndexName]
1388
1462
 
1389
1463
 
1390
1464
  class FieldsData(TypedDict, total=False):
@@ -1596,6 +1670,29 @@ class GetLogEventsResponse(TypedDict, total=False):
1596
1670
  nextBackwardToken: NextToken | None
1597
1671
 
1598
1672
 
1673
+ class GetLogFieldsRequest(ServiceRequest):
1674
+ dataSourceName: DataSourceName
1675
+ dataSourceType: DataSourceType
1676
+
1677
+
1678
+ LogFieldsList = list["LogFieldsListItem"]
1679
+
1680
+
1681
+ class LogFieldType(TypedDict, total=False):
1682
+ type: "DataType | None"
1683
+ element: "LogFieldType | None"
1684
+ fields: "LogFieldsList | None"
1685
+
1686
+
1687
+ class LogFieldsListItem(TypedDict, total=False):
1688
+ logFieldName: LogFieldName | None
1689
+ logFieldType: LogFieldType | None
1690
+
1691
+
1692
+ class GetLogFieldsResponse(TypedDict, total=False):
1693
+ logFields: LogFieldsList | None
1694
+
1695
+
1599
1696
  class GetLogGroupFieldsRequest(ServiceRequest):
1600
1697
  logGroupName: LogGroupName | None
1601
1698
  time: Timestamp | None
@@ -1933,6 +2030,22 @@ class IntegrationSummary(TypedDict, total=False):
1933
2030
  IntegrationSummaries = list[IntegrationSummary]
1934
2031
 
1935
2032
 
2033
+ class ListAggregateLogGroupSummariesRequest(ServiceRequest):
2034
+ accountIdentifiers: AccountIds | None
2035
+ includeLinkedAccounts: IncludeLinkedAccounts | None
2036
+ logGroupClass: LogGroupClass | None
2037
+ logGroupNamePattern: LogGroupNameRegexPattern | None
2038
+ dataSources: DataSourceFilters | None
2039
+ groupBy: ListAggregateLogGroupSummariesGroupBy
2040
+ nextToken: NextToken | None
2041
+ limit: ListLogGroupsRequestLimit | None
2042
+
2043
+
2044
+ class ListAggregateLogGroupSummariesResponse(TypedDict, total=False):
2045
+ aggregateLogGroupSummaries: AggregateLogGroupSummaries | None
2046
+ nextToken: NextToken | None
2047
+
2048
+
1936
2049
  class ListAnomaliesRequest(ServiceRequest):
1937
2050
  anomalyDetectorArn: AnomalyDetectorArn | None
1938
2051
  suppressionState: SuppressionState | None
@@ -1987,6 +2100,8 @@ class ListLogGroupsRequest(ServiceRequest):
1987
2100
  accountIdentifiers: AccountIds | None
1988
2101
  nextToken: NextToken | None
1989
2102
  limit: ListLimit | None
2103
+ dataSources: DataSourceFilters | None
2104
+ fieldIndexNames: FieldIndexNames | None
1990
2105
 
1991
2106
 
1992
2107
  class LogGroupSummary(TypedDict, total=False):
@@ -2030,6 +2145,28 @@ class ListScheduledQueriesResponse(TypedDict, total=False):
2030
2145
  scheduledQueries: ScheduledQuerySummaryList | None
2031
2146
 
2032
2147
 
2148
+ class ListSourcesForS3TableIntegrationRequest(ServiceRequest):
2149
+ integrationArn: Arn
2150
+ maxResults: ListSourcesForS3TableIntegrationMaxResults | None
2151
+ nextToken: NextToken | None
2152
+
2153
+
2154
+ class S3TableIntegrationSource(TypedDict, total=False):
2155
+ identifier: S3TableIntegrationSourceIdentifier | None
2156
+ dataSource: DataSource | None
2157
+ status: S3TableIntegrationSourceStatus | None
2158
+ statusReason: S3TableIntegrationSourceStatusReason | None
2159
+ createdTimeStamp: Timestamp | None
2160
+
2161
+
2162
+ S3TableIntegrationSources = list[S3TableIntegrationSource]
2163
+
2164
+
2165
+ class ListSourcesForS3TableIntegrationResponse(TypedDict, total=False):
2166
+ sources: S3TableIntegrationSources | None
2167
+ nextToken: NextToken | None
2168
+
2169
+
2033
2170
  class ListTagsForResourceRequest(ServiceRequest):
2034
2171
  resourceArn: AmazonResourceName
2035
2172
 
@@ -2455,6 +2592,12 @@ class LogsApi:
2455
2592
  ) -> None:
2456
2593
  raise NotImplementedError
2457
2594
 
2595
+ @handler("AssociateSourceToS3TableIntegration")
2596
+ def associate_source_to_s3_table_integration(
2597
+ self, context: RequestContext, integration_arn: Arn, data_source: DataSource, **kwargs
2598
+ ) -> AssociateSourceToS3TableIntegrationResponse:
2599
+ raise NotImplementedError
2600
+
2458
2601
  @handler("CancelExportTask")
2459
2602
  def cancel_export_task(self, context: RequestContext, task_id: ExportTaskId, **kwargs) -> None:
2460
2603
  raise NotImplementedError
@@ -2875,6 +3018,12 @@ class LogsApi:
2875
3018
  ) -> None:
2876
3019
  raise NotImplementedError
2877
3020
 
3021
+ @handler("DisassociateSourceFromS3TableIntegration")
3022
+ def disassociate_source_from_s3_table_integration(
3023
+ self, context: RequestContext, identifier: S3TableIntegrationSourceIdentifier, **kwargs
3024
+ ) -> DisassociateSourceFromS3TableIntegrationResponse:
3025
+ raise NotImplementedError
3026
+
2878
3027
  @handler("FilterLogEvents")
2879
3028
  def filter_log_events(
2880
3029
  self,
@@ -2953,6 +3102,16 @@ class LogsApi:
2953
3102
  ) -> GetLogEventsResponse:
2954
3103
  raise NotImplementedError
2955
3104
 
3105
+ @handler("GetLogFields")
3106
+ def get_log_fields(
3107
+ self,
3108
+ context: RequestContext,
3109
+ data_source_name: DataSourceName,
3110
+ data_source_type: DataSourceType,
3111
+ **kwargs,
3112
+ ) -> GetLogFieldsResponse:
3113
+ raise NotImplementedError
3114
+
2956
3115
  @handler("GetLogGroupFields")
2957
3116
  def get_log_group_fields(
2958
3117
  self,
@@ -3016,6 +3175,22 @@ class LogsApi:
3016
3175
  ) -> GetTransformerResponse:
3017
3176
  raise NotImplementedError
3018
3177
 
3178
+ @handler("ListAggregateLogGroupSummaries")
3179
+ def list_aggregate_log_group_summaries(
3180
+ self,
3181
+ context: RequestContext,
3182
+ group_by: ListAggregateLogGroupSummariesGroupBy,
3183
+ account_identifiers: AccountIds | None = None,
3184
+ include_linked_accounts: IncludeLinkedAccounts | None = None,
3185
+ log_group_class: LogGroupClass | None = None,
3186
+ log_group_name_pattern: LogGroupNameRegexPattern | None = None,
3187
+ data_sources: DataSourceFilters | None = None,
3188
+ next_token: NextToken | None = None,
3189
+ limit: ListLogGroupsRequestLimit | None = None,
3190
+ **kwargs,
3191
+ ) -> ListAggregateLogGroupSummariesResponse:
3192
+ raise NotImplementedError
3193
+
3019
3194
  @handler("ListAnomalies")
3020
3195
  def list_anomalies(
3021
3196
  self,
@@ -3060,6 +3235,8 @@ class LogsApi:
3060
3235
  account_identifiers: AccountIds | None = None,
3061
3236
  next_token: NextToken | None = None,
3062
3237
  limit: ListLimit | None = None,
3238
+ data_sources: DataSourceFilters | None = None,
3239
+ field_index_names: FieldIndexNames | None = None,
3063
3240
  **kwargs,
3064
3241
  ) -> ListLogGroupsResponse:
3065
3242
  raise NotImplementedError
@@ -3086,6 +3263,17 @@ class LogsApi:
3086
3263
  ) -> ListScheduledQueriesResponse:
3087
3264
  raise NotImplementedError
3088
3265
 
3266
+ @handler("ListSourcesForS3TableIntegration")
3267
+ def list_sources_for_s3_table_integration(
3268
+ self,
3269
+ context: RequestContext,
3270
+ integration_arn: Arn,
3271
+ max_results: ListSourcesForS3TableIntegrationMaxResults | None = None,
3272
+ next_token: NextToken | None = None,
3273
+ **kwargs,
3274
+ ) -> ListSourcesForS3TableIntegrationResponse:
3275
+ raise NotImplementedError
3276
+
3089
3277
  @handler("ListTagsForResource")
3090
3278
  def list_tags_for_resource(
3091
3279
  self, context: RequestContext, resource_arn: AmazonResourceName, **kwargs
@@ -53,6 +53,7 @@ InstanceTypeString = str
53
53
  Integer = int
54
54
  IntegerClass = int
55
55
  Issue = str
56
+ KmsKeyArn = str
56
57
  KmsKeyId = str
57
58
  LicenseFilepath = str
58
59
  LimitName = str
@@ -698,6 +699,10 @@ class ValidationException(ServiceException):
698
699
  status_code: int = 400
699
700
 
700
701
 
702
+ class ServerlessVectorAcceleration(TypedDict, total=False):
703
+ Enabled: Boolean | None
704
+
705
+
701
706
  class S3VectorsEngine(TypedDict, total=False):
702
707
  Enabled: Boolean | None
703
708
 
@@ -709,6 +714,7 @@ class NaturalLanguageQueryGenerationOptionsInput(TypedDict, total=False):
709
714
  class AIMLOptionsInput(TypedDict, total=False):
710
715
  NaturalLanguageQueryGenerationOptions: NaturalLanguageQueryGenerationOptionsInput | None
711
716
  S3VectorsEngine: S3VectorsEngine | None
717
+ ServerlessVectorAcceleration: ServerlessVectorAcceleration | None
712
718
 
713
719
 
714
720
  class NaturalLanguageQueryGenerationOptionsOutput(TypedDict, total=False):
@@ -719,6 +725,7 @@ class NaturalLanguageQueryGenerationOptionsOutput(TypedDict, total=False):
719
725
  class AIMLOptionsOutput(TypedDict, total=False):
720
726
  NaturalLanguageQueryGenerationOptions: NaturalLanguageQueryGenerationOptionsOutput | None
721
727
  S3VectorsEngine: S3VectorsEngine | None
728
+ ServerlessVectorAcceleration: ServerlessVectorAcceleration | None
722
729
 
723
730
 
724
731
  UpdateTimestamp = datetime
@@ -1294,6 +1301,7 @@ class CreateApplicationRequest(ServiceRequest):
1294
1301
  iamIdentityCenterOptions: IamIdentityCenterOptionsInput | None
1295
1302
  appConfigs: AppConfigs | None
1296
1303
  tagList: TagList | None
1304
+ kmsKeyArn: KmsKeyArn | None
1297
1305
 
1298
1306
 
1299
1307
  class IamIdentityCenterOptions(TypedDict, total=False):
@@ -1312,6 +1320,7 @@ class CreateApplicationResponse(TypedDict, total=False):
1312
1320
  appConfigs: AppConfigs | None
1313
1321
  tagList: TagList | None
1314
1322
  createdAt: Timestamp | None
1323
+ kmsKeyArn: KmsKeyArn | None
1315
1324
 
1316
1325
 
1317
1326
  class SoftwareUpdateOptions(TypedDict, total=False):
@@ -2180,6 +2189,7 @@ class GetApplicationResponse(TypedDict, total=False):
2180
2189
  appConfigs: AppConfigs | None
2181
2190
  createdAt: Timestamp | None
2182
2191
  lastUpdatedAt: Timestamp | None
2192
+ kmsKeyArn: KmsKeyArn | None
2183
2193
 
2184
2194
 
2185
2195
  class GetCompatibleVersionsRequest(ServiceRequest):
@@ -2794,6 +2804,7 @@ class OpensearchApi:
2794
2804
  iam_identity_center_options: IamIdentityCenterOptionsInput | None = None,
2795
2805
  app_configs: AppConfigs | None = None,
2796
2806
  tag_list: TagList | None = None,
2807
+ kms_key_arn: KmsKeyArn | None = None,
2797
2808
  **kwargs,
2798
2809
  ) -> CreateApplicationResponse:
2799
2810
  raise NotImplementedError
@@ -181,6 +181,7 @@ class CloudWatchRegion(StrEnum):
181
181
  eu_isoe_west_1 = "eu-isoe-west-1"
182
182
  ap_southeast_6 = "ap-southeast-6"
183
183
  us_isob_west_1 = "us-isob-west-1"
184
+ eusc_de_east_1 = "eusc-de-east-1"
184
185
 
185
186
 
186
187
  class ComparisonOperator(StrEnum):
@@ -298,6 +299,7 @@ class ResourceRecordSetRegion(StrEnum):
298
299
  us_gov_west_1 = "us-gov-west-1"
299
300
  ap_east_2 = "ap-east-2"
300
301
  ap_southeast_6 = "ap-southeast-6"
302
+ eusc_de_east_1 = "eusc-de-east-1"
301
303
 
302
304
 
303
305
  class ReusableDelegationSetLimitType(StrEnum):
@@ -363,6 +365,7 @@ class VPCRegion(StrEnum):
363
365
  eu_isoe_west_1 = "eu-isoe-west-1"
364
366
  ap_southeast_6 = "ap-southeast-6"
365
367
  us_isob_west_1 = "us-isob-west-1"
368
+ eusc_de_east_1 = "eusc-de-east-1"
366
369
 
367
370
 
368
371
  class CidrBlockInUseException(ServiceException):
@@ -520,6 +520,7 @@ class ObjectStorageClass(StrEnum):
520
520
  SNOW = "SNOW"
521
521
  EXPRESS_ONEZONE = "EXPRESS_ONEZONE"
522
522
  FSX_OPENZFS = "FSX_OPENZFS"
523
+ FSX_ONTAP = "FSX_ONTAP"
523
524
 
524
525
 
525
526
  class ObjectVersionStorageClass(StrEnum):
@@ -632,6 +633,7 @@ class StorageClass(StrEnum):
632
633
  SNOW = "SNOW"
633
634
  EXPRESS_ONEZONE = "EXPRESS_ONEZONE"
634
635
  FSX_OPENZFS = "FSX_OPENZFS"
636
+ FSX_ONTAP = "FSX_ONTAP"
635
637
 
636
638
 
637
639
  class StorageClassAnalysisSchemaVersion(StrEnum):
@@ -608,6 +608,10 @@ class StorageLensGroupLevel(TypedDict, total=False):
608
608
  SelectionCriteria: StorageLensGroupLevelSelectionCriteria | None
609
609
 
610
610
 
611
+ class AdvancedPerformanceMetrics(TypedDict, total=False):
612
+ IsEnabled: IsEnabled | None
613
+
614
+
611
615
  class DetailedStatusCodesMetrics(TypedDict, total=False):
612
616
  IsEnabled: IsEnabled | None
613
617
 
@@ -645,6 +649,7 @@ class BucketLevel(TypedDict, total=False):
645
649
  AdvancedCostOptimizationMetrics: AdvancedCostOptimizationMetrics | None
646
650
  AdvancedDataProtectionMetrics: AdvancedDataProtectionMetrics | None
647
651
  DetailedStatusCodesMetrics: DetailedStatusCodesMetrics | None
652
+ AdvancedPerformanceMetrics: AdvancedPerformanceMetrics | None
648
653
 
649
654
 
650
655
  class AccountLevel(TypedDict, total=False):
@@ -653,6 +658,7 @@ class AccountLevel(TypedDict, total=False):
653
658
  AdvancedCostOptimizationMetrics: AdvancedCostOptimizationMetrics | None
654
659
  AdvancedDataProtectionMetrics: AdvancedDataProtectionMetrics | None
655
660
  DetailedStatusCodesMetrics: DetailedStatusCodesMetrics | None
661
+ AdvancedPerformanceMetrics: AdvancedPerformanceMetrics | None
656
662
  StorageLensGroupLevel: StorageLensGroupLevel | None
657
663
 
658
664
 
@@ -1944,6 +1950,11 @@ class StorageLensDataExportEncryption(TypedDict, total=False):
1944
1950
  SSEKMS: SSEKMS | None
1945
1951
 
1946
1952
 
1953
+ class StorageLensTableDestination(TypedDict, total=False):
1954
+ IsEnabled: IsEnabled
1955
+ Encryption: StorageLensDataExportEncryption | None
1956
+
1957
+
1947
1958
  class S3BucketDestination(TypedDict, total=False):
1948
1959
  Format: Format
1949
1960
  OutputSchemaVersion: OutputSchemaVersion
@@ -1953,9 +1964,15 @@ class S3BucketDestination(TypedDict, total=False):
1953
1964
  Encryption: StorageLensDataExportEncryption | None
1954
1965
 
1955
1966
 
1967
+ class StorageLensExpandedPrefixesDataExport(TypedDict, total=False):
1968
+ S3BucketDestination: S3BucketDestination | None
1969
+ StorageLensTableDestination: StorageLensTableDestination | None
1970
+
1971
+
1956
1972
  class StorageLensDataExport(TypedDict, total=False):
1957
1973
  S3BucketDestination: S3BucketDestination | None
1958
1974
  CloudWatchMetrics: CloudWatchMetrics | None
1975
+ StorageLensTableDestination: StorageLensTableDestination | None
1959
1976
 
1960
1977
 
1961
1978
  class Include(TypedDict, total=False):
@@ -1969,9 +1986,11 @@ class StorageLensConfiguration(TypedDict, total=False):
1969
1986
  Include: Include | None
1970
1987
  Exclude: Exclude | None
1971
1988
  DataExport: StorageLensDataExport | None
1989
+ ExpandedPrefixesDataExport: StorageLensExpandedPrefixesDataExport | None
1972
1990
  IsEnabled: IsEnabled
1973
1991
  AwsOrg: StorageLensAwsOrg | None
1974
1992
  StorageLensArn: StorageLensArn | None
1993
+ PrefixDelimiter: StorageLensPrefixLevelDelimiter | None
1975
1994
 
1976
1995
 
1977
1996
  class GetStorageLensConfigurationResult(TypedDict, total=False):
@@ -56,6 +56,13 @@ class FilterNameStringType(StrEnum):
56
56
  all = "all"
57
57
 
58
58
 
59
+ class SortByType(StrEnum):
60
+ created_date = "created-date"
61
+ last_accessed_date = "last-accessed-date"
62
+ last_changed_date = "last-changed-date"
63
+ name = "name"
64
+
65
+
59
66
  class SortOrderType(StrEnum):
60
67
  asc = "asc"
61
68
  desc = "desc"
@@ -407,6 +414,7 @@ class ListSecretsRequest(ServiceRequest):
407
414
  NextToken: NextTokenType | None
408
415
  Filters: FiltersListType | None
409
416
  SortOrder: SortOrderType | None
417
+ SortBy: SortByType | None
410
418
 
411
419
 
412
420
  class SecretListEntry(TypedDict, total=False):
@@ -688,6 +696,7 @@ class SecretsmanagerApi:
688
696
  next_token: NextTokenType | None = None,
689
697
  filters: FiltersListType | None = None,
690
698
  sort_order: SortOrderType | None = None,
699
+ sort_by: SortByType | None = None,
691
700
  **kwargs,
692
701
  ) -> ListSecretsResponse:
693
702
  raise NotImplementedError
localstack/aws/connect.py CHANGED
@@ -7,6 +7,7 @@ LocalStack providers.
7
7
 
8
8
  import json
9
9
  import logging
10
+ import os
10
11
  import re
11
12
  import threading
12
13
  from abc import ABC, abstractmethod
@@ -250,9 +251,10 @@ class ClientFactory(ABC):
250
251
  def __init__(
251
252
  self,
252
253
  use_ssl: bool = False,
253
- verify: bool = False,
254
+ verify: bool | str = False,
254
255
  session: Session = None,
255
256
  config: Config = None,
257
+ endpoint: str = None,
256
258
  ):
257
259
  """
258
260
  :param use_ssl: Whether to use SSL
@@ -268,6 +270,7 @@ class ClientFactory(ABC):
268
270
  self._verify = verify
269
271
  self._config: Config = config or Config(max_pool_connections=MAX_POOL_CONNECTIONS)
270
272
  self._session: Session = session or Session()
273
+ self._endpoint = endpoint
271
274
 
272
275
  # make sure we consider our custom data paths for legacy specs (like SQS query protocol)
273
276
  if LOCALSTACK_BUILTIN_DATA_PATH not in self._session._loader.search_paths:
@@ -514,10 +517,13 @@ class InternalClientFactory(ClientFactory):
514
517
  else:
515
518
  config = self._config.merge(config)
516
519
 
517
- endpoint_url = endpoint_url or get_service_endpoint()
518
- if service_name == "s3" and endpoint_url:
519
- if re.match(r"https?://localhost(:[0-9]+)?", endpoint_url):
520
- endpoint_url = endpoint_url.replace("://localhost", f"://{get_s3_hostname()}")
520
+ endpoint_url = endpoint_url or self._endpoint or get_service_endpoint()
521
+ if (
522
+ endpoint_url
523
+ and service_name == "s3"
524
+ and re.match(r"https?://localhost(:[0-9]+)?", endpoint_url)
525
+ ):
526
+ endpoint_url = endpoint_url.replace("://localhost", f"://{get_s3_hostname()}")
521
527
 
522
528
  return self._get_client(
523
529
  service_name=service_name,
@@ -574,14 +580,20 @@ class ExternalClientFactory(ClientFactory):
574
580
  # If the region in arg is non-default, it gives the arg the precedence
575
581
  # But if the region in arg is default (us-east-1), it gives precedence to one in config
576
582
  # Below: always give precedence to arg region
577
- if config and config.region_name != AWS_REGION_US_EAST_1:
578
- if region_name == AWS_REGION_US_EAST_1:
579
- config = config.merge(Config(region_name=region_name))
580
-
581
- endpoint_url = endpoint_url or get_service_endpoint()
582
- if service_name == "s3":
583
- if re.match(r"https?://localhost(:[0-9]+)?", endpoint_url):
584
- endpoint_url = endpoint_url.replace("://localhost", f"://{get_s3_hostname()}")
583
+ if (
584
+ config
585
+ and config.region_name != AWS_REGION_US_EAST_1
586
+ and region_name == AWS_REGION_US_EAST_1
587
+ ):
588
+ config = config.merge(Config(region_name=region_name))
589
+
590
+ endpoint_url = endpoint_url or self._endpoint or get_service_endpoint()
591
+ if (
592
+ endpoint_url
593
+ and service_name == "s3"
594
+ and re.match(r"https?://localhost(:[0-9]+)?", endpoint_url)
595
+ ):
596
+ endpoint_url = endpoint_url.replace("://localhost", f"://{get_s3_hostname()}")
585
597
 
586
598
  # Prevent `PartialCredentialsError` when only access key ID is provided
587
599
  # The value of secret access key is insignificant and can be set to anything
@@ -683,11 +695,19 @@ class ExternalBypassDnsClientFactory(ExternalAwsClientFactory):
683
695
  session: Session = None,
684
696
  config: Config = None,
685
697
  ):
686
- super().__init__(use_ssl=True, verify=True, session=session, config=config)
698
+ if ca_cert := os.getenv("REQUESTS_CA_BUNDLE"):
699
+ LOG.debug("Creating External AWS Client with REQUESTS_CA_BUNDLE=%s", ca_cert)
700
+
701
+ super().__init__(
702
+ use_ssl=localstack_config.is_env_not_false("USE_SSL"),
703
+ verify=ca_cert or True,
704
+ session=session,
705
+ config=config,
706
+ )
687
707
 
688
708
  def _get_client_post_hook(self, client: BaseClient) -> BaseClient:
689
709
  client = super()._get_client_post_hook(client)
690
- client._endpoint.http_session = ExternalBypassDnsSession()
710
+ client._endpoint.http_session = ExternalBypassDnsSession(verify=self._verify)
691
711
  return client
692
712
 
693
713
 
localstack/config.py CHANGED
@@ -225,6 +225,11 @@ def parse_boolean_env(env_var_name: str) -> bool | None:
225
225
  return None
226
226
 
227
227
 
228
+ def parse_comma_separated_list(env_var_name: str) -> list[str]:
229
+ """Parse a comma separated list from the given environment variable."""
230
+ return os.environ.get(env_var_name, "").strip().split(",")
231
+
232
+
228
233
  def is_env_true(env_var_name: str) -> bool:
229
234
  """Whether the given environment variable has a truthy value."""
230
235
  return os.environ.get(env_var_name, "").lower().strip() in TRUE_STRINGS
@@ -1211,6 +1216,9 @@ CFN_PER_RESOURCE_TIMEOUT = int(os.environ.get("CFN_PER_RESOURCE_TIMEOUT") or 300
1211
1216
  # EXPERIMENTAL
1212
1217
  CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES = is_env_not_false("CFN_IGNORE_UNSUPPORTED_RESOURCE_TYPES")
1213
1218
 
1219
+ # Decrease the waiting time for resource deployment
1220
+ CFN_NO_WAIT_ITERATIONS: str | int | None = os.environ.get("CFN_NO_WAIT_ITERATIONS")
1221
+
1214
1222
  # bind address of local DNS server
1215
1223
  DNS_ADDRESS = os.environ.get("DNS_ADDRESS") or "0.0.0.0"
1216
1224
  # port of the local DNS server
localstack/constants.py CHANGED
@@ -117,6 +117,9 @@ LOCALSTACK_INFRA_PROCESS = "LOCALSTACK_INFRA_PROCESS"
117
117
  # AWS region us-east-1
118
118
  AWS_REGION_US_EAST_1 = "us-east-1"
119
119
 
120
+ # AWS region eu-west-1
121
+ AWS_REGION_EU_WEST_1 = "eu-west-1"
122
+
120
123
  # environment variable to override max pool connections
121
124
  try:
122
125
  MAX_POOL_CONNECTIONS = int(os.environ["MAX_POOL_CONNECTIONS"])