{-# 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.RDS.BacktrackDBCluster
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Backtracks a DB cluster to a specific time, without creating a new DB
-- cluster.
--
-- For more information on backtracking, see
-- <https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Managing.Backtrack.html Backtracking an Aurora DB Cluster>
-- in the /Amazon Aurora User Guide/.
--
-- This action applies only to Aurora MySQL DB clusters.
module Amazonka.RDS.BacktrackDBCluster
  ( -- * Creating a Request
    BacktrackDBCluster (..),
    newBacktrackDBCluster,

    -- * Request Lenses
    backtrackDBCluster_force,
    backtrackDBCluster_useEarliestTimeOnPointInTimeUnavailable,
    backtrackDBCluster_dbClusterIdentifier,
    backtrackDBCluster_backtrackTo,

    -- * Destructuring the Response
    DBClusterBacktrack (..),
    newDBClusterBacktrack,

    -- * Response Lenses
    dbClusterBacktrack_backtrackIdentifier,
    dbClusterBacktrack_backtrackRequestCreationTime,
    dbClusterBacktrack_backtrackTo,
    dbClusterBacktrack_backtrackedFrom,
    dbClusterBacktrack_dbClusterIdentifier,
    dbClusterBacktrack_status,
  )
where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import Amazonka.RDS.Types
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- |
--
-- /See:/ 'newBacktrackDBCluster' smart constructor.
data BacktrackDBCluster = BacktrackDBCluster'
  { -- | A value that indicates whether to force the DB cluster to backtrack when
    -- binary logging is enabled. Otherwise, an error occurs when binary
    -- logging is enabled.
    BacktrackDBCluster -> Maybe Bool
force :: Prelude.Maybe Prelude.Bool,
    -- | A value that indicates whether to backtrack the DB cluster to the
    -- earliest possible backtrack time when /BacktrackTo/ is set to a
    -- timestamp earlier than the earliest backtrack time. When this parameter
    -- is disabled and /BacktrackTo/ is set to a timestamp earlier than the
    -- earliest backtrack time, an error occurs.
    BacktrackDBCluster -> Maybe Bool
useEarliestTimeOnPointInTimeUnavailable :: Prelude.Maybe Prelude.Bool,
    -- | The DB cluster identifier of the DB cluster to be backtracked. This
    -- parameter is stored as a lowercase string.
    --
    -- Constraints:
    --
    -- -   Must contain from 1 to 63 alphanumeric characters or hyphens.
    --
    -- -   First character must be a letter.
    --
    -- -   Can\'t end with a hyphen or contain two consecutive hyphens.
    --
    -- Example: @my-cluster1@
    BacktrackDBCluster -> Text
dbClusterIdentifier :: Prelude.Text,
    -- | The timestamp of the time to backtrack the DB cluster to, specified in
    -- ISO 8601 format. For more information about ISO 8601, see the
    -- <http://en.wikipedia.org/wiki/ISO_8601 ISO8601 Wikipedia page.>
    --
    -- If the specified time isn\'t a consistent time for the DB cluster,
    -- Aurora automatically chooses the nearest possible consistent time for
    -- the DB cluster.
    --
    -- Constraints:
    --
    -- -   Must contain a valid ISO 8601 timestamp.
    --
    -- -   Can\'t contain a timestamp set in the future.
    --
    -- Example: @2017-07-08T18:00Z@
    BacktrackDBCluster -> ISO8601
backtrackTo :: Data.ISO8601
  }
  deriving (BacktrackDBCluster -> BacktrackDBCluster -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: BacktrackDBCluster -> BacktrackDBCluster -> Bool
$c/= :: BacktrackDBCluster -> BacktrackDBCluster -> Bool
== :: BacktrackDBCluster -> BacktrackDBCluster -> Bool
$c== :: BacktrackDBCluster -> BacktrackDBCluster -> Bool
Prelude.Eq, ReadPrec [BacktrackDBCluster]
ReadPrec BacktrackDBCluster
Int -> ReadS BacktrackDBCluster
ReadS [BacktrackDBCluster]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [BacktrackDBCluster]
$creadListPrec :: ReadPrec [BacktrackDBCluster]
readPrec :: ReadPrec BacktrackDBCluster
$creadPrec :: ReadPrec BacktrackDBCluster
readList :: ReadS [BacktrackDBCluster]
$creadList :: ReadS [BacktrackDBCluster]
readsPrec :: Int -> ReadS BacktrackDBCluster
$creadsPrec :: Int -> ReadS BacktrackDBCluster
Prelude.Read, Int -> BacktrackDBCluster -> ShowS
[BacktrackDBCluster] -> ShowS
BacktrackDBCluster -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [BacktrackDBCluster] -> ShowS
$cshowList :: [BacktrackDBCluster] -> ShowS
show :: BacktrackDBCluster -> String
$cshow :: BacktrackDBCluster -> String
showsPrec :: Int -> BacktrackDBCluster -> ShowS
$cshowsPrec :: Int -> BacktrackDBCluster -> ShowS
Prelude.Show, forall x. Rep BacktrackDBCluster x -> BacktrackDBCluster
forall x. BacktrackDBCluster -> Rep BacktrackDBCluster x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep BacktrackDBCluster x -> BacktrackDBCluster
$cfrom :: forall x. BacktrackDBCluster -> Rep BacktrackDBCluster x
Prelude.Generic)

-- |
-- Create a value of 'BacktrackDBCluster' 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:
--
-- 'force', 'backtrackDBCluster_force' - A value that indicates whether to force the DB cluster to backtrack when
-- binary logging is enabled. Otherwise, an error occurs when binary
-- logging is enabled.
--
-- 'useEarliestTimeOnPointInTimeUnavailable', 'backtrackDBCluster_useEarliestTimeOnPointInTimeUnavailable' - A value that indicates whether to backtrack the DB cluster to the
-- earliest possible backtrack time when /BacktrackTo/ is set to a
-- timestamp earlier than the earliest backtrack time. When this parameter
-- is disabled and /BacktrackTo/ is set to a timestamp earlier than the
-- earliest backtrack time, an error occurs.
--
-- 'dbClusterIdentifier', 'backtrackDBCluster_dbClusterIdentifier' - The DB cluster identifier of the DB cluster to be backtracked. This
-- parameter is stored as a lowercase string.
--
-- Constraints:
--
-- -   Must contain from 1 to 63 alphanumeric characters or hyphens.
--
-- -   First character must be a letter.
--
-- -   Can\'t end with a hyphen or contain two consecutive hyphens.
--
-- Example: @my-cluster1@
--
-- 'backtrackTo', 'backtrackDBCluster_backtrackTo' - The timestamp of the time to backtrack the DB cluster to, specified in
-- ISO 8601 format. For more information about ISO 8601, see the
-- <http://en.wikipedia.org/wiki/ISO_8601 ISO8601 Wikipedia page.>
--
-- If the specified time isn\'t a consistent time for the DB cluster,
-- Aurora automatically chooses the nearest possible consistent time for
-- the DB cluster.
--
-- Constraints:
--
-- -   Must contain a valid ISO 8601 timestamp.
--
-- -   Can\'t contain a timestamp set in the future.
--
-- Example: @2017-07-08T18:00Z@
newBacktrackDBCluster ::
  -- | 'dbClusterIdentifier'
  Prelude.Text ->
  -- | 'backtrackTo'
  Prelude.UTCTime ->
  BacktrackDBCluster
newBacktrackDBCluster :: Text -> UTCTime -> BacktrackDBCluster
newBacktrackDBCluster
  Text
pDBClusterIdentifier_
  UTCTime
pBacktrackTo_ =
    BacktrackDBCluster'
      { $sel:force:BacktrackDBCluster' :: Maybe Bool
force = forall a. Maybe a
Prelude.Nothing,
        $sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: Maybe Bool
useEarliestTimeOnPointInTimeUnavailable =
          forall a. Maybe a
Prelude.Nothing,
        $sel:dbClusterIdentifier:BacktrackDBCluster' :: Text
dbClusterIdentifier = Text
pDBClusterIdentifier_,
        $sel:backtrackTo:BacktrackDBCluster' :: ISO8601
backtrackTo = forall (a :: Format). Iso' (Time a) UTCTime
Data._Time forall t b. AReview t b -> b -> t
Lens.# UTCTime
pBacktrackTo_
      }

-- | A value that indicates whether to force the DB cluster to backtrack when
-- binary logging is enabled. Otherwise, an error occurs when binary
-- logging is enabled.
backtrackDBCluster_force :: Lens.Lens' BacktrackDBCluster (Prelude.Maybe Prelude.Bool)
backtrackDBCluster_force :: Lens' BacktrackDBCluster (Maybe Bool)
backtrackDBCluster_force = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\BacktrackDBCluster' {Maybe Bool
force :: Maybe Bool
$sel:force:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
force} -> Maybe Bool
force) (\s :: BacktrackDBCluster
s@BacktrackDBCluster' {} Maybe Bool
a -> BacktrackDBCluster
s {$sel:force:BacktrackDBCluster' :: Maybe Bool
force = Maybe Bool
a} :: BacktrackDBCluster)

