-- | You associate the CreationPolicy attribute with a resource to prevent its
-- status from reaching create complete until AWS CloudFormation receives a
-- specified number of success signals or the timeout period is exceeded. To
-- signal a resource, you can use the cfn-signal helper script or
-- SignalResource API. AWS CloudFormation publishes valid signals to the stack
-- events so that you track the number of signals sent. The creation policy is
-- invoked only when AWS CloudFormation creates the associated resource.
-- Currently, the only AWS CloudFormation resources that support creation
-- policies are AWS::AutoScaling::AutoScalingGroup, AWS::EC2::Instance, and
-- AWS::CloudFormation::WaitCondition. The CreationPolicy attribute is helpful
-- when you want to wait on resource configuration actions before stack
-- creation proceeds. For example, if you install and configure software
-- applications on an Amazon EC2 instance, you might want those applications
-- up and running before proceeding. In such cases, you can add a
-- CreationPolicy attribute to the instance and then send a success signal to
-- the instance after the applications are installed and configured. For a
-- detailed example, see Deploying Applications on Amazon EC2 with AWS
-- CloudFormation.

module Stratosphere.ResourceAttributes.CreationPolicy where

import Stratosphere.Prelude
import Stratosphere.ResourceAttributes.ResourceSignal

import qualified Data.Aeson as JSON

-- | Full data type definition for CreationPolicy. See 'mkCreationPolicy' for a
-- more convenient constructor.
data CreationPolicy = CreationPolicy
  { CreationPolicy -> ResourceSignal
resourceSignal :: ResourceSignal
  }
  deriving (Int -> CreationPolicy -> ShowS
[CreationPolicy] -> ShowS
CreationPolicy -> String
(Int -> CreationPolicy -> ShowS)
-> (CreationPolicy -> String)
-> ([CreationPolicy] -> ShowS)
-> Show CreationPolicy
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CreationPolicy -> ShowS
showsPrec :: Int -> CreationPolicy -> ShowS
$cshow :: CreationPolicy -> String
show :: CreationPolicy -> String
$cshowList :: [CreationPolicy] -> ShowS
showList :: [CreationPolicy] -> ShowS
Show, CreationPolicy -> CreationPolicy -> Bool
(CreationPolicy -> CreationPolicy -> Bool)
-> (CreationPolicy -> CreationPolicy -> Bool) -> Eq CreationPolicy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CreationPolicy -> CreationPolicy -> Bool
== :: CreationPolicy -> CreationPolicy -> Bool
$c/= :: CreationPolicy -> CreationPolicy -> Bool
/= :: CreationPolicy -> CreationPolicy -> Bool
Eq, (forall x. CreationPolicy -> Rep CreationPolicy x)
-> (forall x. Rep CreationPolicy x -> CreationPolicy)
-> Generic CreationPolicy
forall x. Rep CreationPolicy x -> CreationPolicy
forall x. CreationPolicy -> Rep CreationPolicy x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CreationPolicy -> Rep CreationPolicy x
from :: forall x. CreationPolicy -> Rep CreationPolicy x
$cto :: forall x. Rep CreationPolicy x -> CreationPolicy
to :: forall x. Rep CreationPolicy x -> CreationPolicy
Generic)

instance JSON.ToJSON CreationPolicy where
  toJSON :: CreationPolicy -> Value
toJSON CreationPolicy
policy
    = [Pair] -> Value
JSON.object
    ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [(Key
"ResourceSignal", ResourceSignal -> Value
forall a. ToJSON a => a -> Value
JSON.toJSON CreationPolicy
policy.resourceSignal)]

-- | Constructor for 'CreationPolicy' containing required fields as arguments.
mkCreationPolicy
  :: ResourceSignal -- ^ 'resourceSignal'
  -> CreationPolicy
mkCreationPolicy :: ResourceSignal -> CreationPolicy
mkCreationPolicy ResourceSignal
resourceSignal = CreationPolicy{ResourceSignal
resourceSignal :: ResourceSignal
resourceSignal :: ResourceSignal
..}