{-# 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.NetworkFirewall.CreateFirewall
-- 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 an Network Firewall Firewall and accompanying FirewallStatus for
-- a VPC.
--
-- The firewall defines the configuration settings for an Network Firewall
-- firewall. The settings that you can define at creation include the
-- firewall policy, the subnets in your VPC to use for the firewall
-- endpoints, and any tags that are attached to the firewall Amazon Web
-- Services resource.
--
-- After you create a firewall, you can provide additional settings, like
-- the logging configuration.
--
-- To update the settings for a firewall, you use the operations that apply
-- to the settings themselves, for example UpdateLoggingConfiguration,
-- AssociateSubnets, and UpdateFirewallDeleteProtection.
--
-- To manage a firewall\'s tags, use the standard Amazon Web Services
-- resource tagging operations, ListTagsForResource, TagResource, and
-- UntagResource.
--
-- To retrieve information about firewalls, use ListFirewalls and
-- DescribeFirewall.
module Amazonka.NetworkFirewall.CreateFirewall
  ( -- * Creating a Request
    CreateFirewall (..),
    newCreateFirewall,

    -- * Request Lenses
    createFirewall_deleteProtection,
    createFirewall_description,
    createFirewall_encryptionConfiguration,
    createFirewall_firewallPolicyChangeProtection,
    createFirewall_subnetChangeProtection,
    createFirewall_tags,
    createFirewall_firewallName,
    createFirewall_firewallPolicyArn,
    createFirewall_vpcId,
    createFirewall_subnetMappings,

    -- * Destructuring the Response
    CreateFirewallResponse (..),
    newCreateFirewallResponse,

    -- * Response Lenses
    createFirewallResponse_firewall,
    createFirewallResponse_firewallStatus,
    createFirewallResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateFirewall' smart constructor.
data CreateFirewall = CreateFirewall'
  { -- | A flag indicating whether it is possible to delete the firewall. A
    -- setting of @TRUE@ indicates that the firewall is protected against
    -- deletion. Use this setting to protect against accidentally deleting a
    -- firewall that is in use. When you create a firewall, the operation
    -- initializes this flag to @TRUE@.
    CreateFirewall -> Maybe Bool
deleteProtection :: Prelude.Maybe Prelude.Bool,
    -- | A description of the firewall.
    CreateFirewall -> Maybe Text
description :: Prelude.Maybe Prelude.Text,
    -- | A complex type that contains settings for encryption of your firewall
    -- resources.
    CreateFirewall -> Maybe EncryptionConfiguration
encryptionConfiguration :: Prelude.Maybe EncryptionConfiguration,
    -- | A setting indicating whether the firewall is protected against a change
    -- to the firewall policy association. Use this setting to protect against
    -- accidentally modifying the firewall policy for a firewall that is in
    -- use. When you create a firewall, the operation initializes this setting
    -- to @TRUE@.
    CreateFirewall -> Maybe Bool
firewallPolicyChangeProtection :: Prelude.Maybe Prelude.Bool,
    -- | A setting indicating whether the firewall is protected against changes
    -- to the subnet associations. Use this setting to protect against
    -- accidentally modifying the subnet associations for a firewall that is in
    -- use. When you create a firewall, the operation initializes this setting
    -- to @TRUE@.
    CreateFirewall -> Maybe Bool
subnetChangeProtection :: Prelude.Maybe Prelude.Bool,
    -- | The key:value pairs to associate with the resource.
    CreateFirewall -> Maybe (NonEmpty Tag)
tags :: Prelude.Maybe (Prelude.NonEmpty Tag),
    -- | The descriptive name of the firewall. You can\'t change the name of a
    -- firewall after you create it.
    CreateFirewall -> Text
firewallName :: Prelude.Text,
    -- | The Amazon Resource Name (ARN) of the FirewallPolicy that you want to
    -- use for the firewall.
    CreateFirewall -> Text
firewallPolicyArn :: Prelude.Text,
    -- | The unique identifier of the VPC where Network Firewall should create
    -- the firewall.
    --
    -- You can\'t change this setting after you create the firewall.
    CreateFirewall -> Text
vpcId :: Prelude.Text,
    -- | The public subnets to use for your Network Firewall firewalls. Each
    -- subnet must belong to a different Availability Zone in the VPC. Network
    -- Firewall creates a firewall endpoint in each subnet.
    CreateFirewall -> [SubnetMapping]
subnetMappings :: [SubnetMapping]
  }
  deriving (CreateFirewall -> CreateFirewall -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateFirewall -> CreateFirewall -> Bool
$c/= :: CreateFirewall -> CreateFirewall -> Bool
== :: CreateFirewall -> CreateFirewall -> Bool
$c== :: CreateFirewall -> CreateFirewall -> Bool
Prelude.Eq, ReadPrec [CreateFirewall]
ReadPrec CreateFirewall
Int -> ReadS CreateFirewall
ReadS [CreateFirewall]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateFirewall]
$creadListPrec :: ReadPrec [CreateFirewall]
readPrec :: ReadPrec CreateFirewall
$creadPrec :: ReadPrec CreateFirewall
readList :: ReadS [CreateFirewall]
$creadList :: ReadS [CreateFirewall]
readsPrec :: Int -> ReadS CreateFirewall
$creadsPrec :: Int -> ReadS CreateFirewall
Prelude.Read, Int -> CreateFirewall -> ShowS
[CreateFirewall] -> ShowS
CreateFirewall -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateFirewall] -> ShowS
$cshowList :: [CreateFirewall] -> ShowS
show :: CreateFirewall -> String
$cshow :: CreateFirewall -> String
showsPrec :: Int -> CreateFirewall -> ShowS
$cshowsPrec :: Int -> CreateFirewall -> ShowS
Prelude.Show, forall x. Rep CreateFirewall x -> CreateFirewall
forall x. CreateFirewall -> Rep CreateFirewall x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateFirewall x -> CreateFirewall
$cfrom :: forall x. CreateFirewall -> Rep CreateFirewall x
Prelude.Generic)

