{-# 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.Inspector.CreateAssessmentTarget
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a new assessment target using the ARN of the resource group that
-- is generated by CreateResourceGroup. If resourceGroupArn is not
-- specified, all EC2 instances in the current AWS account and region are
-- included in the assessment target. If the
-- <https://docs.aws.amazon.com/inspector/latest/userguide/inspector_slr.html service-linked role>
-- isn’t already registered, this action also creates and registers a
-- service-linked role to grant Amazon Inspector access to AWS Services
-- needed to perform security assessments. You can create up to 50
-- assessment targets per AWS account. You can run up to 500 concurrent
-- agents per AWS account. For more information, see
-- <https://docs.aws.amazon.com/inspector/latest/userguide/inspector_applications.html Amazon Inspector Assessment Targets>.
module Amazonka.Inspector.CreateAssessmentTarget
  ( -- * Creating a Request
    CreateAssessmentTarget (..),
    newCreateAssessmentTarget,

    -- * Request Lenses
    createAssessmentTarget_resourceGroupArn,
    createAssessmentTarget_assessmentTargetName,

    -- * Destructuring the Response
    CreateAssessmentTargetResponse (..),
    newCreateAssessmentTargetResponse,

    -- * Response Lenses
    createAssessmentTargetResponse_httpStatus,
    createAssessmentTargetResponse_assessmentTargetArn,
  )
where

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

-- | /See:/ 'newCreateAssessmentTarget' smart constructor.
data CreateAssessmentTarget = CreateAssessmentTarget'
  { -- | The ARN that specifies the resource group that is used to create the
    -- assessment target. If resourceGroupArn is not specified, all EC2
    -- instances in the current AWS account and region are included in the
    -- assessment target.
    CreateAssessmentTarget -> Maybe Text
resourceGroupArn :: Prelude.Maybe Prelude.Text,
    -- | The user-defined name that identifies the assessment target that you
    -- want to create. The name must be unique within the AWS account.
    CreateAssessmentTarget -> Text
assessmentTargetName :: Prelude.Text
  }
  deriving (CreateAssessmentTarget -> CreateAssessmentTarget -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAssessmentTarget -> CreateAssessmentTarget -> Bool
$c/= :: CreateAssessmentTarget -> CreateAssessmentTarget -> Bool
== :: CreateAssessmentTarget -> CreateAssessmentTarget -> Bool
$c== :: CreateAssessmentTarget -> CreateAssessmentTarget -> Bool
Prelude.Eq, ReadPrec [CreateAssessmentTarget]
ReadPrec CreateAssessmentTarget
Int -> ReadS CreateAssessmentTarget
ReadS [CreateAssessmentTarget]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAssessmentTarget]
$creadListPrec :: ReadPrec [CreateAssessmentTarget]
readPrec :: ReadPrec CreateAssessmentTarget
$creadPrec :: ReadPrec CreateAssessmentTarget
readList :: ReadS [CreateAssessmentTarget]
$creadList :: ReadS [CreateAssessmentTarget]
readsPrec :: Int -> ReadS CreateAssessmentTarget
$creadsPrec :: Int -> ReadS CreateAssessmentTarget
Prelude.Read, Int -> CreateAssessmentTarget -> ShowS
[CreateAssessmentTarget] -> ShowS
CreateAssessmentTarget -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAssessmentTarget] -> ShowS
$cshowList :: [CreateAssessmentTarget] -> ShowS
show :: CreateAssessmentTarget -> String
$cshow :: CreateAssessmentTarget -> String
showsPrec :: Int -> CreateAssessmentTarget -> ShowS
$cshowsPrec :: Int -> CreateAssessmentTarget -> ShowS
Prelude.Show, forall x. Rep CreateAssessmentTarget x -> CreateAssessmentTarget
forall x. CreateAssessmentTarget -> Rep CreateAssessmentTarget x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateAssessmentTarget x -> CreateAssessmentTarget
$cfrom :: forall x. CreateAssessmentTarget -> Rep CreateAssessmentTarget x
Prelude.Generic)

-- |
-- Create a value of 'CreateAssessmentTarget' 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:
--
-- 'resourceGroupArn', 'createAssessmentTarget_resourceGroupArn' - The ARN that specifies the resource group that is used to create the
-- assessment target. If resourceGroupArn is not specified, all EC2
-- instances in the current AWS account and region are included in the
-- assessment target.
--
-- 'assessmentTargetName', 'createAssessmentTarget_assessmentTargetName' - The user-defined name that identifies the assessment target that you
-- want to create. The name must be unique within the AWS account.
newCreateAssessmentTarget ::
  -- | 'assessmentTargetName'
  Prelude.Text ->
  CreateAssessmentTarget
