{-# 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.RDS.CreateDBInstance
-- 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 a new DB instance.
--
-- /See:/ <http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html AWS API Reference> for CreateDBInstance.
module Network.AWS.RDS.CreateDBInstance
    (
    -- * Creating a Request
      createDBInstance
    , CreateDBInstance
    -- * Request Lenses
    , cdiDBSecurityGroups
    , cdiEngineVersion
    , cdiStorageEncrypted
    , cdiDBClusterIdentifier
    , cdiAutoMinorVersionUpgrade
    , cdiMasterUserPassword
    , cdiMasterUsername
    , cdiPubliclyAccessible
    , cdiDBSubnetGroupName
    , cdiIOPS
    , cdiDomain
    , cdiTDECredentialPassword
    , cdiLicenseModel
    , cdiPreferredMaintenanceWindow
    , cdiCharacterSetName
    , cdiPreferredBackupWindow
    , cdiAvailabilityZone
    , cdiBackupRetentionPeriod
    , cdiKMSKeyId
    , cdiDBParameterGroupName
    , cdiVPCSecurityGroupIds
    , cdiMultiAZ
    , cdiAllocatedStorage
    , cdiTDECredentialARN
    , cdiOptionGroupName
    , cdiCopyTagsToSnapshot
    , cdiDBName
    , cdiTags
    , cdiPort
    , cdiStorageType
    , cdiDBInstanceIdentifier
    , cdiDBInstanceClass
    , cdiEngine

    -- * Destructuring the Response
    , createDBInstanceResponse
    , CreateDBInstanceResponse
    -- * Response Lenses
    , cdirsDBInstance
    , cdirsStatus
    ) where

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

-- |
--
-- /See:/ 'createDBInstance' smart constructor.
data CreateDBInstance = CreateDBInstance'
    { _cdiDBSecurityGroups           :: !(Maybe [Text])
    , _cdiEngineVersion              :: !(Maybe Text)
    , _cdiStorageEncrypted           :: !(Maybe Bool)
    , _cdiDBClusterIdentifier        :: !(Maybe Text)
    , _cdiAutoMinorVersionUpgrade    :: !(Maybe Bool)
    , _cdiMasterUserPassword         :: !(Maybe Text)
    , _cdiMasterUsername             :: !(Maybe Text)
    , _cdiPubliclyAccessible         :: !(Maybe Bool)
    , _cdiDBSubnetGroupName          :: !(Maybe Text)
    , _cdiIOPS                       :: !(Maybe Int)
    , _cdiDomain                     :: !(Maybe Text)
    , _cdiTDECredentialPassword      :: !(Maybe Text)
    , _cdiLicenseModel               :: !(Maybe Text)
    , _cdiPreferredMaintenanceWindow :: !(Maybe Text)
    , _cdiCharacterSetName           :: !(Maybe Text)
    , _cdiPreferredBackupWindow      :: !(Maybe Text)
    , _cdiAvailabilityZone           :: !(Maybe Text)
    , _cdiBackupRetentionPeriod      :: !(Maybe Int)
    , _cdiKMSKeyId                   :: !(Maybe Text)
    , _cdiDBParameterGroupName       :: !(Maybe Text)
    , _cdiVPCSecurityGroupIds        :: !(Maybe [Text])
    , _cdiMultiAZ                    :: !(Maybe Bool)
    , _cdiAllocatedStorage           :: !(Maybe Int)
    , _cdiTDECredentialARN           :: !(Maybe Text)
    , _cdiOptionGroupName            :: !(Maybe Text)
    , _cdiCopyTagsToSnapshot         :: !(Maybe Bool)
    , _cdiDBName                     :: !(Maybe Text)
    , _cdiTags                       :: !(Maybe [Tag])
    , _cdiPort                       :: !(Maybe Int)
    , _cdiStorageType                :: !(Maybe Text)
    , _cdiDBInstanceIdentifier       :: !Text
    , _cdiDBInstanceClass            :: !Text
    , _cdiEngine                     :: !Text
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateDBInstance' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdiDBSecurityGroups'
--
-- * 'cdiEngineVersion'
--
-- * 'cdiStorageEncrypted'
--
-- * 'cdiDBClusterIdentifier'
--
-- * 'cdiAutoMinorVersionUpgrade'
--
-- * 'cdiMasterUserPassword'
--
-- * 'cdiMasterUsername'
--
-- * 'cdiPubliclyAccessible'
--
-- * 'cdiDBSubnetGroupName'
--
-- * 'cdiIOPS'
--
-- * 'cdiDomain'
--
-- * 'cdiTDECredentialPassword'
--
-- * 'cdiLicenseModel'
--
-- * 'cdiPreferredMaintenanceWindow'
--
-- * 'cdiCharacterSetName'
--
-- * 'cdiPreferredBackupWindow'
--
-- * 'cdiAvailabilityZone'
--
-- * 'cdiBackupRetentionPeriod'
--
-- * 'cdiKMSKeyId'
--
-- * 'cdiDBParameterGroupName'
--
-- * 'cdiVPCSecurityGroupIds'
--
-- * 'cdiMultiAZ'
--
-- * 'cdiAllocatedStorage'
--
-- * 'cdiTDECredentialARN'
--
-- * 'cdiOptionGroupName'
--
-- * 'cdiCopyTagsToSnapshot'
--
-- * 'cdiDBName'
--
-- * 'cdiTags'
--
-- * 'cdiPort'
--
-- * 'cdiStorageType'
--
-- * 'cdiDBInstanceIdentifier'
--
-- * 'cdiDBInstanceClass'
--
-- * 'cdiEngine'
createDBInstance
    :: Text -- ^ 'cdiDBInstanceIdentifier'
    -> Text -- ^ 'cdiDBInstanceClass'
    -> Text -- ^ 'cdiEngine'
    -> CreateDBInstance
createDBInstance pDBInstanceIdentifier_ pDBInstanceClass_ pEngine_ =
    CreateDBInstance'
    { _cdiDBSecurityGroups = Nothing
    , _cdiEngineVersion = Nothing
    , _cdiStorageEncrypted = Nothing
    , _cdiDBClusterIdentifier = Nothing
    , _cdiAutoMinorVersionUpgrade = Nothing
    , _cdiMasterUserPassword = Nothing
    , _cdiMasterUsername = Nothing
    , _cdiPubliclyAccessible = Nothing
    , _cdiDBSubnetGroupName = Nothing
    , _cdiIOPS = Nothing
    , _cdiDomain = Nothing
    , _cdiTDECredentialPassword = Nothing
    , _cdiLicenseModel = Nothing
    , _cdiPreferredMaintenanceWindow = Nothing
    , _cdiCharacterSetName = Nothing
    , _cdiPreferredBackupWindow = Nothing
    , _cdiAvailabilityZone = Nothing
    , _cdiBackupRetentionPeriod = Nothing
    , _cdiKMSKeyId = Nothing
    , _cdiDBParameterGroupName = Nothing
    , _cdiVPCSecurityGroupIds = Nothing
    , _cdiMultiAZ = Nothing
    , _cdiAllocatedStorage = Nothing
    , _cdiTDECredentialARN = Nothing
    , _cdiOptionGroupName = Nothing
    , _cdiCopyTagsToSnapshot = Nothing
    , _cdiDBName = Nothing
    , _cdiTags = Nothing
    , _cdiPort = Nothing
    , _cdiStorageType = Nothing
    , _cdiDBInstanceIdentifier = pDBInstanceIdentifier_
    , _cdiDBInstanceClass = pDBInstanceClass_
    , _cdiEngine = pEngine_
    }

-- | A list of DB security groups to associate with this DB instance.
--
-- Default: The default DB security group for the database engine.
cdiDBSecurityGroups :: Lens' CreateDBInstance [Text]
cdiDBSecurityGroups = lens _cdiDBSecurityGroups (\ s a -> s{_cdiDBSecurityGroups = a}) . _Default . _Coerce;

-- | The version number of the database engine to use.
--
-- The following are the database engines and major and minor versions that
-- are available with Amazon RDS. Not every database engine is available
-- for every AWS region.
--
-- __MySQL__
--
-- -   __Version 5.1 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.1.73a | 5.1.73b'
-- -   __Version 5.5 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.5.40 | 5.5.40a'
-- -   __Version 5.5 (Available in all regions):__
--     ' 5.5.40b | 5.5.41 | 5.5.42'
-- -   __Version 5.6 (Available in all regions):__
--     ' 5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22 | 5.6.23'
--
-- __MySQL__
--
-- -   __Version 5.1 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.1.73a | 5.1.73b'
-- -   __Version 5.5 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.5.40 | 5.5.40a'
-- -   __Version 5.5 (Available in all regions):__
--     ' 5.5.40b | 5.5.41 | 5.5.42'
-- -   __Version 5.6 (Available in all regions):__
--     ' 5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22 | 5.6.23'
--
-- __MySQL__
--
-- -   __Version 5.1 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.1.73a | 5.1.73b'
-- -   __Version 5.5 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.5.40 | 5.5.40a'
-- -   __Version 5.5 (Available in all regions):__
--     ' 5.5.40b | 5.5.41 | 5.5.42'
-- -   __Version 5.6 (Available in all regions):__
--     ' 5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22 | 5.6.23'
--
-- __MySQL__
--
-- -   __Version 5.1 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.1.73a | 5.1.73b'
-- -   __Version 5.5 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 5.5.40 | 5.5.40a'
-- -   __Version 5.5 (Available in all regions):__
--     ' 5.5.40b | 5.5.41 | 5.5.42'
-- -   __Version 5.6 (Available in all regions):__
--     ' 5.6.19a | 5.6.19b | 5.6.21 | 5.6.21b | 5.6.22 | 5.6.23'
--
-- __Oracle Database Enterprise Edition (oracle-ee)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Available in all regions):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Available in all regions):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Enterprise Edition (oracle-ee)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Available in all regions):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Available in all regions):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Enterprise Edition (oracle-ee)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Available in all regions):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Available in all regions):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition (oracle-se)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition (oracle-se)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition (oracle-se)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition One (oracle-se1)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition One (oracle-se1)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __Oracle Database Standard Edition One (oracle-se1)__
--
-- -   __Version 11.2 (Only available in the following regions:
--     us-west-1):__
--     ' 11.2.0.2.v3 | 11.2.0.2.v4 | 11.2.0.2.v5 | 11.2.0.2.v6 | 11.2.0.2.v7'
-- -   __Version 11.2 (Only available in the following regions:
--     eu-central-1, us-west-1):__
--     ' 11.2.0.3.v1 | 11.2.0.3.v2 | 11.2.0.4.v1 | 11.2.0.4.v3'
-- -   __Version 12.1 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 12.1.0.1.v1'
--
-- __PostgreSQL__
--
-- -   __Version 9.3 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 9.3.1 | 9.3.2'
-- -   __Version 9.3 (Available in all regions):__ ' 9.3.3 | 9.3.5 | 9.3.6'
-- -   __Version 9.4 (Available in all regions):__ ' 9.4.1'
--
-- __PostgreSQL__
--
-- -   __Version 9.3 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 9.3.1 | 9.3.2'
-- -   __Version 9.3 (Available in all regions):__ ' 9.3.3 | 9.3.5 | 9.3.6'
-- -   __Version 9.4 (Available in all regions):__ ' 9.4.1'
--
-- __PostgreSQL__
--
-- -   __Version 9.3 (Only available in the following regions:
--     ap-northeast-1, ap-southeast-1, ap-southeast-2, eu-west-1,
--     sa-east-1, us-west-1, us-west-2):__ ' 9.3.1 | 9.3.2'
-- -   __Version 9.3 (Available in all regions):__ ' 9.3.3 | 9.3.5 | 9.3.6'
-- -   __Version 9.4 (Available in all regions):__ ' 9.4.1'
--
-- __Microsoft SQL Server Enterprise Edition (sqlserver-ee)__
--
-- -   __Version 10.50 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Enterprise Edition (sqlserver-ee)__
--
-- -   __Version 10.50 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Only available in the following regions:
--     eu-central-1, us-west-1):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Express Edition (sqlserver-ex)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Express Edition (sqlserver-ex)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Standard Edition (sqlserver-se)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Standard Edition (sqlserver-se)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Web Edition (sqlserver-web)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
--
-- __Microsoft SQL Server Web Edition (sqlserver-web)__
--
-- -   __Version 10.50 (Available in all regions):__ ' 10.50.2789.0.v1'
-- -   __Version 11.00 (Available in all regions):__ ' 11.00.2100.60.v1'
cdiEngineVersion :: Lens' CreateDBInstance (Maybe Text)
cdiEngineVersion = lens _cdiEngineVersion (\ s a -> s{_cdiEngineVersion = a});

