{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.EMR.Types.AutoScalingPolicyDescription
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.EMR.Types.AutoScalingPolicyDescription where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.EMR.Types.AutoScalingPolicyStatus
import Amazonka.EMR.Types.ScalingConstraints
import Amazonka.EMR.Types.ScalingRule
import qualified Amazonka.Prelude as Prelude

-- | An automatic scaling policy for a core instance group or task instance
-- group in an Amazon EMR cluster. The automatic scaling policy defines how
-- an instance group dynamically adds and terminates EC2 instances in
-- response to the value of a CloudWatch metric. See PutAutoScalingPolicy.
--
-- /See:/ 'newAutoScalingPolicyDescription' smart constructor.
data AutoScalingPolicyDescription = AutoScalingPolicyDescription'
  { -- | The upper and lower EC2 instance limits for an automatic scaling policy.
    -- Automatic scaling activity will not cause an instance group to grow
    -- above or below these limits.
    AutoScalingPolicyDescription -> Maybe ScalingConstraints
constraints :: Prelude.Maybe ScalingConstraints,
    -- | The scale-in and scale-out rules that comprise the automatic scaling
    -- policy.
    AutoScalingPolicyDescription -> Maybe [ScalingRule]
rules :: Prelude.Maybe [ScalingRule],
    -- | The status of an automatic scaling policy.
    AutoScalingPolicyDescription -> Maybe AutoScalingPolicyStatus
status :: Prelude.Maybe AutoScalingPolicyStatus
  }
  deriving (AutoScalingPolicyDescription
-> AutoScalingPolicyDescription -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AutoScalingPolicyDescription
-> AutoScalingPolicyDescription -> Bool
$c/= :: AutoScalingPolicyDescription
-> AutoScalingPolicyDescription -> Bool
== :: AutoScalingPolicyDescription
-> AutoScalingPolicyDescription -> Bool
$c== :: AutoScalingPolicyDescription
-> AutoScalingPolicyDescription -> Bool
Prelude.Eq, ReadPrec [AutoScalingPolicyDescription]
ReadPrec AutoScalingPolicyDescription
Int -> ReadS AutoScalingPolicyDescription
ReadS [AutoScalingPolicyDescription]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [AutoScalingPolicyDescription]
$creadListPrec :: ReadPrec [AutoScalingPolicyDescription]
readPrec :: ReadPrec AutoScalingPolicyDescription
$creadPrec :: ReadPrec AutoScalingPolicyDescription
readList :: ReadS [AutoScalingPolicyDescription]
$creadList :: ReadS [AutoScalingPolicyDescription]
readsPrec :: Int -> ReadS AutoScalingPolicyDescription
$creadsPrec :: Int -> ReadS AutoScalingPolicyDescription
Prelude.Read, Int -> AutoScalingPolicyDescription -> ShowS
[AutoScalingPolicyDescription] -> ShowS
AutoScalingPolicyDescription -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AutoScalingPolicyDescription] -> ShowS
$cshowList :: [AutoScalingPolicyDescription] -> ShowS
show :: AutoScalingPolicyDescription -> String
$cshow :: AutoScalingPolicyDescription -> String
showsPrec :: Int -> AutoScalingPolicyDescription -> ShowS
$cshowsPrec :: Int -> AutoScalingPolicyDescription -> ShowS
Prelude.Show, forall x.
Rep AutoScalingPolicyDescription x -> AutoScalingPolicyDescription
forall x.
AutoScalingPolicyDescription -> Rep AutoScalingPolicyDescription x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep AutoScalingPolicyDescription x -> AutoScalingPolicyDescription
$cfrom :: forall x.
AutoScalingPolicyDescription -> Rep AutoScalingPolicyDescription x
Prelude.Generic)

-- |
-- Create a value of 'AutoScalingPolicyDescription' 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:
--
-- 'constraints', 'autoScalingPolicyDescription_constraints' - The upper and lower EC2 instance limits for an automatic scaling policy.
-- Automatic scaling activity will not cause an instance group to grow
-- above or below these limits.
--
-- 'rules', 'autoScalingPolicyDescription_rules' - The scale-in and scale-out rules that comprise the automatic scaling
-- policy.
--
-- 'status', 'autoScalingPolicyDescription_status' - The status of an automatic scaling policy.
newAutoScalingPolicyDescription ::
  AutoScalingPolicyDescription
newAutoScalingPolicyDescription :: AutoScalingPolicyDescription
newAutoScalingPolicyDescription =
  AutoScalingPolicyDescription'
    { $sel:constraints:AutoScalingPolicyDescription' :: Maybe ScalingConstraints
constraints =
        forall a. Maybe a
Prelude.Nothing,
      $sel:rules:AutoScalingPolicyDescription' :: Maybe [ScalingRule]
rules = forall a. Maybe a
Prelude.Nothing,
      $sel:status:AutoScalingPolicyDescription' :: Maybe AutoScalingPolicyStatus
status = forall a. Maybe a
Prelude.Nothing
    }