-- |
-- Create a value of 'CreateFirewall' 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:
--
-- 'deleteProtection', 'createFirewall_deleteProtection' - A flag indicating whether it is possible to delete the firewall. A
-- setting of @TRUE@ indicates that the firewall is protected against
-- deletion. Use this setting to protect against accidentally deleting a
-- firewall that is in use. When you create a firewall, the operation
-- initializes this flag to @TRUE@.
--
-- 'description', 'createFirewall_description' - A description of the firewall.
--
-- 'encryptionConfiguration', 'createFirewall_encryptionConfiguration' - A complex type that contains settings for encryption of your firewall
-- resources.
--
-- 'firewallPolicyChangeProtection', 'createFirewall_firewallPolicyChangeProtection' - A setting indicating whether the firewall is protected against a change
-- to the firewall policy association. Use this setting to protect against
-- accidentally modifying the firewall policy for a firewall that is in
-- use. When you create a firewall, the operation initializes this setting
-- to @TRUE@.
--
-- 'subnetChangeProtection', 'createFirewall_subnetChangeProtection' - A setting indicating whether the firewall is protected against changes
-- to the subnet associations. Use this setting to protect against
-- accidentally modifying the subnet associations for a firewall that is in
-- use. When you create a firewall, the operation initializes this setting
-- to @TRUE@.
--
-- 'tags', 'createFirewall_tags' - The key:value pairs to associate with the resource.
--
-- 'firewallName', 'createFirewall_firewallName' - The descriptive name of the firewall. You can\'t change the name of a
-- firewall after you create it.
--
-- 'firewallPolicyArn', 'createFirewall_firewallPolicyArn' - The Amazon Resource Name (ARN) of the FirewallPolicy that you want to
-- use for the firewall.
--
-- 'vpcId', 'createFirewall_vpcId' - The unique identifier of the VPC where Network Firewall should create
-- the firewall.
--
-- You can\'t change this setting after you create the firewall.
--
-- 'subnetMappings', 'createFirewall_subnetMappings' - The public subnets to use for your Network Firewall firewalls. Each
-- subnet must belong to a different Availability Zone in the VPC. Network
-- Firewall creates a firewall endpoint in each subnet.
newCreateFirewall ::
  -- | 'firewallName'
  Prelude.Text ->
  -- | 'firewallPolicyArn'
  Prelude.Text ->
  -- | 'vpcId'
  Prelude.Text ->
  CreateFirewall
newCreateFirewall :: Text -> Text -> Text -> CreateFirewall
newCreateFirewall
  Text
pFirewallName_
  Text
pFirewallPolicyArn_
  Text
