{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# 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.RegisterInstance
-- 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)
--
-- Creates or updates one or more records and, optionally, creates a health
-- check based on the settings in a specified service. When you submit a
-- @RegisterInstance@ request, the following occurs:
--
-- -   For each DNS record that you define in the service that\'s specified
--     by @ServiceId@, a record is created or updated in the hosted zone
--     that\'s associated with the corresponding namespace.
--
-- -   If the service includes @HealthCheckConfig@, a health check is
--     created based on the settings in the health check configuration.
--
-- -   The health check, if any, is associated with each of the new or
--     updated records.
--
-- One @RegisterInstance@ request must complete before you can submit
-- another request and specify the same service ID and instance ID.
--
-- For more information, see
-- <https://docs.aws.amazon.com/cloud-map/latest/api/API_CreateService.html CreateService>.
--
-- When Cloud Map receives a DNS query for the specified DNS name, it
-- returns the applicable value:
--
-- -   __If the health check is healthy__: returns all the records
--
-- -   __If the health check is unhealthy__: returns the applicable value
--     for the last healthy instance
--
-- -   __If you didn\'t specify a health check configuration__: returns all
--     the records
--
-- For the current quota on the number of instances that you can register
-- using the same namespace and using the same service, see
-- <https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-limits.html Cloud Map quotas>
-- in the /Cloud Map Developer Guide/.
module Amazonka.Route53AutoNaming.RegisterInstance
  ( -- * Creating a Request
    RegisterInstance (..),
    newRegisterInstance,

    -- * Request Lenses
    registerInstance_creatorRequestId,
    registerInstance_serviceId,
    registerInstance_instanceId,
    registerInstance_attributes,

    -- * Destructuring the Response
    RegisterInstanceResponse (..),
    newRegisterInstanceResponse,

    -- * Response Lenses
    registerInstanceResponse_operationId,
    registerInstanceResponse_httpStatus,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.Route53AutoNaming.Types

-- | /See:/ 'newRegisterInstance' smart constructor.
data RegisterInstance = RegisterInstance'
  { -- | A unique string that identifies the request and that allows failed
    -- @RegisterInstance@ requests to be retried without the risk of executing
    -- the operation twice. You must use a unique @CreatorRequestId@ string
    -- every time you submit a @RegisterInstance@ request if you\'re
    -- registering additional instances for the same namespace and service.
    -- @CreatorRequestId@ can be any unique string (for example, a date\/time
    -- stamp).
    RegisterInstance -> Maybe Text
creatorRequestId :: Prelude.Maybe Prelude.Text,
    -- | The ID of the service that you want to use for settings for the
    -- instance.
    RegisterInstance -> Text
serviceId :: Prelude.Text,
    -- | An identifier that you want to associate with the instance. Note the
    -- following:
    --
    -- -   If the service that\'s specified by @ServiceId@ includes settings
    --     for an @SRV@ record, the value of @InstanceId@ is automatically
    --     included as part of the value for the @SRV@ record. For more
    --     information, see
    --     <https://docs.aws.amazon.com/cloud-map/latest/api/API_DnsRecord.html#cloudmap-Type-DnsRecord-Type DnsRecord > Type>.
    --
    -- -   You can use this value to update an existing instance.
    --
    -- -   To register a new instance, you must specify a value that\'s unique
    --     among instances that you register by using the same service.
    --
    -- -   If you specify an existing @InstanceId@ and @ServiceId@, Cloud Map
    --     updates the existing DNS records, if any. If there\'s also an
    --     existing health check, Cloud Map deletes the old health check and
    --     creates a new one.
    --
    --     The health check isn\'t deleted immediately, so it will still appear
    --     for a while if you submit a @ListHealthChecks@ request, for example.
    RegisterInstance -> Text
instanceId :: Prelude.Text,
    -- | A string map that contains the following information for the service
    -- that you specify in @ServiceId@:
    --
    -- -   The attributes that apply to the records that are defined in the
    --     service.
    --
    -- -   For each attribute, the applicable value.
    --
    -- Supported attribute keys include the following:
    --
    -- [AWS_ALIAS_DNS_NAME]
    --     If you want Cloud Map to create an Amazon Route 53 alias record that
    --     routes traffic to an Elastic Load Balancing load balancer, specify
    --     the DNS name that\'s associated with the load balancer. For
    --     information about how to get the DNS name, see \"DNSName\" in the
    --     topic
    --     <https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html AliasTarget>
    --     in the /Route 53 API Reference/.
    --
    --     Note the following:
    --
    --     -   The configuration for the service that\'s specified by
    --         @ServiceId@ must include settings for an @A@ record, an @AAAA@
    --         record, or both.
    --
    --     -   In the service that\'s specified by @ServiceId@, the value of
    --         @RoutingPolicy@ must be @WEIGHTED@.
    --
    --     -   If the service that\'s specified by @ServiceId@ includes
    --         @HealthCheckConfig@ settings, Cloud Map will create the Route 53
    --         health check, but it doesn\'t associate the health check with
    --         the alias record.
    --
    --     -   Auto naming currently doesn\'t support creating alias records
    --         that route traffic to Amazon Web Services resources other than
    --         Elastic Load Balancing load balancers.
    --
    --     -   If you specify a value for @AWS_ALIAS_DNS_NAME@, don\'t specify
    --         values for any of the @AWS_INSTANCE@ attributes.
    --
    -- [AWS_EC2_INSTANCE_ID]
    --     /HTTP namespaces only./ The Amazon EC2 instance ID for the instance.
    --     If the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the only
    --     other attribute that can be specified is @AWS_INIT_HEALTH_STATUS@.
    --     When the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the
    --     @AWS_INSTANCE_IPV4@ attribute will be filled out with the primary
    --     private IPv4 address.
    --
    -- [AWS_INIT_HEALTH_STATUS]
    --     If the service configuration includes @HealthCheckCustomConfig@, you
    --     can optionally use @AWS_INIT_HEALTH_STATUS@ to specify the initial
    --     status of the custom health check, @HEALTHY@ or @UNHEALTHY@. If you
    --     don\'t specify a value for @AWS_INIT_HEALTH_STATUS@, the initial
    --     status is @HEALTHY@.
    --
    -- [AWS_INSTANCE_CNAME]
    --     If the service configuration includes a @CNAME@ record, the domain
    --     name that you want Route 53 to return in response to DNS queries
    --     (for example, @example.com@).
    --
    --     This value is required if the service specified by @ServiceId@
    --     includes settings for an @CNAME@ record.
    --
    -- [AWS_INSTANCE_IPV4]
    --     If the service configuration includes an @A@ record, the IPv4
    --     address that you want Route 53 to return in response to DNS queries
    --     (for example, @192.0.2.44@).
    --
    --     This value is required if the service specified by @ServiceId@
    --     includes settings for an @A@ record. If the service includes
    --     settings for an @SRV@ record, you must specify a value for
    --     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
    --
    -- [AWS_INSTANCE_IPV6]
    --     If the service configuration includes an @AAAA@ record, the IPv6
    --     address that you want Route 53 to return in response to DNS queries
    --     (for example, @2001:0db8:85a3:0000:0000:abcd:0001:2345@).
    --
    --     This value is required if the service specified by @ServiceId@
    --     includes settings for an @AAAA@ record. If the service includes
    --     settings for an @SRV@ record, you must specify a value for
    --     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
    --
    -- [AWS_INSTANCE_PORT]
    --     If the service includes an @SRV@ record, the value that you want
    --     Route 53 to return for the port.
    --
    --     If the service includes @HealthCheckConfig@, the port on the
    --     endpoint that you want Route 53 to send requests to.
    --
    --     This value is required if you specified settings for an @SRV@ record
    --     or a Route 53 health check when you created the service.
    --
    -- [Custom attributes]
    --     You can add up to 30 custom attributes. For each key-value pair, the
    --     maximum length of the attribute name is 255 characters, and the
    --     maximum length of the attribute value is 1,024 characters. The total
    --     size of all provided attributes (sum of all keys and values) must
    --     not exceed 5,000 characters.
    RegisterInstance -> HashMap Text Text
attributes :: Prelude.HashMap Prelude.Text Prelude.Text
  }
  deriving (RegisterInstance -> RegisterInstance -> Bool
(RegisterInstance -> RegisterInstance -> Bool)
-> (RegisterInstance -> RegisterInstance -> Bool)
-> Eq RegisterInstance
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegisterInstance -> RegisterInstance -> Bool
$c/= :: RegisterInstance -> RegisterInstance -> Bool
== :: RegisterInstance -> RegisterInstance -> Bool
$c== :: RegisterInstance -> RegisterInstance -> Bool
Prelude.Eq, ReadPrec [RegisterInstance]
ReadPrec RegisterInstance
Int -> ReadS RegisterInstance
ReadS [RegisterInstance]
(Int -> ReadS RegisterInstance)
-> ReadS [RegisterInstance]
-> ReadPrec RegisterInstance
-> ReadPrec [RegisterInstance]
-> Read RegisterInstance
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RegisterInstance]
$creadListPrec :: ReadPrec [RegisterInstance]
readPrec :: ReadPrec RegisterInstance
$creadPrec :: ReadPrec RegisterInstance
readList :: ReadS [RegisterInstance]
$creadList :: ReadS [RegisterInstance]
readsPrec :: Int -> ReadS RegisterInstance
$creadsPrec :: Int -> ReadS RegisterInstance
Prelude.Read, Int -> RegisterInstance -> ShowS
[RegisterInstance] -> ShowS
RegisterInstance -> String
(Int -> RegisterInstance -> ShowS)
-> (RegisterInstance -> String)
-> ([RegisterInstance] -> ShowS)
-> Show RegisterInstance
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterInstance] -> ShowS
$cshowList :: [RegisterInstance] -> ShowS
show :: RegisterInstance -> String
$cshow :: RegisterInstance -> String
showsPrec :: Int -> RegisterInstance -> ShowS
$cshowsPrec :: Int -> RegisterInstance -> ShowS
Prelude.Show, (forall x. RegisterInstance -> Rep RegisterInstance x)
-> (forall x. Rep RegisterInstance x -> RegisterInstance)
-> Generic RegisterInstance
forall x. Rep RegisterInstance x -> RegisterInstance
forall x. RegisterInstance -> Rep RegisterInstance x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep RegisterInstance x -> RegisterInstance
$cfrom :: forall x. RegisterInstance -> Rep RegisterInstance x
Prelude.Generic)

