{-# 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.OpsWorks.DescribeInstances
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Requests a description of a set of instances.
--
-- This call accepts only one resource-identifying parameter.
--
-- __Required Permissions__: To use this action, an IAM user must have a
-- Show, Deploy, or Manage permissions level for the stack, or an attached
-- policy that explicitly grants permissions. For more information about
-- user permissions, see
-- <https://docs.aws.amazon.com/opsworks/latest/userguide/opsworks-security-users.html Managing User Permissions>.
module Amazonka.OpsWorks.DescribeInstances
  ( -- * Creating a Request
    DescribeInstances (..),
    newDescribeInstances,

    -- * Request Lenses
    describeInstances_instanceIds,
    describeInstances_layerId,
    describeInstances_stackId,

    -- * Destructuring the Response
    DescribeInstancesResponse (..),
    newDescribeInstancesResponse,

    -- * Response Lenses
    describeInstancesResponse_instances,
    describeInstancesResponse_httpStatus,
  )
where

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

-- | /See:/ 'newDescribeInstances' smart constructor.
data DescribeInstances = DescribeInstances'
  { -- | An array of instance IDs to be described. If you use this parameter,
    -- @DescribeInstances@ returns a description of the specified instances.
    -- Otherwise, it returns a description of every instance.
    DescribeInstances -> Maybe [Text]
instanceIds :: Prelude.Maybe [Prelude.Text],
    -- | A layer ID. If you use this parameter, @DescribeInstances@ returns
    -- descriptions of the instances associated with the specified layer.
    DescribeInstances -> Maybe Text
layerId :: Prelude.Maybe Prelude.Text,
    -- | A stack ID. If you use this parameter, @DescribeInstances@ returns
    -- descriptions of the instances associated with the specified stack.
    DescribeInstances -> Maybe Text
stackId :: Prelude.Maybe Prelude.Text
  }
  deriving (DescribeInstances -> DescribeInstances -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeInstances -> DescribeInstances -> Bool
$c/= :: DescribeInstances -> DescribeInstances -> Bool
== :: DescribeInstances -> DescribeInstances -> Bool
$c== :: DescribeInstances -> DescribeInstances -> Bool
Prelude.Eq, ReadPrec [DescribeInstances]
ReadPrec DescribeInstances
Int -> ReadS DescribeInstances
ReadS [DescribeInstances]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeInstances]
$creadListPrec :: ReadPrec [DescribeInstances]
readPrec :: ReadPrec DescribeInstances
$creadPrec :: ReadPrec DescribeInstances
readList :: ReadS [DescribeInstances]
$creadList :: ReadS [DescribeInstances]
readsPrec :: Int -> ReadS DescribeInstances
$creadsPrec :: Int -> ReadS DescribeInstances
Prelude.Read, Int -> DescribeInstances -> ShowS
[DescribeInstances] -> ShowS
DescribeInstances -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeInstances] -> ShowS
$cshowList :: [DescribeInstances] -> ShowS
show :: DescribeInstances -> String
$cshow :: DescribeInstances -> String
showsPrec :: Int -> DescribeInstances -> ShowS
$cshowsPrec :: Int -> DescribeInstances -> ShowS
Prelude.Show, forall x. Rep DescribeInstances x -> DescribeInstances
forall x. DescribeInstances -> Rep DescribeInstances x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribeInstances x -> DescribeInstances
$cfrom :: forall x. DescribeInstances -> Rep DescribeInstances x
Prelude.Generic)

-- |
-- Create a value of 'DescribeInstances' 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:
--
-- 'instanceIds', 'describeInstances_instanceIds' - An array of instance IDs to be described. If you use this parameter,
-- @DescribeInstances@ returns a description of the specified instances.
-- Otherwise, it returns a description of every instance.
--
-- 'layerId', 'describeInstances_layerId' - A layer ID. If you use this parameter, @DescribeInstances@ returns
-- descriptions of the instances associated with the specified layer.
--
-- 'stackId', 'describeInstances_stackId' - A stack ID. If you use this parameter, @DescribeInstances@ returns
-- descriptions of the instances associated with the specified stack.
newDescribeInstances ::
  DescribeInstances
newDescribeInstances :: DescribeInstances
newDescribeInstances =
  DescribeInstances'
    { $sel:instanceIds:DescribeInstances' :: Maybe [Text]
instanceIds = forall a. Maybe a
Prelude.Nothing,
      $sel:layerId:DescribeInstances' :: Maybe Text
layerId = forall a. Maybe a
Prelude.Nothing,
      $sel:stackId:DescribeInstances' :: Maybe Text
stackId = forall a. Maybe a
Prelude.Nothing
    }

