/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 * 
 *  http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */
/*
 * Do not modify this file. This file is generated from the sagemaker-2017-07-24.normal.json service model.
 */
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using System.Net;
using Amazon.Runtime;
using Amazon.Runtime.Internal;
namespace Amazon.SageMaker.Model
{
    /// 
    /// Container for the parameters to the CreateDomain operation.
    /// Creates a Domain used by Amazon SageMaker Studio. A domain consists of
    /// an associated Amazon Elastic File System (EFS) volume, a list of authorized users,
    /// and a variety of security, application, policy, and Amazon Virtual Private Cloud (VPC)
    /// configurations. Users within a domain can share notebook files and other artifacts
    /// with each other.
    /// 
    ///  
    /// 
    ///  EFS storage 
    /// 
    ///  
    /// 
    /// When a domain is created, an EFS volume is created for use by all of the users within
    /// the domain. Each user receives a private home directory within the EFS volume for
    /// notebooks, Git repositories, and data files.
    /// 
    ///  
    /// 
    /// SageMaker uses the Amazon Web Services Key Management Service (Amazon Web Services
    /// KMS) to encrypt the EFS volume attached to the domain with an Amazon Web Services
    /// managed key by default. For more control, you can specify a customer managed key.
    /// For more information, see Protect
    /// Data at Rest Using Encryption.
    /// 
    ///  
    /// 
    ///  VPC configuration 
    /// 
    ///  
    /// 
    /// All SageMaker Studio traffic between the domain and the EFS volume is through the
    /// specified VPC and subnets. For other Studio traffic, you can specify the AppNetworkAccessType
    /// parameter. AppNetworkAccessType corresponds to the network access type
    /// that you choose when you onboard to Studio. The following options are available:
    /// 
    ///   -  
    /// 
    ///  
PublicInternetOnly - Non-EFS traffic goes through a VPC managed by Amazon
    /// SageMaker, which allows internet access. This is the default value.
    /// 
    ///    -  
    /// 
    ///  
VpcOnly - All Studio traffic is through the specified VPC and subnets.
    /// Internet access is disabled by default. To allow internet access, you must specify
    /// a NAT gateway.
    /// 
    ///  
    /// 
    /// When internet access is disabled, you won't be able to run a Studio notebook or to
    /// train or host models unless your VPC has an interface endpoint to the SageMaker API
    /// and runtime or a NAT gateway and your security groups allow outbound connections.
    /// 
    ///    
  
    /// 
    /// NFS traffic over TCP on port 2049 needs to be allowed in both inbound and outbound
    /// rules in order to launch a SageMaker Studio app successfully.
    /// 
    ///   
    /// 
    /// For more information, see Connect
    /// SageMaker Studio Notebooks to Resources in a VPC.
    /// 
    /// 
    public partial class CreateDomainRequest : AmazonSageMakerRequest
    {
        private AppNetworkAccessType _appNetworkAccessType;
        private AppSecurityGroupManagement _appSecurityGroupManagement;
        private AuthMode _authMode;
        private DefaultSpaceSettings _defaultSpaceSettings;
        private UserSettings _defaultUserSettings;
        private string _domainName;
        private DomainSettings _domainSettings;
        private string _homeEfsFileSystemKmsKeyId;
        private string _kmsKeyId;
        private List _subnetIds = new List();
        private List _tags = new List();
        private string _vpcId;
        /// 
        /// Gets and sets the property AppNetworkAccessType. 
        /// 
        /// Specifies the VPC used for non-EFS traffic. The default value is PublicInternetOnly.
        /// 
        ///   -  
        /// 
        ///  
PublicInternetOnly - Non-EFS traffic is through a VPC managed by Amazon
        /// SageMaker, which allows direct internet access
        /// 
        ///    -  
        /// 
        ///  
VpcOnly - All Studio traffic is through the specified VPC and subnets
        /// 
        ///    
        /// 
        public AppNetworkAccessType AppNetworkAccessType
        {
            get { return this._appNetworkAccessType; }
            set { this._appNetworkAccessType = value; }
        }
        // Check to see if AppNetworkAccessType property is set
        internal bool IsSetAppNetworkAccessType()
        {
            return this._appNetworkAccessType != null;
        }
        /// 
        /// Gets and sets the property AppSecurityGroupManagement. 
        /// 
        /// The entity that creates and manages the required security groups for inter-app communication
        /// in VPCOnly mode. Required when CreateDomain.AppNetworkAccessType
        /// is VPCOnly and DomainSettings.RStudioServerProDomainSettings.DomainExecutionRoleArn
        /// is provided. If setting up the domain for use with RStudio, this value must be set
        /// to Service.
        /// 
        /// 
        public AppSecurityGroupManagement AppSecurityGroupManagement
        {
            get { return this._appSecurityGroupManagement; }
            set { this._appSecurityGroupManagement = value; }
        }
        // Check to see if AppSecurityGroupManagement property is set
        internal bool IsSetAppSecurityGroupManagement()
        {
            return this._appSecurityGroupManagement != null;
        }
        /// 
        /// Gets and sets the property AuthMode. 
        /// 
        /// The mode of authentication that members use to access the domain.
        /// 
        /// 
        [AWSProperty(Required=true)]
        public AuthMode AuthMode
        {
            get { return this._authMode; }
            set { this._authMode = value; }
        }
        // Check to see if AuthMode property is set
        internal bool IsSetAuthMode()
        {
            return this._authMode != null;
        }
        /// 
        /// Gets and sets the property DefaultSpaceSettings. 
        /// 
        /// The default settings used to create a space.
        /// 
        /// 
        public DefaultSpaceSettings DefaultSpaceSettings
        {
            get { return this._defaultSpaceSettings; }
            set { this._defaultSpaceSettings = value; }
        }
        // Check to see if DefaultSpaceSettings property is set
        internal bool IsSetDefaultSpaceSettings()
        {
            return this._defaultSpaceSettings != null;
        }
        /// 
        /// Gets and sets the property DefaultUserSettings. 
        /// 
        /// The default settings to use to create a user profile when UserSettings
        /// isn't specified in the call to the CreateUserProfile API.
        /// 
        ///  
        /// 
        ///  SecurityGroups is aggregated when specified in both calls. For all other
        /// settings in UserSettings, the values specified in CreateUserProfile
        /// take precedence over those specified in CreateDomain.
        /// 
        /// 
        [AWSProperty(Required=true)]
        public UserSettings DefaultUserSettings
        {
            get { return this._defaultUserSettings; }
            set { this._defaultUserSettings = value; }
        }
        // Check to see if DefaultUserSettings property is set
        internal bool IsSetDefaultUserSettings()
        {
            return this._defaultUserSettings != null;
        }
        /// 
        /// Gets and sets the property DomainName. 
        /// 
        /// A name for the domain.
        /// 
        /// 
        [AWSProperty(Required=true, Max=63)]
        public string DomainName
        {
            get { return this._domainName; }
            set { this._domainName = value; }
        }
        // Check to see if DomainName property is set
        internal bool IsSetDomainName()
        {
            return this._domainName != null;
        }
        /// 
        /// Gets and sets the property DomainSettings. 
        /// 
        /// A collection of Domain settings.
        /// 
        /// 
        public DomainSettings DomainSettings
        {
            get { return this._domainSettings; }
            set { this._domainSettings = value; }
        }
        // Check to see if DomainSettings property is set
        internal bool IsSetDomainSettings()
        {
            return this._domainSettings != null;
        }
        /// 
        /// Gets and sets the property HomeEfsFileSystemKmsKeyId. 
        /// 
        /// Use KmsKeyId.
        /// 
        /// 
        [Obsolete("This property is deprecated, use KmsKeyId instead.")]
        [AWSProperty(Max=2048)]
        public string HomeEfsFileSystemKmsKeyId
        {
            get { return this._homeEfsFileSystemKmsKeyId; }
            set { this._homeEfsFileSystemKmsKeyId = value; }
        }
        // Check to see if HomeEfsFileSystemKmsKeyId property is set
        internal bool IsSetHomeEfsFileSystemKmsKeyId()
        {
            return this._homeEfsFileSystemKmsKeyId != null;
        }
        /// 
        /// Gets and sets the property KmsKeyId. 
        /// 
        /// SageMaker uses Amazon Web Services KMS to encrypt the EFS volume attached to the domain
        /// with an Amazon Web Services managed key by default. For more control, specify a customer
        /// managed key.
        /// 
        /// 
        [AWSProperty(Max=2048)]
        public string KmsKeyId
        {
            get { return this._kmsKeyId; }
            set { this._kmsKeyId = value; }
        }
        // Check to see if KmsKeyId property is set
        internal bool IsSetKmsKeyId()
        {
            return this._kmsKeyId != null;
        }
        /// 
        /// Gets and sets the property SubnetIds. 
        /// 
        /// The VPC subnets that Studio uses for communication.
        /// 
        /// 
        [AWSProperty(Required=true, Min=1, Max=16)]
        public List SubnetIds
        {
            get { return this._subnetIds; }
            set { this._subnetIds = value; }
        }
        // Check to see if SubnetIds property is set
        internal bool IsSetSubnetIds()
        {
            return this._subnetIds != null && this._subnetIds.Count > 0; 
        }
        /// 
        /// Gets and sets the property Tags. 
        /// 
        /// Tags to associated with the Domain. Each tag consists of a key and an optional value.
        /// Tag keys must be unique per resource. Tags are searchable using the Search
        /// API.
        /// 
        ///  
        /// 
        /// Tags that you specify for the Domain are also added to all Apps that the Domain launches.
        /// 
        /// 
        [AWSProperty(Min=0, Max=50)]
        public List Tags
        {
            get { return this._tags; }
            set { this._tags = value; }
        }
        // Check to see if Tags property is set
        internal bool IsSetTags()
        {
            return this._tags != null && this._tags.Count > 0; 
        }
        /// 
        /// Gets and sets the property VpcId. 
        /// 
        /// The ID of the Amazon Virtual Private Cloud (VPC) that Studio uses for communication.
        /// 
        /// 
        [AWSProperty(Required=true, Max=32)]
        public string VpcId
        {
            get { return this._vpcId; }
            set { this._vpcId = value; }
        }
        // Check to see if VpcId property is set
        internal bool IsSetVpcId()
        {
            return this._vpcId != null;
        }
    }
}