-- | Specifies whether the DB instance is encrypted.
--
-- Default: false
cdiStorageEncrypted :: Lens' CreateDBInstance (Maybe Bool)
cdiStorageEncrypted = lens _cdiStorageEncrypted (\ s a -> s{_cdiStorageEncrypted = a});

-- | The identifier of the DB cluster that the instance will belong to.
--
-- For information on creating a DB cluster, see CreateDBCluster.
--
-- Type: String
cdiDBClusterIdentifier :: Lens' CreateDBInstance (Maybe Text)
cdiDBClusterIdentifier = lens _cdiDBClusterIdentifier (\ s a -> s{_cdiDBClusterIdentifier = a});

-- | Indicates that minor engine upgrades will be applied automatically to
-- the DB instance during the maintenance window.
--
-- Default: 'true'
cdiAutoMinorVersionUpgrade :: Lens' CreateDBInstance (Maybe Bool)
cdiAutoMinorVersionUpgrade = lens _cdiAutoMinorVersionUpgrade (\ s a -> s{_cdiAutoMinorVersionUpgrade = a});

-- | The password for the master database user. Can be any printable ASCII
-- character except \"\/\", \"\"\", or \"\'\".
--
-- Type: String
--
-- __MySQL__
--
-- Constraints: Must contain from 8 to 41 characters.
--
-- __Oracle__
--
-- Constraints: Must contain from 8 to 30 characters.
--
-- __SQL Server__
--
-- Constraints: Must contain from 8 to 128 characters.
--
-- __PostgreSQL__
--
-- Constraints: Must contain from 8 to 128 characters.
cdiMasterUserPassword :: Lens' CreateDBInstance (Maybe Text)
cdiMasterUserPassword = lens _cdiMasterUserPassword (\ s a -> s{_cdiMasterUserPassword = a});