-- | An array of instance IDs to be described. If you use this parameter,
-- @DescribeInstances@ returns a description of the specified instances.
-- Otherwise, it returns a description of every instance.
describeInstances_instanceIds :: Lens.Lens' DescribeInstances (Prelude.Maybe [Prelude.Text])
describeInstances_instanceIds :: Lens' DescribeInstances (Maybe [Text])
describeInstances_instanceIds = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeInstances' {Maybe [Text]
instanceIds :: Maybe [Text]
$sel:instanceIds:DescribeInstances' :: DescribeInstances -> Maybe [Text]
instanceIds} -> Maybe [Text]
instanceIds) (\s :: DescribeInstances
s@DescribeInstances' {} Maybe [Text]
a -> DescribeInstances
s {$sel:instanceIds:DescribeInstances' :: Maybe [Text]
instanceIds = Maybe [Text]
a} :: DescribeInstances) 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

-- | A layer ID. If you use this parameter, @DescribeInstances@ returns
-- descriptions of the instances associated with the specified layer.
describeInstances_layerId :: Lens.Lens' DescribeInstances (Prelude.Maybe Prelude.Text)
describeInstances_layerId :: Lens' DescribeInstances (Maybe Text)
describeInstances_layerId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeInstances' {Maybe Text
layerId :: Maybe Text
$sel:layerId:DescribeInstances' :: DescribeInstances -> Maybe Text
layerId} -> Maybe Text
layerId) (\s :: DescribeInstances
s@DescribeInstances' {} Maybe Text
a -> DescribeInstances
s {$sel:layerId:DescribeInstances' :: Maybe Text
layerId = Maybe Text
a} :: DescribeInstances)

-- | A stack ID. If you use this parameter, @DescribeInstances@ returns
-- descriptions of the instances associated with the specified stack.
describeInstances_stackId :: Lens.Lens' DescribeInstances (Prelude.Maybe Prelude.Text)
describeInstances_stackId :: Lens' DescribeInstances (Maybe Text)
describeInstances_stackId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeInstances' {Maybe Text
stackId :: Maybe Text
$sel:stackId:DescribeInstances' :: DescribeInstances -> Maybe Text
stackId} -> Maybe Text
stackId) (\s :: DescribeInstances
s@DescribeInstances' {} Maybe Text
a -> DescribeInstances
s {$sel:stackId:DescribeInstances' :: Maybe Text
stackId = Maybe Text
a} :: DescribeInstances)

instance Core.AWSRequest DescribeInstances where
  type
    AWSResponse DescribeInstances =
      DescribeInstancesResponse
  request :: (Service -> Service)
-> DescribeInstances -> Request DescribeInstances
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 DescribeInstances
-> ClientResponse ClientBody
-> m (Either
        Error (ClientResponse (AWSResponse DescribeInstances)))
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 [Instance] -> Int -> DescribeInstancesResponse
DescribeInstancesResponse'
            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
"Instances" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            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 DescribeInstances where
  hashWithSalt :: Int -> DescribeInstances -> Int
hashWithSalt Int
_salt DescribeInstances' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
layerId :: Maybe Text
instanceIds :: Maybe [Text]
$sel:stackId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:layerId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:instanceIds:DescribeInstances' :: DescribeInstances -> Maybe [Text]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Text]
instanceIds
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
layerId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
stackId

instance Prelude.NFData DescribeInstances where
  rnf :: DescribeInstances -> ()
rnf DescribeInstances' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
layerId :: Maybe Text
instanceIds :: Maybe [Text]
$sel:stackId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:layerId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:instanceIds:DescribeInstances' :: DescribeInstances -> Maybe [Text]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Text]
instanceIds
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
layerId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
stackId

instance Data.ToHeaders DescribeInstances where
  toHeaders :: DescribeInstances -> 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
"OpsWorks_20130218.DescribeInstances" ::
                          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 DescribeInstances where
  toJSON :: DescribeInstances -> Value
toJSON DescribeInstances' {Maybe [Text]
Maybe Text
stackId :: Maybe Text
layerId :: Maybe Text
instanceIds :: Maybe [Text]
$sel:stackId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:layerId:DescribeInstances' :: DescribeInstances -> Maybe Text
$sel:instanceIds:DescribeInstances' :: DescribeInstances -> Maybe [Text]
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"InstanceIds" 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]
instanceIds,
            (Key
"LayerId" 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
layerId,
            (Key
"StackId" 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
stackId
          ]
      )

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

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

