# WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
# See https://github.com/aws-beam/aws-codegen for more details.

defmodule AWS.Route53RecoveryCluster do
  @moduledoc """
  Welcome to the Routing Control (Recovery Cluster) API Reference Guide for Amazon
  Route 53 Application Recovery Controller.

  With Route 53 ARC, you can use routing control with extreme reliability to
  recover applications by rerouting traffic across
  Availability Zones or Amazon Web Services Regions. Routing controls are simple
  on/off switches hosted
  on a highly available cluster in Route 53 ARC. A cluster provides a set of five
  redundant Regional endpoints against which you
  can run API calls to get or update the state of routing controls. To implement
  failover, you set
  one routing control to ON and another one to OFF, to reroute traffic from one
  Availability Zone or Amazon Web Services Region
  to another.

  *Be aware that you must specify a Regional endpoint for a cluster when you work
  with API cluster operations
  to get or update routing control states in Route 53 ARC.* In addition, you must
  specify the US West (Oregon) Region
  for Route 53 ARC API calls. For example, use the parameter `--region us-west-2`
  with AWS CLI commands.
  For more information, see
  [
  Get and update routing control states using the
  API](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.api.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

  This API guide includes information about the API operations for how to get and
  update routing control states
  in Route 53 ARC. To work with routing control in Route 53 ARC, you must first
  create the required components (clusters, control
  panels, and routing controls) using the recovery cluster configuration API.

  For more information about working with routing control in Route 53 ARC, see the
  following:

    *
  Create clusters, control panels, and routing controls by using API operations.
  For more information,
  see the [Recovery Control Configuration API Reference Guide for Amazon Route 53 Application Recovery
  Controller](https://docs.aws.amazon.com/recovery-cluster/latest/api/).

    *
  Learn about the components in recovery control, including clusters,
  routing controls, and control panels, and how to work with Route 53 ARC in the
  Amazon Web Services console. For more
  information, see [
  Recovery control
  components](https://docs.aws.amazon.com/r53recovery/latest/dg/introduction-components.html#introduction-components-routing)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

    *
  Route 53 ARC also provides readiness checks that continually audit resources to
  help make sure that your
  applications are scaled and ready to handle failover traffic. For more
  information about
  the related API operations, see the [Recovery Readiness API Reference Guide for Amazon Route 53 Application Recovery
  Controller](https://docs.aws.amazon.com/recovery-readiness/latest/api/).

    *
  For more information about creating resilient applications and preparing for
  recovery readiness with Route 53 ARC, see the [Amazon Route 53 Application Recovery Controller Developer
  Guide](https://docs.aws.amazon.com/r53recovery/latest/dg/).
  """

  alias AWS.Client
  alias AWS.Request

  @typedoc """

  ## Example:
      
      access_denied_exception() :: %{
        "message" => String.t() | atom()
      }
      
  """
  @type access_denied_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      conflict_exception() :: %{
        "message" => String.t() | atom(),
        "resourceId" => String.t() | atom(),
        "resourceType" => String.t() | atom()
      }
      
  """
  @type conflict_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      endpoint_temporarily_unavailable_exception() :: %{
        "message" => String.t() | atom()
      }
      
  """
  @type endpoint_temporarily_unavailable_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_routing_control_state_request() :: %{
        required("RoutingControlArn") => String.t() | atom()
      }
      
  """
  @type get_routing_control_state_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      get_routing_control_state_response() :: %{
        "RoutingControlArn" => String.t() | atom(),
        "RoutingControlName" => String.t() | atom(),
        "RoutingControlState" => list(any())
      }
      
  """
  @type get_routing_control_state_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      internal_server_exception() :: %{
        "message" => String.t() | atom(),
        "retryAfterSeconds" => integer()
      }
      
  """
  @type internal_server_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_routing_controls_request() :: %{
        optional("ControlPanelArn") => String.t() | atom(),
        optional("MaxResults") => integer(),
        optional("NextToken") => String.t() | atom()
      }
      
  """
  @type list_routing_controls_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      list_routing_controls_response() :: %{
        "NextToken" => String.t() | atom(),
        "RoutingControls" => list(routing_control())
      }
      
  """
  @type list_routing_controls_response() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      resource_not_found_exception() :: %{
        "message" => String.t() | atom(),
        "resourceId" => String.t() | atom(),
        "resourceType" => String.t() | atom()
      }
      
  """
  @type resource_not_found_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      routing_control() :: %{
        "ControlPanelArn" => String.t() | atom(),
        "ControlPanelName" => String.t() | atom(),
        "Owner" => String.t() | atom(),
        "RoutingControlArn" => String.t() | atom(),
        "RoutingControlName" => String.t() | atom(),
        "RoutingControlState" => list(any())
      }
      
  """
  @type routing_control() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      service_limit_exceeded_exception() :: %{
        "limitCode" => String.t() | atom(),
        "message" => String.t() | atom(),
        "resourceId" => String.t() | atom(),
        "resourceType" => String.t() | atom(),
        "serviceCode" => String.t() | atom()
      }
      
  """
  @type service_limit_exceeded_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      throttling_exception() :: %{
        "message" => String.t() | atom(),
        "retryAfterSeconds" => integer()
      }
      
  """
  @type throttling_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_routing_control_state_entry() :: %{
        "RoutingControlArn" => String.t() | atom(),
        "RoutingControlState" => list(any())
      }
      
  """
  @type update_routing_control_state_entry() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_routing_control_state_request() :: %{
        optional("SafetyRulesToOverride") => list(String.t() | atom()),
        required("RoutingControlArn") => String.t() | atom(),
        required("RoutingControlState") => list(any())
      }
      
  """
  @type update_routing_control_state_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_routing_control_state_response() :: %{}
      
  """
  @type update_routing_control_state_response() :: %{}

  @typedoc """

  ## Example:
      
      update_routing_control_states_request() :: %{
        optional("SafetyRulesToOverride") => list(String.t() | atom()),
        required("UpdateRoutingControlStateEntries") => list(update_routing_control_state_entry())
      }
      
  """
  @type update_routing_control_states_request() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      update_routing_control_states_response() :: %{}
      
  """
  @type update_routing_control_states_response() :: %{}

  @typedoc """

  ## Example:
      
      validation_exception() :: %{
        "fields" => list(validation_exception_field()),
        "message" => String.t() | atom(),
        "reason" => list(any())
      }
      
  """
  @type validation_exception() :: %{(String.t() | atom()) => any()}

  @typedoc """

  ## Example:
      
      validation_exception_field() :: %{
        "message" => String.t() | atom(),
        "name" => String.t() | atom()
      }
      
  """
  @type validation_exception_field() :: %{(String.t() | atom()) => any()}

  @type get_routing_control_state_errors() ::
          validation_exception()
          | throttling_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | endpoint_temporarily_unavailable_exception()
          | access_denied_exception()

  @type list_routing_controls_errors() ::
          validation_exception()
          | throttling_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | endpoint_temporarily_unavailable_exception()
          | access_denied_exception()

  @type update_routing_control_state_errors() ::
          validation_exception()
          | throttling_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | endpoint_temporarily_unavailable_exception()
          | conflict_exception()
          | access_denied_exception()

  @type update_routing_control_states_errors() ::
          validation_exception()
          | throttling_exception()
          | service_limit_exceeded_exception()
          | resource_not_found_exception()
          | internal_server_exception()
          | endpoint_temporarily_unavailable_exception()
          | conflict_exception()
          | access_denied_exception()

  def metadata do
    %{
      api_version: "2019-12-02",
      content_type: "application/x-amz-json-1.0",
      credential_scope: nil,
      endpoint_prefix: "route53-recovery-cluster",
      global?: false,
      hostname: nil,
      protocol: "json",
      service_id: "Route53 Recovery Cluster",
      signature_version: "v4",
      signing_name: "route53-recovery-cluster",
      target_prefix: "ToggleCustomerAPI"
    }
  end

  @doc """
  Get the state for a routing control.

  A routing control is a simple on/off switch that you
  can use to route traffic to cells. When a routing control state is set to ON,
  traffic flows to a cell. When
  the state is set to OFF, traffic does not flow.

  Before you can create a routing control, you must first create a cluster, and
  then host the control
  in a control panel on the cluster. For more information, see [
  Create routing control
  structures](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.create.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.
  You access one of the endpoints for the cluster to get or update the routing
  control state to
  redirect traffic for your application.

  *You must specify Regional endpoints when you work with API cluster operations
  to get or update routing control states in Route 53 ARC.*

  To see a code example for getting a routing control state, including accessing
  Regional cluster endpoints
  in sequence, see [API examples](https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

  Learn more about working with routing controls in the following topics in the
  Amazon Route 53 Application Recovery Controller Developer Guide:

    *

  [
  Viewing and updating routing control
  states](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html)

    *

  [Working with routing controls in Route 53
  ARC](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html)
  """
  @spec get_routing_control_state(map(), get_routing_control_state_request(), list()) ::
          {:ok, get_routing_control_state_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, get_routing_control_state_errors()}
  def get_routing_control_state(%Client{} = client, input, options \\ []) do
    meta = metadata()

    Request.request_post(client, meta, "GetRoutingControlState", input, options)
  end

  @doc """
  List routing control names and Amazon Resource Names (ARNs), as well as the
  routing control
  state for each routing control, along with the control panel name and control
  panel ARN for the routing controls.

  If you specify a control panel ARN, this call lists the routing controls in the
  control panel. Otherwise, it lists
  all the routing controls in the cluster.

  A routing control is a simple on/off switch in Route 53 ARC that you
  can use to route traffic to cells. When a routing control state is set to ON,
  traffic flows to a cell. When
  the state is set to OFF, traffic does not flow.

  Before you can create a routing control, you must first create a cluster, and
  then host the control
  in a control panel on the cluster. For more information, see [
  Create routing control
  structures](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.create.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.
  You access one of the endpoints for the cluster to get or update the routing
  control state to
  redirect traffic for your application.

  *You must specify Regional endpoints when you work with API cluster operations
  to use this API operation to list routing controls in Route 53 ARC.*

  Learn more about working with routing controls in the following topics in the
  Amazon Route 53 Application Recovery Controller Developer Guide:

    *

  [
  Viewing and updating routing control
  states](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html)

    *

  [Working with routing controls in Route 53
  ARC](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html)
  """
  @spec list_routing_controls(map(), list_routing_controls_request(), list()) ::
          {:ok, list_routing_controls_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, list_routing_controls_errors()}
  def list_routing_controls(%Client{} = client, input, options \\ []) do
    meta = metadata()

    Request.request_post(client, meta, "ListRoutingControls", input, options)
  end

  @doc """
  Set the state of the routing control to reroute traffic.

  You can set the value to ON or
  OFF. When the state is ON, traffic flows to a cell. When the state is OFF,
  traffic does not
  flow.

  With Route 53 ARC, you can add safety rules for routing controls, which are
  safeguards for routing
  control state updates that help prevent unexpected outcomes, like fail open
  traffic routing. However,
  there are scenarios when you might want to bypass the routing control safeguards
  that are enforced with
  safety rules that you've configured. For example, you might want to fail over
  quickly for disaster recovery,
  and one or more safety rules might be unexpectedly preventing you from updating
  a routing control state to
  reroute traffic. In a "break glass" scenario like this, you can override one or
  more safety rules to change
  a routing control state and fail over your application.

  The `SafetyRulesToOverride` property enables you override one or more safety
  rules and
  update routing control states. For more information, see
  [
  Override safety rules to reroute
  traffic](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

  *You must specify Regional endpoints when you work with API cluster operations
  to get or update routing control states in Route 53 ARC.*

  To see a code example for getting a routing control state, including accessing
  Regional cluster endpoints
  in sequence, see [API examples](https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

    *

  [
  Viewing and updating routing control
  states](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html)

    *

  [Working with routing controls overall](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html)
  """
  @spec update_routing_control_state(map(), update_routing_control_state_request(), list()) ::
          {:ok, update_routing_control_state_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_routing_control_state_errors()}
  def update_routing_control_state(%Client{} = client, input, options \\ []) do
    meta = metadata()

    Request.request_post(client, meta, "UpdateRoutingControlState", input, options)
  end

  @doc """
  Set multiple routing control states.

  You can set the value for each state to be ON or OFF.
  When the state is ON, traffic flows to a cell. When it's OFF, traffic does not
  flow.

  With Route 53 ARC, you can add safety rules for routing controls, which are
  safeguards for routing
  control state updates that help prevent unexpected outcomes, like fail open
  traffic routing. However,
  there are scenarios when you might want to bypass the routing control safeguards
  that are enforced with
  safety rules that you've configured. For example, you might want to fail over
  quickly for disaster recovery,
  and one or more safety rules might be unexpectedly preventing you from updating
  a routing control state to
  reroute traffic. In a "break glass" scenario like this, you can override one or
  more safety rules to change
  a routing control state and fail over your application.

  The `SafetyRulesToOverride` property enables you override one or more safety
  rules and
  update routing control states. For more information, see
  [
  Override safety rules to reroute
  traffic](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.override-safety-rule.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

  *You must specify Regional endpoints when you work with API cluster operations
  to get or update routing control states in Route 53 ARC.*

  To see a code example for getting a routing control state, including accessing
  Regional cluster endpoints
  in sequence, see [API examples](https://docs.aws.amazon.com/r53recovery/latest/dg/service_code_examples_actions.html)
  in the Amazon Route 53 Application Recovery Controller Developer Guide.

    *

  [
  Viewing and updating routing control
  states](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.update.html)

    *

  [Working with routing controls overall](https://docs.aws.amazon.com/r53recovery/latest/dg/routing-control.html)
  """
  @spec update_routing_control_states(map(), update_routing_control_states_request(), list()) ::
          {:ok, update_routing_control_states_response(), any()}
          | {:error, {:unexpected_response, any()}}
          | {:error, term()}
          | {:error, update_routing_control_states_errors()}
  def update_routing_control_states(%Client{} = client, input, options \\ []) do
    meta = metadata()

    Request.request_post(client, meta, "UpdateRoutingControlStates", input, options)
  end
end
