module AWS.EC2.VPC
( createVpc
, createVpnGateway
, createCustomerGateway
, createInternetGateway
, deleteVpc
, deleteVpnGateway
, deleteCustomerGateway
, deleteInternetGateway
, describeVpnConnections
, describeVpnGateways
, describeVpcs
, describeCustomerGateway
, describeInternetGateways
, attachInternetGateway
, detachInternetGateway
) where
import Data.Text (Text)
import Data.XML.Types (Event)
import Data.Conduit
import Control.Monad.Trans.Control (MonadBaseControl)
import Control.Applicative
import AWS.EC2.Convert
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 $
getF "return" textToBool
where
params =
[ ValueParam "InternetGatewayId" internetGatewayId
, ValueParam "VpcId" vid ]
detachInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> EC2 m Bool
detachInternetGateway internetGatewayId vid =
ec2Query "DetachInternetGateway" params $
getF "return" textToBool
where
params =
[ ValueParam "InternetGatewayId" internetGatewayId
, ValueParam "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 =
[ ArrayParams "InternetGatewayId" internetGatewayIds
, FilterParams 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"
<*> getF "state" internetGatewayAttachmentState'
describeVpnConnections
:: (MonadBaseControl IO m, MonadResource m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m VpnConnection)
describeVpnConnections ids filters =
ec2QuerySource "DescribeVpnConnections" params vpnConnectionConduit
where
params = [ArrayParams "VpnConnectionId" ids]
++ [FilterParams filters]
vpnConnectionConduit
:: (MonadBaseControl IO m, MonadResource m)
=> GLConduit Event m VpnConnection
vpnConnectionConduit = itemConduit "vpnConnectionSet" $
VpnConnection
<$> do
a <- getT "vpnConnectionId"
traceShow a $ return a
<*> getF "state" vpnConnectionState
<*> getT "customerGatewayConfiguration"
<*> getT "type"
<*> getT "customerGatewayId"
<*> getT "vpnGatewayId"
<*> resourceTagSink
<*> itemsSet "vgwTelemetry"
(VpnTunnelTelemetry
<$> getT "outsideIpAddress"
<*> getF "status" vpnTunnelTelemetryStatus
<*> getF "lastStatusChange" textToTime
<*> getT "statusMessage"
<*> getF "acceptedRouteCount" textToInt
)
<*> elementM "options"
(VpnConnectionOptionsRequest
<$> getF "staticRoutesOnly" textToBool
)
<*> elementM "routes"
(VpnStaticRoute
<$> getT "destinationCidrBlock"
<*> getF "source" vpnStaticRouteSource
<*> getF "state" vpnStaticRouteState
)
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 =
[ ArrayParams "VpcId" vpcIds
, FilterParams filters
]
vpcSink :: MonadThrow m
=> GLSink Event m Vpc
vpcSink = Vpc
<$> getT "vpcId"
<*> getF "state" vpcState'
<*> getT "cidrBlock"
<*> getT "dhcpOptionsId"
<*> resourceTagSink
<*> getT "instanceTenancy"
createVpc
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Maybe Text
-> EC2 m Vpc
createVpc cidrBlock instanceTenancy =
ec2Query "CreateVpc" params $
element "vpc" vpcSink
where
params =
[ ValueParam "CidrBlock" cidrBlock
] ++ maybeParams [ ("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 =
[ ArrayParams "VpnGatewayId" ids
, FilterParams filters
]
vpnGatewaySink :: MonadThrow m
=> GLSink Event m VpnGateway
vpnGatewaySink = VpnGateway
<$> getT "vpnGatewayId"
<*> getF "state" vpnGatewayState'
<*> getT "type"
<*> getMT "availabilityZone"
<*> itemsSet "attachments" attachmentSink
<*> resourceTagSink
attachmentSink :: MonadThrow m
=> GLSink Event m Attachment
attachmentSink = Attachment
<$> getT "vpcId"
<*> getF "state" attachmentState'
createVpnGateway
:: (MonadResource m, MonadBaseControl IO m)
=> CreateVpnGatewayType
-> Maybe Text
-> EC2 m VpnGateway
createVpnGateway _ availabilityZone = do
ec2Query "CreateVpnGateway" params $
element "vpnGateway" vpnGatewaySink
where
params =
[ ValueParam "Type" "ipsec.1"
] ++ maybeParams [ ("AvailabilityZone", availabilityZone) ]
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 =
[ ArrayParams "CustomerGatewayId" ids
, FilterParams filters
]
customerGatewaySink :: MonadThrow m
=> GLSink Event m CustomerGateway
customerGatewaySink = CustomerGateway
<$> getT "customerGatewayId"
<*> getF "state" customerGatewayState'
<*> getT "type"
<*> getT "ipAddress"
<*> getF "bgpAsn" textToInt
<*> resourceTagSink
createCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> Int
-> EC2 m CustomerGateway
createCustomerGateway type' ipAddr bgpAsn = do
ec2Query "CreateCustomerGateway" params $
element "customerGateway" customerGatewaySink
where
params =
[ ValueParam "Type" type'
, ValueParam "IpAddress" ipAddr
, ValueParam "BgpAsn" (toText bgpAsn)
]
deleteCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteCustomerGateway = ec2Delete "DeleteCustomerGateway" "CustomerGatewayId"