-- | Contains the response to a @DescribeInstances@ request.
--
-- /See:/ 'newDescribeInstancesResponse' smart constructor.
data DescribeInstancesResponse = DescribeInstancesResponse'
  { -- | An array of @Instance@ objects that describe the instances.
    DescribeInstancesResponse -> Maybe [Instance]
instances :: Prelude.Maybe [Instance],
    -- | The response's http status code.
    DescribeInstancesResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DescribeInstancesResponse -> DescribeInstancesResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeInstancesResponse -> DescribeInstancesResponse -> Bool
$c/= :: DescribeInstancesResponse -> DescribeInstancesResponse -> Bool
== :: DescribeInstancesResponse -> DescribeInstancesResponse -> Bool
$c== :: DescribeInstancesResponse -> DescribeInstancesResponse -> Bool
Prelude.Eq, ReadPrec [DescribeInstancesResponse]
ReadPrec DescribeInstancesResponse
Int -> ReadS DescribeInstancesResponse
ReadS [DescribeInstancesResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeInstancesResponse]
$creadListPrec :: ReadPrec [DescribeInstancesResponse]
readPrec :: ReadPrec DescribeInstancesResponse
$creadPrec :: ReadPrec DescribeInstancesResponse
readList :: ReadS [DescribeInstancesResponse]
$creadList :: ReadS [DescribeInstancesResponse]
readsPrec :: Int -> ReadS DescribeInstancesResponse
$creadsPrec :: Int -> ReadS DescribeInstancesResponse
Prelude.Read, Int -> DescribeInstancesResponse -> ShowS
[DescribeInstancesResponse] -> ShowS
DescribeInstancesResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeInstancesResponse] -> ShowS
$cshowList :: [DescribeInstancesResponse] -> ShowS
show :: DescribeInstancesResponse -> String
$cshow :: DescribeInstancesResponse -> String
showsPrec :: Int -> DescribeInstancesResponse -> ShowS
$cshowsPrec :: Int -> DescribeInstancesResponse -> ShowS
Prelude.Show, forall x.
Rep DescribeInstancesResponse x -> DescribeInstancesResponse
forall x.
DescribeInstancesResponse -> Rep DescribeInstancesResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DescribeInstancesResponse x -> DescribeInstancesResponse
$cfrom :: forall x.
DescribeInstancesResponse -> Rep DescribeInstancesResponse x
Prelude.Generic)

-- |
-- Create a value of 'DescribeInstancesResponse' 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:
--
-- 'instances', 'describeInstancesResponse_instances' - An array of @Instance@ objects that describe the instances.
--
-- 'httpStatus', 'describeInstancesResponse_httpStatus' - The response's http status code.
newDescribeInstancesResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DescribeInstancesResponse
newDescribeInstancesResponse :: Int -> DescribeInstancesResponse
newDescribeInstancesResponse Int
pHttpStatus_ =
  DescribeInstancesResponse'
    { $sel:instances:DescribeInstancesResponse' :: Maybe [Instance]
instances =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DescribeInstancesResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An array of @Instance@ objects that describe the instances.
describeInstancesResponse_instances :: Lens.Lens' DescribeInstancesResponse (Prelude.Maybe [Instance])
describeInstancesResponse_instances :: Lens' DescribeInstancesResponse (Maybe [Instance])
describeInstancesResponse_instances = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeInstancesResponse' {Maybe [Instance]
instances :: Maybe [Instance]
$sel:instances:DescribeInstancesResponse' :: DescribeInstancesResponse -> Maybe [Instance]
instances} -> Maybe [Instance]
instances) (\s :: DescribeInstancesResponse
s@DescribeInstancesResponse' {} Maybe [Instance]
a -> DescribeInstancesResponse
s {$sel:instances:DescribeInstancesResponse' :: Maybe [Instance]
instances = Maybe [Instance]
a} :: DescribeInstancesResponse) 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 response's http status code.
describeInstancesResponse_httpStatus :: Lens.Lens' DescribeInstancesResponse Prelude.Int
describeInstancesResponse_httpStatus :: Lens' DescribeInstancesResponse Int
describeInstancesResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeInstancesResponse' {Int
httpStatus :: Int
$sel:httpStatus:DescribeInstancesResponse' :: DescribeInstancesResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: DescribeInstancesResponse
s@DescribeInstancesResponse' {} Int
a -> DescribeInstancesResponse
s {$sel:httpStatus:DescribeInstancesResponse' :: Int
httpStatus = Int
a} :: DescribeInstancesResponse)

instance Prelude.NFData DescribeInstancesResponse where
  rnf :: DescribeInstancesResponse -> ()
rnf DescribeInstancesResponse' {Int
Maybe [Instance]
httpStatus :: Int
instances :: Maybe [Instance]
$sel:httpStatus:DescribeInstancesResponse' :: DescribeInstancesResponse -> Int
$sel:instances:DescribeInstancesResponse' :: DescribeInstancesResponse -> Maybe [Instance]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Instance]
instances
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus