{-# LANGUAGE DataKinds                   #-}
{-# LANGUAGE DeriveGeneric               #-}
{-# LANGUAGE FlexibleInstances           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving  #-}
{-# LANGUAGE LambdaCase                  #-}
{-# LANGUAGE NoImplicitPrelude           #-}
{-# LANGUAGE OverloadedStrings           #-}
{-# LANGUAGE RecordWildCards             #-}
{-# LANGUAGE TypeFamilies                #-}

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

-- Module      : Network.AWS.AutoScaling.CreateLaunchConfiguration
-- Copyright   : (c) 2013-2014 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)

-- | Creates a launch configuration. If you exceed your maximum limit of launch
-- configurations, which by default is 100 per region, the call fails. For
-- information about viewing and updating these limits, see
-- DescribeAccountLimits.
--
-- <http://docs.aws.amazon.com/AutoScaling/latest/APIReference/API_CreateLaunchConfiguration.html>
module Network.AWS.AutoScaling.CreateLaunchConfiguration
    (
    -- * Request
      CreateLaunchConfiguration
    -- ** Request constructor
    , createLaunchConfiguration
    -- ** Request lenses
    , clcAssociatePublicIpAddress
    , clcBlockDeviceMappings
    , clcEbsOptimized
    , clcIamInstanceProfile
    , clcImageId
    , clcInstanceId
    , clcInstanceMonitoring
    , clcInstanceType
    , clcKernelId
    , clcKeyName
    , clcLaunchConfigurationName
    , clcPlacementTenancy
    , clcRamdiskId
    , clcSecurityGroups
    , clcSpotPrice
    , clcUserData

    -- * Response
    , CreateLaunchConfigurationResponse
    -- ** Response constructor
    , createLaunchConfigurationResponse
    ) where

import Network.AWS.Prelude
import Network.AWS.Request.Query
import Network.AWS.AutoScaling.Types
import qualified GHC.Exts

data CreateLaunchConfiguration = CreateLaunchConfiguration
    { _clcAssociatePublicIpAddress :: Maybe Bool
    , _clcBlockDeviceMappings      :: List "BlockDeviceMappings" BlockDeviceMapping
    , _clcEbsOptimized             :: Maybe Bool
    , _clcIamInstanceProfile       :: Maybe Text
    , _clcImageId                  :: Maybe Text
    , _clcInstanceId               :: Maybe Text
    , _clcInstanceMonitoring       :: Maybe InstanceMonitoring
    , _clcInstanceType             :: Maybe Text
    , _clcKernelId                 :: Maybe Text
    , _clcKeyName                  :: Maybe Text
    , _clcLaunchConfigurationName  :: Text
    , _clcPlacementTenancy         :: Maybe Text
    , _clcRamdiskId                :: Maybe Text
    , _clcSecurityGroups           :: List "SecurityGroups" Text
    , _clcSpotPrice                :: Maybe Text
    , _clcUserData                 :: Maybe Text
    } deriving (Eq, Show)

-- | 'CreateLaunchConfiguration' constructor.
--
-- The fields accessible through corresponding lenses are:
--
-- * 'clcAssociatePublicIpAddress' @::@ 'Maybe' 'Bool'
--
-- * 'clcBlockDeviceMappings' @::@ ['BlockDeviceMapping']
--
-- * 'clcEbsOptimized' @::@ 'Maybe' 'Bool'
--
-- * 'clcIamInstanceProfile' @::@ 'Maybe' 'Text'
--
-- * 'clcImageId' @::@ 'Maybe' 'Text'
--
-- * 'clcInstanceId' @::@ 'Maybe' 'Text'
--
-- * 'clcInstanceMonitoring' @::@ 'Maybe' 'InstanceMonitoring'
--
-- * 'clcInstanceType' @::@ 'Maybe' 'Text'
--
-- * 'clcKernelId' @::@ 'Maybe' 'Text'
--
-- * 'clcKeyName' @::@ 'Maybe' 'Text'
--
-- * 'clcLaunchConfigurationName' @::@ 'Text'
--
-- * 'clcPlacementTenancy' @::@ 'Maybe' 'Text'
--
-- * 'clcRamdiskId' @::@ 'Maybe' 'Text'
--
-- * 'clcSecurityGroups' @::@ ['Text']
--
-- * 'clcSpotPrice' @::@ 'Maybe' 'Text'
--
-- * 'clcUserData' @::@ 'Maybe' 'Text'
--
createLaunchConfiguration :: Text -- ^ 'clcLaunchConfigurationName'
                          -> CreateLaunchConfiguration
createLaunchConfiguration p1 = CreateLaunchConfiguration
    { _clcLaunchConfigurationName  = p1
    , _clcImageId                  = Nothing
    , _clcKeyName                  = Nothing
    , _clcSecurityGroups           = mempty
    , _clcUserData                 = Nothing
    , _clcInstanceId               = Nothing
    , _clcInstanceType             = Nothing
    , _clcKernelId                 = Nothing
    , _clcRamdiskId                = Nothing
    , _clcBlockDeviceMappings      = mempty
    , _clcInstanceMonitoring       = Nothing
    , _clcSpotPrice                = Nothing
    , _clcIamInstanceProfile       = Nothing
    , _clcEbsOptimized             = Nothing
    , _clcAssociatePublicIpAddress = Nothing
    , _clcPlacementTenancy         = Nothing
    }

-- | Used for groups that launch instances into a virtual private cloud (VPC).
-- Specifies whether to assign a public IP address to each instance. For
-- more information, see Auto Scaling and Amazon VPC in the Auto Scaling
-- Developer Guide. If you specify a value for this parameter, be sure to
-- specify at least one subnet using the VPCZoneIdentifier parameter when
-- you create your group. Default: If the instance is launched into a
-- default subnet, the default is true. If the instance is launched into a
-- nondefault subnet, the default is false. For more information, see
-- Supported Platforms in the Amazon Elastic Compute Cloud User Guide.
clcAssociatePublicIpAddress :: Lens' CreateLaunchConfiguration (Maybe Bool)
clcAssociatePublicIpAddress =
    lens _clcAssociatePublicIpAddress
        (\s a -> s { _clcAssociatePublicIpAddress = a })

-- | One or more mappings that specify how block devices are exposed to the
-- instance. For more information, see Block Device Mapping in the Amazon
-- Elastic Compute Cloud User Guide.
clcBlockDeviceMappings :: Lens' CreateLaunchConfiguration [BlockDeviceMapping]
clcBlockDeviceMappings =
    lens _clcBlockDeviceMappings (\s a -> s { _clcBlockDeviceMappings = a })
        . _List

-- | Indicates whether the instance is optimized for Amazon EBS I/O. By
-- default, the instance is not optimized for EBS I/O. The optimization
-- provides dedicated throughput to Amazon EBS and an optimized
-- configuration stack to provide optimal I/O performance. This optimization
-- is not available with all instance types. Additional usage charges apply.
-- For more information, see Amazon EBS-Optimized Instances in the Amazon
-- Elastic Compute Cloud User Guide.
clcEbsOptimized :: Lens' CreateLaunchConfiguration (Maybe Bool)
clcEbsOptimized = lens _clcEbsOptimized (\s a -> s { _clcEbsOptimized = a })

-- | The name or the Amazon Resource Name (ARN) of the instance profile
-- associated with the IAM role for the instance. Amazon EC2 instances
-- launched with an IAM role will automatically have AWS security
-- credentials available. You can use IAM roles with Auto Scaling to
-- automatically enable applications running on your Amazon EC2 instances to
-- securely access other AWS resources. For more information, see Launch
-- Auto Scaling Instances with an IAM Role in the Auto Scaling Developer
-- Guide.
clcIamInstanceProfile :: Lens' CreateLaunchConfiguration (Maybe Text)
clcIamInstanceProfile =
    lens _clcIamInstanceProfile (\s a -> s { _clcIamInstanceProfile = a })

-- | The ID of the Amazon Machine Image (AMI) to use to launch your EC2
-- instances. For more information, see Finding an AMI in the Amazon Elastic
-- Compute Cloud User Guide.
clcImageId :: Lens' CreateLaunchConfiguration (Maybe Text)
clcImageId = lens _clcImageId (\s a -> s { _clcImageId = a })

-- | The ID of the EC2 instance to use to create the launch configuration. The
-- new launch configuration derives attributes from the instance, with the
-- exception of the block device mapping. To create a launch configuration
-- with a block device mapping or override any other instance attributes,
-- specify them as part of the same request. For more information, see
-- Create a Launch Configuration Using an EC2 Instance in the Auto Scaling
-- Developer Guide.
clcInstanceId :: Lens' CreateLaunchConfiguration (Maybe Text)
clcInstanceId = lens _clcInstanceId (\s a -> s { _clcInstanceId = a })

-- | Enables detailed monitoring if it is disabled. Detailed monitoring is
-- enabled by default. When detailed monitoring is enabled, Amazon
-- Cloudwatch generates metrics every minute and your account is charged a
-- fee. When you disable detailed monitoring, by specifying False,
-- Cloudwatch generates metrics every 5 minutes. For more information, see
-- Monitor Your Auto Scaling Instances in the Auto Scaling Developer Guide.
clcInstanceMonitoring :: Lens' CreateLaunchConfiguration (Maybe InstanceMonitoring)
clcInstanceMonitoring =
    lens _clcInstanceMonitoring (\s a -> s { _clcInstanceMonitoring = a })

-- | The instance type of the Amazon EC2 instance. For information about
-- available Amazon EC2 instance types, see Available Instance Types in the
-- Amazon Elastic Cloud Compute User Guide.
clcInstanceType :: Lens' CreateLaunchConfiguration (Maybe Text)
clcInstanceType = lens _clcInstanceType (\s a -> s { _clcInstanceType = a })

-- | The ID of the kernel associated with the Amazon EC2 AMI.
clcKernelId :: Lens' CreateLaunchConfiguration (Maybe Text)
clcKernelId = lens _clcKernelId (\s a -> s { _clcKernelId = a })

-- | The name of the key pair. For more information, see Amazon EC2 Key Pairs
-- in the Amazon Elastic Compute Cloud User Guide.
clcKeyName :: Lens' CreateLaunchConfiguration (Maybe Text)
clcKeyName = lens _clcKeyName (\s a -> s { _clcKeyName = a })

-- | The name of the launch configuration. This name must be unique within the
-- scope of your AWS account.
clcLaunchConfigurationName :: Lens' CreateLaunchConfiguration Text
clcLaunchConfigurationName =
    lens _clcLaunchConfigurationName
        (\s a -> s { _clcLaunchConfigurationName = a })

-- | The tenancy of the instance. An instance with a tenancy of dedicated runs
-- on single-tenant hardware and can only be launched in a VPC. You must set
-- the value of this parameter to dedicated if want to launch Dedicated
-- Instances in a shared tenancy VPC (VPC with instance placement tenancy
-- attribute set to default). If you specify a value for this parameter, be
-- sure to specify at least one VPC subnet using the VPCZoneIdentifier
-- parameter when you create your group. For more information, see Auto
-- Scaling and Amazon VPC in the Auto Scaling Developer Guide. Valid values:
-- default | dedicated.
clcPlacementTenancy :: Lens' CreateLaunchConfiguration (Maybe Text)
clcPlacementTenancy =
    lens _clcPlacementTenancy (\s a -> s { _clcPlacementTenancy = a })

-- | The ID of the RAM disk associated with the Amazon EC2 AMI.
clcRamdiskId :: Lens' CreateLaunchConfiguration (Maybe Text)
clcRamdiskId = lens _clcRamdiskId (\s a -> s { _clcRamdiskId = a })

-- | One or more security groups with which to associate the instances. If
-- your instances are launched in EC2-Classic, you can either specify
-- security group names or the security group IDs. For more information
-- about security groups for EC2-Classic, see Amazon EC2 Security Groups in
-- the Amazon Elastic Compute Cloud User Guide. If your instances are
-- launched in a VPC, specify security group IDs. For more information, see
-- Security Groups for Your VPC in the Amazon Virtual Private Cloud User
-- Guide.
clcSecurityGroups :: Lens' CreateLaunchConfiguration [Text]
clcSecurityGroups =
    lens _clcSecurityGroups (\s a -> s { _clcSecurityGroups = a })
        . _List

-- | The maximum hourly price to be paid for any Spot Instance launched to
-- fulfill the request. Spot Instances are launched when the price you
-- specify exceeds the current Spot market price. For more information, see
-- Launch Spot Instances in Your Auto Scaling Group in the Auto Scaling
-- Developer Guide.
clcSpotPrice :: Lens' CreateLaunchConfiguration (Maybe Text)
clcSpotPrice = lens _clcSpotPrice (\s a -> s { _clcSpotPrice = a })

-- | The user data to make available to the launched EC2 instances. For more
-- information, see Instance Metadata and User Data in the Amazon Elastic
-- Compute Cloud User Guide. At this time, launch configurations don't
-- support compressed (zipped) user data files.
clcUserData :: Lens' CreateLaunchConfiguration (Maybe Text)
clcUserData = lens _clcUserData (\s a -> s { _clcUserData = a })

data CreateLaunchConfigurationResponse = CreateLaunchConfigurationResponse
    deriving (Eq, Ord, Show, Generic)

-- | 'CreateLaunchConfigurationResponse' constructor.
createLaunchConfigurationResponse :: CreateLaunchConfigurationResponse
createLaunchConfigurationResponse = CreateLaunchConfigurationResponse

instance ToPath CreateLaunchConfiguration where
    toPath = const "/"

instance ToQuery CreateLaunchConfiguration where
    toQuery CreateLaunchConfiguration{..} = mconcat
        [ "AssociatePublicIpAddress" =? _clcAssociatePublicIpAddress
        , "BlockDeviceMappings"      =? _clcBlockDeviceMappings
        , "EbsOptimized"             =? _clcEbsOptimized
        , "IamInstanceProfile"       =? _clcIamInstanceProfile
        , "ImageId"                  =? _clcImageId
        , "InstanceId"               =? _clcInstanceId
        , "InstanceMonitoring"       =? _clcInstanceMonitoring
        , "InstanceType"             =? _clcInstanceType
        , "KernelId"                 =? _clcKernelId
        , "KeyName"                  =? _clcKeyName
        , "LaunchConfigurationName"  =? _clcLaunchConfigurationName
        , "PlacementTenancy"         =? _clcPlacementTenancy
        , "RamdiskId"                =? _clcRamdiskId
        , "SecurityGroups"           =? _clcSecurityGroups
        , "SpotPrice"                =? _clcSpotPrice
        , "UserData"                 =? _clcUserData
        ]

instance ToHeaders CreateLaunchConfiguration

instance AWSRequest CreateLaunchConfiguration where
    type Sv CreateLaunchConfiguration = AutoScaling
    type Rs CreateLaunchConfiguration = CreateLaunchConfigurationResponse

    request  = post "CreateLaunchConfiguration"
    response = nullResponse CreateLaunchConfigurationResponse