-- | A value that indicates whether to backtrack the DB cluster to the
-- earliest possible backtrack time when /BacktrackTo/ is set to a
-- timestamp earlier than the earliest backtrack time. When this parameter
-- is disabled and /BacktrackTo/ is set to a timestamp earlier than the
-- earliest backtrack time, an error occurs.
backtrackDBCluster_useEarliestTimeOnPointInTimeUnavailable :: Lens.Lens' BacktrackDBCluster (Prelude.Maybe Prelude.Bool)
backtrackDBCluster_useEarliestTimeOnPointInTimeUnavailable :: Lens' BacktrackDBCluster (Maybe Bool)
backtrackDBCluster_useEarliestTimeOnPointInTimeUnavailable = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\BacktrackDBCluster' {Maybe Bool
useEarliestTimeOnPointInTimeUnavailable :: Maybe Bool
$sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
useEarliestTimeOnPointInTimeUnavailable} -> Maybe Bool
useEarliestTimeOnPointInTimeUnavailable) (\s :: BacktrackDBCluster
s@BacktrackDBCluster' {} Maybe Bool
a -> BacktrackDBCluster
s {$sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: Maybe Bool
useEarliestTimeOnPointInTimeUnavailable = Maybe Bool
a} :: BacktrackDBCluster)