-- | The name of master user for the client DB instance.
--
-- __MySQL__
--
-- Constraints:
--
-- -   Must be 1 to 16 alphanumeric characters.
-- -   First character must be a letter.
-- -   Cannot be a reserved word for the chosen database engine.
--
-- Type: String
--
-- __Oracle__
--
-- Constraints:
--
-- -   Must be 1 to 30 alphanumeric characters.
-- -   First character must be a letter.
-- -   Cannot be a reserved word for the chosen database engine.
--
-- __SQL Server__
--
-- Constraints:
--
-- -   Must be 1 to 128 alphanumeric characters.
-- -   First character must be a letter.
-- -   Cannot be a reserved word for the chosen database engine.
--
-- __PostgreSQL__
--
-- Constraints:
--
-- -   Must be 1 to 63 alphanumeric characters.
-- -   First character must be a letter.
-- -   Cannot be a reserved word for the chosen database engine.
cdiMasterUsername :: Lens' CreateDBInstance (Maybe Text)
cdiMasterUsername = lens _cdiMasterUsername (\ s a -> s{_cdiMasterUsername = a});

-- | Specifies the accessibility options for the DB instance. A value of true
-- specifies an Internet-facing instance with a publicly resolvable DNS
-- name, which resolves to a public IP address. A value of false specifies
-- an internal instance with a DNS name that resolves to a private IP
-- address.
--
-- Default: The default behavior varies depending on whether a VPC has been
-- requested or not. The following list shows the default behavior in each
-- case.
--
-- -   __Default VPC:__ true
-- -   __VPC:__ false
--
-- If no DB subnet group has been specified as part of the request and the
-- PubliclyAccessible value has not been set, the DB instance will be
-- publicly accessible. If a specific DB subnet group has been specified as
-- part of the request and the PubliclyAccessible value has not been set,
-- the DB instance will be private.
cdiPubliclyAccessible :: Lens' CreateDBInstance (Maybe Bool)
cdiPubliclyAccessible = lens _cdiPubliclyAccessible (\ s a -> s{_cdiPubliclyAccessible = a});