-- |
-- Create a value of 'RegisterInstance' 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:
--
-- 'creatorRequestId', 'registerInstance_creatorRequestId' - A unique string that identifies the request and that allows failed
-- @RegisterInstance@ requests to be retried without the risk of executing
-- the operation twice. You must use a unique @CreatorRequestId@ string
-- every time you submit a @RegisterInstance@ request if you\'re
-- registering additional instances for the same namespace and service.
-- @CreatorRequestId@ can be any unique string (for example, a date\/time
-- stamp).
--
-- 'serviceId', 'registerInstance_serviceId' - The ID of the service that you want to use for settings for the
-- instance.
--
-- 'instanceId', 'registerInstance_instanceId' - An identifier that you want to associate with the instance. Note the
-- following:
--
-- -   If the service that\'s specified by @ServiceId@ includes settings
--     for an @SRV@ record, the value of @InstanceId@ is automatically
--     included as part of the value for the @SRV@ record. For more
--     information, see
--     <https://docs.aws.amazon.com/cloud-map/latest/api/API_DnsRecord.html#cloudmap-Type-DnsRecord-Type DnsRecord > Type>.
--
-- -   You can use this value to update an existing instance.
--
-- -   To register a new instance, you must specify a value that\'s unique
--     among instances that you register by using the same service.
--
-- -   If you specify an existing @InstanceId@ and @ServiceId@, Cloud Map
--     updates the existing DNS records, if any. If there\'s also an
--     existing health check, Cloud Map deletes the old health check and
--     creates a new one.
--
--     The health check isn\'t deleted immediately, so it will still appear
--     for a while if you submit a @ListHealthChecks@ request, for example.
--
-- 'attributes', 'registerInstance_attributes' - A string map that contains the following information for the service
-- that you specify in @ServiceId@:
--
-- -   The attributes that apply to the records that are defined in the
--     service.
--
-- -   For each attribute, the applicable value.
--
-- Supported attribute keys include the following:
--
-- [AWS_ALIAS_DNS_NAME]
--     If you want Cloud Map to create an Amazon Route 53 alias record that
--     routes traffic to an Elastic Load Balancing load balancer, specify
--     the DNS name that\'s associated with the load balancer. For
--     information about how to get the DNS name, see \"DNSName\" in the
--     topic
--     <https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html AliasTarget>
--     in the /Route 53 API Reference/.
--
--     Note the following:
--
--     -   The configuration for the service that\'s specified by
--         @ServiceId@ must include settings for an @A@ record, an @AAAA@
--         record, or both.
--
--     -   In the service that\'s specified by @ServiceId@, the value of
--         @RoutingPolicy@ must be @WEIGHTED@.
--
--     -   If the service that\'s specified by @ServiceId@ includes
--         @HealthCheckConfig@ settings, Cloud Map will create the Route 53
--         health check, but it doesn\'t associate the health check with
--         the alias record.
--
--     -   Auto naming currently doesn\'t support creating alias records
--         that route traffic to Amazon Web Services resources other than
--         Elastic Load Balancing load balancers.
--
--     -   If you specify a value for @AWS_ALIAS_DNS_NAME@, don\'t specify
--         values for any of the @AWS_INSTANCE@ attributes.
--
-- [AWS_EC2_INSTANCE_ID]
--     /HTTP namespaces only./ The Amazon EC2 instance ID for the instance.
--     If the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the only
--     other attribute that can be specified is @AWS_INIT_HEALTH_STATUS@.
--     When the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the
--     @AWS_INSTANCE_IPV4@ attribute will be filled out with the primary
--     private IPv4 address.
--
-- [AWS_INIT_HEALTH_STATUS]
--     If the service configuration includes @HealthCheckCustomConfig@, you
--     can optionally use @AWS_INIT_HEALTH_STATUS@ to specify the initial
--     status of the custom health check, @HEALTHY@ or @UNHEALTHY@. If you
--     don\'t specify a value for @AWS_INIT_HEALTH_STATUS@, the initial
--     status is @HEALTHY@.
--
-- [AWS_INSTANCE_CNAME]
--     If the service configuration includes a @CNAME@ record, the domain
--     name that you want Route 53 to return in response to DNS queries
--     (for example, @example.com@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @CNAME@ record.
--
-- [AWS_INSTANCE_IPV4]
--     If the service configuration includes an @A@ record, the IPv4
--     address that you want Route 53 to return in response to DNS queries
--     (for example, @192.0.2.44@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @A@ record. If the service includes
--     settings for an @SRV@ record, you must specify a value for
--     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
--
-- [AWS_INSTANCE_IPV6]
--     If the service configuration includes an @AAAA@ record, the IPv6
--     address that you want Route 53 to return in response to DNS queries
--     (for example, @2001:0db8:85a3:0000:0000:abcd:0001:2345@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @AAAA@ record. If the service includes
--     settings for an @SRV@ record, you must specify a value for
--     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
--
-- [AWS_INSTANCE_PORT]
--     If the service includes an @SRV@ record, the value that you want
--     Route 53 to return for the port.
--
--     If the service includes @HealthCheckConfig@, the port on the
--     endpoint that you want Route 53 to send requests to.
--
--     This value is required if you specified settings for an @SRV@ record
--     or a Route 53 health check when you created the service.
--
-- [Custom attributes]
--     You can add up to 30 custom attributes. For each key-value pair, the
--     maximum length of the attribute name is 255 characters, and the
--     maximum length of the attribute value is 1,024 characters. The total
--     size of all provided attributes (sum of all keys and values) must
--     not exceed 5,000 characters.
newRegisterInstance ::
  -- | 'serviceId'
  Prelude.Text ->
  -- | 'instanceId'
  Prelude.Text ->
  RegisterInstance
newRegisterInstance :: Text -> Text -> RegisterInstance
newRegisterInstance Text
pServiceId_ Text
pInstanceId_ =
  RegisterInstance' :: Maybe Text -> Text -> Text -> HashMap Text Text -> RegisterInstance
RegisterInstance'
    { $sel:creatorRequestId:RegisterInstance' :: Maybe Text
creatorRequestId =
        Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:serviceId:RegisterInstance' :: Text
serviceId = Text
pServiceId_,
      $sel:instanceId:RegisterInstance' :: Text
instanceId = Text
pInstanceId_,
      $sel:attributes:RegisterInstance' :: HashMap Text Text
attributes = HashMap Text Text
forall a. Monoid a => a
Prelude.mempty
    }

-- | A unique string that identifies the request and that allows failed
-- @RegisterInstance@ requests to be retried without the risk of executing
-- the operation twice. You must use a unique @CreatorRequestId@ string
-- every time you submit a @RegisterInstance@ request if you\'re
-- registering additional instances for the same namespace and service.
-- @CreatorRequestId@ can be any unique string (for example, a date\/time
-- stamp).
registerInstance_creatorRequestId :: Lens.Lens' RegisterInstance (Prelude.Maybe Prelude.Text)
registerInstance_creatorRequestId :: (Maybe Text -> f (Maybe Text))
-> RegisterInstance -> f RegisterInstance
registerInstance_creatorRequestId = (RegisterInstance -> Maybe Text)
-> (RegisterInstance -> Maybe Text -> RegisterInstance)
-> Lens RegisterInstance RegisterInstance (Maybe Text) (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstance' {Maybe Text
creatorRequestId :: Maybe Text
$sel:creatorRequestId:RegisterInstance' :: RegisterInstance -> Maybe Text
creatorRequestId} -> Maybe Text
creatorRequestId) (\s :: RegisterInstance
s@RegisterInstance' {} Maybe Text
a -> RegisterInstance
s {$sel:creatorRequestId:RegisterInstance' :: Maybe Text
creatorRequestId = Maybe Text
a} :: RegisterInstance)

-- | The ID of the service that you want to use for settings for the
-- instance.
registerInstance_serviceId :: Lens.Lens' RegisterInstance Prelude.Text
registerInstance_serviceId :: (Text -> f Text) -> RegisterInstance -> f RegisterInstance
registerInstance_serviceId = (RegisterInstance -> Text)
-> (RegisterInstance -> Text -> RegisterInstance)
-> Lens RegisterInstance RegisterInstance Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstance' {Text
serviceId :: Text
$sel:serviceId:RegisterInstance' :: RegisterInstance -> Text
serviceId} -> Text
serviceId) (\s :: RegisterInstance
s@RegisterInstance' {} Text
a -> RegisterInstance
s {$sel:serviceId:RegisterInstance' :: Text
serviceId = Text
a} :: RegisterInstance)

