{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.Route53AutoNaming.Types.HealthCheckConfig
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.Route53AutoNaming.Types.HealthCheckConfig where

import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import Amazonka.Route53AutoNaming.Types.HealthCheckType

-- | /Public DNS and HTTP namespaces only./ A complex type that contains
-- settings for an optional health check. If you specify settings for a
-- health check, Cloud Map associates the health check with the records
-- that you specify in @DnsConfig@.
--
-- If you specify a health check configuration, you can specify either
-- @HealthCheckCustomConfig@ or @HealthCheckConfig@ but not both.
--
-- Health checks are basic Route 53 health checks that monitor an Amazon
-- Web Services endpoint. For information about pricing for health checks,
-- see <http://aws.amazon.com/route53/pricing/ Amazon Route 53 Pricing>.
--
-- Note the following about configuring health checks.
--
-- [A and AAAA records]
--     If @DnsConfig@ includes configurations for both @A@ and @AAAA@
--     records, Cloud Map creates a health check that uses the IPv4 address
--     to check the health of the resource. If the endpoint tthat\'s
--     specified by the IPv4 address is unhealthy, Route 53 considers both
--     the @A@ and @AAAA@ records to be unhealthy.
--
-- [CNAME records]
--     You can\'t specify settings for @HealthCheckConfig@ when the
--     @DNSConfig@ includes @CNAME@ for the value of @Type@. If you do, the
--     @CreateService@ request will fail with an @InvalidInput@ error.
--
-- [Request interval]
--     A Route 53 health checker in each health-checking Amazon Web
--     Services Region sends a health check request to an endpoint every 30
--     seconds. On average, your endpoint receives a health check request
--     about every two seconds. However, health checkers don\'t coordinate
--     with one another. Therefore, you might sometimes see several
--     requests in one second that\'s followed by a few seconds with no
--     health checks at all.
--
-- [Health checking regions]
--     Health checkers perform checks from all Route 53 health-checking
--     Regions. For a list of the current Regions, see
--     <https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html#Route53-Type-HealthCheckConfig-Regions Regions>.
--
-- [Alias records]
--     When you register an instance, if you include the
--     @AWS_ALIAS_DNS_NAME@ attribute, Cloud Map creates a Route 53 alias
--     record. Note the following:
--
--     -   Route 53 automatically sets @EvaluateTargetHealth@ to true for
--         alias records. When @EvaluateTargetHealth@ is true, the alias
--         record inherits the health of the referenced Amazon Web Services
--         resource. such as an ELB load balancer. For more information,
--         see
--         <https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html#Route53-Type-AliasTarget-EvaluateTargetHealth EvaluateTargetHealth>.
--
--     -   If you include @HealthCheckConfig@ and then use the service to
--         register an instance that creates an alias record, Route 53
--         doesn\'t create the health check.
--
-- [Charges for health checks]
--     Health checks are basic Route 53 health checks that monitor an
--     Amazon Web Services endpoint. For information about pricing for
--     health checks, see
--     <http://aws.amazon.com/route53/pricing/ Amazon Route 53 Pricing>.
--
-- /See:/ 'newHealthCheckConfig' smart constructor.
data HealthCheckConfig = HealthCheckConfig'
  { -- | The number of consecutive health checks that an endpoint must pass or
    -- fail for Route 53 to change the current status of the endpoint from
    -- unhealthy to healthy or the other way around. For more information, see
    -- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
    -- in the /Route 53 Developer Guide/.
    HealthCheckConfig -> Maybe Natural
failureThreshold :: Prelude.Maybe Prelude.Natural,
    -- | The path that you want Route 53 to request when performing health
    -- checks. The path can be any value that your endpoint returns an HTTP
    -- status code of a 2xx or 3xx format for when the endpoint is healthy. An
    -- example file is @\/docs\/route53-health-check.html@. Route 53
    -- automatically adds the DNS name for the service. If you don\'t specify a
    -- value for @ResourcePath@, the default value is @\/@.
    --
    -- If you specify @TCP@ for @Type@, you must /not/ specify a value for
    -- @ResourcePath@.
    HealthCheckConfig -> Maybe Text
resourcePath :: Prelude.Maybe Prelude.Text,
    -- | The type of health check that you want to create, which indicates how
    -- Route 53 determines whether an endpoint is healthy.
    --
    -- You can\'t change the value of @Type@ after you create a health check.
    --
    -- You can create the following types of health checks:
    --
    -- -   __HTTP__: Route 53 tries to establish a TCP connection. If
    --     successful, Route 53 submits an HTTP request and waits for an HTTP
    --     status code of 200 or greater and less than 400.
    --
    -- -   __HTTPS__: Route 53 tries to establish a TCP connection. If
    --     successful, Route 53 submits an HTTPS request and waits for an HTTP
    --     status code of 200 or greater and less than 400.
    --
    --     If you specify HTTPS for the value of @Type@, the endpoint must
    --     support TLS v1.0 or later.
    --
    -- -   __TCP__: Route 53 tries to establish a TCP connection.
    --
    --     If you specify @TCP@ for @Type@, don\'t specify a value for
    --     @ResourcePath@.
    --
    -- For more information, see
    -- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
    -- in the /Route 53 Developer Guide/.
    HealthCheckConfig -> HealthCheckType
type' :: HealthCheckType
  }
  deriving (HealthCheckConfig -> HealthCheckConfig -> Bool
(HealthCheckConfig -> HealthCheckConfig -> Bool)
-> (HealthCheckConfig -> HealthCheckConfig -> Bool)
-> Eq HealthCheckConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: HealthCheckConfig -> HealthCheckConfig -> Bool
$c/= :: HealthCheckConfig -> HealthCheckConfig -> Bool
== :: HealthCheckConfig -> HealthCheckConfig -> Bool
$c== :: HealthCheckConfig -> HealthCheckConfig -> Bool
Prelude.Eq, ReadPrec [HealthCheckConfig]
ReadPrec HealthCheckConfig
Int -> ReadS HealthCheckConfig
ReadS [HealthCheckConfig]
(Int -> ReadS HealthCheckConfig)
-> ReadS [HealthCheckConfig]
-> ReadPrec HealthCheckConfig
-> ReadPrec [HealthCheckConfig]
-> Read HealthCheckConfig
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [HealthCheckConfig]
$creadListPrec :: ReadPrec [HealthCheckConfig]
readPrec :: ReadPrec HealthCheckConfig
$creadPrec :: ReadPrec HealthCheckConfig
readList :: ReadS [HealthCheckConfig]
$creadList :: ReadS [HealthCheckConfig]
readsPrec :: Int -> ReadS HealthCheckConfig
$creadsPrec :: Int -> ReadS HealthCheckConfig
Prelude.Read, Int -> HealthCheckConfig -> ShowS
[HealthCheckConfig] -> ShowS
HealthCheckConfig -> String
(Int -> HealthCheckConfig -> ShowS)
-> (HealthCheckConfig -> String)
-> ([HealthCheckConfig] -> ShowS)
-> Show HealthCheckConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [HealthCheckConfig] -> ShowS
$cshowList :: [HealthCheckConfig] -> ShowS
show :: HealthCheckConfig -> String
$cshow :: HealthCheckConfig -> String
showsPrec :: Int -> HealthCheckConfig -> ShowS
$cshowsPrec :: Int -> HealthCheckConfig -> ShowS
Prelude.Show, (forall x. HealthCheckConfig -> Rep HealthCheckConfig x)
-> (forall x. Rep HealthCheckConfig x -> HealthCheckConfig)
-> Generic HealthCheckConfig
forall x. Rep HealthCheckConfig x -> HealthCheckConfig
forall x. HealthCheckConfig -> Rep HealthCheckConfig x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep HealthCheckConfig x -> HealthCheckConfig
$cfrom :: forall x. HealthCheckConfig -> Rep HealthCheckConfig x
Prelude.Generic)

-- |
-- Create a value of 'HealthCheckConfig' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'failureThreshold', 'healthCheckConfig_failureThreshold' - The number of consecutive health checks that an endpoint must pass or
-- fail for Route 53 to change the current status of the endpoint from
-- unhealthy to healthy or the other way around. For more information, see
-- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
-- in the /Route 53 Developer Guide/.
--
-- 'resourcePath', 'healthCheckConfig_resourcePath' - The path that you want Route 53 to request when performing health
-- checks. The path can be any value that your endpoint returns an HTTP
-- status code of a 2xx or 3xx format for when the endpoint is healthy. An
-- example file is @\/docs\/route53-health-check.html@. Route 53
-- automatically adds the DNS name for the service. If you don\'t specify a
-- value for @ResourcePath@, the default value is @\/@.
--
-- If you specify @TCP@ for @Type@, you must /not/ specify a value for
-- @ResourcePath@.
--
-- 'type'', 'healthCheckConfig_type' - The type of health check that you want to create, which indicates how
-- Route 53 determines whether an endpoint is healthy.
--
-- You can\'t change the value of @Type@ after you create a health check.
--
-- You can create the following types of health checks:
--
-- -   __HTTP__: Route 53 tries to establish a TCP connection. If
--     successful, Route 53 submits an HTTP request and waits for an HTTP
--     status code of 200 or greater and less than 400.
--
-- -   __HTTPS__: Route 53 tries to establish a TCP connection. If
--     successful, Route 53 submits an HTTPS request and waits for an HTTP
--     status code of 200 or greater and less than 400.
--
--     If you specify HTTPS for the value of @Type@, the endpoint must
--     support TLS v1.0 or later.
--
-- -   __TCP__: Route 53 tries to establish a TCP connection.
--
--     If you specify @TCP@ for @Type@, don\'t specify a value for
--     @ResourcePath@.
--
-- For more information, see
-- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
-- in the /Route 53 Developer Guide/.
newHealthCheckConfig ::
  -- | 'type''
  HealthCheckType ->
  HealthCheckConfig
newHealthCheckConfig :: HealthCheckType -> HealthCheckConfig
newHealthCheckConfig HealthCheckType
pType_ =
  HealthCheckConfig' :: Maybe Natural -> Maybe Text -> HealthCheckType -> HealthCheckConfig
HealthCheckConfig'
    { $sel:failureThreshold:HealthCheckConfig' :: Maybe Natural
failureThreshold =
        Maybe Natural
forall a. Maybe a
Prelude.Nothing,
      $sel:resourcePath:HealthCheckConfig' :: Maybe Text
resourcePath = Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:type':HealthCheckConfig' :: HealthCheckType
type' = HealthCheckType
pType_
    }

-- | The number of consecutive health checks that an endpoint must pass or
-- fail for Route 53 to change the current status of the endpoint from
-- unhealthy to healthy or the other way around. For more information, see
-- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
-- in the /Route 53 Developer Guide/.
healthCheckConfig_failureThreshold :: Lens.Lens' HealthCheckConfig (Prelude.Maybe Prelude.Natural)
healthCheckConfig_failureThreshold :: (Maybe Natural -> f (Maybe Natural))
-> HealthCheckConfig -> f HealthCheckConfig
healthCheckConfig_failureThreshold = (HealthCheckConfig -> Maybe Natural)
-> (HealthCheckConfig -> Maybe Natural -> HealthCheckConfig)
-> Lens
     HealthCheckConfig HealthCheckConfig (Maybe Natural) (Maybe Natural)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HealthCheckConfig' {Maybe Natural
failureThreshold :: Maybe Natural
$sel:failureThreshold:HealthCheckConfig' :: HealthCheckConfig -> Maybe Natural
failureThreshold} -> Maybe Natural
failureThreshold) (\s :: HealthCheckConfig
s@HealthCheckConfig' {} Maybe Natural
a -> HealthCheckConfig
s {$sel:failureThreshold:HealthCheckConfig' :: Maybe Natural
failureThreshold = Maybe Natural
a} :: HealthCheckConfig)

