second first commit
This commit is contained in:
@@ -0,0 +1,514 @@
|
||||
quarkus:
|
||||
http:
|
||||
port: 0
|
||||
test-port: 0
|
||||
# Integration signatures use localhost as the public test authority. Keep the test listener
|
||||
# explicit so the production loopback default does not change the signed host.
|
||||
host: 0.0.0.0
|
||||
limits:
|
||||
max-body-size: ${floci.protocols.max-request-size}M
|
||||
# Groovy (a REST Assured dependency) starts DFA-cache-cleaner threads that never stop.
|
||||
# Loaded parent-first they live in the shared system classloader, so they cannot pin a
|
||||
# per-profile application classloader across the many app restarts of a test run.
|
||||
class-loading:
|
||||
parent-first-artifacts: org.apache.groovy:groovy
|
||||
|
||||
floci:
|
||||
base-url: "http://localhost:4566"
|
||||
network:
|
||||
security-group-enforcement:
|
||||
enabled: true
|
||||
helper-image: floci/network-helper:local
|
||||
default-region: us-east-1
|
||||
default-account-id: "000000000000"
|
||||
ai-mock-config-file: ${AI_MOCK_CONFIG:src/test/resources/fixtures/ai-mock-config.json}
|
||||
storage:
|
||||
mode: memory
|
||||
persistent-path: ./target/test-data
|
||||
prune-volumes-on-delete: true
|
||||
wal:
|
||||
compaction-interval-ms: 60000
|
||||
services:
|
||||
ssm:
|
||||
flush-interval-ms: 60000
|
||||
dynamodb:
|
||||
flush-interval-ms: 60000
|
||||
sns:
|
||||
flush-interval-ms: 60000
|
||||
lambda:
|
||||
flush-interval-ms: 60000
|
||||
cloudwatchlogs:
|
||||
flush-interval-ms: 60000
|
||||
cloudwatchmetrics:
|
||||
flush-interval-ms: 60000
|
||||
secretsmanager:
|
||||
flush-interval-ms: 60000
|
||||
acm:
|
||||
flush-interval-ms: 60000
|
||||
opensearch:
|
||||
flush-interval-ms: 60000
|
||||
sagemaker:
|
||||
flush-interval-ms: 60000
|
||||
batch:
|
||||
flush-interval-ms: 60000
|
||||
lightsail:
|
||||
flush-interval-ms: 60000
|
||||
codepipeline:
|
||||
flush-interval-ms: 60000
|
||||
s3vectors:
|
||||
flush-interval-ms: 60000
|
||||
s3tables:
|
||||
flush-interval-ms: 60000
|
||||
ecs:
|
||||
flush-interval-ms: 60000
|
||||
codebuild:
|
||||
flush-interval-ms: 60000
|
||||
config:
|
||||
flush-interval-ms: 60000
|
||||
transcribe:
|
||||
flush-interval-ms: 60000
|
||||
codedeploy:
|
||||
flush-interval-ms: 60000
|
||||
tagging:
|
||||
flush-interval-ms: 60000
|
||||
elasticbeanstalk:
|
||||
flush-interval-ms: 60000
|
||||
cloudfront:
|
||||
appsync:
|
||||
flush-interval-ms: 60000
|
||||
rum:
|
||||
flush-interval-ms: 60000
|
||||
resourceexplorer2:
|
||||
mode: memory
|
||||
flush-interval-ms: 60000
|
||||
fis:
|
||||
flush-interval-ms: 60000
|
||||
guardduty:
|
||||
flush-interval-ms: 60000
|
||||
emrserverless:
|
||||
flush-interval-ms: 60000
|
||||
lakeformation:
|
||||
flush-interval-ms: 60000
|
||||
|
||||
auth:
|
||||
validate-signatures: false
|
||||
presign-secret: test-secret
|
||||
|
||||
security:
|
||||
extra-cors-allowed-origins: ${EXTRA_CORS_ALLOWED_ORIGINS:}
|
||||
extra-cors-allowed-headers: ${EXTRA_CORS_ALLOWED_HEADERS:}
|
||||
extra-cors-expose-headers: ${EXTRA_CORS_EXPOSE_HEADERS:}
|
||||
disable-cors-headers: false
|
||||
# The test listener binds all interfaces so Quarkus keeps localhost as its test authority.
|
||||
# This is test-only; production keeps the loopback default.
|
||||
allow-unsafe-network-exposure: true
|
||||
allow-private-jwt-targets: true
|
||||
|
||||
init-hooks:
|
||||
shell-executable: /bin/sh
|
||||
timeout-seconds: 5
|
||||
shutdown-grace-period-seconds: 2
|
||||
|
||||
tls:
|
||||
enabled: false
|
||||
self-signed: true
|
||||
|
||||
protocols:
|
||||
strict-claiming: false
|
||||
reject-unknown-service-scope: true
|
||||
|
||||
docker:
|
||||
log-max-size: "10m"
|
||||
log-max-file: "3"
|
||||
resource-namespace: ""
|
||||
|
||||
services:
|
||||
ssm:
|
||||
enabled: true
|
||||
max-parameter-history: 5
|
||||
sqs:
|
||||
enabled: true
|
||||
default-visibility-timeout: 30
|
||||
max-message-size: 1048576
|
||||
s3:
|
||||
enabled: true
|
||||
enforce-auth: false
|
||||
default-presign-expiry-seconds: 3600
|
||||
global-bucket-namespace: false
|
||||
dynamodb:
|
||||
enabled: true
|
||||
sns:
|
||||
enabled: true
|
||||
lambda:
|
||||
enabled: true
|
||||
docker-flags: ""
|
||||
honour-architectures: false
|
||||
zip-max-entries: 100000
|
||||
# aws-config-path:
|
||||
hot-reload:
|
||||
enabled: true
|
||||
apigateway:
|
||||
enabled: true
|
||||
vtl-max-loops: 10000
|
||||
vtl-max-output-chars: 1048576
|
||||
vtl-timeout-millis: 5000
|
||||
apigatewayv2:
|
||||
enabled: true
|
||||
iam:
|
||||
enabled: true
|
||||
enforcement-enabled: false
|
||||
seed-deployer-principal: false
|
||||
msk:
|
||||
enabled: true
|
||||
mock: true
|
||||
default-image: "redpandadata/redpanda:latest"
|
||||
amazonmq:
|
||||
enabled: true
|
||||
mock: true
|
||||
amqp-host-port-base: 5672
|
||||
amqp-host-port-max: 5699
|
||||
console-host-port-base: 15672
|
||||
console-host-port-max: 15699
|
||||
kinesis-analytics:
|
||||
enabled: true
|
||||
mock: true
|
||||
elasticache:
|
||||
enabled: true
|
||||
proxy-base-port: 6379
|
||||
proxy-max-port: 6399
|
||||
default-image: "valkey/valkey:8"
|
||||
default-memcached-image: "memcached:1.6"
|
||||
memorydb:
|
||||
enabled: true
|
||||
mock: false
|
||||
proxy-base-port: 6400
|
||||
proxy-max-port: 6419
|
||||
default-image: "valkey/valkey:8"
|
||||
redshift:
|
||||
enabled: true
|
||||
default-port: 5439
|
||||
image-version: postgres:15-alpine
|
||||
poll-interval-ms: 1000
|
||||
proxy-base-port: 7100
|
||||
proxy-max-port: 7199
|
||||
default-credential-duration-seconds: 900
|
||||
proxy-handshake-timeout-millis: 10000
|
||||
proxy-backend-connect-timeout-millis: 5000
|
||||
proxy-max-connections: 100
|
||||
rds:
|
||||
enabled: true
|
||||
mock: false
|
||||
proxy-base-port: 7001
|
||||
proxy-max-port: 7099
|
||||
default-sql-server-image: "mcr.microsoft.com/mssql/server:2022-latest"
|
||||
proxy-handshake-timeout-millis: 10000
|
||||
proxy-backend-connect-timeout-millis: 5000
|
||||
proxy-max-connections: 100
|
||||
rds-data:
|
||||
enabled: true
|
||||
transaction-ttl-seconds: 180
|
||||
redshift-data:
|
||||
enabled: true
|
||||
result-ttl-hours: 24
|
||||
neptune:
|
||||
enabled: true
|
||||
proxy-base-port: 8182
|
||||
proxy-max-port: 8282
|
||||
default-image: "tinkerpop/gremlin-server:3.7.3"
|
||||
eventbridge:
|
||||
enabled: true
|
||||
cloudmap:
|
||||
enabled: true
|
||||
emr:
|
||||
enabled: true
|
||||
wafv2:
|
||||
enabled: true
|
||||
scheduler:
|
||||
enabled: true
|
||||
cloudwatchlogs:
|
||||
enabled: true
|
||||
max-events-per-query: 10000
|
||||
cloudwatchmetrics:
|
||||
enabled: true
|
||||
secretsmanager:
|
||||
enabled: true
|
||||
default-recovery-window-days: 30
|
||||
kinesis:
|
||||
enabled: true
|
||||
firehose:
|
||||
enabled: true
|
||||
tick-interval-seconds: 10
|
||||
flush-record-count: 0
|
||||
staging-bucket: floci-firehose-staging
|
||||
kms:
|
||||
enabled: true
|
||||
cognito:
|
||||
enabled: true
|
||||
stepfunctions:
|
||||
enabled: true
|
||||
allow-plaintext-http: true
|
||||
mock-config-file: ${SFN_MOCK_CONFIG:src/test/resources/fixtures/sfn-mock-config.json}
|
||||
swf:
|
||||
enabled: true
|
||||
timeout-sweep-enabled: true
|
||||
timeout-sweep-interval-seconds: 1
|
||||
cloudformation:
|
||||
enabled: true
|
||||
# Fail an AWS::Lambda::Function whose S3 code cannot be read, as real CloudFormation
|
||||
# does. Set true to fall back to the built-in stub handler instead (issue #2648).
|
||||
allow-stub-lambda-code: false
|
||||
# Pinned to the shipped default so a test sees what a user sees; the strict-mode test
|
||||
# overrides it with its own profile.
|
||||
allow-stub-unsupported-resource-types: true
|
||||
acm:
|
||||
enabled: true
|
||||
validation-wait-seconds: 0
|
||||
athena:
|
||||
enabled: true
|
||||
mock: true
|
||||
glue:
|
||||
enabled: true
|
||||
ses:
|
||||
enabled: true
|
||||
opensearch:
|
||||
enabled: true
|
||||
mock: true
|
||||
proxy-base-port: 9400
|
||||
proxy-max-port: 9499
|
||||
ec2:
|
||||
enabled: true
|
||||
imds-port: 9169
|
||||
ssh-port-range-start: 2200
|
||||
ssh-port-range-end: 2299
|
||||
publish-security-group-ports: true
|
||||
app-port-range-start: 30000
|
||||
app-port-range-end: 30999
|
||||
max-published-ports-per-instance: 20
|
||||
socat-image: alpine/socat
|
||||
mock: true
|
||||
aws-faithful-private-ip: false
|
||||
# container-ips-routable: true # see src/main/resources/application.yml
|
||||
# Off explicitly, not merely by implication of mock: true above. Tests must not create or
|
||||
# reconcile Docker networks on whatever daemon CI happens to have.
|
||||
vpc-networks:
|
||||
enabled: false
|
||||
ecs:
|
||||
enabled: true
|
||||
mock: true
|
||||
host-volume-roots: []
|
||||
allow-unsafe-host-volumes: false
|
||||
appconfig:
|
||||
enabled: true
|
||||
appconfigdata:
|
||||
enabled: true
|
||||
ecr:
|
||||
enabled: true
|
||||
ui:
|
||||
enabled: true
|
||||
bedrock:
|
||||
enabled: true
|
||||
bedrock-runtime:
|
||||
enabled: true
|
||||
eks:
|
||||
enabled: true
|
||||
mock: true
|
||||
ecr-registry-mirror: true
|
||||
imds: false
|
||||
irsa-signing-key: true
|
||||
mwaa:
|
||||
enabled: true
|
||||
mock: true
|
||||
pipes:
|
||||
enabled: true
|
||||
elb:
|
||||
enabled: true
|
||||
mock: true
|
||||
elbv2:
|
||||
enabled: true
|
||||
mock: true
|
||||
codebuild:
|
||||
enabled: true
|
||||
# docker-network: floci-network
|
||||
sagemaker:
|
||||
enabled: true
|
||||
# docker-network: floci-network
|
||||
gpu:
|
||||
# Off by default: an existing deployment keeps launching CPU-only
|
||||
# containers. How many GPUs an ml.* type has is shipped in
|
||||
# sagemaker/instance-type-catalog.yaml; this is only about which of
|
||||
# this machine's devices Floci may hand out.
|
||||
enabled: false
|
||||
# cdi | device-ids | count. Podman resolves only cdi, and accepts
|
||||
# count while attaching no device, so cdi fails loudly instead.
|
||||
mode: cdi
|
||||
# Required for cdi and device-ids modes; unset allows no device.
|
||||
# devices:
|
||||
# - nvidia.com/gpu=GPU-<uuid>
|
||||
batch:
|
||||
enabled: true
|
||||
runner-mode: immediate
|
||||
codedeploy:
|
||||
enabled: true
|
||||
codepipeline:
|
||||
enabled: true
|
||||
autoscaling:
|
||||
enabled: true
|
||||
applicationautoscaling:
|
||||
enabled: true
|
||||
elasticbeanstalk:
|
||||
enabled: true
|
||||
transfer:
|
||||
enabled: true
|
||||
backup:
|
||||
enabled: true
|
||||
job-completion-delay-seconds: 1
|
||||
fis:
|
||||
enabled: true
|
||||
route53:
|
||||
enabled: true
|
||||
textract:
|
||||
enabled: true
|
||||
comprehend:
|
||||
enabled: true
|
||||
rekognition:
|
||||
enabled: true
|
||||
translate:
|
||||
enabled: true
|
||||
pricing:
|
||||
enabled: true
|
||||
ce:
|
||||
enabled: true
|
||||
cur:
|
||||
enabled: true
|
||||
emit-mode: off
|
||||
bcm-pricing-calculator:
|
||||
enabled: true
|
||||
timestream-influxdb:
|
||||
enabled: true
|
||||
mock: true
|
||||
bcm-data-exports:
|
||||
enabled: true
|
||||
emit-mode: off
|
||||
oam:
|
||||
enabled: true
|
||||
cloudtrail:
|
||||
enabled: true
|
||||
flush-interval-seconds: 3600
|
||||
lightsail:
|
||||
enabled: true
|
||||
cloudcontrol:
|
||||
enabled: true
|
||||
resourceexplorer2:
|
||||
enabled: true
|
||||
cloudfront:
|
||||
enabled: true
|
||||
allowed-private-origin-hosts: []
|
||||
appsync:
|
||||
enabled: true
|
||||
schema-worker-threads: 4
|
||||
schema-worker-shutdown-timeout-seconds: 30
|
||||
vtl-max-loops: 10000
|
||||
vtl-max-output-chars: 1048576
|
||||
vtl-timeout-millis: 5000
|
||||
s3vectors:
|
||||
enabled: true
|
||||
s3tables:
|
||||
enabled: true
|
||||
iot:
|
||||
enabled: true
|
||||
rule-sql-strict: false
|
||||
mqtt:
|
||||
enabled: true
|
||||
auto-start: false
|
||||
host: 127.0.0.1
|
||||
port: 1883
|
||||
tls-port: 8883
|
||||
iotdata:
|
||||
enabled: true
|
||||
cloudhsmv2:
|
||||
enabled: true
|
||||
efs:
|
||||
enabled: true
|
||||
organizations:
|
||||
enabled: true
|
||||
rum:
|
||||
enabled: true
|
||||
networkfirewall:
|
||||
enabled: true
|
||||
servicecatalog:
|
||||
enabled: true
|
||||
guardduty:
|
||||
enabled: true
|
||||
emrserverless:
|
||||
enabled: true
|
||||
ssoadmin:
|
||||
enabled: true
|
||||
ssooidc:
|
||||
enabled: true
|
||||
local-principal-id: ${FLOCI_SERVICES_SSOOIDC_LOCAL_PRINCIPAL_ID:}
|
||||
macie2:
|
||||
enabled: true
|
||||
account:
|
||||
enabled: true
|
||||
controlcatalog:
|
||||
enabled: true
|
||||
accessanalyzer:
|
||||
enabled: true
|
||||
identitystore:
|
||||
enabled: true
|
||||
scim-bearer-token: ${FLOCI_SERVICES_IDENTITYSTORE_SCIM_BEARER_TOKEN:floci-scim-token}
|
||||
budgets:
|
||||
enabled: true
|
||||
inspector2:
|
||||
enabled: true
|
||||
securityhub:
|
||||
enabled: true
|
||||
detective:
|
||||
enabled: true
|
||||
controltower:
|
||||
enabled: true
|
||||
seed-landing-zone: true
|
||||
route53resolver:
|
||||
enabled: true
|
||||
connect:
|
||||
enabled: true
|
||||
appintegrations:
|
||||
enabled: true
|
||||
cognitoidentity:
|
||||
enabled: true
|
||||
globalaccelerator:
|
||||
enabled: true
|
||||
datasync:
|
||||
enabled: true
|
||||
aps:
|
||||
enabled: true
|
||||
lakeformation:
|
||||
enabled: true
|
||||
tagging:
|
||||
enabled: true
|
||||
configservice:
|
||||
enabled: true
|
||||
transcribe:
|
||||
enabled: true
|
||||
docdb:
|
||||
enabled: true
|
||||
mock: false
|
||||
default-image: "mongo:7.0"
|
||||
bedrock-agent-core:
|
||||
enabled: true
|
||||
bedrock-agent-core-control:
|
||||
enabled: true
|
||||
servicequotas:
|
||||
enabled: true
|
||||
verifiedpermissions:
|
||||
enabled: true
|
||||
ram:
|
||||
enabled: true
|
||||
codegurureviewer:
|
||||
enabled: true
|
||||
codeartifact:
|
||||
enabled: true
|
||||
marketplace:
|
||||
enabled: true
|
||||
dms:
|
||||
enabled: true
|
||||
@@ -0,0 +1,12 @@
|
||||
# Fragment referenced by Fn::Transform / AWS::Include in AwsIncludeProcessorTest, mirroring the
|
||||
# shape of a measured DefinitionSubstitutions block. The folded block scalar below keeps its line
|
||||
# breaks under SnakeYAML, because its continuation lines are more indented than the first, and
|
||||
# AWS::Include's merge splices the parsed node unmodified: it does not fold the value. Folding, if
|
||||
# any, happens later, when the value is substituted into a definition and that definition is
|
||||
# reparsed as YAML - a separate concern from the merge this fragment exercises.
|
||||
expandItems: >-
|
||||
{% (
|
||||
$c := function($v) { $exists($v.S) ? $v.S : $exists($v.N) ? $number($v.N) : $v };
|
||||
$map($states.result.Items, function($i) { $merge($map($keys($i), function($k) { {$k: $c($lookup($i, $k))} })) })
|
||||
) %}
|
||||
orderTableName: orders
|
||||
@@ -0,0 +1,63 @@
|
||||
AWS::AppSync::GraphQLApi GraphQLEndpointArn the private-endpoint ARN of the GraphQL endpoint; Floci serves one public endpoint and has no private-endpoint model
|
||||
AWS::CodeBuild::Project Id schema gives no description; AWS's Id may differ from the project name Floci uses
|
||||
AWS::CodePipeline::CustomActionType Id schema gives no description; the custom action has no separate id in Floci
|
||||
AWS::CodePipeline::Webhook Id schema gives no description; Floci keys webhooks by name
|
||||
AWS::EC2::Instance State not published yet: Floci tracks the instance state, setting it is a separate change to what Fn::GetAtt returns
|
||||
AWS::EC2::Instance VpcId not published yet: the instance's VPC comes from its subnet, setting it is a separate change to what Fn::GetAtt returns
|
||||
AWS::EC2::NatGateway AutoProvisionZones availability-mode NAT gateways are not emulated
|
||||
AWS::EC2::NatGateway AutoScalingIps availability-mode NAT gateways are not emulated
|
||||
AWS::EC2::NatGateway EniId the NAT gateway's network interface is not created
|
||||
AWS::EC2::NatGateway RouteTableId availability-mode NAT gateways are not emulated
|
||||
AWS::EC2::SecurityGroup Id not published yet: the group id is already published as GroupId, adding Id is a separate change to what Fn::GetAtt returns
|
||||
AWS::EC2::Subnet BlockPublicAccessStates VPC block public access is not emulated
|
||||
AWS::EC2::Subnet Ipv6CidrBlocks IPv6 CIDR association is not emulated
|
||||
AWS::EC2::Subnet NetworkAclAssociationId the subnet's default network ACL association is not created with the subnet
|
||||
AWS::EC2::VPC CidrBlockAssociations needs association ids Floci's VPC model does not track
|
||||
AWS::EC2::VPC DefaultNetworkAcl needs a default network ACL Floci does not create with the VPC
|
||||
AWS::EC2::VPC Ipv6CidrBlocks IPv6 CIDR association is not emulated
|
||||
AWS::EC2::VPCEndpoint NetworkInterfaceIds endpoint ENIs are not created
|
||||
AWS::EC2::VPCGatewayAttachment AttachmentType the exact literal AWS returns (internet vs vpn gateway) is not given by the schema
|
||||
AWS::Kinesis::Stream WarmThroughputObject warm throughput is not an emulated Kinesis feature
|
||||
AWS::Lambda::MicrovmImage CreatedAt microvm image lifecycle fields are not tracked
|
||||
AWS::Lambda::MicrovmImage LatestFailedImageVersion failure history is not tracked
|
||||
AWS::Lambda::MicrovmImage State microvm image state is not modelled
|
||||
AWS::Lambda::MicrovmImage UpdatedAt microvm image lifecycle fields are not tracked
|
||||
AWS::Lambda::NetworkConnector State network connector state is not modelled
|
||||
AWS::Lambda::Permission Id schema gives no description and AWS's value is unclear; the physical id is a composite functionName|statementId
|
||||
AWS::Pipes::Pipe CreationTime pipe lifecycle timestamps are not tracked
|
||||
AWS::Pipes::Pipe CurrentState pipe state transitions are not modelled
|
||||
AWS::Pipes::Pipe LastModifiedTime pipe lifecycle timestamps are not tracked
|
||||
AWS::Pipes::Pipe StateReason pipe state transitions are not modelled
|
||||
AWS::RDS::DBCluster Endpoint the dotted Endpoint.Address and Endpoint.Port are set instead, which is the form AWS's GetAtt actually exposes
|
||||
AWS::RDS::DBCluster ReadEndpoint ReadEndpoint.Address is set instead, the form AWS's GetAtt exposes
|
||||
AWS::RDS::DBCluster StorageEncryptionType cluster storage encryption is not emulated
|
||||
AWS::RDS::DBCluster StorageThroughput provisioned storage throughput is not emulated
|
||||
AWS::RDS::DBInstance AutomaticRestartTime instance restart scheduling is not emulated
|
||||
AWS::RDS::DBInstance CertificateDetails per-instance CA certificate metadata is not emulated
|
||||
AWS::RDS::DBInstance DBInstanceStatus the model carries no lifecycle status; instances reach available synchronously
|
||||
AWS::RDS::DBInstance InstanceCreateTime creation timestamps are not recorded on the instance
|
||||
AWS::RDS::DBInstance IsStorageConfigUpgradeAvailable storage configuration upgrades are not emulated
|
||||
AWS::RDS::DBInstance LatestRestorableTime point-in-time restore windows are not emulated
|
||||
AWS::RDS::DBInstance ListenerEndpoint the SQL Server listener endpoint is not emulated
|
||||
AWS::RDS::DBInstance PercentProgress no asynchronous progress to report; instances reach available synchronously
|
||||
AWS::RDS::DBInstance ReadReplicaDBClusterIdentifiers read replicas are not emulated
|
||||
AWS::RDS::DBInstance ReadReplicaDBInstanceIdentifiers read replicas are not emulated
|
||||
AWS::RDS::DBInstance ResumeFullAutomationModeTime RDS Custom automation mode is not emulated
|
||||
AWS::RDS::DBInstance SecondaryAvailabilityZone multi-AZ secondary placement is not emulated
|
||||
AWS::RDS::DBInstance StatusInfos read-replica status detail is not emulated
|
||||
AWS::RDS::DBInstance StorageOperationPercentProgress storage operations (scaling, type changes) are not emulated; storage changes apply synchronously
|
||||
AWS::RDS::DBInstance StorageOperationStatus storage operations (scaling, type changes) are not emulated; storage changes apply synchronously
|
||||
AWS::Redshift::Cluster DeferMaintenanceIdentifier Floci does not emulate deferred maintenance windows
|
||||
AWS::SQS::QueuePolicy Id schema gives no description; the policy has no backing entity to take an id from
|
||||
AWS::SecretsManager::Secret Id Fn::GetAtt Id on a secret is its ARN, which the provisioner already sets as the physical id and as Arn; closable, deferred to a follow-up PR to keep this one a pure move
|
||||
AWS::EKS::Cluster ClusterSecurityGroupId not modeled: Floci does not create a cluster security group, so there is no id to publish
|
||||
AWS::EKS::Cluster EncryptionConfigKeyArn not modeled: Floci does not apply envelope encryption, so no KMS key arn is resolved
|
||||
AWS::EKS::Cluster Id not modeled: Floci identifies a cluster by its Name (the primary identifier and Ref), not a separate Id
|
||||
AWS::IAM::Policy Id not published: Floci uses the policy name for Ref, AWS returns an opaque generated identifier that Floci does not model
|
||||
AWS::IAM::ManagedPolicy AttachmentCount not published: the attachment count is dynamic and Floci does not expose it as a stable Fn::GetAtt value
|
||||
AWS::IAM::ManagedPolicy CreateDate not published: Floci does not surface the policy create date as an Fn::GetAtt value
|
||||
AWS::IAM::ManagedPolicy IsAttachable not modeled: Floci does not track policy attachability
|
||||
AWS::IAM::ManagedPolicy PermissionsBoundaryUsageCount not modeled: Floci does not track permissions-boundary usage
|
||||
AWS::IAM::ManagedPolicy UpdateDate not published: Floci does not surface the policy update date as an Fn::GetAtt value
|
||||
AWS::Lambda::Function SnapStartResponse not modeled: Floci does not emulate Lambda SnapStart, so it exposes no ApplyOn/OptimizationStatus response
|
||||
AWS::CloudFormation::CustomResource Id not published: Id is the primary identifier returned by Ref (the physical resource id); Floci does not expose it as a separate Fn::GetAtt attribute
|
||||
|
@@ -0,0 +1,149 @@
|
||||
AWS::ApiGateway::Account ApiGatewayAccountCfnProvisioner
|
||||
AWS::ApiGateway::ApiKey ApiGatewayApiKeyCfnProvisioner
|
||||
AWS::ApiGateway::Authorizer ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::BasePathMapping ApiGatewayDomainCfnProvisioner
|
||||
AWS::ApiGateway::Deployment ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::DomainName ApiGatewayDomainCfnProvisioner
|
||||
AWS::ApiGateway::GatewayResponse ApiGatewayGatewayResponseCfnProvisioner
|
||||
AWS::ApiGateway::Method ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::Resource ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::RestApi ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::Stage ApiGatewayRestApiCfnProvisioner
|
||||
AWS::ApiGateway::UsagePlan ApiGatewayUsagePlanCfnProvisioner
|
||||
AWS::ApiGateway::UsagePlanKey ApiGatewayUsagePlanCfnProvisioner
|
||||
AWS::ApiGatewayV2::Api ApiGatewayV2CfnProvisioner
|
||||
AWS::ApiGatewayV2::Authorizer ApiGatewayV2CfnProvisioner
|
||||
AWS::ApiGatewayV2::Deployment ApiGatewayV2CfnProvisioner
|
||||
AWS::ApiGatewayV2::Integration ApiGatewayV2CfnProvisioner
|
||||
AWS::ApiGatewayV2::Route ApiGatewayV2CfnProvisioner
|
||||
AWS::ApiGatewayV2::Stage ApiGatewayV2CfnProvisioner
|
||||
AWS::AppSync::ApiKey AppSyncCfnProvisioner
|
||||
AWS::AppSync::DataSource AppSyncCfnProvisioner
|
||||
AWS::AppSync::FunctionConfiguration AppSyncCfnProvisioner
|
||||
AWS::AppSync::GraphQLApi AppSyncCfnProvisioner
|
||||
AWS::AppSync::GraphQLSchema AppSyncCfnProvisioner
|
||||
AWS::AppSync::Resolver AppSyncCfnProvisioner
|
||||
AWS::AutoScaling::AutoScalingGroup AutoScalingGroupCfnProvisioner
|
||||
AWS::AutoScaling::LaunchConfiguration AutoScalingGroupCfnProvisioner
|
||||
AWS::AutoScaling::LifecycleHook AutoScalingLifecycleHookCfnProvisioner
|
||||
AWS::AutoScaling::ScalingPolicy AutoScalingScalingPolicyCfnProvisioner
|
||||
AWS::Backup::BackupVault BackupVaultCfnProvisioner
|
||||
AWS::Batch::ComputeEnvironment BatchCfnProvisioner
|
||||
AWS::Batch::JobDefinition BatchCfnProvisioner
|
||||
AWS::Batch::JobQueue BatchCfnProvisioner
|
||||
AWS::CDK::Metadata CdkMetadataCfnProvisioner
|
||||
AWS::CertificateManager::Certificate AcmCfnProvisioner
|
||||
AWS::CloudFormation::CustomResource CustomResourceCfnProvisioner
|
||||
AWS::CloudFront::CachePolicy CloudFrontCfnProvisioner
|
||||
AWS::CloudFront::Distribution CloudFrontCfnProvisioner
|
||||
AWS::CloudFront::OriginAccessControl CloudFrontCfnProvisioner
|
||||
AWS::CloudFront::OriginRequestPolicy CloudFrontCfnProvisioner
|
||||
AWS::CloudFront::ResponseHeadersPolicy CloudFrontCfnProvisioner
|
||||
AWS::CloudTrail::Trail CloudTrailCfnProvisioner
|
||||
AWS::CloudWatch::Alarm CloudWatchCfnProvisioner
|
||||
AWS::CloudWatch::Dashboard CloudWatchDashboardCfnProvisioner
|
||||
AWS::CodeBuild::Project CodeBuildCfnProvisioner
|
||||
AWS::CodePipeline::CustomActionType CodePipelineCfnProvisioner
|
||||
AWS::CodePipeline::Pipeline CodePipelineCfnProvisioner
|
||||
AWS::CodePipeline::Webhook CodePipelineCfnProvisioner
|
||||
AWS::Cognito::UserPool CognitoCfnProvisioner
|
||||
AWS::Cognito::UserPoolClient CognitoCfnProvisioner
|
||||
AWS::Cognito::UserPoolDomain CognitoCfnProvisioner
|
||||
AWS::Cognito::UserPoolGroup CognitoUserPoolGroupCfnProvisioner
|
||||
AWS::Config::ConfigRule ConfigCfnProvisioner
|
||||
AWS::DynamoDB::GlobalTable DynamoDbCfnProvisioner
|
||||
AWS::DynamoDB::Table DynamoDbCfnProvisioner
|
||||
AWS::EC2::EIP Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::FlowLog Ec2FlowLogCfnProvisioner
|
||||
AWS::EC2::Instance Ec2InstanceCfnProvisioner
|
||||
AWS::EC2::InternetGateway Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::LaunchTemplate Ec2LaunchTemplateCfnProvisioner
|
||||
AWS::EC2::NatGateway Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::NetworkAcl Ec2NetworkAclCfnProvisioner
|
||||
AWS::EC2::NetworkAclEntry Ec2NetworkAclCfnProvisioner
|
||||
AWS::EC2::Route Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::RouteTable Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::SecurityGroup Ec2SecurityGroupCfnProvisioner
|
||||
AWS::EC2::SecurityGroupEgress Ec2SecurityGroupRuleCfnProvisioner
|
||||
AWS::EC2::SecurityGroupIngress Ec2SecurityGroupRuleCfnProvisioner
|
||||
AWS::EC2::Subnet Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::SubnetNetworkAclAssociation Ec2NetworkAclCfnProvisioner
|
||||
AWS::EC2::SubnetRouteTableAssociation Ec2NetworkCfnProvisioner
|
||||
AWS::EC2::VPC Ec2VpcCfnProvisioner
|
||||
AWS::EC2::VPCEndpoint Ec2VpcEndpointCfnProvisioner
|
||||
AWS::EC2::VPCGatewayAttachment Ec2VpcGatewayAttachmentCfnProvisioner
|
||||
AWS::ECR::Repository EcrCfnProvisioner
|
||||
AWS::ECS::CapacityProvider EcsCapacityCfnProvisioner
|
||||
AWS::ECS::Cluster EcsCfnProvisioner
|
||||
AWS::ECS::ClusterCapacityProviderAssociations EcsCapacityCfnProvisioner
|
||||
AWS::ECS::Service EcsCfnProvisioner
|
||||
AWS::ECS::TaskDefinition EcsCfnProvisioner
|
||||
AWS::EKS::Cluster EksCfnProvisioner
|
||||
AWS::EKS::Nodegroup EksCfnProvisioner
|
||||
AWS::ElasticLoadBalancingV2::Listener ElbV2CfnProvisioner
|
||||
AWS::ElasticLoadBalancingV2::ListenerRule ElbV2CfnProvisioner
|
||||
AWS::ElasticLoadBalancingV2::LoadBalancer ElbV2CfnProvisioner
|
||||
AWS::ElasticLoadBalancingV2::TargetGroup ElbV2CfnProvisioner
|
||||
AWS::Events::EventBus EventsCfnProvisioner
|
||||
AWS::Events::EventBusPolicy EventsCfnProvisioner
|
||||
AWS::Events::Rule EventsCfnProvisioner
|
||||
AWS::IAM::AccessKey IamAccessKeyCfnProvisioner
|
||||
AWS::IAM::InstanceProfile IamInstanceProfileCfnProvisioner
|
||||
AWS::IAM::ManagedPolicy IamManagedPolicyCfnProvisioner
|
||||
AWS::IAM::Policy IamPolicyCfnProvisioner
|
||||
AWS::IAM::Role IamRoleCfnProvisioner
|
||||
AWS::IAM::User IamUserCfnProvisioner
|
||||
AWS::IoT::DomainConfiguration IotDomainConfigurationCfnProvisioner
|
||||
AWS::IoT::Policy IotCfnProvisioner
|
||||
AWS::IoT::Thing IotCfnProvisioner
|
||||
AWS::IoT::TopicRule IotCfnProvisioner
|
||||
AWS::KMS::Alias KmsCfnProvisioner
|
||||
AWS::KMS::Key KmsCfnProvisioner
|
||||
AWS::Kinesis::Stream KinesisCfnProvisioner
|
||||
AWS::KinesisFirehose::DeliveryStream FirehoseCfnProvisioner
|
||||
AWS::Lambda::Alias LambdaVersionAliasCfnProvisioner
|
||||
AWS::Lambda::EventInvokeConfig LambdaEventInvokeConfigCfnProvisioner
|
||||
AWS::Lambda::EventSourceMapping LambdaEventSourceMappingCfnProvisioner
|
||||
AWS::Lambda::Function LambdaCfnProvisioner
|
||||
AWS::Lambda::LayerVersion LambdaCfnProvisioner
|
||||
AWS::Lambda::MicrovmImage LambdaMicrovmsCfnProvisioner
|
||||
AWS::Lambda::NetworkConnector LambdaMicrovmsCfnProvisioner
|
||||
AWS::Lambda::Permission LambdaAddressingCfnProvisioner
|
||||
AWS::Lambda::Url LambdaAddressingCfnProvisioner
|
||||
AWS::Lambda::Version LambdaVersionAliasCfnProvisioner
|
||||
AWS::Logs::LogGroup LogsCfnProvisioner
|
||||
AWS::Logs::LogStream LogsLogStreamCfnProvisioner
|
||||
AWS::Logs::MetricFilter LogsMetricFilterCfnProvisioner
|
||||
AWS::Organizations::Account OrganizationsCfnProvisioner
|
||||
AWS::Organizations::Organization OrganizationsCfnProvisioner
|
||||
AWS::Organizations::OrganizationalUnit OrganizationsCfnProvisioner
|
||||
AWS::Organizations::Policy OrganizationsCfnProvisioner
|
||||
AWS::Organizations::ResourcePolicy OrganizationsCfnProvisioner
|
||||
AWS::Pipes::Pipe PipesCfnProvisioner
|
||||
AWS::RDS::DBCluster RdsCfnProvisioner
|
||||
AWS::RDS::DBClusterParameterGroup RdsCfnProvisioner
|
||||
AWS::RDS::DBInstance RdsCfnProvisioner
|
||||
AWS::RDS::DBParameterGroup RdsCfnProvisioner
|
||||
AWS::RDS::DBProxy RdsCfnProvisioner
|
||||
AWS::RDS::DBProxyTargetGroup RdsCfnProvisioner
|
||||
AWS::RDS::DBSubnetGroup RdsCfnProvisioner
|
||||
AWS::Redshift::Cluster RedshiftClusterCfnProvisioner
|
||||
AWS::Redshift::ClusterParameterGroup RedshiftClusterCfnProvisioner
|
||||
AWS::Redshift::ClusterSecurityGroup RedshiftClusterCfnProvisioner
|
||||
AWS::Redshift::ClusterSubnetGroup RedshiftClusterCfnProvisioner
|
||||
AWS::Route53::HostedZone Route53CfnProvisioner
|
||||
AWS::Route53::RecordSet Route53CfnProvisioner
|
||||
AWS::S3::Bucket S3CfnProvisioner
|
||||
AWS::S3::BucketPolicy S3CfnProvisioner
|
||||
AWS::SNS::Subscription SnsCfnProvisioner
|
||||
AWS::SNS::Topic SnsCfnProvisioner
|
||||
AWS::SNS::TopicPolicy SnsCfnProvisioner
|
||||
AWS::SQS::Queue SqsCfnProvisioner
|
||||
AWS::SQS::QueuePolicy SqsCfnProvisioner
|
||||
AWS::SSM::Parameter SsmCfnProvisioner
|
||||
AWS::Scheduler::ScheduleGroup SchedulerScheduleGroupCfnProvisioner
|
||||
AWS::SecretsManager::Secret SecretsManagerCfnProvisioner
|
||||
AWS::SecretsManager::SecretTargetAttachment SecretTargetAttachmentCfnProvisioner
|
||||
AWS::StepFunctions::StateMachine StepFunctionsCfnProvisioner
|
||||
AWS::WAFv2::WebACL WafV2CfnProvisioner
|
||||
Custom::DynamoDBReplica DynamoDbCfnProvisioner
|
||||
|
@@ -0,0 +1,271 @@
|
||||
{
|
||||
"provenance": {
|
||||
"source": "AWS CloudWatch Logs TestMetricFilter",
|
||||
"capturedAt": "2026-09-16T08:35:06.272542+00:00",
|
||||
"region": "eu-west-1",
|
||||
"endpoint": "https://logs.eu-west-1.amazonaws.com",
|
||||
"inputs": "Synthetic only. No resource writes or user logs.",
|
||||
"eventNumberBase": 1,
|
||||
"reference": "https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_TestMetricFilter.html"
|
||||
},
|
||||
"cases": [
|
||||
{
|
||||
"id": "boundary-array-true",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a IS TRUE }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":true}",
|
||||
"{\"a\":false}",
|
||||
"{\"a\":[true,false]}",
|
||||
"{\"a\":[null]}",
|
||||
"{\"a\":[[null]]}",
|
||||
"{\"a\":[{\"b\":2},{\"b\":1}]}",
|
||||
"{\"a\":[{}]}",
|
||||
"{}"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 1,
|
||||
"eventMessage": "{\"a\":true}",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-array-false",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a IS FALSE }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":true}",
|
||||
"{\"a\":false}",
|
||||
"{\"a\":[true,false]}",
|
||||
"{\"a\":[null]}",
|
||||
"{\"a\":[[null]]}",
|
||||
"{\"a\":[{\"b\":2},{\"b\":1}]}",
|
||||
"{\"a\":[{}]}",
|
||||
"{}"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 2,
|
||||
"eventMessage": "{\"a\":false}",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-array-null",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a IS NULL }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":true}",
|
||||
"{\"a\":false}",
|
||||
"{\"a\":[true,false]}",
|
||||
"{\"a\":[null]}",
|
||||
"{\"a\":[[null]]}",
|
||||
"{\"a\":[{\"b\":2},{\"b\":1}]}",
|
||||
"{\"a\":[{}]}",
|
||||
"{}"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 4,
|
||||
"eventMessage": "{\"a\":[null]}",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-nested-negative",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a[*].b != 2 }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":true}",
|
||||
"{\"a\":false}",
|
||||
"{\"a\":[true,false]}",
|
||||
"{\"a\":[null]}",
|
||||
"{\"a\":[[null]]}",
|
||||
"{\"a\":[{\"b\":2},{\"b\":1}]}",
|
||||
"{\"a\":[{}]}",
|
||||
"{}"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 1,
|
||||
"eventMessage": "{\"a\":true}",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 2,
|
||||
"eventMessage": "{\"a\":false}",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 3,
|
||||
"eventMessage": "{\"a\":[true,false]}",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 4,
|
||||
"eventMessage": "{\"a\":[null]}",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 5,
|
||||
"eventMessage": "{\"a\":[[null]]}",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 7,
|
||||
"eventMessage": "{\"a\":[{}]}",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-wildcard-null",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a[*] IS NULL }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":true}",
|
||||
"{\"a\":false}",
|
||||
"{\"a\":[true,false]}",
|
||||
"{\"a\":[null]}",
|
||||
"{\"a\":[[null]]}",
|
||||
"{\"a\":[{\"b\":2},{\"b\":1}]}",
|
||||
"{\"a\":[{}]}",
|
||||
"{}"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 4,
|
||||
"eventMessage": "{\"a\":[null]}",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-term-slash",
|
||||
"request": {
|
||||
"filterPattern": "a/b",
|
||||
"logEventMessages": [
|
||||
"a/b",
|
||||
"a b"
|
||||
]
|
||||
},
|
||||
"error": {
|
||||
"code": "InvalidParameterException",
|
||||
"message": "Invalid character(s) in term '/'"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-term-at",
|
||||
"request": {
|
||||
"filterPattern": "a@b",
|
||||
"logEventMessages": [
|
||||
"a@b",
|
||||
"a b"
|
||||
]
|
||||
},
|
||||
"error": {
|
||||
"code": "InvalidParameterException",
|
||||
"message": "Invalid character(s) in term '@'"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-term-unicode",
|
||||
"request": {
|
||||
"filterPattern": "caf\u00e9",
|
||||
"logEventMessages": [
|
||||
"caf\u00e9",
|
||||
"cafe"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 1,
|
||||
"eventMessage": "caf\u00e9",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-quoted-space",
|
||||
"request": {
|
||||
"filterPattern": "\" \"",
|
||||
"logEventMessages": [
|
||||
"x",
|
||||
"two words",
|
||||
" "
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 2,
|
||||
"eventMessage": "two words",
|
||||
"extractedValues": {}
|
||||
},
|
||||
{
|
||||
"eventNumber": 3,
|
||||
"eventMessage": " ",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-huge-exponent",
|
||||
"request": {
|
||||
"filterPattern": "{ $.a = 1e2147483648 }",
|
||||
"logEventMessages": [
|
||||
"{\"a\":1}",
|
||||
"{\"a\":\"1e2147483648\"}"
|
||||
]
|
||||
},
|
||||
"error": {
|
||||
"code": "InvalidParameterException",
|
||||
"message": "Invalid metric filter pattern"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "boundary-bare-negative",
|
||||
"request": {
|
||||
"filterPattern": "a-b",
|
||||
"logEventMessages": [
|
||||
"a",
|
||||
"b",
|
||||
"a-b",
|
||||
"ab",
|
||||
"a b"
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"matches": [
|
||||
{
|
||||
"eventNumber": 1,
|
||||
"eventMessage": "a",
|
||||
"extractedValues": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"verification": "Verified on Live AWS",
|
||||
"observedDate": "2026-09-16",
|
||||
"region": "eu-west-1",
|
||||
"awsCliVersion": "2.36.45",
|
||||
"description": "Normalized observations from isolated CloudFormation updates of one explicitly named AWS::Logs::MetricFilter. Physical roles replace temporary resource names. No log events or new metric series were published.",
|
||||
"identity": {
|
||||
"Ref": "filter name only",
|
||||
"PhysicalResourceId": "filter name only"
|
||||
},
|
||||
"validReplacement": {
|
||||
"priorDefinition": {"FilterPattern": "ERROR", "MetricValue": "1"},
|
||||
"newDefinition": {"FilterPattern": "WARN", "MetricValue": "2"},
|
||||
"events": [
|
||||
{"physicalRole": "prior", "status": "UPDATE_IN_PROGRESS"},
|
||||
{"physicalRole": "prior", "status": "DELETE_IN_PROGRESS"},
|
||||
{"physicalRole": "prior", "status": "DELETE_COMPLETE"},
|
||||
{"physicalRole": "replacement", "status": "CREATE_IN_PROGRESS"},
|
||||
{"physicalRole": "replacement", "status": "CREATE_COMPLETE"},
|
||||
{"physicalRole": "replacement", "status": "UPDATE_COMPLETE"}
|
||||
],
|
||||
"deletionReason": "Requested update requires the replacement of the existing resource; deleting existing resource, then creating a new one.",
|
||||
"stackStatus": "UPDATE_COMPLETE"
|
||||
},
|
||||
"failedReplacement": {
|
||||
"priorDefinition": {"FilterPattern": "WARN", "MetricValue": "2"},
|
||||
"attemptedDefinition": {"FilterPattern": "{", "MetricValue": "9"},
|
||||
"events": [
|
||||
{"physicalRole": "prior", "status": "UPDATE_IN_PROGRESS"},
|
||||
{"physicalRole": "prior", "status": "DELETE_IN_PROGRESS"},
|
||||
{"physicalRole": "prior", "status": "DELETE_COMPLETE"},
|
||||
{"physicalRole": "attempted", "status": "CREATE_IN_PROGRESS"},
|
||||
{"physicalRole": "attempted", "status": "CREATE_FAILED"},
|
||||
{"physicalRole": "attempted", "status": "UPDATE_FAILED"},
|
||||
{"physicalRole": "attempted", "status": "UPDATE_IN_PROGRESS"},
|
||||
{"physicalRole": "attempted", "status": "DELETE_IN_PROGRESS"},
|
||||
{"physicalRole": "attempted", "status": "DELETE_COMPLETE"},
|
||||
{"physicalRole": "attempted", "desiredDefinitionRole": "prior", "status": "CREATE_IN_PROGRESS"},
|
||||
{"physicalRole": "prior", "status": "CREATE_COMPLETE"},
|
||||
{"physicalRole": "prior", "status": "UPDATE_COMPLETE"}
|
||||
],
|
||||
"stackStatus": "UPDATE_ROLLBACK_COMPLETE",
|
||||
"restoredDefinition": {"FilterPattern": "WARN", "MetricValue": "2"},
|
||||
"priorInstanceWasRecreated": true,
|
||||
"attemptedFilterSurvived": false,
|
||||
"storedTemplateRestored": true,
|
||||
"qualification": "The intermediate rollback CREATE_IN_PROGRESS event retained the attempted physical ID while ResourceProperties already specified the restored definition. Completion carried the prior name. Direct Logs reads and a changed creationTime confirmed recreation."
|
||||
},
|
||||
"retainReplacement": {
|
||||
"policyInstalledBeforeRename": "Retain",
|
||||
"oldFilterSurvived": false,
|
||||
"deleteSkippedEventObserved": false,
|
||||
"emptyFilterListObservedBetweenDeleteAndCreate": true,
|
||||
"finalSurvivorCount": 1,
|
||||
"finalDefinition": {"FilterPattern": "INFO", "MetricValue": "3"},
|
||||
"qualification": "This resource-specific experiment still deleted the old filter before creation despite UpdateReplacePolicy Retain. Do not generalize to other resource types or stack DeletionPolicy."
|
||||
},
|
||||
"notMeasured": [
|
||||
"replacement at the 100-filter limit",
|
||||
"collisions with a filter owned by another stack",
|
||||
"all generated-name and changed-log-group combinations",
|
||||
"all deletion and snapshot policies"
|
||||
],
|
||||
"cleanup": {
|
||||
"verifiedAt": "2026-09-16T10:25:44Z",
|
||||
"stackAbsent": true,
|
||||
"remainingOwnedLogGroups": 0,
|
||||
"newMetricSeriesPublished": 0
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"provenance": {
|
||||
"verification": "Verified on Live AWS",
|
||||
"source": "Signed raw PutMetricFilter request reported by the coordinated AWS research agent",
|
||||
"observationDate": "2026-09-16",
|
||||
"region": "eu-west-1",
|
||||
"endpoint": "https://logs.eu-west-1.amazonaws.com",
|
||||
"reference": "https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutMetricFilter.html",
|
||||
"scope": "Only the observed defaultValue member and response are reproduced. Other request fields and resource identities are omitted. CLI client-side type validation was bypassed."
|
||||
},
|
||||
"requestMember": "metricTransformations[0].defaultValue",
|
||||
"requestValue": "7",
|
||||
"response": {
|
||||
"status": 400,
|
||||
"body": {
|
||||
"__type": "SerializationException",
|
||||
"Message": "STRING_VALUE cannot be converted to Double"
|
||||
}
|
||||
},
|
||||
"positiveControl": {
|
||||
"requestValue": 7,
|
||||
"responseStatus": 200,
|
||||
"responseBody": ""
|
||||
},
|
||||
"unobserved": "Other string contents and null, boolean, object or array defaultValue nodes were not probed by this observation."
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
{
|
||||
"verification": "Verified on Live AWS",
|
||||
"observedDate": "2026-09-16",
|
||||
"region": "eu-west-1",
|
||||
"awsCliVersion": "2.36.45",
|
||||
"description": "Normalized observations from isolated synthetic PutMetricFilter/PutLogEvents/GetMetricStatistics probes. Values are independent AWS results, not emulator-generated expectations.",
|
||||
"period": 60,
|
||||
"observedThrough": "2026-09-16T09:06:51Z",
|
||||
"metricDefaults": {
|
||||
"filterPattern": "ERROR",
|
||||
"metricValue": "3",
|
||||
"defaultValue": 7,
|
||||
"cases": [
|
||||
{
|
||||
"name": "mixed events in one batch",
|
||||
"batches": [["ERROR", "INFO", "ERROR"]],
|
||||
"expected": {"Sum": 13, "SampleCount": 3, "Minimum": 3, "Maximum": 7}
|
||||
},
|
||||
{
|
||||
"name": "hit then miss in separate batches",
|
||||
"batches": [["ERROR"], ["INFO"]],
|
||||
"expected": {"Sum": 10, "SampleCount": 2, "Minimum": 3, "Maximum": 7}
|
||||
},
|
||||
{
|
||||
"name": "miss then hit in separate batches",
|
||||
"batches": [["INFO"], ["ERROR"]],
|
||||
"expected": {"Sum": 10, "SampleCount": 2, "Minimum": 3, "Maximum": 7}
|
||||
}
|
||||
],
|
||||
"qualification": "Each case used one isolated event-time minute. Results converged through repeated reads over approximately 107 seconds. No minute-wide suppression or default deduplication was observed."
|
||||
},
|
||||
"extraction": {
|
||||
"filterPattern": "{ $.probe = \"value\" || $.value = * }",
|
||||
"metricValue": "$.value",
|
||||
"defaultValue": 7,
|
||||
"cases": [
|
||||
{
|
||||
"name": "matching event with missing value",
|
||||
"message": {"probe": "value", "case": "missing"},
|
||||
"expected": {"Sum": 7, "SampleCount": 1}
|
||||
},
|
||||
{
|
||||
"name": "matching event with null value",
|
||||
"message": {"probe": "value", "value": null, "case": "null"},
|
||||
"expected": {"Sum": 7, "SampleCount": 1}
|
||||
},
|
||||
{
|
||||
"name": "matching event with nonnumeric string",
|
||||
"message": {"probe": "value", "value": "not-a-number", "case": "nonnumeric"},
|
||||
"expected": {"datapoints": []}
|
||||
},
|
||||
{
|
||||
"name": "matching numeric control",
|
||||
"message": {"probe": "value", "value": 3, "case": "numeric-control"},
|
||||
"expected": {"Sum": 3, "SampleCount": 1}
|
||||
}
|
||||
],
|
||||
"qualification": "Cases occupied distinct event-time minutes. Matching did not depend on the value field being present. The numeric control succeeded; negative results remained absent through the completed observation window."
|
||||
},
|
||||
"ordinaryDimensions": {
|
||||
"filterPattern": "{ $.probe = \"dimension\" || $.a = * || $.b = * }",
|
||||
"metricValue": "1",
|
||||
"dimensions": {"A": "$.a", "B": "$.b"},
|
||||
"messages": [
|
||||
{"probe": "dimension", "a": "alpha", "b": "beta"},
|
||||
{"probe": "dimension", "a": "alpha"},
|
||||
{"probe": "dimension", "b": "beta"},
|
||||
{"probe": "dimension"}
|
||||
],
|
||||
"expectedSeries": [
|
||||
{"dimensions": {"A": "alpha", "B": "beta"}, "Sum": 1, "SampleCount": 1},
|
||||
{"dimensions": {}, "Sum": 3, "SampleCount": 3}
|
||||
],
|
||||
"absentSeries": [
|
||||
{"dimensions": {"A": "alpha"}},
|
||||
{"dimensions": {"B": "beta"}}
|
||||
],
|
||||
"qualification": "No default configured. All events occupied one minute. ListMetrics confirmed complete and dimensionless series, not partial sets. Null or empty dimension values were not measured."
|
||||
},
|
||||
"systemDimensions": {
|
||||
"filterPattern": "ERROR",
|
||||
"metricValue": "3",
|
||||
"defaultValue": 7,
|
||||
"messages": ["ERROR", "INFO"],
|
||||
"accountTransformerPolicyCount": 0,
|
||||
"groupTransformerConfig": [],
|
||||
"cases": [
|
||||
{
|
||||
"emitSystemFieldDimensions": ["@aws.account"],
|
||||
"expectedSeries": [
|
||||
{"dimensions": {"@aws.account": "<CALLER_ACCOUNT>"}, "Sum": 3, "SampleCount": 1},
|
||||
{"dimensions": {}, "Sum": 7, "SampleCount": 1}
|
||||
]
|
||||
},
|
||||
{
|
||||
"emitSystemFieldDimensions": ["@aws.region"],
|
||||
"expectedSeries": [
|
||||
{"dimensions": {"@aws.region": "eu-west-1"}, "Sum": 3, "SampleCount": 1},
|
||||
{"dimensions": {}, "Sum": 7, "SampleCount": 1}
|
||||
]
|
||||
},
|
||||
{
|
||||
"emitSystemFieldDimensions": ["@aws.account", "@aws.region"],
|
||||
"expectedSeries": [
|
||||
{"dimensions": {"@aws.account": "<CALLER_ACCOUNT>", "@aws.region": "eu-west-1"}, "Sum": 3, "SampleCount": 1},
|
||||
{"dimensions": {}, "Sum": 7, "SampleCount": 1}
|
||||
]
|
||||
}
|
||||
],
|
||||
"qualification": "Regular noncentralized group. Matching events receive requested system dimensions; pattern-nonmatch defaults are dimensionless. This does not measure extraction-fallback defaults or centralized source provenance."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"provenance": {
|
||||
"verification": "Verified on Live AWS",
|
||||
"operation": "PutMetricFilter",
|
||||
"observedFrom": "2026-09-16T12:16:08Z",
|
||||
"observedThrough": "2026-09-16T12:16:10Z",
|
||||
"cleanupVerifiedAt": "2026-09-16T12:16:11Z",
|
||||
"region": "eu-west-1",
|
||||
"endpoint": "https://logs.eu-west-1.amazonaws.com",
|
||||
"source": "Four synthetic validation probes reported by the parent coordinator",
|
||||
"reference": "https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutMetricFilter.html",
|
||||
"normalization": "Only reported filter/metric transformation members and acceptance/error details are retained. Resource names, account identifiers and unrelated request members are omitted. These are not raw HTTP requests or responses.",
|
||||
"publication": "None. Validation only.",
|
||||
"unmeasured": "Dimension wildcard references and literal asterisks inside quoted property names were not probed."
|
||||
},
|
||||
"cases": [
|
||||
{
|
||||
"id": "A-mentioned-scalar",
|
||||
"filterPattern": "{ $.probe = \"yes\" || $.value = * }",
|
||||
"metricValue": "$.value",
|
||||
"defaultValue": 7,
|
||||
"expected": { "accepted": true }
|
||||
},
|
||||
{
|
||||
"id": "B-unmentioned-scalar",
|
||||
"filterPattern": "{ $.probe = \"yes\" }",
|
||||
"metricValue": "$.value",
|
||||
"defaultValue": 7,
|
||||
"expected": { "accepted": true }
|
||||
},
|
||||
{
|
||||
"id": "C-unmentioned-dimension",
|
||||
"filterPattern": "{ $.probe = \"yes\" }",
|
||||
"metricValue": "1",
|
||||
"dimensions": { "A": "$.a" },
|
||||
"expected": { "accepted": true }
|
||||
},
|
||||
{
|
||||
"id": "D-wildcard-metric-value",
|
||||
"filterPattern": "{ $.values[*] = * }",
|
||||
"metricValue": "$.values[*]",
|
||||
"expected": {
|
||||
"accepted": false,
|
||||
"errorCode": "InvalidParameterException",
|
||||
"message": "Invalid metric transformation: metric value $.values[*] must be a valid number"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"comprehend": {
|
||||
"I absolutely love this product!": {
|
||||
"DetectSentiment": {
|
||||
"Sentiment": "POSITIVE",
|
||||
"SentimentScore": {
|
||||
"Positive": 0.98,
|
||||
"Negative": 0.01,
|
||||
"Neutral": 0.01,
|
||||
"Mixed": 0.0
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"textract": {
|
||||
"mock-bucket/invoice.pdf": {
|
||||
"DetectDocumentText": {
|
||||
"DocumentMetadata": { "Pages": 1 },
|
||||
"Blocks": [
|
||||
{
|
||||
"BlockType": "LINE",
|
||||
"Id": "mock-line-1",
|
||||
"Confidence": 99.5,
|
||||
"Text": "Invoice Total: $42.00"
|
||||
}
|
||||
],
|
||||
"DetectDocumentTextModelVersion": "1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"rekognition": {
|
||||
"mock-bucket/cat.jpg": {
|
||||
"DetectLabels": {
|
||||
"Labels": [
|
||||
{ "Name": "Cat", "Confidence": 97.2 },
|
||||
{ "Name": "Animal", "Confidence": 98.1 }
|
||||
],
|
||||
"LabelModelVersion": "1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"translate": {
|
||||
"Hello world": {
|
||||
"TranslateText": {
|
||||
"TranslatedText": "Hola mundo",
|
||||
"SourceLanguageCode": "en",
|
||||
"TargetLanguageCode": "es"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "confirm-sign-up.error.code-mismatch",
|
||||
"capturedAt": "2026-05-16T05:10:20.553Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com",
|
||||
"ConfirmationCode": "000000"
|
||||
},
|
||||
"response": null,
|
||||
"error": {
|
||||
"name": "CodeMismatchException",
|
||||
"message": "Invalid verification code provided, please try again.",
|
||||
"$metadata": {
|
||||
"httpStatusCode": 400,
|
||||
"requestId": "73626b75-683d-4630-99c1-05f736ed86f7"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "forgot-password.unknown-user",
|
||||
"capturedAt": "2026-05-16T05:10:22.859Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com"
|
||||
},
|
||||
"response": null,
|
||||
"error": {
|
||||
"name": "UserNotFoundException",
|
||||
"message": "Username/client id combination not found.",
|
||||
"$metadata": {
|
||||
"httpStatusCode": 400,
|
||||
"requestId": "4587537a-5573-4ef5-90b7-7291133ab18d"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name": "initiate-auth.srp.unknown-user",
|
||||
"capturedAt": "2026-05-16T05:10:23.019Z",
|
||||
"request": {
|
||||
"AuthFlow": "USER_SRP_AUTH",
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"AuthParameters": {
|
||||
"USERNAME": "fixture@example.com",
|
||||
"SRP_A": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
|
||||
}
|
||||
},
|
||||
"response": null,
|
||||
"error": {
|
||||
"name": "UserNotFoundException",
|
||||
"message": "User does not exist.",
|
||||
"$metadata": {
|
||||
"httpStatusCode": 400,
|
||||
"requestId": "c4459718-f2a4-48f8-8377-d56a06828f46"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "resend-confirmation.error.rate-limit",
|
||||
"capturedAt": "2026-05-16T05:10:22.703Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com"
|
||||
},
|
||||
"response": {
|
||||
"CodeDeliveryDetails": {
|
||||
"Destination": "f***@e***",
|
||||
"DeliveryMedium": "EMAIL",
|
||||
"AttributeName": "email"
|
||||
},
|
||||
"$metadata": {
|
||||
"httpStatusCode": 200,
|
||||
"requestId": "845f89fd-de84-46b3-8de3-fa85980d4a8f",
|
||||
"attempts": 1,
|
||||
"totalRetryDelay": 0
|
||||
}
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"name": "resend-confirmation.happy",
|
||||
"capturedAt": "2026-05-16T05:10:21.597Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com"
|
||||
},
|
||||
"response": {
|
||||
"CodeDeliveryDetails": {
|
||||
"Destination": "f***@e***",
|
||||
"DeliveryMedium": "EMAIL",
|
||||
"AttributeName": "email"
|
||||
},
|
||||
"$metadata": {
|
||||
"httpStatusCode": 200,
|
||||
"requestId": "30b85e7f-621c-413c-a294-25393a2964c6",
|
||||
"attempts": 1,
|
||||
"totalRetryDelay": 0
|
||||
}
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"name": "sign-up.error.username-exists",
|
||||
"capturedAt": "2026-05-16T05:10:19.745Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com",
|
||||
"Password": "Fixture1!Aa",
|
||||
"UserAttributes": [
|
||||
{
|
||||
"Name": "email",
|
||||
"Value": "fixture@example.com"
|
||||
},
|
||||
{
|
||||
"Name": "phone_number",
|
||||
"Value": "+5215555555555"
|
||||
},
|
||||
{
|
||||
"Name": "given_name",
|
||||
"Value": "Fixture"
|
||||
},
|
||||
{
|
||||
"Name": "family_name",
|
||||
"Value": "User"
|
||||
}
|
||||
]
|
||||
},
|
||||
"response": null,
|
||||
"error": {
|
||||
"name": "UsernameExistsException",
|
||||
"message": "User already exists",
|
||||
"$metadata": {
|
||||
"httpStatusCode": 400,
|
||||
"requestId": "b3434b0c-42dd-42fc-82a6-995412164d66"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"name": "sign-up.happy",
|
||||
"capturedAt": "2026-05-16T05:10:18.457Z",
|
||||
"request": {
|
||||
"ClientId": "6h89qn2bfglbmvfebq9aaknqk0",
|
||||
"Username": "fixture@example.com",
|
||||
"Password": "Fixture1!Aa",
|
||||
"UserAttributes": [
|
||||
{
|
||||
"Name": "email",
|
||||
"Value": "fixture@example.com"
|
||||
},
|
||||
{
|
||||
"Name": "phone_number",
|
||||
"Value": "+5215555555555"
|
||||
},
|
||||
{
|
||||
"Name": "given_name",
|
||||
"Value": "Fixture"
|
||||
},
|
||||
{
|
||||
"Name": "family_name",
|
||||
"Value": "User"
|
||||
}
|
||||
]
|
||||
},
|
||||
"response": {
|
||||
"UserConfirmed": false,
|
||||
"UserSub": "34c84488-e0e1-70ae-d2ee-991ad1a898c8",
|
||||
"CodeDeliveryDetails": {
|
||||
"Destination": "f***@e***",
|
||||
"DeliveryMedium": "EMAIL",
|
||||
"AttributeName": "email"
|
||||
},
|
||||
"$metadata": {
|
||||
"httpStatusCode": 200,
|
||||
"requestId": "e2953a5e-cd31-49f9-a9e0-fac9c689740d",
|
||||
"attempts": 1,
|
||||
"totalRetryDelay": 0
|
||||
}
|
||||
},
|
||||
"error": null
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"StateMachines": {
|
||||
"sfn-mock-test": {
|
||||
"TestCases": {
|
||||
"HappyPath": { "Call API": "Ok200" },
|
||||
"Throw422": { "Call API": "Throw422" },
|
||||
"RetryOnce": { "Call API": "ThrowThenOk" }
|
||||
}
|
||||
},
|
||||
"sfn-mock-ddb-test": {
|
||||
"TestCases": {
|
||||
"MockedApiRealDdb": { "Call API": "Ok200" }
|
||||
}
|
||||
},
|
||||
"sfn-mock-skip-test": {
|
||||
"TestCases": {
|
||||
"EmptyUnusedResponse": { "Skip": "Empty", "Run": "Ok200" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"MockedResponses": {
|
||||
"Ok200": {
|
||||
"0": { "Return": { "StatusCode": 200, "ResponseBody": { "id": 1 } } }
|
||||
},
|
||||
"Throw422": {
|
||||
"0": { "Throw": { "Error": "ApiGateway.422", "Cause": "Unprocessable" } }
|
||||
},
|
||||
"ThrowThenOk": {
|
||||
"0": { "Throw": { "Error": "ApiGateway.429", "Cause": "Too many requests" } },
|
||||
"1-2": { "Return": { "StatusCode": 200, "ResponseBody": { "retried": true } } }
|
||||
},
|
||||
"Empty": {}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user