/*******************************************************************************
 *  Copyright 2012-2019 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.
 * *****************************************************************************
 *
 *  AWS Tools for Windows (TM) PowerShell (TM)
 *
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management.Automation;
using System.Text;
using Amazon.PowerShell.Common;
using Amazon.Runtime;
using Amazon.Synthetics;
using Amazon.Synthetics.Model;
namespace Amazon.PowerShell.Cmdlets.CWSYN
{
    /// 
    /// Creates a canary. Canaries are scripts that monitor your endpoints and APIs from the
    /// outside-in. Canaries help you check the availability and latency of your web services
    /// and troubleshoot anomalies by investigating load time data, screenshots of the UI,
    /// logs, and metrics. You can set up a canary to run continuously or just once. 
    /// 
    ///  
    /// 
    /// Do not use CreateCanary to modify an existing canary. Use UpdateCanary
    /// instead.
    /// 
    /// To create canaries, you must have the CloudWatchSyntheticsFullAccess
    /// policy. If you are creating a new IAM role for the canary, you also need the iam:CreateRole,
    /// iam:CreatePolicy and iam:AttachRolePolicy permissions. For
    /// more information, see Necessary
    /// Roles and Permissions.
    /// 
    /// Do not include secrets or proprietary information in your canary names. The canary
    /// name makes up part of the Amazon Resource Name (ARN) for the canary, and the ARN is
    /// included in outbound calls over the internet. For more information, see Security
    /// Considerations for Synthetics Canaries.
    /// 
    /// 
    [Cmdlet("New", "CWSYNCanary", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)]
    [OutputType("Amazon.Synthetics.Model.Canary")]
    [AWSCmdlet("Calls the Amazon CloudWatch Synthetics CreateCanary API operation.", Operation = new[] {"CreateCanary"}, SelectReturnType = typeof(Amazon.Synthetics.Model.CreateCanaryResponse))]
    [AWSCmdletOutput("Amazon.Synthetics.Model.Canary or Amazon.Synthetics.Model.CreateCanaryResponse",
        "This cmdlet returns an Amazon.Synthetics.Model.Canary object.",
        "The service call response (type Amazon.Synthetics.Model.CreateCanaryResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack."
    )]
    public partial class NewCWSYNCanaryCmdlet : AmazonSyntheticsClientCmdlet, IExecutor
    {
        
        #region Parameter RunConfig_ActiveTracing
        /// 
        /// 
        /// Specifies whether this canary is to use active X-Ray tracing when it runs. Active
        /// tracing enables this canary run to be displayed in the ServiceLens and X-Ray service
        /// maps even if the canary does not hit an endpoint that has X-Ray tracing enabled. Using
        /// X-Ray tracing incurs charges. For more information, see 
        /// Canaries and X-Ray tracing.You can enable active tracing only for canaries that use version syn-nodejs-2.0
        /// or later for their canary runtime.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public System.Boolean? RunConfig_ActiveTracing { get; set; }
        #endregion
        
        #region Parameter ArtifactS3Location
        /// 
        /// 
        /// The location in Amazon S3 where Synthetics stores artifacts from the test runs of
        /// this canary. Artifacts include the log file, screenshots, and HAR files. The name
        /// of the S3 bucket can't include a period (.).
        /// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        #else
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String ArtifactS3Location { get; set; }
        #endregion
        
        #region Parameter Schedule_DurationInSecond
        /// 
        /// 
        /// How long, in seconds, for the canary to continue making regular runs according to
        /// the schedule in the Expression value. If you specify 0, the canary continues
        /// making runs until you stop it. If you omit this field, the default of 0 is used.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("Schedule_DurationInSeconds")]
        public System.Int64? Schedule_DurationInSecond { get; set; }
        #endregion
        
        #region Parameter S3Encryption_EncryptionMode
        /// 
        /// 
        ///  The encryption method to use for artifacts created by this canary. Specify SSE_S3
        /// to use server-side encryption (SSE) with an Amazon S3-managed key. Specify SSE-KMS
        /// to use server-side encryption with a customer-managed KMS key.If you omit this parameter, an Amazon Web Services-managed KMS key is used. 
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("ArtifactConfig_S3Encryption_EncryptionMode")]
        [AWSConstantClassSource("Amazon.Synthetics.EncryptionMode")]
        public Amazon.Synthetics.EncryptionMode S3Encryption_EncryptionMode { get; set; }
        #endregion
        
        #region Parameter RunConfig_EnvironmentVariable
        /// 
        /// 
        /// Specifies the keys and values to use for any environment variables used in the canary
        /// script. Use the following format:{ "key1" : "value1", "key2" : "value2", ...}Keys must start with a letter and be at least two characters. The total size of your
        /// environment variables cannot exceed 4 KB. You can't specify any Lambda reserved environment
        /// variables as the keys for your environment variables. For more information about reserved
        /// keys, see 
        /// Runtime environment variables.The environment variables keys and values are not encrypted. Do not store sensitive
        /// information in this field.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("RunConfig_EnvironmentVariables")]
        public System.Collections.Hashtable RunConfig_EnvironmentVariable { get; set; }
        #endregion
        
        #region Parameter ExecutionRoleArn
        /// 
        /// 
        /// The ARN of the IAM role to be used to run the canary. This role must already exist,
        /// and must include lambda.amazonaws.com as a principal in the trust policy.
        /// The role must also have the following permissions:- s3:PutObject
- s3:GetBucketLocation
- s3:ListAllMyBuckets
- cloudwatch:PutMetricData
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
/// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        #else
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String ExecutionRoleArn { get; set; }
        #endregion
        
        #region Parameter Schedule_Expression
        /// 
        /// 
        /// Arate expression or a cron expression that defines how
        /// often the canary is to run.For a rate expression, The syntax is rate(number unit). unit
        /// can be minute, minutes, or hour. For example, rate(1 minute) runs the canary once a minute, rate(10
        /// minutes) runs it once every 10 minutes, and rate(1 hour) runs
        /// it once every hour. You can specify a frequency between rate(1 minute)
        /// and rate(1 hour).Specifying rate(0 minute) or rate(0 hour) is a special value
        /// that causes the canary to run only once when it is started.Use cron(expression) to specify a cron expression. You can't schedule
        /// a canary to wait for more than a year before running. For information about the syntax
        /// for cron expressions, see 
        /// Scheduling canary runs using cron.
        /// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        #else
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String Schedule_Expression { get; set; }
        #endregion
        
        #region Parameter FailureRetentionPeriodInDay
        /// 
        /// 
        /// The number of days to retain data about failed runs of this canary. If you omit this
        /// field, the default of 31 days is used. The valid range is 1 to 455 days.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("FailureRetentionPeriodInDays")]
        public System.Int32? FailureRetentionPeriodInDay { get; set; }
        #endregion
        
        #region Parameter Code_Handler
        /// 
        /// 
        /// The entry point to use for the source code when running the canary. For canaries that
        /// use the syn-python-selenium-1.0 runtime or a syn-nodejs.puppeteer
        /// runtime earlier than syn-nodejs.puppeteer-3.4, the handler must be specified
        /// as fileName.handler. For syn-python-selenium-1.1,
        /// syn-nodejs.puppeteer-3.4, and later runtimes, the handler can be specified
        /// as fileName.functionName, or you can specify a folder
        /// where canary scripts reside as folder/fileName.functionName.
        /// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        #else
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String Code_Handler { get; set; }
        #endregion
        
        #region Parameter S3Encryption_KmsKeyArn
        /// 
        /// 
        /// The ARN of the customer-managed KMS key to use, if you specify SSE-KMS
        /// for EncryptionMode
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("ArtifactConfig_S3Encryption_KmsKeyArn")]
        public System.String S3Encryption_KmsKeyArn { get; set; }
        #endregion
        
        #region Parameter RunConfig_MemoryInMB
        /// 
        /// 
        /// The maximum amount of memory available to the canary while it is running, in MB. This
        /// value must be a multiple of 64.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public System.Int32? RunConfig_MemoryInMB { get; set; }
        #endregion
        
        #region Parameter Name
        /// 
        /// 
        /// The name for this canary. Be sure to give it a descriptive name that distinguishes
        /// it from other canaries in your account.Do not include secrets or proprietary information in your canary names. The canary
        /// name makes up part of the canary ARN, and the ARN is included in outbound calls over
        /// the internet. For more information, see Security
        /// Considerations for Synthetics Canaries.
        /// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true)]
        #else
        [System.Management.Automation.Parameter(Position = 0, ValueFromPipelineByPropertyName = true, ValueFromPipeline = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String Name { get; set; }
        #endregion
        
        #region Parameter RuntimeVersion
        /// 
        /// 
        /// Specifies the runtime version to use for the canary. For a list of valid runtime versions
        /// and more information about runtime versions, see 
        /// Canary Runtime Versions.
        /// 
        /// 
        #if !MODULAR
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        #else
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true, Mandatory = true)]
        [System.Management.Automation.AllowEmptyString]
        [System.Management.Automation.AllowNull]
        #endif
        [Amazon.PowerShell.Common.AWSRequiredParameter]
        public System.String RuntimeVersion { get; set; }
        #endregion
        
        #region Parameter Code_S3Bucket
        /// 
        /// 
        /// If your canary script is located in S3, specify the bucket name here. Do not include
        /// s3:// as the start of the bucket name.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public System.String Code_S3Bucket { get; set; }
        #endregion
        
        #region Parameter Code_S3Key
        /// 
        /// 
        /// The S3 key of your script. For more information, see Working
        /// with Amazon S3 Objects.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public System.String Code_S3Key { get; set; }
        #endregion
        
        #region Parameter Code_S3Version
        /// 
        /// 
        /// The S3 version ID of your script.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public System.String Code_S3Version { get; set; }
        #endregion
        
        #region Parameter VpcConfig_SecurityGroupId
        /// 
        /// 
        /// The IDs of the security groups for this canary.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("VpcConfig_SecurityGroupIds")]
        public System.String[] VpcConfig_SecurityGroupId { get; set; }
        #endregion
        
        #region Parameter VpcConfig_SubnetId
        /// 
        /// 
        /// The IDs of the subnets where this canary is to run.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("VpcConfig_SubnetIds")]
        public System.String[] VpcConfig_SubnetId { get; set; }
        #endregion
        
        #region Parameter SuccessRetentionPeriodInDay
        /// 
        /// 
        /// The number of days to retain data about successful runs of this canary. If you omit
        /// this field, the default of 31 days is used. The valid range is 1 to 455 days.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("SuccessRetentionPeriodInDays")]
        public System.Int32? SuccessRetentionPeriodInDay { get; set; }
        #endregion
        
        #region Parameter Tag
        /// 
        /// 
        /// A list of key-value pairs to associate with the canary. You can associate as many
        /// as 50 tags with a canary.Tags can help you organize and categorize your resources. You can also use them to
        /// scope user permissions, by granting a user permission to access or change only the
        /// resources that have certain tag values.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("Tags")]
        public System.Collections.Hashtable Tag { get; set; }
        #endregion
        
        #region Parameter RunConfig_TimeoutInSecond
        /// 
        /// 
        /// How long the canary is allowed to run before it must stop. You can't set this time
        /// to be longer than the frequency of the runs of this canary.If you omit this field, the frequency of the canary is used as this value, up to a
        /// maximum of 14 minutes.
        /// 
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Alias("RunConfig_TimeoutInSeconds")]
        public System.Int32? RunConfig_TimeoutInSecond { get; set; }
        #endregion
        
        #region Parameter Code_ZipFile
        /// 
        /// 
        /// If you input your canary script directly into the canary instead of referring to an
        /// S3 location, the value of this parameter is the base64-encoded contents of the .zip
        /// file that contains the script. It must be smaller than 225 Kb.For large canary scripts, we recommend that you use an S3 location instead of inputting
        /// it directly with this parameter.
        /// 
        /// The cmdlet will automatically convert the supplied parameter of type string, string[], System.IO.FileInfo or System.IO.Stream to byte[] before supplying it to the service.
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        [Amazon.PowerShell.Common.MemoryStreamParameterConverter]
        public byte[] Code_ZipFile { get; set; }
        #endregion
        
        #region Parameter Select
        /// 
        /// Use the -Select parameter to control the cmdlet output. The default value is 'Canary'.
        /// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.Synthetics.Model.CreateCanaryResponse).
        /// Specifying the name of a property of type Amazon.Synthetics.Model.CreateCanaryResponse will result in that property being returned.
        /// Specifying -Select '^ParameterName' will result in the cmdlet returning the selected cmdlet parameter value.
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public string Select { get; set; } = "Canary";
        #endregion
        
        #region Parameter PassThru
        /// 
        /// Changes the cmdlet behavior to return the value passed to the Name parameter.
        /// The -PassThru parameter is deprecated, use -Select '^Name' instead. This parameter will be removed in a future version.
        /// 
        [System.Obsolete("The -PassThru parameter is deprecated, use -Select '^Name' instead. This parameter will be removed in a future version.")]
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public SwitchParameter PassThru { get; set; }
        #endregion
        
        #region Parameter Force
        /// 
        /// This parameter overrides confirmation prompts to force 
        /// the cmdlet to continue its operation. This parameter should always
        /// be used with caution.
        /// 
        [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)]
        public SwitchParameter Force { get; set; }
        #endregion
        
        protected override void ProcessRecord()
        {
            this._AWSSignerType = "v4";
            base.ProcessRecord();
            
            var resourceIdentifiersText = FormatParameterValuesForConfirmationMsg(nameof(this.Name), MyInvocation.BoundParameters);
            if (!ConfirmShouldProceed(this.Force.IsPresent, resourceIdentifiersText, "New-CWSYNCanary (CreateCanary)"))
            {
                return;
            }
            
            var context = new CmdletContext();
            
            // allow for manipulation of parameters prior to loading into context
            PreExecutionContextLoad(context);
            
            #pragma warning disable CS0618, CS0612 //A class member was marked with the Obsolete attribute
            if (ParameterWasBound(nameof(this.Select)))
            {
                context.Select = CreateSelectDelegate(Select) ??
                    throw new System.ArgumentException("Invalid value for -Select parameter.", nameof(this.Select));
                if (this.PassThru.IsPresent)
                {
                    throw new System.ArgumentException("-PassThru cannot be used when -Select is specified.", nameof(this.Select));
                }
            }
            else if (this.PassThru.IsPresent)
            {
                context.Select = (response, cmdlet) => this.Name;
            }
            #pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute
            context.S3Encryption_EncryptionMode = this.S3Encryption_EncryptionMode;
            context.S3Encryption_KmsKeyArn = this.S3Encryption_KmsKeyArn;
            context.ArtifactS3Location = this.ArtifactS3Location;
            #if MODULAR
            if (this.ArtifactS3Location == null && ParameterWasBound(nameof(this.ArtifactS3Location)))
            {
                WriteWarning("You are passing $null as a value for parameter ArtifactS3Location which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.Code_Handler = this.Code_Handler;
            #if MODULAR
            if (this.Code_Handler == null && ParameterWasBound(nameof(this.Code_Handler)))
            {
                WriteWarning("You are passing $null as a value for parameter Code_Handler which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.Code_S3Bucket = this.Code_S3Bucket;
            context.Code_S3Key = this.Code_S3Key;
            context.Code_S3Version = this.Code_S3Version;
            context.Code_ZipFile = this.Code_ZipFile;
            context.ExecutionRoleArn = this.ExecutionRoleArn;
            #if MODULAR
            if (this.ExecutionRoleArn == null && ParameterWasBound(nameof(this.ExecutionRoleArn)))
            {
                WriteWarning("You are passing $null as a value for parameter ExecutionRoleArn which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.FailureRetentionPeriodInDay = this.FailureRetentionPeriodInDay;
            context.Name = this.Name;
            #if MODULAR
            if (this.Name == null && ParameterWasBound(nameof(this.Name)))
            {
                WriteWarning("You are passing $null as a value for parameter Name which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.RunConfig_ActiveTracing = this.RunConfig_ActiveTracing;
            if (this.RunConfig_EnvironmentVariable != null)
            {
                context.RunConfig_EnvironmentVariable = new Dictionary(StringComparer.Ordinal);
                foreach (var hashKey in this.RunConfig_EnvironmentVariable.Keys)
                {
                    context.RunConfig_EnvironmentVariable.Add((String)hashKey, (String)(this.RunConfig_EnvironmentVariable[hashKey]));
                }
            }
            context.RunConfig_MemoryInMB = this.RunConfig_MemoryInMB;
            context.RunConfig_TimeoutInSecond = this.RunConfig_TimeoutInSecond;
            context.RuntimeVersion = this.RuntimeVersion;
            #if MODULAR
            if (this.RuntimeVersion == null && ParameterWasBound(nameof(this.RuntimeVersion)))
            {
                WriteWarning("You are passing $null as a value for parameter RuntimeVersion which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.Schedule_DurationInSecond = this.Schedule_DurationInSecond;
            context.Schedule_Expression = this.Schedule_Expression;
            #if MODULAR
            if (this.Schedule_Expression == null && ParameterWasBound(nameof(this.Schedule_Expression)))
            {
                WriteWarning("You are passing $null as a value for parameter Schedule_Expression which is marked as required. In case you believe this parameter was incorrectly marked as required, report this by opening an issue at https://github.com/aws/aws-tools-for-powershell/issues.");
            }
            #endif
            context.SuccessRetentionPeriodInDay = this.SuccessRetentionPeriodInDay;
            if (this.Tag != null)
            {
                context.Tag = new Dictionary(StringComparer.Ordinal);
                foreach (var hashKey in this.Tag.Keys)
                {
                    context.Tag.Add((String)hashKey, (String)(this.Tag[hashKey]));
                }
            }
            if (this.VpcConfig_SecurityGroupId != null)
            {
                context.VpcConfig_SecurityGroupId = new List(this.VpcConfig_SecurityGroupId);
            }
            if (this.VpcConfig_SubnetId != null)
            {
                context.VpcConfig_SubnetId = new List(this.VpcConfig_SubnetId);
            }
            
            // allow further manipulation of loaded context prior to processing
            PostExecutionContextLoad(context);
            
            var output = Execute(context) as CmdletOutput;
            ProcessOutput(output);
        }
        
        #region IExecutor Members
        
        public object Execute(ExecutorContext context)
        {
            System.IO.MemoryStream _Code_ZipFileStream = null;
            
            try
            {
                var cmdletContext = context as CmdletContext;
                // create request
                var request = new Amazon.Synthetics.Model.CreateCanaryRequest();
                
                
                 // populate ArtifactConfig
                var requestArtifactConfigIsNull = true;
                request.ArtifactConfig = new Amazon.Synthetics.Model.ArtifactConfigInput();
                Amazon.Synthetics.Model.S3EncryptionConfig requestArtifactConfig_artifactConfig_S3Encryption = null;
                
                 // populate S3Encryption
                var requestArtifactConfig_artifactConfig_S3EncryptionIsNull = true;
                requestArtifactConfig_artifactConfig_S3Encryption = new Amazon.Synthetics.Model.S3EncryptionConfig();
                Amazon.Synthetics.EncryptionMode requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_EncryptionMode = null;
                if (cmdletContext.S3Encryption_EncryptionMode != null)
                {
                    requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_EncryptionMode = cmdletContext.S3Encryption_EncryptionMode;
                }
                if (requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_EncryptionMode != null)
                {
                    requestArtifactConfig_artifactConfig_S3Encryption.EncryptionMode = requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_EncryptionMode;
                    requestArtifactConfig_artifactConfig_S3EncryptionIsNull = false;
                }
                System.String requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_KmsKeyArn = null;
                if (cmdletContext.S3Encryption_KmsKeyArn != null)
                {
                    requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_KmsKeyArn = cmdletContext.S3Encryption_KmsKeyArn;
                }
                if (requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_KmsKeyArn != null)
                {
                    requestArtifactConfig_artifactConfig_S3Encryption.KmsKeyArn = requestArtifactConfig_artifactConfig_S3Encryption_s3Encryption_KmsKeyArn;
                    requestArtifactConfig_artifactConfig_S3EncryptionIsNull = false;
                }
                 // determine if requestArtifactConfig_artifactConfig_S3Encryption should be set to null
                if (requestArtifactConfig_artifactConfig_S3EncryptionIsNull)
                {
                    requestArtifactConfig_artifactConfig_S3Encryption = null;
                }
                if (requestArtifactConfig_artifactConfig_S3Encryption != null)
                {
                    request.ArtifactConfig.S3Encryption = requestArtifactConfig_artifactConfig_S3Encryption;
                    requestArtifactConfigIsNull = false;
                }
                 // determine if request.ArtifactConfig should be set to null
                if (requestArtifactConfigIsNull)
                {
                    request.ArtifactConfig = null;
                }
                if (cmdletContext.ArtifactS3Location != null)
                {
                    request.ArtifactS3Location = cmdletContext.ArtifactS3Location;
                }
                
                 // populate Code
                var requestCodeIsNull = true;
                request.Code = new Amazon.Synthetics.Model.CanaryCodeInput();
                System.String requestCode_code_Handler = null;
                if (cmdletContext.Code_Handler != null)
                {
                    requestCode_code_Handler = cmdletContext.Code_Handler;
                }
                if (requestCode_code_Handler != null)
                {
                    request.Code.Handler = requestCode_code_Handler;
                    requestCodeIsNull = false;
                }
                System.String requestCode_code_S3Bucket = null;
                if (cmdletContext.Code_S3Bucket != null)
                {
                    requestCode_code_S3Bucket = cmdletContext.Code_S3Bucket;
                }
                if (requestCode_code_S3Bucket != null)
                {
                    request.Code.S3Bucket = requestCode_code_S3Bucket;
                    requestCodeIsNull = false;
                }
                System.String requestCode_code_S3Key = null;
                if (cmdletContext.Code_S3Key != null)
                {
                    requestCode_code_S3Key = cmdletContext.Code_S3Key;
                }
                if (requestCode_code_S3Key != null)
                {
                    request.Code.S3Key = requestCode_code_S3Key;
                    requestCodeIsNull = false;
                }
                System.String requestCode_code_S3Version = null;
                if (cmdletContext.Code_S3Version != null)
                {
                    requestCode_code_S3Version = cmdletContext.Code_S3Version;
                }
                if (requestCode_code_S3Version != null)
                {
                    request.Code.S3Version = requestCode_code_S3Version;
                    requestCodeIsNull = false;
                }
                System.IO.MemoryStream requestCode_code_ZipFile = null;
                if (cmdletContext.Code_ZipFile != null)
                {
                    _Code_ZipFileStream = new System.IO.MemoryStream(cmdletContext.Code_ZipFile);
                    requestCode_code_ZipFile = _Code_ZipFileStream;
                }
                if (requestCode_code_ZipFile != null)
                {
                    request.Code.ZipFile = requestCode_code_ZipFile;
                    requestCodeIsNull = false;
                }
                 // determine if request.Code should be set to null
                if (requestCodeIsNull)
                {
                    request.Code = null;
                }
                if (cmdletContext.ExecutionRoleArn != null)
                {
                    request.ExecutionRoleArn = cmdletContext.ExecutionRoleArn;
                }
                if (cmdletContext.FailureRetentionPeriodInDay != null)
                {
                    request.FailureRetentionPeriodInDays = cmdletContext.FailureRetentionPeriodInDay.Value;
                }
                if (cmdletContext.Name != null)
                {
                    request.Name = cmdletContext.Name;
                }
                
                 // populate RunConfig
                var requestRunConfigIsNull = true;
                request.RunConfig = new Amazon.Synthetics.Model.CanaryRunConfigInput();
                System.Boolean? requestRunConfig_runConfig_ActiveTracing = null;
                if (cmdletContext.RunConfig_ActiveTracing != null)
                {
                    requestRunConfig_runConfig_ActiveTracing = cmdletContext.RunConfig_ActiveTracing.Value;
                }
                if (requestRunConfig_runConfig_ActiveTracing != null)
                {
                    request.RunConfig.ActiveTracing = requestRunConfig_runConfig_ActiveTracing.Value;
                    requestRunConfigIsNull = false;
                }
                Dictionary requestRunConfig_runConfig_EnvironmentVariable = null;
                if (cmdletContext.RunConfig_EnvironmentVariable != null)
                {
                    requestRunConfig_runConfig_EnvironmentVariable = cmdletContext.RunConfig_EnvironmentVariable;
                }
                if (requestRunConfig_runConfig_EnvironmentVariable != null)
                {
                    request.RunConfig.EnvironmentVariables = requestRunConfig_runConfig_EnvironmentVariable;
                    requestRunConfigIsNull = false;
                }
                System.Int32? requestRunConfig_runConfig_MemoryInMB = null;
                if (cmdletContext.RunConfig_MemoryInMB != null)
                {
                    requestRunConfig_runConfig_MemoryInMB = cmdletContext.RunConfig_MemoryInMB.Value;
                }
                if (requestRunConfig_runConfig_MemoryInMB != null)
                {
                    request.RunConfig.MemoryInMB = requestRunConfig_runConfig_MemoryInMB.Value;
                    requestRunConfigIsNull = false;
                }
                System.Int32? requestRunConfig_runConfig_TimeoutInSecond = null;
                if (cmdletContext.RunConfig_TimeoutInSecond != null)
                {
                    requestRunConfig_runConfig_TimeoutInSecond = cmdletContext.RunConfig_TimeoutInSecond.Value;
                }
                if (requestRunConfig_runConfig_TimeoutInSecond != null)
                {
                    request.RunConfig.TimeoutInSeconds = requestRunConfig_runConfig_TimeoutInSecond.Value;
                    requestRunConfigIsNull = false;
                }
                 // determine if request.RunConfig should be set to null
                if (requestRunConfigIsNull)
                {
                    request.RunConfig = null;
                }
                if (cmdletContext.RuntimeVersion != null)
                {
                    request.RuntimeVersion = cmdletContext.RuntimeVersion;
                }
                
                 // populate Schedule
                var requestScheduleIsNull = true;
                request.Schedule = new Amazon.Synthetics.Model.CanaryScheduleInput();
                System.Int64? requestSchedule_schedule_DurationInSecond = null;
                if (cmdletContext.Schedule_DurationInSecond != null)
                {
                    requestSchedule_schedule_DurationInSecond = cmdletContext.Schedule_DurationInSecond.Value;
                }
                if (requestSchedule_schedule_DurationInSecond != null)
                {
                    request.Schedule.DurationInSeconds = requestSchedule_schedule_DurationInSecond.Value;
                    requestScheduleIsNull = false;
                }
                System.String requestSchedule_schedule_Expression = null;
                if (cmdletContext.Schedule_Expression != null)
                {
                    requestSchedule_schedule_Expression = cmdletContext.Schedule_Expression;
                }
                if (requestSchedule_schedule_Expression != null)
                {
                    request.Schedule.Expression = requestSchedule_schedule_Expression;
                    requestScheduleIsNull = false;
                }
                 // determine if request.Schedule should be set to null
                if (requestScheduleIsNull)
                {
                    request.Schedule = null;
                }
                if (cmdletContext.SuccessRetentionPeriodInDay != null)
                {
                    request.SuccessRetentionPeriodInDays = cmdletContext.SuccessRetentionPeriodInDay.Value;
                }
                if (cmdletContext.Tag != null)
                {
                    request.Tags = cmdletContext.Tag;
                }
                
                 // populate VpcConfig
                var requestVpcConfigIsNull = true;
                request.VpcConfig = new Amazon.Synthetics.Model.VpcConfigInput();
                List requestVpcConfig_vpcConfig_SecurityGroupId = null;
                if (cmdletContext.VpcConfig_SecurityGroupId != null)
                {
                    requestVpcConfig_vpcConfig_SecurityGroupId = cmdletContext.VpcConfig_SecurityGroupId;
                }
                if (requestVpcConfig_vpcConfig_SecurityGroupId != null)
                {
                    request.VpcConfig.SecurityGroupIds = requestVpcConfig_vpcConfig_SecurityGroupId;
                    requestVpcConfigIsNull = false;
                }
                List requestVpcConfig_vpcConfig_SubnetId = null;
                if (cmdletContext.VpcConfig_SubnetId != null)
                {
                    requestVpcConfig_vpcConfig_SubnetId = cmdletContext.VpcConfig_SubnetId;
                }
                if (requestVpcConfig_vpcConfig_SubnetId != null)
                {
                    request.VpcConfig.SubnetIds = requestVpcConfig_vpcConfig_SubnetId;
                    requestVpcConfigIsNull = false;
                }
                 // determine if request.VpcConfig should be set to null
                if (requestVpcConfigIsNull)
                {
                    request.VpcConfig = null;
                }
                
                CmdletOutput output;
                
                // issue call
                var client = Client ?? CreateClient(_CurrentCredentials, _RegionEndpoint);
                try
                {
                    var response = CallAWSServiceOperation(client, request);
                    object pipelineOutput = null;
                    pipelineOutput = cmdletContext.Select(response, this);
                    output = new CmdletOutput
                    {
                        PipelineOutput = pipelineOutput,
                        ServiceResponse = response
                    };
                }
                catch (Exception e)
                {
                    output = new CmdletOutput { ErrorResponse = e };
                }
                
                return output;
            }
            finally
            {
                if( _Code_ZipFileStream != null)
                {
                    _Code_ZipFileStream.Dispose();
                }
            }
        }
        
        public ExecutorContext CreateContext()
        {
            return new CmdletContext();
        }
        
        #endregion
        
        #region AWS Service Operation Call
        
        private Amazon.Synthetics.Model.CreateCanaryResponse CallAWSServiceOperation(IAmazonSynthetics client, Amazon.Synthetics.Model.CreateCanaryRequest request)
        {
            Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "Amazon CloudWatch Synthetics", "CreateCanary");
            try
            {
                #if DESKTOP
                return client.CreateCanary(request);
                #elif CORECLR
                return client.CreateCanaryAsync(request).GetAwaiter().GetResult();
                #else
                        #error "Unknown build edition"
                #endif
            }
            catch (AmazonServiceException exc)
            {
                var webException = exc.InnerException as System.Net.WebException;
                if (webException != null)
                {
                    throw new Exception(Utils.Common.FormatNameResolutionFailureMessage(client.Config, webException.Message), webException);
                }
                throw;
            }
        }
        
        #endregion
        
        internal partial class CmdletContext : ExecutorContext
        {
            public Amazon.Synthetics.EncryptionMode S3Encryption_EncryptionMode { get; set; }
            public System.String S3Encryption_KmsKeyArn { get; set; }
            public System.String ArtifactS3Location { get; set; }
            public System.String Code_Handler { get; set; }
            public System.String Code_S3Bucket { get; set; }
            public System.String Code_S3Key { get; set; }
            public System.String Code_S3Version { get; set; }
            public byte[] Code_ZipFile { get; set; }
            public System.String ExecutionRoleArn { get; set; }
            public System.Int32? FailureRetentionPeriodInDay { get; set; }
            public System.String Name { get; set; }
            public System.Boolean? RunConfig_ActiveTracing { get; set; }
            public Dictionary RunConfig_EnvironmentVariable { get; set; }
            public System.Int32? RunConfig_MemoryInMB { get; set; }
            public System.Int32? RunConfig_TimeoutInSecond { get; set; }
            public System.String RuntimeVersion { get; set; }
            public System.Int64? Schedule_DurationInSecond { get; set; }
            public System.String Schedule_Expression { get; set; }
            public System.Int32? SuccessRetentionPeriodInDay { get; set; }
            public Dictionary Tag { get; set; }
            public List VpcConfig_SecurityGroupId { get; set; }
            public List VpcConfig_SubnetId { get; set; }
            public System.Func Select { get; set; } =
                (response, cmdlet) => response.Canary;
        }
        
    }
}