-- | An identifier that you want to associate with the instance. Note the
-- following:
--
-- -   If the service that\'s specified by @ServiceId@ includes settings
--     for an @SRV@ record, the value of @InstanceId@ is automatically
--     included as part of the value for the @SRV@ record. For more
--     information, see
--     <https://docs.aws.amazon.com/cloud-map/latest/api/API_DnsRecord.html#cloudmap-Type-DnsRecord-Type DnsRecord > Type>.
--
-- -   You can use this value to update an existing instance.
--
-- -   To register a new instance, you must specify a value that\'s unique
--     among instances that you register by using the same service.
--
-- -   If you specify an existing @InstanceId@ and @ServiceId@, Cloud Map
--     updates the existing DNS records, if any. If there\'s also an
--     existing health check, Cloud Map deletes the old health check and
--     creates a new one.
--
--     The health check isn\'t deleted immediately, so it will still appear
--     for a while if you submit a @ListHealthChecks@ request, for example.
registerInstance_instanceId :: Lens.Lens' RegisterInstance Prelude.Text
registerInstance_instanceId :: (Text -> f Text) -> RegisterInstance -> f RegisterInstance
registerInstance_instanceId = (RegisterInstance -> Text)
-> (RegisterInstance -> Text -> RegisterInstance)
-> Lens RegisterInstance RegisterInstance Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstance' {Text
instanceId :: Text
$sel:instanceId:RegisterInstance' :: RegisterInstance -> Text
instanceId} -> Text
instanceId) (\s :: RegisterInstance
s@RegisterInstance' {} Text
a -> RegisterInstance
s {$sel:instanceId:RegisterInstance' :: Text
instanceId = Text
a} :: RegisterInstance)