-- | The upper and lower EC2 instance limits for an automatic scaling policy.
-- Automatic scaling activity will not cause an instance group to grow
-- above or below these limits.
autoScalingPolicyDescription_constraints :: Lens.Lens' AutoScalingPolicyDescription (Prelude.Maybe ScalingConstraints)
autoScalingPolicyDescription_constraints :: Lens' AutoScalingPolicyDescription (Maybe ScalingConstraints)
autoScalingPolicyDescription_constraints = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AutoScalingPolicyDescription' {Maybe ScalingConstraints
constraints :: Maybe ScalingConstraints
$sel:constraints:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe ScalingConstraints
constraints} -> Maybe ScalingConstraints
constraints) (\s :: AutoScalingPolicyDescription
s@AutoScalingPolicyDescription' {} Maybe ScalingConstraints
a -> AutoScalingPolicyDescription
s {$sel:constraints:AutoScalingPolicyDescription' :: Maybe ScalingConstraints
constraints = Maybe ScalingConstraints
a} :: AutoScalingPolicyDescription)

-- | The scale-in and scale-out rules that comprise the automatic scaling
-- policy.
autoScalingPolicyDescription_rules :: Lens.Lens' AutoScalingPolicyDescription (Prelude.Maybe [ScalingRule])
autoScalingPolicyDescription_rules :: Lens' AutoScalingPolicyDescription (Maybe [ScalingRule])
autoScalingPolicyDescription_rules = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AutoScalingPolicyDescription' {Maybe [ScalingRule]
rules :: Maybe [ScalingRule]
$sel:rules:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe [ScalingRule]
rules} -> Maybe [ScalingRule]
rules) (\s :: AutoScalingPolicyDescription
s@AutoScalingPolicyDescription' {} Maybe [ScalingRule]
a -> AutoScalingPolicyDescription
s {$sel:rules:AutoScalingPolicyDescription' :: Maybe [ScalingRule]
rules = Maybe [ScalingRule]
a} :: AutoScalingPolicyDescription) 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 status of an automatic scaling policy.
autoScalingPolicyDescription_status :: Lens.Lens' AutoScalingPolicyDescription (Prelude.Maybe AutoScalingPolicyStatus)
autoScalingPolicyDescription_status :: Lens' AutoScalingPolicyDescription (Maybe AutoScalingPolicyStatus)
autoScalingPolicyDescription_status = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\AutoScalingPolicyDescription' {Maybe AutoScalingPolicyStatus
status :: Maybe AutoScalingPolicyStatus
$sel:status:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe AutoScalingPolicyStatus
status} -> Maybe AutoScalingPolicyStatus
status) (\s :: AutoScalingPolicyDescription
s@AutoScalingPolicyDescription' {} Maybe AutoScalingPolicyStatus
a -> AutoScalingPolicyDescription
s {$sel:status:AutoScalingPolicyDescription' :: Maybe AutoScalingPolicyStatus
status = Maybe AutoScalingPolicyStatus
a} :: AutoScalingPolicyDescription)

instance Data.FromJSON AutoScalingPolicyDescription where
  parseJSON :: Value -> Parser AutoScalingPolicyDescription
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"AutoScalingPolicyDescription"
      ( \Object
x ->
          Maybe ScalingConstraints
-> Maybe [ScalingRule]
-> Maybe AutoScalingPolicyStatus
-> AutoScalingPolicyDescription
AutoScalingPolicyDescription'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"Constraints")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"Rules" forall a. Parser (Maybe a) -> a -> Parser a
Data..!= forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"Status")
      )

instance
  Prelude.Hashable
    AutoScalingPolicyDescription
  where
  hashWithSalt :: Int -> AutoScalingPolicyDescription -> Int
hashWithSalt Int
_salt AutoScalingPolicyDescription' {Maybe [ScalingRule]
Maybe AutoScalingPolicyStatus
Maybe ScalingConstraints
status :: Maybe AutoScalingPolicyStatus
rules :: Maybe [ScalingRule]
constraints :: Maybe ScalingConstraints
$sel:status:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe AutoScalingPolicyStatus
$sel:rules:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe [ScalingRule]
$sel:constraints:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe ScalingConstraints
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ScalingConstraints
constraints
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [ScalingRule]
rules
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe AutoScalingPolicyStatus
status

instance Prelude.NFData AutoScalingPolicyDescription where
  rnf :: AutoScalingPolicyDescription -> ()
rnf AutoScalingPolicyDescription' {Maybe [ScalingRule]
Maybe AutoScalingPolicyStatus
Maybe ScalingConstraints
status :: Maybe AutoScalingPolicyStatus
rules :: Maybe [ScalingRule]
constraints :: Maybe ScalingConstraints
$sel:status:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe AutoScalingPolicyStatus
$sel:rules:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe [ScalingRule]
$sel:constraints:AutoScalingPolicyDescription' :: AutoScalingPolicyDescription -> Maybe ScalingConstraints
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe ScalingConstraints
constraints
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe [ScalingRule]
rules
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe AutoScalingPolicyStatus
status