-- | A DB subnet group to associate with this DB instance.
--
-- If there is no DB subnet group, then it is a non-VPC DB instance.
cdiDBSubnetGroupName :: Lens' CreateDBInstance (Maybe Text)
cdiDBSubnetGroupName = lens _cdiDBSubnetGroupName (\ s a -> s{_cdiDBSubnetGroupName = a});

-- | The amount of Provisioned IOPS (input\/output operations per second) to
-- be initially allocated for the DB instance.
--
-- Constraints: To use PIOPS, this value must be an integer greater than
-- 1000.
cdiIOPS :: Lens' CreateDBInstance (Maybe Int)
cdiIOPS = lens _cdiIOPS (\ s a -> s{_cdiIOPS = a});

-- | Specify the Active Directory Domain to create the instance in.
cdiDomain :: Lens' CreateDBInstance (Maybe Text)
cdiDomain = lens _cdiDomain (\ s a -> s{_cdiDomain = a});

-- | The password for the given ARN from the Key Store in order to access the
-- device.
cdiTDECredentialPassword :: Lens' CreateDBInstance (Maybe Text)
cdiTDECredentialPassword = lens _cdiTDECredentialPassword (\ s a -> s{_cdiTDECredentialPassword = a});

-- | License model information for this DB instance.
--
-- Valid values: 'license-included' | 'bring-your-own-license' |
-- 'general-public-license'
cdiLicenseModel :: Lens' CreateDBInstance (Maybe Text)
cdiLicenseModel = lens _cdiLicenseModel (\ s a -> s{_cdiLicenseModel = a});