-- | The DB cluster identifier of the DB cluster to be backtracked. This
-- parameter is stored as a lowercase string.
--
-- Constraints:
--
-- -   Must contain from 1 to 63 alphanumeric characters or hyphens.
--
-- -   First character must be a letter.
--
-- -   Can\'t end with a hyphen or contain two consecutive hyphens.
--
-- Example: @my-cluster1@
backtrackDBCluster_dbClusterIdentifier :: Lens.Lens' BacktrackDBCluster Prelude.Text
backtrackDBCluster_dbClusterIdentifier :: Lens' BacktrackDBCluster Text
backtrackDBCluster_dbClusterIdentifier = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\BacktrackDBCluster' {Text
dbClusterIdentifier :: Text
$sel:dbClusterIdentifier:BacktrackDBCluster' :: BacktrackDBCluster -> Text
dbClusterIdentifier} -> Text
dbClusterIdentifier) (\s :: BacktrackDBCluster
s@BacktrackDBCluster' {} Text
a -> BacktrackDBCluster
s {$sel:dbClusterIdentifier:BacktrackDBCluster' :: Text
dbClusterIdentifier = Text
a} :: BacktrackDBCluster)

-- | The timestamp of the time to backtrack the DB cluster to, specified in
-- ISO 8601 format. For more information about ISO 8601, see the
-- <http://en.wikipedia.org/wiki/ISO_8601 ISO8601 Wikipedia page.>
--
-- If the specified time isn\'t a consistent time for the DB cluster,
-- Aurora automatically chooses the nearest possible consistent time for
-- the DB cluster.
--
-- Constraints:
--
-- -   Must contain a valid ISO 8601 timestamp.
--
-- -   Can\'t contain a timestamp set in the future.
--
-- Example: @2017-07-08T18:00Z@
backtrackDBCluster_backtrackTo :: Lens.Lens' BacktrackDBCluster Prelude.UTCTime
backtrackDBCluster_backtrackTo :: Lens' BacktrackDBCluster UTCTime
backtrackDBCluster_backtrackTo = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\BacktrackDBCluster' {ISO8601
backtrackTo :: ISO8601
$sel:backtrackTo:BacktrackDBCluster' :: BacktrackDBCluster -> ISO8601
backtrackTo} -> ISO8601
backtrackTo) (\s :: BacktrackDBCluster
s@BacktrackDBCluster' {} ISO8601
a -> BacktrackDBCluster
s {$sel:backtrackTo:BacktrackDBCluster' :: ISO8601
backtrackTo = ISO8601
a} :: BacktrackDBCluster) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (a :: Format). Iso' (Time a) UTCTime
Data._Time