-- | A string map that contains the following information for the service
-- that you specify in @ServiceId@:
--
-- -   The attributes that apply to the records that are defined in the
--     service.
--
-- -   For each attribute, the applicable value.
--
-- Supported attribute keys include the following:
--
-- [AWS_ALIAS_DNS_NAME]
--     If you want Cloud Map to create an Amazon Route 53 alias record that
--     routes traffic to an Elastic Load Balancing load balancer, specify
--     the DNS name that\'s associated with the load balancer. For
--     information about how to get the DNS name, see \"DNSName\" in the
--     topic
--     <https://docs.aws.amazon.com/Route53/latest/APIReference/API_AliasTarget.html AliasTarget>
--     in the /Route 53 API Reference/.
--
--     Note the following:
--
--     -   The configuration for the service that\'s specified by
--         @ServiceId@ must include settings for an @A@ record, an @AAAA@
--         record, or both.
--
--     -   In the service that\'s specified by @ServiceId@, the value of
--         @RoutingPolicy@ must be @WEIGHTED@.
--
--     -   If the service that\'s specified by @ServiceId@ includes
--         @HealthCheckConfig@ settings, Cloud Map will create the Route 53
--         health check, but it doesn\'t associate the health check with
--         the alias record.
--
--     -   Auto naming currently doesn\'t support creating alias records
--         that route traffic to Amazon Web Services resources other than
--         Elastic Load Balancing load balancers.
--
--     -   If you specify a value for @AWS_ALIAS_DNS_NAME@, don\'t specify
--         values for any of the @AWS_INSTANCE@ attributes.
--
-- [AWS_EC2_INSTANCE_ID]
--     /HTTP namespaces only./ The Amazon EC2 instance ID for the instance.
--     If the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the only
--     other attribute that can be specified is @AWS_INIT_HEALTH_STATUS@.
--     When the @AWS_EC2_INSTANCE_ID@ attribute is specified, then the
--     @AWS_INSTANCE_IPV4@ attribute will be filled out with the primary
--     private IPv4 address.
--
-- [AWS_INIT_HEALTH_STATUS]
--     If the service configuration includes @HealthCheckCustomConfig@, you
--     can optionally use @AWS_INIT_HEALTH_STATUS@ to specify the initial
--     status of the custom health check, @HEALTHY@ or @UNHEALTHY@. If you
--     don\'t specify a value for @AWS_INIT_HEALTH_STATUS@, the initial
--     status is @HEALTHY@.
--
-- [AWS_INSTANCE_CNAME]
--     If the service configuration includes a @CNAME@ record, the domain
--     name that you want Route 53 to return in response to DNS queries
--     (for example, @example.com@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @CNAME@ record.
--
-- [AWS_INSTANCE_IPV4]
--     If the service configuration includes an @A@ record, the IPv4
--     address that you want Route 53 to return in response to DNS queries
--     (for example, @192.0.2.44@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @A@ record. If the service includes
--     settings for an @SRV@ record, you must specify a value for
--     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
--
-- [AWS_INSTANCE_IPV6]
--     If the service configuration includes an @AAAA@ record, the IPv6
--     address that you want Route 53 to return in response to DNS queries
--     (for example, @2001:0db8:85a3:0000:0000:abcd:0001:2345@).
--
--     This value is required if the service specified by @ServiceId@
--     includes settings for an @AAAA@ record. If the service includes
--     settings for an @SRV@ record, you must specify a value for
--     @AWS_INSTANCE_IPV4@, @AWS_INSTANCE_IPV6@, or both.
--
-- [AWS_INSTANCE_PORT]
--     If the service includes an @SRV@ record, the value that you want
--     Route 53 to return for the port.
--
--     If the service includes @HealthCheckConfig@, the port on the
--     endpoint that you want Route 53 to send requests to.
--
--     This value is required if you specified settings for an @SRV@ record
--     or a Route 53 health check when you created the service.
--
-- [Custom attributes]
--     You can add up to 30 custom attributes. For each key-value pair, the
--     maximum length of the attribute name is 255 characters, and the
--     maximum length of the attribute value is 1,024 characters. The total
--     size of all provided attributes (sum of all keys and values) must
--     not exceed 5,000 characters.
registerInstance_attributes :: Lens.Lens' RegisterInstance (Prelude.HashMap Prelude.Text Prelude.Text)
registerInstance_attributes :: (HashMap Text Text -> f (HashMap Text Text))
-> RegisterInstance -> f RegisterInstance
registerInstance_attributes = (RegisterInstance -> HashMap Text Text)
-> (RegisterInstance -> HashMap Text Text -> RegisterInstance)
-> Lens
     RegisterInstance
     RegisterInstance
     (HashMap Text Text)
     (HashMap Text Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstance' {HashMap Text Text
attributes :: HashMap Text Text
$sel:attributes:RegisterInstance' :: RegisterInstance -> HashMap Text Text
attributes} -> HashMap Text Text
attributes) (\s :: RegisterInstance
s@RegisterInstance' {} HashMap Text Text
a -> RegisterInstance
s {$sel:attributes:RegisterInstance' :: HashMap Text Text
attributes = HashMap Text Text
a} :: RegisterInstance) ((HashMap Text Text -> f (HashMap Text Text))
 -> RegisterInstance -> f RegisterInstance)
-> ((HashMap Text Text -> f (HashMap Text Text))
    -> HashMap Text Text -> f (HashMap Text Text))
-> (HashMap Text Text -> f (HashMap Text Text))
-> RegisterInstance
-> f RegisterInstance
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. (HashMap Text Text -> f (HashMap Text Text))
-> HashMap Text Text -> f (HashMap Text Text)
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance Core.AWSRequest RegisterInstance where
  type
    AWSResponse RegisterInstance =
      RegisterInstanceResponse
  request :: RegisterInstance -> Request RegisterInstance
request = Service -> RegisterInstance -> Request RegisterInstance
forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON Service
defaultService
  response :: Logger
-> Service
-> Proxy RegisterInstance
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse RegisterInstance)))
response =
    (Int
 -> ResponseHeaders
 -> Object
 -> Either String (AWSResponse RegisterInstance))
