module AWS.EC2.VPC
( associateDhcpOptions
, attachInternetGateway
, createVpc
, createVpnGateway
, createCustomerGateway
, createInternetGateway
, createDhcpOptions
, deleteVpc
, deleteVpnGateway
, deleteCustomerGateway
, deleteInternetGateway
, deleteDhcpOptions
, describeVpnConnections
, describeVpnGateways
, describeVpcs
, describeCustomerGateway
, describeInternetGateways
, describeDhcpOptions
, detachInternetGateway
) where
import Data.Text (Text)
import Data.XML.Types (Event)
import Data.Conduit
import Data.IP (IPv4, AddrRange)
import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Applicative
import AWS.EC2.Internal
import AWS.EC2.Types
import AWS.EC2.Query
import AWS.Lib.Parser
import AWS.Util
import Debug.Trace
attachInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> EC2 m Bool
attachInternetGateway internetGatewayId vid =
ec2Query "AttachInternetGateway" params $ getT "return"
where
params =
[ "InternetGatewayId" |= internetGatewayId
, "VpcId" |= vid ]
detachInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> EC2 m Bool
detachInternetGateway internetGatewayId vid =
ec2Query "DetachInternetGateway" params $ getT "return"
where
params =
[ "InternetGatewayId" |= internetGatewayId
, "VpcId" |= vid ]
deleteInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteInternetGateway = ec2Delete "DeleteInternetGateway" "InternetGatewayId"
createInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> EC2 m InternetGateway
createInternetGateway =
ec2Query "CreateInternetGateway" [] $
element "internetGateway" internetGatewaySink
describeInternetGateways
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m InternetGateway)
describeInternetGateways internetGatewayIds filters = do
ec2QuerySource "DescribeInternetGateways" params $
itemConduit "internetGatewaySet" internetGatewaySink
where
params =
[ "InternetGatewayId" |.#= internetGatewayIds
, filtersParam filters
]
internetGatewaySink :: MonadThrow m
=> GLSink Event m InternetGateway
internetGatewaySink = InternetGateway
<$> getT "internetGatewayId"
<*> itemsSet "attachmentSet" internetGatewayAttachmentSink
<*> resourceTagSink
internetGatewayAttachmentSink :: MonadThrow m
=> GLSink Event m InternetGatewayAttachment
internetGatewayAttachmentSink = InternetGatewayAttachment
<$> getT "vpcId"
<*> getT "state"
describeVpnConnections
:: (MonadBaseControl IO m, MonadResource m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m VpnConnection)
describeVpnConnections ids filters =
ec2QuerySource "DescribeVpnConnections" params vpnConnectionConduit
where
params =
[ "VpnConnectionId" |.#= ids
, filtersParam filters
]
vpnConnectionConduit
:: (MonadBaseControl IO m, MonadResource m)
=> GLConduit Event m VpnConnection
vpnConnectionConduit = itemConduit "vpnConnectionSet" $
VpnConnection
<$> do
a <- getT "vpnConnectionId"
traceShow a $ return a
<*> getT "state"
<*> getT "customerGatewayConfiguration"
<*> getT "type"
<*> getT "customerGatewayId"
<*> getT "vpnGatewayId"
<*> resourceTagSink
<*> itemsSet "vgwTelemetry"
(VpnTunnelTelemetry
<$> getT "outsideIpAddress"
<*> getT "status"
<*> getT "lastStatusChange"
<*> getT "statusMessage"
<*> getT "acceptedRouteCount"
)
<*> elementM "options"
(VpnConnectionOptionsRequest
<$> getT "staticRoutesOnly"
)
<*> elementM "routes"
(VpnStaticRoute
<$> getT "destinationCidrBlock"
<*> getT "source"
<*> getT "state"
)
describeVpcs
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m Vpc)
describeVpcs vpcIds filters = do
ec2QuerySource "DescribeVpcs" params $
itemConduit "vpcSet" vpcSink
where
params =
[ "VpcId" |.#= vpcIds
, filtersParam filters
]
vpcSink :: MonadThrow m
=> GLSink Event m Vpc
vpcSink = Vpc
<$> getT "vpcId"
<*> getT "state"
<*> getT "cidrBlock"
<*> getT "dhcpOptionsId"
<*> resourceTagSink
<*> getT "instanceTenancy"
<*> getT "isDefault"
createVpc
:: (MonadResource m, MonadBaseControl IO m)
=> AddrRange IPv4
-> Maybe Text
-> EC2 m Vpc
createVpc cidrBlock instanceTenancy =
ec2Query "CreateVpc" params $
element "vpc" vpcSink
where
params =
[ "CidrBlock" |= toText cidrBlock
, "instanceTenancy" |=? instanceTenancy
]
deleteVpc
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteVpc = ec2Delete "DeleteVpc" "VpcId"
describeVpnGateways
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m VpnGateway)
describeVpnGateways ids filters = do
ec2QuerySource "DescribeVpnGateways" params $
itemConduit "vpnGatewaySet" vpnGatewaySink
where
params =
[ "VpnGatewayId" |.#= ids
, filtersParam filters
]
vpnGatewaySink :: MonadThrow m
=> GLSink Event m VpnGateway
vpnGatewaySink = VpnGateway
<$> getT "vpnGatewayId"
<*> getT "state"
<*> getT "type"
<*> getT "availabilityZone"
<*> itemsSet "attachments" attachmentSink
<*> resourceTagSink
attachmentSink :: MonadThrow m
=> GLSink Event m Attachment
attachmentSink = Attachment
<$> getT "vpcId"
<*> getT "state"
createVpnGateway
:: (MonadResource m, MonadBaseControl IO m)
=> CreateVpnGatewayType
-> Maybe Text
-> EC2 m VpnGateway
createVpnGateway type' availabilityZone = do
ec2Query "CreateVpnGateway" params $
element "vpnGateway" vpnGatewaySink
where
params =
[ "Type" |= createVpnGatewayTypeText type'
, "AvailabilityZone" |=? availabilityZone
]
createVpnGatewayTypeText CreateVpnGatewayTypeIpsec1 = "ipsec.1"
deleteVpnGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteVpnGateway = ec2Delete "DeleteVpnGateway" "VpnGatewayId"
describeCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m CustomerGateway)
describeCustomerGateway ids filters = do
ec2QuerySource "DescribeCustomerGateways" params $
itemConduit "customerGatewaySet" customerGatewaySink
where
params =
[ "CustomerGatewayId" |.#= ids
, filtersParam filters
]
customerGatewaySink :: MonadThrow m
=> GLSink Event m CustomerGateway
customerGatewaySink = CustomerGateway
<$> getT "customerGatewayId"
<*> getT "state"
<*> getT "type"
<*> getT "ipAddress"
<*> getT "bgpAsn"
<*> resourceTagSink
createCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> IPv4
-> Int
-> EC2 m CustomerGateway
createCustomerGateway type' ipAddr bgpAsn = do
ec2Query "CreateCustomerGateway" params $
element "customerGateway" customerGatewaySink
where
params =
[ "Type" |= type'
, "IpAddress" |= toText ipAddr
, "BgpAsn" |= toText bgpAsn
]
deleteCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteCustomerGateway = ec2Delete "DeleteCustomerGateway" "CustomerGatewayId"
describeDhcpOptions
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m DhcpOptions)
describeDhcpOptions ids filters =
ec2QuerySource "DescribeDhcpOptions" params $
itemConduit "dhcpOptionsSet" dhcpOptionsSink
where
params =
[ "DhcpOptionsId" |.#= ids
, filtersParam filters
]
dhcpOptionsSink :: MonadThrow m
=> GLSink Event m DhcpOptions
dhcpOptionsSink = DhcpOptions
<$> getT "dhcpOptionsId"
<*> itemsSet "dhcpConfigurationSet" dhcpConfigurationSink
<*> resourceTagSink
dhcpConfigurationSink :: MonadThrow m
=> GLSink Event m DhcpConfiguration
dhcpConfigurationSink = DhcpConfiguration
<$> getT "key"
<*> itemsSet "valueSet"
(DhcpValue
<$> getT "value"
)
createDhcpOptions
:: (MonadResource m, MonadBaseControl IO m)
=> [DhcpConfiguration]
-> EC2 m DhcpOptions
createDhcpOptions confs =
ec2Query "CreateDhcpOptions" params $
element "dhcpOptions" dhcpOptionsSink
where
params = ["DhcpConfiguration" |.#. map dhcpConfigurationParams confs]
dhcpConfigurationParams conf =
[ "Key" |= dhcpConfigurationKey conf
, "Value" |.#= map dhcpValueValue (dhcpConfigurationDhcpValueSet conf)
]
deleteDhcpOptions
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteDhcpOptions doid =
ec2Query "DeleteDhcpOptions" params $ getT "return"
where
params = ["DhcpOptionsId" |= doid]
associateDhcpOptions
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> EC2 m Bool
associateDhcpOptions doid vpcid =
ec2Query "AssociateDhcpOptions" params $ getT "return"
where
params =
[ "DhcpOptionsId" |= doid
, "VpcId" |= vpcid
]