{-# 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.StorageGateway.AddUploadBuffer
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Configures one or more gateway local disks as upload buffer for a
-- specified gateway. This operation is supported for the stored volume,
-- cached volume, and tape gateway types.
--
-- In the request, you specify the gateway Amazon Resource Name (ARN) to
-- which you want to add upload buffer, and one or more disk IDs that you
-- want to configure as upload buffer.
module Amazonka.StorageGateway.AddUploadBuffer
  ( -- * Creating a Request
    AddUploadBuffer (..),
    newAddUploadBuffer,

    -- * Request Lenses
    addUploadBuffer_gatewayARN,
    addUploadBuffer_diskIds,

    -- * Destructuring the Response
    AddUploadBufferResponse (..),
    newAddUploadBufferResponse,

    -- * Response Lenses
    addUploadBufferResponse_gatewayARN,
    addUploadBufferResponse_httpStatus,
  )
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 qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response
import Amazonka.StorageGateway.Types

-- | /See:/ 'newAddUploadBuffer' smart constructor.
data AddUploadBuffer = AddUploadBuffer'
  { AddUploadBuffer -> Text
gatewayARN :: Prelude.Text,
    -- | An array of strings that identify disks that are to be configured as
    -- working storage. Each string has a minimum length of 1 and maximum
    -- length of 300. You can get the disk IDs from the ListLocalDisks API.
    AddUploadBuffer -> [Text]
diskIds :: [Prelude.Text]
  }
  deriving (AddUploadBuffer -> AddUploadBuffer -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AddUploadBuffer -> AddUploadBuffer -> Bool
$c/= :: AddUploadBuffer -> AddUploadBuffer -> Bool
== :: AddUploadBuffer -> AddUploadBuffer -> Bool
$c== :: AddUploadBuffer -> AddUploadBuffer -> Bool
Prelude.Eq, ReadPrec [AddUploadBuffer]
ReadPrec AddUploadBuffer
Int -> ReadS AddUploadBuffer
ReadS [AddUploadBuffer]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AddUploadBuffer]
$creadListPrec :: ReadPrec [AddUploadBuffer]
readPrec :: ReadPrec AddUploadBuffer
$creadPrec :: ReadPrec AddUploadBuffer
readList :: ReadS [AddUploadBuffer]
$creadList :: ReadS [AddUploadBuffer]
readsPrec :: Int -> ReadS AddUploadBuffer
$creadsPrec :: Int -> ReadS AddUploadBuffer
Prelude.Read, Int -> AddUploadBuffer -> ShowS
[AddUploadBuffer] -> ShowS
AddUploadBuffer -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AddUploadBuffer] -> ShowS
$cshowList :: [AddUploadBuffer] -> ShowS
show :: AddUploadBuffer -> String
$cshow :: AddUploadBuffer -> String
showsPrec :: Int -> AddUploadBuffer -> ShowS
$cshowsPrec :: Int -> AddUploadBuffer -> ShowS
Prelude.Show, forall x. Rep AddUploadBuffer x -> AddUploadBuffer
forall x. AddUploadBuffer -> Rep AddUploadBuffer x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep AddUploadBuffer x -> AddUploadBuffer
$cfrom :: forall x. AddUploadBuffer -> Rep AddUploadBuffer x
Prelude.Generic)

-- |
-- Create a value of 'AddUploadBuffer' 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:
--
-- 'gatewayARN', 'addUploadBuffer_gatewayARN' - Undocumented member.
--
-- 'diskIds', 'addUploadBuffer_diskIds' - An array of strings that identify disks that are to be configured as
-- working storage. Each string has a minimum length of 1 and maximum
-- length of 300. You can get the disk IDs from the ListLocalDisks API.
newAddUploadBuffer ::
  -- | 'gatewayARN'
  Prelude.Text ->
  AddUploadBuffer
newAddUploadBuffer :: Text -> AddUploadBuffer
newAddUploadBuffer Text
pGatewayARN_ =
  AddUploadBuffer'
    { $sel:gatewayARN:AddUploadBuffer' :: Text
gatewayARN = Text
pGatewayARN_,
      $sel:diskIds:AddUploadBuffer' :: [Text]
diskIds = forall a. Monoid a => a
Prelude.mempty
    }

-- | Undocumented member.
addUploadBuffer_gatewayARN :: Lens.Lens' AddUploadBuffer Prelude.Text
addUploadBuffer_gatewayARN :: Lens' AddUploadBuffer Text
addUploadBuffer_gatewayARN = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddUploadBuffer' {Text
gatewayARN :: Text
$sel:gatewayARN:AddUploadBuffer' :: AddUploadBuffer -> Text
gatewayARN} -> Text
gatewayARN) (\s :: AddUploadBuffer
s@AddUploadBuffer' {} Text
a -> AddUploadBuffer
s {$sel:gatewayARN:AddUploadBuffer' :: Text
gatewayARN = Text
a} :: AddUploadBuffer)

