localstack-core 4.2.1.dev30__py3-none-any.whl → 4.2.1.dev32__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.
@@ -0,0 +1,121 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ import datetime
5
+ import random
6
+ import threading
7
+ from typing import Final, Optional
8
+
9
+ from localstack.aws.api.stepfunctions import (
10
+ AliasDescription,
11
+ Arn,
12
+ CharacterRestrictedName,
13
+ DescribeStateMachineAliasOutput,
14
+ RoutingConfigurationList,
15
+ StateMachineAliasListItem,
16
+ )
17
+
18
+
19
+ class Alias:
20
+ _mutex: Final[threading.Lock]
21
+ update_date: Optional[datetime.datetime]
22
+ name: Final[CharacterRestrictedName]
23
+ _description: Optional[AliasDescription]
24
+ _routing_configuration_list: RoutingConfigurationList
25
+ _state_machine_version_arns: list[Arn]
26
+ _execution_probability_distribution: list[int]
27
+ state_machine_alias_arn: Final[Arn]
28
+ create_date: datetime.datetime
29
+
30
+ def __init__(
31
+ self,
32
+ state_machine_arn: Arn,
33
+ name: CharacterRestrictedName,
34
+ description: Optional[AliasDescription],
35
+ routing_configuration_list: RoutingConfigurationList,
36
+ ):
37
+ self._mutex = threading.Lock()
38
+ self.update_date = None
39
+ self.name = name
40
+ self._description = None
41
+ self.state_machine_alias_arn = f"{state_machine_arn}:{name}"
42
+ self.update(description=description, routing_configuration_list=routing_configuration_list)
43
+ self.create_date = self._get_mutex_date()
44
+
45
+ def __hash__(self):
46
+ return hash(self.state_machine_alias_arn)
47
+
48
+ def __eq__(self, other):
49
+ if isinstance(other, Alias):
50
+ return self.is_idempotent(other=other)
51
+ return False
52
+
53
+ def is_idempotent(self, other: Alias) -> bool:
54
+ return all(
55
+ [
56
+ self.state_machine_alias_arn == other.state_machine_alias_arn,
57
+ self.name == other.name,
58
+ self._description == other._description,
59
+ self._routing_configuration_list == other._routing_configuration_list,
60
+ ]
61
+ )
62
+
63
+ @staticmethod
64
+ def _get_mutex_date() -> datetime.datetime:
65
+ return datetime.datetime.now(tz=datetime.timezone.utc)
66
+
67
+ def get_routing_configuration_list(self) -> RoutingConfigurationList:
68
+ return copy.deepcopy(self._routing_configuration_list)
69
+
70
+ def is_router_for(self, state_machine_version_arn: Arn) -> bool:
71
+ with self._mutex:
72
+ return state_machine_version_arn in self._state_machine_version_arns
73
+
74
+ def update(
75
+ self,
76
+ description: Optional[AliasDescription],
77
+ routing_configuration_list: RoutingConfigurationList,
78
+ ) -> None:
79
+ with self._mutex:
80
+ self.update_date = self._get_mutex_date()
81
+
82
+ if description is not None:
83
+ self._description = description
84
+
85
+ if routing_configuration_list:
86
+ self._routing_configuration_list = routing_configuration_list
87
+ self._state_machine_version_arns = list()
88
+ self._execution_probability_distribution = list()
89
+ for routing_configuration in routing_configuration_list:
90
+ self._state_machine_version_arns.append(
91
+ routing_configuration["stateMachineVersionArn"]
92
+ )
93
+ self._execution_probability_distribution.append(routing_configuration["weight"])
94
+
95
+ def sample(self):
96
+ with self._mutex:
97
+ samples = random.choices(
98
+ self._state_machine_version_arns,
99
+ weights=self._execution_probability_distribution,
100
+ k=1,
101
+ )
102
+ state_machine_version_arn = samples[0]
103
+ return state_machine_version_arn
104
+
105
+ def to_description(self) -> DescribeStateMachineAliasOutput:
106
+ with self._mutex:
107
+ description = DescribeStateMachineAliasOutput(
108
+ creationDate=self.create_date,
109
+ name=self.name,
110
+ description=self._description,
111
+ routingConfiguration=self._routing_configuration_list,
112
+ stateMachineAliasArn=self.state_machine_alias_arn,
113
+ )
114
+ if self.update_date is not None:
115
+ description["updateDate"] = self.update_date
116
+ return description
117
+
118
+ def to_item(self) -> StateMachineAliasListItem:
119
+ return StateMachineAliasListItem(
120
+ stateMachineAliasArn=self.state_machine_alias_arn, creationDate=self.create_date
121
+ )
@@ -103,6 +103,10 @@ class Execution:
103
103
  region_name: str
104
104
 
105
105
  state_machine: Final[StateMachineInstance]
106
+ state_machine_arn: Final[Arn]
107
+ state_machine_version_arn: Final[Optional[Arn]]
108
+ state_machine_alias_arn: Final[Optional[Arn]]
109
+
106
110
  start_date: Final[Timestamp]
107
111
  input_data: Final[Optional[json]]
108
112
  input_details: Final[Optional[CloudWatchEventsExecutionDataDetails]]
@@ -136,6 +140,7 @@ class Execution:
136
140
  activity_store: dict[Arn, Activity],
137
141
  input_data: Optional[json] = None,
138
142
  trace_header: Optional[TraceHeader] = None,
143
+ state_machine_alias_arn: Optional[Arn] = None,
139
144
  ):
140
145
  self.name = name
141
146
  self.sm_type = sm_type
@@ -144,6 +149,13 @@ class Execution:
144
149
  self.account_id = account_id
145
150
  self.region_name = region_name
146
151
  self.state_machine = state_machine
152
+ if isinstance(state_machine, StateMachineVersion):
153
+ self.state_machine_arn = state_machine.source_arn
154
+ self.state_machine_version_arn = state_machine.arn
155
+ else:
156
+ self.state_machine_arn = state_machine.arn
157
+ self.state_machine_version_arn = None
158
+ self.state_machine_alias_arn = state_machine_alias_arn
147
159
  self.start_date = start_date
148
160
  self._cloud_watch_logging_session = cloud_watch_logging_session
149
161
  self.input_data = input_data
@@ -167,7 +179,7 @@ class Execution:
167
179
  def to_describe_output(self) -> DescribeExecutionOutput:
168
180
  describe_output = DescribeExecutionOutput(
169
181
  executionArn=self.exec_arn,
170
- stateMachineArn=self.state_machine.arn,
182
+ stateMachineArn=self.state_machine_arn,
171
183
  name=self.name,
172
184
  status=self.exec_status,
173
185
  startDate=self.start_date,
@@ -183,6 +195,10 @@ class Execution:
183
195
  describe_output["error"] = self.error
184
196
  if self.cause is not None:
185
197
  describe_output["cause"] = self.cause
198
+ if self.state_machine_version_arn is not None:
199
+ describe_output["stateMachineVersionArn"] = self.state_machine_version_arn
200
+ if self.state_machine_alias_arn is not None:
201
+ describe_output["stateMachineAliasArn"] = self.state_machine_alias_arn
186
202
  return describe_output
187
203
 
188
204
  def to_describe_state_machine_for_execution_output(
@@ -231,6 +247,8 @@ class Execution:
231
247
  )
232
248
  if state_machine_version_arn is not None:
233
249
  item["stateMachineVersionArn"] = state_machine_version_arn
250
+ if self.state_machine_alias_arn is not None:
251
+ item["stateMachineAliasArn"] = self.state_machine_alias_arn
234
252
  return item
235
253
 
236
254
  def to_history_output(self) -> GetExecutionHistoryOutput:
@@ -30,6 +30,7 @@ from localstack.services.stepfunctions.asl.eval.event.logging import (
30
30
  from localstack.services.stepfunctions.asl.static_analyser.variable_references_static_analyser import (
31
31
  VariableReferencesStaticAnalyser,
32
32
  )
33
+ from localstack.services.stepfunctions.backend.alias import Alias
33
34
  from localstack.utils.strings import long_uid
34
35
 
35
36
 
@@ -163,6 +164,7 @@ class StateMachineRevision(StateMachineInstance):
163
164
  _next_version_number: int
164
165
  versions: Final[dict[RevisionId, Arn]]
165
166
  tag_manager: Final[TagManager]
167
+ aliases: Final[set[Alias]]
166
168
 
167
169
  def __init__(
168
170
  self,
@@ -194,6 +196,7 @@ class StateMachineRevision(StateMachineInstance):
194
196
  self.tag_manager = TagManager()
195
197
  if tags:
196
198
  self.tag_manager.add_all(tags)
199
+ self.aliases = set()
197
200
 
198
201
  def create_revision(
199
202
  self,
@@ -3,6 +3,7 @@ from typing import Final
3
3
 
4
4
  from localstack.aws.api.stepfunctions import Arn
5
5
  from localstack.services.stepfunctions.backend.activity import Activity
6
+ from localstack.services.stepfunctions.backend.alias import Alias
6
7
  from localstack.services.stepfunctions.backend.execution import Execution
7
8
  from localstack.services.stepfunctions.backend.state_machine import StateMachineInstance
8
9
  from localstack.services.stores import AccountRegionBundle, BaseStore, LocalAttribute
@@ -11,6 +12,8 @@ from localstack.services.stores import AccountRegionBundle, BaseStore, LocalAttr
11
12
  class SFNStore(BaseStore):
12
13
  # Maps ARNs to state machines.
13
14
  state_machines: Final[dict[Arn, StateMachineInstance]] = LocalAttribute(default=dict)
15
+ # Map Alias ARNs to state machine aliases
16
+ aliases: Final[dict[Arn, Alias]] = LocalAttribute(default=dict)
14
17
  # Maps Execution-ARNs to state machines.
15
18
  executions: Final[dict[Arn, Execution]] = LocalAttribute(
16
19
  default=OrderedDict
@@ -9,18 +9,23 @@ from typing import Final, Optional
9
9
  from localstack.aws.api import CommonServiceException, RequestContext
10
10
  from localstack.aws.api.stepfunctions import (
11
11
  ActivityDoesNotExist,
12
+ AliasDescription,
12
13
  Arn,
14
+ CharacterRestrictedName,
13
15
  ConflictException,
14
16
  CreateActivityOutput,
17
+ CreateStateMachineAliasOutput,
15
18
  CreateStateMachineInput,
16
19
  CreateStateMachineOutput,
17
20
  Definition,
18
21
  DeleteActivityOutput,
22
+ DeleteStateMachineAliasOutput,
19
23
  DeleteStateMachineOutput,
20
24
  DeleteStateMachineVersionOutput,
21
25
  DescribeActivityOutput,
22
26
  DescribeExecutionOutput,
23
27
  DescribeMapRunOutput,
28
+ DescribeStateMachineAliasOutput,
24
29
  DescribeStateMachineForExecutionOutput,
25
30
  DescribeStateMachineOutput,
26
31
  EncryptionConfiguration,
@@ -43,6 +48,7 @@ from localstack.aws.api.stepfunctions import (
43
48
  ListExecutionsOutput,
44
49
  ListExecutionsPageToken,
45
50
  ListMapRunsOutput,
51
+ ListStateMachineAliasesOutput,
46
52
  ListStateMachinesOutput,
47
53
  ListStateMachineVersionsOutput,
48
54
  ListTagsForResourceOutput,
@@ -60,6 +66,7 @@ from localstack.aws.api.stepfunctions import (
60
66
  RevealSecrets,
61
67
  ReverseOrder,
62
68
  RevisionId,
69
+ RoutingConfigurationList,
63
70
  SendTaskFailureOutput,
64
71
  SendTaskHeartbeatOutput,
65
72
  SendTaskSuccessOutput,
@@ -68,6 +75,7 @@ from localstack.aws.api.stepfunctions import (
68
75
  SensitiveError,
69
76
  StartExecutionOutput,
70
77
  StartSyncExecutionOutput,
78
+ StateMachineAliasList,
71
79
  StateMachineAlreadyExists,
72
80
  StateMachineDoesNotExist,
73
81
  StateMachineList,
@@ -88,6 +96,7 @@ from localstack.aws.api.stepfunctions import (
88
96
  TracingConfiguration,
89
97
  UntagResourceOutput,
90
98
  UpdateMapRunOutput,
99
+ UpdateStateMachineAliasOutput,
91
100
  UpdateStateMachineOutput,
92
101
  ValidateStateMachineDefinitionDiagnostic,
93
102
  ValidateStateMachineDefinitionDiagnosticList,
@@ -129,6 +138,7 @@ from localstack.services.stepfunctions.asl.static_analyser.usage_metrics_static_
129
138
  UsageMetricsStaticAnalyser,
130
139
  )
131
140
  from localstack.services.stepfunctions.backend.activity import Activity, ActivityTask
141
+ from localstack.services.stepfunctions.backend.alias import Alias
132
142
  from localstack.services.stepfunctions.backend.execution import Execution, SyncExecution
133
143
  from localstack.services.stepfunctions.backend.state_machine import (
134
144
  StateMachineInstance,
@@ -170,7 +180,7 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
170
180
  visitor.visit(sfn_stores)
171
181
 
172
182
  _STATE_MACHINE_ARN_REGEX: Final[re.Pattern] = re.compile(
173
- rf"{ARN_PARTITION_REGEX}:states:[a-z0-9-]+:[0-9]{{12}}:stateMachine:[a-zA-Z0-9-_.]+(:\d+)?$"
183
+ rf"{ARN_PARTITION_REGEX}:states:[a-z0-9-]+:[0-9]{{12}}:stateMachine:[a-zA-Z0-9-_.]+(:\d+)?(:[a-zA-Z0-9-_.]+)*$"
174
184
  )
175
185
 
176
186
  _STATE_MACHINE_EXECUTION_ARN_REGEX: Final[re.Pattern] = re.compile(
@@ -181,6 +191,12 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
181
191
  rf"{ARN_PARTITION_REGEX}:states:[a-z0-9-]+:[0-9]{{12}}:activity:[a-zA-Z0-9-_\.]{{1,80}}$"
182
192
  )
183
193
 
194
+ _ALIAS_ARN_REGEX: Final[re.Pattern] = re.compile(
195
+ rf"{ARN_PARTITION_REGEX}:states:[a-z0-9-]+:[0-9]{{12}}:stateMachine:[A-Za-z0-9_.-]+:[A-Za-z_.-]+[A-Za-z0-9_.-]{{0,80}}$"
196
+ )
197
+
198
+ _ALIAS_NAME_REGEX: Final[re.Pattern] = re.compile(r"^(?=.*[a-zA-Z_\-\.])[a-zA-Z0-9_\-\.]+$")
199
+
184
200
  @staticmethod
185
201
  def _validate_state_machine_arn(state_machine_arn: str) -> None:
186
202
  # TODO: InvalidArn exception message do not communicate which part of the ARN is incorrect.
@@ -203,6 +219,11 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
203
219
  if not StepFunctionsProvider._ACTIVITY_ARN_REGEX.match(activity_arn):
204
220
  raise InvalidArn(f"Invalid arn: '{activity_arn}'")
205
221
 
222
+ @staticmethod
223
+ def _validate_state_machine_alias_arn(state_machine_alias_arn: Arn) -> None:
224
+ if not StepFunctionsProvider._ALIAS_ARN_REGEX.match(state_machine_alias_arn):
225
+ raise InvalidArn(f"Invalid arn: '{state_machine_alias_arn}'")
226
+
206
227
  def _raise_state_machine_type_not_supported(self):
207
228
  raise StateMachineTypeNotSupported(
208
229
  "This operation is not supported by this type of state machine"
@@ -233,6 +254,22 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
233
254
  if char in invalid_chars:
234
255
  raise InvalidName(f"Invalid Name: '{name}'")
235
256
 
257
+ @staticmethod
258
+ def _validate_state_machine_alias_name(name: CharacterRestrictedName) -> None:
259
+ len_name = len(name)
260
+ if len_name > 80:
261
+ raise ValidationException(
262
+ f"1 validation error detected: Value '{name}' at 'name' failed to satisfy constraint: "
263
+ f"Member must have length less than or equal to 80"
264
+ )
265
+ if not StepFunctionsProvider._ALIAS_NAME_REGEX.match(name):
266
+ raise ValidationException(
267
+ # TODO: explore more error cases in which more than one validation error may occur which results
268
+ # in the counter below being greater than 1.
269
+ f"1 validation error detected: Value '{name}' at 'name' failed to satisfy constraint: "
270
+ f"Member must satisfy regular expression pattern: ^(?=.*[a-zA-Z_\\-\\.])[a-zA-Z0-9_\\-\\.]+$"
271
+ )
272
+
236
273
  def _get_execution(self, context: RequestContext, execution_arn: Arn) -> Execution:
237
274
  execution: Optional[Execution] = self.get_store(context).executions.get(execution_arn)
238
275
  if not execution:
@@ -489,6 +526,149 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
489
526
 
490
527
  return create_output
491
528
 
529
+ def _validate_state_machine_alias_routing_configuration(
530
+ self, context: RequestContext, routing_configuration_list: RoutingConfigurationList
531
+ ) -> None:
532
+ # TODO: to match AWS's approach best validation exceptions could be
533
+ # built in a process decoupled from the provider.
534
+
535
+ routing_configuration_list_len = len(routing_configuration_list)
536
+ if not (1 <= routing_configuration_list_len <= 2):
537
+ # Replicate the object string dump format:
538
+ # [RoutingConfigurationListItem(stateMachineVersionArn=arn_no_quotes, weight=int), ...]
539
+ routing_configuration_serialization_parts = []
540
+ for routing_configuration in routing_configuration_list:
541
+ routing_configuration_serialization_parts.append(
542
+ "".join(
543
+ [
544
+ "RoutingConfigurationListItem(stateMachineVersionArn=",
545
+ routing_configuration["stateMachineVersionArn"],
546
+ ", weight=",
547
+ str(routing_configuration["weight"]),
548
+ ")",
549
+ ]
550
+ )
551
+ )
552
+ routing_configuration_serialization_list = (
553
+ f"[{', '.join(routing_configuration_serialization_parts)}]"
554
+ )
555
+ raise ValidationException(
556
+ f"1 validation error detected: Value '{routing_configuration_serialization_list}' "
557
+ "at 'routingConfiguration' failed to "
558
+ "satisfy constraint: Member must have length less than or equal to 2"
559
+ )
560
+
561
+ routing_configuration_arn_list = [
562
+ routing_configuration["stateMachineVersionArn"]
563
+ for routing_configuration in routing_configuration_list
564
+ ]
565
+ if len(set(routing_configuration_arn_list)) < routing_configuration_list_len:
566
+ arn_list_string = f"[{', '.join(routing_configuration_arn_list)}]"
567
+ raise ValidationException(
568
+ "Routing configuration must contain distinct state machine version ARNs. "
569
+ f"Received: {arn_list_string}"
570
+ )
571
+
572
+ routing_weights = [
573
+ routing_configuration["weight"] for routing_configuration in routing_configuration_list
574
+ ]
575
+ for i, weight in enumerate(routing_weights):
576
+ # TODO: check for weight type.
577
+ if weight < 0:
578
+ raise ValidationException(
579
+ f"Invalid value for parameter routingConfiguration[{i + 1}].weight, value: {weight}, valid min value: 0"
580
+ )
581
+ if weight > 100:
582
+ raise ValidationException(
583
+ f"1 validation error detected: Value '{weight}' at 'routingConfiguration.{i + 1}.member.weight' "
584
+ "failed to satisfy constraint: Member must have value less than or equal to 100"
585
+ )
586
+ routing_weights_sum = sum(routing_weights)
587
+ if not routing_weights_sum == 100:
588
+ raise ValidationException(
589
+ f"Sum of routing configuration weights must equal 100. Received: {json.dumps(routing_weights)}"
590
+ )
591
+
592
+ store = self.get_store(context=context)
593
+ state_machines = store.state_machines
594
+
595
+ first_routing_qualified_arn = routing_configuration_arn_list[0]
596
+ shared_state_machine_revision_arn = self._get_state_machine_arn_from_qualified_arn(
597
+ qualified_arn=first_routing_qualified_arn
598
+ )
599
+ for routing_configuration_arn in routing_configuration_arn_list:
600
+ maybe_state_machine_version = state_machines.get(routing_configuration_arn)
601
+ if not isinstance(maybe_state_machine_version, StateMachineVersion):
602
+ arn_list_string = f"[{', '.join(routing_configuration_arn_list)}]"
603
+ raise ValidationException(
604
+ f"Routing configuration must contain state machine version ARNs. Received: {arn_list_string}"
605
+ )
606
+ state_machine_revision_arn = self._get_state_machine_arn_from_qualified_arn(
607
+ qualified_arn=routing_configuration_arn
608
+ )
609
+ if state_machine_revision_arn != shared_state_machine_revision_arn:
610
+ raise ValidationException("TODO")
611
+
612
+ @staticmethod
613
+ def _get_state_machine_arn_from_qualified_arn(qualified_arn: Arn) -> Arn:
614
+ last_colon_index = qualified_arn.rfind(":")
615
+ base_arn = qualified_arn[:last_colon_index]
616
+ return base_arn
617
+
618
+ def create_state_machine_alias(
619
+ self,
620
+ context: RequestContext,
621
+ name: CharacterRestrictedName,
622
+ routing_configuration: RoutingConfigurationList,
623
+ description: AliasDescription = None,
624
+ **kwargs,
625
+ ) -> CreateStateMachineAliasOutput:
626
+ # Validate the inputs.
627
+ self._validate_state_machine_alias_name(name=name)
628
+ self._validate_state_machine_alias_routing_configuration(
629
+ context=context, routing_configuration_list=routing_configuration
630
+ )
631
+
632
+ # Determine the state machine arn this alias maps to,
633
+ # do so unsafely as validation already took place before initialisation.
634
+ first_routing_qualified_arn = routing_configuration[0]["stateMachineVersionArn"]
635
+ state_machine_revision_arn = self._get_state_machine_arn_from_qualified_arn(
636
+ qualified_arn=first_routing_qualified_arn
637
+ )
638
+ alias = Alias(
639
+ state_machine_arn=state_machine_revision_arn,
640
+ name=name,
641
+ description=description,
642
+ routing_configuration_list=routing_configuration,
643
+ )
644
+ state_machine_alias_arn = alias.state_machine_alias_arn
645
+
646
+ store = self.get_store(context=context)
647
+
648
+ aliases = store.aliases
649
+ if maybe_idempotent_alias := aliases.get(state_machine_alias_arn):
650
+ if alias.is_idempotent(maybe_idempotent_alias):
651
+ return CreateStateMachineAliasOutput(
652
+ stateMachineAliasArn=state_machine_alias_arn, creationDate=alias.create_date
653
+ )
654
+ else:
655
+ # CreateStateMachineAlias is an idempotent API. Idempotent requests won’t create duplicate resources.
656
+ raise ConflictException(
657
+ "Failed to create alias because an alias with the same name and a "
658
+ "different routing configuration already exists."
659
+ )
660
+ aliases[state_machine_alias_arn] = alias
661
+
662
+ state_machine_revision = store.state_machines.get(state_machine_revision_arn)
663
+ if not isinstance(state_machine_revision, StateMachineRevision):
664
+ # The state machine was deleted but not the version referenced in this context.
665
+ raise RuntimeError(f"No state machine revision for arn '{state_machine_revision_arn}'")
666
+ state_machine_revision.aliases.add(alias)
667
+
668
+ return CreateStateMachineAliasOutput(
669
+ stateMachineAliasArn=state_machine_alias_arn, creationDate=alias.create_date
670
+ )
671
+
492
672
  def describe_state_machine(
493
673
  self,
494
674
  context: RequestContext,
@@ -502,6 +682,19 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
502
682
  self._raise_state_machine_does_not_exist(state_machine_arn)
503
683
  return state_machine.describe()
504
684
 
685
+ def describe_state_machine_alias(
686
+ self, context: RequestContext, state_machine_alias_arn: Arn, **kwargs
687
+ ) -> DescribeStateMachineAliasOutput:
688
+ self._validate_state_machine_alias_arn(state_machine_alias_arn=state_machine_alias_arn)
689
+ alias: Optional[Alias] = self.get_store(context=context).aliases.get(
690
+ state_machine_alias_arn
691
+ )
692
+ if alias is None:
693
+ # TODO: assemble the correct exception
694
+ raise ValidationException()
695
+ description = alias.to_description()
696
+ return description
697
+
505
698
  def describe_state_machine_for_execution(
506
699
  self,
507
700
  context: RequestContext,
@@ -585,9 +778,14 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
585
778
  **kwargs,
586
779
  ) -> StartExecutionOutput:
587
780
  self._validate_state_machine_arn(state_machine_arn)
588
- unsafe_state_machine: Optional[StateMachineInstance] = self.get_store(
589
- context
590
- ).state_machines.get(state_machine_arn)
781
+
782
+ store = self.get_store(context=context)
783
+
784
+ alias: Optional[Alias] = store.aliases.get(state_machine_arn)
785
+ alias_sample_state_machine_version_arn = alias.sample() if alias is not None else None
786
+ unsafe_state_machine: Optional[StateMachineInstance] = store.state_machines.get(
787
+ alias_sample_state_machine_version_arn or state_machine_arn
788
+ )
591
789
  if not unsafe_state_machine:
592
790
  self._raise_state_machine_does_not_exist(state_machine_arn)
593
791
 
@@ -614,7 +812,7 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
614
812
  # Exhaustive check on STANDARD and EXPRESS type, validated on creation.
615
813
  exec_arn = stepfunctions_express_execution_arn(normalised_state_machine_arn, exec_name)
616
814
 
617
- if execution := self.get_store(context).executions.get(exec_arn):
815
+ if execution := store.executions.get(exec_arn):
618
816
  # Return already running execution if name and input match
619
817
  existing_execution = self._idempotent_start_execution(
620
818
  execution=execution,
@@ -642,6 +840,7 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
642
840
  account_id=context.account_id,
643
841
  region_name=context.region,
644
842
  state_machine=state_machine_clone,
843
+ state_machine_alias_arn=alias.state_machine_alias_arn if alias is not None else None,
645
844
  start_date=datetime.datetime.now(tz=datetime.timezone.utc),
646
845
  cloud_watch_logging_session=cloud_watch_logging_session,
647
846
  input_data=input_data,
@@ -649,7 +848,7 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
649
848
  activity_store=self.get_store(context).activities,
650
849
  )
651
850
 
652
- self.get_store(context).executions[exec_arn] = execution
851
+ store.executions[exec_arn] = execution
653
852
 
654
853
  execution.start()
655
854
  return execution.to_start_output()
@@ -741,9 +940,10 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
741
940
 
742
941
  @staticmethod
743
942
  def _list_execution_filter(
744
- ex: Execution, state_machine_arn: str | None, status_filter: str | None
943
+ ex: Execution, state_machine_arn: str, status_filter: Optional[str]
745
944
  ) -> bool:
746
- if state_machine_arn and ex.state_machine.arn != state_machine_arn:
945
+ state_machine_reference_arn_set = {ex.state_machine_arn, ex.state_machine_version_arn}
946
+ if state_machine_arn not in state_machine_reference_arn_set:
747
947
  return False
748
948
 
749
949
  if not status_filter:
@@ -849,6 +1049,28 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
849
1049
 
850
1050
  return ListStateMachinesOutput(stateMachines=page, nextToken=token_for_next_page)
851
1051
 
1052
+ def list_state_machine_aliases(
1053
+ self,
1054
+ context: RequestContext,
1055
+ state_machine_arn: Arn,
1056
+ next_token: PageToken = None,
1057
+ max_results: PageSize = None,
1058
+ **kwargs,
1059
+ ) -> ListStateMachineAliasesOutput:
1060
+ # TODO: add pagination support.
1061
+ self._validate_state_machine_arn(state_machine_arn)
1062
+ state_machines = self.get_store(context).state_machines
1063
+ state_machine_revision = state_machines.get(state_machine_arn)
1064
+ if not isinstance(state_machine_revision, StateMachineRevision):
1065
+ raise InvalidArn(f"Invalid arn: {state_machine_arn}")
1066
+
1067
+ state_machine_aliases: StateMachineAliasList = list()
1068
+ for alias in state_machine_revision.aliases:
1069
+ state_machine_aliases.append(alias.to_item())
1070
+ state_machine_aliases.sort(key=lambda item: item["creationDate"])
1071
+
1072
+ return ListStateMachineAliasesOutput(stateMachineAliases=state_machine_aliases)
1073
+
852
1074
  def list_state_machine_versions(
853
1075
  self,
854
1076
  context: RequestContext,
@@ -927,18 +1149,54 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
927
1149
  state_machines.pop(version_arn, None)
928
1150
  return DeleteStateMachineOutput()
929
1151
 
1152
+ def delete_state_machine_alias(
1153
+ self, context: RequestContext, state_machine_alias_arn: Arn, **kwargs
1154
+ ) -> DeleteStateMachineAliasOutput:
1155
+ self._validate_state_machine_alias_arn(state_machine_alias_arn=state_machine_alias_arn)
1156
+ store = self.get_store(context=context)
1157
+ aliases = store.aliases
1158
+ if (alias := aliases.pop(state_machine_alias_arn, None)) is not None:
1159
+ state_machines = store.state_machines
1160
+ for routing_configuration in alias.get_routing_configuration_list():
1161
+ state_machine_version_arn = routing_configuration["stateMachineVersionArn"]
1162
+ if (
1163
+ state_machine_version := state_machines.get(state_machine_version_arn)
1164
+ ) is None or not isinstance(state_machine_version, StateMachineVersion):
1165
+ continue
1166
+ if (
1167
+ state_machine_revision := state_machines.get(state_machine_version.source_arn)
1168
+ ) is None or not isinstance(state_machine_revision, StateMachineRevision):
1169
+ continue
1170
+ state_machine_revision.aliases.discard(alias)
1171
+ return DeleteStateMachineOutput()
1172
+
930
1173
  def delete_state_machine_version(
931
1174
  self, context: RequestContext, state_machine_version_arn: LongArn, **kwargs
932
1175
  ) -> DeleteStateMachineVersionOutput:
933
1176
  self._validate_state_machine_arn(state_machine_version_arn)
934
1177
  state_machines = self.get_store(context).state_machines
935
- state_machine_version = state_machines.get(state_machine_version_arn)
936
- if isinstance(state_machine_version, StateMachineVersion):
937
- state_machines.pop(state_machine_version.arn)
938
- state_machine_revision = state_machines.get(state_machine_version.source_arn)
939
- if isinstance(state_machine_revision, StateMachineRevision):
940
- state_machine_revision.delete_version(state_machine_version_arn)
941
1178
 
1179
+ if not (
1180
+ state_machine_version := state_machines.get(state_machine_version_arn)
1181
+ ) or not isinstance(state_machine_version, StateMachineVersion):
1182
+ return DeleteStateMachineVersionOutput()
1183
+
1184
+ if (
1185
+ state_machine_revision := state_machines.get(state_machine_version.source_arn)
1186
+ ) and isinstance(state_machine_revision, StateMachineRevision):
1187
+ referencing_alias_names: list[str] = list()
1188
+ for alias in state_machine_revision.aliases:
1189
+ if alias.is_router_for(state_machine_version_arn=state_machine_version_arn):
1190
+ referencing_alias_names.append(alias.name)
1191
+ if referencing_alias_names:
1192
+ referencing_alias_names_list_body = ", ".join(referencing_alias_names)
1193
+ raise ConflictException(
1194
+ "Version to be deleted must not be referenced by an alias. "
1195
+ f"Current list of aliases referencing this version: [{referencing_alias_names_list_body}]"
1196
+ )
1197
+ state_machine_revision.delete_version(state_machine_version_arn)
1198
+
1199
+ state_machines.pop(state_machine_version.arn, None)
942
1200
  return DeleteStateMachineVersionOutput()
943
1201
 
944
1202
  def stop_execution(
@@ -1018,6 +1276,31 @@ class StepFunctionsProvider(StepfunctionsApi, ServiceLifecycleHook):
1018
1276
  update_output["stateMachineVersionArn"] = version_arn
1019
1277
  return update_output
1020
1278
 
1279
+ def update_state_machine_alias(
1280
+ self,
1281
+ context: RequestContext,
1282
+ state_machine_alias_arn: Arn,
1283
+ description: AliasDescription = None,
1284
+ routing_configuration: RoutingConfigurationList = None,
1285
+ **kwargs,
1286
+ ) -> UpdateStateMachineAliasOutput:
1287
+ self._validate_state_machine_alias_arn(state_machine_alias_arn=state_machine_alias_arn)
1288
+ if not any([description, routing_configuration]):
1289
+ raise MissingRequiredParameter(
1290
+ "Either the description or the RoutingConfiguration must be specified"
1291
+ )
1292
+ if routing_configuration is not None:
1293
+ self._validate_state_machine_alias_routing_configuration(
1294
+ context=context, routing_configuration_list=routing_configuration
1295
+ )
1296
+ store = self.get_store(context=context)
1297
+ alias = store.aliases.get(state_machine_alias_arn)
1298
+ if alias is None:
1299
+ raise ResourceNotFound("Request references a resource that does not exist.")
1300
+
1301
+ alias.update(description=description, routing_configuration_list=routing_configuration)
1302
+ return UpdateStateMachineAliasOutput(updateDate=alias.update_date)
1303
+
1021
1304
  def publish_state_machine_version(
1022
1305
  self,
1023
1306
  context: RequestContext,
@@ -266,6 +266,31 @@ def create_state_machine():
266
266
  LOG.debug("Unable to delete state machine '%s' during cleanup: %s", arn, ex)
267
267
 
268
268
 
269
+ @pytest.fixture
270
+ def create_state_machine_alias():
271
+ state_machine_alias_arn_and_client = list()
272
+
273
+ def _create_state_machine_alias(target_aws_client, **kwargs):
274
+ step_functions_client = target_aws_client.stepfunctions
275
+ create_state_machine_response = step_functions_client.create_state_machine_alias(**kwargs)
276
+ state_machine_alias_arn_and_client.append(
277
+ (create_state_machine_response["stateMachineAliasArn"], step_functions_client)
278
+ )
279
+ return create_state_machine_response
280
+
281
+ yield _create_state_machine_alias
282
+
283
+ for state_machine_alias_arn, sfn_client in state_machine_alias_arn_and_client:
284
+ try:
285
+ sfn_client.delete_state_machine_alias(stateMachineAliasArn=state_machine_alias_arn)
286
+ except Exception as ex:
287
+ LOG.debug(
288
+ "Unable to delete the state machine alias '%s' during cleanup due '%s'",
289
+ state_machine_alias_arn,
290
+ ex,
291
+ )
292
+
293
+
269
294
  @pytest.fixture
270
295
  def create_activity(aws_client):
271
296
  activities_arns: Final[list[str]] = list()
@@ -11,6 +11,7 @@ from localstack_snapshot.snapshots.transformer import (
11
11
  )
12
12
 
13
13
  from localstack.aws.api.stepfunctions import (
14
+ Arn,
14
15
  CloudWatchLogsLogGroup,
15
16
  CreateStateMachineOutput,
16
17
  Definition,
@@ -52,6 +53,51 @@ def await_no_state_machines_listed(stepfunctions_client):
52
53
  LOG.warning("Timed out whilst awaiting for listing to be empty.")
53
54
 
54
55
 
56
+ def _is_state_machine_alias_listed(
57
+ stepfunctions_client, state_machine_arn: Arn, state_machine_alias_arn: Arn
58
+ ):
59
+ list_state_machine_aliases_list = stepfunctions_client.list_state_machine_aliases(
60
+ stateMachineArn=state_machine_arn
61
+ )
62
+ state_machine_aliases = list_state_machine_aliases_list["stateMachineAliases"]
63
+ for state_machine_alias in state_machine_aliases:
64
+ if state_machine_alias["stateMachineAliasArn"] == state_machine_alias_arn:
65
+ return True
66
+ return False
67
+
68
+
69
+ def await_state_machine_alias_is_created(
70
+ stepfunctions_client, state_machine_arn: Arn, state_machine_alias_arn: Arn
71
+ ):
72
+ success = poll_condition(
73
+ condition=lambda: _is_state_machine_alias_listed(
74
+ stepfunctions_client=stepfunctions_client,
75
+ state_machine_arn=state_machine_arn,
76
+ state_machine_alias_arn=state_machine_alias_arn,
77
+ ),
78
+ timeout=_DELETION_TIMEOUT_SECS,
79
+ interval=1,
80
+ )
81
+ if not success:
82
+ LOG.warning("Timed out whilst awaiting for listing to be empty.")
83
+
84
+
85
+ def await_state_machine_alias_is_deleted(
86
+ stepfunctions_client, state_machine_arn: Arn, state_machine_alias_arn: Arn
87
+ ):
88
+ success = poll_condition(
89
+ condition=lambda: not _is_state_machine_alias_listed(
90
+ stepfunctions_client=stepfunctions_client,
91
+ state_machine_arn=state_machine_arn,
92
+ state_machine_alias_arn=state_machine_alias_arn,
93
+ ),
94
+ timeout=_DELETION_TIMEOUT_SECS,
95
+ interval=1,
96
+ )
97
+ if not success:
98
+ LOG.warning("Timed out whilst awaiting for listing to be empty.")
99
+
100
+
55
101
  def _is_state_machine_listed(stepfunctions_client, state_machine_arn: str) -> bool:
56
102
  lst_resp = stepfunctions_client.list_state_machines()
57
103
  state_machines = lst_resp["stateMachines"]
localstack/version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '4.2.1.dev30'
21
- __version_tuple__ = version_tuple = (4, 2, 1, 'dev30')
20
+ __version__ = version = '4.2.1.dev32'
21
+ __version_tuple__ = version_tuple = (4, 2, 1, 'dev32')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: localstack-core
3
- Version: 4.2.1.dev30
3
+ Version: 4.2.1.dev32
4
4
  Summary: The core library and runtime of LocalStack
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  Project-URL: Homepage, https://localstack.cloud
@@ -3,7 +3,7 @@ localstack/constants.py,sha256=bBh6djh4x37MrS8az8LizX_APMZ56XdtJHCnZdOnmeg,6867
3
3
  localstack/deprecations.py,sha256=t3zeaZaHhKYM8snP1wRZhpvAy6MbB12Vqv5hK78bwJ0,15162
4
4
  localstack/openapi.yaml,sha256=B803NmpwsxG8PHpHrdZYBrUYjnrRh7B_JX0XuNynuFs,30237
5
5
  localstack/plugins.py,sha256=BIJC9dlo0WbP7lLKkCiGtd_2q5oeqiHZohvoRTcejXM,2457
6
- localstack/version.py,sha256=Zk00NZ6u2EglXZlIbK4vJFuhyKgxNo7XvMY7uWFNvsk,526
6
+ localstack/version.py,sha256=JRHPMbyiA088IDEhD4sLuChInljVA_mJbhllSeP2iP0,526
7
7
  localstack/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  localstack/aws/accounts.py,sha256=102zpGowOxo0S6UGMpfjw14QW7WCLVAGsnFK5xFMLoo,3043
9
9
  localstack/aws/app.py,sha256=n9bJCfJRuMz_gLGAH430c3bIQXgUXeWO5NPfcdL2MV8,5145
@@ -773,7 +773,7 @@ localstack/services/ssm/resource_providers/aws_ssm_patchbaseline_plugin.py,sha25
773
773
  localstack/services/stepfunctions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
774
774
  localstack/services/stepfunctions/packages.py,sha256=RZblddr9VARCXqtCeFn_Z6FmyLerWP1-REkJ-spi1Ko,1705
775
775
  localstack/services/stepfunctions/plugins.py,sha256=oY-qlTgrZHUalqoeIV4v9mkpC5cpMRUN_PX4YMPFMMI,324
776
- localstack/services/stepfunctions/provider.py,sha256=0qyU50oxhOlepYWjYlv55y1CjVdG5NWzvEYukBcZfhI,54333
776
+ localstack/services/stepfunctions/provider.py,sha256=aFF2qiPfs2XPJ9kpadXnzA6CFtO4gtY6kPEe8iVUHqI,68265
777
777
  localstack/services/stepfunctions/quotas.py,sha256=FprfsAD-_IziguWQnR-b3VA7QYhFdQzItuMLOwl9_FU,484
778
778
  localstack/services/stepfunctions/stepfunctions_utils.py,sha256=rjKEMskaei3kjYXyIudJ6S3nWdctylendnWxwByAHIw,2351
779
779
  localstack/services/stepfunctions/usage.py,sha256=7qhSca9456MNv76tuH-YYjrjlcvHk9y83gdhMPzs0mk,800
@@ -1103,11 +1103,12 @@ localstack/services/stepfunctions/asl/utils/encoding.py,sha256=51Or_Y09NKZ_BKDxY
1103
1103
  localstack/services/stepfunctions/asl/utils/json_path.py,sha256=gUlsKZUati_XLoXnm6tdOQ2ym_UBjLDHWhLlkfi9xE4,1667
1104
1104
  localstack/services/stepfunctions/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1105
1105
  localstack/services/stepfunctions/backend/activity.py,sha256=O0mPxXtSSg04-enVIL7e62qB4PYwiidoy0NymHOc9Dk,1371
1106
- localstack/services/stepfunctions/backend/execution.py,sha256=ygTt5yOL_DoQ6I-4rakZP-1fhwASUGWMzw_4_1WSDuw,15615
1106
+ localstack/services/stepfunctions/backend/alias.py,sha256=_L_jFYQCW9-uRq0qiQ_KHcib9cgX0JYA22-brFAkaf4,4347
1107
+ localstack/services/stepfunctions/backend/execution.py,sha256=syWOUUKdM2F4wrsR8YHpZwM1TfulB06pi8xLaoPNdx4,16576
1107
1108
  localstack/services/stepfunctions/backend/execution_worker.py,sha256=WEC7QzsS87zMestESVg5LdXJYHrqV9hqcef_RAkGW74,4910
1108
1109
  localstack/services/stepfunctions/backend/execution_worker_comm.py,sha256=61yq2i_KAPFZj-f6kd5TETR0VT2xkOLmaOUkwxnuIvw,387
1109
- localstack/services/stepfunctions/backend/state_machine.py,sha256=UHaSs8mdsRoVhk-SX6f5aEm3XepxzeeQOANiZs9-EhY,9455
1110
- localstack/services/stepfunctions/backend/store.py,sha256=VU_oXRszNs6gU_fXr5wQHuou238f9QWHse2dOtCq3QU,947
1110
+ localstack/services/stepfunctions/backend/state_machine.py,sha256=14KdKg6ugJoVrrbH5X47uUh3tODtWdWc5_MWX5Qc_vs,9581
1111
+ localstack/services/stepfunctions/backend/store.py,sha256=eslh4iDAyXzBqZ0cN40GVQKdAzh1I0Sp-Jf8K2upk6o,1127
1111
1112
  localstack/services/stepfunctions/backend/test_state/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1112
1113
  localstack/services/stepfunctions/backend/test_state/execution.py,sha256=LPhZZqtWDbzucmeBqv4CrSF4rnERBnbtG4zZWhtCkxs,5359
1113
1114
  localstack/services/stepfunctions/backend/test_state/execution_worker.py,sha256=aVUEriNB9GwU4nG5VE2PsSBbxQfMFq_4Xu4ZfkvaT0Y,2222
@@ -1159,8 +1160,8 @@ localstack/testing/pytest/path_filter.py,sha256=U1V5qy23H7yZ6Tznr-MdveeH7TvCM_u4
1159
1160
  localstack/testing/pytest/util.py,sha256=TQAAb_Cj5gTSX0VkenAbSabvyCkl7THxEj70PrT_H7Y,941
1160
1161
  localstack/testing/pytest/validation_tracking.py,sha256=f8AjyKZl_f9cfr0KI0op-QubKqYze1PrvsJfY-AvofI,5000
1161
1162
  localstack/testing/pytest/stepfunctions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1162
- localstack/testing/pytest/stepfunctions/fixtures.py,sha256=Ya6Oq5vZAB2QGfyPzse7SXcqDDGstj2VCeOBF6K_hSs,30973
1163
- localstack/testing/pytest/stepfunctions/utils.py,sha256=EIuVBeYWc30vTIME9ek7zS4IKseXJ_YdY_NNpJFBc_c,25733
1163
+ localstack/testing/pytest/stepfunctions/fixtures.py,sha256=Q_MM9WRjlp_hOvB3Xlum1qZ0crCcq-7_P6nNjbTg8I0,31951
1164
+ localstack/testing/pytest/stepfunctions/utils.py,sha256=xr7lccNtvgeJrn7K7seqAHNZpLiATcEpfslpAUGol-U,27362
1164
1165
  localstack/testing/scenario/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1165
1166
  localstack/testing/scenario/cdk_lambda_helper.py,sha256=FdFDOTykrtqfP_FRJftijkUjwMbIY-DL9ovAtQwPBb4,8609
1166
1167
  localstack/testing/scenario/provisioning.py,sha256=yo8E-fyspL6gG_46yZhmNce9nryf1oSZ4CiXteJMY14,18527
@@ -1258,13 +1259,13 @@ localstack/utils/server/tcp_proxy.py,sha256=rR6d5jR0ozDvIlpHiqW0cfyY9a2fRGdOzyA8
1258
1259
  localstack/utils/xray/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1259
1260
  localstack/utils/xray/trace_header.py,sha256=ahXk9eonq7LpeENwlqUEPj3jDOCiVRixhntQuxNor-Q,6209
1260
1261
  localstack/utils/xray/traceid.py,sha256=SQSsMV2rhbTNK6ceIoozZYuGU7Fg687EXcgqxoDl1Fw,1106
1261
- localstack_core-4.2.1.dev30.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1262
- localstack_core-4.2.1.dev30.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1263
- localstack_core-4.2.1.dev30.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1264
- localstack_core-4.2.1.dev30.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1265
- localstack_core-4.2.1.dev30.dist-info/METADATA,sha256=n1X7Il0atPJforxFYx9FIgqvhxEPoqlUbEP8DgR3ntY,5481
1266
- localstack_core-4.2.1.dev30.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1267
- localstack_core-4.2.1.dev30.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1268
- localstack_core-4.2.1.dev30.dist-info/plux.json,sha256=CLDjnm6HXERYgf2pqFtlg4ASPsGE5M_f9M3CUSnYHM0,20710
1269
- localstack_core-4.2.1.dev30.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1270
- localstack_core-4.2.1.dev30.dist-info/RECORD,,
1262
+ localstack_core-4.2.1.dev32.data/scripts/localstack,sha256=WyL11vp5CkuP79iIR-L8XT7Cj8nvmxX7XRAgxhbmXNE,529
1263
+ localstack_core-4.2.1.dev32.data/scripts/localstack-supervisor,sha256=nm1Il2d6ASyOB6Vo4CRHd90w7TK9FdRl9VPp0NN6hUk,6378
1264
+ localstack_core-4.2.1.dev32.data/scripts/localstack.bat,sha256=tlzZTXtveHkMX_s_fa7VDfvdNdS8iVpEz2ER3uk9B_c,29
1265
+ localstack_core-4.2.1.dev32.dist-info/LICENSE.txt,sha256=3PC-9Z69UsNARuQ980gNR_JsLx8uvMjdG6C7cc4LBYs,606
1266
+ localstack_core-4.2.1.dev32.dist-info/METADATA,sha256=s_g_eV5JKjqZq6q0-ulyc-Ocg_uytB1g-4snSZMJVSA,5481
1267
+ localstack_core-4.2.1.dev32.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
1268
+ localstack_core-4.2.1.dev32.dist-info/entry_points.txt,sha256=JSxo5YPv4XEemz1lJfLl6xIDDPhN9cSwEDywSfPTrTc,20489
1269
+ localstack_core-4.2.1.dev32.dist-info/plux.json,sha256=E3OGcOUOBPqzgQGTIOh643h8fuVOoaJckyxGOnarrM0,20710
1270
+ localstack_core-4.2.1.dev32.dist-info/top_level.txt,sha256=3sqmK2lGac8nCy8nwsbS5SpIY_izmtWtgaTFKHYVHbI,11
1271
+ localstack_core-4.2.1.dev32.dist-info/RECORD,,
@@ -0,0 +1 @@
1
+ {"localstack.cloudformation.resource_providers": ["AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "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::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::CloudFormation::Stack=localstack.services.cloudformation.resource_providers.aws_cloudformation_stack_plugin:CloudFormationStackProviderPlugin", "AWS::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SQS::QueuePolicy=localstack.services.sqs.resource_providers.aws_sqs_queuepolicy_plugin:SQSQueuePolicyProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "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::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "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::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "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::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "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::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::Kinesis::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "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::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin"], "localstack.hooks.on_infra_shutdown": ["aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics", "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", "stop_server=localstack.dns.plugins:stop_server", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.hooks.on_infra_start": ["delete_cached_certificate=localstack.plugins:delete_cached_certificate", "deprecation_warnings=localstack.plugins:deprecation_warnings", "_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "_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", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "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", "register_cloudformation_deploy_ui=localstack.services.cloudformation.plugins:register_cloudformation_deploy_ui", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start"], "localstack.packages": ["kinesis-mock/community=localstack.services.kinesis.plugins:kinesismock_package", "vosk/community=localstack.services.transcribe.plugins:vosk_package", "lambda-java-libs/community=localstack.services.lambda_.plugins:lambda_java_libs", "lambda-runtime/community=localstack.services.lambda_.plugins:lambda_runtime_package", "ffmpeg/community=localstack.packages.plugins:ffmpeg_package", "java/community=localstack.packages.plugins:java_package", "terraform/community=localstack.packages.plugins:terraform_package", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "jpype-jsonata/community=localstack.services.stepfunctions.plugins:jpype_jsonata_package", "dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_package"], "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"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"]}
@@ -1 +0,0 @@
1
- {"localstack.packages": ["dynamodb-local/community=localstack.services.dynamodb.plugins:dynamodb_local_package", "vosk/community=localstack.services.transcribe.plugins:vosk_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", "opensearch/community=localstack.services.opensearch.plugins:opensearch_package", "elasticsearch/community=localstack.services.es.plugins:elasticsearch_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"], "localstack.cloudformation.resource_providers": ["AWS::EC2::SecurityGroup=localstack.services.ec2.resource_providers.aws_ec2_securitygroup_plugin:EC2SecurityGroupProviderPlugin", "AWS::ApiGateway::RestApi=localstack.services.apigateway.resource_providers.aws_apigateway_restapi_plugin:ApiGatewayRestApiProviderPlugin", "AWS::IAM::ManagedPolicy=localstack.services.iam.resource_providers.aws_iam_managedpolicy_plugin:IAMManagedPolicyProviderPlugin", "AWS::EC2::InternetGateway=localstack.services.ec2.resource_providers.aws_ec2_internetgateway_plugin:EC2InternetGatewayProviderPlugin", "AWS::ApiGateway::Deployment=localstack.services.apigateway.resource_providers.aws_apigateway_deployment_plugin:ApiGatewayDeploymentProviderPlugin", "AWS::CloudFormation::WaitConditionHandle=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitconditionhandle_plugin:CloudFormationWaitConditionHandleProviderPlugin", "AWS::OpenSearchService::Domain=localstack.services.opensearch.resource_providers.aws_opensearchservice_domain_plugin:OpenSearchServiceDomainProviderPlugin", "AWS::Lambda::Version=localstack.services.lambda_.resource_providers.aws_lambda_version_plugin:LambdaVersionProviderPlugin", "AWS::EC2::Route=localstack.services.ec2.resource_providers.aws_ec2_route_plugin:EC2RouteProviderPlugin", "AWS::EC2::TransitGateway=localstack.services.ec2.resource_providers.aws_ec2_transitgateway_plugin:EC2TransitGatewayProviderPlugin", "AWS::SNS::Subscription=localstack.services.sns.resource_providers.aws_sns_subscription_plugin:SNSSubscriptionProviderPlugin", "AWS::EC2::NetworkAcl=localstack.services.ec2.resource_providers.aws_ec2_networkacl_plugin:EC2NetworkAclProviderPlugin", "AWS::SQS::Queue=localstack.services.sqs.resource_providers.aws_sqs_queue_plugin:SQSQueueProviderPlugin", "AWS::IAM::Policy=localstack.services.iam.resource_providers.aws_iam_policy_plugin:IAMPolicyProviderPlugin", "AWS::ApiGateway::RequestValidator=localstack.services.apigateway.resource_providers.aws_apigateway_requestvalidator_plugin:ApiGatewayRequestValidatorProviderPlugin", "AWS::Logs::LogStream=localstack.services.logs.resource_providers.aws_logs_logstream_plugin:LogsLogStreamProviderPlugin", "AWS::Lambda::LayerVersion=localstack.services.lambda_.resource_providers.aws_lambda_layerversion_plugin:LambdaLayerVersionProviderPlugin", "AWS::ApiGateway::Method=localstack.services.apigateway.resource_providers.aws_apigateway_method_plugin:ApiGatewayMethodProviderPlugin", "AWS::ApiGateway::DomainName=localstack.services.apigateway.resource_providers.aws_apigateway_domainname_plugin:ApiGatewayDomainNameProviderPlugin", "AWS::EC2::SubnetRouteTableAssociation=localstack.services.ec2.resource_providers.aws_ec2_subnetroutetableassociation_plugin:EC2SubnetRouteTableAssociationProviderPlugin", "AWS::SSM::MaintenanceWindow=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindow_plugin:SSMMaintenanceWindowProviderPlugin", "AWS::SSM::MaintenanceWindowTask=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtask_plugin:SSMMaintenanceWindowTaskProviderPlugin", "AWS::ApiGateway::BasePathMapping=localstack.services.apigateway.resource_providers.aws_apigateway_basepathmapping_plugin:ApiGatewayBasePathMappingProviderPlugin", "AWS::Lambda::LayerVersionPermission=localstack.services.lambda_.resource_providers.aws_lambda_layerversionpermission_plugin:LambdaLayerVersionPermissionProviderPlugin", "AWS::Events::Connection=localstack.services.events.resource_providers.aws_events_connection_plugin:EventsConnectionProviderPlugin", "AWS::SSM::Parameter=localstack.services.ssm.resource_providers.aws_ssm_parameter_plugin:SSMParameterProviderPlugin", "AWS::DynamoDB::GlobalTable=localstack.services.dynamodb.resource_providers.aws_dynamodb_globaltable_plugin:DynamoDBGlobalTableProviderPlugin", "AWS::CloudWatch::Alarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_alarm_plugin:CloudWatchAlarmProviderPlugin", "AWS::IAM::AccessKey=localstack.services.iam.resource_providers.aws_iam_accesskey_plugin:IAMAccessKeyProviderPlugin", "AWS::EC2::Subnet=localstack.services.ec2.resource_providers.aws_ec2_subnet_plugin:EC2SubnetProviderPlugin", "AWS::ApiGateway::UsagePlan=localstack.services.apigateway.resource_providers.aws_apigateway_usageplan_plugin:ApiGatewayUsagePlanProviderPlugin", "AWS::ApiGateway::Model=localstack.services.apigateway.resource_providers.aws_apigateway_model_plugin:ApiGatewayModelProviderPlugin", "AWS::Lambda::Function=localstack.services.lambda_.resource_providers.aws_lambda_function_plugin:LambdaFunctionProviderPlugin", "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::StreamConsumer=localstack.services.kinesis.resource_providers.aws_kinesis_streamconsumer_plugin:KinesisStreamConsumerProviderPlugin", "AWS::Route53::RecordSet=localstack.services.route53.resource_providers.aws_route53_recordset_plugin:Route53RecordSetProviderPlugin", "AWS::IAM::InstanceProfile=localstack.services.iam.resource_providers.aws_iam_instanceprofile_plugin:IAMInstanceProfileProviderPlugin", "AWS::Elasticsearch::Domain=localstack.services.opensearch.resource_providers.aws_elasticsearch_domain_plugin:ElasticsearchDomainProviderPlugin", "AWS::Events::EventBus=localstack.services.events.resource_providers.aws_events_eventbus_plugin:EventsEventBusProviderPlugin", "AWS::CloudWatch::CompositeAlarm=localstack.services.cloudwatch.resource_providers.aws_cloudwatch_compositealarm_plugin:CloudWatchCompositeAlarmProviderPlugin", "AWS::StepFunctions::StateMachine=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_statemachine_plugin:StepFunctionsStateMachineProviderPlugin", "AWS::CDK::Metadata=localstack.services.cdk.resource_providers.cdk_metadata_plugin:LambdaAliasProviderPlugin", "AWS::S3::BucketPolicy=localstack.services.s3.resource_providers.aws_s3_bucketpolicy_plugin:S3BucketPolicyProviderPlugin", "AWS::ApiGateway::Account=localstack.services.apigateway.resource_providers.aws_apigateway_account_plugin:ApiGatewayAccountProviderPlugin", "AWS::Events::Rule=localstack.services.events.resource_providers.aws_events_rule_plugin:EventsRuleProviderPlugin", "AWS::IAM::ServerCertificate=localstack.services.iam.resource_providers.aws_iam_servercertificate_plugin:IAMServerCertificateProviderPlugin", "AWS::Events::EventBusPolicy=localstack.services.events.resource_providers.aws_events_eventbuspolicy_plugin:EventsEventBusPolicyProviderPlugin", "AWS::IAM::Group=localstack.services.iam.resource_providers.aws_iam_group_plugin:IAMGroupProviderPlugin", "AWS::KinesisFirehose::DeliveryStream=localstack.services.kinesisfirehose.resource_providers.aws_kinesisfirehose_deliverystream_plugin:KinesisFirehoseDeliveryStreamProviderPlugin", "AWS::EC2::PrefixList=localstack.services.ec2.resource_providers.aws_ec2_prefixlist_plugin:EC2PrefixListProviderPlugin", "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::DynamoDB::Table=localstack.services.dynamodb.resource_providers.aws_dynamodb_table_plugin:DynamoDBTableProviderPlugin", "AWS::CloudFormation::Macro=localstack.services.cloudformation.resource_providers.aws_cloudformation_macro_plugin:CloudFormationMacroProviderPlugin", "AWS::Scheduler::ScheduleGroup=localstack.services.scheduler.resource_providers.aws_scheduler_schedulegroup_plugin:SchedulerScheduleGroupProviderPlugin", "AWS::Logs::LogGroup=localstack.services.logs.resource_providers.aws_logs_loggroup_plugin:LogsLogGroupProviderPlugin", "AWS::Events::ApiDestination=localstack.services.events.resource_providers.aws_events_apidestination_plugin:EventsApiDestinationProviderPlugin", "AWS::SecretsManager::RotationSchedule=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_rotationschedule_plugin:SecretsManagerRotationScheduleProviderPlugin", "AWS::CloudFormation::WaitCondition=localstack.services.cloudformation.resource_providers.aws_cloudformation_waitcondition_plugin:CloudFormationWaitConditionProviderPlugin", "AWS::Logs::SubscriptionFilter=localstack.services.logs.resource_providers.aws_logs_subscriptionfilter_plugin:LogsSubscriptionFilterProviderPlugin", "AWS::EC2::TransitGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_transitgatewayattachment_plugin:EC2TransitGatewayAttachmentProviderPlugin", "AWS::ApiGateway::ApiKey=localstack.services.apigateway.resource_providers.aws_apigateway_apikey_plugin:ApiGatewayApiKeyProviderPlugin", "AWS::EC2::NatGateway=localstack.services.ec2.resource_providers.aws_ec2_natgateway_plugin:EC2NatGatewayProviderPlugin", "AWS::Kinesis::Stream=localstack.services.kinesis.resource_providers.aws_kinesis_stream_plugin:KinesisStreamProviderPlugin", "AWS::Lambda::CodeSigningConfig=localstack.services.lambda_.resource_providers.aws_lambda_codesigningconfig_plugin:LambdaCodeSigningConfigProviderPlugin", "AWS::EC2::Instance=localstack.services.ec2.resource_providers.aws_ec2_instance_plugin:EC2InstanceProviderPlugin", "AWS::Lambda::Alias=localstack.services.lambda_.resource_providers.lambda_alias_plugin:LambdaAliasProviderPlugin", "AWS::Lambda::Url=localstack.services.lambda_.resource_providers.aws_lambda_url_plugin:LambdaUrlProviderPlugin", "AWS::CertificateManager::Certificate=localstack.services.certificatemanager.resource_providers.aws_certificatemanager_certificate_plugin:CertificateManagerCertificateProviderPlugin", "AWS::Route53::HealthCheck=localstack.services.route53.resource_providers.aws_route53_healthcheck_plugin:Route53HealthCheckProviderPlugin", "AWS::ApiGateway::UsagePlanKey=localstack.services.apigateway.resource_providers.aws_apigateway_usageplankey_plugin:ApiGatewayUsagePlanKeyProviderPlugin", "AWS::EC2::VPC=localstack.services.ec2.resource_providers.aws_ec2_vpc_plugin:EC2VPCProviderPlugin", "AWS::SecretsManager::Secret=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secret_plugin:SecretsManagerSecretProviderPlugin", "AWS::EC2::KeyPair=localstack.services.ec2.resource_providers.aws_ec2_keypair_plugin:EC2KeyPairProviderPlugin", "AWS::StepFunctions::Activity=localstack.services.stepfunctions.resource_providers.aws_stepfunctions_activity_plugin:StepFunctionsActivityProviderPlugin", "AWS::ECR::Repository=localstack.services.ecr.resource_providers.aws_ecr_repository_plugin:ECRRepositoryProviderPlugin", "AWS::SNS::TopicPolicy=localstack.services.sns.resource_providers.aws_sns_topicpolicy_plugin:SNSTopicPolicyProviderPlugin", "AWS::ApiGateway::Resource=localstack.services.apigateway.resource_providers.aws_apigateway_resource_plugin:ApiGatewayResourceProviderPlugin", "AWS::SNS::Topic=localstack.services.sns.resource_providers.aws_sns_topic_plugin:SNSTopicProviderPlugin", "AWS::Lambda::EventSourceMapping=localstack.services.lambda_.resource_providers.aws_lambda_eventsourcemapping_plugin:LambdaEventSourceMappingProviderPlugin", "AWS::Lambda::Permission=localstack.services.lambda_.resource_providers.aws_lambda_permission_plugin:LambdaPermissionProviderPlugin", "AWS::SES::EmailIdentity=localstack.services.ses.resource_providers.aws_ses_emailidentity_plugin:SESEmailIdentityProviderPlugin", "AWS::Scheduler::Schedule=localstack.services.scheduler.resource_providers.aws_scheduler_schedule_plugin:SchedulerScheduleProviderPlugin", "AWS::SecretsManager::SecretTargetAttachment=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_secrettargetattachment_plugin:SecretsManagerSecretTargetAttachmentProviderPlugin", "AWS::ApiGateway::Stage=localstack.services.apigateway.resource_providers.aws_apigateway_stage_plugin:ApiGatewayStageProviderPlugin", "AWS::SecretsManager::ResourcePolicy=localstack.services.secretsmanager.resource_providers.aws_secretsmanager_resourcepolicy_plugin:SecretsManagerResourcePolicyProviderPlugin", "AWS::KMS::Alias=localstack.services.kms.resource_providers.aws_kms_alias_plugin:KMSAliasProviderPlugin", "AWS::EC2::DHCPOptions=localstack.services.ec2.resource_providers.aws_ec2_dhcpoptions_plugin:EC2DHCPOptionsProviderPlugin", "AWS::Lambda::EventInvokeConfig=localstack.services.lambda_.resource_providers.aws_lambda_eventinvokeconfig_plugin:LambdaEventInvokeConfigProviderPlugin", "AWS::Redshift::Cluster=localstack.services.redshift.resource_providers.aws_redshift_cluster_plugin:RedshiftClusterProviderPlugin", "AWS::ResourceGroups::Group=localstack.services.resource_groups.resource_providers.aws_resourcegroups_group_plugin:ResourceGroupsGroupProviderPlugin", "AWS::EC2::VPCGatewayAttachment=localstack.services.ec2.resource_providers.aws_ec2_vpcgatewayattachment_plugin:EC2VPCGatewayAttachmentProviderPlugin", "AWS::IAM::Role=localstack.services.iam.resource_providers.aws_iam_role_plugin:IAMRoleProviderPlugin", "AWS::IAM::User=localstack.services.iam.resource_providers.aws_iam_user_plugin:IAMUserProviderPlugin", "AWS::KMS::Key=localstack.services.kms.resource_providers.aws_kms_key_plugin:KMSKeyProviderPlugin", "AWS::IAM::ServiceLinkedRole=localstack.services.iam.resource_providers.aws_iam_servicelinkedrole_plugin:IAMServiceLinkedRoleProviderPlugin", "AWS::ApiGateway::GatewayResponse=localstack.services.apigateway.resource_providers.aws_apigateway_gatewayresponse_plugin:ApiGatewayGatewayResponseProviderPlugin", "AWS::S3::Bucket=localstack.services.s3.resource_providers.aws_s3_bucket_plugin:S3BucketProviderPlugin", "AWS::SSM::MaintenanceWindowTarget=localstack.services.ssm.resource_providers.aws_ssm_maintenancewindowtarget_plugin:SSMMaintenanceWindowTargetProviderPlugin", "AWS::EC2::VPCEndpoint=localstack.services.ec2.resource_providers.aws_ec2_vpcendpoint_plugin:EC2VPCEndpointProviderPlugin"], "localstack.aws.provider": ["acm:default=localstack.services.providers:acm", "apigateway:default=localstack.services.providers:apigateway", "apigateway:legacy=localstack.services.providers:apigateway_legacy", "apigateway:next_gen=localstack.services.providers:apigateway_next_gen", "config:default=localstack.services.providers:awsconfig", "cloudformation:default=localstack.services.providers:cloudformation", "cloudwatch:default=localstack.services.providers:cloudwatch", "cloudwatch:v1=localstack.services.providers:cloudwatch_v1", "cloudwatch:v2=localstack.services.providers:cloudwatch_v2", "dynamodb:default=localstack.services.providers:dynamodb", "dynamodb:v2=localstack.services.providers:dynamodb_v2", "dynamodbstreams:default=localstack.services.providers:dynamodbstreams", "dynamodbstreams:v2=localstack.services.providers:dynamodbstreams_v2", "ec2:default=localstack.services.providers:ec2", "es:default=localstack.services.providers:es", "events:default=localstack.services.providers:events", "events:legacy=localstack.services.providers:events_legacy", "events:v1=localstack.services.providers:events_v1", "events:v2=localstack.services.providers:events_v2", "firehose:default=localstack.services.providers:firehose", "iam:default=localstack.services.providers:iam", "kinesis:default=localstack.services.providers:kinesis", "kms:default=localstack.services.providers:kms", "lambda:default=localstack.services.providers:lambda_", "lambda:asf=localstack.services.providers:lambda_asf", "lambda:v2=localstack.services.providers:lambda_v2", "logs:default=localstack.services.providers:logs", "opensearch:default=localstack.services.providers:opensearch", "redshift:default=localstack.services.providers:redshift", "resource-groups:default=localstack.services.providers:resource_groups", "resourcegroupstaggingapi:default=localstack.services.providers:resourcegroupstaggingapi", "route53:default=localstack.services.providers:route53", "route53resolver:default=localstack.services.providers:route53resolver", "s3:default=localstack.services.providers:s3", "s3control:default=localstack.services.providers:s3control", "scheduler:default=localstack.services.providers:scheduler", "secretsmanager:default=localstack.services.providers:secretsmanager", "ses:default=localstack.services.providers:ses", "sns:default=localstack.services.providers:sns", "sqs:default=localstack.services.providers:sqs", "ssm:default=localstack.services.providers:ssm", "stepfunctions:default=localstack.services.providers:stepfunctions", "stepfunctions:v2=localstack.services.providers:stepfunctions_v2", "sts:default=localstack.services.providers:sts", "support:default=localstack.services.providers:support", "swf:default=localstack.services.providers:swf", "transcribe:default=localstack.services.providers:transcribe"], "localstack.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", "stop_server=localstack.dns.plugins:stop_server", "_run_init_scripts_on_shutdown=localstack.runtime.init:_run_init_scripts_on_shutdown", "remove_custom_endpoints=localstack.services.lambda_.plugins:remove_custom_endpoints", "aggregate_and_send=localstack.utils.analytics.usage:aggregate_and_send", "publish_metrics=localstack.utils.analytics.metrics:publish_metrics"], "localstack.hooks.on_infra_start": ["_publish_config_as_analytics_event=localstack.runtime.analytics:_publish_config_as_analytics_event", "_publish_container_info=localstack.runtime.analytics:_publish_container_info", "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", "register_swagger_endpoints=localstack.http.resources.swagger.plugins:register_swagger_endpoints", "setup_dns_configuration_on_host=localstack.dns.plugins:setup_dns_configuration_on_host", "start_dns_server=localstack.dns.plugins:start_dns_server", "_run_init_scripts_on_start=localstack.runtime.init:_run_init_scripts_on_start", "register_custom_endpoints=localstack.services.lambda_.plugins:register_custom_endpoints", "validate_configuration=localstack.services.lambda_.plugins:validate_configuration", "apply_runtime_patches=localstack.runtime.patches:apply_runtime_patches", "apply_aws_runtime_patches=localstack.aws.patches:apply_aws_runtime_patches", "_patch_botocore_endpoint_in_memory=localstack.aws.client:_patch_botocore_endpoint_in_memory", "_patch_botocore_json_parser=localstack.aws.client:_patch_botocore_json_parser", "_patch_cbor2=localstack.aws.client:_patch_cbor2", "conditionally_enable_debugger=localstack.dev.debugger.plugins:conditionally_enable_debugger"], "localstack.openapi.spec": ["localstack=localstack.plugins:CoreOASPlugin"], "localstack.runtime.server": ["hypercorn=localstack.runtime.server.plugins:HypercornRuntimeServerPlugin", "twisted=localstack.runtime.server.plugins:TwistedRuntimeServerPlugin"], "localstack.init.runner": ["py=localstack.runtime.init:PythonScriptRunner", "sh=localstack.runtime.init:ShellScriptRunner"], "localstack.hooks.on_infra_ready": ["_run_init_scripts_on_ready=localstack.runtime.init:_run_init_scripts_on_ready"], "localstack.hooks.configure_localstack_container": ["_mount_machine_file=localstack.utils.analytics.metadata:_mount_machine_file"], "localstack.hooks.prepare_host": ["prepare_host_machine_id=localstack.utils.analytics.metadata:prepare_host_machine_id"], "localstack.runtime.components": ["aws=localstack.aws.components:AwsComponents"], "localstack.lambda.runtime_executor": ["docker=localstack.services.lambda_.invocation.plugins:DockerRuntimeExecutorPlugin"]}