-> Logger
-> Service
-> Proxy RegisterInstance
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse RegisterInstance)))
forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> Logger
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe Text -> Int -> RegisterInstanceResponse
RegisterInstanceResponse'
            (Maybe Text -> Int -> RegisterInstanceResponse)
-> Either String (Maybe Text)
-> Either String (Int -> RegisterInstanceResponse)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x Object -> Text -> Either String (Maybe Text)
forall a. FromJSON a => Object -> Text -> Either String (Maybe a)
Core..?> Text
"OperationId")
            Either String (Int -> RegisterInstanceResponse)
-> Either String Int -> Either String RegisterInstanceResponse
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Int -> Either String Int
forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (Int -> Int
forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable RegisterInstance

instance Prelude.NFData RegisterInstance

instance Core.ToHeaders RegisterInstance where
  toHeaders :: RegisterInstance -> ResponseHeaders
toHeaders =
    ResponseHeaders -> RegisterInstance -> ResponseHeaders
forall a b. a -> b -> a
Prelude.const
      ( [ResponseHeaders] -> ResponseHeaders
forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              HeaderName -> ByteString -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# ( ByteString
"Route53AutoNaming_v20170314.RegisterInstance" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              HeaderName -> ByteString -> ResponseHeaders
forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Core.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Core.ToJSON RegisterInstance where
  toJSON :: RegisterInstance -> Value
toJSON RegisterInstance' {Maybe Text
Text
HashMap Text Text
attributes :: HashMap Text Text
instanceId :: Text
serviceId :: Text
creatorRequestId :: Maybe Text
$sel:attributes:RegisterInstance' :: RegisterInstance -> HashMap Text Text
$sel:instanceId:RegisterInstance' :: RegisterInstance -> Text
$sel:serviceId:RegisterInstance' :: RegisterInstance -> Text
$sel:creatorRequestId:RegisterInstance' :: RegisterInstance -> Maybe Text
..} =
    [Pair] -> Value
Core.object
      ( [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Text
"CreatorRequestId" 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
creatorRequestId,
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"ServiceId" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= Text
serviceId),
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"InstanceId" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= Text
instanceId),
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"Attributes" Text -> HashMap Text Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= HashMap Text Text
attributes)
          ]
      )

