/******************************************************************************* * 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.Route53; using Amazon.Route53.Model; namespace Amazon.PowerShell.Cmdlets.R53 { /// /// Updates an existing health check. Note that some values can't be updated. /// /// /// /// For more information about updating health checks, see Creating, /// Updating, and Deleting Health Checks in the Amazon Route 53 Developer Guide. /// /// [Cmdlet("Update", "R53HealthCheck", SupportsShouldProcess = true, ConfirmImpact = ConfirmImpact.Medium)] [OutputType("Amazon.Route53.Model.HealthCheck")] [AWSCmdlet("Calls the Amazon Route 53 UpdateHealthCheck API operation.", Operation = new[] {"UpdateHealthCheck"}, SelectReturnType = typeof(Amazon.Route53.Model.UpdateHealthCheckResponse))] [AWSCmdletOutput("Amazon.Route53.Model.HealthCheck or Amazon.Route53.Model.UpdateHealthCheckResponse", "This cmdlet returns an Amazon.Route53.Model.HealthCheck object.", "The service call response (type Amazon.Route53.Model.UpdateHealthCheckResponse) can also be referenced from properties attached to the cmdlet entry in the $AWSHistory stack." )] public partial class UpdateR53HealthCheckCmdlet : AmazonRoute53ClientCmdlet, IExecutor { #region Parameter ChildHealthCheck /// /// /// A complex type that contains one ChildHealthCheck element for each health /// check that you want to associate with a CALCULATED health check. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [Alias("ChildHealthChecks")] public System.String[] ChildHealthCheck { get; set; } #endregion #region Parameter Disabled /// /// /// Stops Route 53 from performing health checks. When you disable a health check, here's /// what happens:After you disable a health check, Route 53 considers the status of the health check /// to always be healthy. If you configured DNS failover, Route 53 continues to route /// traffic to the corresponding resources. If you want to stop routing traffic to a resource, /// change the value of Inverted. /// Charges for a health check still apply when the health check is disabled. For more /// information, see Amazon Route 53 /// Pricing. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Boolean? Disabled { get; set; } #endregion #region Parameter EnableSNI /// /// /// Specify whether you want Amazon Route 53 to send the value of FullyQualifiedDomainName /// to the endpoint in the client_hello message during TLS negotiation. /// This allows the endpoint to respond to HTTPS health check requests with /// the applicable SSL/TLS certificate.Some endpoints require that HTTPS requests include the host name in the client_hello /// message. If you don't enable SNI, the status of the health check will be SSL alert /// handshake_failure. A health check can also have that status for other /// reasons. If SNI is enabled and you're still getting the error, check the SSL/TLS configuration /// on your endpoint and confirm that your certificate is valid.The SSL/TLS certificate on your endpoint includes a domain name in the Common /// Name field and possibly several more in the Subject Alternative Names /// field. One of the domain names in the certificate should match the value that you /// specify for FullyQualifiedDomainName. If the endpoint responds to the /// client_hello message with a certificate that does not include the domain /// name that you specified in FullyQualifiedDomainName, a health checker /// will retry the handshake. In the second attempt, the health checker will omit FullyQualifiedDomainName /// from the client_hello message. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Boolean? EnableSNI { get; set; } #endregion #region Parameter FailureThreshold /// /// /// The number of consecutive health checks that an endpoint must pass or fail for Amazon /// Route 53 to change the current status of the endpoint from unhealthy to healthy or /// vice versa. For more information, see How /// Amazon Route 53 Determines Whether an Endpoint Is Healthy in the Amazon Route /// 53 Developer Guide.If you don't specify a value for FailureThreshold, the default value /// is three health checks. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Int32? FailureThreshold { get; set; } #endregion #region Parameter FullyQualifiedDomainName /// /// /// Amazon Route 53 behavior depends on whether you specify a value for IPAddress.If a health check already has a value for IPAddress, you can change the /// value. However, you can't update an existing health check to add or remove the value /// of IPAddress. If you specify a value forIPAddress:Route 53 sends health check requests to the specified IPv4 or IPv6 address and passes /// the value of FullyQualifiedDomainName in the Host header /// for all health checks except TCP health checks. This is typically the fully qualified /// DNS name of the endpoint on which you want Route 53 to perform health checks.When Route 53 checks the health of an endpoint, here is how it constructs the Host /// header:If you don't specify a value for FullyQualifiedDomainName, Route 53 substitutes /// the value of IPAddress in the Host header in each of the /// above cases.If you don't specify a value forIPAddress:If you don't specify a value for IPAddress, Route 53 sends a DNS request /// to the domain that you specify in FullyQualifiedDomainName at the interval /// you specify in RequestInterval. Using an IPv4 address that is returned /// by DNS, Route 53 then checks the health of the endpoint.If you don't specify a value for IPAddress, Route 53 uses only IPv4 to /// send health checks to the endpoint. If there's no resource record set with a type /// of A for the name that you specify for FullyQualifiedDomainName, the /// health check fails with a "DNS resolution failed" error.If you want to check the health of weighted, latency, or failover resource record /// sets and you choose to specify the endpoint only by FullyQualifiedDomainName, /// we recommend that you create a separate health check for each endpoint. For example, /// create a health check for each HTTP server that is serving content for www.example.com. /// For the value of FullyQualifiedDomainName, specify the domain name of /// the server (such as us-east-2-www.example.com), not the name of the resource /// record sets (www.example.com).In this configuration, if the value of FullyQualifiedDomainName matches /// the name of the resource record sets and you then associate the health check with /// those resource record sets, health check results will be unpredictable.In addition, if the value of Type is HTTP, HTTPS, /// HTTP_STR_MATCH, or HTTPS_STR_MATCH, Route 53 passes the /// value of FullyQualifiedDomainName in the Host header, as /// it does when you specify a value for IPAddress. If the value of Type /// is TCP, Route 53 doesn't pass a Host header. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String FullyQualifiedDomainName { get; set; } #endregion #region Parameter HealthCheckId /// /// /// The ID for the health check for which you want detailed information. When you created /// the health check, CreateHealthCheck returned the ID in the response, /// in the HealthCheckId element. /// /// #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 HealthCheckId { get; set; } #endregion #region Parameter HealthCheckVersion /// /// /// A sequential counter that Amazon Route 53 sets to 1 when you create a /// health check and increments by 1 each time you update settings for the health check.We recommend that you use GetHealthCheck or ListHealthChecks /// to get the current value of HealthCheckVersion for the health check that /// you want to update, and that you include that value in your UpdateHealthCheck /// request. This prevents Route 53 from overwriting an intervening update: /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Int64? HealthCheckVersion { get; set; } #endregion #region Parameter HealthThreshold /// /// /// The number of child health checks that are associated with a CALCULATED /// health that Amazon Route 53 must consider healthy for the CALCULATED /// health check to be considered healthy. To specify the child health checks that you /// want to associate with a CALCULATED health check, use the ChildHealthChecks /// and ChildHealthCheck elements.Note the following: /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Int32? HealthThreshold { get; set; } #endregion #region Parameter InsufficientDataHealthStatus /// /// /// When CloudWatch has insufficient data about the metric to determine the alarm state, /// the status that you want Amazon Route 53 to assign to the health check: /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [AWSConstantClassSource("Amazon.Route53.InsufficientDataHealthStatus")] public Amazon.Route53.InsufficientDataHealthStatus InsufficientDataHealthStatus { get; set; } #endregion #region Parameter Inverted /// /// /// Specify whether you want Amazon Route 53 to invert the status of a health check, for /// example, to consider a health check unhealthy when it otherwise would be considered /// healthy. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Boolean? Inverted { get; set; } #endregion #region Parameter IPAddress /// /// /// The IPv4 or IPv6 IP address for the endpoint that you want Amazon Route 53 to perform /// health checks on. If you don't specify a value for IPAddress, Route 53 /// sends a DNS request to resolve the domain name that you specify in FullyQualifiedDomainName /// at the interval that you specify in RequestInterval. Using an IP address /// that is returned by DNS, Route 53 then checks the health of the endpoint.Use one of the following formats for the value of IPAddress: If the endpoint is an EC2 instance, we recommend that you create an Elastic IP address, /// associate it with your EC2 instance, and specify the Elastic IP address for IPAddress. /// This ensures that the IP address of your instance never changes. For more information, /// see the applicable documentation:If a health check already has a value for IPAddress, you can change the /// value. However, you can't update an existing health check to add or remove the value /// of IPAddress. For more information, see FullyQualifiedDomainName. /// Constraints: Route 53 can't check the health of endpoints for which the IP address /// is in local, private, non-routable, or multicast ranges. For more information about /// IP addresses for which you can't create health checks, see the following documents: /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String IPAddress { get; set; } #endregion #region Parameter AlarmIdentifier_Name /// /// /// The name of the CloudWatch alarm that you want Amazon Route 53 health checkers to /// use to determine whether this health check is healthy.Route 53 supports CloudWatch alarms with the following features:
  • Standard-resolution metrics. High-resolution metrics aren't supported. For more information, /// see High-Resolution /// Metrics in the Amazon CloudWatch User Guide.
  • Statistics: Average, Minimum, Maximum, Sum, and SampleCount. Extended statistics aren't /// supported.
///
///
[System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String AlarmIdentifier_Name { get; set; } #endregion #region Parameter Port /// /// /// The port on the endpoint that you want Amazon Route 53 to perform health checks on.Don't specify a value for Port when you specify a value for Type /// of CLOUDWATCH_METRIC or CALCULATED. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.Int32? Port { get; set; } #endregion #region Parameter AlarmIdentifier_Region /// /// /// For the CloudWatch alarm that you want Route 53 health checkers to use to determine /// whether this health check is healthy, the region that the alarm was created in.For the current list of CloudWatch regions, see Amazon /// CloudWatch endpoints and quotas in the Amazon Web Services General Reference. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [AWSConstantClassSource("Amazon.Route53.CloudWatchRegion")] public Amazon.Route53.CloudWatchRegion AlarmIdentifier_Region { get; set; } #endregion #region Parameter HealthCheckRegion /// /// /// A complex type that contains one Region element for each region that /// you want Amazon Route 53 health checkers to check the specified endpoint from. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [Alias("Regions")] public System.String[] HealthCheckRegion { get; set; } #endregion #region Parameter ResetElement /// /// /// A complex type that contains one ResettableElementName element for each /// element that you want to reset to the default value. Valid values for ResettableElementName /// include the following: /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] [Alias("ResetElements")] public System.String[] ResetElement { get; set; } #endregion #region Parameter ResourcePath /// /// /// The path that you want Amazon Route 53 to request when performing health checks. The /// path can be any value for which your endpoint will return an HTTP status code of 2xx /// or 3xx when the endpoint is healthy, for example the file /docs/route53-health-check.html. /// You can also include query string parameters, for example, /welcome.html?language=jp&login=y. /// Specify this value only if you want to change it. /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String ResourcePath { get; set; } #endregion #region Parameter SearchString /// /// /// If the value of Type is HTTP_STR_MATCH or HTTPS_STR_MATCH, /// the string that you want Amazon Route 53 to search for in the response body from the /// specified resource. If the string appears in the response body, Route 53 considers /// the resource healthy. (You can't change the value of Type when you update /// a health check.) /// /// [System.Management.Automation.Parameter(ValueFromPipelineByPropertyName = true)] public System.String SearchString { get; set; } #endregion #region Parameter Select /// /// Use the -Select parameter to control the cmdlet output. The default value is 'HealthCheck'. /// Specifying -Select '*' will result in the cmdlet returning the whole service response (Amazon.Route53.Model.UpdateHealthCheckResponse). /// Specifying the name of a property of type Amazon.Route53.Model.UpdateHealthCheckResponse 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; } = "HealthCheck"; #endregion #region Parameter PassThru /// /// Changes the cmdlet behavior to return the value passed to the HealthCheckId parameter. /// The -PassThru parameter is deprecated, use -Select '^HealthCheckId' instead. This parameter will be removed in a future version. /// [System.Obsolete("The -PassThru parameter is deprecated, use -Select '^HealthCheckId' 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.HealthCheckId), MyInvocation.BoundParameters); if (!ConfirmShouldProceed(this.Force.IsPresent, resourceIdentifiersText, "Update-R53HealthCheck (UpdateHealthCheck)")) { 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.HealthCheckId; } #pragma warning restore CS0618, CS0612 //A class member was marked with the Obsolete attribute context.HealthCheckId = this.HealthCheckId; #if MODULAR if (this.HealthCheckId == null && ParameterWasBound(nameof(this.HealthCheckId))) { WriteWarning("You are passing $null as a value for parameter HealthCheckId 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.HealthCheckVersion = this.HealthCheckVersion; context.IPAddress = this.IPAddress; context.Port = this.Port; context.ResourcePath = this.ResourcePath; context.FullyQualifiedDomainName = this.FullyQualifiedDomainName; context.SearchString = this.SearchString; context.FailureThreshold = this.FailureThreshold; context.Inverted = this.Inverted; context.Disabled = this.Disabled; context.HealthThreshold = this.HealthThreshold; if (this.ChildHealthCheck != null) { context.ChildHealthCheck = new List(this.ChildHealthCheck); } context.EnableSNI = this.EnableSNI; if (this.HealthCheckRegion != null) { context.HealthCheckRegion = new List(this.HealthCheckRegion); } context.AlarmIdentifier_Region = this.AlarmIdentifier_Region; context.AlarmIdentifier_Name = this.AlarmIdentifier_Name; context.InsufficientDataHealthStatus = this.InsufficientDataHealthStatus; if (this.ResetElement != null) { context.ResetElement = new List(this.ResetElement); } // 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) { var cmdletContext = context as CmdletContext; // create request var request = new Amazon.Route53.Model.UpdateHealthCheckRequest(); if (cmdletContext.HealthCheckId != null) { request.HealthCheckId = cmdletContext.HealthCheckId; } if (cmdletContext.HealthCheckVersion != null) { request.HealthCheckVersion = cmdletContext.HealthCheckVersion.Value; } if (cmdletContext.IPAddress != null) { request.IPAddress = cmdletContext.IPAddress; } if (cmdletContext.Port != null) { request.Port = cmdletContext.Port.Value; } if (cmdletContext.ResourcePath != null) { request.ResourcePath = cmdletContext.ResourcePath; } if (cmdletContext.FullyQualifiedDomainName != null) { request.FullyQualifiedDomainName = cmdletContext.FullyQualifiedDomainName; } if (cmdletContext.SearchString != null) { request.SearchString = cmdletContext.SearchString; } if (cmdletContext.FailureThreshold != null) { request.FailureThreshold = cmdletContext.FailureThreshold.Value; } if (cmdletContext.Inverted != null) { request.Inverted = cmdletContext.Inverted.Value; } if (cmdletContext.Disabled != null) { request.Disabled = cmdletContext.Disabled.Value; } if (cmdletContext.HealthThreshold != null) { request.HealthThreshold = cmdletContext.HealthThreshold.Value; } if (cmdletContext.ChildHealthCheck != null) { request.ChildHealthChecks = cmdletContext.ChildHealthCheck; } if (cmdletContext.EnableSNI != null) { request.EnableSNI = cmdletContext.EnableSNI.Value; } if (cmdletContext.HealthCheckRegion != null) { request.Regions = cmdletContext.HealthCheckRegion; } // populate AlarmIdentifier var requestAlarmIdentifierIsNull = true; request.AlarmIdentifier = new Amazon.Route53.Model.AlarmIdentifier(); Amazon.Route53.CloudWatchRegion requestAlarmIdentifier_alarmIdentifier_Region = null; if (cmdletContext.AlarmIdentifier_Region != null) { requestAlarmIdentifier_alarmIdentifier_Region = cmdletContext.AlarmIdentifier_Region; } if (requestAlarmIdentifier_alarmIdentifier_Region != null) { request.AlarmIdentifier.Region = requestAlarmIdentifier_alarmIdentifier_Region; requestAlarmIdentifierIsNull = false; } System.String requestAlarmIdentifier_alarmIdentifier_Name = null; if (cmdletContext.AlarmIdentifier_Name != null) { requestAlarmIdentifier_alarmIdentifier_Name = cmdletContext.AlarmIdentifier_Name; } if (requestAlarmIdentifier_alarmIdentifier_Name != null) { request.AlarmIdentifier.Name = requestAlarmIdentifier_alarmIdentifier_Name; requestAlarmIdentifierIsNull = false; } // determine if request.AlarmIdentifier should be set to null if (requestAlarmIdentifierIsNull) { request.AlarmIdentifier = null; } if (cmdletContext.InsufficientDataHealthStatus != null) { request.InsufficientDataHealthStatus = cmdletContext.InsufficientDataHealthStatus; } if (cmdletContext.ResetElement != null) { request.ResetElements = cmdletContext.ResetElement; } 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; } public ExecutorContext CreateContext() { return new CmdletContext(); } #endregion #region AWS Service Operation Call private Amazon.Route53.Model.UpdateHealthCheckResponse CallAWSServiceOperation(IAmazonRoute53 client, Amazon.Route53.Model.UpdateHealthCheckRequest request) { Utils.Common.WriteVerboseEndpointMessage(this, client.Config, "Amazon Route 53", "UpdateHealthCheck"); try { #if DESKTOP return client.UpdateHealthCheck(request); #elif CORECLR return client.UpdateHealthCheckAsync(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 System.String HealthCheckId { get; set; } public System.Int64? HealthCheckVersion { get; set; } public System.String IPAddress { get; set; } public System.Int32? Port { get; set; } public System.String ResourcePath { get; set; } public System.String FullyQualifiedDomainName { get; set; } public System.String SearchString { get; set; } public System.Int32? FailureThreshold { get; set; } public System.Boolean? Inverted { get; set; } public System.Boolean? Disabled { get; set; } public System.Int32? HealthThreshold { get; set; } public List ChildHealthCheck { get; set; } public System.Boolean? EnableSNI { get; set; } public List HealthCheckRegion { get; set; } public Amazon.Route53.CloudWatchRegion AlarmIdentifier_Region { get; set; } public System.String AlarmIdentifier_Name { get; set; } public Amazon.Route53.InsufficientDataHealthStatus InsufficientDataHealthStatus { get; set; } public List ResetElement { get; set; } public System.Func Select { get; set; } = (response, cmdlet) => response.HealthCheck; } } }