-- | The weekly time range during which system maintenance can occur, in
-- Universal Coordinated Time (UTC). For more information, see
-- <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBMaintenance.html DB Instance Maintenance>.
--
-- Format: 'ddd:hh24:mi-ddd:hh24:mi'
--
-- Default: A 30-minute window selected at random from an 8-hour block of
-- time per region, occurring on a random day of the week. To see the time
-- blocks available, see
-- <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/AdjustingTheMaintenanceWindow.html Adjusting the Preferred Maintenance Window>
-- in the /Amazon RDS User Guide./
--
-- Valid Days: Mon, Tue, Wed, Thu, Fri, Sat, Sun
--
-- Constraints: Minimum 30-minute window.
cdiPreferredMaintenanceWindow :: Lens' CreateDBInstance (Maybe Text)
cdiPreferredMaintenanceWindow = lens _cdiPreferredMaintenanceWindow (\ s a -> s{_cdiPreferredMaintenanceWindow = a});

-- | For supported engines, indicates that the DB instance should be
-- associated with the specified CharacterSet.
cdiCharacterSetName :: Lens' CreateDBInstance (Maybe Text)
cdiCharacterSetName = lens _cdiCharacterSetName (\ s a -> s{_cdiCharacterSetName = a});

-- | The daily time range during which automated backups are created if
-- automated backups are enabled, using the 'BackupRetentionPeriod'
-- parameter. For more information, see
-- <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.BackingUpAndRestoringAmazonRDSInstances.html DB Instance Backups>.
--
-- Default: A 30-minute window selected at random from an 8-hour block of
-- time per region. To see the time blocks available, see
-- <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/AdjustingTheMaintenanceWindow.html Adjusting the Preferred Maintenance Window>
-- in the /Amazon RDS User Guide./
--
-- Constraints:
--
-- -   Must be in the format 'hh24:mi-hh24:mi'.
-- -   Times should be in Universal Coordinated Time (UTC).
-- -   Must not conflict with the preferred maintenance window.
-- -   Must be at least 30 minutes.
cdiPreferredBackupWindow :: Lens' CreateDBInstance (Maybe Text)
cdiPreferredBackupWindow = lens _cdiPreferredBackupWindow (\ s a -> s{_cdiPreferredBackupWindow = a});

-- | The EC2 Availability Zone that the database instance will be created in.
-- For information on regions and Availability Zones, see
-- <http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html Regions and Availability Zones>.
--
-- Default: A random, system-chosen Availability Zone in the endpoint\'s
-- region.
--
-- Example: 'us-east-1d'
--
-- Constraint: The AvailabilityZone parameter cannot be specified if the
-- MultiAZ parameter is set to 'true'. The specified Availability Zone must
-- be in the same region as the current endpoint.
cdiAvailabilityZone :: Lens' CreateDBInstance (Maybe Text)
cdiAvailabilityZone = lens _cdiAvailabilityZone (\ s a -> s{_cdiAvailabilityZone = a});

-- | The number of days for which automated backups are retained. Setting
-- this parameter to a positive number enables backups. Setting this
-- parameter to 0 disables automated backups.
--
-- Default: 1
--
-- Constraints:
--
-- -   Must be a value from 0 to 35
-- -   Cannot be set to 0 if the DB instance is a source to Read Replicas
cdiBackupRetentionPeriod :: Lens' CreateDBInstance (Maybe Int)
cdiBackupRetentionPeriod = lens _cdiBackupRetentionPeriod (\ s a -> s{_cdiBackupRetentionPeriod = a});

