{-# 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.Lightsail.GetInstanceAccessDetails
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Returns temporary SSH keys you can use to connect to a specific virtual
-- private server, or /instance/.
--
-- The @get instance access details@ operation supports tag-based access
-- control via resource tags applied to the resource identified by
-- @instance name@. For more information, see the
-- <https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-controlling-access-using-tags Amazon Lightsail Developer Guide>.
module Amazonka.Lightsail.GetInstanceAccessDetails
  ( -- * Creating a Request
    GetInstanceAccessDetails (..),
    newGetInstanceAccessDetails,

    -- * Request Lenses
    getInstanceAccessDetails_protocol,
    getInstanceAccessDetails_instanceName,

    -- * Destructuring the Response
    GetInstanceAccessDetailsResponse (..),
    newGetInstanceAccessDetailsResponse,

    -- * Response Lenses
    getInstanceAccessDetailsResponse_accessDetails,
    getInstanceAccessDetailsResponse_httpStatus,
  )
where

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

-- | /See:/ 'newGetInstanceAccessDetails' smart constructor.
data GetInstanceAccessDetails = GetInstanceAccessDetails'
  { -- | The protocol to use to connect to your instance. Defaults to @ssh@.
    GetInstanceAccessDetails -> Maybe InstanceAccessProtocol
protocol :: Prelude.Maybe InstanceAccessProtocol,
    -- | The name of the instance to access.
    GetInstanceAccessDetails -> Text
instanceName :: Prelude.Text
  }
  deriving (GetInstanceAccessDetails -> GetInstanceAccessDetails -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetInstanceAccessDetails -> GetInstanceAccessDetails -> Bool
$c/= :: GetInstanceAccessDetails -> GetInstanceAccessDetails -> Bool
== :: GetInstanceAccessDetails -> GetInstanceAccessDetails -> Bool
$c== :: GetInstanceAccessDetails -> GetInstanceAccessDetails -> Bool
Prelude.Eq, ReadPrec [GetInstanceAccessDetails]
ReadPrec GetInstanceAccessDetails
Int -> ReadS GetInstanceAccessDetails
ReadS [GetInstanceAccessDetails]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetInstanceAccessDetails]
$creadListPrec :: ReadPrec [GetInstanceAccessDetails]
readPrec :: ReadPrec GetInstanceAccessDetails
$creadPrec :: ReadPrec GetInstanceAccessDetails
readList :: ReadS [GetInstanceAccessDetails]
$creadList :: ReadS [GetInstanceAccessDetails]
readsPrec :: Int -> ReadS GetInstanceAccessDetails
$creadsPrec :: Int -> ReadS GetInstanceAccessDetails
Prelude.Read, Int -> GetInstanceAccessDetails -> ShowS
[GetInstanceAccessDetails] -> ShowS
GetInstanceAccessDetails -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetInstanceAccessDetails] -> ShowS
$cshowList :: [GetInstanceAccessDetails] -> ShowS
show :: GetInstanceAccessDetails -> String
$cshow :: GetInstanceAccessDetails -> String
showsPrec :: Int -> GetInstanceAccessDetails -> ShowS
$cshowsPrec :: Int -> GetInstanceAccessDetails -> ShowS
Prelude.Show, forall x.
Rep GetInstanceAccessDetails x -> GetInstanceAccessDetails
forall x.
GetInstanceAccessDetails -> Rep GetInstanceAccessDetails x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetInstanceAccessDetails x -> GetInstanceAccessDetails
$cfrom :: forall x.
GetInstanceAccessDetails -> Rep GetInstanceAccessDetails x
Prelude.Generic)

-- |
-- Create a value of 'GetInstanceAccessDetails' 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:
--
-- 'protocol', 'getInstanceAccessDetails_protocol' - The protocol to use to connect to your instance. Defaults to @ssh@.
--
-- 'instanceName', 'getInstanceAccessDetails_instanceName' - The name of the instance to access.
newGetInstanceAccessDetails ::
  -- | 'instanceName'
  Prelude.Text ->
  GetInstanceAccessDetails
newGetInstanceAccessDetails :: Text -> GetInstanceAccessDetails
newGetInstanceAccessDetails Text
pInstanceName_ =
  GetInstanceAccessDetails'
    { $sel:protocol:GetInstanceAccessDetails' :: Maybe InstanceAccessProtocol
protocol =
        forall a. Maybe a
Prelude.Nothing,
      $sel:instanceName:GetInstanceAccessDetails' :: Text
instanceName = Text
pInstanceName_
    }

-- | The protocol to use to connect to your instance. Defaults to @ssh@.
getInstanceAccessDetails_protocol :: Lens.Lens' GetInstanceAccessDetails (Prelude.Maybe InstanceAccessProtocol)
getInstanceAccessDetails_protocol :: Lens' GetInstanceAccessDetails (Maybe InstanceAccessProtocol)
getInstanceAccessDetails_protocol = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetInstanceAccessDetails' {Maybe InstanceAccessProtocol
protocol :: Maybe InstanceAccessProtocol
$sel:protocol:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Maybe InstanceAccessProtocol
protocol} -> Maybe InstanceAccessProtocol
protocol) (\s :: GetInstanceAccessDetails
s@GetInstanceAccessDetails' {} Maybe InstanceAccessProtocol
a -> GetInstanceAccessDetails
s {$sel:protocol:GetInstanceAccessDetails' :: Maybe InstanceAccessProtocol
protocol = Maybe InstanceAccessProtocol
a} :: GetInstanceAccessDetails)

-- | The name of the instance to access.
getInstanceAccessDetails_instanceName :: Lens.Lens' GetInstanceAccessDetails Prelude.Text
getInstanceAccessDetails_instanceName :: Lens' GetInstanceAccessDetails Text
getInstanceAccessDetails_instanceName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetInstanceAccessDetails' {Text
instanceName :: Text
$sel:instanceName:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Text
instanceName} -> Text
instanceName) (\s :: GetInstanceAccessDetails
s@GetInstanceAccessDetails' {} Text
a -> GetInstanceAccessDetails
s {$sel:instanceName:GetInstanceAccessDetails' :: Text
instanceName = Text
a} :: GetInstanceAccessDetails)

instance Core.AWSRequest GetInstanceAccessDetails where
  type
    AWSResponse GetInstanceAccessDetails =
      GetInstanceAccessDetailsResponse
  request :: (Service -> Service)
-> GetInstanceAccessDetails -> Request GetInstanceAccessDetails
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 GetInstanceAccessDetails
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse GetInstanceAccessDetails)))
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 InstanceAccessDetails
-> Int -> GetInstanceAccessDetailsResponse
GetInstanceAccessDetailsResponse'
            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
"accessDetails")
            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 GetInstanceAccessDetails where
  hashWithSalt :: Int -> GetInstanceAccessDetails -> Int
hashWithSalt Int
_salt GetInstanceAccessDetails' {Maybe InstanceAccessProtocol
Text
instanceName :: Text
protocol :: Maybe InstanceAccessProtocol
$sel:instanceName:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Text
$sel:protocol:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Maybe InstanceAccessProtocol
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe InstanceAccessProtocol
protocol
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
instanceName

instance Prelude.NFData GetInstanceAccessDetails where
  rnf :: GetInstanceAccessDetails -> ()
rnf GetInstanceAccessDetails' {Maybe InstanceAccessProtocol
Text
instanceName :: Text
protocol :: Maybe InstanceAccessProtocol
$sel:instanceName:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Text
$sel:protocol:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Maybe InstanceAccessProtocol
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe InstanceAccessProtocol
protocol
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
instanceName

instance Data.ToHeaders GetInstanceAccessDetails where
  toHeaders :: GetInstanceAccessDetails -> 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
"Lightsail_20161128.GetInstanceAccessDetails" ::
                          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 GetInstanceAccessDetails where
  toJSON :: GetInstanceAccessDetails -> Value
toJSON GetInstanceAccessDetails' {Maybe InstanceAccessProtocol
Text
instanceName :: Text
protocol :: Maybe InstanceAccessProtocol
$sel:instanceName:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Text
$sel:protocol:GetInstanceAccessDetails' :: GetInstanceAccessDetails -> Maybe InstanceAccessProtocol
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"protocol" 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 InstanceAccessProtocol
protocol,
            forall a. a -> Maybe a
Prelude.Just (Key
"instanceName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
instanceName)
          ]
      )

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

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