-- | An array of strings that identify disks that are to be configured as
-- working storage. Each string has a minimum length of 1 and maximum
-- length of 300. You can get the disk IDs from the ListLocalDisks API.
addUploadBuffer_diskIds :: Lens.Lens' AddUploadBuffer [Prelude.Text]
addUploadBuffer_diskIds :: Lens' AddUploadBuffer [Text]
addUploadBuffer_diskIds = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddUploadBuffer' {[Text]
diskIds :: [Text]
$sel:diskIds:AddUploadBuffer' :: AddUploadBuffer -> [Text]
diskIds} -> [Text]
diskIds) (\s :: AddUploadBuffer
s@AddUploadBuffer' {} [Text]
a -> AddUploadBuffer
s {$sel:diskIds:AddUploadBuffer' :: [Text]
diskIds = [Text]
a} :: AddUploadBuffer) 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 AddUploadBuffer where
  type
    AWSResponse AddUploadBuffer =
      AddUploadBufferResponse
  request :: (Service -> Service) -> AddUploadBuffer -> Request AddUploadBuffer
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 AddUploadBuffer
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse AddUploadBuffer)))
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 Text -> Int -> AddUploadBufferResponse
AddUploadBufferResponse'
            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
"GatewayARN")
            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 AddUploadBuffer where
  hashWithSalt :: Int -> AddUploadBuffer -> Int
hashWithSalt Int
_salt AddUploadBuffer' {[Text]
Text
diskIds :: [Text]
gatewayARN :: Text
$sel:diskIds:AddUploadBuffer' :: AddUploadBuffer -> [Text]
$sel:gatewayARN:AddUploadBuffer' :: AddUploadBuffer -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
gatewayARN
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` [Text]
diskIds

instance Prelude.NFData AddUploadBuffer where
  rnf :: AddUploadBuffer -> ()
rnf AddUploadBuffer' {[Text]
Text
diskIds :: [Text]
gatewayARN :: Text
$sel:diskIds:AddUploadBuffer' :: AddUploadBuffer -> [Text]
$sel:gatewayARN:AddUploadBuffer' :: AddUploadBuffer -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
gatewayARN
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf [Text]
diskIds

instance Data.ToHeaders AddUploadBuffer where
  toHeaders :: AddUploadBuffer -> 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
"StorageGateway_20130630.AddUploadBuffer" ::
                          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 AddUploadBuffer where
  toJSON :: AddUploadBuffer -> Value
toJSON AddUploadBuffer' {[Text]
Text
diskIds :: [Text]
gatewayARN :: Text
$sel:diskIds:AddUploadBuffer' :: AddUploadBuffer -> [Text]
$sel:gatewayARN:AddUploadBuffer' :: AddUploadBuffer -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just (Key
"GatewayARN" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
gatewayARN),
            forall a. a -> Maybe a
Prelude.Just (Key
"DiskIds" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= [Text]
diskIds)
          ]
      )

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

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

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

-- |
-- Create a value of 'AddUploadBufferResponse' 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:
--
-- 'gatewayARN', 'addUploadBufferResponse_gatewayARN' - Undocumented member.
--
-- 'httpStatus', 'addUploadBufferResponse_httpStatus' - The response's http status code.
newAddUploadBufferResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  AddUploadBufferResponse
newAddUploadBufferResponse :: Int -> AddUploadBufferResponse
newAddUploadBufferResponse Int
pHttpStatus_ =
  AddUploadBufferResponse'
    { $sel:gatewayARN:AddUploadBufferResponse' :: Maybe Text
gatewayARN =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:AddUploadBufferResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | Undocumented member.
addUploadBufferResponse_gatewayARN :: Lens.Lens' AddUploadBufferResponse (Prelude.Maybe Prelude.Text)
addUploadBufferResponse_gatewayARN :: Lens' AddUploadBufferResponse (Maybe Text)
addUploadBufferResponse_gatewayARN = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AddUploadBufferResponse' {Maybe Text
gatewayARN :: Maybe Text
$sel:gatewayARN:AddUploadBufferResponse' :: AddUploadBufferResponse -> Maybe Text
gatewayARN} -> Maybe Text
gatewayARN) (\s :: AddUploadBufferResponse
s@AddUploadBufferResponse' {} Maybe Text
a -> AddUploadBufferResponse
s {$sel:gatewayARN:AddUploadBufferResponse' :: Maybe Text
gatewayARN = Maybe Text
a} :: AddUploadBufferResponse)

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

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