Feature: Ability to seed Moto, and make random ID's deterministic (#5492)

This commit is contained in:
Bert Blommers 2022-09-28 09:35:12 +00:00 committed by GitHub
parent c462688846
commit aa7d68a688
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
140 changed files with 787 additions and 602 deletions

View File

@ -68,3 +68,46 @@ The requests are stored in a file called `moto_recording`, in the directory that
The recorder is disabled by default. If you want to enable it, use the following environment variable: The recorder is disabled by default. If you want to enable it, use the following environment variable:
`MOTO_ENABLE_RECORDING=True` `MOTO_ENABLE_RECORDING=True`
Deterministic Identifiers
##############################
Moto creates random identifiers for most resources, just like AWS. The Recorder will recreate the same resources every time, but with different identifiers.
It is possible to seed Moto and ensure that the 'random' identifiers are always the same for subsequent requests.
Example invocation:
.. sourcecode:: python
# Ensure the provided parameter `a` is an integer
requests.post("http://motoapi.amazonaws.com/moto-api/seed?a=42")
# To try this out, generate a EC2 instance
client = boto3.client("ec2", region_name="us-east-1")
resp = client.run_instances(ImageId="ami-12c6146b", MinCount=1, MaxCount=1)
# The resulting InstanceId will always be the same
instance_id = resp["Instances"][0]["InstanceId"]
assert instance_id == "i-d1026706d7e805da8"
To seed Moto in ServerMode:
.. sourcecode:: python
requests.post(f"http://localhost:5000/moto-api/seed?a=42")
Because the seeding API is only exposed as a request, it will be recorded just like any other request. :raw-html:`<br />`
Seed Moto at the beginning of a recording to ensure the resulting state will always be the same:
.. sourcecode:: python
requests.post("http://localhost:5000/moto-api/recorder/start-recording")
requests.post("http://localhost:5000/moto-api/seed?a=42")
client = boto3.client("ec2", region_name="us-east-1")
resp = client.run_instances(ImageId="ami-12c6146b", MinCount=1, MaxCount=1)
requests.post("http://localhost:5000/moto-api/recorder/stop-recording")

View File

@ -1,9 +1,9 @@
import uuid from moto.moto_api._internal import mock_random
def make_arn_for_certificate(account_id, region_name): def make_arn_for_certificate(account_id, region_name):
# Example # Example
# arn:aws:acm:eu-west-2:764371465172:certificate/c4b738b8-56fe-4b3a-b841-1c047654780b # arn:aws:acm:eu-west-2:764371465172:certificate/c4b738b8-56fe-4b3a-b841-1c047654780b
return "arn:aws:acm:{0}:{1}:certificate/{2}".format( return "arn:aws:acm:{0}:{1}:certificate/{2}".format(
region_name, account_id, uuid.uuid4() region_name, account_id, mock_random.uuid4()
) )

View File

@ -2,10 +2,10 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from typing import Dict from typing import Dict
from uuid import uuid4
from .exceptions import RuleGroupNamespaceNotFound, WorkspaceNotFound from .exceptions import RuleGroupNamespaceNotFound, WorkspaceNotFound
from .utils import PAGINATION_MODEL from .utils import PAGINATION_MODEL
@ -38,7 +38,7 @@ class RuleGroupNamespace(BaseModel):
class Workspace(BaseModel): class Workspace(BaseModel):
def __init__(self, account_id, region, alias, tag_fn): def __init__(self, account_id, region, alias, tag_fn):
self.alias = alias self.alias = alias
self.workspace_id = f"ws-{uuid4()}" self.workspace_id = f"ws-{mock_random.uuid4()}"
self.arn = f"arn:aws:aps:{region}:{account_id}:workspace/{self.workspace_id}" self.arn = f"arn:aws:aps:{region}:{account_id}:workspace/{self.workspace_id}"
self.endpoint = f"https://aps-workspaces.{region}.amazonaws.com/workspaces/{self.workspace_id}/" self.endpoint = f"https://aps-workspaces.{region}.amazonaws.com/workspaces/{self.workspace_id}/"
self.status = {"statusCode": "ACTIVE"} self.status = {"statusCode": "ACTIVE"}

View File

@ -1,6 +1,5 @@
from __future__ import absolute_import from __future__ import absolute_import
import random
import string import string
import re import re
from collections import defaultdict from collections import defaultdict
@ -66,6 +65,7 @@ from .exceptions import (
) )
from ..core.models import responses_mock from ..core.models import responses_mock
from moto.apigateway.exceptions import MethodNotFoundException from moto.apigateway.exceptions import MethodNotFoundException
from moto.moto_api._internal import mock_random as random
STAGE_URL = "https://{api_id}.execute-api.{region_name}.amazonaws.com/{stage_name}" STAGE_URL = "https://{api_id}.execute-api.{region_name}.amazonaws.com/{stage_name}"

View File

@ -1,7 +1,7 @@
import random
import string import string
import json import json
import yaml import yaml
from moto.moto_api._internal import mock_random as random
def create_id(): def create_id():

View File

