Skip to content
This repository was archived by the owner on Mar 23, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions localstack-core/localstack/services/route53/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,16 @@
from localstack.aws.connect import connect_to
from localstack.services.moto import call_moto
from localstack.services.plugins import ServiceLifecycleHook
from localstack.state import StateVisitor


class Route53Provider(Route53Api, ServiceLifecycleHook):
def accept_state_visitor(self, visitor: StateVisitor):
from localstack.services.route53.models import route53_stores

visitor.visit(route53_backends)
visitor.visit(route53_stores)

def create_hosted_zone(
self,
context: RequestContext,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,18 @@
validate_mutation_protection,
validate_priority,
)
from localstack.state import StateVisitor
from localstack.utils.aws import arns
from localstack.utils.aws.arns import extract_account_id_from_arn, extract_region_from_arn
from localstack.utils.collections import select_from_typed_dict
from localstack.utils.patch import patch


class Route53ResolverProvider(Route53ResolverApi):
def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(route53resolver_backends)
visitor.visit(route53resolver_stores)

@staticmethod
def get_store(account_id: str, region: str) -> Route53ResolverStore:
return route53resolver_stores[account_id][region]
Expand Down
6 changes: 6 additions & 0 deletions localstack-core/localstack/services/s3control/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from localstack.aws.forwarder import NotImplementedAvoidFallbackError
from localstack.services.s3.models import s3_stores
from localstack.services.s3control.validation import validate_tags
from localstack.state import StateVisitor
from localstack.utils.tagging import TaggingService


Expand All @@ -21,6 +22,11 @@ def __init__(self, message=None):


class S3ControlProvider(S3ControlApi):
def accept_state_visitor(self, visitor: StateVisitor):
from moto.s3control.models import s3control_backends

visitor.visit(s3control_backends)

