{-# 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.IAM.DeleteServiceLinkedRole
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Submits a service-linked role deletion request and returns a
-- @DeletionTaskId@, which you can use to check the status of the deletion.
-- Before you call this operation, confirm that the role has no active
-- sessions and that any resources used by the role in the linked service
-- are deleted. If you call this operation more than once for the same
-- service-linked role and an earlier deletion task is not complete, then
-- the @DeletionTaskId@ of the earlier request is returned.
--
-- If you submit a deletion request for a service-linked role whose linked
-- service is still accessing a resource, then the deletion task fails. If
-- it fails, the GetServiceLinkedRoleDeletionStatus operation returns the
-- reason for the failure, usually including the resources that must be
-- deleted. To delete the service-linked role, you must first remove those
-- resources from the linked service and then submit the deletion request
-- again. Resources are specific to the service that is linked to the role.
-- For more information about removing resources from a service, see the
-- <http://docs.aws.amazon.com/ Amazon Web Services documentation> for your
-- service.
--
-- For more information about service-linked roles, see
-- <https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role Roles terms and concepts: Amazon Web Services service-linked role>
-- in the /IAM User Guide/.
module Amazonka.IAM.DeleteServiceLinkedRole
  ( -- * Creating a Request
    DeleteServiceLinkedRole (..),
    newDeleteServiceLinkedRole,

    -- * Request Lenses
    deleteServiceLinkedRole_roleName,

    -- * Destructuring the Response
    DeleteServiceLinkedRoleResponse (..),
    newDeleteServiceLinkedRoleResponse,

    -- * Response Lenses
    deleteServiceLinkedRoleResponse_httpStatus,
    deleteServiceLinkedRoleResponse_deletionTaskId,
  )
where

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

-- | /See:/ 'newDeleteServiceLinkedRole' smart constructor.
data DeleteServiceLinkedRole = DeleteServiceLinkedRole'
  { -- | The name of the service-linked role to be deleted.
    DeleteServiceLinkedRole -> Text
roleName :: Prelude.Text
  }
  deriving (DeleteServiceLinkedRole -> DeleteServiceLinkedRole -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteServiceLinkedRole -> DeleteServiceLinkedRole -> Bool
$c/= :: DeleteServiceLinkedRole -> DeleteServiceLinkedRole -> Bool
== :: DeleteServiceLinkedRole -> DeleteServiceLinkedRole -> Bool
$c== :: DeleteServiceLinkedRole -> DeleteServiceLinkedRole -> Bool
Prelude.Eq, ReadPrec [DeleteServiceLinkedRole]
ReadPrec DeleteServiceLinkedRole
Int -> ReadS DeleteServiceLinkedRole
ReadS [DeleteServiceLinkedRole]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteServiceLinkedRole]
$creadListPrec :: ReadPrec [DeleteServiceLinkedRole]
readPrec :: ReadPrec DeleteServiceLinkedRole
$creadPrec :: ReadPrec DeleteServiceLinkedRole
readList :: ReadS [DeleteServiceLinkedRole]
$creadList :: ReadS [DeleteServiceLinkedRole]
readsPrec :: Int -> ReadS DeleteServiceLinkedRole
$creadsPrec :: Int -> ReadS DeleteServiceLinkedRole
Prelude.Read, Int -> DeleteServiceLinkedRole -> ShowS
[DeleteServiceLinkedRole] -> ShowS
DeleteServiceLinkedRole -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteServiceLinkedRole] -> ShowS
$cshowList :: [DeleteServiceLinkedRole] -> ShowS
show :: DeleteServiceLinkedRole -> String
$cshow :: DeleteServiceLinkedRole -> String
showsPrec :: Int -> DeleteServiceLinkedRole -> ShowS
$cshowsPrec :: Int -> DeleteServiceLinkedRole -> ShowS
Prelude.Show, forall x. Rep DeleteServiceLinkedRole x -> DeleteServiceLinkedRole
forall x. DeleteServiceLinkedRole -> Rep DeleteServiceLinkedRole x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DeleteServiceLinkedRole x -> DeleteServiceLinkedRole
$cfrom :: forall x. DeleteServiceLinkedRole -> Rep DeleteServiceLinkedRole x
Prelude.Generic)

-- |
-- Create a value of 'DeleteServiceLinkedRole' 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:
--
-- 'roleName', 'deleteServiceLinkedRole_roleName' - The name of the service-linked role to be deleted.
newDeleteServiceLinkedRole ::
  -- | 'roleName'
  Prelude.Text ->
  DeleteServiceLinkedRole
