/*
 * 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 backup-2018-11-15.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.Backup.Model
{
    /// <summary>
    /// Container for the parameters to the StartRestoreJob operation.
    /// Recovers the saved resource identified by an Amazon Resource Name (ARN).
    /// </summary>
    public partial class StartRestoreJobRequest : AmazonBackupRequest
    {
        private bool? _copySourceTagsToRestoredResource;
        private string _iamRoleArn;
        private string _idempotencyToken;
        private Dictionary<string, string> _metadata = new Dictionary<string, string>();
        private string _recoveryPointArn;
        private string _resourceType;

        /// <summary>
        /// Gets and sets the property CopySourceTagsToRestoredResource. 
        /// <para>
        /// This is an optional parameter. If this equals <code>True</code>, tags included in
        /// the backup will be copied to the restored resource.
        /// </para>
        ///  
        /// <para>
        /// This can only be applied to backups created through Backup.
        /// </para>
        /// </summary>
        public bool CopySourceTagsToRestoredResource
        {
            get { return this._copySourceTagsToRestoredResource.GetValueOrDefault(); }
            set { this._copySourceTagsToRestoredResource = value; }
        }

        // Check to see if CopySourceTagsToRestoredResource property is set
        internal bool IsSetCopySourceTagsToRestoredResource()
        {
            return this._copySourceTagsToRestoredResource.HasValue; 
        }

        /// <summary>
        /// Gets and sets the property IamRoleArn. 
        /// <para>
        /// The Amazon Resource Name (ARN) of the IAM role that Backup uses to create the target
        /// resource; for example: <code>arn:aws:iam::123456789012:role/S3Access</code>.
        /// </para>
        /// </summary>
        public string IamRoleArn
        {
            get { return this._iamRoleArn; }
            set { this._iamRoleArn = value; }
        }

        // Check to see if IamRoleArn property is set
        internal bool IsSetIamRoleArn()
        {
            return this._iamRoleArn != null;
        }

        /// <summary>
        /// Gets and sets the property IdempotencyToken. 
        /// <para>
        /// A customer-chosen string that you can use to distinguish between otherwise identical
        /// calls to <code>StartRestoreJob</code>. Retrying a successful request with the same
        /// idempotency token results in a success message with no action taken.
        /// </para>
        /// </summary>
        public string IdempotencyToken
        {
            get { return this._idempotencyToken; }
            set { this._idempotencyToken = value; }
        }

        // Check to see if IdempotencyToken property is set
        internal bool IsSetIdempotencyToken()
        {
            return this._idempotencyToken != null;
        }

        /// <summary>
        /// Gets and sets the property Metadata. 
        /// <para>
        /// A set of metadata key-value pairs. Contains information, such as a resource name,
        /// required to restore a recovery point.
        /// </para>
        ///  
        /// <para>
        ///  You can get configuration metadata about a resource at the time it was backed up
        /// by calling <code>GetRecoveryPointRestoreMetadata</code>. However, values in addition
        /// to those provided by <code>GetRecoveryPointRestoreMetadata</code> might be required
        /// to restore a resource. For example, you might need to provide a new resource name
        /// if the original already exists.
        /// </para>
        ///  
        /// <para>
        /// You need to specify specific metadata to restore an Amazon Elastic File System (Amazon
        /// EFS) instance:
        /// </para>
        ///  <ul> <li> 
        /// <para>
        ///  <code>file-system-id</code>: The ID of the Amazon EFS file system that is backed
        /// up by Backup. Returned in <code>GetRecoveryPointRestoreMetadata</code>.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>Encrypted</code>: A Boolean value that, if true, specifies that the file system
        /// is encrypted. If <code>KmsKeyId</code> is specified, <code>Encrypted</code> must be
        /// set to <code>true</code>.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>KmsKeyId</code>: Specifies the Amazon Web Services KMS key that is used to
        /// encrypt the restored file system. You can specify a key from another Amazon Web Services
        /// account provided that key it is properly shared with your account via Amazon Web Services
        /// KMS.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>PerformanceMode</code>: Specifies the throughput mode of the file system.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>CreationToken</code>: A user-supplied value that ensures the uniqueness (idempotency)
        /// of the request.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>newFileSystem</code>: A Boolean value that, if true, specifies that the recovery
        /// point is restored to a new Amazon EFS file system.
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>ItemsToRestore</code>: An array of one to five strings where each string is
        /// a file path. Use <code>ItemsToRestore</code> to restore specific files or directories
        /// rather than the entire file system. This parameter is optional. For example, <code>"itemsToRestore":"[\"/my.test\"]"</code>.
        /// </para>
        ///  </li> </ul>
        /// </summary>
        [AWSProperty(Required=true, Sensitive=true)]
        public Dictionary<string, string> Metadata
        {
            get { return this._metadata; }
            set { this._metadata = value; }
        }

        // Check to see if Metadata property is set
        internal bool IsSetMetadata()
        {
            return this._metadata != null && this._metadata.Count > 0; 
        }

        /// <summary>
        /// Gets and sets the property RecoveryPointArn. 
        /// <para>
        /// An ARN that uniquely identifies a recovery point; for example, <code>arn:aws:backup:us-east-1:123456789012:recovery-point:1EB3B5E7-9EB0-435A-A80B-108B488B0D45</code>.
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public string RecoveryPointArn
        {
            get { return this._recoveryPointArn; }
            set { this._recoveryPointArn = value; }
        }

        // Check to see if RecoveryPointArn property is set
        internal bool IsSetRecoveryPointArn()
        {
            return this._recoveryPointArn != null;
        }

        /// <summary>
        /// Gets and sets the property ResourceType. 
        /// <para>
        /// Starts a job to restore a recovery point for one of the following resources:
        /// </para>
        ///  <ul> <li> 
        /// <para>
        ///  <code>Aurora</code> for Amazon Aurora
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>DocumentDB</code> for Amazon DocumentDB (with MongoDB compatibility)
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>CloudFormation</code> for CloudFormation
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>DynamoDB</code> for Amazon DynamoDB
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>EBS</code> for Amazon Elastic Block Store
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>EC2</code> for Amazon Elastic Compute Cloud
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>EFS</code> for Amazon Elastic File System
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>FSx</code> for Amazon FSx
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>Neptune</code> for Amazon Neptune
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>RDS</code> for Amazon Relational Database Service
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>Redshift</code> for Amazon Redshift
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>Storage Gateway</code> for Storage Gateway
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>S3</code> for Amazon S3
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>Timestream</code> for Amazon Timestream
        /// </para>
        ///  </li> <li> 
        /// <para>
        ///  <code>VirtualMachine</code> for virtual machines
        /// </para>
        ///  </li> </ul>
        /// </summary>
        public string ResourceType
        {
            get { return this._resourceType; }
            set { this._resourceType = value; }
        }

        // Check to see if ResourceType property is set
        internal bool IsSetResourceType()
        {
            return this._resourceType != null;
        }

    }
}