{-# 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.CreateVolume
-- Copyright   : (c) 2013-2015 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)
--
-- Creates an EBS volume that can be attached to an instance in the same
-- Availability Zone. The volume is created in the regional endpoint that
-- you send the HTTP request to. For more information see
-- <http://docs.aws.amazon.com/general/latest/gr/rande.html Regions and Endpoints>.
--
-- You can create a new empty volume or restore a volume from an EBS
-- snapshot. Any AWS Marketplace product codes from the snapshot are
-- propagated to the volume.
--
-- You can create encrypted volumes with the 'Encrypted' parameter.
-- Encrypted volumes may only be attached to instances that support Amazon
-- EBS encryption. Volumes that are created from encrypted snapshots are
-- also automatically encrypted. For more information, see
-- <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html Amazon EBS Encryption>
-- in the /Amazon Elastic Compute Cloud User Guide/.
--
-- For more information, see
-- <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-volume.html Creating or Restoring an Amazon EBS Volume>
-- in the /Amazon Elastic Compute Cloud User Guide/.
--
-- /See:/ <http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-CreateVolume.html AWS API Reference> for CreateVolume.
module Network.AWS.EC2.CreateVolume
    (
    -- * Creating a Request
      createVolume
    , CreateVolume
    -- * Request Lenses
    , creSize
    , creIOPS
    , creEncrypted
    , creKMSKeyId
    , creVolumeType
    , creDryRun
    , creSnapshotId
    , creAvailabilityZone

    -- * Destructuring the Response
    , volume
    , Volume
    -- * Response Lenses
    , vAttachments
    , vIOPS
    , vKMSKeyId
    , vTags
    , vAvailabilityZone
    , vCreateTime
    , vEncrypted
    , vSize
    , vSnapshotId
    , vState
    , vVolumeId
    , vVolumeType
    ) where

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

-- | /See:/ 'createVolume' smart constructor.
data CreateVolume = CreateVolume'
    { _creSize             :: !(Maybe Int)
    , _creIOPS             :: !(Maybe Int)
    , _creEncrypted        :: !(Maybe Bool)
    , _creKMSKeyId         :: !(Maybe Text)
    , _creVolumeType       :: !(Maybe VolumeType)
    , _creDryRun           :: !(Maybe Bool)
    , _creSnapshotId       :: !(Maybe Text)
    , _creAvailabilityZone :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateVolume' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'creSize'
--
-- * 'creIOPS'
--
-- * 'creEncrypted'
--
-- * 'creKMSKeyId'
--
-- * 'creVolumeType'
--
-- * 'creDryRun'
--
-- * 'creSnapshotId'
--
-- * 'creAvailabilityZone'
createVolume
    :: Text -- ^ 'creAvailabilityZone'
    -> CreateVolume
createVolume pAvailabilityZone_ =
    CreateVolume'
    { _creSize = Nothing
    , _creIOPS = Nothing
    , _creEncrypted = Nothing
    , _creKMSKeyId = Nothing
    , _creVolumeType = Nothing
    , _creDryRun = Nothing
    , _creSnapshotId = Nothing
    , _creAvailabilityZone = pAvailabilityZone_
    }

-- | The size of the volume, in GiBs.
--
-- Constraints: '1-1024' for 'standard' volumes, '1-16384' for 'gp2'
-- volumes, and '4-16384' for 'io1' volumes. If you specify a snapshot, the
-- volume size must be equal to or larger than the snapshot size.
--
-- Default: If you\'re creating the volume from a snapshot and don\'t
-- specify a volume size, the default is the snapshot size.
creSize :: Lens' CreateVolume (Maybe Int)
creSize = lens _creSize (\ s a -> s{_creSize = a});

-- | Only valid for Provisioned IOPS (SSD) volumes. The number of I\/O
-- operations per second (IOPS) to provision for the volume, with a maximum
-- ratio of 30 IOPS\/GiB.
--
-- Constraint: Range is 100 to 20000 for Provisioned IOPS (SSD) volumes
creIOPS :: Lens' CreateVolume (Maybe Int)
creIOPS = lens _creIOPS (\ s a -> s{_creIOPS = a});

-- | Specifies whether the volume should be encrypted. Encrypted Amazon EBS
-- volumes may only be attached to instances that support Amazon EBS
-- encryption. Volumes that are created from encrypted snapshots are
-- automatically encrypted. There is no way to create an encrypted volume
-- from an unencrypted snapshot or vice versa. If your AMI uses encrypted
-- volumes, you can only launch it on supported instance types. For more
-- information, see
-- <http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html Amazon EBS Encryption>
-- in the /Amazon Elastic Compute Cloud User Guide/.
creEncrypted :: Lens' CreateVolume (Maybe Bool)
creEncrypted = lens _creEncrypted (\ s a -> s{_creEncrypted = a});

-- | The full ARN of the AWS Key Management Service (AWS KMS) customer master
-- key (CMK) to use when creating the encrypted volume. This parameter is
-- only required if you want to use a non-default CMK; if this parameter is
-- not specified, the default CMK for EBS is used. The ARN contains the
-- 'arn:aws:kms' namespace, followed by the region of the CMK, the AWS
-- account ID of the CMK owner, the 'key' namespace, and then the CMK ID.
-- For example,
-- arn:aws:kms:/us-east-1/:/012345678910/:key\//abcd1234-a123-456a-a12b-a123b4cd56ef/.
-- If a 'KmsKeyId' is specified, the 'Encrypted' flag must also be set.
creKMSKeyId :: Lens' CreateVolume (Maybe Text)
creKMSKeyId = lens _creKMSKeyId (\ s a -> s{_creKMSKeyId = a});

-- | The volume type. This can be 'gp2' for General Purpose (SSD) volumes,
-- 'io1' for Provisioned IOPS (SSD) volumes, or 'standard' for Magnetic
-- volumes.
--
-- Default: 'standard'
creVolumeType :: Lens' CreateVolume (Maybe VolumeType)
creVolumeType = lens _creVolumeType (\ s a -> s{_creVolumeType = a});

-- | 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'.
creDryRun :: Lens' CreateVolume (Maybe Bool)
creDryRun = lens _creDryRun (\ s a -> s{_creDryRun = a});

-- | The snapshot from which to create the volume.
creSnapshotId :: Lens' CreateVolume (Maybe Text)
creSnapshotId = lens _creSnapshotId (\ s a -> s{_creSnapshotId = a});

-- | The Availability Zone in which to create the volume. Use
-- DescribeAvailabilityZones to list the Availability Zones that are
-- currently available to you.
creAvailabilityZone :: Lens' CreateVolume Text
creAvailabilityZone = lens _creAvailabilityZone (\ s a -> s{_creAvailabilityZone = a});

instance AWSRequest CreateVolume where
        type Rs CreateVolume = Volume
        request = postQuery eC2
        response = receiveXML (\ s h x -> parseXML x)

instance ToHeaders CreateVolume where
        toHeaders = const mempty

instance ToPath CreateVolume where
        toPath = const "/"

instance ToQuery CreateVolume where
        toQuery CreateVolume'{..}
          = mconcat
              ["Action" =: ("CreateVolume" :: ByteString),
               "Version" =: ("2015-04-15" :: ByteString),
               "Size" =: _creSize, "Iops" =: _creIOPS,
               "Encrypted" =: _creEncrypted,
               "KmsKeyId" =: _creKMSKeyId,
               "VolumeType" =: _creVolumeType,
               "DryRun" =: _creDryRun,
               "SnapshotId" =: _creSnapshotId,
               "AvailabilityZone" =: _creAvailabilityZone]