-- | The KMS key identifier for an encrypted DB instance.
--
-- The KMS key identifier is the Amazon Resoure Name (ARN) for the KMS
-- encryption key. If you are creating a DB instance with the same AWS
-- account that owns the KMS encryption key used to encrypt the new DB
-- instance, then you can use the KMS key alias instead of the ARN for the
-- KM encryption key.
--
-- If the 'StorageEncrypted' parameter is true, and you do not specify a
-- value for the 'KmsKeyId' parameter, then Amazon RDS will use your
-- default encryption key. AWS KMS creates the default encryption key for
-- your AWS account. Your AWS account has a different default encryption
-- key for each AWS region.
cdiKMSKeyId :: Lens' CreateDBInstance (Maybe Text)
cdiKMSKeyId = lens _cdiKMSKeyId (\ s a -> s{_cdiKMSKeyId = a});

-- | The name of the DB parameter group to associate with this DB instance.
-- If this argument is omitted, the default DBParameterGroup for the
-- specified engine will be used.
--
-- Constraints:
--
-- -   Must be 1 to 255 alphanumeric characters
-- -   First character must be a letter
-- -   Cannot end with a hyphen or contain two consecutive hyphens
cdiDBParameterGroupName :: Lens' CreateDBInstance (Maybe Text)
cdiDBParameterGroupName = lens _cdiDBParameterGroupName (\ s a -> s{_cdiDBParameterGroupName = a});

-- | A list of EC2 VPC security groups to associate with this DB instance.
--
-- Default: The default EC2 VPC security group for the DB subnet group\'s
-- VPC.
cdiVPCSecurityGroupIds :: Lens' CreateDBInstance [Text]
cdiVPCSecurityGroupIds = lens _cdiVPCSecurityGroupIds (\ s a -> s{_cdiVPCSecurityGroupIds = a}) . _Default . _Coerce;

-- | Specifies if the DB instance is a Multi-AZ deployment. You cannot set
-- the AvailabilityZone parameter if the MultiAZ parameter is set to true.
-- Do not set this value if you want a Multi-AZ deployment for a SQL Server
-- DB instance. Multi-AZ for SQL Server is set using the Mirroring option
-- in an option group.
cdiMultiAZ :: Lens' CreateDBInstance (Maybe Bool)
cdiMultiAZ = lens _cdiMultiAZ (\ s a -> s{_cdiMultiAZ = a});

-- | The amount of storage (in gigabytes) to be initially allocated for the
-- database instance.
--
-- Type: Integer
--
-- __MySQL__
--
-- Constraints: Must be an integer from 5 to 6144.
--
-- __PostgreSQL__
--
-- Constraints: Must be an integer from 5 to 6144.
--
-- __Oracle__
--
-- Constraints: Must be an integer from 10 to 6144.
--
-- __SQL Server__
--
-- Constraints: Must be an integer from 200 to 4096 (Standard Edition and
-- Enterprise Edition) or from 20 to 4096 (Express Edition and Web Edition)
cdiAllocatedStorage :: Lens' CreateDBInstance (Maybe Int)
cdiAllocatedStorage = lens _cdiAllocatedStorage (\ s a -> s{_cdiAllocatedStorage = a});

-- | The ARN from the Key Store with which to associate the instance for TDE
-- encryption.
cdiTDECredentialARN :: Lens' CreateDBInstance (Maybe Text)
cdiTDECredentialARN = lens _cdiTDECredentialARN (\ s a -> s{_cdiTDECredentialARN = a});

-- | Indicates that the DB instance should be associated with the specified
-- option group.
--
-- Permanent options, such as the TDE option for Oracle Advanced Security
-- TDE, cannot be removed from an option group, and that option group
-- cannot be removed from a DB instance once it is associated with a DB
-- instance
cdiOptionGroupName :: Lens' CreateDBInstance (Maybe Text)
cdiOptionGroupName = lens _cdiOptionGroupName (\ s a -> s{_cdiOptionGroupName = a});

-- | This property is not currently implemented.
cdiCopyTagsToSnapshot :: Lens' CreateDBInstance (Maybe Bool)
cdiCopyTagsToSnapshot = lens _cdiCopyTagsToSnapshot (\ s a -> s{_cdiCopyTagsToSnapshot = a});

