{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}
{-# LANGUAGE TypeFamilies       #-}

{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

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

-- |
-- Module      : Network.AWS.CloudFormation.ExecuteChangeSet
-- Copyright   : (c) 2013-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Updates a stack using the input information that was provided when the specified change set was created. After the call successfully completes, AWS CloudFormation starts updating the stack. Use the 'DescribeStacks' action to view the status of the update.
--
--
-- When you execute a change set, AWS CloudFormation deletes all other change sets associated with the stack because they aren't valid for the updated stack.
--
-- If a stack policy is associated with the stack, AWS CloudFormation enforces the policy during the update. You can't specify a temporary stack policy that overrides the current policy.
--
module Network.AWS.CloudFormation.ExecuteChangeSet
    (
    -- * Creating a Request
      executeChangeSet
    , ExecuteChangeSet
    -- * Request Lenses
    , ecsStackName
    , ecsChangeSetName

    -- * Destructuring the Response
    , executeChangeSetResponse
    , ExecuteChangeSetResponse
    -- * Response Lenses
    , ecsrsResponseStatus
    ) where

import           Network.AWS.CloudFormation.Types
import           Network.AWS.CloudFormation.Types.Product
import           Network.AWS.Lens
import           Network.AWS.Prelude
import           Network.AWS.Request
import           Network.AWS.Response

-- | The input for the 'ExecuteChangeSet' action.
--
--
--
-- /See:/ 'executeChangeSet' smart constructor.
data ExecuteChangeSet = ExecuteChangeSet'
    { _ecsStackName     :: !(Maybe Text)
    , _ecsChangeSetName :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ExecuteChangeSet' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ecsStackName' - If you specified the name of a change set, specify the stack name or ID (ARN) that is associated with the change set you want to execute.
--
-- * 'ecsChangeSetName' - The name or ARN of the change set that you want use to update the specified stack.
executeChangeSet
    :: Text -- ^ 'ecsChangeSetName'
    -> ExecuteChangeSet
executeChangeSet pChangeSetName_ =
    ExecuteChangeSet'
    { _ecsStackName = Nothing
    , _ecsChangeSetName = pChangeSetName_
    }

-- | If you specified the name of a change set, specify the stack name or ID (ARN) that is associated with the change set you want to execute.
ecsStackName :: Lens' ExecuteChangeSet (Maybe Text)
ecsStackName = lens _ecsStackName (\ s a -> s{_ecsStackName = a});

-- | The name or ARN of the change set that you want use to update the specified stack.
ecsChangeSetName :: Lens' ExecuteChangeSet Text
ecsChangeSetName = lens _ecsChangeSetName (\ s a -> s{_ecsChangeSetName = a});

instance AWSRequest ExecuteChangeSet where
        type Rs ExecuteChangeSet = ExecuteChangeSetResponse
        request = postQuery cloudFormation
        response
          = receiveXMLWrapper "ExecuteChangeSetResult"
              (\ s h x ->
                 ExecuteChangeSetResponse' <$> (pure (fromEnum s)))

instance Hashable ExecuteChangeSet

instance NFData ExecuteChangeSet

instance ToHeaders ExecuteChangeSet where
        toHeaders = const mempty

instance ToPath ExecuteChangeSet where
        toPath = const "/"

instance ToQuery ExecuteChangeSet where
        toQuery ExecuteChangeSet'{..}
          = mconcat
              ["Action" =: ("ExecuteChangeSet" :: ByteString),
               "Version" =: ("2010-05-15" :: ByteString),
               "StackName" =: _ecsStackName,
               "ChangeSetName" =: _ecsChangeSetName]

-- | The output for the 'ExecuteChangeSet' action.
--
--
--
-- /See:/ 'executeChangeSetResponse' smart constructor.
newtype ExecuteChangeSetResponse = ExecuteChangeSetResponse'
    { _ecsrsResponseStatus :: Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'ExecuteChangeSetResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ecsrsResponseStatus' - -- | The response status code.
executeChangeSetResponse
    :: Int -- ^ 'ecsrsResponseStatus'
    -> ExecuteChangeSetResponse
executeChangeSetResponse pResponseStatus_ =
    ExecuteChangeSetResponse'
    { _ecsrsResponseStatus = pResponseStatus_
    }

-- | -- | The response status code.
ecsrsResponseStatus :: Lens' ExecuteChangeSetResponse Int
ecsrsResponseStatus = lens _ecsrsResponseStatus (\ s a -> s{_ecsrsResponseStatus = a});

instance NFData ExecuteChangeSetResponse