"""
S3Control is a management interface for S3, and can access some of its internals with no public API
This requires us to access the s3 stores directly
Expand Down
6 changes: 4 additions & 2 deletions localstack-core/localstack/services/scheduler/provider.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import logging
import re

from moto.scheduler.models import EventBridgeSchedulerBackend
from moto.scheduler.models import EventBridgeSchedulerBackend, scheduler_backends

from localstack.aws.api.scheduler import SchedulerApi, ValidationException
from localstack.services.events.rule import RULE_SCHEDULE_CRON_REGEX, RULE_SCHEDULE_RATE_REGEX
from localstack.services.plugins import ServiceLifecycleHook
from localstack.state import StateVisitor
from localstack.utils.patch import patch

LOG = logging.getLogger(__name__)
Expand All @@ -17,7 +18,8 @@


class SchedulerProvider(SchedulerApi, ServiceLifecycleHook):
pass
def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(scheduler_backends)


def _validate_schedule_expression(schedule_expression: str) -> None:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
)
from localstack.aws.connect import connect_to
from localstack.services.moto import call_moto
from localstack.state import StateVisitor
from localstack.utils.aws import arns
from localstack.utils.patch import patch
from localstack.utils.time import today_no_time
Expand Down Expand Up @@ -105,6 +106,9 @@ def __init__(self):
super().__init__()
apply_patches()

def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(secretsmanager_backends)

@staticmethod
def get_moto_backend_for_resource(
name_or_arn: str, context: RequestContext
Expand Down
4 changes: 4 additions & 0 deletions localstack-core/localstack/services/ses/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
from localstack.services.moto import call_moto
from localstack.services.plugins import ServiceLifecycleHook
from localstack.services.ses.models import EmailType, SentEmail, SentEmailBody
from localstack.state import StateVisitor
from localstack.utils.aws import arns
from localstack.utils.files import mkdir
from localstack.utils.strings import long_uid, to_str
Expand Down Expand Up @@ -177,6 +178,9 @@ def register_ses_api_resource():


class SesProvider(SesApi, ServiceLifecycleHook):
def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(ses_backends)

#
# Lifecycle Hooks
#
Expand Down
5 changes: 5 additions & 0 deletions localstack-core/localstack/services/sns/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
from localstack.utils.collections import PaginatedList, select_from_typed_dict
from localstack.utils.strings import short_uid, to_bytes, to_str

from ...state import StateVisitor
from .analytics import internal_api_calls

# set up logger
Expand Down Expand Up @@ -118,6 +119,10 @@ def __init__(self) -> None:
self._publisher = PublishDispatcher()
self._signature_cert_pem: str = SNS_SERVER_CERT

def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(sns_backends)
visitor.visit(sns_stores)

def on_before_stop(self):
self._publisher.shutdown()

Expand Down
4 changes: 4 additions & 0 deletions localstack-core/localstack/services/sns/v2/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
parse_and_validate_topic_arn,
validate_subscription_attribute,
)
from localstack.state import StateVisitor
from localstack.utils.aws.arns import (
extract_account_id_from_arn,
extract_region_from_arn,
Expand All @@ -142,6 +143,9 @@ def __init__(self) -> None:
self._publisher = PublishDispatcher()
self._signature_cert_pem: str = SNS_SERVER_CERT

def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(sns_stores)

def on_before_stop(self):
self._publisher.shutdown()

Expand Down
4 changes: 4 additions & 0 deletions localstack-core/localstack/services/sqs/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
parse_queue_url,
)
from localstack.services.stores import AccountRegionBundle
from localstack.state import StateVisitor
from localstack.utils.aws.arns import parse_arn
from localstack.utils.bootstrap import is_api_enabled
from localstack.utils.cloudwatch.cloudwatch_util import (
Expand Down Expand Up @@ -659,6 +660,9 @@ def __init__(self) -> None:
self._router_rules = []
self._init_cloudwatch_metrics_reporting()

def accept_state_visitor(self, visitor: StateVisitor):
visitor.visit(sqs_stores)

@staticmethod
def get_store(account_id: str, region: str) -> SqsStore:
return sqs_stores[account_id][region]
Expand Down
6 changes: 6 additions & 0 deletions localstack-core/localstack/services/ssm/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@
)
from localstack.aws.connect import connect_to
from localstack.services.moto import call_moto, call_moto_with_request
from localstack.state import StateVisitor
from localstack.utils.aws.arns import extract_resource_from_arn, is_arn
from localstack.utils.bootstrap import is_api_enabled
from localstack.utils.collections import remove_attributes
Expand Down Expand Up @@ -105,6 +106,11 @@ def __init__(self):

# TODO: check if _normalize_name(..) calls are still required here
class SsmProvider(SsmApi, ABC):
def accept_state_visitor(self, visitor: StateVisitor):
from moto.ssm.models import ssm_backends

visitor.visit(ssm_backends)

def get_parameters(
self,
context: RequestContext,
Expand Down
7 changes: 7 additions & 0 deletions localstack-core/localstack/services/sts/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
from localstack.services.moto import call_moto
from localstack.services.plugins import ServiceLifecycleHook
from localstack.services.sts.models import SessionConfig, sts_stores
from localstack.state import StateVisitor
from localstack.utils.aws.arns import extract_account_id_from_arn
from localstack.utils.aws.request_context import extract_access_key_id_from_auth_header

Expand Down Expand Up @@ -50,6 +51,12 @@ class StsProvider(StsApi, ServiceLifecycleHook):
def __init__(self):
apply_iam_patches()

def accept_state_visitor(self, visitor: StateVisitor):
from moto.sts.models import sts_backends

visitor.visit(sts_backends)
visitor.visit(sts_stores)

def get_caller_identity(self, context: RequestContext, **kwargs) -> GetCallerIdentityResponse:
response = call_moto(context)
if "user/moto" in response["Arn"] and "sts" in response["Arn"]:
Expand Down
6 changes: 5 additions & 1 deletion localstack-core/localstack/services/support/provider.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from abc import ABC

from localstack.aws.api.support import SupportApi
from localstack.state import StateVisitor


class SupportProvider(SupportApi, ABC):
pass
def accept_state_visitor(self, visitor: StateVisitor):
from moto.support.models import support_backends

visitor.visit(support_backends)
6 changes: 5 additions & 1 deletion localstack-core/localstack/services/swf/provider.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from abc import ABC

from localstack.aws.api.swf import SwfApi
from localstack.state import StateVisitor


class SWFProvider(SwfApi, ABC):
pass
def accept_state_visitor(self, visitor: StateVisitor):
from moto.swf.models import swf_backends

visitor.visit(swf_backends)
7 changes: 7 additions & 0 deletions localstack-core/localstack/services/transcribe/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
)
from localstack.services.transcribe.models import TranscribeStore, transcribe_stores
from localstack.services.transcribe.packages import vosk_package
from localstack.state import StateVisitor
from localstack.utils.files import new_tmp_file
from localstack.utils.http import download
from localstack.utils.run import run
Expand Down Expand Up @@ -101,6 +102,12 @@


class TranscribeProvider(TranscribeApi):
def accept_state_visitor(self, visitor: StateVisitor) -> None:
from moto.transcribe.models import transcribe_backends

visitor.visit(transcribe_backends)
visitor.visit(transcribe_stores)

def get_transcription_job(
self, context: RequestContext, transcription_job_name: TranscriptionJobName, **kwargs: Any
) -> GetTranscriptionJobResponse:
Expand Down
Loading