newDeleteServiceLinkedRole :: Text -> DeleteServiceLinkedRole
newDeleteServiceLinkedRole Text
pRoleName_ =
  DeleteServiceLinkedRole' {$sel:roleName:DeleteServiceLinkedRole' :: Text
roleName = Text
pRoleName_}

-- | The name of the service-linked role to be deleted.
deleteServiceLinkedRole_roleName :: Lens.Lens' DeleteServiceLinkedRole Prelude.Text
deleteServiceLinkedRole_roleName :: Lens' DeleteServiceLinkedRole Text
deleteServiceLinkedRole_roleName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteServiceLinkedRole' {Text
roleName :: Text
$sel:roleName:DeleteServiceLinkedRole' :: DeleteServiceLinkedRole -> Text
roleName} -> Text
roleName) (\s :: DeleteServiceLinkedRole
s@DeleteServiceLinkedRole' {} Text
a -> DeleteServiceLinkedRole
s {$sel:roleName:DeleteServiceLinkedRole' :: Text
roleName = Text
a} :: DeleteServiceLinkedRole)

instance Core.AWSRequest DeleteServiceLinkedRole where
  type
    AWSResponse DeleteServiceLinkedRole =
      DeleteServiceLinkedRoleResponse
  request :: (Service -> Service)
-> DeleteServiceLinkedRole -> Request DeleteServiceLinkedRole
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 DeleteServiceLinkedRole
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DeleteServiceLinkedRole)))
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
"DeleteServiceLinkedRoleResult"
      ( \Int
s ResponseHeaders
h [Node]
x ->
          Int -> Text -> DeleteServiceLinkedRoleResponse
DeleteServiceLinkedRoleResponse'
            forall (f :: * -> *) a b. Functor 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))
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> ([Node]
x forall a. FromXML a => [Node] -> Text -> Either String a
Data..@ Text
"DeletionTaskId")
      )

instance Prelude.Hashable DeleteServiceLinkedRole where
  hashWithSalt :: Int -> DeleteServiceLinkedRole -> Int
hashWithSalt Int
_salt DeleteServiceLinkedRole' {Text
roleName :: Text
$sel:roleName:DeleteServiceLinkedRole' :: DeleteServiceLinkedRole -> Text
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
roleName

instance Prelude.NFData DeleteServiceLinkedRole where
  rnf :: DeleteServiceLinkedRole -> ()
rnf DeleteServiceLinkedRole' {Text
roleName :: Text
$sel:roleName:DeleteServiceLinkedRole' :: DeleteServiceLinkedRole -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
roleName

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

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

instance Data.ToQuery DeleteServiceLinkedRole where
  toQuery :: DeleteServiceLinkedRole -> QueryString
toQuery DeleteServiceLinkedRole' {Text
roleName :: Text
$sel:roleName:DeleteServiceLinkedRole' :: DeleteServiceLinkedRole -> Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ ByteString
"Action"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"DeleteServiceLinkedRole" :: Prelude.ByteString),
        ByteString
"Version"
          forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: (ByteString
"2010-05-08" :: Prelude.ByteString),
        ByteString
"RoleName" forall a. ToQuery a => ByteString -> a -> QueryString
Data.=: Text
roleName
      ]

-- | /See:/ 'newDeleteServiceLinkedRoleResponse' smart constructor.
data DeleteServiceLinkedRoleResponse = DeleteServiceLinkedRoleResponse'
  { -- | The response's http status code.
    DeleteServiceLinkedRoleResponse -> Int
httpStatus :: Prelude.Int,
    -- | The deletion task identifier that you can use to check the status of the
    -- deletion. This identifier is returned in the format
    -- @task\/aws-service-role\/\<service-principal-name>\/\<role-name>\/\<task-uuid>@.
    DeleteServiceLinkedRoleResponse -> Text
deletionTaskId :: Prelude.Text
  }
  deriving (DeleteServiceLinkedRoleResponse
-> DeleteServiceLinkedRoleResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeleteServiceLinkedRoleResponse
-> DeleteServiceLinkedRoleResponse -> Bool
$c/= :: DeleteServiceLinkedRoleResponse
-> DeleteServiceLinkedRoleResponse -> Bool
== :: DeleteServiceLinkedRoleResponse
-> DeleteServiceLinkedRoleResponse -> Bool
$c== :: DeleteServiceLinkedRoleResponse
-> DeleteServiceLinkedRoleResponse -> Bool
Prelude.Eq, ReadPrec [DeleteServiceLinkedRoleResponse]
ReadPrec DeleteServiceLinkedRoleResponse
Int -> ReadS DeleteServiceLinkedRoleResponse
ReadS [DeleteServiceLinkedRoleResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeleteServiceLinkedRoleResponse]
$creadListPrec :: ReadPrec [DeleteServiceLinkedRoleResponse]
readPrec :: ReadPrec DeleteServiceLinkedRoleResponse
$creadPrec :: ReadPrec DeleteServiceLinkedRoleResponse
readList :: ReadS [DeleteServiceLinkedRoleResponse]
$creadList :: ReadS [DeleteServiceLinkedRoleResponse]
readsPrec :: Int -> ReadS DeleteServiceLinkedRoleResponse
$creadsPrec :: Int -> ReadS DeleteServiceLinkedRoleResponse
Prelude.Read, Int -> DeleteServiceLinkedRoleResponse -> ShowS
[DeleteServiceLinkedRoleResponse] -> ShowS
DeleteServiceLinkedRoleResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeleteServiceLinkedRoleResponse] -> ShowS
$cshowList :: [DeleteServiceLinkedRoleResponse] -> ShowS
show :: DeleteServiceLinkedRoleResponse -> String
$cshow :: DeleteServiceLinkedRoleResponse -> String
showsPrec :: Int -> DeleteServiceLinkedRoleResponse -> ShowS
$cshowsPrec :: Int -> DeleteServiceLinkedRoleResponse -> ShowS
Prelude.Show, forall x.
Rep DeleteServiceLinkedRoleResponse x
-> DeleteServiceLinkedRoleResponse
forall x.
DeleteServiceLinkedRoleResponse
-> Rep DeleteServiceLinkedRoleResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DeleteServiceLinkedRoleResponse x
-> DeleteServiceLinkedRoleResponse
$cfrom :: forall x.
DeleteServiceLinkedRoleResponse
-> Rep DeleteServiceLinkedRoleResponse x
Prelude.Generic)

-- |
-- Create a value of 'DeleteServiceLinkedRoleResponse' 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:
--
-- 'httpStatus', 'deleteServiceLinkedRoleResponse_httpStatus' - The response's http status code.
--
-- 'deletionTaskId', 'deleteServiceLinkedRoleResponse_deletionTaskId' - The deletion task identifier that you can use to check the status of the
-- deletion. This identifier is returned in the format
-- @task\/aws-service-role\/\<service-principal-name>\/\<role-name>\/\<task-uuid>@.
newDeleteServiceLinkedRoleResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'deletionTaskId'
  Prelude.Text ->
  DeleteServiceLinkedRoleResponse
newDeleteServiceLinkedRoleResponse :: Int -> Text -> DeleteServiceLinkedRoleResponse
newDeleteServiceLinkedRoleResponse
  Int
pHttpStatus_
  Text
pDeletionTaskId_ =
    DeleteServiceLinkedRoleResponse'
      { $sel:httpStatus:DeleteServiceLinkedRoleResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:deletionTaskId:DeleteServiceLinkedRoleResponse' :: Text
deletionTaskId = Text
pDeletionTaskId_
      }

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

-- | The deletion task identifier that you can use to check the status of the
-- deletion. This identifier is returned in the format
-- @task\/aws-service-role\/\<service-principal-name>\/\<role-name>\/\<task-uuid>@.
deleteServiceLinkedRoleResponse_deletionTaskId :: Lens.Lens' DeleteServiceLinkedRoleResponse Prelude.Text
deleteServiceLinkedRoleResponse_deletionTaskId :: Lens' DeleteServiceLinkedRoleResponse Text
deleteServiceLinkedRoleResponse_deletionTaskId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeleteServiceLinkedRoleResponse' {Text
deletionTaskId :: Text
$sel:deletionTaskId:DeleteServiceLinkedRoleResponse' :: DeleteServiceLinkedRoleResponse -> Text
deletionTaskId} -> Text
deletionTaskId) (\s :: DeleteServiceLinkedRoleResponse
s@DeleteServiceLinkedRoleResponse' {} Text
a -> DeleteServiceLinkedRoleResponse
s {$sel:deletionTaskId:DeleteServiceLinkedRoleResponse' :: Text
deletionTaskId = Text
a} :: DeleteServiceLinkedRoleResponse)

instance
  Prelude.NFData
    DeleteServiceLinkedRoleResponse
  where
  rnf :: DeleteServiceLinkedRoleResponse -> ()
rnf DeleteServiceLinkedRoleResponse' {Int
Text
deletionTaskId :: Text
httpStatus :: Int
$sel:deletionTaskId:DeleteServiceLinkedRoleResponse' :: DeleteServiceLinkedRoleResponse -> Text
$sel:httpStatus:DeleteServiceLinkedRoleResponse' :: DeleteServiceLinkedRoleResponse -> Int
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
deletionTaskId