pVpcId_ =
    CreateFirewall'
      { $sel:deleteProtection:CreateFirewall' :: Maybe Bool
deleteProtection = forall a. Maybe a
Prelude.Nothing,
        $sel:description:CreateFirewall' :: Maybe Text
description = forall a. Maybe a
Prelude.Nothing,
        $sel:encryptionConfiguration:CreateFirewall' :: Maybe EncryptionConfiguration
encryptionConfiguration = forall a. Maybe a
Prelude.Nothing,
        $sel:firewallPolicyChangeProtection:CreateFirewall' :: Maybe Bool
firewallPolicyChangeProtection = forall a. Maybe a
Prelude.Nothing,
        $sel:subnetChangeProtection:CreateFirewall' :: Maybe Bool
subnetChangeProtection = forall a. Maybe a
Prelude.Nothing,
        $sel:tags:CreateFirewall' :: Maybe (NonEmpty Tag)
tags = forall a. Maybe a
Prelude.Nothing,
        $sel:firewallName:CreateFirewall' :: Text
firewallName = Text
pFirewallName_,
        $sel:firewallPolicyArn:CreateFirewall' :: Text
firewallPolicyArn = Text
pFirewallPolicyArn_,
        $sel:vpcId:CreateFirewall' :: Text
vpcId = Text
pVpcId_,
        $sel:subnetMappings:CreateFirewall' :: [SubnetMapping]
subnetMappings = forall a. Monoid a => a
Prelude.mempty
      }

-- | A flag indicating whether it is possible to delete the firewall. A
-- setting of @TRUE@ indicates that the firewall is protected against
-- deletion. Use this setting to protect against accidentally deleting a
-- firewall that is in use. When you create a firewall, the operation
-- initializes this flag to @TRUE@.
createFirewall_deleteProtection :: Lens.Lens' CreateFirewall (Prelude.Maybe Prelude.Bool)
createFirewall_deleteProtection :: Lens' CreateFirewall (Maybe Bool)
createFirewall_deleteProtection = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe Bool
deleteProtection :: Maybe Bool
$sel:deleteProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
deleteProtection} -> Maybe Bool
deleteProtection) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe Bool
a -> CreateFirewall
s {$sel:deleteProtection:CreateFirewall' :: Maybe Bool
deleteProtection = Maybe Bool
a} :: CreateFirewall)

-- | A description of the firewall.
createFirewall_description :: Lens.Lens' CreateFirewall (Prelude.Maybe Prelude.Text)
createFirewall_description :: Lens' CreateFirewall (Maybe Text)
createFirewall_description = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe Text
description :: Maybe Text
$sel:description:CreateFirewall' :: CreateFirewall -> Maybe Text
description} -> Maybe Text
description) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe Text
a -> CreateFirewall
s {$sel:description:CreateFirewall' :: Maybe Text
description = Maybe Text
a} :: CreateFirewall)

-- | A complex type that contains settings for encryption of your firewall
-- resources.
createFirewall_encryptionConfiguration :: Lens.Lens' CreateFirewall (Prelude.Maybe EncryptionConfiguration)
createFirewall_encryptionConfiguration :: Lens' CreateFirewall (Maybe EncryptionConfiguration)
createFirewall_encryptionConfiguration = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe EncryptionConfiguration
encryptionConfiguration :: Maybe EncryptionConfiguration
$sel:encryptionConfiguration:CreateFirewall' :: CreateFirewall -> Maybe EncryptionConfiguration
encryptionConfiguration} -> Maybe EncryptionConfiguration
encryptionConfiguration) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe EncryptionConfiguration
a -> CreateFirewall
s {$sel:encryptionConfiguration:CreateFirewall' :: Maybe EncryptionConfiguration
encryptionConfiguration = Maybe EncryptionConfiguration
a} :: CreateFirewall)

-- | A setting indicating whether the firewall is protected against a change
-- to the firewall policy association. Use this setting to protect against
-- accidentally modifying the firewall policy for a firewall that is in
-- use. When you create a firewall, the operation initializes this setting
-- to @TRUE@.
createFirewall_firewallPolicyChangeProtection :: Lens.Lens' CreateFirewall (Prelude.Maybe Prelude.Bool)
createFirewall_firewallPolicyChangeProtection :: Lens' CreateFirewall (Maybe Bool)
createFirewall_firewallPolicyChangeProtection = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe Bool
firewallPolicyChangeProtection :: Maybe Bool
$sel:firewallPolicyChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
firewallPolicyChangeProtection} -> Maybe Bool
firewallPolicyChangeProtection) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe Bool
a -> CreateFirewall
s {$sel:firewallPolicyChangeProtection:CreateFirewall' :: Maybe Bool
firewallPolicyChangeProtection = Maybe Bool
a} :: CreateFirewall)

