// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/swift-aws/aws-sdk-swift/blob/master/CodeGenerator/Sources/CodeGenerator/main.swift. DO NOT EDIT.

import Foundation
import AWSSDKSwiftCore

extension DAX {

    public enum ChangeType: String, CustomStringConvertible, Codable {
        case immediate = "IMMEDIATE"
        case requiresReboot = "REQUIRES_REBOOT"
        public var description: String { return self.rawValue }
    }

    public struct Cluster: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ActiveNodes", required: false, type: .integer), 
            AWSShapeMember(label: "ClusterArn", required: false, type: .string), 
            AWSShapeMember(label: "ClusterDiscoveryEndpoint", required: false, type: .structure), 
            AWSShapeMember(label: "ClusterName", required: false, type: .string), 
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "IamRoleArn", required: false, type: .string), 
            AWSShapeMember(label: "NodeIdsToRemove", required: false, type: .list), 
            AWSShapeMember(label: "Nodes", required: false, type: .list), 
            AWSShapeMember(label: "NodeType", required: false, type: .string), 
            AWSShapeMember(label: "NotificationConfiguration", required: false, type: .structure), 
            AWSShapeMember(label: "ParameterGroup", required: false, type: .structure), 
            AWSShapeMember(label: "PreferredMaintenanceWindow", required: false, type: .string), 
            AWSShapeMember(label: "SecurityGroups", required: false, type: .list), 
            AWSShapeMember(label: "SSEDescription", required: false, type: .structure), 
            AWSShapeMember(label: "Status", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroup", required: false, type: .string), 
            AWSShapeMember(label: "TotalNodes", required: false, type: .integer)
        ]

        /// The number of nodes in the cluster that are active (i.e., capable of serving requests).
        public let activeNodes: Int?
        /// The Amazon Resource Name (ARN) that uniquely identifies the cluster. 
        public let clusterArn: String?
        /// The configuration endpoint for this DAX cluster, consisting of a DNS name and a port number. Client applications can specify this endpoint, rather than an individual node endpoint, and allow the DAX client software to intelligently route requests and responses to nodes in the DAX cluster.
        public let clusterDiscoveryEndpoint: Endpoint?
        /// The name of the DAX cluster.
        public let clusterName: String?
        /// The description of the cluster.
        public let description: String?
        /// A valid Amazon Resource Name (ARN) that identifies an IAM role. At runtime, DAX will assume this role and use the role's permissions to access DynamoDB on your behalf.
        public let iamRoleArn: String?
        /// A list of nodes to be removed from the cluster.
        public let nodeIdsToRemove: [String]?
        /// A list of nodes that are currently in the cluster.
        public let nodes: [Node]?
        /// The node type for the nodes in the cluster. (All nodes in a DAX cluster are of the same type.)
        public let nodeType: String?
        /// Describes a notification topic and its status. Notification topics are used for publishing DAX events to subscribers using Amazon Simple Notification Service (SNS).
        public let notificationConfiguration: NotificationConfiguration?
        /// The parameter group being used by nodes in the cluster.
        public let parameterGroup: ParameterGroupStatus?
        /// A range of time when maintenance of DAX cluster software will be performed. For example: sun:01:00-sun:09:00. Cluster maintenance normally takes less than 30 minutes, and is performed automatically within the maintenance window.
        public let preferredMaintenanceWindow: String?
        /// A list of security groups, and the status of each, for the nodes in the cluster.
        public let securityGroups: [SecurityGroupMembership]?
        /// The description of the server-side encryption status on the specified DAX cluster.
        public let sSEDescription: SSEDescription?
        /// The current status of the cluster.
        public let status: String?
        /// The subnet group where the DAX cluster is running.
        public let subnetGroup: String?
        /// The total number of nodes in the cluster.
        public let totalNodes: Int?

        public init(activeNodes: Int? = nil, clusterArn: String? = nil, clusterDiscoveryEndpoint: Endpoint? = nil, clusterName: String? = nil, description: String? = nil, iamRoleArn: String? = nil, nodeIdsToRemove: [String]? = nil, nodes: [Node]? = nil, nodeType: String? = nil, notificationConfiguration: NotificationConfiguration? = nil, parameterGroup: ParameterGroupStatus? = nil, preferredMaintenanceWindow: String? = nil, securityGroups: [SecurityGroupMembership]? = nil, sSEDescription: SSEDescription? = nil, status: String? = nil, subnetGroup: String? = nil, totalNodes: Int? = nil) {
            self.activeNodes = activeNodes
            self.clusterArn = clusterArn
            self.clusterDiscoveryEndpoint = clusterDiscoveryEndpoint
            self.clusterName = clusterName
            self.description = description
            self.iamRoleArn = iamRoleArn
            self.nodeIdsToRemove = nodeIdsToRemove
            self.nodes = nodes
            self.nodeType = nodeType
            self.notificationConfiguration = notificationConfiguration
            self.parameterGroup = parameterGroup
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.securityGroups = securityGroups
            self.sSEDescription = sSEDescription
            self.status = status
            self.subnetGroup = subnetGroup
            self.totalNodes = totalNodes
        }

        private enum CodingKeys: String, CodingKey {
            case activeNodes = "ActiveNodes"
            case clusterArn = "ClusterArn"
            case clusterDiscoveryEndpoint = "ClusterDiscoveryEndpoint"
            case clusterName = "ClusterName"
            case description = "Description"
            case iamRoleArn = "IamRoleArn"
            case nodeIdsToRemove = "NodeIdsToRemove"
            case nodes = "Nodes"
            case nodeType = "NodeType"
            case notificationConfiguration = "NotificationConfiguration"
            case parameterGroup = "ParameterGroup"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case securityGroups = "SecurityGroups"
            case sSEDescription = "SSEDescription"
            case status = "Status"
            case subnetGroup = "SubnetGroup"
            case totalNodes = "TotalNodes"
        }
    }

    public struct CreateClusterRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "AvailabilityZones", required: false, type: .list), 
            AWSShapeMember(label: "ClusterName", required: true, type: .string), 
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "IamRoleArn", required: true, type: .string), 
            AWSShapeMember(label: "NodeType", required: true, type: .string), 
            AWSShapeMember(label: "NotificationTopicArn", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: false, type: .string), 
            AWSShapeMember(label: "PreferredMaintenanceWindow", required: false, type: .string), 
            AWSShapeMember(label: "ReplicationFactor", required: true, type: .integer), 
            AWSShapeMember(label: "SecurityGroupIds", required: false, type: .list), 
            AWSShapeMember(label: "SSESpecification", required: false, type: .structure), 
            AWSShapeMember(label: "SubnetGroupName", required: false, type: .string), 
            AWSShapeMember(label: "Tags", required: false, type: .list)
        ]

        /// The Availability Zones (AZs) in which the cluster nodes will be created. All nodes belonging to the cluster are placed in these Availability Zones. Use this parameter if you want to distribute the nodes across multiple AZs.
        public let availabilityZones: [String]?
        /// The cluster identifier. This parameter is stored as a lowercase string.  Constraints:    A name must contain from 1 to 20 alphanumeric characters or hyphens.   The first character must be a letter.   A name cannot end with a hyphen or contain two consecutive hyphens.  
        public let clusterName: String
        /// A description of the cluster.
        public let description: String?
        /// A valid Amazon Resource Name (ARN) that identifies an IAM role. At runtime, DAX will assume this role and use the role's permissions to access DynamoDB on your behalf.
        public let iamRoleArn: String
        /// The compute and memory capacity of the nodes in the cluster.
        public let nodeType: String
        /// The Amazon Resource Name (ARN) of the Amazon SNS topic to which notifications will be sent.  The Amazon SNS topic owner must be same as the DAX cluster owner. 
        public let notificationTopicArn: String?
        /// The parameter group to be associated with the DAX cluster.
        public let parameterGroupName: String?
        /// Specifies the weekly time range during which maintenance on the DAX cluster is performed. It is specified as a range in the format ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum maintenance window is a 60 minute period. Valid values for ddd are:    sun     mon     tue     wed     thu     fri     sat    Example: sun:05:00-sun:09:00   If you don't specify a preferred maintenance window when you create or modify a cache cluster, DAX assigns a 60-minute maintenance window on a randomly selected day of the week. 
        public let preferredMaintenanceWindow: String?
        /// The number of nodes in the DAX cluster. A replication factor of 1 will create a single-node cluster, without any read replicas. For additional fault tolerance, you can create a multiple node cluster with one or more read replicas. To do this, set ReplicationFactor to 2 or more.  AWS recommends that you have at least two read replicas per cluster. 
        public let replicationFactor: Int
        /// A list of security group IDs to be assigned to each node in the DAX cluster. (Each of the security group ID is system-generated.) If this parameter is not specified, DAX assigns the default VPC security group to each node.
        public let securityGroupIds: [String]?
        /// Represents the settings used to enable server-side encryption on the cluster.
        public let sSESpecification: SSESpecification?
        /// The name of the subnet group to be used for the replication group.  DAX clusters can only run in an Amazon VPC environment. All of the subnets that you specify in a subnet group must exist in the same VPC. 
        public let subnetGroupName: String?
        /// A set of tags to associate with the DAX cluster. 
        public let tags: [Tag]?

        public init(availabilityZones: [String]? = nil, clusterName: String, description: String? = nil, iamRoleArn: String, nodeType: String, notificationTopicArn: String? = nil, parameterGroupName: String? = nil, preferredMaintenanceWindow: String? = nil, replicationFactor: Int, securityGroupIds: [String]? = nil, sSESpecification: SSESpecification? = nil, subnetGroupName: String? = nil, tags: [Tag]? = nil) {
            self.availabilityZones = availabilityZones
            self.clusterName = clusterName
            self.description = description
            self.iamRoleArn = iamRoleArn
            self.nodeType = nodeType
            self.notificationTopicArn = notificationTopicArn
            self.parameterGroupName = parameterGroupName
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.replicationFactor = replicationFactor
            self.securityGroupIds = securityGroupIds
            self.sSESpecification = sSESpecification
            self.subnetGroupName = subnetGroupName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case clusterName = "ClusterName"
            case description = "Description"
            case iamRoleArn = "IamRoleArn"
            case nodeType = "NodeType"
            case notificationTopicArn = "NotificationTopicArn"
            case parameterGroupName = "ParameterGroupName"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case replicationFactor = "ReplicationFactor"
            case securityGroupIds = "SecurityGroupIds"
            case sSESpecification = "SSESpecification"
            case subnetGroupName = "SubnetGroupName"
            case tags = "Tags"
        }
    }

    public struct CreateClusterResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster that you have created.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public struct CreateParameterGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: true, type: .string)
        ]

        /// A description of the parameter group.
        public let description: String?
        /// The name of the parameter group to apply to all of the clusters in this replication group.
        public let parameterGroupName: String

        public init(description: String? = nil, parameterGroupName: String) {
            self.description = description
            self.parameterGroupName = parameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case parameterGroupName = "ParameterGroupName"
        }
    }

    public struct CreateParameterGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ParameterGroup", required: false, type: .structure)
        ]

        /// Represents the output of a CreateParameterGroup action.
        public let parameterGroup: ParameterGroup?

        public init(parameterGroup: ParameterGroup? = nil) {
            self.parameterGroup = parameterGroup
        }

        private enum CodingKeys: String, CodingKey {
            case parameterGroup = "ParameterGroup"
        }
    }

    public struct CreateSubnetGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroupName", required: true, type: .string), 
            AWSShapeMember(label: "SubnetIds", required: true, type: .list)
        ]

        /// A description for the subnet group
        public let description: String?
        /// A name for the subnet group. This value is stored as a lowercase string. 
        public let subnetGroupName: String
        /// A list of VPC subnet IDs for the subnet group.
        public let subnetIds: [String]

        public init(description: String? = nil, subnetGroupName: String, subnetIds: [String]) {
            self.description = description
            self.subnetGroupName = subnetGroupName
            self.subnetIds = subnetIds
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case subnetGroupName = "SubnetGroupName"
            case subnetIds = "SubnetIds"
        }
    }

    public struct CreateSubnetGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "SubnetGroup", required: false, type: .structure)
        ]

        /// Represents the output of a CreateSubnetGroup operation.
        public let subnetGroup: SubnetGroup?

        public init(subnetGroup: SubnetGroup? = nil) {
            self.subnetGroup = subnetGroup
        }

        private enum CodingKeys: String, CodingKey {
            case subnetGroup = "SubnetGroup"
        }
    }

    public struct DecreaseReplicationFactorRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "AvailabilityZones", required: false, type: .list), 
            AWSShapeMember(label: "ClusterName", required: true, type: .string), 
            AWSShapeMember(label: "NewReplicationFactor", required: true, type: .integer), 
            AWSShapeMember(label: "NodeIdsToRemove", required: false, type: .list)
        ]

        /// The Availability Zone(s) from which to remove nodes.
        public let availabilityZones: [String]?
        /// The name of the DAX cluster from which you want to remove nodes.
        public let clusterName: String
        /// The new number of nodes for the DAX cluster.
        public let newReplicationFactor: Int
        /// The unique identifiers of the nodes to be removed from the cluster.
        public let nodeIdsToRemove: [String]?

        public init(availabilityZones: [String]? = nil, clusterName: String, newReplicationFactor: Int, nodeIdsToRemove: [String]? = nil) {
            self.availabilityZones = availabilityZones
            self.clusterName = clusterName
            self.newReplicationFactor = newReplicationFactor
            self.nodeIdsToRemove = nodeIdsToRemove
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case clusterName = "ClusterName"
            case newReplicationFactor = "NewReplicationFactor"
            case nodeIdsToRemove = "NodeIdsToRemove"
        }
    }

    public struct DecreaseReplicationFactorResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster, after you have decreased its replication factor.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public struct DeleteClusterRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ClusterName", required: true, type: .string)
        ]

        /// The name of the cluster to be deleted.
        public let clusterName: String

        public init(clusterName: String) {
            self.clusterName = clusterName
        }

        private enum CodingKeys: String, CodingKey {
            case clusterName = "ClusterName"
        }
    }

    public struct DeleteClusterResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster that is being deleted.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public struct DeleteParameterGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ParameterGroupName", required: true, type: .string)
        ]

        /// The name of the parameter group to delete.
        public let parameterGroupName: String

        public init(parameterGroupName: String) {
            self.parameterGroupName = parameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case parameterGroupName = "ParameterGroupName"
        }
    }

    public struct DeleteParameterGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "DeletionMessage", required: false, type: .string)
        ]

        /// A user-specified message for this action (i.e., a reason for deleting the parameter group).
        public let deletionMessage: String?

        public init(deletionMessage: String? = nil) {
            self.deletionMessage = deletionMessage
        }

        private enum CodingKeys: String, CodingKey {
            case deletionMessage = "DeletionMessage"
        }
    }

    public struct DeleteSubnetGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "SubnetGroupName", required: true, type: .string)
        ]

        /// The name of the subnet group to delete.
        public let subnetGroupName: String

        public init(subnetGroupName: String) {
            self.subnetGroupName = subnetGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case subnetGroupName = "SubnetGroupName"
        }
    }

    public struct DeleteSubnetGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "DeletionMessage", required: false, type: .string)
        ]

        /// A user-specified message for this action (i.e., a reason for deleting the subnet group).
        public let deletionMessage: String?

        public init(deletionMessage: String? = nil) {
            self.deletionMessage = deletionMessage
        }

        private enum CodingKeys: String, CodingKey {
            case deletionMessage = "DeletionMessage"
        }
    }

    public struct DescribeClustersRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ClusterNames", required: false, type: .list), 
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string)
        ]

        /// The names of the DAX clusters being described.
        public let clusterNames: [String]?
        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?

        public init(clusterNames: [String]? = nil, maxResults: Int? = nil, nextToken: String? = nil) {
            self.clusterNames = clusterNames
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case clusterNames = "ClusterNames"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeClustersResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Clusters", required: false, type: .list), 
            AWSShapeMember(label: "NextToken", required: false, type: .string)
        ]

        /// The descriptions of your DAX clusters, in response to a DescribeClusters request.
        public let clusters: [Cluster]?
        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?

        public init(clusters: [Cluster]? = nil, nextToken: String? = nil) {
            self.clusters = clusters
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case clusters = "Clusters"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeDefaultParametersRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string)
        ]

        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeDefaultParametersResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "Parameters", required: false, type: .list)
        ]

        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?
        /// A list of parameters. Each element in the list represents one parameter.
        public let parameters: [Parameter]?

        public init(nextToken: String? = nil, parameters: [Parameter]? = nil) {
            self.nextToken = nextToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameters = "Parameters"
        }
    }

    public struct DescribeEventsRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Duration", required: false, type: .integer), 
            AWSShapeMember(label: "EndTime", required: false, type: .timestamp), 
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "SourceName", required: false, type: .string), 
            AWSShapeMember(label: "SourceType", required: false, type: .enum), 
            AWSShapeMember(label: "StartTime", required: false, type: .timestamp)
        ]

        /// The number of minutes' worth of events to retrieve.
        public let duration: Int?
        /// The end of the time interval for which to retrieve events, specified in ISO 8601 format.
        public let endTime: TimeStamp?
        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?
        /// The identifier of the event source for which events will be returned. If not specified, then all sources are included in the response.
        public let sourceName: String?
        /// The event source to retrieve events for. If no value is specified, all events are returned.
        public let sourceType: SourceType?
        /// The beginning of the time interval to retrieve events for, specified in ISO 8601 format.
        public let startTime: TimeStamp?

        public init(duration: Int? = nil, endTime: TimeStamp? = nil, maxResults: Int? = nil, nextToken: String? = nil, sourceName: String? = nil, sourceType: SourceType? = nil, startTime: TimeStamp? = nil) {
            self.duration = duration
            self.endTime = endTime
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sourceName = sourceName
            self.sourceType = sourceType
            self.startTime = startTime
        }

        private enum CodingKeys: String, CodingKey {
            case duration = "Duration"
            case endTime = "EndTime"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sourceName = "SourceName"
            case sourceType = "SourceType"
            case startTime = "StartTime"
        }
    }

    public struct DescribeEventsResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Events", required: false, type: .list), 
            AWSShapeMember(label: "NextToken", required: false, type: .string)
        ]

        /// An array of events. Each element in the array represents one event.
        public let events: [Event]?
        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?

        public init(events: [Event]? = nil, nextToken: String? = nil) {
            self.events = events
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case events = "Events"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeParameterGroupsRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupNames", required: false, type: .list)
        ]

        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?
        /// The names of the parameter groups.
        public let parameterGroupNames: [String]?

        public init(maxResults: Int? = nil, nextToken: String? = nil, parameterGroupNames: [String]? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.parameterGroupNames = parameterGroupNames
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case parameterGroupNames = "ParameterGroupNames"
        }
    }

    public struct DescribeParameterGroupsResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroups", required: false, type: .list)
        ]

        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?
        /// An array of parameter groups. Each element in the array represents one parameter group.
        public let parameterGroups: [ParameterGroup]?

        public init(nextToken: String? = nil, parameterGroups: [ParameterGroup]? = nil) {
            self.nextToken = nextToken
            self.parameterGroups = parameterGroups
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameterGroups = "ParameterGroups"
        }
    }

    public struct DescribeParametersRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: true, type: .string), 
            AWSShapeMember(label: "Source", required: false, type: .string)
        ]

        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?
        /// The name of the parameter group.
        public let parameterGroupName: String
        /// How the parameter is defined. For example, system denotes a system-defined parameter.
        public let source: String?

        public init(maxResults: Int? = nil, nextToken: String? = nil, parameterGroupName: String, source: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.parameterGroupName = parameterGroupName
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case parameterGroupName = "ParameterGroupName"
            case source = "Source"
        }
    }

    public struct DescribeParametersResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "Parameters", required: false, type: .list)
        ]

        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?
        /// A list of parameters within a parameter group. Each element in the list represents one parameter.
        public let parameters: [Parameter]?

        public init(nextToken: String? = nil, parameters: [Parameter]? = nil) {
            self.nextToken = nextToken
            self.parameters = parameters
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case parameters = "Parameters"
        }
    }

    public struct DescribeSubnetGroupsRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "MaxResults", required: false, type: .integer), 
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroupNames", required: false, type: .list)
        ]

        /// The maximum number of results to include in the response. If more results exist than the specified MaxResults value, a token is included in the response so that the remaining results can be retrieved. The value for MaxResults must be between 20 and 100.
        public let maxResults: Int?
        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token, up to the value specified by MaxResults.
        public let nextToken: String?
        /// The name of the subnet group.
        public let subnetGroupNames: [String]?

        public init(maxResults: Int? = nil, nextToken: String? = nil, subnetGroupNames: [String]? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.subnetGroupNames = subnetGroupNames
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case subnetGroupNames = "SubnetGroupNames"
        }
    }

    public struct DescribeSubnetGroupsResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroups", required: false, type: .list)
        ]

        /// Provides an identifier to allow retrieval of paginated results.
        public let nextToken: String?
        /// An array of subnet groups. Each element in the array represents a single subnet group.
        public let subnetGroups: [SubnetGroup]?

        public init(nextToken: String? = nil, subnetGroups: [SubnetGroup]? = nil) {
            self.nextToken = nextToken
            self.subnetGroups = subnetGroups
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case subnetGroups = "SubnetGroups"
        }
    }

    public struct Endpoint: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Address", required: false, type: .string), 
            AWSShapeMember(label: "Port", required: false, type: .integer)
        ]

        /// The DNS hostname of the endpoint.
        public let address: String?
        /// The port number that applications should use to connect to the endpoint.
        public let port: Int?

        public init(address: String? = nil, port: Int? = nil) {
            self.address = address
            self.port = port
        }

        private enum CodingKeys: String, CodingKey {
            case address = "Address"
            case port = "Port"
        }
    }

    public struct Event: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Date", required: false, type: .timestamp), 
            AWSShapeMember(label: "Message", required: false, type: .string), 
            AWSShapeMember(label: "SourceName", required: false, type: .string), 
            AWSShapeMember(label: "SourceType", required: false, type: .enum)
        ]

        /// The date and time when the event occurred.
        public let date: TimeStamp?
        /// A user-defined message associated with the event.
        public let message: String?
        /// The source of the event. For example, if the event occurred at the node level, the source would be the node ID.
        public let sourceName: String?
        /// Specifies the origin of this event - a cluster, a parameter group, a node ID, etc.
        public let sourceType: SourceType?

        public init(date: TimeStamp? = nil, message: String? = nil, sourceName: String? = nil, sourceType: SourceType? = nil) {
            self.date = date
            self.message = message
            self.sourceName = sourceName
            self.sourceType = sourceType
        }

        private enum CodingKeys: String, CodingKey {
            case date = "Date"
            case message = "Message"
            case sourceName = "SourceName"
            case sourceType = "SourceType"
        }
    }

    public struct IncreaseReplicationFactorRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "AvailabilityZones", required: false, type: .list), 
            AWSShapeMember(label: "ClusterName", required: true, type: .string), 
            AWSShapeMember(label: "NewReplicationFactor", required: true, type: .integer)
        ]

        /// The Availability Zones (AZs) in which the cluster nodes will be created. All nodes belonging to the cluster are placed in these Availability Zones. Use this parameter if you want to distribute the nodes across multiple AZs.
        public let availabilityZones: [String]?
        /// The name of the DAX cluster that will receive additional nodes.
        public let clusterName: String
        /// The new number of nodes for the DAX cluster.
        public let newReplicationFactor: Int

        public init(availabilityZones: [String]? = nil, clusterName: String, newReplicationFactor: Int) {
            self.availabilityZones = availabilityZones
            self.clusterName = clusterName
            self.newReplicationFactor = newReplicationFactor
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZones = "AvailabilityZones"
            case clusterName = "ClusterName"
            case newReplicationFactor = "NewReplicationFactor"
        }
    }

    public struct IncreaseReplicationFactorResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster. with its new replication factor.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public enum IsModifiable: String, CustomStringConvertible, Codable {
        case `true` = "TRUE"
        case `false` = "FALSE"
        case conditional = "CONDITIONAL"
        public var description: String { return self.rawValue }
    }

    public struct ListTagsRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "ResourceName", required: true, type: .string)
        ]

        /// An optional token returned from a prior request. Use this token for pagination of results from this action. If this parameter is specified, the response includes only results beyond the token.
        public let nextToken: String?
        /// The name of the DAX resource to which the tags belong.
        public let resourceName: String

        public init(nextToken: String? = nil, resourceName: String) {
            self.nextToken = nextToken
            self.resourceName = resourceName
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case resourceName = "ResourceName"
        }
    }

    public struct ListTagsResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NextToken", required: false, type: .string), 
            AWSShapeMember(label: "Tags", required: false, type: .list)
        ]

        /// If this value is present, there are additional results to be displayed. To retrieve them, call ListTags again, with NextToken set to this value.
        public let nextToken: String?
        /// A list of tags currently associated with the DAX cluster.
        public let tags: [Tag]?

        public init(nextToken: String? = nil, tags: [Tag]? = nil) {
            self.nextToken = nextToken
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case tags = "Tags"
        }
    }

    public struct Node: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "AvailabilityZone", required: false, type: .string), 
            AWSShapeMember(label: "Endpoint", required: false, type: .structure), 
            AWSShapeMember(label: "NodeCreateTime", required: false, type: .timestamp), 
            AWSShapeMember(label: "NodeId", required: false, type: .string), 
            AWSShapeMember(label: "NodeStatus", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupStatus", required: false, type: .string)
        ]

        /// The Availability Zone (AZ) in which the node has been deployed.
        public let availabilityZone: String?
        /// The endpoint for the node, consisting of a DNS name and a port number. Client applications can connect directly to a node endpoint, if desired (as an alternative to allowing DAX client software to intelligently route requests and responses to nodes in the DAX cluster.
        public let endpoint: Endpoint?
        /// The date and time (in UNIX epoch format) when the node was launched.
        public let nodeCreateTime: TimeStamp?
        /// A system-generated identifier for the node.
        public let nodeId: String?
        /// The current status of the node. For example: available.
        public let nodeStatus: String?
        /// The status of the parameter group associated with this node. For example, in-sync.
        public let parameterGroupStatus: String?

        public init(availabilityZone: String? = nil, endpoint: Endpoint? = nil, nodeCreateTime: TimeStamp? = nil, nodeId: String? = nil, nodeStatus: String? = nil, parameterGroupStatus: String? = nil) {
            self.availabilityZone = availabilityZone
            self.endpoint = endpoint
            self.nodeCreateTime = nodeCreateTime
            self.nodeId = nodeId
            self.nodeStatus = nodeStatus
            self.parameterGroupStatus = parameterGroupStatus
        }

        private enum CodingKeys: String, CodingKey {
            case availabilityZone = "AvailabilityZone"
            case endpoint = "Endpoint"
            case nodeCreateTime = "NodeCreateTime"
            case nodeId = "NodeId"
            case nodeStatus = "NodeStatus"
            case parameterGroupStatus = "ParameterGroupStatus"
        }
    }

    public struct NodeTypeSpecificValue: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NodeType", required: false, type: .string), 
            AWSShapeMember(label: "Value", required: false, type: .string)
        ]

        /// A node type to which the parameter value applies.
        public let nodeType: String?
        /// The parameter value for this node type.
        public let value: String?

        public init(nodeType: String? = nil, value: String? = nil) {
            self.nodeType = nodeType
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case nodeType = "NodeType"
            case value = "Value"
        }
    }

    public struct NotificationConfiguration: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "TopicArn", required: false, type: .string), 
            AWSShapeMember(label: "TopicStatus", required: false, type: .string)
        ]

        /// The Amazon Resource Name (ARN) that identifies the topic. 
        public let topicArn: String?
        /// The current state of the topic.
        public let topicStatus: String?

        public init(topicArn: String? = nil, topicStatus: String? = nil) {
            self.topicArn = topicArn
            self.topicStatus = topicStatus
        }

        private enum CodingKeys: String, CodingKey {
            case topicArn = "TopicArn"
            case topicStatus = "TopicStatus"
        }
    }

    public struct Parameter: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "AllowedValues", required: false, type: .string), 
            AWSShapeMember(label: "ChangeType", required: false, type: .enum), 
            AWSShapeMember(label: "DataType", required: false, type: .string), 
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "IsModifiable", required: false, type: .enum), 
            AWSShapeMember(label: "NodeTypeSpecificValues", required: false, type: .list), 
            AWSShapeMember(label: "ParameterName", required: false, type: .string), 
            AWSShapeMember(label: "ParameterType", required: false, type: .enum), 
            AWSShapeMember(label: "ParameterValue", required: false, type: .string), 
            AWSShapeMember(label: "Source", required: false, type: .string)
        ]

        /// A range of values within which the parameter can be set.
        public let allowedValues: String?
        /// The conditions under which changes to this parameter can be applied. For example, requires-reboot indicates that a new value for this parameter will only take effect if a node is rebooted.
        public let changeType: ChangeType?
        /// The data type of the parameter. For example, integer:
        public let dataType: String?
        /// A description of the parameter
        public let description: String?
        /// Whether the customer is allowed to modify the parameter.
        public let isModifiable: IsModifiable?
        /// A list of node types, and specific parameter values for each node.
        public let nodeTypeSpecificValues: [NodeTypeSpecificValue]?
        /// The name of the parameter.
        public let parameterName: String?
        /// Determines whether the parameter can be applied to any nodes, or only nodes of a particular type.
        public let parameterType: ParameterType?
        /// The value for the parameter.
        public let parameterValue: String?
        /// How the parameter is defined. For example, system denotes a system-defined parameter.
        public let source: String?

        public init(allowedValues: String? = nil, changeType: ChangeType? = nil, dataType: String? = nil, description: String? = nil, isModifiable: IsModifiable? = nil, nodeTypeSpecificValues: [NodeTypeSpecificValue]? = nil, parameterName: String? = nil, parameterType: ParameterType? = nil, parameterValue: String? = nil, source: String? = nil) {
            self.allowedValues = allowedValues
            self.changeType = changeType
            self.dataType = dataType
            self.description = description
            self.isModifiable = isModifiable
            self.nodeTypeSpecificValues = nodeTypeSpecificValues
            self.parameterName = parameterName
            self.parameterType = parameterType
            self.parameterValue = parameterValue
            self.source = source
        }

        private enum CodingKeys: String, CodingKey {
            case allowedValues = "AllowedValues"
            case changeType = "ChangeType"
            case dataType = "DataType"
            case description = "Description"
            case isModifiable = "IsModifiable"
            case nodeTypeSpecificValues = "NodeTypeSpecificValues"
            case parameterName = "ParameterName"
            case parameterType = "ParameterType"
            case parameterValue = "ParameterValue"
            case source = "Source"
        }
    }

    public struct ParameterGroup: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: false, type: .string)
        ]

        /// A description of the parameter group.
        public let description: String?
        /// The name of the parameter group.
        public let parameterGroupName: String?

        public init(description: String? = nil, parameterGroupName: String? = nil) {
            self.description = description
            self.parameterGroupName = parameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case parameterGroupName = "ParameterGroupName"
        }
    }

    public struct ParameterGroupStatus: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "NodeIdsToReboot", required: false, type: .list), 
            AWSShapeMember(label: "ParameterApplyStatus", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: false, type: .string)
        ]

        /// The node IDs of one or more nodes to be rebooted.
        public let nodeIdsToReboot: [String]?
        /// The status of parameter updates. 
        public let parameterApplyStatus: String?
        /// The name of the parameter group.
        public let parameterGroupName: String?

        public init(nodeIdsToReboot: [String]? = nil, parameterApplyStatus: String? = nil, parameterGroupName: String? = nil) {
            self.nodeIdsToReboot = nodeIdsToReboot
            self.parameterApplyStatus = parameterApplyStatus
            self.parameterGroupName = parameterGroupName
        }

        private enum CodingKeys: String, CodingKey {
            case nodeIdsToReboot = "NodeIdsToReboot"
            case parameterApplyStatus = "ParameterApplyStatus"
            case parameterGroupName = "ParameterGroupName"
        }
    }

    public struct ParameterNameValue: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ParameterName", required: false, type: .string), 
            AWSShapeMember(label: "ParameterValue", required: false, type: .string)
        ]

        /// The name of the parameter.
        public let parameterName: String?
        /// The value of the parameter.
        public let parameterValue: String?

        public init(parameterName: String? = nil, parameterValue: String? = nil) {
            self.parameterName = parameterName
            self.parameterValue = parameterValue
        }

        private enum CodingKeys: String, CodingKey {
            case parameterName = "ParameterName"
            case parameterValue = "ParameterValue"
        }
    }

    public enum ParameterType: String, CustomStringConvertible, Codable {
        case `default` = "DEFAULT"
        case nodeTypeSpecific = "NODE_TYPE_SPECIFIC"
        public var description: String { return self.rawValue }
    }

    public struct RebootNodeRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ClusterName", required: true, type: .string), 
            AWSShapeMember(label: "NodeId", required: true, type: .string)
        ]

        /// The name of the DAX cluster containing the node to be rebooted.
        public let clusterName: String
        /// The system-assigned ID of the node to be rebooted.
        public let nodeId: String

        public init(clusterName: String, nodeId: String) {
            self.clusterName = clusterName
            self.nodeId = nodeId
        }

        private enum CodingKeys: String, CodingKey {
            case clusterName = "ClusterName"
            case nodeId = "NodeId"
        }
    }

    public struct RebootNodeResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster after a node has been rebooted.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public struct SSEDescription: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Status", required: false, type: .enum)
        ]

        /// The current state of server-side encryption:    ENABLING - Server-side encryption is being enabled.    ENABLED - Server-side encryption is enabled.    DISABLING - Server-side encryption is being disabled.    DISABLED - Server-side encryption is disabled.  
        public let status: SSEStatus?

        public init(status: SSEStatus? = nil) {
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
        }
    }

    public struct SSESpecification: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Enabled", required: true, type: .boolean)
        ]

        /// Indicates whether server-side encryption is enabled (true) or disabled (false) on the cluster.
        public let enabled: Bool

        public init(enabled: Bool) {
            self.enabled = enabled
        }

        private enum CodingKeys: String, CodingKey {
            case enabled = "Enabled"
        }
    }

    public enum SSEStatus: String, CustomStringConvertible, Codable {
        case enabling = "ENABLING"
        case enabled = "ENABLED"
        case disabling = "DISABLING"
        case disabled = "DISABLED"
        public var description: String { return self.rawValue }
    }

    public struct SecurityGroupMembership: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "SecurityGroupIdentifier", required: false, type: .string), 
            AWSShapeMember(label: "Status", required: false, type: .string)
        ]

        /// The unique ID for this security group.
        public let securityGroupIdentifier: String?
        /// The status of this security group.
        public let status: String?

        public init(securityGroupIdentifier: String? = nil, status: String? = nil) {
            self.securityGroupIdentifier = securityGroupIdentifier
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case securityGroupIdentifier = "SecurityGroupIdentifier"
            case status = "Status"
        }
    }

    public enum SourceType: String, CustomStringConvertible, Codable {
        case cluster = "CLUSTER"
        case parameterGroup = "PARAMETER_GROUP"
        case subnetGroup = "SUBNET_GROUP"
        public var description: String { return self.rawValue }
    }

    public struct Subnet: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "SubnetAvailabilityZone", required: false, type: .string), 
            AWSShapeMember(label: "SubnetIdentifier", required: false, type: .string)
        ]

        /// The Availability Zone (AZ) for subnet subnet.
        public let subnetAvailabilityZone: String?
        /// The system-assigned identifier for the subnet.
        public let subnetIdentifier: String?

        public init(subnetAvailabilityZone: String? = nil, subnetIdentifier: String? = nil) {
            self.subnetAvailabilityZone = subnetAvailabilityZone
            self.subnetIdentifier = subnetIdentifier
        }

        private enum CodingKeys: String, CodingKey {
            case subnetAvailabilityZone = "SubnetAvailabilityZone"
            case subnetIdentifier = "SubnetIdentifier"
        }
    }

    public struct SubnetGroup: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroupName", required: false, type: .string), 
            AWSShapeMember(label: "Subnets", required: false, type: .list), 
            AWSShapeMember(label: "VpcId", required: false, type: .string)
        ]

        /// The description of the subnet group.
        public let description: String?
        /// The name of the subnet group.
        public let subnetGroupName: String?
        /// A list of subnets associated with the subnet group. 
        public let subnets: [Subnet]?
        /// The Amazon Virtual Private Cloud identifier (VPC ID) of the subnet group.
        public let vpcId: String?

        public init(description: String? = nil, subnetGroupName: String? = nil, subnets: [Subnet]? = nil, vpcId: String? = nil) {
            self.description = description
            self.subnetGroupName = subnetGroupName
            self.subnets = subnets
            self.vpcId = vpcId
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case subnetGroupName = "SubnetGroupName"
            case subnets = "Subnets"
            case vpcId = "VpcId"
        }
    }

    public struct Tag: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Key", required: false, type: .string), 
            AWSShapeMember(label: "Value", required: false, type: .string)
        ]

        /// The key for the tag. Tag keys are case sensitive. Every DAX cluster can only have one tag with the same key. If you try to add an existing tag (same key), the existing tag value will be updated to the new value.
        public let key: String?
        /// The value of the tag. Tag values are case-sensitive and can be null. 
        public let value: String?

        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TagResourceRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ResourceName", required: true, type: .string), 
            AWSShapeMember(label: "Tags", required: true, type: .list)
        ]

        /// The name of the DAX resource to which tags should be added.
        public let resourceName: String
        /// The tags to be assigned to the DAX resource. 
        public let tags: [Tag]

        public init(resourceName: String, tags: [Tag]) {
            self.resourceName = resourceName
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "ResourceName"
            case tags = "Tags"
        }
    }

    public struct TagResourceResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Tags", required: false, type: .list)
        ]

        /// The list of tags that are associated with the DAX resource.
        public let tags: [Tag]?

        public init(tags: [Tag]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct UntagResourceRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ResourceName", required: true, type: .string), 
            AWSShapeMember(label: "TagKeys", required: true, type: .list)
        ]

        /// The name of the DAX resource from which the tags should be removed.
        public let resourceName: String
        /// A list of tag keys. If the DAX cluster has any tags with these keys, then the tags are removed from the cluster.
        public let tagKeys: [String]

        public init(resourceName: String, tagKeys: [String]) {
            self.resourceName = resourceName
            self.tagKeys = tagKeys
        }

        private enum CodingKeys: String, CodingKey {
            case resourceName = "ResourceName"
            case tagKeys = "TagKeys"
        }
    }

    public struct UntagResourceResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Tags", required: false, type: .list)
        ]

        /// The tag keys that have been removed from the cluster.
        public let tags: [Tag]?

        public init(tags: [Tag]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct UpdateClusterRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ClusterName", required: true, type: .string), 
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "NotificationTopicArn", required: false, type: .string), 
            AWSShapeMember(label: "NotificationTopicStatus", required: false, type: .string), 
            AWSShapeMember(label: "ParameterGroupName", required: false, type: .string), 
            AWSShapeMember(label: "PreferredMaintenanceWindow", required: false, type: .string), 
            AWSShapeMember(label: "SecurityGroupIds", required: false, type: .list)
        ]

        /// The name of the DAX cluster to be modified.
        public let clusterName: String
        /// A description of the changes being made to the cluster.
        public let description: String?
        /// The Amazon Resource Name (ARN) that identifies the topic.
        public let notificationTopicArn: String?
        /// The current state of the topic.
        public let notificationTopicStatus: String?
        /// The name of a parameter group for this cluster.
        public let parameterGroupName: String?
        /// A range of time when maintenance of DAX cluster software will be performed. For example: sun:01:00-sun:09:00. Cluster maintenance normally takes less than 30 minutes, and is performed automatically within the maintenance window.
        public let preferredMaintenanceWindow: String?
        /// A list of user-specified security group IDs to be assigned to each node in the DAX cluster. If this parameter is not specified, DAX assigns the default VPC security group to each node.
        public let securityGroupIds: [String]?

        public init(clusterName: String, description: String? = nil, notificationTopicArn: String? = nil, notificationTopicStatus: String? = nil, parameterGroupName: String? = nil, preferredMaintenanceWindow: String? = nil, securityGroupIds: [String]? = nil) {
            self.clusterName = clusterName
            self.description = description
            self.notificationTopicArn = notificationTopicArn
            self.notificationTopicStatus = notificationTopicStatus
            self.parameterGroupName = parameterGroupName
            self.preferredMaintenanceWindow = preferredMaintenanceWindow
            self.securityGroupIds = securityGroupIds
        }

        private enum CodingKeys: String, CodingKey {
            case clusterName = "ClusterName"
            case description = "Description"
            case notificationTopicArn = "NotificationTopicArn"
            case notificationTopicStatus = "NotificationTopicStatus"
            case parameterGroupName = "ParameterGroupName"
            case preferredMaintenanceWindow = "PreferredMaintenanceWindow"
            case securityGroupIds = "SecurityGroupIds"
        }
    }

    public struct UpdateClusterResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Cluster", required: false, type: .structure)
        ]

        /// A description of the DAX cluster, after it has been modified.
        public let cluster: Cluster?

        public init(cluster: Cluster? = nil) {
            self.cluster = cluster
        }

        private enum CodingKeys: String, CodingKey {
            case cluster = "Cluster"
        }
    }

    public struct UpdateParameterGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ParameterGroupName", required: true, type: .string), 
            AWSShapeMember(label: "ParameterNameValues", required: true, type: .list)
        ]

        /// The name of the parameter group.
        public let parameterGroupName: String
        /// An array of name-value pairs for the parameters in the group. Each element in the array represents a single parameter.
        public let parameterNameValues: [ParameterNameValue]

        public init(parameterGroupName: String, parameterNameValues: [ParameterNameValue]) {
            self.parameterGroupName = parameterGroupName
            self.parameterNameValues = parameterNameValues
        }

        private enum CodingKeys: String, CodingKey {
            case parameterGroupName = "ParameterGroupName"
            case parameterNameValues = "ParameterNameValues"
        }
    }

    public struct UpdateParameterGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "ParameterGroup", required: false, type: .structure)
        ]

        /// The parameter group that has been modified.
        public let parameterGroup: ParameterGroup?

        public init(parameterGroup: ParameterGroup? = nil) {
            self.parameterGroup = parameterGroup
        }

        private enum CodingKeys: String, CodingKey {
            case parameterGroup = "ParameterGroup"
        }
    }

    public struct UpdateSubnetGroupRequest: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "Description", required: false, type: .string), 
            AWSShapeMember(label: "SubnetGroupName", required: true, type: .string), 
            AWSShapeMember(label: "SubnetIds", required: false, type: .list)
        ]

        /// A description of the subnet group.
        public let description: String?
        /// The name of the subnet group.
        public let subnetGroupName: String
        /// A list of subnet IDs in the subnet group.
        public let subnetIds: [String]?

        public init(description: String? = nil, subnetGroupName: String, subnetIds: [String]? = nil) {
            self.description = description
            self.subnetGroupName = subnetGroupName
            self.subnetIds = subnetIds
        }

        private enum CodingKeys: String, CodingKey {
            case description = "Description"
            case subnetGroupName = "SubnetGroupName"
            case subnetIds = "SubnetIds"
        }
    }

    public struct UpdateSubnetGroupResponse: AWSShape {
        public static var _members: [AWSShapeMember] = [
            AWSShapeMember(label: "SubnetGroup", required: false, type: .structure)
        ]

        /// The subnet group that has been modified.
        public let subnetGroup: SubnetGroup?

        public init(subnetGroup: SubnetGroup? = nil) {
            self.subnetGroup = subnetGroup
        }

        private enum CodingKeys: String, CodingKey {
            case subnetGroup = "SubnetGroup"
        }
    }
}
