{-# 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.EC2.BundleInstance
-- 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)
--
-- Bundles an Amazon instance store-backed Windows instance.
--
-- During bundling, only the root device volume (C:\\) is bundled. Data on other instance store volumes is not preserved.
--
-- This action is not applicable for Linux\/Unix instances or Windows instances that are backed by Amazon EBS.
--
-- For more information, see <http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/Creating_InstanceStoreBacked_WinAMI.html Creating an Instance Store-Backed Windows AMI>.
module Network.AWS.EC2.BundleInstance
    (
    -- * Creating a Request
      bundleInstance
    , BundleInstance
    -- * Request Lenses
    , biDryRun
    , biInstanceId
    , biStorage

    -- * Destructuring the Response
    , bundleInstanceResponse
    , BundleInstanceResponse
    -- * Response Lenses
    , birsBundleTask
    , birsResponseStatus
    ) where

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

-- | Contains the parameters for BundleInstance.
--
-- /See:/ 'bundleInstance' smart constructor.
data BundleInstance = BundleInstance'
    { _biDryRun     :: !(Maybe Bool)
    , _biInstanceId :: !Text
    , _biStorage    :: !Storage
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'BundleInstance' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'biDryRun'
--
-- * 'biInstanceId'
--
-- * 'biStorage'
bundleInstance
    :: Text -- ^ 'biInstanceId'
    -> Storage -- ^ 'biStorage'
    -> BundleInstance
bundleInstance pInstanceId_ pStorage_ =
    BundleInstance'
    { _biDryRun = Nothing
    , _biInstanceId = pInstanceId_
    , _biStorage = pStorage_
    }

-- | Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is 'DryRunOperation'. Otherwise, it is 'UnauthorizedOperation'.
biDryRun :: Lens' BundleInstance (Maybe Bool)
biDryRun = lens _biDryRun (\ s a -> s{_biDryRun = a});

-- | The ID of the instance to bundle.
--
-- Type: String
--
-- Default: None
--
-- Required: Yes
biInstanceId :: Lens' BundleInstance Text
biInstanceId = lens _biInstanceId (\ s a -> s{_biInstanceId = a});

-- | The bucket in which to store the AMI. You can specify a bucket that you already own or a new bucket that Amazon EC2 creates on your behalf. If you specify a bucket that belongs to someone else, Amazon EC2 returns an error.
biStorage :: Lens' BundleInstance Storage
biStorage = lens _biStorage (\ s a -> s{_biStorage = a});

instance AWSRequest BundleInstance where
        type Rs BundleInstance = BundleInstanceResponse
        request = postQuery ec2
        response
          = receiveXML
              (\ s h x ->
                 BundleInstanceResponse' <$>
                   (x .@? "bundleInstanceTask") <*> (pure (fromEnum s)))

instance Hashable BundleInstance

instance NFData BundleInstance

instance ToHeaders BundleInstance where
        toHeaders = const mempty

instance ToPath BundleInstance where
        toPath = const "/"

instance ToQuery BundleInstance where
        toQuery BundleInstance'{..}
          = mconcat
              ["Action" =: ("BundleInstance" :: ByteString),
               "Version" =: ("2016-04-01" :: ByteString),
               "DryRun" =: _biDryRun, "InstanceId" =: _biInstanceId,
               "Storage" =: _biStorage]

-- | Contains the output of BundleInstance.
--
-- /See:/ 'bundleInstanceResponse' smart constructor.
data BundleInstanceResponse = BundleInstanceResponse'
    { _birsBundleTask     :: !(Maybe BundleTask)
    , _birsResponseStatus :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'BundleInstanceResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'birsBundleTask'
--
-- * 'birsResponseStatus'
bundleInstanceResponse
    :: Int -- ^ 'birsResponseStatus'
    -> BundleInstanceResponse
bundleInstanceResponse pResponseStatus_ =
    BundleInstanceResponse'
    { _birsBundleTask = Nothing
    , _birsResponseStatus = pResponseStatus_
    }

-- | Information about the bundle task.
birsBundleTask :: Lens' BundleInstanceResponse (Maybe BundleTask)
birsBundleTask = lens _birsBundleTask (\ s a -> s{_birsBundleTask = a});

-- | The response status code.
birsResponseStatus :: Lens' BundleInstanceResponse Int
birsResponseStatus = lens _birsResponseStatus (\ s a -> s{_birsResponseStatus = a});

instance NFData BundleInstanceResponse