-- | The meaning of this parameter differs according to the database engine
-- you use.
--
-- Type: String
--
-- __MySQL__
--
-- The name of the database to create when the DB instance is created. If
-- this parameter is not specified, no database is created in the DB
-- instance.
--
-- Constraints:
--
-- -   Must contain 1 to 64 alphanumeric characters
-- -   Cannot be a word reserved by the specified database engine
--
-- __PostgreSQL__
--
-- The name of the database to create when the DB instance is created. If
-- this parameter is not specified, the default \"postgres\" database is
-- created in the DB instance.
--
-- Constraints:
--
-- -   Must contain 1 to 63 alphanumeric characters
-- -   Must begin with a letter or an underscore. Subsequent characters can
--     be letters, underscores, or digits (0-9).
-- -   Cannot be a word reserved by the specified database engine
--
-- __Oracle__
--
-- The Oracle System ID (SID) of the created DB instance.
--
-- Default: 'ORCL'
--
-- Constraints:
--
-- -   Cannot be longer than 8 characters
--
-- __SQL Server__
--
-- Not applicable. Must be null.
cdiDBName :: Lens' CreateDBInstance (Maybe Text)
cdiDBName = lens _cdiDBName (\ s a -> s{_cdiDBName = a});

-- | Undocumented member.
cdiTags :: Lens' CreateDBInstance [Tag]
cdiTags = lens _cdiTags (\ s a -> s{_cdiTags = a}) . _Default . _Coerce;

-- | The port number on which the database accepts connections.
--
-- __MySQL__
--
-- Default: '3306'
--
-- Valid Values: '1150-65535'
--
-- Type: Integer
--
-- __PostgreSQL__
--
-- Default: '5432'
--
-- Valid Values: '1150-65535'
--
-- Type: Integer
--
-- __Oracle__
--
-- Default: '1521'
--
-- Valid Values: '1150-65535'
--
-- __SQL Server__
--
-- Default: '1433'
--
-- Valid Values: '1150-65535' except for '1434', '3389', '47001', '49152',
-- and '49152' through '49156'.
cdiPort :: Lens' CreateDBInstance (Maybe Int)
cdiPort = lens _cdiPort (\ s a -> s{_cdiPort = a});

-- | Specifies the storage type to be associated with the DB instance.
--
-- Valid values: 'standard | gp2 | io1'
--
-- If you specify 'io1', you must also include a value for the 'Iops'
-- parameter.
--
-- Default: 'io1' if the 'Iops' parameter is specified; otherwise
-- 'standard'
cdiStorageType :: Lens' CreateDBInstance (Maybe Text)
cdiStorageType = lens _cdiStorageType (\ s a -> s{_cdiStorageType = a});

-- | The DB instance identifier. This parameter is stored as a lowercase
-- string.
--
-- Constraints:
--
-- -   Must contain from 1 to 63 alphanumeric characters or hyphens (1 to
--     15 for SQL Server).
-- -   First character must be a letter.
-- -   Cannot end with a hyphen or contain two consecutive hyphens.
--
-- Example: 'mydbinstance'
cdiDBInstanceIdentifier :: Lens' CreateDBInstance Text
cdiDBInstanceIdentifier = lens _cdiDBInstanceIdentifier (\ s a -> s{_cdiDBInstanceIdentifier = a});

-- | The compute and memory capacity of the DB instance.
--
-- Valid Values:
-- 'db.t1.micro | db.m1.small | db.m1.medium | db.m1.large | db.m1.xlarge | db.m2.xlarge |db.m2.2xlarge | db.m2.4xlarge | db.m3.medium | db.m3.large | db.m3.xlarge | db.m3.2xlarge | db.r3.large | db.r3.xlarge | db.r3.2xlarge | db.r3.4xlarge | db.r3.8xlarge | db.t2.micro | db.t2.small | db.t2.medium'
cdiDBInstanceClass :: Lens' CreateDBInstance Text
cdiDBInstanceClass = lens _cdiDBInstanceClass (\ s a -> s{_cdiDBInstanceClass = a});

-- | The name of the database engine to be used for this instance.
--
-- Valid Values: 'MySQL' | 'oracle-se1' | 'oracle-se' | 'oracle-ee' |
-- 'sqlserver-ee' | 'sqlserver-se' | 'sqlserver-ex' | 'sqlserver-web' |
-- 'postgres'
--
-- Not every database engine is available for every AWS region.
cdiEngine :: Lens' CreateDBInstance Text
cdiEngine = lens _cdiEngine (\ s a -> s{_cdiEngine = a});

