/*
 * 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 config-2014-11-12.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.ConfigService.Model
{
    /// <summary>
    /// Container for the parameters to the StartResourceEvaluation operation.
    /// Runs an on-demand evaluation for the specified resource to determine whether the resource
    /// details will comply with configured Config rules. You can also use it for evaluation
    /// purposes. Config recommends using an evaluation context. It runs an execution against
    /// the resource details with all of the Config rules in your account that match with
    /// the specified proactive mode and resource type.
    /// 
    ///  <note> 
    /// <para>
    /// Ensure you have the <code>cloudformation:DescribeType</code> role setup to validate
    /// the resource type schema.
    /// </para>
    ///  
    /// <para>
    /// You can find the <a href="https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-schema.html">Resource
    /// type schema</a> in "<i>Amazon Web Services public extensions</i>" within the CloudFormation
    /// registry or with the following CLI commmand: <code>aws cloudformation describe-type
    /// --type-name "AWS::S3::Bucket" --type RESOURCE</code>.
    /// </para>
    ///  
    /// <para>
    /// For more information, see <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-view">Managing
    /// extensions through the CloudFormation registry</a> and <a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html">Amazon
    /// Web Services resource and property types reference</a> in the CloudFormation User
    /// Guide.
    /// </para>
    ///  </note>
    /// </summary>
    public partial class StartResourceEvaluationRequest : AmazonConfigServiceRequest
    {
        private string _clientToken;
        private EvaluationContext _evaluationContext;
        private EvaluationMode _evaluationMode;
        private int? _evaluationTimeout;
        private ResourceDetails _resourceDetails;

        /// <summary>
        /// Gets and sets the property ClientToken. 
        /// <para>
        /// A client token is a unique, case-sensitive string of up to 64 ASCII characters. To
        /// make an idempotent API request using one of these actions, specify a client token
        /// in the request.
        /// </para>
        ///  <note> 
        /// <para>
        /// Avoid reusing the same client token for other API requests. If you retry a request
        /// that completed successfully using the same client token and the same parameters, the
        /// retry succeeds without performing any further actions. If you retry a successful request
        /// using the same client token, but one or more of the parameters are different, other
        /// than the Region or Availability Zone, the retry fails with an IdempotentParameterMismatch
        /// error.
        /// </para>
        ///  </note>
        /// </summary>
        [AWSProperty(Min=64, Max=256)]
        public string ClientToken
        {
            get { return this._clientToken; }
            set { this._clientToken = value; }
        }

        // Check to see if ClientToken property is set
        internal bool IsSetClientToken()
        {
            return this._clientToken != null;
        }

        /// <summary>
        /// Gets and sets the property EvaluationContext. 
        /// <para>
        /// Returns an <code>EvaluationContext</code> object.
        /// </para>
        /// </summary>
        public EvaluationContext EvaluationContext
        {
            get { return this._evaluationContext; }
            set { this._evaluationContext = value; }
        }

        // Check to see if EvaluationContext property is set
        internal bool IsSetEvaluationContext()
        {
            return this._evaluationContext != null;
        }

        /// <summary>
        /// Gets and sets the property EvaluationMode. 
        /// <para>
        /// The mode of an evaluation. The valid values for this API are <code>DETECTIVE</code>
        /// and <code>PROACTIVE</code>.
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public EvaluationMode EvaluationMode
        {
            get { return this._evaluationMode; }
            set { this._evaluationMode = value; }
        }

        // Check to see if EvaluationMode property is set
        internal bool IsSetEvaluationMode()
        {
            return this._evaluationMode != null;
        }

        /// <summary>
        /// Gets and sets the property EvaluationTimeout. 
        /// <para>
        /// The timeout for an evaluation. The default is 900 seconds. You cannot specify a number
        /// greater than 3600. If you specify 0, Config uses the default.
        /// </para>
        /// </summary>
        [AWSProperty(Min=0, Max=3600)]
        public int EvaluationTimeout
        {
            get { return this._evaluationTimeout.GetValueOrDefault(); }
            set { this._evaluationTimeout = value; }
        }

        // Check to see if EvaluationTimeout property is set
        internal bool IsSetEvaluationTimeout()
        {
            return this._evaluationTimeout.HasValue; 
        }

        /// <summary>
        /// Gets and sets the property ResourceDetails. 
        /// <para>
        /// Returns a <code>ResourceDetails</code> object.
        /// </para>
        /// </summary>
        [AWSProperty(Required=true)]
        public ResourceDetails ResourceDetails
        {
            get { return this._resourceDetails; }
            set { this._resourceDetails = value; }
        }

        // Check to see if ResourceDetails property is set
        internal bool IsSetResourceDetails()
        {
            return this._resourceDetails != null;
        }

    }
}