-- | The path that you want Route 53 to request when performing health
-- checks. The path can be any value that your endpoint returns an HTTP
-- status code of a 2xx or 3xx format for when the endpoint is healthy. An
-- example file is @\/docs\/route53-health-check.html@. Route 53
-- automatically adds the DNS name for the service. If you don\'t specify a
-- value for @ResourcePath@, the default value is @\/@.
--
-- If you specify @TCP@ for @Type@, you must /not/ specify a value for
-- @ResourcePath@.
healthCheckConfig_resourcePath :: Lens.Lens' HealthCheckConfig (Prelude.Maybe Prelude.Text)
healthCheckConfig_resourcePath :: (Maybe Text -> f (Maybe Text))
-> HealthCheckConfig -> f HealthCheckConfig
healthCheckConfig_resourcePath = (HealthCheckConfig -> Maybe Text)
-> (HealthCheckConfig -> Maybe Text -> HealthCheckConfig)
-> Lens
     HealthCheckConfig HealthCheckConfig (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HealthCheckConfig' {Maybe Text
resourcePath :: Maybe Text
$sel:resourcePath:HealthCheckConfig' :: HealthCheckConfig -> Maybe Text
resourcePath} -> Maybe Text
resourcePath) (\s :: HealthCheckConfig
s@HealthCheckConfig' {} Maybe Text
a -> HealthCheckConfig
s {$sel:resourcePath:HealthCheckConfig' :: Maybe Text
resourcePath = Maybe Text
a} :: HealthCheckConfig)