-- | A setting indicating whether the firewall is protected against changes
-- to the subnet associations. Use this setting to protect against
-- accidentally modifying the subnet associations for a firewall that is in
-- use. When you create a firewall, the operation initializes this setting
-- to @TRUE@.
createFirewall_subnetChangeProtection :: Lens.Lens' CreateFirewall (Prelude.Maybe Prelude.Bool)
createFirewall_subnetChangeProtection :: Lens' CreateFirewall (Maybe Bool)
createFirewall_subnetChangeProtection = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe Bool
subnetChangeProtection :: Maybe Bool
$sel:subnetChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
subnetChangeProtection} -> Maybe Bool
subnetChangeProtection) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe Bool
a -> CreateFirewall
s {$sel:subnetChangeProtection:CreateFirewall' :: Maybe Bool
subnetChangeProtection = Maybe Bool
a} :: CreateFirewall)

-- | The key:value pairs to associate with the resource.
createFirewall_tags :: Lens.Lens' CreateFirewall (Prelude.Maybe (Prelude.NonEmpty Tag))
createFirewall_tags :: Lens' CreateFirewall (Maybe (NonEmpty Tag))
createFirewall_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Maybe (NonEmpty Tag)
tags :: Maybe (NonEmpty Tag)
$sel:tags:CreateFirewall' :: CreateFirewall -> Maybe (NonEmpty Tag)
tags} -> Maybe (NonEmpty Tag)
tags) (\s :: CreateFirewall
s@CreateFirewall' {} Maybe (NonEmpty Tag)
a -> CreateFirewall
s {$sel:tags:CreateFirewall' :: Maybe (NonEmpty Tag)
tags = Maybe (NonEmpty Tag)
a} :: CreateFirewall) 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 descriptive name of the firewall. You can\'t change the name of a
-- firewall after you create it.
createFirewall_firewallName :: Lens.Lens' CreateFirewall Prelude.Text
createFirewall_firewallName :: Lens' CreateFirewall Text
createFirewall_firewallName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Text
firewallName :: Text
$sel:firewallName:CreateFirewall' :: CreateFirewall -> Text
firewallName} -> Text
firewallName) (\s :: CreateFirewall
s@CreateFirewall' {} Text
a -> CreateFirewall
s {$sel:firewallName:CreateFirewall' :: Text
firewallName = Text
a} :: CreateFirewall)

-- | The Amazon Resource Name (ARN) of the FirewallPolicy that you want to
-- use for the firewall.
createFirewall_firewallPolicyArn :: Lens.Lens' CreateFirewall Prelude.Text
createFirewall_firewallPolicyArn :: Lens' CreateFirewall Text
createFirewall_firewallPolicyArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Text
firewallPolicyArn :: Text
$sel:firewallPolicyArn:CreateFirewall' :: CreateFirewall -> Text
firewallPolicyArn} -> Text
firewallPolicyArn) (\s :: CreateFirewall
s@CreateFirewall' {} Text
a -> CreateFirewall
s {$sel:firewallPolicyArn:CreateFirewall' :: Text
firewallPolicyArn = Text
a} :: CreateFirewall)

-- | The unique identifier of the VPC where Network Firewall should create
-- the firewall.
--
-- You can\'t change this setting after you create the firewall.
createFirewall_vpcId :: Lens.Lens' CreateFirewall Prelude.Text
createFirewall_vpcId :: Lens' CreateFirewall Text
createFirewall_vpcId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {Text
vpcId :: Text
$sel:vpcId:CreateFirewall' :: CreateFirewall -> Text
vpcId} -> Text
vpcId) (\s :: CreateFirewall
s@CreateFirewall' {} Text
a -> CreateFirewall
s {$sel:vpcId:CreateFirewall' :: Text
vpcId = Text
a} :: CreateFirewall)