@ -1,10 +1,10 @@
"""ApiGatewayV2Backend class with methods for supported APIs.""" """ApiGatewayV2Backend class with methods for supported APIs."""
import random
import string import string
import yaml import yaml
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random as random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from .exceptions import ( from .exceptions import (

View File

@ -1,11 +1,11 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.ecs import ecs_backends from moto.ecs import ecs_backends
from moto.moto_api._internal import mock_random
from .exceptions import AWSValidationException from .exceptions import AWSValidationException
from collections import OrderedDict from collections import OrderedDict
from enum import Enum, unique from enum import Enum, unique
import time import time
import uuid
@unique @unique
@ -418,7 +418,7 @@ class FakeApplicationAutoscalingPolicy(BaseModel):
self.scalable_dimension = scalable_dimension self.scalable_dimension = scalable_dimension
self.policy_name = policy_name self.policy_name = policy_name
self.policy_type = policy_type self.policy_type = policy_type
self._guid = uuid.uuid4() self._guid = mock_random.uuid4()
self.policy_arn = "arn:aws:autoscaling:{}:scalingPolicy:{}:resource/{}/{}:policyName/{}".format( self.policy_arn = "arn:aws:autoscaling:{}:scalingPolicy:{}:resource/{}/{}:policyName/{}".format(
region_name, region_name,
self._guid, self._guid,

View File

@ -2,10 +2,9 @@ import base64
from datetime import timedelta, datetime, timezone from datetime import timedelta, datetime, timezone
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from uuid import uuid4
from .exceptions import GraphqlAPINotFound from .exceptions import GraphqlAPINotFound
@ -66,7 +65,7 @@ class GraphqlAPI(BaseModel):
): ):
self.region = region self.region = region
self.name = name self.name = name
self.api_id = str(uuid4()) self.api_id = str(mock_random.uuid4())
self.authentication_type = authentication_type self.authentication_type = authentication_type
self.additional_authentication_providers = additional_authentication_providers self.additional_authentication_providers = additional_authentication_providers
self.lambda_authorizer_config = lambda_authorizer_config self.lambda_authorizer_config = lambda_authorizer_config
@ -157,7 +156,7 @@ class GraphqlAPI(BaseModel):
class GraphqlAPIKey(BaseModel): class GraphqlAPIKey(BaseModel):
def __init__(self, description, expires): def __init__(self, description, expires):
self.key_id = str(uuid4())[0:6] self.key_id = str(mock_random.uuid4())[0:6]
self.description = description self.description = description
self.expires = expires self.expires = expires
if not self.expires: if not self.expires:

View File

@ -2,8 +2,7 @@ import time
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from uuid import uuid4
class TaggableResourceMixin(object): class TaggableResourceMixin(object):
@ -66,7 +65,7 @@ class DataCatalog(TaggableResourceMixin, BaseModel):
class Execution(BaseModel): class Execution(BaseModel):
def __init__(self, query, context, config, workgroup): def __init__(self, query, context, config, workgroup):
self.id = str(uuid4()) self.id = str(mock_random.uuid4())
self.query = query self.query = query
self.context = context self.context = context
self.config = config self.config = config
@ -77,7 +76,7 @@ class Execution(BaseModel):
class NamedQuery(BaseModel): class NamedQuery(BaseModel):
def __init__(self, name, description, database, query_string, workgroup): def __init__(self, name, description, database, query_string, workgroup):
self.id = str(uuid4()) self.id = str(mock_random.uuid4())
self.name = name self.name = name
self.description = description self.description = description
self.database = database self.database = database

View File

@ -1,6 +1,4 @@
import itertools import itertools
import random
from uuid import uuid4
from moto.packages.boto.ec2.blockdevicemapping import ( from moto.packages.boto.ec2.blockdevicemapping import (
BlockDeviceType, BlockDeviceType,
@ -15,6 +13,7 @@ from moto.ec2 import ec2_backends
from moto.elb import elb_backends from moto.elb import elb_backends
from moto.elbv2 import elbv2_backends from moto.elbv2 import elbv2_backends
from moto.elb.exceptions import LoadBalancerNotFoundError from moto.elb.exceptions import LoadBalancerNotFoundError
from moto.moto_api._internal import mock_random as random
from .exceptions import ( from .exceptions import (
AutoscalingClientError, AutoscalingClientError,
ResourceContentionError, ResourceContentionError,
@ -375,7 +374,7 @@ class FakeAutoScalingGroup(CloudFormationModel):
self.autoscaling_backend = autoscaling_backend self.autoscaling_backend = autoscaling_backend
self.ec2_backend = ec2_backend self.ec2_backend = ec2_backend
self.name = name self.name = name
self._id = str(uuid4()) self._id = str(random.uuid4())
self.region = self.autoscaling_backend.region_name self.region = self.autoscaling_backend.region_name
self.account_id = self.autoscaling_backend.account_id self.account_id = self.autoscaling_backend.account_id
self.service_linked_role = f"arn:aws:iam::{self.account_id}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling" self.service_linked_role = f"arn:aws:iam::{self.account_id}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling"

View File

@ -1,11 +1,8 @@
import datetime import datetime
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import ( from moto.core.utils import iso_8601_datetime_with_milliseconds
amz_crc32, from moto.utilities.aws_headers import amz_crc32, amzn_request_id
amzn_request_id,
iso_8601_datetime_with_milliseconds,
)
from .models import autoscaling_backends from .models import autoscaling_backends

View File

@ -16,7 +16,6 @@ import os
import json import json
import re import re
import zipfile import zipfile
import uuid
import tarfile import tarfile
import calendar import calendar
import threading import threading
@ -26,11 +25,12 @@ import requests.exceptions
from moto.awslambda.policy import Policy from moto.awslambda.policy import Policy
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.exceptions import RESTError from moto.core.exceptions import RESTError
from moto.core.utils import unix_time_millis, BackendDict
from moto.iam.models import iam_backends from moto.iam.models import iam_backends
from moto.iam.exceptions import IAMNotFoundException from moto.iam.exceptions import IAMNotFoundException
from moto.core.utils import unix_time_millis, BackendDict
from moto.s3.models import s3_backends
from moto.logs.models import logs_backends from moto.logs.models import logs_backends
from moto.moto_api._internal import mock_random as random
from moto.s3.models import s3_backends
from moto.s3.exceptions import MissingBucket, MissingKey from moto.s3.exceptions import MissingBucket, MissingKey
from moto import settings from moto import settings
from .exceptions import ( from .exceptions import (
@ -54,7 +54,6 @@ from moto.dynamodb import dynamodb_backends
from moto.dynamodbstreams import dynamodbstreams_backends from moto.dynamodbstreams import dynamodbstreams_backends
from moto.utilities.docker_utilities import DockerModel, parse_image_ref from moto.utilities.docker_utilities import DockerModel, parse_image_ref
from tempfile import TemporaryDirectory from tempfile import TemporaryDirectory
from uuid import uuid4
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -335,7 +334,7 @@ class LambdaAlias(BaseModel):
self.function_version = function_version self.function_version = function_version
self.description = description self.description = description
self.routing_config = routing_config self.routing_config = routing_config
self.revision_id = str(uuid4()) self.revision_id = str(random.uuid4())
def update(self, description, function_version, routing_config): def update(self, description, function_version, routing_config):
if description is not None: if description is not None:
@ -439,7 +438,7 @@ class LambdaFunction(CloudFormationModel, DockerModel):
) = _zipfile_content(self.code["ZipFile"]) ) = _zipfile_content(self.code["ZipFile"])
# TODO: we should be putting this in a lambda bucket # TODO: we should be putting this in a lambda bucket
self.code["UUID"] = str(uuid.uuid4()) self.code["UUID"] = str(random.uuid4())
self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"]) self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"])
elif "S3Bucket" in self.code: elif "S3Bucket" in self.code:
key = _validate_s3_bucket_and_key(self.account_id, data=self.code) key = _validate_s3_bucket_and_key(self.account_id, data=self.code)
@ -610,7 +609,7 @@ class LambdaFunction(CloudFormationModel, DockerModel):
) = _zipfile_content(updated_spec["ZipFile"]) ) = _zipfile_content(updated_spec["ZipFile"])
# TODO: we should be putting this in a lambda bucket # TODO: we should be putting this in a lambda bucket
self.code["UUID"] = str(uuid.uuid4()) self.code["UUID"] = str(random.uuid4())
self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"]) self.code["S3Key"] = "{}-{}".format(self.function_name, self.code["UUID"])
elif "S3Bucket" in updated_spec and "S3Key" in updated_spec: elif "S3Bucket" in updated_spec and "S3Key" in updated_spec:
key = None key = None
@ -757,7 +756,7 @@ class LambdaFunction(CloudFormationModel, DockerModel):
def save_logs(self, output): def save_logs(self, output):
# Send output to "logs" backend # Send output to "logs" backend
invoke_id = uuid.uuid4().hex invoke_id = random.uuid4().hex
log_stream_name = ( log_stream_name = (
"{date.year}/{date.month:02d}/{date.day:02d}/[{version}]{invoke_id}".format( "{date.year}/{date.month:02d}/{date.day:02d}/[{version}]{invoke_id}".format(
date=datetime.datetime.utcnow(), date=datetime.datetime.utcnow(),
@ -935,7 +934,7 @@ class FunctionUrlConfig:
def __init__(self, function: LambdaFunction, config): def __init__(self, function: LambdaFunction, config):
self.function = function self.function = function
self.config = config self.config = config
self.url = f"https://{uuid.uuid4().hex}.lambda-url.{function.region}.on.aws" self.url = f"https://{random.uuid4().hex}.lambda-url.{function.region}.on.aws"
self.created = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S") self.created = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%S")
self.last_modified = self.created self.last_modified = self.created
@ -970,7 +969,7 @@ class EventSourceMapping(CloudFormationModel):
self.starting_position_timestamp = spec.get("StartingPositionTimestamp", None) self.starting_position_timestamp = spec.get("StartingPositionTimestamp", None)
self.function_arn = spec["FunctionArn"] self.function_arn = spec["FunctionArn"]
self.uuid = str(uuid.uuid4()) self.uuid = str(random.uuid4())
self.last_modified = time.mktime(datetime.datetime.utcnow().timetuple()) self.last_modified = time.mktime(datetime.datetime.utcnow().timetuple())
def _get_service_source_from_arn(self, event_source_arn): def _get_service_source_from_arn(self, event_source_arn):

View File

@ -1,15 +1,15 @@
import json import json
import uuid
from moto.awslambda.exceptions import ( from moto.awslambda.exceptions import (
PreconditionFailedException, PreconditionFailedException,
UnknownPolicyException, UnknownPolicyException,
) )
from moto.moto_api._internal import mock_random
class Policy: class Policy:
def __init__(self, parent): def __init__(self, parent):
self.revision = str(uuid.uuid4()) self.revision = str(mock_random.uuid4())
self.statements = [] self.statements = []
self.parent = parent self.parent = parent
@ -45,7 +45,7 @@ class Policy:
policy.statements[0]["Resource"] + ":" + qualifier policy.statements[0]["Resource"] + ":" + qualifier
) )
self.statements.append(policy.statements[0]) self.statements.append(policy.statements[0])
self.revision = str(uuid.uuid4()) self.revision = str(mock_random.uuid4())
# removes the statement that matches 'sid' from the policy # removes the statement that matches 'sid' from the policy
def del_statement(self, sid, revision=""): def del_statement(self, sid, revision=""):
@ -73,7 +73,7 @@ class Policy:
# set some default values if these keys are not set # set some default values if these keys are not set
self.ensure_set(obj, "Effect", "Allow") self.ensure_set(obj, "Effect", "Allow")
self.ensure_set(obj, "Resource", self.parent.function_arn + ":$LATEST") self.ensure_set(obj, "Resource", self.parent.function_arn + ":$LATEST")
self.ensure_set(obj, "StatementId", str(uuid.uuid4())) self.ensure_set(obj, "StatementId", str(mock_random.uuid4()))
# transform field names and values # transform field names and values
self.transform_property(obj, "StatementId", "Sid", self.nop_formatter) self.transform_property(obj, "StatementId", "Sid", self.nop_formatter)

View File

@ -3,7 +3,8 @@ import sys
from urllib.parse import unquote from urllib.parse import unquote
from moto.core.utils import amz_crc32, amzn_request_id, path_url from moto.core.utils import path_url
from moto.utilities.aws_headers import amz_crc32, amzn_request_id
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from .models import lambda_backends from .models import lambda_backends

View File

@ -3,7 +3,6 @@ from itertools import cycle
from time import sleep from time import sleep
import datetime import datetime
import time import time
import uuid
import logging import logging
import threading import threading
import dateutil.parser import dateutil.parser
@ -29,6 +28,7 @@ from moto.ec2.models.instance_types import INSTANCE_FAMILIES as EC2_INSTANCE_FAM
from moto.iam.exceptions import IAMNotFoundException from moto.iam.exceptions import IAMNotFoundException
from moto.core.utils import unix_time_millis, BackendDict from moto.core.utils import unix_time_millis, BackendDict
from moto.moto_api import state_manager 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.moto_api._internal.managed_state_model import ManagedState
from moto.utilities.docker_utilities import DockerModel from moto.utilities.docker_utilities import DockerModel
from moto import settings from moto import settings
@ -444,7 +444,7 @@ class Job(threading.Thread, BaseModel, DockerModel, ManagedState):
) )
self.job_name = name self.job_name = name
self.job_id = str(uuid.uuid4()) self.job_id = str(mock_random.uuid4())
self.job_definition = job_def self.job_definition = job_def
self.container_overrides = container_overrides or {} self.container_overrides = container_overrides or {}
self.job_queue = job_queue self.job_queue = job_queue
@ -1110,7 +1110,7 @@ class BatchBackend(BaseBackend):
# Create ECS cluster # Create ECS cluster
# Should be of format P2OnDemand_Batch_UUID # Should be of format P2OnDemand_Batch_UUID
cluster_name = "OnDemand_Batch_" + str(uuid.uuid4()) cluster_name = "OnDemand_Batch_" + str(mock_random.uuid4())
ecs_cluster = self.ecs_backend.create_cluster(cluster_name) ecs_cluster = self.ecs_backend.create_cluster(cluster_name)
new_comp_env.set_ecs(ecs_cluster.arn, cluster_name) new_comp_env.set_ecs(ecs_cluster.arn, cluster_name)

View File

@ -3,7 +3,7 @@
from .exceptions import CostCategoryNotFound from .exceptions import CostCategoryNotFound
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from uuid import uuid4 from moto.moto_api._internal import mock_random
class CostCategoryDefinition(BaseModel): class CostCategoryDefinition(BaseModel):
@ -15,7 +15,7 @@ class CostCategoryDefinition(BaseModel):
self.rules = rules self.rules = rules
self.default_value = default_value self.default_value = default_value
self.split_charge_rules = split_charge_rules self.split_charge_rules = split_charge_rules
self.arn = f"arn:aws:ce::{account_id}:costcategory/{str(uuid4())}" self.arn = f"arn:aws:ce::{account_id}:costcategory/{str(mock_random.uuid4())}"
def update(self, rule_version, rules, default_value, split_charge_rules): def update(self, rule_version, rules, default_value, split_charge_rules):
self.rule_version = rule_version self.rule_version = rule_version

View File

@ -4,7 +4,7 @@ import threading
from moto import settings from moto import settings
from moto.core import CloudFormationModel from moto.core import CloudFormationModel
from moto.awslambda import lambda_backends from moto.awslambda import lambda_backends
from uuid import uuid4 from moto.moto_api._internal import mock_random
class CustomModel(CloudFormationModel): class CustomModel(CloudFormationModel):
@ -44,7 +44,7 @@ class CustomModel(CloudFormationModel):
backend = lambda_backends[account_id][region_name] backend = lambda_backends[account_id][region_name]
fn = backend.get_function(service_token) fn = backend.get_function(service_token)
request_id = str(uuid4()) request_id = str(mock_random.uuid4())
custom_resource = CustomModel( custom_resource = CustomModel(
region_name, request_id, logical_id, resource_name region_name, request_id, logical_id, resource_name

View File

@ -1,7 +1,6 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
import json import json
import yaml import yaml
import uuid
from collections import OrderedDict from collections import OrderedDict
from yaml.parser import ParserError # pylint:disable=c-extension-no-member from yaml.parser import ParserError # pylint:disable=c-extension-no-member
@ -13,6 +12,7 @@ from moto.core.utils import (
iso_8601_datetime_without_milliseconds, iso_8601_datetime_without_milliseconds,
BackendDict, BackendDict,
) )
from moto.moto_api._internal import mock_random
from moto.sns.models import sns_backends from moto.sns.models import sns_backends
from .parsing import ResourceMap, OutputMap from .parsing import ResourceMap, OutputMap
@ -103,7 +103,7 @@ class FakeStackSet(BaseModel):
operation_id=None, operation_id=None,
): ):
if not operation_id: if not operation_id:
operation_id = uuid.uuid4() operation_id = mock_random.uuid4()
self.template = template if template else self.template self.template = template if template else self.template
self.description = description if description is not None else self.description self.description = description if description is not None else self.description
@ -126,7 +126,7 @@ class FakeStackSet(BaseModel):
def create_stack_instances(self, accounts, regions, parameters, operation_id=None): def create_stack_instances(self, accounts, regions, parameters, operation_id=None):
if not operation_id: if not operation_id:
operation_id = uuid.uuid4() operation_id = mock_random.uuid4()
if not parameters: if not parameters:
parameters = self.parameters parameters = self.parameters
@ -141,7 +141,7 @@ class FakeStackSet(BaseModel):
def delete_stack_instances(self, accounts, regions, operation_id=None): def delete_stack_instances(self, accounts, regions, operation_id=None):
if not operation_id: if not operation_id:
operation_id = uuid.uuid4() operation_id = mock_random.uuid4()
self.instances.delete(accounts, regions) self.instances.delete(accounts, regions)
@ -156,7 +156,7 @@ class FakeStackSet(BaseModel):
def update_instances(self, accounts, regions, parameters, operation_id=None): def update_instances(self, accounts, regions, parameters, operation_id=None):
if not operation_id: if not operation_id:
operation_id = uuid.uuid4() operation_id = mock_random.uuid4()
self.instances.update(accounts, regions, parameters) self.instances.update(accounts, regions, parameters)
operation = self._create_operation( operation = self._create_operation(
@ -488,7 +488,7 @@ class FakeEvent(BaseModel):
self.resource_status_reason = resource_status_reason self.resource_status_reason = resource_status_reason
self.resource_properties = resource_properties self.resource_properties = resource_properties
self.timestamp = datetime.utcnow() self.timestamp = datetime.utcnow()
self.event_id = uuid.uuid4() self.event_id = mock_random.uuid4()
self.client_request_token = client_request_token self.client_request_token = client_request_token
def sendToSns(self, account_id, region, sns_topic_arns): def sendToSns(self, account_id, region, sns_topic_arns):

View File

@ -5,9 +5,9 @@ from yaml.parser import ParserError # pylint:disable=c-extension-no-member
from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id
from moto.s3.models import s3_backends from moto.s3.models import s3_backends
from moto.s3.exceptions import S3ClientError from moto.s3.exceptions import S3ClientError
from moto.utilities.aws_headers import amzn_request_id
from .models import cloudformation_backends from .models import cloudformation_backends
from .exceptions import ValidationError, MissingParameterError from .exceptions import ValidationError, MissingParameterError
from .utils import yaml_tag_constructor from .utils import yaml_tag_constructor

View File

@ -1,22 +1,21 @@
import uuid
import random
import yaml import yaml
import os import os
import string import string
from moto.moto_api._internal import mock_random as random
def generate_stack_id(stack_name, region, account): def generate_stack_id(stack_name, region, account):
random_id = uuid.uuid4() random_id = random.uuid4()
return f"arn:aws:cloudformation:{region}:{account}:stack/{stack_name}/{random_id}" return f"arn:aws:cloudformation:{region}:{account}:stack/{stack_name}/{random_id}"
def generate_changeset_id(changeset_name, region_name, account_id): def generate_changeset_id(changeset_name, region_name, account_id):
random_id = uuid.uuid4() random_id = random.uuid4()
return f"arn:aws:cloudformation:{region_name}:{account_id}:changeSet/{changeset_name}/{random_id}" return f"arn:aws:cloudformation:{region_name}:{account_id}:changeSet/{changeset_name}/{random_id}"
def generate_stackset_id(stackset_name): def generate_stackset_id(stackset_name):
random_id = uuid.uuid4() random_id = random.uuid4()
return "{}:{}".format(stackset_name, random_id) return "{}:{}".format(stackset_name, random_id)

View File

@ -1,4 +1,3 @@
import random
import string import string
from datetime import datetime from datetime import datetime
@ -6,8 +5,8 @@ from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, iso_8601_datetime_with_milliseconds from moto.core.utils import BackendDict, iso_8601_datetime_with_milliseconds
from moto.moto_api import state_manager from moto.moto_api import state_manager
from moto.moto_api._internal.managed_state_model import ManagedState from moto.moto_api._internal.managed_state_model import ManagedState
from moto.moto_api._internal import mock_random as random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from uuid import uuid4
from .exceptions import ( from .exceptions import (
OriginDoesNotExist, OriginDoesNotExist,
@ -153,7 +152,7 @@ class DistributionConfig:
self.enabled = config.get("Enabled") or False self.enabled = config.get("Enabled") or False
self.viewer_certificate = ViewerCertificate() self.viewer_certificate = ViewerCertificate()
self.geo_restriction = GeoRestrictions(config.get("Restrictions") or {}) self.geo_restriction = GeoRestrictions(config.get("Restrictions") or {})
self.caller_reference = config.get("CallerReference", str(uuid4())) self.caller_reference = config.get("CallerReference", str(random.uuid4()))
self.origins = config["Origins"]["Items"]["Origin"] self.origins = config["Origins"]["Items"]["Origin"]
if not isinstance(self.origins, list): if not isinstance(self.origins, list):
self.origins = [self.origins] self.origins = [self.origins]

View File

@ -6,9 +6,9 @@ from moto.core.utils import (
iso_8601_datetime_with_nanoseconds, iso_8601_datetime_with_nanoseconds,
BackendDict, BackendDict,
) )
from moto.moto_api._internal import mock_random
from datetime import datetime, timedelta from datetime import datetime, timedelta
from dateutil.tz import tzutc from dateutil.tz import tzutc
from uuid import uuid4
from .exceptions import ( from .exceptions import (
InvalidFormat, InvalidFormat,
@ -678,7 +678,7 @@ class CloudWatchBackend(BaseBackend):
def _get_paginated(self, metrics): def _get_paginated(self, metrics):
if len(metrics) > 500: if len(metrics) > 500:
next_token = str(uuid4()) next_token = str(mock_random.uuid4())
self.paged_metric_data[next_token] = metrics[500:] self.paged_metric_data[next_token] = metrics[500:]
return next_token, metrics[0:500] return next_token, metrics[0:500]
else: else:

View File

@ -3,7 +3,7 @@ import json
from dateutil.parser import parse as dtparse from dateutil.parser import parse as dtparse
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id from moto.utilities.aws_headers import amzn_request_id
from .models import cloudwatch_backends, MetricDataQuery, MetricStat, Metric, Dimension from .models import cloudwatch_backends, MetricDataQuery, MetricStat, Metric, Dimension
from .exceptions import InvalidParameterCombination from .exceptions import InvalidParameterCombination

View File

@ -1,10 +1,9 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
from moto.moto_api._internal import mock_random
from collections import defaultdict from collections import defaultdict
from random import randint
from dateutil import parser from dateutil import parser
import datetime import datetime
import uuid
class CodeBuildProjectMetadata(BaseModel): class CodeBuildProjectMetadata(BaseModel):
@ -26,7 +25,7 @@ class CodeBuildProjectMetadata(BaseModel):
"arn" "arn"
] = f"arn:aws:codebuild:{region_name}:{account_id}:build/{build_id}" ] = f"arn:aws:codebuild:{region_name}:{account_id}:build/{build_id}"
self.build_metadata["buildNumber"] = randint(1, 100) self.build_metadata["buildNumber"] = mock_random.randint(1, 100)
self.build_metadata["startTime"] = current_date self.build_metadata["startTime"] = current_date
self.build_metadata["currentPhase"] = "QUEUED" self.build_metadata["currentPhase"] = "QUEUED"
self.build_metadata["buildStatus"] = "IN_PROGRESS" self.build_metadata["buildStatus"] = "IN_PROGRESS"
@ -168,7 +167,7 @@ class CodeBuildBackend(BaseBackend):
def start_build(self, project_name, source_version=None, artifact_override=None): def start_build(self, project_name, source_version=None, artifact_override=None):
build_id = "{0}:{1}".format(project_name, uuid.uuid4()) build_id = "{0}:{1}".format(project_name, mock_random.uuid4())
# construct a new build # construct a new build
self.build_metadata[project_name] = CodeBuildProjectMetadata( self.build_metadata[project_name] = CodeBuildProjectMetadata(
@ -215,7 +214,7 @@ class CodeBuildBackend(BaseBackend):
phase["phaseStatus"] = "SUCCEEDED" phase["phaseStatus"] = "SUCCEEDED"
phase["startTime"] = current_date phase["startTime"] = current_date
phase["endTime"] = current_date phase["endTime"] = current_date
phase["durationInSeconds"] = randint(10, 100) phase["durationInSeconds"] = mock_random.randint(10, 100)
phases.append(phase) phases.append(phase)
return phases return phases
@ -229,7 +228,7 @@ class CodeBuildBackend(BaseBackend):
build["phases"] = self._set_phases(build["phases"]) build["phases"] = self._set_phases(build["phases"])
build["endTime"] = iso_8601_datetime_with_milliseconds( build["endTime"] = iso_8601_datetime_with_milliseconds(
parser.parse(build["startTime"]) parser.parse(build["startTime"])
+ datetime.timedelta(minutes=randint(1, 5)) + datetime.timedelta(minutes=mock_random.randint(1, 5))
) )
build["currentPhase"] = "COMPLETED" build["currentPhase"] = "COMPLETED"
build["buildStatus"] = "SUCCEEDED" build["buildStatus"] = "SUCCEEDED"
@ -264,7 +263,7 @@ class CodeBuildBackend(BaseBackend):
build["phases"] = self._set_phases(build["phases"]) build["phases"] = self._set_phases(build["phases"])
build["endTime"] = iso_8601_datetime_with_milliseconds( build["endTime"] = iso_8601_datetime_with_milliseconds(
parser.parse(build["startTime"]) parser.parse(build["startTime"])
+ datetime.timedelta(minutes=randint(1, 5)) + datetime.timedelta(minutes=mock_random.randint(1, 5))
) )
build["currentPhase"] = "COMPLETED" build["currentPhase"] = "COMPLETED"
build["buildStatus"] = "STOPPED" build["buildStatus"] = "STOPPED"

View File

@ -1,8 +1,8 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
from moto.moto_api._internal import mock_random
from datetime import datetime from datetime import datetime
from .exceptions import RepositoryDoesNotExistException, RepositoryNameExistsException from .exceptions import RepositoryDoesNotExistException, RepositoryNameExistsException
import uuid
class CodeCommit(BaseModel): class CodeCommit(BaseModel):
@ -23,7 +23,7 @@ class CodeCommit(BaseModel):
self.repository_metadata["creationDate"] = current_date self.repository_metadata["creationDate"] = current_date
self.repository_metadata["lastModifiedDate"] = current_date self.repository_metadata["lastModifiedDate"] = current_date
self.repository_metadata["repositoryDescription"] = repository_description self.repository_metadata["repositoryDescription"] = repository_description
self.repository_metadata["repositoryId"] = str(uuid.uuid4()) self.repository_metadata["repositoryId"] = str(mock_random.uuid4())
self.repository_metadata[ self.repository_metadata[
"Arn" "Arn"
] = f"arn:aws:codecommit:{region}:{account_id}:{repository_name}" ] = f"arn:aws:codecommit:{region}:{account_id}:{repository_name}"

View File

@ -1,5 +1,5 @@
from uuid import uuid4 from moto.moto_api._internal import mock_random
def get_random_identity_id(region): def get_random_identity_id(region):
return "{0}:{1}".format(region, uuid4()) return "{0}:{1}".format(region, mock_random.uuid4())

View File

@ -3,13 +3,12 @@ import json
import os import os
import time import time
import typing import typing
import uuid
import enum import enum
import random
from jose import jws from jose import jws
from collections import OrderedDict from collections import OrderedDict
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random as random
from .exceptions import ( from .exceptions import (
GroupExistsException, GroupExistsException,
NotAuthorizedError, NotAuthorizedError,
@ -562,7 +561,7 @@ class CognitoIdpUserPool(BaseModel):
return id_token, expires_in return id_token, expires_in
def create_refresh_token(self, client_id, username): def create_refresh_token(self, client_id, username):
refresh_token = str(uuid.uuid4()) refresh_token = str(random.uuid4())
self.refresh_tokens[refresh_token] = (client_id, username) self.refresh_tokens[refresh_token] = (client_id, username)
return refresh_token return refresh_token
@ -633,7 +632,7 @@ class CognitoIdpUserPoolDomain(BaseModel):
if extended: if extended:
return { return {
"UserPoolId": self.user_pool_id, "UserPoolId": self.user_pool_id,
"AWSAccountId": str(uuid.uuid4()), "AWSAccountId": str(random.uuid4()),
"CloudFrontDistribution": distribution, "CloudFrontDistribution": distribution,
"Domain": self.domain, "Domain": self.domain,
"S3Bucket": None, "S3Bucket": None,
@ -649,7 +648,7 @@ class CognitoIdpUserPoolClient(BaseModel):
def __init__(self, user_pool_id, generate_secret, extended_config): def __init__(self, user_pool_id, generate_secret, extended_config):
self.user_pool_id = user_pool_id self.user_pool_id = user_pool_id
self.id = create_id() self.id = create_id()
self.secret = str(uuid.uuid4()) self.secret = str(random.uuid4())
self.generate_secret = generate_secret or False self.generate_secret = generate_secret or False
self.extended_config = extended_config or {} self.extended_config = extended_config or {}
@ -736,7 +735,7 @@ class CognitoIdpGroup(BaseModel):
class CognitoIdpUser(BaseModel): class CognitoIdpUser(BaseModel):
def __init__(self, user_pool_id, username, password, status, attributes): def __init__(self, user_pool_id, username, password, status, attributes):
self.id = str(uuid.uuid4()) self.id = str(random.uuid4())
self.user_pool_id = user_pool_id self.user_pool_id = user_pool_id
# Username is None when users sign up with an email or phone_number, # Username is None when users sign up with an email or phone_number,
# and should be given the value of the internal id generate (sub) # and should be given the value of the internal id generate (sub)
@ -1289,7 +1288,7 @@ class CognitoIdpBackend(BaseBackend):
UserStatus.FORCE_CHANGE_PASSWORD, UserStatus.FORCE_CHANGE_PASSWORD,
UserStatus.RESET_REQUIRED, UserStatus.RESET_REQUIRED,
]: ]:
session = str(uuid.uuid4()) session = str(random.uuid4())
self.sessions[session] = user_pool self.sessions[session] = user_pool
return { return {
@ -1635,15 +1634,15 @@ class CognitoIdpBackend(BaseBackend):
if user.status is UserStatus.UNCONFIRMED: if user.status is UserStatus.UNCONFIRMED:
raise UserNotConfirmedException("User is not confirmed.") raise UserNotConfirmedException("User is not confirmed.")
session = str(uuid.uuid4()) session = str(random.uuid4())
self.sessions[session] = user_pool self.sessions[session] = user_pool
return { return {
"ChallengeName": "PASSWORD_VERIFIER", "ChallengeName": "PASSWORD_VERIFIER",
"Session": session, "Session": session,
"ChallengeParameters": { "ChallengeParameters": {
"SALT": uuid.uuid4().hex, "SALT": random.uuid4().hex,
"SRP_B": uuid.uuid4().hex, "SRP_B": random.uuid4().hex,
"USERNAME": user.username, "USERNAME": user.username,
"USER_ID_FOR_SRP": user.id, "USER_ID_FOR_SRP": user.id,
"SECRET_BLOCK": session, "SECRET_BLOCK": session,
@ -1664,7 +1663,7 @@ class CognitoIdpBackend(BaseBackend):
if user.status is UserStatus.UNCONFIRMED: if user.status is UserStatus.UNCONFIRMED:
raise UserNotConfirmedException("User is not confirmed.") raise UserNotConfirmedException("User is not confirmed.")
session = str(uuid.uuid4()) session = str(random.uuid4())
self.sessions[session] = user_pool self.sessions[session] = user_pool
if user.status is UserStatus.FORCE_CHANGE_PASSWORD: if user.status is UserStatus.FORCE_CHANGE_PASSWORD:
@ -1732,7 +1731,7 @@ class CognitoIdpBackend(BaseBackend):
_, username = user_pool.access_tokens[access_token] _, username = user_pool.access_tokens[access_token]
self.admin_get_user(user_pool.id, username) self.admin_get_user(user_pool.id, username)
return {"SecretCode": str(uuid.uuid4())} return {"SecretCode": str(random.uuid4())}
raise NotAuthorizedError(access_token) raise NotAuthorizedError(access_token)

View File

@ -1,10 +1,9 @@
import random
import string import string
import hashlib import hashlib
import hmac import hmac
import base64 import base64
import re import re
import uuid from moto.moto_api._internal import mock_random as random
FORMATS = { FORMATS = {
"email": r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", "email": r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b",
@ -92,7 +91,7 @@ def generate_id(strategy, *args):
def _generate_id_uuid(): def _generate_id_uuid():
return uuid.uuid4().hex return random.uuid4().hex
def _generate_id_hash(args): def _generate_id_hash(args):

View File

@ -2,8 +2,6 @@
import json import json
import re import re
import time import time
import random
import string
from datetime import datetime from datetime import datetime
@ -53,6 +51,7 @@ from moto.core import BaseBackend, BaseModel
from moto.core.responses import AWSServiceSpec from moto.core.responses import AWSServiceSpec
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.iam.config import role_config_query, policy_config_query from moto.iam.config import role_config_query, policy_config_query
from moto.moto_api._internal import mock_random as random
from moto.s3.config import s3_config_query from moto.s3.config import s3_config_query
from moto.s3control.config import s3_account_public_access_block_query from moto.s3control.config import s3_account_public_access_block_query
from moto.utilities.utils import load_resource from moto.utilities.utils import load_resource
@ -107,11 +106,7 @@ def snake_to_camels(original, cap_start, cap_arn):
def random_string(): def random_string():
"""Returns a random set of 8 lowercase letters for the Config Aggregator ARN""" """Returns a random set of 8 lowercase letters for the Config Aggregator ARN"""
chars = [] return random.get_random_string(length=8, include_digits=False, lower_case=True)
for _ in range(0, 8):
chars.append(random.choice(string.ascii_lowercase))
return "".join(chars)
def validate_tag_key(tag_key, exception_param="tags.X.member.key"): def validate_tag_key(tag_key, exception_param="tags.X.member.key"):

View File

@ -1,4 +1,3 @@
import random
import re import re
import string import string
from collections import defaultdict from collections import defaultdict
@ -113,6 +112,8 @@ class BaseBackend:
@staticmethod @staticmethod
def vpce_random_number(): def vpce_random_number():
from moto.moto_api._internal import mock_random as random
"""Return random number for a VPC endpoint service ID.""" """Return random number for a VPC endpoint service ID."""
return "".join([random.choice(string.hexdigits.lower()) for i in range(17)]) return "".join([random.choice(string.hexdigits.lower()) for i in range(17)])

View File

@ -21,7 +21,6 @@ from .custom_responses_mock import (
not_implemented_callback, not_implemented_callback,
reset_responses_mock, reset_responses_mock,
) )
from .utils import convert_flask_to_responses_response
DEFAULT_ACCOUNT_ID = "123456789012" DEFAULT_ACCOUNT_ID = "123456789012"
@ -272,6 +271,9 @@ class BotocoreEventMockAWS(BaseMockAWS):
reset_responses_mock(responses_mock) reset_responses_mock(responses_mock)
def enable_patching(self, reset=True): # pylint: disable=unused-argument def enable_patching(self, reset=True): # pylint: disable=unused-argument
# Circumvent circular imports
from .utils import convert_flask_to_responses_response
botocore_stubber.enabled = True botocore_stubber.enabled = True
for method in BOTOCORE_HTTP_METHODS: for method in BOTOCORE_HTTP_METHODS:
for backend in self.backends_for_urls: for backend in self.backends_for_urls:

View File

@ -1,11 +1,8 @@
from functools import lru_cache, wraps from functools import lru_cache
import binascii
import datetime import datetime
import inspect import inspect
import random
import re import re
import string
from botocore.exceptions import ClientError from botocore.exceptions import ClientError
from boto3 import Session from boto3 import Session
from moto.settings import allow_unknown_region from moto.settings import allow_unknown_region
@ -14,10 +11,6 @@ from urllib.parse import urlparse
from uuid import uuid4 from uuid import uuid4
REQUEST_ID_LONG = string.digits + string.ascii_uppercase
HEX_CHARS = list(range(10)) + ["a", "b", "c", "d", "e", "f"]
def camelcase_to_underscores(argument): def camelcase_to_underscores(argument):
"""Converts a camelcase param like theNewAttribute to the equivalent """Converts a camelcase param like theNewAttribute to the equivalent
python underscore variable like the_new_attribute""" python underscore variable like the_new_attribute"""
@ -75,20 +68,6 @@ def method_names_from_class(clazz):
return [x[0] for x in inspect.getmembers(clazz, predicate=predicate)] return [x[0] for x in inspect.getmembers(clazz, predicate=predicate)]
def get_random_hex(length=8):
return "".join(str(random.choice(HEX_CHARS)) for _ in range(length))
def get_random_message_id():
return "{0}-{1}-{2}-{3}-{4}".format(
get_random_hex(8),
get_random_hex(4),
get_random_hex(4),
get_random_hex(4),
get_random_hex(12),
)
def convert_regex_to_flask_path(url_path): def convert_regex_to_flask_path(url_path):
""" """
Converts a regex matching url to one that can be used with flask Converts a regex matching url to one that can be used with flask
@ -206,86 +185,6 @@ def unix_time_millis(dt=None):
return unix_time(dt) * 1000.0 return unix_time(dt) * 1000.0
def gen_amz_crc32(response, headerdict=None):
if not isinstance(response, bytes):
response = response.encode("utf-8")
crc = binascii.crc32(response)
if headerdict is not None and isinstance(headerdict, dict):
headerdict.update({"x-amz-crc32": str(crc)})
return crc
def gen_amzn_requestid_long(headerdict=None):
req_id = "".join([random.choice(REQUEST_ID_LONG) for _ in range(0, 52)])
if headerdict is not None and isinstance(headerdict, dict):
headerdict.update({"x-amzn-requestid": req_id})
return req_id
def amz_crc32(f):
@wraps(f)
def _wrapper(*args, **kwargs):
response = f(*args, **kwargs)
headers = {}
status = 200
if isinstance(response, str):
body = response
else:
if len(response) == 2:
body, new_headers = response
status = new_headers.get("status", 200)
else:
status, new_headers, body = response
headers.update(new_headers)
# Cast status to string
if "status" in headers:
headers["status"] = str(headers["status"])
gen_amz_crc32(body, headers)
return status, headers, body
return _wrapper
def amzn_request_id(f):
@wraps(f)
def _wrapper(*args, **kwargs):
response = f(*args, **kwargs)
headers = {}
status = 200
if isinstance(response, str):
body = response
else:
if len(response) == 2:
body, new_headers = response
status = new_headers.get("status", 200)
else:
status, new_headers, body = response
headers.update(new_headers)
request_id = gen_amzn_requestid_long(headers)
# Update request ID in XML
try:
body = re.sub(r"(?<=<RequestId>).*(?=<\/RequestId>)", request_id, body)
except Exception: # Will just ignore if it cant work
pass
return status, headers, body
return _wrapper
def path_url(url): def path_url(url):
parsed_url = urlparse(url) parsed_url = urlparse(url)
path = parsed_url.path path = parsed_url.path

View File

@ -2,7 +2,7 @@ import json
from urllib.parse import urlparse from urllib.parse import urlparse
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id from moto.utilities.aws_headers import amzn_request_id
from .models import databrew_backends from .models import databrew_backends

View File

@ -1,9 +1,9 @@
import collections.abc as collections_abc import collections.abc as collections_abc
from moto.core.utils import get_random_hex from moto.moto_api._internal import mock_random
def get_random_pipeline_id(): def get_random_pipeline_id():
return "df-{0}".format(get_random_hex(length=19)) return "df-{0}".format(mock_random.get_random_hex(length=19))
def remove_capitalization_of_dict_keys(obj): def remove_capitalization_of_dict_keys(obj):

View File

@ -1,7 +1,8 @@
"""DAXBackend class with methods for supported APIs.""" """DAXBackend class with methods for supported APIs."""
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, get_random_hex, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api import state_manager 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.moto_api._internal.managed_state_model import ManagedState
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
@ -89,7 +90,7 @@ class DaxCluster(BaseModel, ManagedState):
self.arn = f"arn:aws:dax:{region}:{account_id}:cache/{self.name}" self.arn = f"arn:aws:dax:{region}:{account_id}:cache/{self.name}"
self.node_type = node_type self.node_type = node_type
self.replication_factor = replication_factor self.replication_factor = replication_factor
self.cluster_hex = get_random_hex(6) self.cluster_hex = random.get_random_hex(6)
self.endpoint = DaxEndpoint( self.endpoint = DaxEndpoint(
name=name, cluster_hex=self.cluster_hex, region=region name=name, cluster_hex=self.cluster_hex, region=region
) )
@ -99,7 +100,10 @@ class DaxCluster(BaseModel, ManagedState):
self.iam_role_arn = iam_role_arn self.iam_role_arn = iam_role_arn
self.parameter_group = DaxParameterGroup() self.parameter_group = DaxParameterGroup()
self.security_groups = [ self.security_groups = [
{"SecurityGroupIdentifier": f"sg-{get_random_hex(10)}", "Status": "active"} {
"SecurityGroupIdentifier": f"sg-{random.get_random_hex(10)}",
"Status": "active",
}
] ]
self.sse_specification = sse_specification self.sse_specification = sse_specification
self.encryption_type = encryption_type self.encryption_type = encryption_type

View File

@ -2,7 +2,7 @@
from datetime import datetime, timezone from datetime import datetime, timezone
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import get_random_hex, BackendDict from moto.core.utils import BackendDict
from moto.ds.exceptions import ( from moto.ds.exceptions import (
ClientException, ClientException,
DirectoryLimitExceededException, DirectoryLimitExceededException,
@ -16,6 +16,7 @@ from moto.ds.utils import PAGINATION_MODEL
from moto.ds.validations import validate_args from moto.ds.validations import validate_args
from moto.ec2.exceptions import InvalidSubnetIdError from moto.ec2.exceptions import InvalidSubnetIdError
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.moto_api._internal import mock_random
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
@ -71,7 +72,7 @@ class Directory(BaseModel): # pylint: disable=too-many-instance-attributes
self.edition = edition self.edition = edition
# Calculated or default values for the directory attributes. # Calculated or default values for the directory attributes.
self.directory_id = f"d-{get_random_hex(10)}" self.directory_id = f"d-{mock_random.get_random_hex(10)}"
self.access_url = f"{self.directory_id}.awsapps.com" self.access_url = f"{self.directory_id}.awsapps.com"
self.alias = self.directory_id self.alias = self.directory_id
self.desired_number_of_domain_controllers = 0 self.desired_number_of_domain_controllers = 0

View File

@ -4,7 +4,6 @@ import datetime
import decimal import decimal
import json import json
import re import re
import uuid
from collections import OrderedDict from collections import OrderedDict
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
@ -40,6 +39,7 @@ from moto.dynamodb.parsing.executors import UpdateExpressionExecutor
from moto.dynamodb.parsing.expressions import UpdateExpressionParser from moto.dynamodb.parsing.expressions import UpdateExpressionParser
from moto.dynamodb.parsing.validators import UpdateExpressionValidator from moto.dynamodb.parsing.validators import UpdateExpressionValidator
from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH
from moto.moto_api._internal import mock_random
class DynamoJsonEncoder(json.JSONEncoder): class DynamoJsonEncoder(json.JSONEncoder):
@ -222,7 +222,7 @@ class StreamRecord(BaseModel):
keys[table.range_key_attr] = rec.range_key.to_json() keys[table.range_key_attr] = rec.range_key.to_json()
self.record = { self.record = {
"eventID": uuid.uuid4().hex, "eventID": mock_random.uuid4().hex,
"eventName": event_name, "eventName": event_name,
"eventSource": "aws:dynamodb", "eventSource": "aws:dynamodb",
"eventVersion": "1.0", "eventVersion": "1.0",
@ -1125,7 +1125,7 @@ class Backup(object):
def _make_identifier(self): def _make_identifier(self):
timestamp = int(unix_time_millis(self.creation_date_time)) timestamp = int(unix_time_millis(self.creation_date_time))
timestamp_padded = str("0" + str(timestamp))[-16:16] timestamp_padded = str("0" + str(timestamp))[-16:16]
guid = str(uuid.uuid4()) guid = str(mock_random.uuid4())
guid_shortened = guid[:8] guid_shortened = guid[:8]
return "{}-{}".format(timestamp_padded, guid_shortened) return "{}-{}".format(timestamp_padded, guid_shortened)

View File

@ -5,7 +5,7 @@ import itertools
from functools import wraps from functools import wraps
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import camelcase_to_underscores, amz_crc32, amzn_request_id from moto.core.utils import camelcase_to_underscores
from moto.dynamodb.parsing.key_condition_expression import parse_expression from moto.dynamodb.parsing.key_condition_expression import parse_expression
from moto.dynamodb.parsing.reserved_keywords import ReservedKeywords from moto.dynamodb.parsing.reserved_keywords import ReservedKeywords
from .exceptions import ( from .exceptions import (
@ -14,6 +14,7 @@ from .exceptions import (
ConditionalCheckFailed, ConditionalCheckFailed,
) )
from moto.dynamodb.models import dynamodb_backends, dynamo_json_dump from moto.dynamodb.models import dynamodb_backends, dynamo_json_dump
from moto.utilities.aws_headers import amz_crc32, amzn_request_id
TRANSACTION_MAX_ITEMS = 25 TRANSACTION_MAX_ITEMS = 25

View File

@ -4,7 +4,7 @@ from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.ec2.models.elastic_block_store import Snapshot from moto.ec2.models.elastic_block_store import Snapshot
from uuid import uuid4 from moto.moto_api._internal import mock_random
class Block(BaseModel): class Block(BaseModel):
@ -13,7 +13,7 @@ class Block(BaseModel):
self.checksum = checksum self.checksum = checksum
self.checksum_algorithm = checksum_algorithm self.checksum_algorithm = checksum_algorithm
self.data_length = data_length self.data_length = data_length
self.block_token = str(uuid4()) self.block_token = str(mock_random.uuid4())
class EBSSnapshot(BaseModel): class EBSSnapshot(BaseModel):

View File

@ -1,5 +1,5 @@
from moto.core import CloudFormationModel from moto.core import CloudFormationModel
from moto.core.utils import get_random_hex from moto.moto_api._internal import mock_random
from .core import TaggedEC2Resource from .core import TaggedEC2Resource
from ..exceptions import UnknownVpcEndpointService from ..exceptions import UnknownVpcEndpointService
@ -8,7 +8,7 @@ class VPCServiceConfiguration(TaggedEC2Resource, CloudFormationModel):
def __init__( def __init__(
self, load_balancers, region, acceptance_required, private_dns_name, ec2_backend self, load_balancers, region, acceptance_required, private_dns_name, ec2_backend
): ):
self.id = f"vpce-svc-{get_random_hex(length=8)}" self.id = f"vpce-svc-{mock_random.get_random_hex(length=8)}"
self.service_name = f"com.amazonaws.vpce.{region}.{self.id}" self.service_name = f"com.amazonaws.vpce.{region}.{self.id}"
self.service_state = "Available" self.service_state = "Available"

View File

@ -1,5 +1,5 @@
import uuid
from moto.ec2.exceptions import FilterNotImplementedError from moto.ec2.exceptions import FilterNotImplementedError
from moto.moto_api._internal import mock_random
from ._base_response import EC2BaseResponse from ._base_response import EC2BaseResponse
from xml.etree import ElementTree from xml.etree import ElementTree
@ -10,7 +10,7 @@ def xml_root(name):
root = ElementTree.Element( root = ElementTree.Element(
name, {"xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/"} name, {"xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/"}
) )
request_id = str(uuid.uuid4()) + "example" request_id = str(mock_random.uuid4()) + "example"
ElementTree.SubElement(root, "requestId").text = request_id ElementTree.SubElement(root, "requestId").text = request_id
return root return root

View File

@ -1,5 +1,5 @@
import random
from moto.core.utils import camelcase_to_underscores from moto.core.utils import camelcase_to_underscores
from moto.moto_api._internal import mock_random as random
from ._base_response import EC2BaseResponse from ._base_response import EC2BaseResponse

View File

@ -1,6 +1,5 @@
import base64 import base64
import fnmatch import fnmatch
import random
import re import re
import ipaddress import ipaddress
@ -10,6 +9,7 @@ from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives.asymmetric import rsa
from moto.iam import iam_backends from moto.iam import iam_backends
from moto.moto_api._internal import mock_random as random
from moto.utilities.utils import md5_hash from moto.utilities.utils import md5_hash
EC2_RESOURCE_TO_PREFIX = { EC2_RESOURCE_TO_PREFIX = {

View File

@ -1,10 +1,8 @@
import hashlib import hashlib
import json import json
import re import re
import uuid
from collections import namedtuple from collections import namedtuple
from datetime import datetime, timezone from datetime import datetime, timezone
from random import random
from typing import Dict, List from typing import Dict, List
from botocore.exceptions import ParamValidationError from botocore.exceptions import ParamValidationError
@ -27,6 +25,7 @@ from moto.ecr.exceptions import (
from moto.ecr.policy_validation import EcrLifecyclePolicyValidator from moto.ecr.policy_validation import EcrLifecyclePolicyValidator
from moto.iam.exceptions import MalformedPolicyDocument from moto.iam.exceptions import MalformedPolicyDocument
from moto.iam.policy_validation import IAMPolicyDocumentValidator from moto.iam.policy_validation import IAMPolicyDocumentValidator
from moto.moto_api._internal import mock_random as random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
ECR_REPOSITORY_ARN_PATTERN = "^arn:(?P<partition>[^:]+):ecr:(?P<region>[^:]+):(?P<account_id>[^:]+):repository/(?P<repo_name>.*)$" ECR_REPOSITORY_ARN_PATTERN = "^arn:(?P<partition>[^:]+):ecr:(?P<region>[^:]+):(?P<account_id>[^:]+):repository/(?P<repo_name>.*)$"
@ -97,7 +96,7 @@ class Repository(BaseObject, CloudFormationModel):
if encryption_config == {"encryptionType": "KMS"}: if encryption_config == {"encryptionType": "KMS"}:
encryption_config[ encryption_config[
"kmsKey" "kmsKey"
] = f"arn:aws:kms:{self.region_name}:{self.account_id}:key/{uuid.uuid4()}" ] = f"arn:aws:kms:{self.region_name}:{self.account_id}:key/{random.uuid4()}"
return encryption_config return encryption_config
def _get_image(self, image_tag, image_digest): def _get_image(self, image_tag, image_digest):
@ -250,7 +249,7 @@ class Image(BaseObject):
self.last_scan = None self.last_scan = None
def _create_digest(self): def _create_digest(self):
image_contents = "docker_image{0}".format(int(random() * 10**6)) image_contents = "docker_image{0}".format(int(random.random() * 10**6))
self.image_digest = ( self.image_digest = (
"sha256:%s" % hashlib.sha256(image_contents.encode("utf-8")).hexdigest() "sha256:%s" % hashlib.sha256(image_contents.encode("utf-8")).hexdigest()
) )

View File

@ -1,8 +1,6 @@
import re import re
import uuid
from copy import copy from copy import copy
from datetime import datetime from datetime import datetime
from random import random, randint
import pytz import pytz
@ -16,6 +14,7 @@ from moto.core.utils import (
BackendDict, BackendDict,
) )
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from .exceptions import ( from .exceptions import (
EcsClientException, EcsClientException,
@ -243,7 +242,7 @@ class TaskDefinition(BaseObject, CloudFormationModel):
properties = cloudformation_json["Properties"] properties = cloudformation_json["Properties"]
family = properties.get( family = properties.get(
"Family", "task-definition-{0}".format(int(random() * 10**6)) "Family", "task-definition-{0}".format(int(mock_random.random() * 10**6))
) )
container_definitions = remap_nested_keys( container_definitions = remap_nested_keys(
properties.get("ContainerDefinitions", []), pascal_to_camelcase properties.get("ContainerDefinitions", []), pascal_to_camelcase
@ -266,7 +265,7 @@ class TaskDefinition(BaseObject, CloudFormationModel):
): ):
properties = cloudformation_json["Properties"] properties = cloudformation_json["Properties"]
family = properties.get( family = properties.get(
"Family", "task-definition-{0}".format(int(random() * 10**6)) "Family", "task-definition-{0}".format(int(mock_random.random() * 10**6))
) )
container_definitions = properties["ContainerDefinitions"] container_definitions = properties["ContainerDefinitions"]
volumes = properties.get("Volumes") volumes = properties.get("Volumes")
@ -302,7 +301,7 @@ class Task(BaseObject):
started_by="", started_by="",
tags=None, tags=None,
): ):
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.cluster_name = cluster.name self.cluster_name = cluster.name
self.cluster_arn = cluster.arn self.cluster_arn = cluster.arn
self.container_instance_arn = container_instance_arn self.container_instance_arn = container_instance_arn
@ -335,7 +334,7 @@ class Task(BaseObject):
class CapacityProvider(BaseObject): class CapacityProvider(BaseObject):
def __init__(self, account_id, region_name, name, asg_details, tags): def __init__(self, account_id, region_name, name, asg_details, tags):
self._id = str(uuid.uuid4()) self._id = str(mock_random.uuid4())
self.capacity_provider_arn = f"arn:aws:ecs:{region_name}:{account_id}:capacity_provider/{name}/{self._id}" self.capacity_provider_arn = f"arn:aws:ecs:{region_name}:{account_id}:capacity_provider/{name}/{self._id}"
self.name = name self.name = name
self.status = "ACTIVE" self.status = "ACTIVE"
@ -391,7 +390,7 @@ class Service(BaseObject, CloudFormationModel):
{ {
"createdAt": datetime.now(pytz.utc), "createdAt": datetime.now(pytz.utc),
"desiredCount": self.desired_count, "desiredCount": self.desired_count,
"id": "ecs-svc/{}".format(randint(0, 32**12)), "id": "ecs-svc/{}".format(mock_random.randint(0, 32**12)),
"launchType": self.launch_type, "launchType": self.launch_type,
"pendingCount": self.desired_count, "pendingCount": self.desired_count,
"runningCount": 0, "runningCount": 0,
@ -620,7 +619,7 @@ class ContainerInstance(BaseObject):
} }
self.registered_at = datetime.now(pytz.utc) self.registered_at = datetime.now(pytz.utc)
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.cluster_name = cluster_name self.cluster_name = cluster_name
self._account_id = backend.account_id self._account_id = backend.account_id
self._backend = backend self._backend = backend
@ -718,7 +717,7 @@ class TaskSet(BaseObject):
self.createdAt = datetime.now(pytz.utc) self.createdAt = datetime.now(pytz.utc)
self.updatedAt = datetime.now(pytz.utc) self.updatedAt = datetime.now(pytz.utc)
self.stabilityStatusAt = datetime.now(pytz.utc) self.stabilityStatusAt = datetime.now(pytz.utc)
self.id = "ecs-svc/{}".format(randint(0, 32**12)) self.id = "ecs-svc/{}".format(mock_random.randint(0, 32**12))
self.service_arn = "" self.service_arn = ""
self.cluster_arn = "" self.cluster_arn = ""

View File

@ -11,7 +11,6 @@ from copy import deepcopy
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import ( from moto.core.utils import (
camelcase_to_underscores, camelcase_to_underscores,
get_random_hex,
underscores_to_camelcase, underscores_to_camelcase,
BackendDict, BackendDict,
) )
@ -30,6 +29,7 @@ from moto.efs.exceptions import (
SecurityGroupNotFound, SecurityGroupNotFound,
SecurityGroupLimitExceeded, SecurityGroupLimitExceeded,
) )
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from moto.utilities.utils import md5_hash from moto.utilities.utils import md5_hash
@ -54,7 +54,7 @@ class AccessPoint(BaseModel):
root_directory, root_directory,
context, context,
): ):
self.access_point_id = get_random_hex(8) self.access_point_id = mock_random.get_random_hex(8)
self.access_point_arn = f"arn:aws:elasticfilesystem:{region_name}:{account_id}:access-point/fsap-{self.access_point_id}" self.access_point_arn = f"arn:aws:elasticfilesystem:{region_name}:{account_id}:access-point/fsap-{self.access_point_id}"
self.client_token = client_token self.client_token = client_token
self.file_system_id = file_system_id self.file_system_id = file_system_id
@ -297,7 +297,7 @@ class MountTarget(CloudFormationModel):
# Init non-user-assigned values. # Init non-user-assigned values.
self.owner_id = account_id self.owner_id = account_id
self.mount_target_id = "fsmt-{}".format(get_random_hex()) self.mount_target_id = "fsmt-{}".format(mock_random.get_random_hex())
self.life_cycle_state = "available" self.life_cycle_state = "available"
self.network_interface_id = None self.network_interface_id = None
self.availability_zone_id = subnet.availability_zone_id self.availability_zone_id = subnet.availability_zone_id
@ -418,7 +418,7 @@ class EFSBackend(BaseBackend):
# Create a new file system ID: # Create a new file system ID:
def make_id(): def make_id():
return "fs-{}".format(get_random_hex()) return "fs-{}".format(mock_random.get_random_hex())
fsid = make_id() fsid = make_id()
while fsid in self.file_systems_by_id: while fsid in self.file_systems_by_id:

View File

@ -1,10 +1,9 @@
from datetime import datetime from datetime import datetime
from uuid import uuid4
from moto.core import BaseBackend from moto.core import BaseBackend
from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict from moto.core.utils import iso_8601_datetime_without_milliseconds, BackendDict
from moto.moto_api._internal import mock_random as random
from ..utilities.utils import random_string
from .exceptions import ( from .exceptions import (
InvalidParameterException, InvalidParameterException,
InvalidRequestException, InvalidRequestException,
@ -17,12 +16,14 @@ from .utils import get_partition, validate_role_arn
CLUSTER_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:cluster/{name}" CLUSTER_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:cluster/{name}"
FARGATE_PROFILE_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:fargateprofile/{cluster_name}/{fargate_profile_name}/{uuid}" FARGATE_PROFILE_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:fargateprofile/{cluster_name}/{fargate_profile_name}/{uuid}"
NODEGROUP_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:nodegroup/{cluster_name}/{nodegroup_name}/{uuid}" NODEGROUP_ARN_TEMPLATE = "arn:{partition}:eks:{region}:{account_id}:nodegroup/{cluster_name}/{nodegroup_name}/{uuid}"
ISSUER_TEMPLATE = "https://oidc.eks.{region}.amazonaws.com/id/" + random_string(10) ISSUER_TEMPLATE = (
"https://oidc.eks.{region}.amazonaws.com/id/" + random.get_random_string(length=10)
)
ENDPOINT_TEMPLATE = ( ENDPOINT_TEMPLATE = (
"https://" "https://"
+ random_string() + random.get_random_string()
+ "." + "."
+ random_string(3) + random.get_random_string(3)
+ ".{region}.eks.amazonaws.com/" + ".{region}.eks.amazonaws.com/"
) )
@ -120,7 +121,7 @@ class Cluster:
region=region_name, region=region_name,
name=name, name=name,
) )
self.certificateAuthority = {"data": random_string(1400)} self.certificateAuthority = {"data": random.get_random_string(1400)}
self.creation_date = iso_8601_datetime_without_milliseconds(datetime.now()) self.creation_date = iso_8601_datetime_without_milliseconds(datetime.now())
self.identity = {"oidc": {"issuer": ISSUER_TEMPLATE.format(region=region_name)}} self.identity = {"oidc": {"issuer": ISSUER_TEMPLATE.format(region=region_name)}}
self.endpoint = ENDPOINT_TEMPLATE.format(region=region_name) self.endpoint = ENDPOINT_TEMPLATE.format(region=region_name)
@ -182,7 +183,7 @@ class FargateProfile:
tags = dict() tags = dict()
self.created_at = iso_8601_datetime_without_milliseconds(datetime.now()) self.created_at = iso_8601_datetime_without_milliseconds(datetime.now())
self.uuid = str(uuid4()) self.uuid = str(random.uuid4())
self.fargate_profile_arn = FARGATE_PROFILE_ARN_TEMPLATE.format( self.fargate_profile_arn = FARGATE_PROFILE_ARN_TEMPLATE.format(
partition=aws_partition, partition=aws_partition,
account_id=account_id, account_id=account_id,
@ -244,7 +245,7 @@ class ManagedNodegroup:
if taints is None: if taints is None:
taints = dict() taints = dict()
self.uuid = str(uuid4()) self.uuid = str(random.uuid4())
self.arn = NODEGROUP_ARN_TEMPLATE.format( self.arn = NODEGROUP_ARN_TEMPLATE.format(
partition=aws_partition, partition=aws_partition,
account_id=account_id, account_id=account_id,
@ -258,7 +259,7 @@ class ManagedNodegroup:
self.health = DEFAULT_NODEGROUP_HEALTH self.health = DEFAULT_NODEGROUP_HEALTH
self.resources = { self.resources = {
"autoScalingGroups": [{"name": "eks-" + self.uuid}], "autoScalingGroups": [{"name": "eks-" + self.uuid}],
"remoteAccessSecurityGroup": "sg-" + random_string(17).lower(), "remoteAccessSecurityGroup": "sg-" + random.get_random_string(17).lower(),
} }
self.ami_type = ami_type or DEFAULT_AMI_TYPE self.ami_type = ami_type or DEFAULT_AMI_TYPE

View File

@ -1,6 +1,6 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
import random from moto.moto_api._internal import mock_random as random
import string import string

View File

@ -7,7 +7,7 @@ from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.ec2.models import ec2_backends from moto.ec2.models import ec2_backends
from moto.ec2.exceptions import InvalidInstanceIdError from moto.ec2.exceptions import InvalidInstanceIdError
from uuid import uuid4 from moto.moto_api._internal import mock_random
from .exceptions import ( from .exceptions import (
BadHealthCheckDefinition, BadHealthCheckDefinition,
DuplicateLoadBalancerName, DuplicateLoadBalancerName,
@ -306,7 +306,7 @@ class ELBBackend(BaseBackend):
raise EmptyListenersError() raise EmptyListenersError()
if not security_groups: if not security_groups:
sg = ec2_backend.create_security_group( sg = ec2_backend.create_security_group(
name=f"default_elb_{uuid4()}", name=f"default_elb_{mock_random.uuid4()}",
description="ELB created security group used when no security group is specified during ELB creation - modifications could impact traffic to future ELBs", description="ELB created security group used when no security group is specified during ELB creation - modifications could impact traffic to future ELBs",
vpc_id=vpc_id, vpc_id=vpc_id,
) )

View File

@ -7,10 +7,10 @@ from moto.core.exceptions import RESTError
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import ( from moto.core.utils import (
iso_8601_datetime_with_milliseconds, iso_8601_datetime_with_milliseconds,
get_random_hex,
BackendDict, BackendDict,
) )
from moto.ec2.models import ec2_backends from moto.ec2.models import ec2_backends
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from .utils import make_arn_for_target_group from .utils import make_arn_for_target_group
from .utils import make_arn_for_load_balancer from .utils import make_arn_for_load_balancer
@ -757,7 +757,7 @@ class ELBv2Backend(BaseBackend):
self._validate_actions(actions) self._validate_actions(actions)
arn = listener_arn.replace(":listener/", ":listener-rule/") arn = listener_arn.replace(":listener/", ":listener-rule/")
arn += "/%s" % (get_random_hex(16)) arn += f"/{mock_random.get_random_hex(16)}"
# TODO: check for error 'TooManyRegistrationsForTargetId' # TODO: check for error 'TooManyRegistrationsForTargetId'
# TODO: check for error 'TooManyRules' # TODO: check for error 'TooManyRules'

View File

@ -1,6 +1,6 @@
from moto.core.exceptions import RESTError from moto.core.exceptions import RESTError
from moto.core.utils import amzn_request_id
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.utilities.aws_headers import amzn_request_id
from .models import elbv2_backends from .models import elbv2_backends
from .exceptions import TargetGroupNotFoundError from .exceptions import TargetGroupNotFoundError
from .exceptions import ListenerOrBalancerMissingError from .exceptions import ListenerOrBalancerMissingError

View File

@ -1,12 +1,12 @@
import copy import copy
import datetime import datetime
import random
import re import re
import string import string
from moto.core.utils import ( from moto.core.utils import (
camelcase_to_underscores, camelcase_to_underscores,
iso_8601_datetime_with_milliseconds, iso_8601_datetime_with_milliseconds,
) )
from moto.moto_api._internal import mock_random as random
def random_id(size=13): def random_id(size=13):

View File

@ -1,6 +1,6 @@
# import json # import json
import string import string
import random from moto.moto_api._internal import mock_random as random
def get_partition(region): def get_partition(region):

View File

@ -1,5 +1,4 @@
# import json from moto.moto_api._internal import mock_random as random
import random
import string import string

View File

@ -1,5 +1,6 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import get_random_hex, BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from .exceptions import DomainNotFound from .exceptions import DomainNotFound
@ -23,7 +24,7 @@ class Domain(BaseModel):
advanced_security_options, advanced_security_options,
auto_tune_options, auto_tune_options,
): ):
self.domain_id = get_random_hex(8) self.domain_id = mock_random.get_random_hex(8)
self.region_name = region_name self.region_name = region_name
self.domain_name = domain_name self.domain_name = domain_name
self.es_version = es_version self.es_version = es_version

View File

@ -26,11 +26,10 @@ from moto.events.exceptions import (
InvalidEventPatternException, InvalidEventPatternException,
IllegalStatusException, IllegalStatusException,
) )
from moto.moto_api._internal import mock_random as random
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from uuid import uuid4
from .utils import PAGINATION_MODEL from .utils import PAGINATION_MODEL
# Sentinel to signal the absence of a field for `Exists` pattern matching # Sentinel to signal the absence of a field for `Exists` pattern matching
@ -183,12 +182,9 @@ class Rule(CloudFormationModel):
datetime.utcfromtimestamp(event_copy["time"]) datetime.utcfromtimestamp(event_copy["time"])
) )
log_stream_name = str(uuid4()) log_stream_name = str(random.uuid4())
log_events = [ log_events = [
{ {"timestamp": unix_time_millis(), "message": json.dumps(event_copy)}
"timestamp": unix_time_millis(datetime.utcnow()),
"message": json.dumps(event_copy),
}
] ]
log_backend = logs_backends[self.account_id][self.region_name] log_backend = logs_backends[self.account_id][self.region_name]
@ -521,7 +517,7 @@ class Archive(CloudFormationModel):
self.arn = f"arn:aws:events:{region_name}:{account_id}:archive/{name}" self.arn = f"arn:aws:events:{region_name}:{account_id}:archive/{name}"
self.creation_time = unix_time(datetime.utcnow()) self.creation_time = unix_time(datetime.utcnow())
self.state = "ENABLED" self.state = "ENABLED"
self.uuid = str(uuid4()) self.uuid = str(random.uuid4())
self.events = [] self.events = []
self.event_bus_name = source_arn.split("/")[-1] self.event_bus_name = source_arn.split("/")[-1]
@ -691,7 +687,9 @@ class Replay(BaseModel):
for rule in event_backend.rules.values(): for rule in event_backend.rules.values():
rule.send_to_targets( rule.send_to_targets(
event_bus_name, event_bus_name,
dict(event, **{"id": str(uuid4()), "replay-name": self.name}), dict(
event, **{"id": str(random.uuid4()), "replay-name": self.name}
),
) )
self.state = ReplayState.COMPLETED self.state = ReplayState.COMPLETED
@ -708,7 +706,7 @@ class Connection(BaseModel):
authorization_type, authorization_type,
auth_parameters, auth_parameters,
): ):
self.uuid = uuid4() self.uuid = random.uuid4()
self.name = name self.name = name
self.region = region_name self.region = region_name
self.description = description self.description = description
@ -784,7 +782,7 @@ class Destination(BaseModel):
invocation_rate_limit_per_second, invocation_rate_limit_per_second,
http_method, http_method,
): ):
self.uuid = uuid4() self.uuid = random.uuid4()
self.name = name self.name = name
self.region = region_name self.region = region_name
self.description = description self.description = description
@ -1234,7 +1232,7 @@ class EventsBackend(BaseBackend):
) )
continue continue
event_id = str(uuid4()) event_id = str(random.uuid4())
entries.append({"EventId": event_id}) entries.append({"EventId": event_id})
# if 'EventBusName' is not especially set, it will be sent to the default one # if 'EventBusName' is not especially set, it will be sent to the default one

View File

@ -21,7 +21,6 @@ from gzip import GzipFile
import io import io
import json import json
from time import time from time import time
from uuid import uuid4
import warnings import warnings
import requests import requests
@ -36,6 +35,7 @@ from moto.firehose.exceptions import (
ResourceNotFoundException, ResourceNotFoundException,
ValidationException, ValidationException,
) )
from moto.moto_api._internal import mock_random
from moto.s3.models import s3_backends from moto.s3.models import s3_backends
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
@ -407,7 +407,7 @@ class FirehoseBackend(BaseBackend):
url = http_destination["EndpointConfiguration"]["Url"] url = http_destination["EndpointConfiguration"]["Url"]
headers = {"Content-Type": "application/json"} headers = {"Content-Type": "application/json"}
record_to_send = { record_to_send = {
"requestId": str(uuid4()), "requestId": str(mock_random.uuid4()),
"timestamp": int(time()), "timestamp": int(time()),
"records": [{"data": record["Data"]} for record in records], "records": [{"data": record["Data"]} for record in records],
} }
@ -418,7 +418,7 @@ class FirehoseBackend(BaseBackend):
raise RuntimeError( raise RuntimeError(
"Firehose PutRecord(Batch) to HTTP destination failed" "Firehose PutRecord(Batch) to HTTP destination failed"
) from exc ) from exc
return [{"RecordId": str(uuid4())} for _ in range(len(records))] return [{"RecordId": str(mock_random.uuid4())} for _ in range(len(records))]
@staticmethod @staticmethod
def _format_s3_object_path(delivery_stream_name, version_id, prefix): def _format_s3_object_path(delivery_stream_name, version_id, prefix):
@ -433,7 +433,7 @@ class FirehoseBackend(BaseBackend):
return ( return (
f"{prefix}{now.strftime('%Y/%m/%d/%H')}/" f"{prefix}{now.strftime('%Y/%m/%d/%H')}/"
f"{delivery_stream_name}-{version_id}-" f"{delivery_stream_name}-{version_id}-"
f"{now.strftime('%Y-%m-%d-%H-%M-%S')}-{str(uuid4())}" f"{now.strftime('%Y-%m-%d-%H-%M-%S')}-{str(mock_random.uuid4())}"
) )
def put_s3_records(self, delivery_stream_name, version_id, s3_destination, records): def put_s3_records(self, delivery_stream_name, version_id, s3_destination, records):
@ -455,7 +455,7 @@ class FirehoseBackend(BaseBackend):
raise RuntimeError( raise RuntimeError(
"Firehose PutRecord(Batch to S3 destination failed" "Firehose PutRecord(Batch to S3 destination failed"
) from exc ) from exc
return [{"RecordId": str(uuid4())} for _ in range(len(records))] return [{"RecordId": str(mock_random.uuid4())} for _ in range(len(records))]
def put_record_batch(self, delivery_stream_name, records): def put_record_batch(self, delivery_stream_name, records):
"""Write multiple data records into a Kinesis Data firehose stream.""" """Write multiple data records into a Kinesis Data firehose stream."""
@ -494,7 +494,7 @@ class FirehoseBackend(BaseBackend):
# This isn't implmented as these services aren't implemented, # This isn't implmented as these services aren't implemented,
# so ignore the data, but return a "proper" response. # so ignore the data, but return a "proper" response.
request_responses = [ request_responses = [
{"RecordId": str(uuid4())} for _ in range(len(records)) {"RecordId": str(mock_random.uuid4())} for _ in range(len(records))
] ]
return { return {

View File

@ -1,7 +1,7 @@
import json import json
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id from moto.utilities.aws_headers import amzn_request_id
from .models import forecast_backends from .models import forecast_backends

View File

@ -1,4 +1,4 @@
import random from moto.moto_api._internal import mock_random as random
import string import string

View File

@ -2,11 +2,11 @@ import time
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime from datetime import datetime
from typing import List from typing import List
from uuid import uuid4
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api import state_manager 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.moto_api._internal.managed_state_model import ManagedState
from .exceptions import ( from .exceptions import (
JsonRESTError, JsonRESTError,
@ -1072,7 +1072,7 @@ class FakeSchemaVersion(BaseModel):
self.schema_definition = schema_definition self.schema_definition = schema_definition
self.schema_version_status = AVAILABLE_STATUS self.schema_version_status = AVAILABLE_STATUS
self.version_number = version_number self.version_number = version_number
self.schema_version_id = str(uuid4()) self.schema_version_id = str(mock_random.uuid4())
self.created_time = datetime.utcnow() self.created_time = datetime.utcnow()
self.updated_time = datetime.utcnow() self.updated_time = datetime.utcnow()
self.metadata = OrderedDict() self.metadata = OrderedDict()

View File

@ -1,11 +1,11 @@
import json import json
import uuid
from collections import OrderedDict from collections import OrderedDict
from datetime import datetime from datetime import datetime
import re import re
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, iso_8601_datetime_with_milliseconds from moto.core.utils import BackendDict, iso_8601_datetime_with_milliseconds
from moto.moto_api._internal import mock_random
from .exceptions import ( from .exceptions import (
GreengrassClientError, GreengrassClientError,
IdNotFoundException, IdNotFoundException,
@ -21,7 +21,7 @@ class FakeCoreDefinition(BaseModel):
def __init__(self, account_id, region_name, name): def __init__(self, account_id, region_name, name):
self.region_name = region_name self.region_name = region_name
self.name = name self.name = name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/cores/{self.id}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/cores/{self.id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.latest_version = "" self.latest_version = ""
@ -48,7 +48,7 @@ class FakeCoreDefinitionVersion(BaseModel):
self.region_name = region_name self.region_name = region_name
self.core_definition_id = core_definition_id self.core_definition_id = core_definition_id
self.definition = definition self.definition = definition
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/cores/{self.core_definition_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/cores/{self.core_definition_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -71,7 +71,7 @@ class FakeCoreDefinitionVersion(BaseModel):
class FakeDeviceDefinition(BaseModel): class FakeDeviceDefinition(BaseModel):
def __init__(self, account_id, region_name, name, initial_version): def __init__(self, account_id, region_name, name, initial_version):
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/devices/{self.id}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/devices/{self.id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.update_at_datetime = datetime.utcnow() self.update_at_datetime = datetime.utcnow()
@ -103,7 +103,7 @@ class FakeDeviceDefinitionVersion(BaseModel):
self.region_name = region_name self.region_name = region_name
self.device_definition_id = device_definition_id self.device_definition_id = device_definition_id
self.devices = devices self.devices = devices
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/devices/{self.device_definition_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/devices/{self.device_definition_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -126,7 +126,7 @@ class FakeDeviceDefinitionVersion(BaseModel):
class FakeResourceDefinition(BaseModel): class FakeResourceDefinition(BaseModel):
def __init__(self, account_id, region_name, name, initial_version): def __init__(self, account_id, region_name, name, initial_version):
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/resources/{self.id}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/resources/{self.id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.update_at_datetime = datetime.utcnow() self.update_at_datetime = datetime.utcnow()
@ -156,7 +156,7 @@ class FakeResourceDefinitionVersion(BaseModel):
self.region_name = region_name self.region_name = region_name
self.resource_definition_id = resource_definition_id self.resource_definition_id = resource_definition_id
self.resources = resources self.resources = resources
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/resources/{self.resource_definition_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{region_name}:{account_id}:greengrass/definition/resources/{self.resource_definition_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -175,7 +175,7 @@ class FakeResourceDefinitionVersion(BaseModel):
class FakeFunctionDefinition(BaseModel): class FakeFunctionDefinition(BaseModel):
def __init__(self, account_id, region_name, name, initial_version): def __init__(self, account_id, region_name, name, initial_version):
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/functions/{self.id}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/functions/{self.id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.update_at_datetime = datetime.utcnow() self.update_at_datetime = datetime.utcnow()
@ -210,7 +210,7 @@ class FakeFunctionDefinitionVersion(BaseModel):
self.function_definition_id = function_definition_id self.function_definition_id = function_definition_id
self.functions = functions self.functions = functions
self.default_config = default_config self.default_config = default_config
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/functions/{self.function_definition_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/functions/{self.function_definition_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -229,7 +229,7 @@ class FakeFunctionDefinitionVersion(BaseModel):
class FakeSubscriptionDefinition(BaseModel): class FakeSubscriptionDefinition(BaseModel):
def __init__(self, account_id, region_name, name, initial_version): def __init__(self, account_id, region_name, name, initial_version):
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/subscriptions/{self.id}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/subscriptions/{self.id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.update_at_datetime = datetime.utcnow() self.update_at_datetime = datetime.utcnow()
@ -261,7 +261,7 @@ class FakeSubscriptionDefinitionVersion(BaseModel):
self.region_name = region_name self.region_name = region_name
self.subscription_definition_id = subscription_definition_id self.subscription_definition_id = subscription_definition_id
self.subscriptions = subscriptions self.subscriptions = subscriptions
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/subscriptions/{self.subscription_definition_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/definition/subscriptions/{self.subscription_definition_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -280,7 +280,7 @@ class FakeSubscriptionDefinitionVersion(BaseModel):
class FakeGroup(BaseModel): class FakeGroup(BaseModel):
def __init__(self, account_id, region_name, name): def __init__(self, account_id, region_name, name):
self.region_name = region_name self.region_name = region_name
self.group_id = str(uuid.uuid4()) self.group_id = str(mock_random.uuid4())
self.name = name self.name = name
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/groups/{self.group_id}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/groups/{self.group_id}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
@ -319,7 +319,7 @@ class FakeGroupVersion(BaseModel):
): ):
self.region_name = region_name self.region_name = region_name
self.group_id = group_id self.group_id = group_id
self.version = str(uuid.uuid4()) self.version = str(mock_random.uuid4())
self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/groups/{self.group_id}/versions/{self.version}" self.arn = f"arn:aws:greengrass:{self.region_name}:{account_id}:greengrass/groups/{self.group_id}/versions/{self.version}"
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()
self.core_definition_version_arn = core_definition_version_arn self.core_definition_version_arn = core_definition_version_arn
@ -372,7 +372,7 @@ class FakeGroupVersion(BaseModel):
class FakeDeployment(BaseModel): class FakeDeployment(BaseModel):
def __init__(self, account_id, region_name, group_id, group_arn, deployment_type): def __init__(self, account_id, region_name, group_id, group_arn, deployment_type):
self.region_name = region_name self.region_name = region_name
self.id = str(uuid.uuid4()) self.id = str(mock_random.uuid4())
self.group_id = group_id self.group_id = group_id
self.group_arn = group_arn self.group_arn = group_arn
self.created_at_datetime = datetime.utcnow() self.created_at_datetime = datetime.utcnow()

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, get_random_hex from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from datetime import datetime from datetime import datetime
from .exceptions import DetectorNotFoundException, FilterNotFoundException from .exceptions import DetectorNotFoundException, FilterNotFoundException
@ -129,7 +130,7 @@ class Detector(BaseModel):
datasources, datasources,
tags, tags,
): ):
self.id = get_random_hex(length=32) self.id = mock_random.get_random_hex(length=32)
self.created_at = created_at self.created_at = created_at
self.finding_publish_freq = finding_publish_freq self.finding_publish_freq = finding_publish_freq
self.service_role = f"arn:aws:iam::{account_id}:role/aws-service-role/guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDuty" self.service_role = f"arn:aws:iam::{account_id}:role/aws-service-role/guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDuty"

View File

@ -1,9 +1,7 @@
import base64 import base64
import os import os
import random
import string import string
import sys import sys
import uuid
from datetime import datetime from datetime import datetime
import json import json
import re import re
@ -26,6 +24,7 @@ from moto.iam.policy_validation import (
IAMPolicyDocumentValidator, IAMPolicyDocumentValidator,
IAMTrustPolicyDocumentValidator, IAMTrustPolicyDocumentValidator,
) )
from moto.moto_api._internal import mock_random as random
from moto.utilities.utils import md5_hash from moto.utilities.utils import md5_hash
from .aws_managed_policies import aws_managed_policies_data from .aws_managed_policies import aws_managed_policies_data
@ -3029,7 +3028,7 @@ class IAMBackend(BaseBackend):
def delete_service_linked_role(self, role_name): def delete_service_linked_role(self, role_name):
self.delete_role(role_name) self.delete_role(role_name)
deletion_task_id = str(uuid.uuid4()) deletion_task_id = str(random.uuid4())
return deletion_task_id return deletion_task_id
def get_service_linked_role_deletion_status(self): def get_service_linked_role_deletion_status(self):

View File

@ -1,4 +1,4 @@
import random from moto.moto_api._internal import mock_random as random
import string import string

View File

@ -1,9 +1,6 @@
import hashlib import hashlib
import random
import re import re
import string
import time import time
import uuid
from collections import OrderedDict from collections import OrderedDict
from cryptography import x509 from cryptography import x509
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.backends import default_backend
@ -16,7 +13,7 @@ from .utils import PAGINATION_MODEL
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.utilities.utils import random_string from moto.moto_api._internal import mock_random as random
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
from .exceptions import ( from .exceptions import (
CertificateStateException, CertificateStateException,
@ -74,7 +71,7 @@ class FakeThingType(BaseModel):
self.region_name = region_name self.region_name = region_name
self.thing_type_name = thing_type_name self.thing_type_name = thing_type_name
self.thing_type_properties = thing_type_properties self.thing_type_properties = thing_type_properties
self.thing_type_id = str(uuid.uuid4()) # I don't know the rule of id self.thing_type_id = str(random.uuid4()) # I don't know the rule of id
t = time.time() t = time.time()
self.metadata = {"deprecated": False, "creationDate": int(t * 1000) / 1000.0} self.metadata = {"deprecated": False, "creationDate": int(t * 1000) / 1000.0}
self.arn = "arn:aws:iot:%s:1:thingtype/%s" % (self.region_name, thing_type_name) self.arn = "arn:aws:iot:%s:1:thingtype/%s" % (self.region_name, thing_type_name)
@ -100,7 +97,7 @@ class FakeThingGroup(BaseModel):
): ):
self.region_name = region_name self.region_name = region_name
self.thing_group_name = thing_group_name self.thing_group_name = thing_group_name
self.thing_group_id = str(uuid.uuid4()) # I don't know the rule of id self.thing_group_id = str(random.uuid4()) # I don't know the rule of id
self.version = 1 # TODO: tmp self.version = 1 # TODO: tmp
self.parent_group_name = parent_group_name self.parent_group_name = parent_group_name
self.thing_group_properties = thing_group_properties or {} self.thing_group_properties = thing_group_properties or {}
@ -434,7 +431,7 @@ class FakeEndpoint(BaseModel):
"operation: Endpoint type %s not recognized." % endpoint_type "operation: Endpoint type %s not recognized." % endpoint_type
) )
self.region_name = region_name self.region_name = region_name
identifier = random_string(14).lower() identifier = random.get_random_string(length=14, lower_case=True)
if endpoint_type == "iot:Data": if endpoint_type == "iot:Data":
self.endpoint = "{i}.iot.{r}.amazonaws.com".format( self.endpoint = "{i}.iot.{r}.amazonaws.com".format(
i=identifier, r=self.region_name i=identifier, r=self.region_name
@ -540,7 +537,7 @@ class FakeDomainConfiguration(BaseModel):
self.domain_configuration_arn = "arn:aws:iot:%s:1:domainconfiguration/%s/%s" % ( self.domain_configuration_arn = "arn:aws:iot:%s:1:domainconfiguration/%s/%s" % (
region_name, region_name,
domain_configuration_name, domain_configuration_name,
random_string(5), random.get_random_string(length=5),
) )
self.domain_name = domain_name self.domain_name = domain_name
self.server_certificates = [] self.server_certificates = []
@ -836,21 +833,14 @@ class IoTBackend(BaseBackend):
else: else:
thing.attributes.update(attributes) thing.attributes.update(attributes)
def _random_string(self):
n = 20
random_str = "".join(
[random.choice(string.ascii_letters + string.digits) for i in range(n)]
)
return random_str
def create_keys_and_certificate(self, set_as_active): def create_keys_and_certificate(self, set_as_active):
# implement here # implement here
# caCertificate can be blank # caCertificate can be blank
key_pair = { key_pair = {
"PublicKey": self._random_string(), "PublicKey": random.get_random_string(),
"PrivateKey": self._random_string(), "PrivateKey": random.get_random_string(),
} }
certificate_pem = self._random_string() certificate_pem = random.get_random_string()
status = "ACTIVE" if set_as_active else "INACTIVE" status = "ACTIVE" if set_as_active else "INACTIVE"
certificate = FakeCertificate( certificate = FakeCertificate(
certificate_pem, status, self.account_id, self.region_name certificate_pem, status, self.account_id, self.region_name
@ -910,7 +900,7 @@ class IoTBackend(BaseBackend):
return certs[0] return certs[0]
def get_registration_code(self): def get_registration_code(self):
return str(uuid.uuid4()) return str(random.uuid4())
def list_certificates(self): def list_certificates(self):
""" """

View File

@ -1,9 +1,8 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from datetime import datetime from datetime import datetime
from .exceptions import ResourceNotFoundException, ResourceInUseException from .exceptions import ResourceNotFoundException, ResourceInUseException
import random from moto.core.utils import BackendDict
import string from moto.moto_api._internal import mock_random as random
from moto.core.utils import get_random_hex, BackendDict
class Stream(BaseModel): class Stream(BaseModel):
@ -26,17 +25,12 @@ class Stream(BaseModel):
self.data_retention_in_hours = data_retention_in_hours self.data_retention_in_hours = data_retention_in_hours
self.tags = tags self.tags = tags
self.status = "ACTIVE" self.status = "ACTIVE"
self.version = self._get_random_string() self.version = random.get_random_string(include_digits=False, lower_case=True)
self.creation_time = datetime.utcnow() self.creation_time = datetime.utcnow()
stream_arn = f"arn:aws:kinesisvideo:{region_name}:{account_id}:stream/{stream_name}/1598784211076" stream_arn = f"arn:aws:kinesisvideo:{region_name}:{account_id}:stream/{stream_name}/1598784211076"
self.data_endpoint_number = get_random_hex() self.data_endpoint_number = random.get_random_hex()
self.arn = stream_arn self.arn = stream_arn
def _get_random_string(self, length=20):
letters = string.ascii_lowercase
result_str = "".join([random.choice(letters) for _ in range(length)])
return result_str
def get_data_endpoint(self, api_name): def get_data_endpoint(self, api_name):
data_endpoint_prefix = "s-" if api_name in ("PUT_MEDIA", "GET_MEDIA") else "b-" data_endpoint_prefix = "s-" if api_name in ("PUT_MEDIA", "GET_MEDIA") else "b-"
return "https://{}{}.kinesisvideo.{}.amazonaws.com".format( return "https://{}{}.kinesisvideo.{}.amazonaws.com".format(

View File

@ -9,7 +9,8 @@ from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import padding
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import get_random_hex, unix_time, BackendDict from moto.core.utils import unix_time, BackendDict
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from moto.core.exceptions import JsonRESTError from moto.core.exceptions import JsonRESTError
@ -40,8 +41,8 @@ class Grant(BaseModel):
self.retiring_principal = retiring_principal self.retiring_principal = retiring_principal
self.operations = operations self.operations = operations
self.constraints = constraints self.constraints = constraints
self.id = get_random_hex() self.id = mock_random.get_random_hex()
self.token = get_random_hex() self.token = mock_random.get_random_hex()
def to_json(self): def to_json(self):
return { return {

View File

@ -2,7 +2,7 @@ from collections import namedtuple
import io import io
import os import os
import struct import struct
import uuid from moto.moto_api._internal import mock_random
from cryptography.hazmat.backends import default_backend from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes from cryptography.hazmat.primitives.ciphers import algorithms, Cipher, modes
@ -46,7 +46,7 @@ RESERVED_ALIASES = [
def generate_key_id(multi_region=False): def generate_key_id(multi_region=False):
key = str(uuid.uuid4()) key = str(mock_random.uuid4())
# https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html # https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html
# "Notice that multi-Region keys have a distinctive key ID that begins with mrk-. You can use the mrk- prefix to # "Notice that multi-Region keys have a distinctive key ID that begins with mrk-. You can use the mrk- prefix to
# identify MRKs programmatically." # identify MRKs programmatically."

View File

@ -1,11 +1,8 @@
import uuid
from datetime import datetime, timedelta from datetime import datetime, timedelta
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core import CloudFormationModel from moto.core import CloudFormationModel
from moto.core.utils import unix_time_millis, BackendDict from moto.core.utils import unix_time_millis, BackendDict
from moto.utilities.paginator import paginate
from moto.logs.metric_filters import MetricFilters from moto.logs.metric_filters import MetricFilters
from moto.logs.exceptions import ( from moto.logs.exceptions import (
ResourceNotFoundException, ResourceNotFoundException,
@ -13,7 +10,9 @@ from moto.logs.exceptions import (
InvalidParameterException, InvalidParameterException,
LimitExceededException, LimitExceededException,
) )
from moto.moto_api._internal import mock_random
from moto.s3.models import s3_backends from moto.s3.models import s3_backends
from moto.utilities.paginator import paginate
from .utils import PAGINATION_MODEL, EventMessageFilter from .utils import PAGINATION_MODEL, EventMessageFilter
MAX_RESOURCE_POLICIES_PER_REGION = 10 MAX_RESOURCE_POLICIES_PER_REGION = 10
@ -943,7 +942,7 @@ class LogsBackend(BaseBackend):
if log_group_name not in self.groups: if log_group_name not in self.groups:
raise ResourceNotFoundException() raise ResourceNotFoundException()
query_id = uuid.uuid1() query_id = mock_random.uuid1()
self.queries[query_id] = LogQuery(query_id, start_time, end_time, query_string) self.queries[query_id] = LogQuery(query_id, start_time, end_time, query_string)
return query_id return query_id
@ -951,7 +950,7 @@ class LogsBackend(BaseBackend):
s3_backends[self.account_id]["global"].get_bucket(destination) s3_backends[self.account_id]["global"].get_bucket(destination)
if log_group_name not in self.groups: if log_group_name not in self.groups:
raise ResourceNotFoundException() raise ResourceNotFoundException()
task_id = uuid.uuid4() task_id = mock_random.uuid4()
return task_id return task_id

View File

@ -1,8 +1,7 @@
import json import json
import random
import re import re
import string import string
from moto.moto_api._internal import mock_random as random
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, urlparse

View File

@ -1,9 +1,9 @@
from collections import OrderedDict from collections import OrderedDict
from uuid import uuid4
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.mediaconnect.exceptions import NotFoundException from moto.mediaconnect.exceptions import NotFoundException
from moto.moto_api._internal import mock_random as random
class Flow(BaseModel): class Flow(BaseModel):
@ -87,7 +87,7 @@ class MediaConnectBackend(BaseBackend):
source["ingestIp"] = ingest_ip source["ingestIp"] = ingest_ip
def _create_flow_add_details(self, flow): def _create_flow_add_details(self, flow):
flow_id = uuid4().hex flow_id = random.uuid4().hex
flow.description = "A Moto test flow" flow.description = "A Moto test flow"
flow.egress_ip = "127.0.0.1" flow.egress_ip = "127.0.0.1"
@ -248,7 +248,7 @@ class MediaConnectBackend(BaseBackend):
) )
flow = self._flows[flow_arn] flow = self._flows[flow_arn]
for source in sources: for source in sources:
source_id = uuid4().hex source_id = random.uuid4().hex
name = source["name"] name = source["name"]
arn = f"arn:aws:mediaconnect:{self.region_name}:{self.account_id}:source:{source_id}:{name}" arn = f"arn:aws:mediaconnect:{self.region_name}:{self.account_id}:source:{source_id}:{name}"
source["sourceArn"] = arn source["sourceArn"] = arn

View File

@ -1,8 +1,8 @@
from collections import OrderedDict from collections import OrderedDict
from uuid import uuid4
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
class Input(BaseModel): class Input(BaseModel):
@ -134,7 +134,7 @@ class MediaLiveBackend(BaseBackend):
""" """
The RequestID and Reserved parameters are not yet implemented The RequestID and Reserved parameters are not yet implemented
""" """
channel_id = uuid4().hex channel_id = mock_random.uuid4().hex
arn = "arn:aws:medialive:channel:{}".format(channel_id) arn = "arn:aws:medialive:channel:{}".format(channel_id)
channel = Channel( channel = Channel(
arn=arn, arn=arn,
@ -228,7 +228,7 @@ class MediaLiveBackend(BaseBackend):
""" """
The VPC and RequestId parameters are not yet implemented The VPC and RequestId parameters are not yet implemented
""" """
input_id = uuid4().hex input_id = mock_random.uuid4().hex
arn = "arn:aws:medialive:input:{}".format(input_id) arn = "arn:aws:medialive:input:{}".format(input_id)
a_input = Input( a_input = Input(
arn=arn, arn=arn,

View File

@ -1,6 +1,12 @@
from .models import moto_api_backend from .models import moto_api_backend
from .state_manager import StateManager # noqa from .state_manager import StateManager # noqa
from .recorder.models import Recorder # noqa from .recorder.models import Recorder # noqa
from .moto_random import MotoRandom
moto_api_backends = {"global": moto_api_backend} moto_api_backends = {"global": moto_api_backend}
"""
Random-object used throughout Moto. Can be seeded to make identifiers deterministic.
"""
mock_random = MotoRandom()

View File

@ -0,0 +1,30 @@
from random import Random
import string
import uuid
HEX_CHARS = list(range(10)) + ["a", "b", "c", "d", "e", "f"]
class MotoRandom(Random):
"""
Class used for all sources of random-ness in Moto.
Used as a singleton, which is exposed in `moto/moto_api/_internal`.
This Singleton can be seeded to make identifiers deterministic.
"""
def uuid1(self):
return uuid.UUID(int=self.getrandbits(128), version=1)
def uuid4(self):
return uuid.UUID(int=self.getrandbits(128), version=4)
def get_random_hex(self, length=8):
return "".join(str(self.choice(HEX_CHARS)) for _ in range(length))
def get_random_string(self, length=20, include_digits=True, lower_case=False):
pool = string.ascii_letters
if include_digits:
pool += string.digits
random_str = "".join([self.choice(pool) for i in range(length)])
return random_str.lower() if lower_case else random_str

View File

@ -44,9 +44,9 @@ class Recorder:
body_encoded = False body_encoded = False
finally: finally:
if request_body is not None: if request_body is not None:
if isinstance(request_body, bytes): if isinstance(request_body, str):
request_body = request_body.decode("utf-8") request_body = request_body.encode("utf-8")
request.environ["wsgi.input"] = io.StringIO(request_body) request.environ["wsgi.input"] = io.BytesIO(request_body)
else: else:
body, body_encoded = self._encode_body(body) body, body_encoded = self._encode_body(body)
entry.update({"body": body, "body_encoded": body_encoded}) entry.update({"body": body, "body_encoded": body_encoded})
@ -87,9 +87,11 @@ class Recorder:
def upload_recording(self, data): def upload_recording(self, data):
""" """
Replace the current log. Remember to replay the recording afterwards. Replaces the current log. Remember to replay the recording afterwards.
""" """
filepath = self._location filepath = self._location
if isinstance(data, str):
data = data.encode("utf-8")
with open(filepath, "bw") as file: with open(filepath, "bw") as file:
file.write(data) file.write(data)

View File

@ -106,3 +106,11 @@ class MotoAPIResponse(BaseResponse):
moto_api_backend.unset_transition(model_name) moto_api_backend.unset_transition(model_name)
return 201, {}, "" return 201, {}, ""
def seed(self, req, full_url, headers):
self.setup_class(req, full_url, headers)
from . import mock_random
a = self._get_param("a")
mock_random.seed(int(a))
return 200, {}, ""

View File

@ -11,6 +11,7 @@ url_paths = {
"{0}/moto-api/data.json": response_instance.model_data, "{0}/moto-api/data.json": response_instance.model_data,
"{0}/moto-api/reset": response_instance.reset_response, "{0}/moto-api/reset": response_instance.reset_response,
"{0}/moto-api/reset-auth": response_instance.reset_auth_response, "{0}/moto-api/reset-auth": response_instance.reset_auth_response,
"{0}/moto-api/seed": response_instance.seed,
"{0}/moto-api/state-manager/get-transition": response_instance.get_transition, "{0}/moto-api/state-manager/get-transition": response_instance.get_transition,
"{0}/moto-api/state-manager/set-transition": response_instance.set_transition, "{0}/moto-api/state-manager/set-transition": response_instance.set_transition,
"{0}/moto-api/state-manager/unset-transition": response_instance.unset_transition, "{0}/moto-api/state-manager/unset-transition": response_instance.unset_transition,

View File

@ -2,7 +2,8 @@ import base64
import xmltodict import xmltodict
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, get_random_hex, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from .configuration import DEFAULT_CONFIGURATION_DATA from .configuration import DEFAULT_CONFIGURATION_DATA
@ -58,7 +59,7 @@ class ConfigurationRevision(BaseModel):
class Configuration(BaseModel): class Configuration(BaseModel):
def __init__(self, account_id, region, name, engine_type, engine_version): def __init__(self, account_id, region, name, engine_type, engine_version):
self.id = f"c-{get_random_hex(6)}" self.id = f"c-{mock_random.get_random_hex(6)}"
self.arn = f"arn:aws:mq:{region}:{account_id}:configuration:{self.id}" self.arn = f"arn:aws:mq:{region}:{account_id}:configuration:{self.id}"
self.created = unix_time() self.created = unix_time()
@ -160,7 +161,7 @@ class Broker(BaseModel):
users, users,
): ):
self.name = name self.name = name
self.id = get_random_hex(6) self.id = mock_random.get_random_hex(6)
self.arn = f"arn:aws:mq:{region}:{account_id}:broker:{self.id}" self.arn = f"arn:aws:mq:{region}:{account_id}:broker:{self.id}"
self.state = "RUNNING" self.state = "RUNNING"
self.created = unix_time() self.created = unix_time()
@ -217,7 +218,7 @@ class Broker(BaseModel):
self.configurations = None self.configurations = None
else: else:
current_config = configuration or { current_config = configuration or {
"id": f"c-{get_random_hex(6)}", "id": f"c-{mock_random.get_random_hex(6)}",
"revision": 1, "revision": 1,
} }
self.configurations = { self.configurations = {

View File

@ -1,9 +1,8 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
import uuid from moto.moto_api._internal import mock_random as random
import datetime import datetime
from random import choice
from .exceptions import ResourceNotFoundException, ValidationException from .exceptions import ResourceNotFoundException, ValidationException
@ -83,7 +82,7 @@ class OpsworkInstance(BaseModel):
self.infrastructure_class = "ec2 (fixed)" self.infrastructure_class = "ec2 (fixed)"
self.platform = "linux (fixed)" self.platform = "linux (fixed)"
self.id = "{0}".format(uuid.uuid4()) self.id = "{0}".format(random.uuid4())
self.created_at = datetime.datetime.utcnow() self.created_at = datetime.datetime.utcnow()
def start(self): def start(self):
@ -273,7 +272,7 @@ class Layer(BaseModel):
self.install_updates_on_boot = install_updates_on_boot self.install_updates_on_boot = install_updates_on_boot
self.use_ebs_optimized_instances = use_ebs_optimized_instances self.use_ebs_optimized_instances = use_ebs_optimized_instances
self.id = "{0}".format(uuid.uuid4()) self.id = "{0}".format(random.uuid4())
self.created_at = datetime.datetime.utcnow() self.created_at = datetime.datetime.utcnow()
def __eq__(self, other): def __eq__(self, other):
@ -369,7 +368,7 @@ class Stack(BaseModel):
self.default_root_device_type = default_root_device_type self.default_root_device_type = default_root_device_type
self.agent_version = agent_version self.agent_version = agent_version
self.id = "{0}".format(uuid.uuid4()) self.id = "{0}".format(random.uuid4())
self.layers = [] self.layers = []
self.apps = [] self.apps = []
self.account_number = account_id self.account_number = account_id
@ -381,7 +380,8 @@ class Stack(BaseModel):
def generate_hostname(self): def generate_hostname(self):
# this doesn't match amazon's implementation # this doesn't match amazon's implementation
return "{theme}-{rand}-(moto)".format( return "{theme}-{rand}-(moto)".format(
theme=self.hostname_theme, rand=[choice("abcdefghijhk") for _ in range(4)] theme=self.hostname_theme,
rand=[random.choice("abcdefghijhk") for _ in range(4)],
) )
@property @property
@ -469,7 +469,7 @@ class App(BaseModel):
if environment is None: if environment is None:
self.environment = {} self.environment = {}
self.id = "{0}".format(uuid.uuid4()) self.id = "{0}".format(random.uuid4())
self.created_at = datetime.datetime.utcnow() self.created_at = datetime.datetime.utcnow()
def __eq__(self, other): def __eq__(self, other):

View File

@ -1,6 +1,6 @@
import random
import re import re
import string import string
from moto.moto_api._internal import mock_random as random
MASTER_ACCOUNT_EMAIL = "master@example.com" MASTER_ACCOUNT_EMAIL = "master@example.com"

View File

@ -1,15 +1,15 @@
from datetime import datetime from datetime import datetime
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from uuid import uuid4
from .exceptions import ApplicationNotFound, EventStreamNotFound from .exceptions import ApplicationNotFound, EventStreamNotFound
class App(BaseModel): class App(BaseModel):
def __init__(self, account_id, name): def __init__(self, account_id, name):
self.application_id = str(uuid4()).replace("-", "") self.application_id = str(mock_random.uuid4()).replace("-", "")
self.arn = ( self.arn = (
f"arn:aws:mobiletargeting:us-east-1:{account_id}:apps/{self.application_id}" f"arn:aws:mobiletargeting:us-east-1:{account_id}:apps/{self.application_id}"
) )

View File

@ -1,11 +1,10 @@
import re import re
import string import string
from datetime import datetime from datetime import datetime
import random
from uuid import uuid4
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import unix_time, BackendDict from moto.core.utils import unix_time, BackendDict
from moto.moto_api._internal import mock_random as random
from moto.organizations import organizations_backends from moto.organizations import organizations_backends
from moto.ram.exceptions import ( from moto.ram.exceptions import (
MalformedArnException, MalformedArnException,
@ -43,7 +42,9 @@ class ResourceShare(BaseModel):
self.region = region self.region = region
self.allow_external_principals = kwargs.get("allowExternalPrincipals", True) self.allow_external_principals = kwargs.get("allowExternalPrincipals", True)
self.arn = f"arn:aws:ram:{self.region}:{account_id}:resource-share/{uuid4()}" self.arn = (
f"arn:aws:ram:{self.region}:{account_id}:resource-share/{random.uuid4()}"
)
self.creation_time = datetime.utcnow() self.creation_time = datetime.utcnow()
self.feature_set = "STANDARD" self.feature_set = "STANDARD"
self.last_updated_time = datetime.utcnow() self.last_updated_time = datetime.utcnow()

View File

@ -1,7 +1,6 @@
import copy import copy
import datetime import datetime
import os import os
import random
import string import string
from collections import defaultdict from collections import defaultdict
@ -9,9 +8,9 @@ from jinja2 import Template
from re import compile as re_compile from re import compile as re_compile
from collections import OrderedDict from collections import OrderedDict
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
from moto.ec2.models import ec2_backends from moto.ec2.models import ec2_backends
from moto.moto_api._internal import mock_random as random
from .exceptions import ( from .exceptions import (
RDSClientError, RDSClientError,
DBClusterNotFoundError, DBClusterNotFoundError,

View File

@ -4,8 +4,8 @@ import datetime
from collections import OrderedDict from collections import OrderedDict
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict from moto.core.utils import iso_8601_datetime_with_milliseconds, BackendDict
from moto.utilities.utils import random_string
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.moto_api._internal import mock_random
from .exceptions import ( from .exceptions import (
ClusterAlreadyExistsFaultError, ClusterAlreadyExistsFaultError,
ClusterNotFoundError, ClusterNotFoundError,
@ -1050,7 +1050,7 @@ class RedshiftBackend(BaseBackend):
db_user = user_prefix + db_user db_user = user_prefix + db_user
return { return {
"DbUser": db_user, "DbUser": db_user,
"DbPassword": random_string(32), "DbPassword": mock_random.get_random_string(32),
"Expiration": expiration, "Expiration": expiration,
} }
else: else:

View File

@ -1,10 +1,9 @@
import re import re
import uuid
from datetime import datetime from datetime import datetime
import random
from moto.core import BaseBackend from moto.core import BaseBackend
from moto.core.utils import BackendDict, iso_8601_datetime_without_milliseconds from moto.core.utils import BackendDict, iso_8601_datetime_without_milliseconds
from moto.moto_api._internal import mock_random as random
from moto.redshiftdata.exceptions import ValidationException, ResourceNotFoundException from moto.redshiftdata.exceptions import ValidationException, ResourceNotFoundException
@ -20,7 +19,7 @@ class Statement:
): ):
now = iso_8601_datetime_without_milliseconds(datetime.now()) now = iso_8601_datetime_without_milliseconds(datetime.now())
self.id = str(uuid.uuid4()) self.id = str(random.uuid4())
self.cluster_identifier = cluster_identifier self.cluster_identifier = cluster_identifier
self.created_at = now self.created_at = now
self.database = database self.database = database

View File

@ -1,10 +1,10 @@
"""RekognitionBackend class with methods for supported APIs.""" """RekognitionBackend class with methods for supported APIs."""
import random
import string import string
from moto.core import BaseBackend from moto.core import BaseBackend
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random as random
class RekognitionBackend(BaseBackend): class RekognitionBackend(BaseBackend):

View File

@ -1,8 +1,7 @@
import uuid
from moto.core import BaseBackend from moto.core import BaseBackend
from moto.core.exceptions import RESTError from moto.core.exceptions import RESTError
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from moto.s3 import s3_backends from moto.s3 import s3_backends
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
@ -612,7 +611,7 @@ class ResourceGroupsTaggingAPIBackend(BaseBackend):
return None, result return None, result
# Didn't hit StopIteration so there's stuff left in generator # Didn't hit StopIteration so there's stuff left in generator
new_token = str(uuid.uuid4()) new_token = str(mock_random.uuid4())
self._pages[new_token] = {"gen": generator, "misc": next_item} self._pages[new_token] = {"gen": generator, "misc": next_item}
# Token used up, might as well bin now, if you call it again your an idiot # Token used up, might as well bin now, if you call it again your an idiot
@ -658,7 +657,7 @@ class ResourceGroupsTaggingAPIBackend(BaseBackend):
return None, result return None, result
# Didn't hit StopIteration so there's stuff left in generator # Didn't hit StopIteration so there's stuff left in generator
new_token = str(uuid.uuid4()) new_token = str(mock_random.uuid4())
self._pages[new_token] = {"gen": generator, "misc": next_item} self._pages[new_token] = {"gen": generator, "misc": next_item}
# Token used up, might as well bin now, if you call it again your an idiot # Token used up, might as well bin now, if you call it again your an idiot
@ -704,7 +703,7 @@ class ResourceGroupsTaggingAPIBackend(BaseBackend):
return None, result return None, result
# Didn't hit StopIteration so there's stuff left in generator # Didn't hit StopIteration so there's stuff left in generator
new_token = str(uuid.uuid4()) new_token = str(mock_random.uuid4())
self._pages[new_token] = {"gen": generator, "misc": next_item} self._pages[new_token] = {"gen": generator, "misc": next_item}
# Token used up, might as well bin now, if you call it again your an idiot # Token used up, might as well bin now, if you call it again your an idiot

View File

@ -1,11 +1,8 @@
"""Route53Backend class with methods for supported APIs.""" """Route53Backend class with methods for supported APIs."""
import itertools import itertools
from collections import defaultdict
import re import re
import string import string
import random from collections import defaultdict
import uuid
from jinja2 import Template from jinja2 import Template
from moto.route53.exceptions import ( from moto.route53.exceptions import (
@ -23,6 +20,7 @@ from moto.route53.exceptions import (
) )
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random as random
from moto.utilities.paginator import paginate from moto.utilities.paginator import paginate
from .utils import PAGINATION_MODEL from .utils import PAGINATION_MODEL
@ -645,7 +643,7 @@ class Route53Backend(BaseBackend):
return zone return zone
def create_health_check(self, caller_reference, health_check_args): def create_health_check(self, caller_reference, health_check_args):
health_check_id = str(uuid.uuid4()) health_check_id = str(random.uuid4())
health_check = HealthCheck(health_check_id, caller_reference, health_check_args) health_check = HealthCheck(health_check_id, caller_reference, health_check_args)
health_check.set_children(health_check_args.get("children")) health_check.set_children(health_check_args.get("children"))
health_check.set_regions(health_check_args.get("regions")) health_check.set_regions(health_check_args.get("regions"))
@ -749,7 +747,7 @@ class Route53Backend(BaseBackend):
raise QueryLoggingConfigAlreadyExists() raise QueryLoggingConfigAlreadyExists()
# Create an instance of the query logging config. # Create an instance of the query logging config.
query_logging_config_id = str(uuid.uuid4()) query_logging_config_id = str(random.uuid4())
query_logging_config = QueryLoggingConfig( query_logging_config = QueryLoggingConfig(
query_logging_config_id, hosted_zone_id, log_group_arn query_logging_config_id, hosted_zone_id, log_group_arn
) )

View File

@ -5,10 +5,11 @@ from ipaddress import ip_address, ip_network, IPv4Address
import re import re
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import get_random_hex, BackendDict from moto.core.utils import BackendDict
from moto.ec2 import ec2_backends from moto.ec2 import ec2_backends
from moto.ec2.exceptions import InvalidSubnetIdError from moto.ec2.exceptions import InvalidSubnetIdError
from moto.ec2.exceptions import InvalidSecurityGroupNotFoundError from moto.ec2.exceptions import InvalidSecurityGroupNotFoundError
from moto.moto_api._internal import mock_random
from moto.route53resolver.exceptions import ( from moto.route53resolver.exceptions import (
InvalidParameterException, InvalidParameterException,
InvalidRequestException, InvalidRequestException,
@ -114,7 +115,7 @@ class ResolverRule(BaseModel): # pylint: disable=too-many-instance-attributes
# of X-Amzn-Trace-Id. We don't have that info, so a random number # of X-Amzn-Trace-Id. We don't have that info, so a random number
# of similar format and length will be used. # of similar format and length will be used.
self.status_message = ( self.status_message = (
f"[Trace id: 1-{get_random_hex(8)}-{get_random_hex(24)}] " f"[Trace id: 1-{mock_random.get_random_hex(8)}-{mock_random.get_random_hex(24)}] "
f"Successfully created Resolver Rule" f"Successfully created Resolver Rule"
) )
self.share_status = "SHARED_WITH_ME" self.share_status = "SHARED_WITH_ME"
@ -199,7 +200,7 @@ class ResolverEndpoint(BaseModel): # pylint: disable=too-many-instance-attribut
# of X-Amzn-Trace-Id. We don't have that info, so a random number # of X-Amzn-Trace-Id. We don't have that info, so a random number
# of similar format and length will be used. # of similar format and length will be used.
self.status_message = ( self.status_message = (
f"[Trace id: 1-{get_random_hex(8)}-{get_random_hex(24)}] " f"[Trace id: 1-{mock_random.get_random_hex(8)}-{mock_random.get_random_hex(24)}] "
f"Successfully created Resolver Endpoint" f"Successfully created Resolver Endpoint"
) )
self.creation_time = datetime.now(timezone.utc).isoformat() self.creation_time = datetime.now(timezone.utc).isoformat()
@ -228,7 +229,9 @@ class ResolverEndpoint(BaseModel): # pylint: disable=too-many-instance-attribut
""" """
subnets = defaultdict(dict) subnets = defaultdict(dict)
for entry in self.ip_addresses: for entry in self.ip_addresses:
subnets[entry["SubnetId"]][entry["Ip"]] = f"rni-{get_random_hex(17)}" subnets[entry["SubnetId"]][
entry["Ip"]
] = f"rni-{mock_random.get_random_hex(17)}"
return subnets return subnets
def create_eni(self): def create_eni(self):
@ -298,7 +301,7 @@ class ResolverEndpoint(BaseModel): # pylint: disable=too-many-instance-attribut
self.ip_addresses.append(ip_address) self.ip_addresses.append(ip_address)
self.ip_address_count = len(self.ip_addresses) self.ip_address_count = len(self.ip_addresses)
eni_id = f"rni-{get_random_hex(17)}" eni_id = f"rni-{mock_random.get_random_hex(17)}"
self.subnets[ip_address["SubnetId"]][ip_address["Ip"]] = eni_id self.subnets[ip_address["SubnetId"]][ip_address["Ip"]] = eni_id
eni_info = self.ec2_backend.create_network_interface( eni_info = self.ec2_backend.create_network_interface(
@ -390,7 +393,7 @@ class Route53ResolverBackend(BaseBackend):
f"VPC. Conflict with resolver rule '{resolver_rule_id}'" f"VPC. Conflict with resolver rule '{resolver_rule_id}'"
) )
rule_association_id = f"rslvr-rrassoc-{get_random_hex(17)}" rule_association_id = f"rslvr-rrassoc-{mock_random.get_random_hex(17)}"
rule_association = ResolverRuleAssociation( rule_association = ResolverRuleAssociation(
self.region_name, rule_association_id, resolver_rule_id, vpc_id, name self.region_name, rule_association_id, resolver_rule_id, vpc_id, name
) )
@ -509,9 +512,7 @@ class Route53ResolverBackend(BaseBackend):
f"'{creator_request_id}' already exists" f"'{creator_request_id}' already exists"
) )
endpoint_id = ( endpoint_id = f"rslvr-{'in' if direction == 'INBOUND' else 'out'}-{mock_random.get_random_hex(17)}"
f"rslvr-{'in' if direction == 'INBOUND' else 'out'}-{get_random_hex(17)}"
)
resolver_endpoint = ResolverEndpoint( resolver_endpoint = ResolverEndpoint(
self.account_id, self.account_id,
region, region,
@ -605,7 +606,7 @@ class Route53ResolverBackend(BaseBackend):
f"'{creator_request_id}' already exists" f"'{creator_request_id}' already exists"
) )
rule_id = f"rslvr-rr-{get_random_hex(17)}" rule_id = f"rslvr-rr-{mock_random.get_random_hex(17)}"
resolver_rule = ResolverRule( resolver_rule = ResolverRule(
self.account_id, self.account_id,
region, region,

View File

@ -5,20 +5,17 @@ import datetime
import copy import copy
import itertools import itertools
import codecs import codecs
import random
import string import string
import tempfile import tempfile
import threading import threading
import pytz import pytz
import sys import sys
import uuid
import urllib.parse import urllib.parse
from bisect import insort from bisect import insort
from importlib import reload from importlib import reload
from moto.core import BaseBackend, BaseModel, CloudFormationModel from moto.core import BaseBackend, BaseModel, CloudFormationModel
from moto.core import CloudWatchMetricProvider from moto.core import CloudWatchMetricProvider
from moto.core.utils import ( from moto.core.utils import (
iso_8601_datetime_without_milliseconds_s3, iso_8601_datetime_without_milliseconds_s3,
rfc_1123_datetime, rfc_1123_datetime,
@ -28,6 +25,7 @@ from moto.core.utils import (
) )
from moto.cloudwatch.models import MetricDatum from moto.cloudwatch.models import MetricDatum
from moto.moto_api import state_manager 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.moto_api._internal.managed_state_model import ManagedState
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from moto.utilities.utils import LowercaseDict, md5_hash from moto.utilities.utils import LowercaseDict, md5_hash
@ -80,7 +78,7 @@ class FakeDeleteMarker(BaseModel):
self.key = key self.key = key
self.name = key.name self.name = key.name
self.last_modified = datetime.datetime.utcnow() self.last_modified = datetime.datetime.utcnow()
self._version_id = str(uuid.uuid4()) self._version_id = str(random.uuid4())
@property @property
def last_modified_ISO8601(self): def last_modified_ISO8601(self):
@ -1728,7 +1726,7 @@ class S3Backend(BaseBackend, CloudWatchMetricProvider):
storage=storage, storage=storage,
etag=etag, etag=etag,
is_versioned=bucket.is_versioned, is_versioned=bucket.is_versioned,
version_id=str(uuid.uuid4()) if bucket.is_versioned else "null", version_id=str(random.uuid4()) if bucket.is_versioned else "null",
multipart=multipart, multipart=multipart,
encryption=encryption, encryption=encryption,
kms_key_id=kms_key_id, kms_key_id=kms_key_id,

View File

@ -7,7 +7,6 @@ import urllib.parse
from moto import settings from moto import settings
from moto.core.utils import ( from moto.core.utils import (
amzn_request_id,
extract_region_from_aws_authorization, extract_region_from_aws_authorization,
str_to_rfc_1123_datetime, str_to_rfc_1123_datetime,
) )
@ -23,6 +22,7 @@ from moto.s3bucket_path.utils import (
parse_key_name as bucketpath_parse_key_name, parse_key_name as bucketpath_parse_key_name,
is_delete_keys as bucketpath_is_delete_keys, is_delete_keys as bucketpath_is_delete_keys,
) )
from moto.utilities.aws_headers import amzn_request_id
from .exceptions import ( from .exceptions import (
BucketAlreadyExists, BucketAlreadyExists,

View File

@ -1,7 +1,8 @@
from collections import defaultdict from collections import defaultdict
from datetime import datetime from datetime import datetime
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import get_random_hex, BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from moto.s3.exceptions import ( from moto.s3.exceptions import (
WrongPublicAccessBlockAccountIdError, WrongPublicAccessBlockAccountIdError,
NoSuchPublicAccessBlockConfiguration, NoSuchPublicAccessBlockConfiguration,
@ -22,7 +23,7 @@ class AccessPoint(BaseModel):
public_access_block_configuration, public_access_block_configuration,
): ):
self.name = name self.name = name
self.alias = f"{name}-{get_random_hex(34)}-s3alias" self.alias = f"{name}-{mock_random.get_random_hex(34)}-s3alias"
self.bucket = bucket self.bucket = bucket
self.created = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f") self.created = datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f")
self.arn = f"arn:aws:s3:us-east-1:{account_id}:accesspoint/{name}" self.arn = f"arn:aws:s3:us-east-1:{account_id}:accesspoint/{name}"

View File

@ -2,9 +2,9 @@ import json
import xmltodict import xmltodict
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id
from moto.s3.exceptions import S3ClientError from moto.s3.exceptions import S3ClientError
from moto.s3.responses import S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION from moto.s3.responses import S3_PUBLIC_ACCESS_BLOCK_CONFIGURATION
from moto.utilities.aws_headers import amzn_request_id
from .models import s3control_backends from .models import s3control_backends

View File

@ -3,7 +3,7 @@ import json
from moto.sagemaker.exceptions import AWSValidationException from moto.sagemaker.exceptions import AWSValidationException
from moto.core.responses import BaseResponse from moto.core.responses import BaseResponse
from moto.core.utils import amzn_request_id from moto.utilities.aws_headers import amzn_request_id
from .models import sagemaker_backends from .models import sagemaker_backends

View File

@ -1,12 +1,12 @@
import time import time
import json import json
import uuid
import datetime import datetime
from typing import List, Tuple from typing import List, Tuple
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
from .exceptions import ( from .exceptions import (
SecretNotFoundException, SecretNotFoundException,
SecretHasNoValueException, SecretHasNoValueException,
@ -221,7 +221,7 @@ class SecretsManagerBackend(BaseBackend):
if version_id: if version_id:
self._client_request_token_validator(version_id) self._client_request_token_validator(version_id)
else: else:
version_id = str(uuid.uuid4()) version_id = str(mock_random.uuid4())
return version_id return version_id
def get_secret_value(self, secret_id, version_id, version_stage): def get_secret_value(self, secret_id, version_id, version_stage):
@ -512,7 +512,7 @@ class SecretsManagerBackend(BaseBackend):
self._client_request_token_validator(client_request_token) self._client_request_token_validator(client_request_token)
new_version_id = client_request_token new_version_id = client_request_token
else: else:
new_version_id = str(uuid.uuid4()) new_version_id = str(mock_random.uuid4())
# We add the new secret version as "pending". The previous version remains # We add the new secret version as "pending". The previous version remains
# as "current" for now. Once we've passed the new secret through the lambda # as "current" for now. Once we've passed the new secret through the lambda

View File

@ -1,6 +1,6 @@
import random
import string import string
import re import re
from moto.moto_api._internal import mock_random as random
def random_password( def random_password(

View File

@ -1,8 +1,8 @@
import random
import string import string
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, unix_time from moto.core.utils import BackendDict, unix_time
from moto.moto_api._internal import mock_random as random
from moto.utilities.tagging_service import TaggingService from moto.utilities.tagging_service import TaggingService
from .exceptions import ( from .exceptions import (

View File

@ -1,6 +1,6 @@
import random
import string import string
from email.utils import parseaddr from email.utils import parseaddr
from moto.moto_api._internal import mock_random as random
def random_hex(length): def random_hex(length):

View File

@ -1,5 +1,6 @@
from moto.core import BaseBackend, BaseModel from moto.core import BaseBackend, BaseModel
from moto.core.utils import BackendDict, get_random_hex from moto.core.utils import BackendDict
from moto.moto_api._internal import mock_random
class SigningProfile(BaseModel): class SigningProfile(BaseModel):
@ -16,7 +17,7 @@ class SigningProfile(BaseModel):
self.status = "Active" self.status = "Active"
self.arn = f"arn:aws:signer:{region}:{account_id}:/signing-profiles/{name}" self.arn = f"arn:aws:signer:{region}:{account_id}:/signing-profiles/{name}"
self.profile_version = get_random_hex(10) self.profile_version = mock_random.get_random_hex(10)
self.profile_version_arn = f"{self.arn}/{self.profile_version}" self.profile_version_arn = f"{self.arn}/{self.profile_version}"
def cancel(self): def cancel(self):

View File

@ -1,5 +1,4 @@
import datetime import datetime
import uuid
import json import json
import requests import requests
@ -12,6 +11,7 @@ from moto.core.utils import (
camelcase_to_underscores, camelcase_to_underscores,
BackendDict, BackendDict,
) )
from moto.moto_api._internal import mock_random
from moto.sqs import sqs_backends from moto.sqs import sqs_backends
from moto.sqs.exceptions import MissingParameter from moto.sqs.exceptions import MissingParameter
@ -60,7 +60,7 @@ class Topic(CloudFormationModel):
self.content_based_deduplication = "false" self.content_based_deduplication = "false"
def publish(self, message, subject=None, message_attributes=None, group_id=None): def publish(self, message, subject=None, message_attributes=None, group_id=None):
message_id = str(uuid.uuid4()) message_id = str(mock_random.uuid4())
subscriptions, _ = self.sns_backend.list_subscriptions(self.arn) subscriptions, _ = self.sns_backend.list_subscriptions(self.arn)
for subscription in subscriptions: for subscription in subscriptions:
subscription.publish( subscription.publish(
@ -424,7 +424,7 @@ class PlatformEndpoint(BaseModel):
self.custom_user_data = custom_user_data self.custom_user_data = custom_user_data
self.token = token self.token = token
self.attributes = attributes self.attributes = attributes
self.id = uuid.uuid4() self.id = mock_random.uuid4()
self.arn = f"arn:aws:sns:{region}:{account_id}:endpoint/{self.application.platform}/{self.application.name}/{self.id}" self.arn = f"arn:aws:sns:{region}:{account_id}:endpoint/{self.application.platform}/{self.application.name}/{self.id}"
self.messages = OrderedDict() self.messages = OrderedDict()
self.__fixup_attributes() self.__fixup_attributes()
@ -449,7 +449,7 @@ class PlatformEndpoint(BaseModel):
raise SnsEndpointDisabled("Endpoint %s disabled" % self.id) raise SnsEndpointDisabled("Endpoint %s disabled" % self.id)
# This is where we would actually send a message # This is where we would actually send a message
message_id = str(uuid.uuid4()) message_id = str(mock_random.uuid4())
self.messages[message_id] = message self.messages[message_id] = message
return message_id return message_id
@ -651,7 +651,7 @@ class SNSBackend(BaseBackend):
if len(message) > MAXIMUM_SMS_MESSAGE_BYTES: if len(message) > MAXIMUM_SMS_MESSAGE_BYTES:
raise ValueError("SMS message must be less than 1600 bytes") raise ValueError("SMS message must be less than 1600 bytes")
message_id = str(uuid.uuid4()) message_id = str(mock_random.uuid4())
self.sms_messages[message_id] = (phone_number, message) self.sms_messages[message_id] = (phone_number, message)
return message_id return message_id

Some files were not shown because too many files have changed in this diff Show More