-- | /See:/ 'newGetInstanceAccessDetailsResponse' smart constructor.
data GetInstanceAccessDetailsResponse = GetInstanceAccessDetailsResponse'
  { -- | An array of key-value pairs containing information about a get instance
    -- access request.
    GetInstanceAccessDetailsResponse -> Maybe InstanceAccessDetails
accessDetails :: Prelude.Maybe InstanceAccessDetails,
    -- | The response's http status code.
    GetInstanceAccessDetailsResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (GetInstanceAccessDetailsResponse
-> GetInstanceAccessDetailsResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GetInstanceAccessDetailsResponse
-> GetInstanceAccessDetailsResponse -> Bool
$c/= :: GetInstanceAccessDetailsResponse
-> GetInstanceAccessDetailsResponse -> Bool
== :: GetInstanceAccessDetailsResponse
-> GetInstanceAccessDetailsResponse -> Bool
$c== :: GetInstanceAccessDetailsResponse
-> GetInstanceAccessDetailsResponse -> Bool
Prelude.Eq, ReadPrec [GetInstanceAccessDetailsResponse]
ReadPrec GetInstanceAccessDetailsResponse
Int -> ReadS GetInstanceAccessDetailsResponse
ReadS [GetInstanceAccessDetailsResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GetInstanceAccessDetailsResponse]
$creadListPrec :: ReadPrec [GetInstanceAccessDetailsResponse]
readPrec :: ReadPrec GetInstanceAccessDetailsResponse
$creadPrec :: ReadPrec GetInstanceAccessDetailsResponse
readList :: ReadS [GetInstanceAccessDetailsResponse]
$creadList :: ReadS [GetInstanceAccessDetailsResponse]
readsPrec :: Int -> ReadS GetInstanceAccessDetailsResponse
$creadsPrec :: Int -> ReadS GetInstanceAccessDetailsResponse
Prelude.Read, Int -> GetInstanceAccessDetailsResponse -> ShowS
[GetInstanceAccessDetailsResponse] -> ShowS
GetInstanceAccessDetailsResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GetInstanceAccessDetailsResponse] -> ShowS
$cshowList :: [GetInstanceAccessDetailsResponse] -> ShowS
show :: GetInstanceAccessDetailsResponse -> String
$cshow :: GetInstanceAccessDetailsResponse -> String
showsPrec :: Int -> GetInstanceAccessDetailsResponse -> ShowS
$cshowsPrec :: Int -> GetInstanceAccessDetailsResponse -> ShowS
Prelude.Show, forall x.
Rep GetInstanceAccessDetailsResponse x
-> GetInstanceAccessDetailsResponse
forall x.
GetInstanceAccessDetailsResponse
-> Rep GetInstanceAccessDetailsResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep GetInstanceAccessDetailsResponse x
-> GetInstanceAccessDetailsResponse
$cfrom :: forall x.
GetInstanceAccessDetailsResponse
-> Rep GetInstanceAccessDetailsResponse x
Prelude.Generic)

-- |
-- Create a value of 'GetInstanceAccessDetailsResponse' 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:
--
-- 'accessDetails', 'getInstanceAccessDetailsResponse_accessDetails' - An array of key-value pairs containing information about a get instance
-- access request.
--
-- 'httpStatus', 'getInstanceAccessDetailsResponse_httpStatus' - The response's http status code.
newGetInstanceAccessDetailsResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  GetInstanceAccessDetailsResponse
newGetInstanceAccessDetailsResponse :: Int -> GetInstanceAccessDetailsResponse
newGetInstanceAccessDetailsResponse Int
pHttpStatus_ =
  GetInstanceAccessDetailsResponse'
    { $sel:accessDetails:GetInstanceAccessDetailsResponse' :: Maybe InstanceAccessDetails
accessDetails =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:GetInstanceAccessDetailsResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An array of key-value pairs containing information about a get instance
-- access request.
getInstanceAccessDetailsResponse_accessDetails :: Lens.Lens' GetInstanceAccessDetailsResponse (Prelude.Maybe InstanceAccessDetails)
getInstanceAccessDetailsResponse_accessDetails :: Lens'
  GetInstanceAccessDetailsResponse (Maybe InstanceAccessDetails)
getInstanceAccessDetailsResponse_accessDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GetInstanceAccessDetailsResponse' {Maybe InstanceAccessDetails
accessDetails :: Maybe InstanceAccessDetails
$sel:accessDetails:GetInstanceAccessDetailsResponse' :: GetInstanceAccessDetailsResponse -> Maybe InstanceAccessDetails
accessDetails} -> Maybe InstanceAccessDetails
accessDetails) (\s :: GetInstanceAccessDetailsResponse
s@GetInstanceAccessDetailsResponse' {} Maybe InstanceAccessDetails
a -> GetInstanceAccessDetailsResponse
s {$sel:accessDetails:GetInstanceAccessDetailsResponse' :: Maybe InstanceAccessDetails
accessDetails = Maybe InstanceAccessDetails
a} :: GetInstanceAccessDetailsResponse)

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

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