newCreateAssessmentTarget :: Text -> CreateAssessmentTarget
newCreateAssessmentTarget Text
pAssessmentTargetName_ =
  CreateAssessmentTarget'
    { $sel:resourceGroupArn:CreateAssessmentTarget' :: Maybe Text
resourceGroupArn =
        forall a. Maybe a
Prelude.Nothing,
      $sel:assessmentTargetName:CreateAssessmentTarget' :: Text
assessmentTargetName = Text
pAssessmentTargetName_
    }

-- | The ARN that specifies the resource group that is used to create the
-- assessment target. If resourceGroupArn is not specified, all EC2
-- instances in the current AWS account and region are included in the
-- assessment target.
createAssessmentTarget_resourceGroupArn :: Lens.Lens' CreateAssessmentTarget (Prelude.Maybe Prelude.Text)
createAssessmentTarget_resourceGroupArn :: Lens' CreateAssessmentTarget (Maybe Text)
createAssessmentTarget_resourceGroupArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAssessmentTarget' {Maybe Text
resourceGroupArn :: Maybe Text
$sel:resourceGroupArn:CreateAssessmentTarget' :: CreateAssessmentTarget -> Maybe Text
resourceGroupArn} -> Maybe Text
resourceGroupArn) (\s :: CreateAssessmentTarget
s@CreateAssessmentTarget' {} Maybe Text
a -> CreateAssessmentTarget
s {$sel:resourceGroupArn:CreateAssessmentTarget' :: Maybe Text
resourceGroupArn = Maybe Text
a} :: CreateAssessmentTarget)

-- | The user-defined name that identifies the assessment target that you
-- want to create. The name must be unique within the AWS account.
createAssessmentTarget_assessmentTargetName :: Lens.Lens' CreateAssessmentTarget Prelude.Text
createAssessmentTarget_assessmentTargetName :: Lens' CreateAssessmentTarget Text
createAssessmentTarget_assessmentTargetName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAssessmentTarget' {Text
assessmentTargetName :: Text
$sel:assessmentTargetName:CreateAssessmentTarget' :: CreateAssessmentTarget -> Text
assessmentTargetName} -> Text
assessmentTargetName) (\s :: CreateAssessmentTarget
s@CreateAssessmentTarget' {} Text
a -> CreateAssessmentTarget
s {$sel:assessmentTargetName:CreateAssessmentTarget' :: Text
assessmentTargetName = Text
a} :: CreateAssessmentTarget)

instance Core.AWSRequest CreateAssessmentTarget where
  type
    AWSResponse CreateAssessmentTarget =
      CreateAssessmentTargetResponse
  request :: (Service -> Service)
-> CreateAssessmentTarget -> Request CreateAssessmentTarget
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 CreateAssessmentTarget
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse CreateAssessmentTarget)))
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 ->
          Int -> Text -> CreateAssessmentTargetResponse
CreateAssessmentTargetResponse'
            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.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String a
Data..:> Key
"assessmentTargetArn")
      )

instance Prelude.Hashable CreateAssessmentTarget where
  hashWithSalt :: Int -> CreateAssessmentTarget -> Int
hashWithSalt Int
_salt CreateAssessmentTarget' {Maybe Text
Text
assessmentTargetName :: Text
resourceGroupArn :: Maybe Text
$sel:assessmentTargetName:CreateAssessmentTarget' :: CreateAssessmentTarget -> Text
$sel:resourceGroupArn:CreateAssessmentTarget' :: CreateAssessmentTarget -> Maybe Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
resourceGroupArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
assessmentTargetName

instance Prelude.NFData CreateAssessmentTarget where
  rnf :: CreateAssessmentTarget -> ()
rnf CreateAssessmentTarget' {Maybe Text
Text
assessmentTargetName :: Text
resourceGroupArn :: Maybe Text
$sel:assessmentTargetName:CreateAssessmentTarget' :: CreateAssessmentTarget -> Text
$sel:resourceGroupArn:CreateAssessmentTarget' :: CreateAssessmentTarget -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
resourceGroupArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
assessmentTargetName

instance Data.ToHeaders CreateAssessmentTarget where
  toHeaders :: CreateAssessmentTarget -> 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
"InspectorService.CreateAssessmentTarget" ::
                          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 CreateAssessmentTarget where
  toJSON :: CreateAssessmentTarget -> Value
toJSON CreateAssessmentTarget' {Maybe Text
Text
assessmentTargetName :: Text
resourceGroupArn :: Maybe Text
$sel:assessmentTargetName:CreateAssessmentTarget' :: CreateAssessmentTarget -> Text
$sel:resourceGroupArn:CreateAssessmentTarget' :: CreateAssessmentTarget -> Maybe Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"resourceGroupArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
resourceGroupArn,
            forall a. a -> Maybe a
Prelude.Just
              ( Key
"assessmentTargetName"
                  forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
assessmentTargetName
              )
          ]
      )

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

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

