aws-sdk 0.8.0.0 → 0.9.0.0
raw patch · 37 files changed
+544/−65 lines, 37 filesdep ~conduitPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: conduit
API changes (from Hackage documentation)
+ AWS.EC2: attachNetworkInterface :: (MonadBaseControl IO m, MonadResource m) => Text -> Text -> Int -> EC2 m Text
+ AWS.EC2: createNetworkInterface :: (MonadBaseControl IO m, MonadResource m) => Text -> SecondaryPrivateIpAddressParam -> Maybe Text -> [Text] -> EC2 m NetworkInterface
+ AWS.EC2: createRoute :: (MonadResource m, MonadBaseControl IO m) => CreateRouteRequest -> EC2 m Bool
+ AWS.EC2: createVpnConnection :: (MonadBaseControl IO m, MonadResource m) => Text -> Text -> Text -> Maybe Text -> Maybe Bool -> EC2 m VpnConnection
+ AWS.EC2: deleteNetworkInterface :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m Bool
+ AWS.EC2: deleteRoute :: (MonadResource m, MonadBaseControl IO m) => Text -> AddrRange IPv4 -> EC2 m Bool
+ AWS.EC2: deleteVpnConnection :: (MonadResource m, MonadBaseControl IO m) => Text -> EC2 m Bool
+ AWS.EC2: describeNetworkInterfaceAttachment :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m (Maybe NetworkInterfaceAttachment)
+ AWS.EC2: describeNetworkInterfaceDescription :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m Text
+ AWS.EC2: describeNetworkInterfaceGroupSet :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m [Group]
+ AWS.EC2: describeNetworkInterfaceSourceDestCheck :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m Bool
+ AWS.EC2: detachNetworkInterface :: (MonadBaseControl IO m, MonadResource m) => Text -> Maybe Bool -> EC2 m Bool
+ AWS.EC2: modifyNetworkInterfaceAttachment :: (MonadBaseControl IO m, MonadResource m) => Text -> Text -> Bool -> EC2 m Bool
+ AWS.EC2: modifyNetworkInterfaceDescription :: (MonadBaseControl IO m, MonadResource m) => Text -> Text -> EC2 m Bool
+ AWS.EC2: modifyNetworkInterfaceSecurityGroup :: (MonadBaseControl IO m, MonadResource m) => Text -> [Text] -> EC2 m Bool
+ AWS.EC2: modifyNetworkInterfaceSourceDestCheck :: (MonadBaseControl IO m, MonadResource m) => Text -> Bool -> EC2 m Bool
+ AWS.EC2: replaceRoute :: (MonadResource m, MonadBaseControl IO m) => CreateRouteRequest -> EC2 m Bool
+ AWS.EC2: resetNetworkInterfaceSourceDestCheck :: (MonadBaseControl IO m, MonadResource m) => Text -> EC2 m Bool
+ AWS.EC2.Types: CreateRouteToGateway :: Text -> AddrRange IPv4 -> Text -> CreateRouteRequest
+ AWS.EC2.Types: CreateRouteToInstance :: Text -> AddrRange IPv4 -> Text -> CreateRouteRequest
+ AWS.EC2.Types: CreateRouteToNetworkInterface :: Text -> AddrRange IPv4 -> Text -> CreateRouteRequest
+ AWS.EC2.Types: NetworkInterfaceStatusPending :: NetworkInterfaceStatus
+ AWS.EC2.Types: createRouteDestinationCidrBlock :: CreateRouteRequest -> AddrRange IPv4
+ AWS.EC2.Types: createRouteGatewayId :: CreateRouteRequest -> Text
+ AWS.EC2.Types: createRouteInstanceId :: CreateRouteRequest -> Text
+ AWS.EC2.Types: createRouteNetworkInterfaceId :: CreateRouteRequest -> Text
+ AWS.EC2.Types: createRouteTableId :: CreateRouteRequest -> Text
+ AWS.EC2.Types: data CreateRouteRequest
+ AWS.EC2.Types: instance Eq CreateRouteRequest
+ AWS.EC2.Types: instance Read CreateRouteRequest
+ AWS.EC2.Types: instance Show CreateRouteRequest
+ AWS.RDS: createDBSnapshot :: (MonadBaseControl IO m, MonadResource m) => Text -> Text -> RDS m DBSnapshot
+ AWS.RDS: deleteDBSnapshot :: (MonadBaseControl IO m, MonadResource m) => Text -> RDS m DBSnapshot
+ AWS.RDS: describeDBSnapshots :: (MonadBaseControl IO m, MonadResource m) => Maybe Text -> Maybe Text -> Maybe Text -> Maybe Int -> Maybe Text -> RDS m [DBSnapshot]
+ AWS.RDS.Types: DBSnapshot :: Int -> Maybe Int -> Text -> Text -> Text -> Text -> Text -> Text -> Text -> Maybe UTCTime -> Maybe Text -> Text -> UTCTime -> Int -> Text -> DBSnapshot
+ AWS.RDS.Types: data DBSnapshot
+ AWS.RDS.Types: dbsAllocatedStorage :: DBSnapshot -> Int
+ AWS.RDS.Types: dbsAvailabilityZone :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsDBInstanceIdentifier :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsDBSnapshotIdentifier :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsEngine :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsEngineVersion :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsInstanceCreateTime :: DBSnapshot -> UTCTime
+ AWS.RDS.Types: dbsIops :: DBSnapshot -> Maybe Int
+ AWS.RDS.Types: dbsLicenseModel :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsMasterUsername :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsPort :: DBSnapshot -> Int
+ AWS.RDS.Types: dbsSnapshotCreateTime :: DBSnapshot -> Maybe UTCTime
+ AWS.RDS.Types: dbsSnapshotType :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsStatus :: DBSnapshot -> Text
+ AWS.RDS.Types: dbsVpcId :: DBSnapshot -> Maybe Text
+ AWS.RDS.Types: instance Eq DBSnapshot
+ AWS.RDS.Types: instance Show DBSnapshot
+ AWS.RDS.Util: wait :: (MonadIO m, Functor m) => (a -> Bool) -> (Text -> RDS m [a]) -> Text -> RDS m a
- AWS.EC2.Types: InstanceNetworkInterface :: Text -> Maybe Text -> Maybe Text -> Maybe Text -> Text -> Text -> Maybe Text -> IPv4 -> Maybe Text -> Bool -> [Group] -> InstanceNetworkInterfaceAttachment -> Maybe InstanceNetworkInterfaceAssociation -> [InstancePrivateIpAddress] -> InstanceNetworkInterface
+ AWS.EC2.Types: InstanceNetworkInterface :: Text -> Maybe Text -> Maybe Text -> Maybe Text -> Text -> Text -> Maybe Text -> Maybe IPv4 -> Maybe Text -> Maybe Bool -> [Group] -> InstanceNetworkInterfaceAttachment -> Maybe InstanceNetworkInterfaceAssociation -> [InstancePrivateIpAddress] -> InstanceNetworkInterface
- AWS.EC2.Types: VpnConnection :: Text -> VpnConnectionState -> Text -> Text -> Text -> Text -> [ResourceTag] -> [VpnTunnelTelemetry] -> Maybe VpnConnectionOptionsRequest -> Maybe VpnStaticRoute -> VpnConnection
+ AWS.EC2.Types: VpnConnection :: Text -> VpnConnectionState -> Maybe Text -> Maybe Text -> Text -> Text -> [ResourceTag] -> [VpnTunnelTelemetry] -> Maybe VpnConnectionOptionsRequest -> Maybe VpnStaticRoute -> VpnConnection
- AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddress :: InstanceNetworkInterface -> IPv4
+ AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddress :: InstanceNetworkInterface -> Maybe IPv4
- AWS.EC2.Types: instanceNetworkInterfaceSourceDestCheck :: InstanceNetworkInterface -> Bool
+ AWS.EC2.Types: instanceNetworkInterfaceSourceDestCheck :: InstanceNetworkInterface -> Maybe Bool
- AWS.EC2.Types: vpnConnectionCustomerGatewayConfiguration :: VpnConnection -> Text
+ AWS.EC2.Types: vpnConnectionCustomerGatewayConfiguration :: VpnConnection -> Maybe Text
- AWS.EC2.Types: vpnConnectionType :: VpnConnection -> Text
+ AWS.EC2.Types: vpnConnectionType :: VpnConnection -> Maybe Text
Files
- AWS/CloudWatch.hs +0/−1
- AWS/CloudWatch/Internal.hs +0/−1
- AWS/CloudWatch/Metric.hs +0/−1
- AWS/EC2.hs +4/−1
- AWS/EC2/Acl.hs +0/−1
- AWS/EC2/Address.hs +0/−1
- AWS/EC2/AvailabilityZone.hs +0/−1
- AWS/EC2/Image.hs +0/−1
- AWS/EC2/Instance.hs +0/−1
- AWS/EC2/Internal.hs +14/−0
- AWS/EC2/KeyPair.hs +0/−1
- AWS/EC2/NetworkInterface.hs +68/−10
- AWS/EC2/NetworkInterfaceAttribute.hs +130/−0
- AWS/EC2/Query.hs +1/−9
- AWS/EC2/Region.hs +0/−1
- AWS/EC2/Route.hs +68/−0
- AWS/EC2/RouteTable.hs +0/−1
- AWS/EC2/SecurityGroup.hs +0/−1
- AWS/EC2/Snapshot.hs +0/−1
- AWS/EC2/Subnets.hs +0/−1
- AWS/EC2/Tag.hs +0/−1
- AWS/EC2/Types.hs +25/−5
- AWS/EC2/Util.hs +0/−1
- AWS/EC2/VPC.hs +46/−13
- AWS/EC2/Volume.hs +0/−1
- AWS/ELB.hs +0/−1
- AWS/ELB/Internal.hs +0/−1
- AWS/ELB/LoadBalancer.hs +0/−1
- AWS/Lib/Query.hs +12/−1
- AWS/RDS.hs +3/−1
- AWS/RDS/DBInstance.hs +0/−1
- AWS/RDS/DBSnapshot.hs +87/−0
- AWS/RDS/Internal.hs +25/−2
- AWS/RDS/Types.hs +19/−0
- AWS/RDS/Util.hs +28/−0
- Tests/Main.hs +8/−0
- aws-sdk.cabal +6/−2
AWS/CloudWatch.hs view
@@ -12,7 +12,6 @@ import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Monad.IO.Class (MonadIO) import qualified Control.Monad.State as State import qualified Network.HTTP.Conduit as HTTP
AWS/CloudWatch/Internal.hs view
@@ -6,7 +6,6 @@ import Data.ByteString (ByteString) import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Data.Monoid ((<>)) import Data.XML.Types (Event(..))
AWS/CloudWatch/Metric.hs view
@@ -8,7 +8,6 @@ import Data.Text (Text) import Data.Time (UTCTime) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.Util
AWS/EC2.hs view
@@ -23,6 +23,7 @@ , module AWS.EC2.SecurityGroup -- * NetworkInterface , module AWS.EC2.NetworkInterface+ , module AWS.EC2.NetworkInterfaceAttribute -- * Placements , module AWS.EC2.Region , module AWS.EC2.AvailabilityZone@@ -33,10 +34,10 @@ , module AWS.EC2.Subnets , module AWS.EC2.Acl , module AWS.EC2.RouteTable+ , module AWS.EC2.Route ) where import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import qualified Control.Monad.State as State import Data.Text (Text) import Data.ByteString (ByteString)@@ -60,8 +61,10 @@ import AWS.EC2.VPC import AWS.EC2.Subnets import AWS.EC2.Acl+import AWS.EC2.Route import AWS.EC2.RouteTable import AWS.EC2.NetworkInterface+import AWS.EC2.NetworkInterfaceAttribute -- | set endpoint to EC2 context by giving the EC2 region. setRegion
AWS/EC2/Acl.hs view
@@ -13,7 +13,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Address.hs view
@@ -14,7 +14,6 @@ import Data.IP (IPv4) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/AvailabilityZone.hs view
@@ -8,7 +8,6 @@ import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Image.hs view
@@ -12,7 +12,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import Control.Monad (join)
AWS/EC2/Instance.hs view
@@ -19,7 +19,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import Data.Maybe (fromMaybe, fromJust) import qualified Data.Map as Map
AWS/EC2/Internal.hs view
@@ -13,6 +13,7 @@ , stateReasonSink , volumeTypeSink , groupSetSink+ , networkInterfaceAttachmentSink ) where import Control.Monad.IO.Class (MonadIO)@@ -89,3 +90,16 @@ groupSetSink = itemsSet "groupSet" $ Group <$> getT "groupId" <*> getT "groupName"++networkInterfaceAttachmentSink+ :: MonadThrow m+ => GLSink Event m (Maybe NetworkInterfaceAttachment)+networkInterfaceAttachmentSink = elementM "attachment" $+ NetworkInterfaceAttachment+ <$> getT "attachmentId"+ <*> getT "instanceId"+ <*> getT "instanceOwnerId"+ <*> getT "deviceIndex"+ <*> getT "status"+ <*> getT "attachTime"+ <*> getT "deleteOnTermination"
AWS/EC2/KeyPair.hs view
@@ -11,7 +11,6 @@ import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/NetworkInterface.hs view
@@ -4,13 +4,16 @@ ( assignPrivateIpAddresses , unassignPrivateIpAddresses , describeNetworkInterfaces+ , createNetworkInterface+ , deleteNetworkInterface+ , attachNetworkInterface+ , detachNetworkInterface ) where import Data.IP (IPv4) import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal@@ -82,15 +85,7 @@ <*> getT "privateDnsName" <*> getT "sourceDestCheck" <*> groupSetSink- <*> elementM "attachment" (NetworkInterfaceAttachment- <$> getT "attachmentId"- <*> getT "instanceId"- <*> getT "instanceOwnerId"- <*> getT "deviceIndex"- <*> getT "status"- <*> getT "attachTime"- <*> getT "deleteOnTermination"- )+ <*> networkInterfaceAttachmentSink <*> networkInterfaceAssociationSink <*> resourceTagSink <*> itemsSet "privateIpAddressesSet" (@@ -112,3 +107,66 @@ <*> getT "publicDnsName" <*> getT "ipOwnerId" <*> getT "associationId"++createNetworkInterface+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the subnet to associate with the network interface.+ -> SecondaryPrivateIpAddressParam -- ^ The private IP address of the specified network interface.+ -> Maybe Text -- ^ The description of the network interface.+ -> [Text] -- ^ A list of security group IDs for use by the network interface.+ -> EC2 m NetworkInterface+createNetworkInterface subnet privateAddresses description securityGroupIds =+ ec2Query "CreateNetworkInterface" params $ element "networkInterface" networkInterfaceSink+ where+ params :: [QueryParam]+ params =+ [ "SubnetId" |= subnet+ , "Description" |=? description+ , "SecurityGroup" |.#= securityGroupIds+ ] ++ fromSecondary privateAddresses++ fromSecondary :: SecondaryPrivateIpAddressParam -> [QueryParam]+ fromSecondary SecondaryPrivateIpAddressParamNothing = []+ fromSecondary (SecondaryPrivateIpAddressParamCount n) = ["SecondaryPrivateIpAddressCount" |= toText n]+ fromSecondary (SecondaryPrivateIpAddressParamSpecified addrs primary) =+ [ "PrivateIpAddresses" |.#. map (\addr -> ["PrivateIpAddress" |= toText addr]) addrs+ , maybeParam $ primaryParam <$> primary+ ]++ primaryParam :: Int -> QueryParam+ primaryParam n = "PrivateIpAddresses" |.+ toText n |.+ "Primary" |= "true"++deleteNetworkInterface+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m Bool+deleteNetworkInterface networkInterface =+ ec2Query "DeleteNetworkInterface" ["NetworkInterfaceId" |= networkInterface] $ getT "return"++attachNetworkInterface+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface to attach.+ -> Text -- ^ The ID of the instance to attach to the network interface.+ -> Int -- ^ The index of the device for the network interface attachment.+ -> EC2 m Text -- ^ The ID of the attachment.+attachNetworkInterface networkInterface inst deviceIdx =+ ec2Query "AttachNetworkInterface" params $ getT "attachmentId"+ where+ params =+ [ "NetworkInterfaceId" |= networkInterface+ , "InstanceId" |= inst+ , "DeviceIndex" |= toText deviceIdx+ ]++detachNetworkInterface+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the attachment.+ -> Maybe Bool -- ^ Set to true to force a detachment.+ -> EC2 m Bool+detachNetworkInterface attachment force =+ ec2Query "DetachNetworkInterface" params $ getT "return"+ where+ params =+ [ "AttachmentId" |= attachment+ , "Force" |=? toText <$> force+ ]
+ AWS/EC2/NetworkInterfaceAttribute.hs view
@@ -0,0 +1,130 @@+{-# LANGUAGE FlexibleContexts, Rank2Types #-}+module AWS.EC2.NetworkInterfaceAttribute+ ( describeNetworkInterfaceDescription+ , describeNetworkInterfaceGroupSet+ , describeNetworkInterfaceSourceDestCheck+ , describeNetworkInterfaceAttachment+ , modifyNetworkInterfaceDescription+ , modifyNetworkInterfaceSecurityGroup+ , modifyNetworkInterfaceSourceDestCheck+ , modifyNetworkInterfaceAttachment+ , resetNetworkInterfaceSourceDestCheck+ ) where++import Data.Text (Text)+import Data.Conduit (GLSink, MonadBaseControl, MonadResource)+import Data.XML.Types (Event)++import AWS.EC2.Internal (EC2, groupSetSink, networkInterfaceAttachmentSink)+import AWS.EC2.Query+import AWS.EC2.Types (Group, NetworkInterfaceAttachment(..))+import AWS.Lib.Parser (element, getT, getT_)+import AWS.Util (toText)++describeNetworkInterfaceDescription+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m Text+describeNetworkInterfaceDescription = describeNetworkInterfaceAttribute "description" $+ element "description" $ getT "value"++describeNetworkInterfaceGroupSet+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m [Group]+describeNetworkInterfaceGroupSet = describeNetworkInterfaceAttribute "groupSet" groupSetSink++describeNetworkInterfaceSourceDestCheck+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m Bool+describeNetworkInterfaceSourceDestCheck = describeNetworkInterfaceAttribute "sourceDestCheck" $+ element "sourceDestCheck" $ getT "value"++describeNetworkInterfaceAttachment+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m (Maybe NetworkInterfaceAttachment)+describeNetworkInterfaceAttachment = describeNetworkInterfaceAttribute "attachment" networkInterfaceAttachmentSink++describeNetworkInterfaceAttribute+ :: (MonadBaseControl IO m, MonadResource m)+ => Text+ -> GLSink Event m a+ -> Text+ -> EC2 m a+describeNetworkInterfaceAttribute action sink networkInterface =+ ec2Query "DescribeNetworkInterfaceAttribute" params $+ getT_ "networkInterfaceId" >> sink+ where+ params =+ [ "NetworkInterfaceId" |= networkInterface+ , "Attribute" |= action+ ]++modifyNetworkInterfaceDescription+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> Text -- ^ The description of the network interface.+ -> EC2 m Bool+modifyNetworkInterfaceDescription iface desc =+ modifyNetworkInterfaceAttribute iface ["Description.Value" |= desc]++modifyNetworkInterfaceSecurityGroup+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> [Text] -- ^ The security group ids that a network interface is in.+ -> EC2 m Bool+modifyNetworkInterfaceSecurityGroup iface groups =+ modifyNetworkInterfaceAttribute iface ["SecurityGroupId" |.#= groups]++modifyNetworkInterfaceSourceDestCheck+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> Bool -- ^ Enables a Network Address Translation (NAT) instance in a VPC to perform NAT.+ -> EC2 m Bool+modifyNetworkInterfaceSourceDestCheck iface check =+ modifyNetworkInterfaceAttribute iface ["SourceDestCheck.Value" |= toText check]++modifyNetworkInterfaceAttachment+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> Text -- ^ The ID of the interface attachment.+ -> Bool -- ^ Specifies whether to delete the attachment when terminating the instance.+ -> EC2 m Bool+modifyNetworkInterfaceAttachment iface attachment deleteOnTermination =+ modifyNetworkInterfaceAttribute iface params+ where+ params =+ [ "Attachment.AttachmentId" |= attachment+ , "Attachment.DeleteOnTermination" |= toText deleteOnTermination+ ]++modifyNetworkInterfaceAttribute+ :: (MonadBaseControl IO m, MonadResource m)+ => Text+ -> [QueryParam]+ -> EC2 m Bool+modifyNetworkInterfaceAttribute iface params =+ ec2Query "ModifyNetworkInterfaceAttribute" params' $ getT "return"+ where+ params' = ("NetworkInterfaceId" |= iface) : params++resetNetworkInterfaceSourceDestCheck+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ The ID of the network interface.+ -> EC2 m Bool+resetNetworkInterfaceSourceDestCheck = resetNetworkInterfaceAttribute "sourceDestCheck"++resetNetworkInterfaceAttribute+ :: (MonadBaseControl IO m, MonadResource m)+ => Text+ -> Text+ -> EC2 m Bool+resetNetworkInterfaceAttribute attrName iface =+ ec2Query "ResetNetworkInterfaceAttribute" params $ getT "return"+ where+ params =+ [ "NetworkInterfaceId" |= iface+ , "Attribute" |= attrName+ ]
AWS/EC2/Query.hs view
@@ -18,7 +18,6 @@ import Data.XML.Types (Event(..)) import Data.Conduit import qualified Data.Conduit.List as CL-import Control.Monad.Trans.Control (MonadBaseControl) import qualified Text.XML.Stream.Parse as XmlP import Control.Monad.Trans.Class (lift) import Control.Monad.IO.Class (MonadIO)@@ -114,14 +113,7 @@ => ByteString -> [QueryParam] -> EC2 m a-ec2QueryDebug action params = do- cred <- Reader.ask- ctx <- State.get- lift $ do- liftIO $ mapM_ print params- response <- requestQuery cred ctx action params apiVersion sinkError- (res, _) <- unwrapResumable response- res $$ CB.sinkFile "debug.txt" >>= fail "debug"+ec2QueryDebug = debugQuery apiVersion #endif ec2Delete
AWS/EC2/Region.hs view
@@ -8,7 +8,6 @@ import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
+ AWS/EC2/Route.hs view
@@ -0,0 +1,68 @@+{-# LANGUAGE FlexibleContexts, RecordWildCards #-}+module AWS.EC2.Route+ ( createRoute+ , deleteRoute+ , replaceRoute+ ) where++import Data.ByteString (ByteString)+import Data.Conduit (MonadBaseControl, MonadResource)+import Data.IP (AddrRange, IPv4)+import Data.Text (Text)++import AWS.EC2.Internal (EC2)+import AWS.EC2.Query (ec2Query, (|=))+import AWS.EC2.Types (CreateRouteRequest(..))+import AWS.Lib.Parser (getT)+import AWS.Util (toText)++createRoute+ :: (MonadResource m, MonadBaseControl IO m)+ => CreateRouteRequest+ -> EC2 m Bool+createRoute = routeRequest "CreateRoute"++deleteRoute+ :: (MonadResource m, MonadBaseControl IO m)+ => Text -- ^ The ID of the route table.+ -> AddrRange IPv4 -- ^ The CIDR range of the destination for the route to delete.+ -> EC2 m Bool+deleteRoute tableId cidrBlock =+ ec2Query "DeleteRoute"+ [ "RouteTableId" |= tableId+ , "DestinationCidrBlock" |= toText cidrBlock+ ] $ getT "return"++replaceRoute+ :: (MonadResource m, MonadBaseControl IO m)+ => CreateRouteRequest+ -> EC2 m Bool+replaceRoute = routeRequest "ReplaceRoute"++routeRequest+ :: (MonadResource m, MonadBaseControl IO m)+ => ByteString+ -> CreateRouteRequest+ -> EC2 m Bool+routeRequest action (CreateRouteToGateway{..}) =+ routeRequest' action createRouteTableId createRouteDestinationCidrBlock "GatewayId" createRouteGatewayId+routeRequest action (CreateRouteToInstance{..}) =+ routeRequest' action createRouteTableId createRouteDestinationCidrBlock "InstanceId" createRouteInstanceId+routeRequest action (CreateRouteToNetworkInterface{..}) =+ routeRequest' action createRouteTableId createRouteDestinationCidrBlock "NetworkInterfaceId" createRouteNetworkInterfaceId++routeRequest'+ :: (MonadResource m, MonadBaseControl IO m)+ => ByteString+ -> Text+ -> AddrRange IPv4+ -> Text+ -> Text+ -> EC2 m Bool+routeRequest' action tableId cidrBlock targetName targetId =+ ec2Query action+ [ "RouteTableId" |= tableId+ , "DestinationCidrBlock" |= toText cidrBlock+ , targetName |= targetId+ ] $ getT "return"+
AWS/EC2/RouteTable.hs view
@@ -12,7 +12,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/SecurityGroup.hs view
@@ -15,7 +15,6 @@ import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Snapshot.hs view
@@ -13,7 +13,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Subnets.hs view
@@ -9,7 +9,6 @@ import Data.Text (Text) import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Tag.hs view
@@ -8,7 +8,6 @@ import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/EC2/Types.hs view
@@ -16,6 +16,7 @@ , BlockDeviceMapping(..) , BlockDeviceMappingParam(..) , ConsoleOutput(..)+ , CreateRouteRequest(..) , CreateSubnetRequest(..) , CreateVolumePermission(..) , CreateVolumePermissionItem(..)@@ -456,9 +457,9 @@ , instanceNetworkInterfaceOwnerId :: Text , instanceNetworkInterfaceStatus :: Text , instanceNetworkInterfaceMacAddress :: Maybe Text- , instanceNetworkInterfacePrivateIpAddress :: IPv4+ , instanceNetworkInterfacePrivateIpAddress :: Maybe IPv4 , instanceNetworkInterfacePrivateDnsName :: Maybe Text- , instanceNetworkInterfaceSourceDestCheck :: Bool+ , instanceNetworkInterfaceSourceDestCheck :: Maybe Bool , instanceNetworkInterfaceGroupSet :: [Group] , instanceNetworkInterfaceAttachment :: InstanceNetworkInterfaceAttachment@@ -755,8 +756,8 @@ data VpnConnection = VpnConnection { vpnConnectionId :: Text , vpnConnectionState :: VpnConnectionState- , vpnConnectionCustomerGatewayConfiguration :: Text- , vpnConnectionType :: Text+ , vpnConnectionCustomerGatewayConfiguration :: Maybe Text+ , vpnConnectionType :: Maybe Text , vpnConnectionCustomerGatewayId :: Text , vpnConnectionVpnGatewayId :: Text , vpnConnectionTagSet :: [ResourceTag]@@ -1107,6 +1108,24 @@ } deriving (Show, Read, Eq) +data CreateRouteRequest+ = CreateRouteToGateway+ { createRouteTableId :: Text+ , createRouteDestinationCidrBlock :: AddrRange IPv4+ , createRouteGatewayId :: Text+ }+ | CreateRouteToInstance+ { createRouteTableId :: Text+ , createRouteDestinationCidrBlock :: AddrRange IPv4+ , createRouteInstanceId :: Text+ }+ | CreateRouteToNetworkInterface+ { createRouteTableId :: Text+ , createRouteDestinationCidrBlock :: AddrRange IPv4+ , createRouteNetworkInterfaceId :: Text+ }+ deriving (Show, Read, Eq)+ type PropagatingVgw = Text data Vpc = Vpc@@ -1241,6 +1260,7 @@ data NetworkInterfaceStatus = NetworkInterfaceStatusAvailable | NetworkInterfaceStatusInUse+ | NetworkInterfaceStatusPending deriving (Show, Read, Eq) data NetworkInterfaceAttachment = NetworkInterfaceAttachment@@ -1356,4 +1376,4 @@ ["pending", "available", "deleting", "deleted"] deriveFromText "InternetGatewayAttachmentState" ["attaching", "attached", "detaching", "detached", "available"]-deriveFromText "NetworkInterfaceStatus" ["available", "in-use"]+deriveFromText "NetworkInterfaceStatus" ["available", "in-use", "pending"]
AWS/EC2/Util.hs view
@@ -25,7 +25,6 @@ import Control.Parallel (par) import Data.List (find) import qualified Control.Exception.Lifted as E-import Control.Monad.Trans.Control (MonadBaseControl) import AWS.EC2.Internal import AWS.EC2.Types (ResourceTag(resourceTagKey))
AWS/EC2/VPC.hs view
@@ -4,11 +4,13 @@ ( associateDhcpOptions , attachInternetGateway , createVpc+ , createVpnConnection , createVpnGateway , createCustomerGateway , createInternetGateway , createDhcpOptions , deleteVpc+ , deleteVpnConnection , deleteVpnGateway , deleteCustomerGateway , deleteInternetGateway@@ -26,7 +28,6 @@ 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@@ -35,8 +36,6 @@ import AWS.Lib.Parser import AWS.Util -import Debug.Trace- ------------------------------------------------------------ -- attachInternetGateway ------------------------------------------------------------@@ -115,27 +114,29 @@ internetGatewayAttachmentSink = InternetGatewayAttachment <$> getT "vpcId" <*> getT "state"++------------------------------------------------------------+-- describeVpnConnections+------------------------------------------------------------ describeVpnConnections :: (MonadBaseControl IO m, MonadResource m) => [Text] -- ^ VpnConnectionIds- -> [Filter]+ -> [Filter] -- ^ Filters -> EC2 m (ResumableSource m VpnConnection) describeVpnConnections ids filters =- ec2QuerySource "DescribeVpnConnections" params vpnConnectionConduit+ ec2QuerySource "DescribeVpnConnections" params $+ itemConduit "vpnConnectionSet" vpnConnectionSink 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+vpnConnectionSink+ :: MonadThrow m+ => GLSink Event m VpnConnection+vpnConnectionSink = VpnConnection+ <$> getT "vpnConnectionId" <*> getT "state" <*> getT "customerGatewayConfiguration" <*> getT "type"@@ -160,6 +161,38 @@ <*> getT "source" <*> getT "state" )++------------------------------------------------------------+-- createVpnConnection+------------------------------------------------------------+createVpnConnection+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ Type. The valid value is ipsec.1+ -> Text -- ^ CustomerGatewayId+ -> Text -- ^ VpnGatewayId+ -> Maybe Text -- ^ AvailabilityZone+ -> Maybe Bool -- ^ Option+ -> EC2 m VpnConnection+createVpnConnection type' cgid vgid zone option =+ ec2Query "CreateVpnConnection" params $+ element "vpnConnection" vpnConnectionSink+ where+ params =+ [ "Type" |= type'+ , "CustomerGatewayId" |= cgid+ , "VpnGatewayId" |= vgid+ , "AvailabilityZone" |=? zone+ , "Options" |.+ "StaticRoutesOnly" |=? boolToText <$> option+ ]++------------------------------------------------------------+-- deleteVpnConnection+------------------------------------------------------------+deleteVpnConnection+ :: (MonadResource m, MonadBaseControl IO m)+ => Text -- ^ VpnConnectionId+ -> EC2 m Bool+deleteVpnConnection = ec2Delete "DeleteVpnConnection" "VpnConnectionId" ------------------------------------------------------------ -- describeVpcs
AWS/EC2/Volume.hs view
@@ -15,7 +15,6 @@ import Data.XML.Types (Event) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative import AWS.EC2.Internal
AWS/ELB.hs view
@@ -11,7 +11,6 @@ import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Monad.IO.Class (MonadIO) import qualified Control.Monad.State as State import qualified Network.HTTP.Conduit as HTTP
AWS/ELB/Internal.hs view
@@ -5,7 +5,6 @@ import Data.ByteString (ByteString) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Data.XML.Types (Event(..)) import AWS.Class
AWS/ELB/LoadBalancer.hs view
@@ -7,7 +7,6 @@ import Data.Text (Text) import Data.Conduit import Control.Applicative-import Control.Monad.Trans.Control (MonadBaseControl) import Data.XML.Types (Event(..)) import AWS.Lib.Parser
AWS/Lib/Query.hs view
@@ -3,6 +3,7 @@ module AWS.Lib.Query ( QueryParam , Filter+ , showUnitParams , (|.+) , putNumberV, putNumberP , filtersParam@@ -30,7 +31,6 @@ import Data.Monoid import Data.XML.Types (Event(..)) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import qualified Network.HTTP.Conduit as HTTP import qualified Text.XML.Stream.Parse as XmlP import Data.Time (UTCTime, formatTime, getCurrentTime)@@ -59,6 +59,17 @@ data QueryParam = Leaf Text Text | Inner Text [QueryParam]++instance Show QueryParam where+ show = show . paramToText++paramToText :: QueryParam -> Text+paramToText (Leaf k v) = k <> "=" <> v+paramToText p@(Inner _ _) =+ T.intercalate "&" . map paramToText $ partition p++showUnitParams :: [QueryParam] -> [String]+showUnitParams = map show . concat . map partition infixr 3 |.+ (|.+) :: Text -> QueryParam -> QueryParam
AWS/RDS.hs view
@@ -7,11 +7,12 @@ , setRegion -- * DBInstance , module AWS.RDS.DBInstance+ -- * DBSnapshot+ , module AWS.RDS.DBSnapshot ) where import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Control.Monad.IO.Class (MonadIO) import qualified Control.Monad.State as State import qualified Network.HTTP.Conduit as HTTP@@ -23,6 +24,7 @@ import AWS import AWS.RDS.Internal import AWS.RDS.DBInstance+import AWS.RDS.DBSnapshot initialRDSContext :: HTTP.Manager -> AWSContext initialRDSContext mgr = AWSContext
AWS/RDS/DBInstance.hs view
@@ -7,7 +7,6 @@ import Data.Text (Text) import Data.Conduit import Control.Applicative-import Control.Monad.Trans.Control (MonadBaseControl) import Data.XML.Types (Event(..)) import Data.Maybe (catMaybes)
+ AWS/RDS/DBSnapshot.hs view
@@ -0,0 +1,87 @@+{-# LANGUAGE FlexibleContexts, RankNTypes #-}++module AWS.RDS.DBSnapshot+ ( describeDBSnapshots+ , createDBSnapshot+ , deleteDBSnapshot+ ) where++import Data.Text (Text)+import Data.Conduit+import Control.Applicative+import Data.XML.Types (Event(..))++import AWS.Util+import AWS.Lib.Query+import AWS.Lib.Parser++import AWS.RDS.Types+import AWS.RDS.Internal++describeDBSnapshots+ :: (MonadBaseControl IO m, MonadResource m)+ => Maybe Text -- ^ DBInstanceIdentifier+ -> Maybe Text -- ^ DBSnapshotIdentifier+ -> Maybe Text -- ^ Marker+ -> Maybe Int -- ^ MaxRecords+ -> Maybe Text -- ^ SnapshotType+ -> RDS m [DBSnapshot]+describeDBSnapshots dbiid dbsid marker maxRecords sType =+ rdsQuery "DescribeDBSnapshots" params sinkDBSnapshots+ where+ params =+ [ "DBInstanceIdentifier" |=? dbiid+ , "DBSnapshotIdentifier" |=? dbsid+ , "Marker" |=? marker+ , "MaxRecords" |=? toText <$> maxRecords+ , "SnapshotType" |=? sType+ ]++sinkDBSnapshots+ :: MonadThrow m+ => GLSink Event m [DBSnapshot]+sinkDBSnapshots = elements "DBSnapshot" sinkDBSnapshot++sinkDBSnapshot+ :: MonadThrow m+ => GLSink Event m DBSnapshot+sinkDBSnapshot = DBSnapshot+ <$> getT "Port"+ <*> getT "Iops"+ <*> getT "Engine"+ <*> getT "Status"+ <*> getT "SnapshotType"+ <*> getT "LicenseModel"+ <*> getT "DBInstanceIdentifier"+ <*> getT "EngineVersion"+ <*> getT "DBSnapshotIdentifier"+ <*> getT "SnapshotCreateTime"+ <*> getT "VpcId"+ <*> getT "AvailabilityZone"+ <*> getT "InstanceCreateTime"+ <*> getT "AllocatedStorage"+ <*> getT "MasterUsername"++createDBSnapshot+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ DBInstanceIdentifier+ -> Text -- ^ DBSnapshotIdentifier+ -> RDS m DBSnapshot+createDBSnapshot dbiid dbsid =+ rdsQuery "CreateDBSnapshot" params $+ element "DBSnapshot" sinkDBSnapshot+ where+ params =+ [ "DBInstanceIdentifier" |= dbiid+ , "DBSnapshotIdentifier" |= dbsid+ ]++deleteDBSnapshot+ :: (MonadBaseControl IO m, MonadResource m)+ => Text -- ^ DBSnapshotIdentifier+ -> RDS m DBSnapshot+deleteDBSnapshot dbsid =+ rdsQuery "DeleteDBSnapshot" params $+ element "DBSnapshot" sinkDBSnapshot+ where+ params = ["DBSnapshotIdentifier" |= dbsid]
AWS/RDS/Internal.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE FlexibleContexts, RankNTypes #-}+{-# LANGUAGE FlexibleContexts, RankNTypes, CPP #-} module AWS.RDS.Internal where@@ -6,7 +6,6 @@ import Data.ByteString (ByteString) import Data.Text (Text) import Data.Conduit-import Control.Monad.Trans.Control (MonadBaseControl) import Data.Monoid ((<>)) import Data.XML.Types (Event(..)) @@ -14,6 +13,14 @@ import AWS.Lib.Query import AWS.Lib.Parser +#ifdef DEBUG+import Control.Monad.IO.Class (liftIO)+import qualified Control.Monad.Reader as Reader+import qualified Control.Monad.State as State+import Control.Monad.Trans.Class (lift)+import qualified Data.Conduit.Binary as CB+#endif+ apiVersion :: ByteString apiVersion = "2012-09-17" @@ -32,3 +39,19 @@ -> GLSink Event m a -> GLSink Event m [a] elements name f = element (name <> "s") $ listConsumer name f++#ifdef DEBUG+rdsQueryDebug+ :: (MonadResource m, MonadBaseControl IO m)+ => ByteString+ -> [QueryParam]+ -> RDS m a+rdsQueryDebug action params = do+ cred <- Reader.ask+ ctx <- State.get+ lift $ do+ liftIO $ mapM_ putStrLn $ showUnitParams params+ response <- requestQuery cred ctx action params apiVersion sinkError+ (res, _) <- unwrapResumable response+ res $$ CB.sinkFile "debug.txt" >>= fail "debug"+#endif
AWS/RDS/Types.hs view
@@ -91,3 +91,22 @@ | PMVMultiAZ Bool | PMVPort Int deriving (Show, Eq)++data DBSnapshot = DBSnapshot+ { dbsPort :: Int+ , dbsIops :: Maybe Int+ , dbsEngine :: Text+ , dbsStatus :: Text+ , dbsSnapshotType :: Text+ , dbsLicenseModel :: Text+ , dbsDBInstanceIdentifier :: Text+ , dbsEngineVersion :: Text+ , dbsDBSnapshotIdentifier :: Text+ , dbsSnapshotCreateTime :: Maybe UTCTime+ , dbsVpcId :: Maybe Text+ , dbsAvailabilityZone :: Text+ , dbsInstanceCreateTime :: UTCTime+ , dbsAllocatedStorage :: Int+ , dbsMasterUsername :: Text+ }+ deriving (Show, Eq)
+ AWS/RDS/Util.hs view
@@ -0,0 +1,28 @@+module AWS.RDS.Util+ ( wait+ ) where++import Control.Applicative ((<$>))+import qualified Control.Concurrent as CC+import Control.Monad.IO.Class (liftIO, MonadIO)+import Data.Text (Text)+import qualified Data.Text as T+import Safe++import AWS.RDS++wait+ :: (MonadIO m, Functor m)+ => (a -> Bool) -- ^ condition+ -> (Text -> RDS m [a]) -- ^ DescribeResources+ -> Text -- ^ Resource Id+ -> RDS m a+wait f g rid = do+ mr <- headMay <$> g rid+ case mr of+ Nothing -> fail $ "Resource not found: " ++ T.unpack rid+ Just r -> if f r+ then return r+ else do+ liftIO $ CC.threadDelay 10000000+ wait f g rid
Tests/Main.hs view
@@ -5,9 +5,11 @@ module Main where import AWSTests.EC2Tests+import AWSTests.RDSTests main :: IO () main = do+ -- EC2 Tests runInstanceTests runVpcTests runAddressTests@@ -16,6 +18,7 @@ runSubnetsTests runVolumeTests runSecurityGroupTests+ runRouteTests runRouteTableTests runRegionTests runInstanceTests@@ -23,3 +26,8 @@ runTagTests runKeyPairTests runNetworkInterfaceTests+ runNetworkInterfaceAttributeTests++ -- RDS Tests+ runDBInstanceTests+ runDBSnapshotTests
aws-sdk.cabal view
@@ -1,5 +1,5 @@ name: aws-sdk-version: 0.8.0.0+version: 0.9.0.0 synopsis: AWS SDK for Haskell description: AWS (Amazon Web Services) sdk for Haskell. .@@ -26,6 +26,7 @@ , AWS.EC2.Metadata , AWS.RDS , AWS.RDS.Types+ , AWS.RDS.Util , AWS.ELB , AWS.ELB.Types , AWS.CloudWatch@@ -39,6 +40,7 @@ , AWS.EC2.Instance , AWS.EC2.Volume , AWS.EC2.KeyPair+ , AWS.EC2.Route , AWS.EC2.RouteTable , AWS.EC2.Snapshot , AWS.EC2.SecurityGroup@@ -48,6 +50,7 @@ , AWS.EC2.VPC , AWS.EC2.Acl , AWS.EC2.NetworkInterface+ , AWS.EC2.NetworkInterfaceAttribute , AWS.EC2.Tag , AWS.EC2.Params , AWS.Lib.FromText@@ -55,6 +58,7 @@ , AWS.Lib.Query , AWS.RDS.Internal , AWS.RDS.DBInstance+ , AWS.RDS.DBSnapshot , AWS.ELB.Internal , AWS.ELB.LoadBalancer , AWS.CloudWatch.Internal@@ -68,7 +72,7 @@ , base64-bytestring >= 1.0.0.0 , bytestring , http-types- , conduit >= 0.5.2+ , conduit >= 0.5.3 , transformers , time , old-locale