instance AWSRequest CreateDBInstance where
        type Sv CreateDBInstance = RDS
        type Rs CreateDBInstance = CreateDBInstanceResponse
        request = postQuery
        response
          = receiveXMLWrapper "CreateDBInstanceResult"
              (\ s h x ->
                 CreateDBInstanceResponse' <$>
                   (x .@? "DBInstance") <*> (pure (fromEnum s)))

instance ToHeaders CreateDBInstance where
        toHeaders = const mempty

instance ToPath CreateDBInstance where
        toPath = const "/"

instance ToQuery CreateDBInstance where
        toQuery CreateDBInstance'{..}
          = mconcat
              ["Action" =: ("CreateDBInstance" :: ByteString),
               "Version" =: ("2014-10-31" :: ByteString),
               "DBSecurityGroups" =:
                 toQuery
                   (toQueryList "DBSecurityGroupName" <$>
                      _cdiDBSecurityGroups),
               "EngineVersion" =: _cdiEngineVersion,
               "StorageEncrypted" =: _cdiStorageEncrypted,
               "DBClusterIdentifier" =: _cdiDBClusterIdentifier,
               "AutoMinorVersionUpgrade" =:
                 _cdiAutoMinorVersionUpgrade,
               "MasterUserPassword" =: _cdiMasterUserPassword,
               "MasterUsername" =: _cdiMasterUsername,
               "PubliclyAccessible" =: _cdiPubliclyAccessible,
               "DBSubnetGroupName" =: _cdiDBSubnetGroupName,
               "Iops" =: _cdiIOPS, "Domain" =: _cdiDomain,
               "TdeCredentialPassword" =: _cdiTDECredentialPassword,
               "LicenseModel" =: _cdiLicenseModel,
               "PreferredMaintenanceWindow" =:
                 _cdiPreferredMaintenanceWindow,
               "CharacterSetName" =: _cdiCharacterSetName,
               "PreferredBackupWindow" =: _cdiPreferredBackupWindow,
               "AvailabilityZone" =: _cdiAvailabilityZone,
               "BackupRetentionPeriod" =: _cdiBackupRetentionPeriod,
               "KmsKeyId" =: _cdiKMSKeyId,
               "DBParameterGroupName" =: _cdiDBParameterGroupName,
               "VpcSecurityGroupIds" =:
                 toQuery
                   (toQueryList "VpcSecurityGroupId" <$>
                      _cdiVPCSecurityGroupIds),
               "MultiAZ" =: _cdiMultiAZ,
               "AllocatedStorage" =: _cdiAllocatedStorage,
               "TdeCredentialArn" =: _cdiTDECredentialARN,
               "OptionGroupName" =: _cdiOptionGroupName,
               "CopyTagsToSnapshot" =: _cdiCopyTagsToSnapshot,
               "DBName" =: _cdiDBName,
               "Tags" =: toQuery (toQueryList "Tag" <$> _cdiTags),
               "Port" =: _cdiPort, "StorageType" =: _cdiStorageType,
               "DBInstanceIdentifier" =: _cdiDBInstanceIdentifier,
               "DBInstanceClass" =: _cdiDBInstanceClass,
               "Engine" =: _cdiEngine]

-- | /See:/ 'createDBInstanceResponse' smart constructor.
data CreateDBInstanceResponse = CreateDBInstanceResponse'
    { _cdirsDBInstance :: !(Maybe DBInstance)
    , _cdirsStatus     :: !Int
    } deriving (Eq,Read,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateDBInstanceResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cdirsDBInstance'
--
-- * 'cdirsStatus'
createDBInstanceResponse
    :: Int -- ^ 'cdirsStatus'
    -> CreateDBInstanceResponse
createDBInstanceResponse pStatus_ =
    CreateDBInstanceResponse'
    { _cdirsDBInstance = Nothing
    , _cdirsStatus = pStatus_
    }

-- | Undocumented member.
cdirsDBInstance :: Lens' CreateDBInstanceResponse (Maybe DBInstance)
cdirsDBInstance = lens _cdirsDBInstance (\ s a -> s{_cdirsDBInstance = a});

-- | The response status code.
cdirsStatus :: Lens' CreateDBInstanceResponse Int
cdirsStatus = lens _cdirsStatus (\ s a -> s{_cdirsStatus = a});