-- | /See:/ 'newCreateAssessmentTargetResponse' smart constructor.
data CreateAssessmentTargetResponse = CreateAssessmentTargetResponse'
  { -- | The response's http status code.
    CreateAssessmentTargetResponse -> Int
httpStatus :: Prelude.Int,
    -- | The ARN that specifies the assessment target that is created.
    CreateAssessmentTargetResponse -> Text
assessmentTargetArn :: Prelude.Text
  }
  deriving (CreateAssessmentTargetResponse
-> CreateAssessmentTargetResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateAssessmentTargetResponse
-> CreateAssessmentTargetResponse -> Bool
$c/= :: CreateAssessmentTargetResponse
-> CreateAssessmentTargetResponse -> Bool
== :: CreateAssessmentTargetResponse
-> CreateAssessmentTargetResponse -> Bool
$c== :: CreateAssessmentTargetResponse
-> CreateAssessmentTargetResponse -> Bool
Prelude.Eq, ReadPrec [CreateAssessmentTargetResponse]
ReadPrec CreateAssessmentTargetResponse
Int -> ReadS CreateAssessmentTargetResponse
ReadS [CreateAssessmentTargetResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateAssessmentTargetResponse]
$creadListPrec :: ReadPrec [CreateAssessmentTargetResponse]
readPrec :: ReadPrec CreateAssessmentTargetResponse
$creadPrec :: ReadPrec CreateAssessmentTargetResponse
readList :: ReadS [CreateAssessmentTargetResponse]
$creadList :: ReadS [CreateAssessmentTargetResponse]
readsPrec :: Int -> ReadS CreateAssessmentTargetResponse
$creadsPrec :: Int -> ReadS CreateAssessmentTargetResponse
Prelude.Read, Int -> CreateAssessmentTargetResponse -> ShowS
[CreateAssessmentTargetResponse] -> ShowS
CreateAssessmentTargetResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateAssessmentTargetResponse] -> ShowS
$cshowList :: [CreateAssessmentTargetResponse] -> ShowS
show :: CreateAssessmentTargetResponse -> String
$cshow :: CreateAssessmentTargetResponse -> String
showsPrec :: Int -> CreateAssessmentTargetResponse -> ShowS
$cshowsPrec :: Int -> CreateAssessmentTargetResponse -> ShowS
Prelude.Show, forall x.
Rep CreateAssessmentTargetResponse x
-> CreateAssessmentTargetResponse
forall x.
CreateAssessmentTargetResponse
-> Rep CreateAssessmentTargetResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep CreateAssessmentTargetResponse x
-> CreateAssessmentTargetResponse
$cfrom :: forall x.
CreateAssessmentTargetResponse
-> Rep CreateAssessmentTargetResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateAssessmentTargetResponse' 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', 'createAssessmentTargetResponse_httpStatus' - The response's http status code.
--
-- 'assessmentTargetArn', 'createAssessmentTargetResponse_assessmentTargetArn' - The ARN that specifies the assessment target that is created.
newCreateAssessmentTargetResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  -- | 'assessmentTargetArn'
  Prelude.Text ->
  CreateAssessmentTargetResponse
newCreateAssessmentTargetResponse :: Int -> Text -> CreateAssessmentTargetResponse
newCreateAssessmentTargetResponse
  Int
pHttpStatus_
  Text
pAssessmentTargetArn_ =
    CreateAssessmentTargetResponse'
      { $sel:httpStatus:CreateAssessmentTargetResponse' :: Int
httpStatus =
          Int
pHttpStatus_,
        $sel:assessmentTargetArn:CreateAssessmentTargetResponse' :: Text
assessmentTargetArn = Text
pAssessmentTargetArn_
      }

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

-- | The ARN that specifies the assessment target that is created.
createAssessmentTargetResponse_assessmentTargetArn :: Lens.Lens' CreateAssessmentTargetResponse Prelude.Text
createAssessmentTargetResponse_assessmentTargetArn :: Lens' CreateAssessmentTargetResponse Text
createAssessmentTargetResponse_assessmentTargetArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateAssessmentTargetResponse' {Text
assessmentTargetArn :: Text
$sel:assessmentTargetArn:CreateAssessmentTargetResponse' :: CreateAssessmentTargetResponse -> Text
assessmentTargetArn} -> Text
assessmentTargetArn) (\s :: CreateAssessmentTargetResponse
s@CreateAssessmentTargetResponse' {} Text
a -> CreateAssessmentTargetResponse
s {$sel:assessmentTargetArn:CreateAssessmentTargetResponse' :: Text
assessmentTargetArn = Text
a} :: CreateAssessmentTargetResponse)

instance
  Prelude.NFData
    CreateAssessmentTargetResponse
  where
  rnf :: CreateAssessmentTargetResponse -> ()
rnf CreateAssessmentTargetResponse' {Int
Text
assessmentTargetArn :: Text
httpStatus :: Int
$sel:assessmentTargetArn:CreateAssessmentTargetResponse' :: CreateAssessmentTargetResponse -> Text
$sel:httpStatus:CreateAssessmentTargetResponse' :: CreateAssessmentTargetResponse -> 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
assessmentTargetArn