-- | The public subnets to use for your Network Firewall firewalls. Each
-- subnet must belong to a different Availability Zone in the VPC. Network
-- Firewall creates a firewall endpoint in each subnet.
createFirewall_subnetMappings :: Lens.Lens' CreateFirewall [SubnetMapping]
createFirewall_subnetMappings :: Lens' CreateFirewall [SubnetMapping]
createFirewall_subnetMappings = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewall' {[SubnetMapping]
subnetMappings :: [SubnetMapping]
$sel:subnetMappings:CreateFirewall' :: CreateFirewall -> [SubnetMapping]
subnetMappings} -> [SubnetMapping]
subnetMappings) (\s :: CreateFirewall
s@CreateFirewall' {} [SubnetMapping]
a -> CreateFirewall
s {$sel:subnetMappings:CreateFirewall' :: [SubnetMapping]
subnetMappings = [SubnetMapping]
a} :: CreateFirewall) 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 CreateFirewall where
  type
    AWSResponse CreateFirewall =
      CreateFirewallResponse
  request :: (Service -> Service) -> CreateFirewall -> Request CreateFirewall
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 CreateFirewall
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateFirewall)))
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 Firewall
-> Maybe FirewallStatus -> Int -> CreateFirewallResponse
CreateFirewallResponse'
            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
"Firewall")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"FirewallStatus")
            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 CreateFirewall where
  hashWithSalt :: Int -> CreateFirewall -> Int
hashWithSalt Int
_salt CreateFirewall' {[SubnetMapping]
Maybe Bool
Maybe (NonEmpty Tag)
Maybe Text
Maybe EncryptionConfiguration
Text
subnetMappings :: [SubnetMapping]
vpcId :: Text
firewallPolicyArn :: Text
firewallName :: Text
tags :: Maybe (NonEmpty Tag)
subnetChangeProtection :: Maybe Bool
firewallPolicyChangeProtection :: Maybe Bool
encryptionConfiguration :: Maybe EncryptionConfiguration
description :: Maybe Text
deleteProtection :: Maybe Bool
$sel:subnetMappings:CreateFirewall' :: CreateFirewall -> [SubnetMapping]
$sel:vpcId:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallPolicyArn:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallName:CreateFirewall' :: CreateFirewall -> Text
$sel:tags:CreateFirewall' :: CreateFirewall -> Maybe (NonEmpty Tag)
$sel:subnetChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:firewallPolicyChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:encryptionConfiguration:CreateFirewall' :: CreateFirewall -> Maybe EncryptionConfiguration
$sel:description:CreateFirewall' :: CreateFirewall -> Maybe Text
$sel:deleteProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
deleteProtection
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
description
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe EncryptionConfiguration
encryptionConfiguration
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
firewallPolicyChangeProtection
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
subnetChangeProtection
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Tag)
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
firewallName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
firewallPolicyArn
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
vpcId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` [SubnetMapping]
subnetMappings

instance Prelude.NFData CreateFirewall where
  rnf :: CreateFirewall -> ()
rnf CreateFirewall' {[SubnetMapping]
Maybe Bool
Maybe (NonEmpty Tag)
Maybe Text
Maybe EncryptionConfiguration
Text
subnetMappings :: [SubnetMapping]
vpcId :: Text
firewallPolicyArn :: Text
firewallName :: Text
tags :: Maybe (NonEmpty Tag)
subnetChangeProtection :: Maybe Bool
firewallPolicyChangeProtection :: Maybe Bool
encryptionConfiguration :: Maybe EncryptionConfiguration
description :: Maybe Text
deleteProtection :: Maybe Bool
$sel:subnetMappings:CreateFirewall' :: CreateFirewall -> [SubnetMapping]
$sel:vpcId:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallPolicyArn:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallName:CreateFirewall' :: CreateFirewall -> Text
$sel:tags:CreateFirewall' :: CreateFirewall -> Maybe (NonEmpty Tag)
$sel:subnetChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:firewallPolicyChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:encryptionConfiguration:CreateFirewall' :: CreateFirewall -> Maybe EncryptionConfiguration
$sel:description:CreateFirewall' :: CreateFirewall -> Maybe Text
$sel:deleteProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
deleteProtection
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
description
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe EncryptionConfiguration
encryptionConfiguration
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
firewallPolicyChangeProtection
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
subnetChangeProtection
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Tag)
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
firewallName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
firewallPolicyArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
vpcId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [SubnetMapping]
subnetMappings

instance Data.ToHeaders CreateFirewall where
  toHeaders :: CreateFirewall -> 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
"NetworkFirewall_20201112.CreateFirewall" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.0" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON CreateFirewall where
  toJSON :: CreateFirewall -> Value
toJSON CreateFirewall' {[SubnetMapping]
Maybe Bool
Maybe (NonEmpty Tag)
Maybe Text
Maybe EncryptionConfiguration
Text
subnetMappings :: [SubnetMapping]
vpcId :: Text
firewallPolicyArn :: Text
firewallName :: Text
tags :: Maybe (NonEmpty Tag)
subnetChangeProtection :: Maybe Bool
firewallPolicyChangeProtection :: Maybe Bool
encryptionConfiguration :: Maybe EncryptionConfiguration
description :: Maybe Text
deleteProtection :: Maybe Bool
$sel:subnetMappings:CreateFirewall' :: CreateFirewall -> [SubnetMapping]
$sel:vpcId:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallPolicyArn:CreateFirewall' :: CreateFirewall -> Text
$sel:firewallName:CreateFirewall' :: CreateFirewall -> Text
$sel:tags:CreateFirewall' :: CreateFirewall -> Maybe (NonEmpty Tag)
$sel:subnetChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:firewallPolicyChangeProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
$sel:encryptionConfiguration:CreateFirewall' :: CreateFirewall -> Maybe EncryptionConfiguration
$sel:description:CreateFirewall' :: CreateFirewall -> Maybe Text
$sel:deleteProtection:CreateFirewall' :: CreateFirewall -> Maybe Bool
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"DeleteProtection" 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 Bool
deleteProtection,
            (Key
"Description" 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
description,
            (Key
"EncryptionConfiguration" 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 EncryptionConfiguration
encryptionConfiguration,
            (Key
"FirewallPolicyChangeProtection" 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 Bool
firewallPolicyChangeProtection,
            (Key
"SubnetChangeProtection" 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 Bool
subnetChangeProtection,
            (Key
"Tags" 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 (NonEmpty Tag)
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"FirewallName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
firewallName),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"FirewallPolicyArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
firewallPolicyArn),
            forall a. a -> Maybe a
Prelude.Just (Key
"VpcId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
vpcId),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"SubnetMappings" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= [SubnetMapping]
subnetMappings)
          ]
      )

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

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

-- | /See:/ 'newCreateFirewallResponse' smart constructor.
data CreateFirewallResponse = CreateFirewallResponse'
  { -- | The configuration settings for the firewall. These settings include the
    -- firewall policy and the subnets in your VPC to use for the firewall
    -- endpoints.
    CreateFirewallResponse -> Maybe Firewall
firewall :: Prelude.Maybe Firewall,
    -- | Detailed information about the current status of a Firewall. You can
    -- retrieve this for a firewall by calling DescribeFirewall and providing
    -- the firewall name and ARN.
    CreateFirewallResponse -> Maybe FirewallStatus
firewallStatus :: Prelude.Maybe FirewallStatus,
    -- | The response's http status code.
    CreateFirewallResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateFirewallResponse -> CreateFirewallResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateFirewallResponse -> CreateFirewallResponse -> Bool
$c/= :: CreateFirewallResponse -> CreateFirewallResponse -> Bool
== :: CreateFirewallResponse -> CreateFirewallResponse -> Bool
$c== :: CreateFirewallResponse -> CreateFirewallResponse -> Bool
Prelude.Eq, ReadPrec [CreateFirewallResponse]
ReadPrec CreateFirewallResponse
Int -> ReadS CreateFirewallResponse
ReadS [CreateFirewallResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateFirewallResponse]
$creadListPrec :: ReadPrec [CreateFirewallResponse]
readPrec :: ReadPrec CreateFirewallResponse
$creadPrec :: ReadPrec CreateFirewallResponse
readList :: ReadS [CreateFirewallResponse]
$creadList :: ReadS [CreateFirewallResponse]
readsPrec :: Int -> ReadS CreateFirewallResponse
$creadsPrec :: Int -> ReadS CreateFirewallResponse
Prelude.Read, Int -> CreateFirewallResponse -> ShowS
[CreateFirewallResponse] -> ShowS
CreateFirewallResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateFirewallResponse] -> ShowS
$cshowList :: [CreateFirewallResponse] -> ShowS
show :: CreateFirewallResponse -> String
$cshow :: CreateFirewallResponse -> String
showsPrec :: Int -> CreateFirewallResponse -> ShowS
$cshowsPrec :: Int -> CreateFirewallResponse -> ShowS
Prelude.Show, forall x. Rep CreateFirewallResponse x -> CreateFirewallResponse
forall x. CreateFirewallResponse -> Rep CreateFirewallResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateFirewallResponse x -> CreateFirewallResponse
$cfrom :: forall x. CreateFirewallResponse -> Rep CreateFirewallResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateFirewallResponse' 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:
--
-- 'firewall', 'createFirewallResponse_firewall' - The configuration settings for the firewall. These settings include the
-- firewall policy and the subnets in your VPC to use for the firewall
-- endpoints.
--
-- 'firewallStatus', 'createFirewallResponse_firewallStatus' - Detailed information about the current status of a Firewall. You can
-- retrieve this for a firewall by calling DescribeFirewall and providing
-- the firewall name and ARN.
--
-- 'httpStatus', 'createFirewallResponse_httpStatus' - The response's http status code.
newCreateFirewallResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateFirewallResponse
newCreateFirewallResponse :: Int -> CreateFirewallResponse
newCreateFirewallResponse Int
pHttpStatus_ =
  CreateFirewallResponse'
    { $sel:firewall:CreateFirewallResponse' :: Maybe Firewall
firewall = forall a. Maybe a
Prelude.Nothing,
      $sel:firewallStatus:CreateFirewallResponse' :: Maybe FirewallStatus
firewallStatus = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateFirewallResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The configuration settings for the firewall. These settings include the
-- firewall policy and the subnets in your VPC to use for the firewall
-- endpoints.
createFirewallResponse_firewall :: Lens.Lens' CreateFirewallResponse (Prelude.Maybe Firewall)
createFirewallResponse_firewall :: Lens' CreateFirewallResponse (Maybe Firewall)
createFirewallResponse_firewall = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewallResponse' {Maybe Firewall
firewall :: Maybe Firewall
$sel:firewall:CreateFirewallResponse' :: CreateFirewallResponse -> Maybe Firewall
firewall} -> Maybe Firewall
firewall) (\s :: CreateFirewallResponse
s@CreateFirewallResponse' {} Maybe Firewall
a -> CreateFirewallResponse
s {$sel:firewall:CreateFirewallResponse' :: Maybe Firewall
firewall = Maybe Firewall
a} :: CreateFirewallResponse)

-- | Detailed information about the current status of a Firewall. You can
-- retrieve this for a firewall by calling DescribeFirewall and providing
-- the firewall name and ARN.
createFirewallResponse_firewallStatus :: Lens.Lens' CreateFirewallResponse (Prelude.Maybe FirewallStatus)
createFirewallResponse_firewallStatus :: Lens' CreateFirewallResponse (Maybe FirewallStatus)
createFirewallResponse_firewallStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateFirewallResponse' {Maybe FirewallStatus
firewallStatus :: Maybe FirewallStatus
$sel:firewallStatus:CreateFirewallResponse' :: CreateFirewallResponse -> Maybe FirewallStatus
firewallStatus} -> Maybe FirewallStatus
firewallStatus) (\s :: CreateFirewallResponse
s@CreateFirewallResponse' {} Maybe FirewallStatus
a -> CreateFirewallResponse
s {$sel:firewallStatus:CreateFirewallResponse' :: Maybe FirewallStatus
firewallStatus = Maybe FirewallStatus
a} :: CreateFirewallResponse)

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

instance Prelude.NFData CreateFirewallResponse where
  rnf :: CreateFirewallResponse -> ()
rnf CreateFirewallResponse' {Int
Maybe FirewallStatus
Maybe Firewall
httpStatus :: Int
firewallStatus :: Maybe FirewallStatus
firewall :: Maybe Firewall
$sel:httpStatus:CreateFirewallResponse' :: CreateFirewallResponse -> Int
$sel:firewallStatus:CreateFirewallResponse' :: CreateFirewallResponse -> Maybe FirewallStatus
$sel:firewall:CreateFirewallResponse' :: CreateFirewallResponse -> Maybe Firewall
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Firewall
firewall
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe FirewallStatus
firewallStatus
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus