ELASTICACHE

AddTagsToResource

valid {
    input.Body.ResourceName == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

AuthorizeCacheSecurityGroupIngress

valid {
    input.Body.CacheSecurityGroupName == STRING
    input.Body.EC2SecurityGroupName == STRING
    input.Body.EC2SecurityGroupOwnerId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

BatchApplyUpdateAction

valid {
    input.Body.ReplicationGroupIds[_] == STRING
    input.Body.CacheClusterIds[_] == STRING
    input.Body.ServiceUpdateName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

BatchStopUpdateAction

valid {
    input.Body.ReplicationGroupIds[_] == STRING
    input.Body.CacheClusterIds[_] == STRING
    input.Body.ServiceUpdateName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CompleteMigration

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.Force == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CopyServerlessCacheSnapshot

valid {
    input.Body.SourceServerlessCacheSnapshotName == STRING
    input.Body.TargetServerlessCacheSnapshotName == STRING
    input.Body.KmsKeyId == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CopySnapshot

valid {
    input.Body.SourceSnapshotName == STRING
    input.Body.TargetSnapshotName == STRING
    input.Body.TargetBucket == STRING
    input.Body.KmsKeyId == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateCacheCluster

enum_AZMode := [ "single-az", "cross-az" ]
enum_DestinationType := [ "cloudwatch-logs", "kinesis-firehose" ]
enum_IpDiscovery := [ "ipv4", "ipv6" ]
enum_LogFormat := [ "text", "json" ]
enum_LogType := [ "slow-log", "engine-log" ]
enum_NetworkType := [ "ipv4", "ipv6", "dual_stack" ]
enum_OutpostMode := [ "single-outpost", "cross-outpost" ]

valid {
    input.Body.CacheClusterId == STRING
    input.Body.ReplicationGroupId == STRING
    input.Body.AZMode == enum_AZMode[_]
    input.Body.PreferredAvailabilityZone == STRING
    input.Body.PreferredAvailabilityZones[_] == STRING
    input.Body.NumCacheNodes == INTEGER
    input.Body.CacheNodeType == STRING
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.CacheParameterGroupName == STRING
    input.Body.CacheSubnetGroupName == STRING
    input.Body.CacheSecurityGroupNames[_] == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.Body.SnapshotArns[_] == STRING
    input.Body.SnapshotName == STRING
    input.Body.PreferredMaintenanceWindow == STRING
    input.Body.Port == INTEGER
    input.Body.NotificationTopicArn == STRING
    input.Body.AutoMinorVersionUpgrade == BOOLEAN
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.SnapshotWindow == STRING
    input.Body.AuthToken == STRING
    input.Body.OutpostMode == enum_OutpostMode[_]
    input.Body.PreferredOutpostArn == STRING
    input.Body.PreferredOutpostArns[_] == STRING
    input.Body.LogDeliveryConfigurations[_].LogType == enum_LogType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationType == enum_DestinationType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.CloudWatchLogsDetails.LogGroup == STRING
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.KinesisFirehoseDetails.DeliveryStream == STRING
    input.Body.LogDeliveryConfigurations[_].LogFormat == enum_LogFormat[_]
    input.Body.LogDeliveryConfigurations[_].Enabled == BOOLEAN
    input.Body.TransitEncryptionEnabled == BOOLEAN
    input.Body.NetworkType == enum_NetworkType[_]
    input.Body.IpDiscovery == enum_IpDiscovery[_]
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateCacheParameterGroup

valid {
    input.Body.CacheParameterGroupName == STRING
    input.Body.CacheParameterGroupFamily == STRING
    input.Body.Description == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateCacheSecurityGroup

valid {
    input.Body.CacheSecurityGroupName == STRING
    input.Body.Description == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateCacheSubnetGroup

valid {
    input.Body.CacheSubnetGroupName == STRING
    input.Body.CacheSubnetGroupDescription == STRING
    input.Body.SubnetIds[_] == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupIdSuffix == STRING
    input.Body.GlobalReplicationGroupDescription == STRING
    input.Body.PrimaryReplicationGroupId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateReplicationGroup

enum_ClusterMode := [ "enabled", "disabled", "compatible" ]
enum_DestinationType := [ "cloudwatch-logs", "kinesis-firehose" ]
enum_IpDiscovery := [ "ipv4", "ipv6" ]
enum_LogFormat := [ "text", "json" ]
enum_LogType := [ "slow-log", "engine-log" ]
enum_NetworkType := [ "ipv4", "ipv6", "dual_stack" ]
enum_TransitEncryptionMode := [ "preferred", "required" ]

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.ReplicationGroupDescription == STRING
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.PrimaryClusterId == STRING
    input.Body.AutomaticFailoverEnabled == BOOLEAN
    input.Body.MultiAZEnabled == BOOLEAN
    input.Body.NumCacheClusters == INTEGER
    input.Body.PreferredCacheClusterAZs[_] == STRING
    input.Body.NumNodeGroups == INTEGER
    input.Body.ReplicasPerNodeGroup == INTEGER
    input.Body.NodeGroupConfiguration[_].NodeGroupId == STRING
    input.Body.NodeGroupConfiguration[_].Slots == STRING
    input.Body.NodeGroupConfiguration[_].ReplicaCount == INTEGER
    input.Body.NodeGroupConfiguration[_].PrimaryAvailabilityZone == STRING
    input.Body.NodeGroupConfiguration[_].ReplicaAvailabilityZones[_] == STRING
    input.Body.NodeGroupConfiguration[_].PrimaryOutpostArn == STRING
    input.Body.NodeGroupConfiguration[_].ReplicaOutpostArns[_] == STRING
    input.Body.CacheNodeType == STRING
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.CacheParameterGroupName == STRING
    input.Body.CacheSubnetGroupName == STRING
    input.Body.CacheSecurityGroupNames[_] == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.Body.SnapshotArns[_] == STRING
    input.Body.SnapshotName == STRING
    input.Body.PreferredMaintenanceWindow == STRING
    input.Body.Port == INTEGER
    input.Body.NotificationTopicArn == STRING
    input.Body.AutoMinorVersionUpgrade == BOOLEAN
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.SnapshotWindow == STRING
    input.Body.AuthToken == STRING
    input.Body.TransitEncryptionEnabled == BOOLEAN
    input.Body.AtRestEncryptionEnabled == BOOLEAN
    input.Body.KmsKeyId == STRING
    input.Body.UserGroupIds[_] == STRING
    input.Body.LogDeliveryConfigurations[_].LogType == enum_LogType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationType == enum_DestinationType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.CloudWatchLogsDetails.LogGroup == STRING
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.KinesisFirehoseDetails.DeliveryStream == STRING
    input.Body.LogDeliveryConfigurations[_].LogFormat == enum_LogFormat[_]
    input.Body.LogDeliveryConfigurations[_].Enabled == BOOLEAN
    input.Body.DataTieringEnabled == BOOLEAN
    input.Body.NetworkType == enum_NetworkType[_]
    input.Body.IpDiscovery == enum_IpDiscovery[_]
    input.Body.TransitEncryptionMode == enum_TransitEncryptionMode[_]
    input.Body.ClusterMode == enum_ClusterMode[_]
    input.Body.ServerlessCacheSnapshotName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateServerlessCache

enum_DataStorageUnit := [ "GB" ]

valid {
    input.Body.ServerlessCacheName == STRING
    input.Body.Description == STRING
    input.Body.Engine == STRING
    input.Body.MajorEngineVersion == STRING
    input.Body.CacheUsageLimits.DataStorage.Maximum == INTEGER
    input.Body.CacheUsageLimits.DataStorage.Minimum == INTEGER
    input.Body.CacheUsageLimits.DataStorage.Unit == enum_DataStorageUnit[_]
    input.Body.CacheUsageLimits.ECPUPerSecond.Maximum == INTEGER
    input.Body.CacheUsageLimits.ECPUPerSecond.Minimum == INTEGER
    input.Body.KmsKeyId == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.SnapshotArnsToRestore[_] == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.Body.UserGroupId == STRING
    input.Body.SubnetIds[_] == STRING
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.DailySnapshotTime == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateServerlessCacheSnapshot

valid {
    input.Body.ServerlessCacheSnapshotName == STRING
    input.Body.ServerlessCacheName == STRING
    input.Body.KmsKeyId == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateSnapshot

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.CacheClusterId == STRING
    input.Body.SnapshotName == STRING
    input.Body.KmsKeyId == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateUser

enum_InputAuthenticationType := [ "password", "no-password-required", "iam" ]

valid {
    input.Body.UserId == STRING
    input.Body.UserName == STRING
    input.Body.Engine == STRING
    input.Body.Passwords[_] == STRING
    input.Body.AccessString == STRING
    input.Body.NoPasswordRequired == BOOLEAN
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.Body.AuthenticationMode.Type == enum_InputAuthenticationType[_]
    input.Body.AuthenticationMode.Passwords[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

CreateUserGroup

valid {
    input.Body.UserGroupId == STRING
    input.Body.Engine == STRING
    input.Body.UserIds[_] == STRING
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DecreaseNodeGroupsInGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.NodeGroupCount == INTEGER
    input.Body.GlobalNodeGroupsToRemove[_] == STRING
    input.Body.GlobalNodeGroupsToRetain[_] == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DecreaseReplicaCount

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.NewReplicaCount == INTEGER
    input.Body.ReplicaConfiguration[_].NodeGroupId == STRING
    input.Body.ReplicaConfiguration[_].NewReplicaCount == INTEGER
    input.Body.ReplicaConfiguration[_].PreferredAvailabilityZones[_] == STRING
    input.Body.ReplicaConfiguration[_].PreferredOutpostArns[_] == STRING
    input.Body.ReplicasToRemove[_] == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteCacheCluster

valid {
    input.Body.CacheClusterId == STRING
    input.Body.FinalSnapshotIdentifier == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteCacheParameterGroup

valid {
    input.Body.CacheParameterGroupName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteCacheSecurityGroup

valid {
    input.Body.CacheSecurityGroupName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteCacheSubnetGroup

valid {
    input.Body.CacheSubnetGroupName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.RetainPrimaryReplicationGroup == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteReplicationGroup

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.RetainPrimaryCluster == BOOLEAN
    input.Body.FinalSnapshotIdentifier == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteServerlessCache

valid {
    input.Body.ServerlessCacheName == STRING
    input.Body.FinalSnapshotName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteServerlessCacheSnapshot

valid {
    input.Body.ServerlessCacheSnapshotName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteSnapshot

valid {
    input.Body.SnapshotName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteUser

valid {
    input.Body.UserId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DeleteUserGroup

valid {
    input.Body.UserGroupId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheClusters

valid {
    input.Body.CacheClusterId == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.Body.ShowCacheNodeInfo == BOOLEAN
    input.Body.ShowCacheClustersNotInReplicationGroups == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheEngineVersions

valid {
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.CacheParameterGroupFamily == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.Body.DefaultOnly == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheParameterGroups

valid {
    input.Body.CacheParameterGroupName == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheParameters

valid {
    input.Body.CacheParameterGroupName == STRING
    input.Body.Source == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheSecurityGroups

valid {
    input.Body.CacheSecurityGroupName == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeCacheSubnetGroups

valid {
    input.Body.CacheSubnetGroupName == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeEngineDefaultParameters

valid {
    input.Body.CacheParameterGroupFamily == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeEvents

enum_SourceType := [ "cache-cluster", "cache-parameter-group", "cache-security-group", "cache-subnet-group", "replication-group", "serverless-cache", "serverless-cache-snapshot", "user", "user-group" ]

valid {
    input.Body.SourceIdentifier == STRING
    input.Body.SourceType == enum_SourceType[_]
    input.Body.StartTime == TIMESTAMP
    input.Body.EndTime == TIMESTAMP
    input.Body.Duration == INTEGER
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeGlobalReplicationGroups

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.Body.ShowMemberInfo == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeReplicationGroups

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeReservedCacheNodes

valid {
    input.Body.ReservedCacheNodeId == STRING
    input.Body.ReservedCacheNodesOfferingId == STRING
    input.Body.CacheNodeType == STRING
    input.Body.Duration == STRING
    input.Body.ProductDescription == STRING
    input.Body.OfferingType == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeReservedCacheNodesOfferings

valid {
    input.Body.ReservedCacheNodesOfferingId == STRING
    input.Body.CacheNodeType == STRING
    input.Body.Duration == STRING
    input.Body.ProductDescription == STRING
    input.Body.OfferingType == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeServerlessCacheSnapshots

valid {
    input.Body.ServerlessCacheName == STRING
    input.Body.ServerlessCacheSnapshotName == STRING
    input.Body.SnapshotType == STRING
    input.Body.NextToken == STRING
    input.Body.MaxResults == INTEGER
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeServerlessCaches

valid {
    input.Body.ServerlessCacheName == STRING
    input.Body.MaxResults == INTEGER
    input.Body.NextToken == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeServiceUpdates

enum_ServiceUpdateStatus := [ "available", "cancelled", "expired" ]

valid {
    input.Body.ServiceUpdateName == STRING
    input.Body.ServiceUpdateStatus[_] == enum_ServiceUpdateStatus[_]
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeSnapshots

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.CacheClusterId == STRING
    input.Body.SnapshotName == STRING
    input.Body.SnapshotSource == STRING
    input.Body.Marker == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.ShowNodeGroupConfig == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeUpdateActions

enum_ServiceUpdateStatus := [ "available", "cancelled", "expired" ]
enum_UpdateActionStatus := [ "not-applied", "waiting-to-start", "in-progress", "stopping", "stopped", "complete", "scheduling", "scheduled", "not-applicable" ]

valid {
    input.Body.ServiceUpdateName == STRING
    input.Body.ReplicationGroupIds[_] == STRING
    input.Body.CacheClusterIds[_] == STRING
    input.Body.Engine == STRING
    input.Body.ServiceUpdateStatus[_] == enum_ServiceUpdateStatus[_]
    input.Body.ServiceUpdateTimeRange.StartTime == TIMESTAMP
    input.Body.ServiceUpdateTimeRange.EndTime == TIMESTAMP
    input.Body.UpdateActionStatus[_] == enum_UpdateActionStatus[_]
    input.Body.ShowNodeLevelUpdateStatus == BOOLEAN
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeUserGroups

valid {
    input.Body.UserGroupId == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DescribeUsers

valid {
    input.Body.Engine == STRING
    input.Body.UserId == STRING
    input.Body.Filters[_].Name == STRING
    input.Body.Filters[_].Values[_] == STRING
    input.Body.MaxRecords == INTEGER
    input.Body.Marker == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

DisassociateGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.ReplicationGroupId == STRING
    input.Body.ReplicationGroupRegion == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ExportServerlessCacheSnapshot

valid {
    input.Body.ServerlessCacheSnapshotName == STRING
    input.Body.S3BucketName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

FailoverGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.PrimaryRegion == STRING
    input.Body.PrimaryReplicationGroupId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

IncreaseNodeGroupsInGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.NodeGroupCount == INTEGER
    input.Body.RegionalConfigurations[_].ReplicationGroupId == STRING
    input.Body.RegionalConfigurations[_].ReplicationGroupRegion == STRING
    input.Body.RegionalConfigurations[_].ReshardingConfiguration[_].NodeGroupId == STRING
    input.Body.RegionalConfigurations[_].ReshardingConfiguration[_].PreferredAvailabilityZones[_] == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

IncreaseReplicaCount

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.NewReplicaCount == INTEGER
    input.Body.ReplicaConfiguration[_].NodeGroupId == STRING
    input.Body.ReplicaConfiguration[_].NewReplicaCount == INTEGER
    input.Body.ReplicaConfiguration[_].PreferredAvailabilityZones[_] == STRING
    input.Body.ReplicaConfiguration[_].PreferredOutpostArns[_] == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ListAllowedNodeTypeModifications

valid {
    input.Body.CacheClusterId == STRING
    input.Body.ReplicationGroupId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ListTagsForResource

valid {
    input.Body.ResourceName == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyCacheCluster

enum_AZMode := [ "single-az", "cross-az" ]
enum_AuthTokenUpdateStrategyType := [ "SET", "ROTATE", "DELETE" ]
enum_DestinationType := [ "cloudwatch-logs", "kinesis-firehose" ]
enum_IpDiscovery := [ "ipv4", "ipv6" ]
enum_LogFormat := [ "text", "json" ]
enum_LogType := [ "slow-log", "engine-log" ]

valid {
    input.Body.CacheClusterId == STRING
    input.Body.NumCacheNodes == INTEGER
    input.Body.CacheNodeIdsToRemove[_] == STRING
    input.Body.AZMode == enum_AZMode[_]
    input.Body.NewAvailabilityZones[_] == STRING
    input.Body.CacheSecurityGroupNames[_] == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.PreferredMaintenanceWindow == STRING
    input.Body.NotificationTopicArn == STRING
    input.Body.CacheParameterGroupName == STRING
    input.Body.NotificationTopicStatus == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.AutoMinorVersionUpgrade == BOOLEAN
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.SnapshotWindow == STRING
    input.Body.CacheNodeType == STRING
    input.Body.AuthToken == STRING
    input.Body.AuthTokenUpdateStrategy == enum_AuthTokenUpdateStrategyType[_]
    input.Body.LogDeliveryConfigurations[_].LogType == enum_LogType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationType == enum_DestinationType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.CloudWatchLogsDetails.LogGroup == STRING
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.KinesisFirehoseDetails.DeliveryStream == STRING
    input.Body.LogDeliveryConfigurations[_].LogFormat == enum_LogFormat[_]
    input.Body.LogDeliveryConfigurations[_].Enabled == BOOLEAN
    input.Body.IpDiscovery == enum_IpDiscovery[_]
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyCacheParameterGroup

valid {
    input.Body.CacheParameterGroupName == STRING
    input.Body.ParameterNameValues[_].ParameterName == STRING
    input.Body.ParameterNameValues[_].ParameterValue == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyCacheSubnetGroup

valid {
    input.Body.CacheSubnetGroupName == STRING
    input.Body.CacheSubnetGroupDescription == STRING
    input.Body.SubnetIds[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.Body.CacheNodeType == STRING
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.CacheParameterGroupName == STRING
    input.Body.GlobalReplicationGroupDescription == STRING
    input.Body.AutomaticFailoverEnabled == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyReplicationGroup

enum_AuthTokenUpdateStrategyType := [ "SET", "ROTATE", "DELETE" ]
enum_ClusterMode := [ "enabled", "disabled", "compatible" ]
enum_DestinationType := [ "cloudwatch-logs", "kinesis-firehose" ]
enum_IpDiscovery := [ "ipv4", "ipv6" ]
enum_LogFormat := [ "text", "json" ]
enum_LogType := [ "slow-log", "engine-log" ]
enum_TransitEncryptionMode := [ "preferred", "required" ]

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.ReplicationGroupDescription == STRING
    input.Body.PrimaryClusterId == STRING
    input.Body.SnapshottingClusterId == STRING
    input.Body.AutomaticFailoverEnabled == BOOLEAN
    input.Body.MultiAZEnabled == BOOLEAN
    input.Body.NodeGroupId == STRING
    input.Body.CacheSecurityGroupNames[_] == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.PreferredMaintenanceWindow == STRING
    input.Body.NotificationTopicArn == STRING
    input.Body.CacheParameterGroupName == STRING
    input.Body.NotificationTopicStatus == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.Body.Engine == STRING
    input.Body.EngineVersion == STRING
    input.Body.AutoMinorVersionUpgrade == BOOLEAN
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.SnapshotWindow == STRING
    input.Body.CacheNodeType == STRING
    input.Body.AuthToken == STRING
    input.Body.AuthTokenUpdateStrategy == enum_AuthTokenUpdateStrategyType[_]
    input.Body.UserGroupIdsToAdd[_] == STRING
    input.Body.UserGroupIdsToRemove[_] == STRING
    input.Body.RemoveUserGroups == BOOLEAN
    input.Body.LogDeliveryConfigurations[_].LogType == enum_LogType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationType == enum_DestinationType[_]
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.CloudWatchLogsDetails.LogGroup == STRING
    input.Body.LogDeliveryConfigurations[_].DestinationDetails.KinesisFirehoseDetails.DeliveryStream == STRING
    input.Body.LogDeliveryConfigurations[_].LogFormat == enum_LogFormat[_]
    input.Body.LogDeliveryConfigurations[_].Enabled == BOOLEAN
    input.Body.IpDiscovery == enum_IpDiscovery[_]
    input.Body.TransitEncryptionEnabled == BOOLEAN
    input.Body.TransitEncryptionMode == enum_TransitEncryptionMode[_]
    input.Body.ClusterMode == enum_ClusterMode[_]
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyReplicationGroupShardConfiguration

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.NodeGroupCount == INTEGER
    input.Body.ApplyImmediately == BOOLEAN
    input.Body.ReshardingConfiguration[_].NodeGroupId == STRING
    input.Body.ReshardingConfiguration[_].PreferredAvailabilityZones[_] == STRING
    input.Body.NodeGroupsToRemove[_] == STRING
    input.Body.NodeGroupsToRetain[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyServerlessCache

enum_DataStorageUnit := [ "GB" ]

valid {
    input.Body.ServerlessCacheName == STRING
    input.Body.Description == STRING
    input.Body.CacheUsageLimits.DataStorage.Maximum == INTEGER
    input.Body.CacheUsageLimits.DataStorage.Minimum == INTEGER
    input.Body.CacheUsageLimits.DataStorage.Unit == enum_DataStorageUnit[_]
    input.Body.CacheUsageLimits.ECPUPerSecond.Maximum == INTEGER
    input.Body.CacheUsageLimits.ECPUPerSecond.Minimum == INTEGER
    input.Body.RemoveUserGroup == BOOLEAN
    input.Body.UserGroupId == STRING
    input.Body.SecurityGroupIds[_] == STRING
    input.Body.SnapshotRetentionLimit == INTEGER
    input.Body.DailySnapshotTime == STRING
    input.Body.Engine == STRING
    input.Body.MajorEngineVersion == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyUser

enum_InputAuthenticationType := [ "password", "no-password-required", "iam" ]

valid {
    input.Body.UserId == STRING
    input.Body.AccessString == STRING
    input.Body.AppendAccessString == STRING
    input.Body.Passwords[_] == STRING
    input.Body.NoPasswordRequired == BOOLEAN
    input.Body.AuthenticationMode.Type == enum_InputAuthenticationType[_]
    input.Body.AuthenticationMode.Passwords[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ModifyUserGroup

valid {
    input.Body.UserGroupId == STRING
    input.Body.UserIdsToAdd[_] == STRING
    input.Body.UserIdsToRemove[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

PurchaseReservedCacheNodesOffering

valid {
    input.Body.ReservedCacheNodesOfferingId == STRING
    input.Body.ReservedCacheNodeId == STRING
    input.Body.CacheNodeCount == INTEGER
    input.Body.Tags[_].Key == STRING
    input.Body.Tags[_].Value == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

RebalanceSlotsInGlobalReplicationGroup

valid {
    input.Body.GlobalReplicationGroupId == STRING
    input.Body.ApplyImmediately == BOOLEAN
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

RebootCacheCluster

valid {
    input.Body.CacheClusterId == STRING
    input.Body.CacheNodeIdsToReboot[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

RemoveTagsFromResource

valid {
    input.Body.ResourceName == STRING
    input.Body.TagKeys[_] == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

ResetCacheParameterGroup

valid {
    input.Body.CacheParameterGroupName == STRING
    input.Body.ResetAllParameters == BOOLEAN
    input.Body.ParameterNameValues[_].ParameterName == STRING
    input.Body.ParameterNameValues[_].ParameterValue == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

RevokeCacheSecurityGroupIngress

valid {
    input.Body.CacheSecurityGroupName == STRING
    input.Body.EC2SecurityGroupName == STRING
    input.Body.EC2SecurityGroupOwnerId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

StartMigration

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.CustomerNodeEndpointList[_].Address == STRING
    input.Body.CustomerNodeEndpointList[_].Port == INTEGER
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

TestFailover

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.NodeGroupId == STRING
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}

TestMigration

valid {
    input.Body.ReplicationGroupId == STRING
    input.Body.CustomerNodeEndpointList[_].Address == STRING
    input.Body.CustomerNodeEndpointList[_].Port == INTEGER
    input.ProviderMetadata.Account == STRING
    input.ProviderMetadata.AccessKeyId == STRING
    input.ProviderMetadata.Region == STRING
}