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 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 =
[ ValueParam "InternetGatewayId" internetGatewayId
, ValueParam "VpcId" vid ]
detachInternetGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> EC2 m Bool
detachInternetGateway internetGatewayId vid =
ec2Query "DetachInternetGateway" params $ getT "return"
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"
<*> getT "state"
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
<*> 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 =
[ ArrayParams "VpcId" vpcIds
, FilterParams filters
]
vpcSink :: MonadThrow m
=> GLSink Event m Vpc
vpcSink = Vpc
<$> getT "vpcId"
<*> getT "state"
<*> getT "cidrBlock"
<*> getT "dhcpOptionsId"
<*> resourceTagSink
<*> getT "instanceTenancy"
createVpc
:: (MonadResource m, MonadBaseControl IO m)
=> AddrRange IPv4
-> Maybe Text
-> EC2 m Vpc
createVpc cidrBlock instanceTenancy =
ec2Query "CreateVpc" params $
element "vpc" vpcSink
where
params =
[ ValueParam "CidrBlock" $ toText 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"
<*> 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 _ 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"
<*> 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 =
[ ValueParam "Type" type'
, ValueParam "IpAddress" $ toText ipAddr
, ValueParam "BgpAsn" (toText bgpAsn)
]
deleteCustomerGateway
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteCustomerGateway = ec2Delete "DeleteCustomerGateway" "CustomerGatewayId"