-- | The type of health check that you want to create, which indicates how
-- Route 53 determines whether an endpoint is healthy.
--
-- You can\'t change the value of @Type@ after you create a health check.
--
-- You can create the following types of health checks:
--
-- -   __HTTP__: Route 53 tries to establish a TCP connection. If
--     successful, Route 53 submits an HTTP request and waits for an HTTP
--     status code of 200 or greater and less than 400.
--
-- -   __HTTPS__: Route 53 tries to establish a TCP connection. If
--     successful, Route 53 submits an HTTPS request and waits for an HTTP
--     status code of 200 or greater and less than 400.
--
--     If you specify HTTPS for the value of @Type@, the endpoint must
--     support TLS v1.0 or later.
--
-- -   __TCP__: Route 53 tries to establish a TCP connection.
--
--     If you specify @TCP@ for @Type@, don\'t specify a value for
--     @ResourcePath@.
--
-- For more information, see
-- <https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html How Route 53 Determines Whether an Endpoint Is Healthy>
-- in the /Route 53 Developer Guide/.
healthCheckConfig_type :: Lens.Lens' HealthCheckConfig HealthCheckType
healthCheckConfig_type :: (HealthCheckType -> f HealthCheckType)
-> HealthCheckConfig -> f HealthCheckConfig
healthCheckConfig_type = (HealthCheckConfig -> HealthCheckType)
-> (HealthCheckConfig -> HealthCheckType -> HealthCheckConfig)
-> Lens
     HealthCheckConfig HealthCheckConfig HealthCheckType HealthCheckType
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\HealthCheckConfig' {HealthCheckType
type' :: HealthCheckType
$sel:type':HealthCheckConfig' :: HealthCheckConfig -> HealthCheckType
type'} -> HealthCheckType
type') (\s :: HealthCheckConfig
s@HealthCheckConfig' {} HealthCheckType
a -> HealthCheckConfig
s {$sel:type':HealthCheckConfig' :: HealthCheckType
type' = HealthCheckType
a} :: HealthCheckConfig)