instance Core.ToPath RegisterInstance where
  toPath :: RegisterInstance -> ByteString
toPath = ByteString -> RegisterInstance -> ByteString
forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Core.ToQuery RegisterInstance where
  toQuery :: RegisterInstance -> QueryString
toQuery = QueryString -> RegisterInstance -> QueryString
forall a b. a -> b -> a
Prelude.const QueryString
forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newRegisterInstanceResponse' smart constructor.
data RegisterInstanceResponse = RegisterInstanceResponse'
  { -- | A value that you can use to determine whether the request completed
    -- successfully. To get the status of the operation, see
    -- <https://docs.aws.amazon.com/cloud-map/latest/api/API_GetOperation.html GetOperation>.
    RegisterInstanceResponse -> Maybe Text
operationId :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    RegisterInstanceResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (RegisterInstanceResponse -> RegisterInstanceResponse -> Bool
(RegisterInstanceResponse -> RegisterInstanceResponse -> Bool)
-> (RegisterInstanceResponse -> RegisterInstanceResponse -> Bool)
-> Eq RegisterInstanceResponse
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RegisterInstanceResponse -> RegisterInstanceResponse -> Bool
$c/= :: RegisterInstanceResponse -> RegisterInstanceResponse -> Bool
== :: RegisterInstanceResponse -> RegisterInstanceResponse -> Bool
$c== :: RegisterInstanceResponse -> RegisterInstanceResponse -> Bool
Prelude.Eq, ReadPrec [RegisterInstanceResponse]
ReadPrec RegisterInstanceResponse
Int -> ReadS RegisterInstanceResponse
ReadS [RegisterInstanceResponse]
(Int -> ReadS RegisterInstanceResponse)
-> ReadS [RegisterInstanceResponse]
-> ReadPrec RegisterInstanceResponse
-> ReadPrec [RegisterInstanceResponse]
-> Read RegisterInstanceResponse
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [RegisterInstanceResponse]
$creadListPrec :: ReadPrec [RegisterInstanceResponse]
readPrec :: ReadPrec RegisterInstanceResponse
$creadPrec :: ReadPrec RegisterInstanceResponse
readList :: ReadS [RegisterInstanceResponse]
$creadList :: ReadS [RegisterInstanceResponse]
readsPrec :: Int -> ReadS RegisterInstanceResponse
$creadsPrec :: Int -> ReadS RegisterInstanceResponse
Prelude.Read, Int -> RegisterInstanceResponse -> ShowS
[RegisterInstanceResponse] -> ShowS
RegisterInstanceResponse -> String
(Int -> RegisterInstanceResponse -> ShowS)
-> (RegisterInstanceResponse -> String)
-> ([RegisterInstanceResponse] -> ShowS)
-> Show RegisterInstanceResponse
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [RegisterInstanceResponse] -> ShowS
$cshowList :: [RegisterInstanceResponse] -> ShowS
show :: RegisterInstanceResponse -> String
$cshow :: RegisterInstanceResponse -> String
showsPrec :: Int -> RegisterInstanceResponse -> ShowS
$cshowsPrec :: Int -> RegisterInstanceResponse -> ShowS
Prelude.Show, (forall x.
 RegisterInstanceResponse -> Rep RegisterInstanceResponse x)
-> (forall x.
    Rep RegisterInstanceResponse x -> RegisterInstanceResponse)
-> Generic RegisterInstanceResponse
forall x.
Rep RegisterInstanceResponse x -> RegisterInstanceResponse
forall x.
RegisterInstanceResponse -> Rep RegisterInstanceResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep RegisterInstanceResponse x -> RegisterInstanceResponse
$cfrom :: forall x.
RegisterInstanceResponse -> Rep RegisterInstanceResponse x
Prelude.Generic)

-- |
-- Create a value of 'RegisterInstanceResponse' 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:
--
-- 'operationId', 'registerInstanceResponse_operationId' - A value that you can use to determine whether the request completed
-- successfully. To get the status of the operation, see
-- <https://docs.aws.amazon.com/cloud-map/latest/api/API_GetOperation.html GetOperation>.
--
-- 'httpStatus', 'registerInstanceResponse_httpStatus' - The response's http status code.
newRegisterInstanceResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  RegisterInstanceResponse
newRegisterInstanceResponse :: Int -> RegisterInstanceResponse
newRegisterInstanceResponse Int
pHttpStatus_ =
  RegisterInstanceResponse' :: Maybe Text -> Int -> RegisterInstanceResponse
RegisterInstanceResponse'
    { $sel:operationId:RegisterInstanceResponse' :: Maybe Text
operationId =
        Maybe Text
forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:RegisterInstanceResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | A value that you can use to determine whether the request completed
-- successfully. To get the status of the operation, see
-- <https://docs.aws.amazon.com/cloud-map/latest/api/API_GetOperation.html GetOperation>.
registerInstanceResponse_operationId :: Lens.Lens' RegisterInstanceResponse (Prelude.Maybe Prelude.Text)
registerInstanceResponse_operationId :: (Maybe Text -> f (Maybe Text))
-> RegisterInstanceResponse -> f RegisterInstanceResponse
registerInstanceResponse_operationId = (RegisterInstanceResponse -> Maybe Text)
-> (RegisterInstanceResponse
    -> Maybe Text -> RegisterInstanceResponse)
-> Lens
     RegisterInstanceResponse
     RegisterInstanceResponse
     (Maybe Text)
     (Maybe Text)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstanceResponse' {Maybe Text
operationId :: Maybe Text
$sel:operationId:RegisterInstanceResponse' :: RegisterInstanceResponse -> Maybe Text
operationId} -> Maybe Text
operationId) (\s :: RegisterInstanceResponse
s@RegisterInstanceResponse' {} Maybe Text
a -> RegisterInstanceResponse
s {$sel:operationId:RegisterInstanceResponse' :: Maybe Text
operationId = Maybe Text
a} :: RegisterInstanceResponse)

-- | The response's http status code.
registerInstanceResponse_httpStatus :: Lens.Lens' RegisterInstanceResponse Prelude.Int
registerInstanceResponse_httpStatus :: (Int -> f Int)
-> RegisterInstanceResponse -> f RegisterInstanceResponse
registerInstanceResponse_httpStatus = (RegisterInstanceResponse -> Int)
-> (RegisterInstanceResponse -> Int -> RegisterInstanceResponse)
-> Lens RegisterInstanceResponse RegisterInstanceResponse Int Int
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\RegisterInstanceResponse' {Int
httpStatus :: Int
$sel:httpStatus:RegisterInstanceResponse' :: RegisterInstanceResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: RegisterInstanceResponse
s@RegisterInstanceResponse' {} Int
a -> RegisterInstanceResponse
s {$sel:httpStatus:RegisterInstanceResponse' :: Int
httpStatus = Int
a} :: RegisterInstanceResponse)

instance Prelude.NFData RegisterInstanceResponse