instance Core.AWSRequest BacktrackDBCluster where
  type
    AWSResponse BacktrackDBCluster =
      DBClusterBacktrack
  request :: (Service -> Service)
-> BacktrackDBCluster -> Request BacktrackDBCluster
request Service -> Service
overrides =
    forall a. ToRequest a => Service -> a -> Request a
Request.postQuery (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy BacktrackDBCluster
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse BacktrackDBCluster)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
Text
-> (Int
    -> ResponseHeaders -> [Node] -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveXMLWrapper
      Text
"BacktrackDBClusterResult"
      (\Int
s ResponseHeaders
h [Node]
x -> forall a. FromXML a => [Node] -> Either String a
Data.parseXML [Node]
x)

instance Prelude.Hashable BacktrackDBCluster where
  hashWithSalt :: Int -> BacktrackDBCluster -> Int
hashWithSalt Int
_salt BacktrackDBCluster' {Maybe Bool
Text
ISO8601
backtrackTo :: ISO8601
dbClusterIdentifier :: Text
useEarliestTimeOnPointInTimeUnavailable :: Maybe Bool
force :: Maybe Bool
$sel:backtrackTo:BacktrackDBCluster' :: BacktrackDBCluster -> ISO8601
$sel:dbClusterIdentifier:BacktrackDBCluster' :: BacktrackDBCluster -> Text
$sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
$sel:force:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
force
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
useEarliestTimeOnPointInTimeUnavailable
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
dbClusterIdentifier
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` ISO8601
backtrackTo

instance Prelude.NFData BacktrackDBCluster where
  rnf :: BacktrackDBCluster -> ()
rnf BacktrackDBCluster' {Maybe Bool
Text
ISO8601
backtrackTo :: ISO8601
dbClusterIdentifier :: Text
useEarliestTimeOnPointInTimeUnavailable :: Maybe Bool
force :: Maybe Bool
$sel:backtrackTo:BacktrackDBCluster' :: BacktrackDBCluster -> ISO8601
$sel:dbClusterIdentifier:BacktrackDBCluster' :: BacktrackDBCluster -> Text
$sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
$sel:force:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
force
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
useEarliestTimeOnPointInTimeUnavailable
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
dbClusterIdentifier
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf ISO8601
backtrackTo

instance Data.ToHeaders BacktrackDBCluster where
  toHeaders :: BacktrackDBCluster -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

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

instance Data.ToQuery BacktrackDBCluster where
  toQuery :: BacktrackDBCluster -> QueryString
toQuery BacktrackDBCluster' {Maybe Bool
Text
ISO8601
backtrackTo :: ISO8601
dbClusterIdentifier :: Text
useEarliestTimeOnPointInTimeUnavailable :: Maybe Bool
force :: Maybe Bool
$sel:backtrackTo:BacktrackDBCluster' :: BacktrackDBCluster -> ISO8601
$sel:dbClusterIdentifier:BacktrackDBCluster' :: BacktrackDBCluster -> Text
$sel:useEarliestTimeOnPointInTimeUnavailable:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
$sel:force:BacktrackDBCluster' :: BacktrackDBCluster -> Maybe Bool
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"BacktrackDBCluster" :: Prelude.ByteString),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2014-10-31" :: Prelude.ByteString),
        ByteString
"Force" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Bool
force,
        ByteString
"UseEarliestTimeOnPointInTimeUnavailable"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Maybe Bool
useEarliestTimeOnPointInTimeUnavailable,
        ByteString
"DBClusterIdentifier" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
dbClusterIdentifier,
        ByteString
"BacktrackTo" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: ISO8601
backtrackTo
      ]