{-# 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.Config.PutRemediationConfigurations
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Adds or updates the remediation configuration with a specific Config
-- rule with the selected target or action. The API creates the
-- @RemediationConfiguration@ object for the Config rule. The Config rule
-- must already exist for you to add a remediation configuration. The
-- target (SSM document) must exist and have permissions to use the target.
--
-- If you make backward incompatible changes to the SSM document, you must
-- call this again to ensure the remediations can run.
--
-- This API does not support adding remediation configurations for
-- service-linked Config Rules such as Organization Config rules, the rules
-- deployed by conformance packs, and rules deployed by Amazon Web Services
-- Security Hub.
--
-- For manual remediation configuration, you need to provide a value for
-- @automationAssumeRole@ or use a value in the @assumeRole@field to
-- remediate your resources. The SSM automation document can use either as
-- long as it maps to a valid parameter.
--
-- However, for automatic remediation configuration, the only valid
-- @assumeRole@ field value is @AutomationAssumeRole@ and you need to
-- provide a value for @AutomationAssumeRole@ to remediate your resources.
module Amazonka.Config.PutRemediationConfigurations
  ( -- * Creating a Request
    PutRemediationConfigurations (..),
    newPutRemediationConfigurations,

    -- * Request Lenses
    putRemediationConfigurations_remediationConfigurations,

    -- * Destructuring the Response
    PutRemediationConfigurationsResponse (..),
    newPutRemediationConfigurationsResponse,

    -- * Response Lenses
    putRemediationConfigurationsResponse_failedBatches,
    putRemediationConfigurationsResponse_httpStatus,
  )
where

import Amazonka.Config.Types
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 qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newPutRemediationConfigurations' smart constructor.
data PutRemediationConfigurations = PutRemediationConfigurations'
  { -- | A list of remediation configuration objects.
    PutRemediationConfigurations -> [RemediationConfiguration]
remediationConfigurations :: [RemediationConfiguration]
  }
  deriving (PutRemediationConfigurations
-> PutRemediationConfigurations -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PutRemediationConfigurations
-> PutRemediationConfigurations -> Bool
$c/= :: PutRemediationConfigurations
-> PutRemediationConfigurations -> Bool
== :: PutRemediationConfigurations
-> PutRemediationConfigurations -> Bool
$c== :: PutRemediationConfigurations
-> PutRemediationConfigurations -> Bool
Prelude.Eq, ReadPrec [PutRemediationConfigurations]
ReadPrec PutRemediationConfigurations
Int -> ReadS PutRemediationConfigurations
ReadS [PutRemediationConfigurations]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PutRemediationConfigurations]
$creadListPrec :: ReadPrec [PutRemediationConfigurations]
readPrec :: ReadPrec PutRemediationConfigurations
$creadPrec :: ReadPrec PutRemediationConfigurations
readList :: ReadS [PutRemediationConfigurations]
$creadList :: ReadS [PutRemediationConfigurations]
readsPrec :: Int -> ReadS PutRemediationConfigurations
$creadsPrec :: Int -> ReadS PutRemediationConfigurations
Prelude.Read, Int -> PutRemediationConfigurations -> ShowS
[PutRemediationConfigurations] -> ShowS
PutRemediationConfigurations -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutRemediationConfigurations] -> ShowS
$cshowList :: [PutRemediationConfigurations] -> ShowS
show :: PutRemediationConfigurations -> String
$cshow :: PutRemediationConfigurations -> String
showsPrec :: Int -> PutRemediationConfigurations -> ShowS
$cshowsPrec :: Int -> PutRemediationConfigurations -> ShowS
Prelude.Show, forall x.
Rep PutRemediationConfigurations x -> PutRemediationConfigurations
forall x.
PutRemediationConfigurations -> Rep PutRemediationConfigurations x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep PutRemediationConfigurations x -> PutRemediationConfigurations
$cfrom :: forall x.
PutRemediationConfigurations -> Rep PutRemediationConfigurations x
Prelude.Generic)

-- |
-- Create a value of 'PutRemediationConfigurations' 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:
--
-- 'remediationConfigurations', 'putRemediationConfigurations_remediationConfigurations' - A list of remediation configuration objects.
newPutRemediationConfigurations ::
  PutRemediationConfigurations
newPutRemediationConfigurations :: PutRemediationConfigurations
newPutRemediationConfigurations =
  PutRemediationConfigurations'
    { $sel:remediationConfigurations:PutRemediationConfigurations' :: [RemediationConfiguration]
remediationConfigurations =
        forall a. Monoid a => a
Prelude.mempty
    }

-- | A list of remediation configuration objects.
putRemediationConfigurations_remediationConfigurations :: Lens.Lens' PutRemediationConfigurations [RemediationConfiguration]
putRemediationConfigurations_remediationConfigurations :: Lens' PutRemediationConfigurations [RemediationConfiguration]
putRemediationConfigurations_remediationConfigurations = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRemediationConfigurations' {[RemediationConfiguration]
remediationConfigurations :: [RemediationConfiguration]
$sel:remediationConfigurations:PutRemediationConfigurations' :: PutRemediationConfigurations -> [RemediationConfiguration]
remediationConfigurations} -> [RemediationConfiguration]
remediationConfigurations) (\s :: PutRemediationConfigurations
s@PutRemediationConfigurations' {} [RemediationConfiguration]
a -> PutRemediationConfigurations
s {$sel:remediationConfigurations:PutRemediationConfigurations' :: [RemediationConfiguration]
remediationConfigurations = [RemediationConfiguration]
a} :: PutRemediationConfigurations) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance Core.AWSRequest PutRemediationConfigurations where
  type
    AWSResponse PutRemediationConfigurations =
      PutRemediationConfigurationsResponse
  request :: (Service -> Service)
-> PutRemediationConfigurations
-> Request PutRemediationConfigurations
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy PutRemediationConfigurations
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse PutRemediationConfigurations)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe [FailedRemediationBatch]
-> Int -> PutRemediationConfigurationsResponse
PutRemediationConfigurationsResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"FailedBatches" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance
  Prelude.Hashable
    PutRemediationConfigurations
  where
  hashWithSalt :: Int -> PutRemediationConfigurations -> Int
hashWithSalt Int
_salt PutRemediationConfigurations' {[RemediationConfiguration]
remediationConfigurations :: [RemediationConfiguration]
$sel:remediationConfigurations:PutRemediationConfigurations' :: PutRemediationConfigurations -> [RemediationConfiguration]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` [RemediationConfiguration]
remediationConfigurations

instance Prelude.NFData PutRemediationConfigurations where
  rnf :: PutRemediationConfigurations -> ()
rnf PutRemediationConfigurations' {[RemediationConfiguration]
remediationConfigurations :: [RemediationConfiguration]
$sel:remediationConfigurations:PutRemediationConfigurations' :: PutRemediationConfigurations -> [RemediationConfiguration]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf [RemediationConfiguration]
remediationConfigurations

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

instance Data.ToJSON PutRemediationConfigurations where
  toJSON :: PutRemediationConfigurations -> Value
toJSON PutRemediationConfigurations' {[RemediationConfiguration]
remediationConfigurations :: [RemediationConfiguration]
$sel:remediationConfigurations:PutRemediationConfigurations' :: PutRemediationConfigurations -> [RemediationConfiguration]
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just
              ( Key
"RemediationConfigurations"
                  forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= [RemediationConfiguration]
remediationConfigurations
              )
          ]
      )

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

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

