Techdebt: Various improvements (#7154)
This commit is contained in:
parent
dc18556449
commit
f730d59229
3
.github/workflows/build.yml
vendored
3
.github/workflows/build.yml
vendored
@ -40,8 +40,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: cache
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: [3.9]
|
||||
python-version: [3.9, "3.10", "3.11", "3.12"]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
|
14
.github/workflows/dockertests.yml
vendored
14
.github/workflows/dockertests.yml
vendored
@ -8,7 +8,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [ 3.9 ]
|
||||
python-version: [ "3.11" ]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@ -41,7 +41,7 @@ jobs:
|
||||
needs: cache
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.9]
|
||||
python-version: ["3.11"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@ -55,7 +55,7 @@ jobs:
|
||||
run: |
|
||||
pip install --upgrade build
|
||||
python -m build
|
||||
docker run --rm -t --name motoserver -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e MOTO_PORT=4555 -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 4555:4555 -v /var/run/docker.sock:/var/run/docker.sock python:3.7-buster /moto/scripts/ci_moto_server.sh &
|
||||
docker run --rm -t --name motoserver -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e MOTO_PORT=4555 -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 4555:4555 -v /var/run/docker.sock:/var/run/docker.sock python:3.11-slim /moto/scripts/ci_moto_server.sh &
|
||||
MOTO_PORT=4555 python scripts/ci_wait_for_server.py
|
||||
- name: Get pip cache dir
|
||||
id: pip-cache
|
||||
@ -100,7 +100,7 @@ jobs:
|
||||
needs: cache
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.9]
|
||||
python-version: ["3.11"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@ -115,7 +115,7 @@ jobs:
|
||||
pip install --upgrade build
|
||||
python -m build
|
||||
docker network create -d bridge my-custom-network
|
||||
docker run --rm -t -e TEST_SERVER_MODE=true -e MOTO_DOCKER_NETWORK_NAME=my-custom-network -e AWS_SECRET_ACCESS_KEY=server_secret -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 5000:5000 --network my-custom-network -v /var/run/docker.sock:/var/run/docker.sock python:3.7-buster /moto/scripts/ci_moto_server.sh &
|
||||
docker run --rm -t -e TEST_SERVER_MODE=true -e MOTO_DOCKER_NETWORK_NAME=my-custom-network -e AWS_SECRET_ACCESS_KEY=server_secret -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 5000:5000 --network my-custom-network -v /var/run/docker.sock:/var/run/docker.sock python:3.11-slim /moto/scripts/ci_moto_server.sh &
|
||||
python scripts/ci_wait_for_server.py
|
||||
- name: Get pip cache dir
|
||||
id: pip-cache
|
||||
@ -158,7 +158,7 @@ jobs:
|
||||
needs: cache
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.9]
|
||||
python-version: ["3.11"]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
@ -172,7 +172,7 @@ jobs:
|
||||
run: |
|
||||
pip install --upgrade build
|
||||
python -m build
|
||||
docker run --rm -t -e MOTO_DOCKER_NETWORK_MODE=host -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e MOTO_PORT=4555 -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 4555:4555 -v /var/run/docker.sock:/var/run/docker.sock python:3.7-buster /moto/scripts/ci_moto_server.sh &
|
||||
docker run --rm -t -e MOTO_DOCKER_NETWORK_MODE=host -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e MOTO_PORT=4555 -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 4555:4555 -v /var/run/docker.sock:/var/run/docker.sock python:3.11-slim /moto/scripts/ci_moto_server.sh &
|
||||
MOTO_PORT=4555 python scripts/ci_wait_for_server.py
|
||||
- name: Get pip cache dir
|
||||
id: pip-cache
|
||||
|
@ -45,15 +45,6 @@ An example model could look like this:
|
||||
from moto.moto_api import state_manager
|
||||
|
||||
class Backend():
|
||||
def __init__():
|
||||
# This is how we register the model, and specify the default transition-behaviour
|
||||
# Typically this is done when constructing the Backend-class
|
||||
state_manager.register_default_transition(
|
||||
# This name should be the same as the name used in NewModel
|
||||
model_name="new::model",
|
||||
# Any transition-config is possible - this is a good default option though
|
||||
transition={"progression": "immediate"},
|
||||
)
|
||||
|
||||
def list_resources():
|
||||
for ec2_instance in all_resources:
|
||||
@ -76,3 +67,14 @@ An example model could look like this:
|
||||
# Make sure that each way (describe, list, get_, ) calls the advance()-method, and the resource can actually progress to the next state
|
||||
resource.advance()
|
||||
return resource
|
||||
|
||||
Make sure that the model is registered with the StateManager. This can be done in `moto/moto_api/__init__.py`:
|
||||
|
||||
.. sourcecode:: python
|
||||
|
||||
state_manager.register_default_transition(
|
||||
# This name should be the same as the name used in NewModel
|
||||
model_name="new::model",
|
||||
# Any transition-config is possible - this is a good default option though
|
||||
transition={"progression": "immediate"},
|
||||
)
|
||||
|
@ -254,9 +254,6 @@ class MockAll(ContextDecorator):
|
||||
|
||||
mock_all = MockAll
|
||||
|
||||
# import logging
|
||||
# logging.getLogger('boto').setLevel(logging.CRITICAL)
|
||||
|
||||
__title__ = "moto"
|
||||
__version__ = "4.2.13.dev"
|
||||
|
||||
|
@ -22,7 +22,6 @@ from moto.ecs.models import EC2ContainerServiceBackend, ecs_backends
|
||||
from moto.iam.exceptions import IAMNotFoundException
|
||||
from moto.iam.models import IAMBackend, iam_backends
|
||||
from moto.logs.models import LogsBackend, logs_backends
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
from moto.utilities.docker_utilities import DockerModel
|
||||
@ -1014,10 +1013,6 @@ class BatchBackend(BaseBackend):
|
||||
self._jobs: Dict[str, Job] = {}
|
||||
self._scheduling_policies: Dict[str, SchedulingPolicy] = {}
|
||||
|
||||
state_manager.register_default_transition(
|
||||
"batch::job", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
|
||||
@property
|
||||
def iam_backend(self) -> IAMBackend:
|
||||
"""
|
||||
|
@ -3,7 +3,6 @@ from typing import Any, Dict, Iterable, List, Optional, Tuple
|
||||
|
||||
from moto.core import BackendDict, BaseBackend, BaseModel
|
||||
from moto.core.utils import iso_8601_datetime_with_milliseconds
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random as random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
from moto.utilities.tagging_service import TaggingService
|
||||
@ -271,10 +270,6 @@ class CloudFrontBackend(BaseBackend):
|
||||
self.origin_access_controls: Dict[str, OriginAccessControl] = dict()
|
||||
self.tagger = TaggingService()
|
||||
|
||||
state_manager.register_default_transition(
|
||||
"cloudfront::distribution", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
|
||||
def create_distribution(
|
||||
self, distribution_config: Dict[str, Any], tags: List[Dict[str, str]]
|
||||
) -> Tuple[Distribution, str, str]:
|
||||
|
@ -2162,6 +2162,10 @@ class RegionAgnosticBackend:
|
||||
# Without authentication-header, we lose the context of which region the request was send to
|
||||
# This backend will cycle through all backends as a workaround
|
||||
|
||||
def __init__(self, account_id: str, region_name: str):
|
||||
self.account_id = account_id
|
||||
self.region_name = region_name
|
||||
|
||||
def _find_backend_by_access_token(self, access_token: str) -> CognitoIdpBackend:
|
||||
for account_specific_backends in cognitoidp_backends.values():
|
||||
for region, backend in account_specific_backends.items():
|
||||
@ -2170,7 +2174,7 @@ class RegionAgnosticBackend:
|
||||
for p in backend.user_pools.values():
|
||||
if access_token in p.access_tokens:
|
||||
return backend
|
||||
return backend
|
||||
return cognitoidp_backends[self.account_id][self.region_name]
|
||||
|
||||
def _find_backend_for_clientid(self, client_id: str) -> CognitoIdpBackend:
|
||||
for account_specific_backends in cognitoidp_backends.values():
|
||||
@ -2180,7 +2184,7 @@ class RegionAgnosticBackend:
|
||||
for p in backend.user_pools.values():
|
||||
if client_id in p.clients:
|
||||
return backend
|
||||
return backend
|
||||
return cognitoidp_backends[self.account_id][self.region_name]
|
||||
|
||||
def sign_up(
|
||||
self,
|
||||
@ -2237,7 +2241,9 @@ cognitoidp_backends = BackendDict(CognitoIdpBackend, "cognito-idp")
|
||||
# Hack to help moto-server process requests on localhost, where the region isn't
|
||||
# specified in the host header. Some endpoints (change password, confirm forgot
|
||||
# password) have no authorization header from which to extract the region.
|
||||
def find_account_region_by_value(key: str, value: str) -> Tuple[str, str]:
|
||||
def find_account_region_by_value(
|
||||
key: str, value: str, fallback: Tuple[str, str]
|
||||
) -> Tuple[str, str]:
|
||||
for account_id, account_specific_backend in cognitoidp_backends.items():
|
||||
for region, backend in account_specific_backend.items():
|
||||
for user_pool in backend.user_pools.values():
|
||||
@ -2249,4 +2255,4 @@ def find_account_region_by_value(key: str, value: str) -> Tuple[str, str]:
|
||||
# If we can't find the `client_id` or `access_token`, we just pass
|
||||
# back a default backend region, which will raise the appropriate
|
||||
# error message (e.g. NotAuthorized or NotFound).
|
||||
return account_id, region
|
||||
return fallback
|
||||
|
@ -14,13 +14,14 @@ from .models import (
|
||||
find_account_region_by_value,
|
||||
)
|
||||
|
||||
region_agnostic_backend = RegionAgnosticBackend()
|
||||
|
||||
|
||||
class CognitoIdpResponse(BaseResponse):
|
||||
def __init__(self) -> None:
|
||||
super().__init__(service_name="cognito-idp")
|
||||
|
||||
def _get_region_agnostic_backend(self) -> RegionAgnosticBackend:
|
||||
return RegionAgnosticBackend(self.current_account, self.region)
|
||||
|
||||
@property
|
||||
def parameters(self) -> Dict[str, Any]: # type: ignore[misc]
|
||||
return json.loads(self.body)
|
||||
@ -353,7 +354,7 @@ class CognitoIdpResponse(BaseResponse):
|
||||
|
||||
def get_user(self) -> str:
|
||||
access_token = self._get_param("AccessToken")
|
||||
user = region_agnostic_backend.get_user(access_token=access_token)
|
||||
user = self._get_region_agnostic_backend().get_user(access_token=access_token)
|
||||
return json.dumps(user.to_json(extended=True, attributes_key="UserAttributes"))
|
||||
|
||||
def list_users(self) -> str:
|
||||
@ -454,7 +455,8 @@ class CognitoIdpResponse(BaseResponse):
|
||||
client_id = self._get_param("ClientId")
|
||||
challenge_name = self._get_param("ChallengeName")
|
||||
challenge_responses = self._get_param("ChallengeResponses")
|
||||
auth_result = region_agnostic_backend.admin_respond_to_auth_challenge(
|
||||
backend = self._get_region_agnostic_backend()
|
||||
auth_result = backend.admin_respond_to_auth_challenge(
|
||||
session, client_id, challenge_name, challenge_responses
|
||||
)
|
||||
|
||||
@ -465,7 +467,7 @@ class CognitoIdpResponse(BaseResponse):
|
||||
client_id = self._get_param("ClientId")
|
||||
challenge_name = self._get_param("ChallengeName")
|
||||
challenge_responses = self._get_param("ChallengeResponses")
|
||||
auth_result = region_agnostic_backend.respond_to_auth_challenge(
|
||||
auth_result = self._get_region_agnostic_backend().respond_to_auth_challenge(
|
||||
session, client_id, challenge_name, challenge_responses
|
||||
)
|
||||
|
||||
@ -474,7 +476,9 @@ class CognitoIdpResponse(BaseResponse):
|
||||
def forgot_password(self) -> str:
|
||||
client_id = self._get_param("ClientId")
|
||||
username = self._get_param("Username")
|
||||
account, region = find_account_region_by_value("client_id", client_id)
|
||||
account, region = find_account_region_by_value(
|
||||
"client_id", client_id, fallback=(self.current_account, self.region)
|
||||
)
|
||||
confirmation_code, response = cognitoidp_backends[account][
|
||||
region
|
||||
].forgot_password(client_id, username)
|
||||
@ -492,7 +496,9 @@ class CognitoIdpResponse(BaseResponse):
|
||||
username = self._get_param("Username")
|
||||
password = self._get_param("Password")
|
||||
confirmation_code = self._get_param("ConfirmationCode")
|
||||
account, region = find_account_region_by_value("client_id", client_id)
|
||||
account, region = find_account_region_by_value(
|
||||
"client_id", client_id, fallback=(self.current_account, self.region)
|
||||
)
|
||||
cognitoidp_backends[account][region].confirm_forgot_password(
|
||||
client_id, username, password, confirmation_code
|
||||
)
|
||||
@ -503,7 +509,9 @@ class CognitoIdpResponse(BaseResponse):
|
||||
access_token = self._get_param("AccessToken")
|
||||
previous_password = self._get_param("PreviousPassword")
|
||||
proposed_password = self._get_param("ProposedPassword")
|
||||
account, region = find_account_region_by_value("access_token", access_token)
|
||||
account, region = find_account_region_by_value(
|
||||
"access_token", access_token, fallback=(self.current_account, self.region)
|
||||
)
|
||||
cognitoidp_backends[account][region].change_password(
|
||||
access_token, previous_password, proposed_password
|
||||
)
|
||||
@ -573,7 +581,7 @@ class CognitoIdpResponse(BaseResponse):
|
||||
client_id = self._get_param("ClientId")
|
||||
username = self._get_param("Username")
|
||||
password = self._get_param("Password")
|
||||
user = region_agnostic_backend.sign_up(
|
||||
user = self._get_region_agnostic_backend().sign_up(
|
||||
client_id=client_id,
|
||||
username=username,
|
||||
password=password,
|
||||
@ -589,7 +597,9 @@ class CognitoIdpResponse(BaseResponse):
|
||||
def confirm_sign_up(self) -> str:
|
||||
client_id = self._get_param("ClientId")
|
||||
username = self._get_param("Username")
|
||||
region_agnostic_backend.confirm_sign_up(client_id=client_id, username=username)
|
||||
self._get_region_agnostic_backend().confirm_sign_up(
|
||||
client_id=client_id, username=username
|
||||
)
|
||||
return ""
|
||||
|
||||
def initiate_auth(self) -> str:
|
||||
@ -597,7 +607,7 @@ class CognitoIdpResponse(BaseResponse):
|
||||
auth_flow = self._get_param("AuthFlow")
|
||||
auth_parameters = self._get_param("AuthParameters")
|
||||
|
||||
auth_result = region_agnostic_backend.initiate_auth(
|
||||
auth_result = self._get_region_agnostic_backend().initiate_auth(
|
||||
client_id, auth_flow, auth_parameters
|
||||
)
|
||||
|
||||
|
@ -3,7 +3,6 @@ from typing import Any, Dict, Iterable, List
|
||||
|
||||
from moto.core import BackendDict, BaseBackend, BaseModel
|
||||
from moto.core.utils import unix_time
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random as random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
from moto.utilities.paginator import paginate
|
||||
@ -167,10 +166,6 @@ class DAXBackend(BaseBackend):
|
||||
self._clusters: Dict[str, DaxCluster] = dict()
|
||||
self._tagger = TaggingService()
|
||||
|
||||
state_manager.register_default_transition(
|
||||
model_name="dax::cluster", transition={"progression": "manual", "times": 4}
|
||||
)
|
||||
|
||||
@property
|
||||
def clusters(self) -> Dict[str, DaxCluster]:
|
||||
self._clusters = {
|
||||
|
@ -36,6 +36,50 @@ from ..utils import (
|
||||
from .availability_zones_and_regions import RegionsAndZonesBackend
|
||||
from .core import TaggedEC2Resource
|
||||
|
||||
# We used to load the entirety of Moto into memory, and check every module if it's supported
|
||||
# But having a fixed list is much more performant
|
||||
# Maintaining it is more difficult, but the contents of this list does not change very often
|
||||
IMPLEMENTED_ENDPOINT_SERVICES = [
|
||||
"acm",
|
||||
"applicationautoscaling",
|
||||
"athena",
|
||||
"autoscaling",
|
||||
"lambda",
|
||||
"cloudformation",
|
||||
"cloudwatch",
|
||||
"codecommit",
|
||||
"codepipeline",
|
||||
"config",
|
||||
"datasync",
|
||||
"dms",
|
||||
"ds",
|
||||
"dynamodb",
|
||||
"ec2",
|
||||
"ecr",
|
||||
"ecs",
|
||||
"elasticbeanstalk",
|
||||
"elbv2",
|
||||
"emr",
|
||||
"events",
|
||||
"firehose",
|
||||
"glue",
|
||||
"iot",
|
||||
"kinesis",
|
||||
"kms",
|
||||
"logs",
|
||||
"rds",
|
||||
"redshift",
|
||||
"route53resolver",
|
||||
"s3",
|
||||
"sagemaker",
|
||||
"secretsmanager",
|
||||
"sns",
|
||||
"sqs",
|
||||
"ssm",
|
||||
"sts",
|
||||
"transcribe",
|
||||
"xray",
|
||||
]
|
||||
MAX_NUMBER_OF_ENDPOINT_SERVICES_RESULTS = 1000
|
||||
DEFAULT_VPC_ENDPOINT_SERVICES: List[Dict[str, str]] = []
|
||||
|
||||
@ -725,7 +769,8 @@ class VPCBackend:
|
||||
|
||||
from moto import backends # pylint: disable=import-outside-toplevel
|
||||
|
||||
for _backends in backends.service_backends():
|
||||
for implemented_service in IMPLEMENTED_ENDPOINT_SERVICES:
|
||||
_backends = backends.get_backend(implemented_service) # type: ignore[call-overload]
|
||||
account_backend = _backends[account_id]
|
||||
if region in account_backend:
|
||||
service = account_backend[region].default_vpc_endpoint_service(
|
||||
|
@ -9,7 +9,6 @@ from moto.core import BackendDict, BaseBackend, BaseModel, CloudFormationModel
|
||||
from moto.core.exceptions import JsonRESTError
|
||||
from moto.core.utils import pascal_to_camelcase, remap_nested_keys, unix_time
|
||||
from moto.ec2 import ec2_backends
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
|
||||
@ -962,11 +961,6 @@ class EC2ContainerServiceBackend(BaseBackend):
|
||||
self.services: Dict[str, Service] = {}
|
||||
self.container_instances: Dict[str, Dict[str, ContainerInstance]] = {}
|
||||
|
||||
state_manager.register_default_transition(
|
||||
model_name="ecs::task",
|
||||
transition={"progression": "manual", "times": 1},
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def default_vpc_endpoint_service(service_region: str, zones: List[str]) -> List[Dict[str, Any]]: # type: ignore[misc]
|
||||
"""Default VPC endpoint service."""
|
||||
|
@ -7,7 +7,6 @@ from typing import Any, Dict, List, Optional
|
||||
|
||||
from moto.core import BackendDict, BaseBackend, BaseModel
|
||||
from moto.core.utils import unix_time, utcnow
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
|
||||
@ -113,10 +112,6 @@ class GlueBackend(BaseBackend):
|
||||
self.num_schemas = 0
|
||||
self.num_schema_versions = 0
|
||||
|
||||
state_manager.register_default_transition(
|
||||
model_name="glue::job_run", transition={"progression": "immediate"}
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def default_vpc_endpoint_service(
|
||||
service_region: str, zones: List[str]
|
||||
|
@ -6,6 +6,43 @@ Use this manager to configure how AWS models transition between states. (initial
|
||||
"""
|
||||
state_manager = _internal.state_manager.StateManager()
|
||||
|
||||
"""
|
||||
Default transitions across Moto
|
||||
"""
|
||||
state_manager.register_default_transition(
|
||||
"batch::job", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"cloudfront::distribution", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
model_name="dax::cluster", transition={"progression": "manual", "times": 4}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
model_name="ecs::task", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
model_name="glue::job_run", transition={"progression": "immediate"}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"s3::keyrestore", transition={"progression": "immediate"}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
model_name="support::case", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::vocabulary", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::medicalvocabulary", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::transcriptionjob", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::medicaltranscriptionjob",
|
||||
transition={"progression": "manual", "times": 1},
|
||||
)
|
||||
|
||||
""""
|
||||
Recorder, used to record calls to Moto and replay them later
|
||||
|
@ -29,7 +29,6 @@ from moto.core.utils import (
|
||||
unix_time_millis,
|
||||
utcnow,
|
||||
)
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random as random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
from moto.s3.exceptions import (
|
||||
@ -1615,10 +1614,6 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
|
||||
self.buckets: Dict[str, FakeBucket] = {}
|
||||
self.tagger = TaggingService()
|
||||
|
||||
state_manager.register_default_transition(
|
||||
"s3::keyrestore", transition={"progression": "immediate"}
|
||||
)
|
||||
|
||||
def reset(self) -> None:
|
||||
# For every key and multipart, Moto opens a TemporaryFile to write the value of those keys
|
||||
# Ensure that these TemporaryFile-objects are closed, and leave no filehandles open
|
||||
|
@ -2,7 +2,6 @@ import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from moto.core import BackendDict, BaseBackend
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random as random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
from moto.utilities.utils import load_resource
|
||||
@ -67,10 +66,6 @@ class SupportBackend(BaseBackend):
|
||||
self.check_status: Dict[str, str] = {}
|
||||
self.cases: Dict[str, SupportCase] = {}
|
||||
|
||||
state_manager.register_default_transition(
|
||||
model_name="support::case", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
|
||||
def describe_trusted_advisor_checks(self) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
The Language-parameter is not yet implemented
|
||||
|
@ -3,7 +3,6 @@ from datetime import datetime, timedelta
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from moto.core import BackendDict, BaseBackend, BaseModel
|
||||
from moto.moto_api import state_manager
|
||||
from moto.moto_api._internal import mock_random
|
||||
from moto.moto_api._internal.managed_state_model import ManagedState
|
||||
|
||||
@ -480,22 +479,6 @@ class TranscribeBackend(BaseBackend):
|
||||
self.medical_vocabularies: Dict[str, FakeMedicalVocabulary] = {}
|
||||
self.vocabularies: Dict[str, FakeVocabulary] = {}
|
||||
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::vocabulary", transition={"progression": "manual", "times": 1}
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::medicalvocabulary",
|
||||
transition={"progression": "manual", "times": 1},
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::transcriptionjob",
|
||||
transition={"progression": "manual", "times": 1},
|
||||
)
|
||||
state_manager.register_default_transition(
|
||||
"transcribe::medicaltranscriptionjob",
|
||||
transition={"progression": "manual", "times": 1},
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def default_vpc_endpoint_service(
|
||||
service_region: str, zones: List[str]
|
||||
|
@ -22,7 +22,7 @@ def load_resource(package: str, resource: str) -> Any:
|
||||
|
||||
|
||||
def load_resource_as_str(package: str, resource: str) -> str:
|
||||
return load_resource_as_bytes(package, resource).decode("utf-8") # type: ignore
|
||||
return load_resource_as_bytes(package, resource).decode("utf-8")
|
||||
|
||||
|
||||
def load_resource_as_bytes(package: str, resource: str) -> bytes:
|
||||
|
@ -1,9 +1,10 @@
|
||||
import re
|
||||
from unittest import SkipTest
|
||||
|
||||
import pytest
|
||||
|
||||
import moto.server as server
|
||||
from moto import mock_ec2, mock_efs
|
||||
from moto import mock_ec2, mock_efs, settings
|
||||
|
||||
FILE_SYSTEMS = "/2015-02-01/file-systems"
|
||||
MOUNT_TARGETS = "/2015-02-01/mount-targets"
|
||||
@ -20,6 +21,8 @@ def fixture_aws_credentials(monkeypatch):
|
||||
|
||||
@pytest.fixture(scope="function", name="efs_client")
|
||||
def fixture_efs_client(aws_credentials): # pylint: disable=unused-argument
|
||||
if not settings.TEST_DECORATOR_MODE:
|
||||
raise SkipTest("Using server directly - no point in testing ServerMode")
|
||||
with mock_efs():
|
||||
yield server.create_backend_app("efs").test_client()
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import csv
|
||||
import json
|
||||
from datetime import datetime
|
||||
from unittest import SkipTest
|
||||
from urllib import parse
|
||||
from uuid import uuid4
|
||||
|
||||
@ -3580,6 +3581,8 @@ def test_role_list_config_discovered_resources():
|
||||
|
||||
@mock_iam
|
||||
def test_role_config_dict():
|
||||
if not settings.TEST_DECORATOR_MODE:
|
||||
raise SkipTest("Using backend directly - no point in testing ServerMode")
|
||||
from moto.iam.config import policy_config_query, role_config_query
|
||||
from moto.iam.utils import random_policy_id, random_role_id
|
||||
|
||||
@ -4189,6 +4192,8 @@ def test_policy_list_config_discovered_resources():
|
||||
|
||||
@mock_iam
|
||||
def test_policy_config_dict():
|
||||
if not settings.TEST_DECORATOR_MODE:
|
||||
raise SkipTest("Using backend directly - no point in testing ServerMode")
|
||||
from moto.iam.config import policy_config_query, role_config_query
|
||||
from moto.iam.utils import random_policy_id
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user