instance Core.FromJSON HealthCheckConfig where
  parseJSON :: Value -> Parser HealthCheckConfig
parseJSON =
    String
-> (Object -> Parser HealthCheckConfig)
-> Value
-> Parser HealthCheckConfig
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Core.withObject
      String
"HealthCheckConfig"
      ( \Object
x ->
          Maybe Natural -> Maybe Text -> HealthCheckType -> HealthCheckConfig
HealthCheckConfig'
            (Maybe Natural
 -> Maybe Text -> HealthCheckType -> HealthCheckConfig)
-> Parser (Maybe Natural)
-> Parser (Maybe Text -> HealthCheckType -> HealthCheckConfig)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x Object -> Text -> Parser (Maybe Natural)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Core..:? Text
"FailureThreshold")
            Parser (Maybe Text -> HealthCheckType -> HealthCheckConfig)
-> Parser (Maybe Text)
-> Parser (HealthCheckType -> HealthCheckConfig)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x Object -> Text -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
Core..:? Text
"ResourcePath")
            Parser (HealthCheckType -> HealthCheckConfig)
-> Parser HealthCheckType -> Parser HealthCheckConfig
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x Object -> Text -> Parser HealthCheckType
forall a. FromJSON a => Object -> Text -> Parser a
Core..: Text
"Type")
      )

instance Prelude.Hashable HealthCheckConfig

instance Prelude.NFData HealthCheckConfig

instance Core.ToJSON HealthCheckConfig where
  toJSON :: HealthCheckConfig -> Value
toJSON HealthCheckConfig' {Maybe Natural
Maybe Text
HealthCheckType
type' :: HealthCheckType
resourcePath :: Maybe Text
failureThreshold :: Maybe Natural
$sel:type':HealthCheckConfig' :: HealthCheckConfig -> HealthCheckType
$sel:resourcePath:HealthCheckConfig' :: HealthCheckConfig -> Maybe Text
$sel:failureThreshold:HealthCheckConfig' :: HealthCheckConfig -> Maybe Natural
..} =
    [Pair] -> Value
Core.object
      ( [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Text
"FailureThreshold" Text -> Natural -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=)
              (Natural -> Pair) -> Maybe Natural -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Natural
failureThreshold,
            (Text
"ResourcePath" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..=) (Text -> Pair) -> Maybe Text -> Maybe Pair
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
resourcePath,
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"Type" Text -> HealthCheckType -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= HealthCheckType
type')
          ]
      )