-- | /See:/ 'newPutRemediationConfigurationsResponse' smart constructor.
data PutRemediationConfigurationsResponse = PutRemediationConfigurationsResponse'
  { -- | Returns a list of failed remediation batch objects.
    PutRemediationConfigurationsResponse
-> Maybe [FailedRemediationBatch]
failedBatches :: Prelude.Maybe [FailedRemediationBatch],
    -- | The response's http status code.
    PutRemediationConfigurationsResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (PutRemediationConfigurationsResponse
-> PutRemediationConfigurationsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PutRemediationConfigurationsResponse
-> PutRemediationConfigurationsResponse -> Bool
$c/= :: PutRemediationConfigurationsResponse
-> PutRemediationConfigurationsResponse -> Bool
== :: PutRemediationConfigurationsResponse
-> PutRemediationConfigurationsResponse -> Bool
$c== :: PutRemediationConfigurationsResponse
-> PutRemediationConfigurationsResponse -> Bool
Prelude.Eq, ReadPrec [PutRemediationConfigurationsResponse]
ReadPrec PutRemediationConfigurationsResponse
Int -> ReadS PutRemediationConfigurationsResponse
ReadS [PutRemediationConfigurationsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [PutRemediationConfigurationsResponse]
$creadListPrec :: ReadPrec [PutRemediationConfigurationsResponse]
readPrec :: ReadPrec PutRemediationConfigurationsResponse
$creadPrec :: ReadPrec PutRemediationConfigurationsResponse
readList :: ReadS [PutRemediationConfigurationsResponse]
$creadList :: ReadS [PutRemediationConfigurationsResponse]
readsPrec :: Int -> ReadS PutRemediationConfigurationsResponse
$creadsPrec :: Int -> ReadS PutRemediationConfigurationsResponse
Prelude.Read, Int -> PutRemediationConfigurationsResponse -> ShowS
[PutRemediationConfigurationsResponse] -> ShowS
PutRemediationConfigurationsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PutRemediationConfigurationsResponse] -> ShowS
$cshowList :: [PutRemediationConfigurationsResponse] -> ShowS
show :: PutRemediationConfigurationsResponse -> String
$cshow :: PutRemediationConfigurationsResponse -> String
showsPrec :: Int -> PutRemediationConfigurationsResponse -> ShowS
$cshowsPrec :: Int -> PutRemediationConfigurationsResponse -> ShowS
Prelude.Show, forall x.
Rep PutRemediationConfigurationsResponse x
-> PutRemediationConfigurationsResponse
forall x.
PutRemediationConfigurationsResponse
-> Rep PutRemediationConfigurationsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep PutRemediationConfigurationsResponse x
-> PutRemediationConfigurationsResponse
$cfrom :: forall x.
PutRemediationConfigurationsResponse
-> Rep PutRemediationConfigurationsResponse x
Prelude.Generic)

-- |
-- Create a value of 'PutRemediationConfigurationsResponse' 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:
--
-- 'failedBatches', 'putRemediationConfigurationsResponse_failedBatches' - Returns a list of failed remediation batch objects.
--
-- 'httpStatus', 'putRemediationConfigurationsResponse_httpStatus' - The response's http status code.
newPutRemediationConfigurationsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  PutRemediationConfigurationsResponse
newPutRemediationConfigurationsResponse :: Int -> PutRemediationConfigurationsResponse
newPutRemediationConfigurationsResponse Int
pHttpStatus_ =
  PutRemediationConfigurationsResponse'
    { $sel:failedBatches:PutRemediationConfigurationsResponse' :: Maybe [FailedRemediationBatch]
failedBatches =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:PutRemediationConfigurationsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Returns a list of failed remediation batch objects.
putRemediationConfigurationsResponse_failedBatches :: Lens.Lens' PutRemediationConfigurationsResponse (Prelude.Maybe [FailedRemediationBatch])
putRemediationConfigurationsResponse_failedBatches :: Lens'
  PutRemediationConfigurationsResponse
  (Maybe [FailedRemediationBatch])
putRemediationConfigurationsResponse_failedBatches = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\PutRemediationConfigurationsResponse' {Maybe [FailedRemediationBatch]
failedBatches :: Maybe [FailedRemediationBatch]
$sel:failedBatches:PutRemediationConfigurationsResponse' :: PutRemediationConfigurationsResponse
-> Maybe [FailedRemediationBatch]
failedBatches} -> Maybe [FailedRemediationBatch]
failedBatches) (\s :: PutRemediationConfigurationsResponse
s@PutRemediationConfigurationsResponse' {} Maybe [FailedRemediationBatch]
a -> PutRemediationConfigurationsResponse
s {$sel:failedBatches:PutRemediationConfigurationsResponse' :: Maybe [FailedRemediationBatch]
failedBatches = Maybe [FailedRemediationBatch]
a} :: PutRemediationConfigurationsResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

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

instance
  Prelude.NFData
    PutRemediationConfigurationsResponse
  where
  rnf :: PutRemediationConfigurationsResponse -> ()
rnf PutRemediationConfigurationsResponse' {Int
Maybe [FailedRemediationBatch]
httpStatus :: Int
failedBatches :: Maybe [FailedRemediationBatch]
$sel:httpStatus:PutRemediationConfigurationsResponse' :: PutRemediationConfigurationsResponse -> Int
$sel:failedBatches:PutRemediationConfigurationsResponse' :: PutRemediationConfigurationsResponse
-> Maybe [FailedRemediationBatch]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [FailedRemediationBatch]
failedBatches
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus