packages feed

aws-sdk 0.7.0.0 → 0.7.1.0

raw patch · 34 files changed

+967/−749 lines, 34 filesdep +iproutePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: iproute

API changes (from Hackage documentation)

- AWS.EC2.Types: IpRange :: Text -> IpRange
- AWS.EC2.Types: NetworkInterfaceParam :: Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> [Text] -> [Text] -> Maybe Bool -> NetworkInterfaceParam
- AWS.EC2.Types: data IpRange
- AWS.EC2.Types: instance Eq IpRange
- AWS.EC2.Types: instance Show IpRange
- AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddressSet :: InstanceNetworkInterface -> [InstancePrivateIpAddress]
- AWS.EC2.Types: ipRangeCidrIp :: IpRange -> Text
- AWS.EC2.Types: networkInterfaceParamDeleteOnTermination :: NetworkInterfaceParam -> Maybe Bool
- AWS.EC2.Types: networkInterfaceParamDescription :: NetworkInterfaceParam -> Maybe Text
- AWS.EC2.Types: networkInterfaceParamDeviceIndex :: NetworkInterfaceParam -> Maybe Text
- AWS.EC2.Types: networkInterfaceParamInterfaceId :: NetworkInterfaceParam -> Maybe Text
- AWS.EC2.Types: networkInterfaceParamPrivateIpAddresses :: NetworkInterfaceParam -> [Text]
- AWS.EC2.Types: networkInterfaceParamSecurityGroupIds :: NetworkInterfaceParam -> [Text]
- AWS.EC2.Types: networkInterfaceParamSubnetId :: NetworkInterfaceParam -> Maybe Text
- AWS.EC2.Types: runInstancesRequestNetworkInterface :: RunInstancesRequest -> [NetworkInterfaceParam]
+ AWS: ResponseParseError :: Text -> AWSException
+ AWS: TextConversionException :: Text -> AWSException
+ AWS: errorAction :: AWSException -> ByteString
+ AWS: getLastRequestId :: (Monad m, Functor m) => AWS AWSContext m (Maybe Text)
+ AWS.EC2: assignPrivateIpAddresses :: (MonadBaseControl IO m, MonadResource m) => Text -> Either [IPv4] Int -> Maybe Bool -> EC2 m Bool
+ AWS.EC2: describeNetworkInterfaces :: (MonadBaseControl IO m, MonadResource m) => [Text] -> [Filter] -> EC2 m (ResumableSource m NetworkInterface)
+ AWS.EC2: setEndpoint :: (MonadResource m, MonadBaseControl IO m) => ByteString -> EC2 m ()
+ AWS.EC2: unassignPrivateIpAddresses :: (MonadBaseControl IO m, MonadResource m) => Text -> [IPv4] -> EC2 m Bool
+ AWS.EC2.Types: InstanceNetworkInterfaceAssociation :: Text -> Text -> InstanceNetworkInterfaceAssociation
+ AWS.EC2.Types: InstanceNetworkInterfaceAttachment :: Text -> Int -> Text -> UTCTime -> Bool -> InstanceNetworkInterfaceAttachment
+ AWS.EC2.Types: NetworkInterface :: Text -> Text -> Text -> Text -> Text -> Text -> Maybe Text -> Text -> NetworkInterfaceStatus -> Text -> IPv4 -> Maybe Text -> Bool -> [Group] -> Maybe NetworkInterfaceAttachment -> Maybe NetworkInterfaceAssociation -> [ResourceTag] -> [NetworkInterfacePrivateIpAddress] -> NetworkInterface
+ AWS.EC2.Types: NetworkInterfaceParamAttach :: Text -> Int -> Bool -> NetworkInterfaceParam
+ AWS.EC2.Types: NetworkInterfaceParamCreate :: Int -> Text -> Text -> Maybe IPv4 -> SecondaryPrivateIpAddressParam -> [Text] -> Bool -> NetworkInterfaceParam
+ AWS.EC2.Types: NetworkInterfacePrivateIpAddress :: IPv4 -> Bool -> Maybe NetworkInterfaceAssociation -> NetworkInterfacePrivateIpAddress
+ AWS.EC2.Types: NetworkInterfaceStatusAvailable :: NetworkInterfaceStatus
+ AWS.EC2.Types: NetworkInterfaceStatusInUse :: NetworkInterfaceStatus
+ AWS.EC2.Types: SecondaryPrivateIpAddressParamCount :: Int -> SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: SecondaryPrivateIpAddressParamNothing :: SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: SecondaryPrivateIpAddressParamSpecified :: [IPv4] -> Maybe Int -> SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: data InstanceNetworkInterfaceAssociation
+ AWS.EC2.Types: data InstanceNetworkInterfaceAttachment
+ AWS.EC2.Types: data NetworkInterface
+ AWS.EC2.Types: data NetworkInterfacePrivateIpAddress
+ AWS.EC2.Types: data NetworkInterfaceStatus
+ AWS.EC2.Types: data SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: instance Eq InstanceNetworkInterfaceAssociation
+ AWS.EC2.Types: instance Eq InstanceNetworkInterfaceAttachment
+ AWS.EC2.Types: instance Eq NetworkInterface
+ AWS.EC2.Types: instance Eq NetworkInterfacePrivateIpAddress
+ AWS.EC2.Types: instance Eq NetworkInterfaceStatus
+ AWS.EC2.Types: instance Eq SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: instance FromText AddressDomain
+ AWS.EC2.Types: instance FromText Architecture
+ AWS.EC2.Types: instance FromText AttachmentSetItemResponseStatus
+ AWS.EC2.Types: instance FromText AttachmentState
+ AWS.EC2.Types: instance FromText CustomerGatewayState
+ AWS.EC2.Types: instance FromText EC2Return
+ AWS.EC2.Types: instance FromText Hypervisor
+ AWS.EC2.Types: instance FromText ImageState
+ AWS.EC2.Types: instance FromText ImageType
+ AWS.EC2.Types: instance FromText InstanceLifecycle
+ AWS.EC2.Types: instance FromText InstanceMonitoringState
+ AWS.EC2.Types: instance FromText InstanceStatusEventCode
+ AWS.EC2.Types: instance FromText InstanceStatusTypeStatus
+ AWS.EC2.Types: instance FromText InternetGatewayAttachmentState
+ AWS.EC2.Types: instance FromText NetworkAclRuleAction
+ AWS.EC2.Types: instance FromText NetworkInterfaceStatus
+ AWS.EC2.Types: instance FromText Platform
+ AWS.EC2.Types: instance FromText ProductCodeType
+ AWS.EC2.Types: instance FromText RootDeviceType
+ AWS.EC2.Types: instance FromText RouteOrigin
+ AWS.EC2.Types: instance FromText RouteState
+ AWS.EC2.Types: instance FromText ShutdownBehavior
+ AWS.EC2.Types: instance FromText SnapshotStatus
+ AWS.EC2.Types: instance FromText SubnetState
+ AWS.EC2.Types: instance FromText VirtualizationType
+ AWS.EC2.Types: instance FromText VolumeState
+ AWS.EC2.Types: instance FromText VolumeStatusInfoStatus
+ AWS.EC2.Types: instance FromText VpcState
+ AWS.EC2.Types: instance FromText VpnConnectionState
+ AWS.EC2.Types: instance FromText VpnGatewayState
+ AWS.EC2.Types: instance FromText VpnStaticRouteSource
+ AWS.EC2.Types: instance FromText VpnStaticRouteState
+ AWS.EC2.Types: instance FromText VpnTunnelTelemetryStatus
+ AWS.EC2.Types: instance Read AMIAttribute
+ AWS.EC2.Types: instance Read AMIAttributeDescription
+ AWS.EC2.Types: instance Read Address
+ AWS.EC2.Types: instance Read AddressDomain
+ AWS.EC2.Types: instance Read AllocateAddress
+ AWS.EC2.Types: instance Read Architecture
+ AWS.EC2.Types: instance Read AssociateAddressRequest
+ AWS.EC2.Types: instance Read Attachment
+ AWS.EC2.Types: instance Read AttachmentSetItemResponse
+ AWS.EC2.Types: instance Read AttachmentSetItemResponseStatus
+ AWS.EC2.Types: instance Read AttachmentState
+ AWS.EC2.Types: instance Read AvailabilityZone
+ AWS.EC2.Types: instance Read BlockDeviceMapping
+ AWS.EC2.Types: instance Read BlockDeviceMappingParam
+ AWS.EC2.Types: instance Read ConsoleOutput
+ AWS.EC2.Types: instance Read CreateSubnetRequest
+ AWS.EC2.Types: instance Read CreateVolumeRequest
+ AWS.EC2.Types: instance Read CustomerGateway
+ AWS.EC2.Types: instance Read CustomerGatewayState
+ AWS.EC2.Types: instance Read DisassociateAddressRequest
+ AWS.EC2.Types: instance Read EC2Return
+ AWS.EC2.Types: instance Read EbsBlockDevice
+ AWS.EC2.Types: instance Read EbsInstanceBlockDevice
+ AWS.EC2.Types: instance Read EbsSource
+ AWS.EC2.Types: instance Read Group
+ AWS.EC2.Types: instance Read Hypervisor
+ AWS.EC2.Types: instance Read IamInstanceProfile
+ AWS.EC2.Types: instance Read IcmpTypeCode
+ AWS.EC2.Types: instance Read Image
+ AWS.EC2.Types: instance Read ImageState
+ AWS.EC2.Types: instance Read ImageType
+ AWS.EC2.Types: instance Read Instance
+ AWS.EC2.Types: instance Read InstanceAttribute
+ AWS.EC2.Types: instance Read InstanceBlockDeviceMapping
+ AWS.EC2.Types: instance Read InstanceLifecycle
+ AWS.EC2.Types: instance Read InstanceMonitoringState
+ AWS.EC2.Types: instance Read InstanceNetworkInterface
+ AWS.EC2.Types: instance Read InstanceNetworkInterfaceAssociation
+ AWS.EC2.Types: instance Read InstanceNetworkInterfaceAttachment
+ AWS.EC2.Types: instance Read InstancePrivateIpAddress
+ AWS.EC2.Types: instance Read InstanceState
+ AWS.EC2.Types: instance Read InstanceStateChange
+ AWS.EC2.Types: instance Read InstanceStatus
+ AWS.EC2.Types: instance Read InstanceStatusDetail
+ AWS.EC2.Types: instance Read InstanceStatusEvent
+ AWS.EC2.Types: instance Read InstanceStatusEventCode
+ AWS.EC2.Types: instance Read InstanceStatusType
+ AWS.EC2.Types: instance Read InstanceStatusTypeStatus
+ AWS.EC2.Types: instance Read InternetGateway
+ AWS.EC2.Types: instance Read InternetGatewayAttachment
+ AWS.EC2.Types: instance Read InternetGatewayAttachmentState
+ AWS.EC2.Types: instance Read IpPermission
+ AWS.EC2.Types: instance Read KeyPair
+ AWS.EC2.Types: instance Read LaunchPermissionItem
+ AWS.EC2.Types: instance Read ModifyInstanceAttributeRequest
+ AWS.EC2.Types: instance Read NetworkAcl
+ AWS.EC2.Types: instance Read NetworkAclAssociation
+ AWS.EC2.Types: instance Read NetworkAclEntry
+ AWS.EC2.Types: instance Read NetworkAclEntryRequest
+ AWS.EC2.Types: instance Read NetworkAclRuleAction
+ AWS.EC2.Types: instance Read NetworkInterface
+ AWS.EC2.Types: instance Read NetworkInterfaceAssociation
+ AWS.EC2.Types: instance Read NetworkInterfaceAttachment
+ AWS.EC2.Types: instance Read NetworkInterfaceParam
+ AWS.EC2.Types: instance Read NetworkInterfacePrivateIpAddress
+ AWS.EC2.Types: instance Read NetworkInterfaceStatus
+ AWS.EC2.Types: instance Read PasswordData
+ AWS.EC2.Types: instance Read Placement
+ AWS.EC2.Types: instance Read Platform
+ AWS.EC2.Types: instance Read PortRange
+ AWS.EC2.Types: instance Read ProductCode
+ AWS.EC2.Types: instance Read ProductCodeItem
+ AWS.EC2.Types: instance Read ProductCodeType
+ AWS.EC2.Types: instance Read Region
+ AWS.EC2.Types: instance Read RegisterImageRequest
+ AWS.EC2.Types: instance Read Reservation
+ AWS.EC2.Types: instance Read ResetInstanceAttributeRequest
+ AWS.EC2.Types: instance Read ResourceTag
+ AWS.EC2.Types: instance Read RootDeviceType
+ AWS.EC2.Types: instance Read Route
+ AWS.EC2.Types: instance Read RouteOrigin
+ AWS.EC2.Types: instance Read RouteState
+ AWS.EC2.Types: instance Read RouteTable
+ AWS.EC2.Types: instance Read RouteTableAssociation
+ AWS.EC2.Types: instance Read RunInstancesRequest
+ AWS.EC2.Types: instance Read SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: instance Read SecurityGroup
+ AWS.EC2.Types: instance Read SecurityGroupRequest
+ AWS.EC2.Types: instance Read ShutdownBehavior
+ AWS.EC2.Types: instance Read Snapshot
+ AWS.EC2.Types: instance Read SnapshotStatus
+ AWS.EC2.Types: instance Read StateReason
+ AWS.EC2.Types: instance Read Subnet
+ AWS.EC2.Types: instance Read SubnetState
+ AWS.EC2.Types: instance Read Tag
+ AWS.EC2.Types: instance Read UserIdGroupPair
+ AWS.EC2.Types: instance Read VirtualizationType
+ AWS.EC2.Types: instance Read Volume
+ AWS.EC2.Types: instance Read VolumeAttribute
+ AWS.EC2.Types: instance Read VolumeAttributeRequest
+ AWS.EC2.Types: instance Read VolumeState
+ AWS.EC2.Types: instance Read VolumeStatus
+ AWS.EC2.Types: instance Read VolumeStatusAction
+ AWS.EC2.Types: instance Read VolumeStatusDetail
+ AWS.EC2.Types: instance Read VolumeStatusEvent
+ AWS.EC2.Types: instance Read VolumeStatusInfo
+ AWS.EC2.Types: instance Read VolumeStatusInfoStatus
+ AWS.EC2.Types: instance Read VolumeType
+ AWS.EC2.Types: instance Read Vpc
+ AWS.EC2.Types: instance Read VpcState
+ AWS.EC2.Types: instance Read VpnConnection
+ AWS.EC2.Types: instance Read VpnConnectionOptionsRequest
+ AWS.EC2.Types: instance Read VpnConnectionState
+ AWS.EC2.Types: instance Read VpnGateway
+ AWS.EC2.Types: instance Read VpnGatewayState
+ AWS.EC2.Types: instance Read VpnStaticRoute
+ AWS.EC2.Types: instance Read VpnStaticRouteSource
+ AWS.EC2.Types: instance Read VpnStaticRouteState
+ AWS.EC2.Types: instance Read VpnTunnelTelemetry
+ AWS.EC2.Types: instance Read VpnTunnelTelemetryStatus
+ AWS.EC2.Types: instance Show InstanceNetworkInterfaceAssociation
+ AWS.EC2.Types: instance Show InstanceNetworkInterfaceAttachment
+ AWS.EC2.Types: instance Show NetworkInterface
+ AWS.EC2.Types: instance Show NetworkInterfacePrivateIpAddress
+ AWS.EC2.Types: instance Show NetworkInterfaceStatus
+ AWS.EC2.Types: instance Show SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: instanceNetworkInterfaceAssociationIpOwnerId :: InstanceNetworkInterfaceAssociation -> Text
+ AWS.EC2.Types: instanceNetworkInterfaceAssociationPublicIp :: InstanceNetworkInterfaceAssociation -> Text
+ AWS.EC2.Types: instanceNetworkInterfaceAttachmentAttachTime :: InstanceNetworkInterfaceAttachment -> UTCTime
+ AWS.EC2.Types: instanceNetworkInterfaceAttachmentDeleteOnTermination :: InstanceNetworkInterfaceAttachment -> Bool
+ AWS.EC2.Types: instanceNetworkInterfaceAttachmentDeviceIndex :: InstanceNetworkInterfaceAttachment -> Int
+ AWS.EC2.Types: instanceNetworkInterfaceAttachmentId :: InstanceNetworkInterfaceAttachment -> Text
+ AWS.EC2.Types: instanceNetworkInterfaceAttachmentStatus :: InstanceNetworkInterfaceAttachment -> Text
+ AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddressesSet :: InstanceNetworkInterface -> [InstancePrivateIpAddress]
+ AWS.EC2.Types: networkInterfaceAssociation :: NetworkInterface -> Maybe NetworkInterfaceAssociation
+ AWS.EC2.Types: networkInterfaceAssociationAttachmentId :: NetworkInterfaceAssociation -> Maybe Text
+ AWS.EC2.Types: networkInterfaceAssociationId :: NetworkInterfaceAssociation -> Text
+ AWS.EC2.Types: networkInterfaceAssociationInstanceId :: NetworkInterfaceAssociation -> Maybe Text
+ AWS.EC2.Types: networkInterfaceAttachment :: NetworkInterface -> Maybe NetworkInterfaceAttachment
+ AWS.EC2.Types: networkInterfaceAttachmentInstanceId :: NetworkInterfaceAttachment -> Maybe Text
+ AWS.EC2.Types: networkInterfaceAttachmentInstanceOwnerId :: NetworkInterfaceAttachment -> Text
+ AWS.EC2.Types: networkInterfaceAvailabilityZone :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceDescription :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceGroupSet :: NetworkInterface -> [Group]
+ AWS.EC2.Types: networkInterfaceId :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceMacAddress :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceOwnerId :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceParamAttachDeleteOnTermination :: NetworkInterfaceParam -> Bool
+ AWS.EC2.Types: networkInterfaceParamAttachDeviceIndex :: NetworkInterfaceParam -> Int
+ AWS.EC2.Types: networkInterfaceParamAttachInterfaceId :: NetworkInterfaceParam -> Text
+ AWS.EC2.Types: networkInterfaceParamCreateDeleteOnTermination :: NetworkInterfaceParam -> Bool
+ AWS.EC2.Types: networkInterfaceParamCreateDescription :: NetworkInterfaceParam -> Text
+ AWS.EC2.Types: networkInterfaceParamCreateDeviceIndex :: NetworkInterfaceParam -> Int
+ AWS.EC2.Types: networkInterfaceParamCreatePrivateIpAddress :: NetworkInterfaceParam -> Maybe IPv4
+ AWS.EC2.Types: networkInterfaceParamCreatePrivateIpAddresses :: NetworkInterfaceParam -> SecondaryPrivateIpAddressParam
+ AWS.EC2.Types: networkInterfaceParamCreateSecurityGroupIds :: NetworkInterfaceParam -> [Text]
+ AWS.EC2.Types: networkInterfaceParamCreateSubnetId :: NetworkInterfaceParam -> Text
+ AWS.EC2.Types: networkInterfacePrivateDnsName :: NetworkInterface -> Maybe Text
+ AWS.EC2.Types: networkInterfacePrivateIpAddress :: NetworkInterface -> IPv4
+ AWS.EC2.Types: networkInterfacePrivateIpAddressAssociation :: NetworkInterfacePrivateIpAddress -> Maybe NetworkInterfaceAssociation
+ AWS.EC2.Types: networkInterfacePrivateIpAddressPrimary :: NetworkInterfacePrivateIpAddress -> Bool
+ AWS.EC2.Types: networkInterfacePrivateIpAddressPrivateIpAddress :: NetworkInterfacePrivateIpAddress -> IPv4
+ AWS.EC2.Types: networkInterfacePrivateIpAddressesSet :: NetworkInterface -> [NetworkInterfacePrivateIpAddress]
+ AWS.EC2.Types: networkInterfaceRequesterId :: NetworkInterface -> Maybe Text
+ AWS.EC2.Types: networkInterfaceRequesterManaged :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceSourceDestCheck :: NetworkInterface -> Bool
+ AWS.EC2.Types: networkInterfaceStatus :: NetworkInterface -> NetworkInterfaceStatus
+ AWS.EC2.Types: networkInterfaceSubnetId :: NetworkInterface -> Text
+ AWS.EC2.Types: networkInterfaceTagSet :: NetworkInterface -> [ResourceTag]
+ AWS.EC2.Types: networkInterfaceVpcId :: NetworkInterface -> Text
+ AWS.EC2.Types: runInstancesRequestNetworkInterfaces :: RunInstancesRequest -> [NetworkInterfaceParam]
+ AWS.EC2.Types: secondaryPrivateIpAddressParamSpecifiedAddresses :: SecondaryPrivateIpAddressParam -> [IPv4]
+ AWS.EC2.Types: secondaryPrivateIpAddressParamSpecifiedPrimary :: SecondaryPrivateIpAddressParam -> Maybe Int
+ AWS.EC2.Types: type Filter = (Text, [Text])
+ AWS.EC2.Util: retry :: (MonadBaseControl IO m, MonadResource m) => Int -> Int -> EC2 m a -> EC2 m a
+ AWS.EC2.Util: sleep :: MonadIO m => Int -> EC2 m ()
- AWS: ClientError :: Int -> Text -> Text -> Text -> AWSException
+ AWS: ClientError :: ByteString -> Int -> Text -> Text -> Text -> AWSException
- AWS.EC2: AssociateAddressRequestEc2 :: Text -> Text -> AssociateAddressRequest
+ AWS.EC2: AssociateAddressRequestEc2 :: IPv4 -> Text -> AssociateAddressRequest
- AWS.EC2: AssociateAddressRequestVpc :: Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Bool -> AssociateAddressRequest
+ AWS.EC2: AssociateAddressRequestVpc :: Text -> Maybe Text -> Maybe Text -> Maybe IPv4 -> Maybe Bool -> AssociateAddressRequest
- AWS.EC2: DisassociateAddressRequestEc2 :: Text -> DisassociateAddressRequest
+ AWS.EC2: DisassociateAddressRequestEc2 :: IPv4 -> DisassociateAddressRequest
- AWS.EC2: DisassociateAddressRequestVpc :: Text -> DisassociateAddressRequest
+ AWS.EC2: DisassociateAddressRequestVpc :: IPv4 -> DisassociateAddressRequest
- AWS.EC2: associateAddressRequestEc2PublicIp :: AssociateAddressRequest -> Text
+ AWS.EC2: associateAddressRequestEc2PublicIp :: AssociateAddressRequest -> IPv4
- AWS.EC2: associateAddressRequestVpcPrivateIpAddress :: AssociateAddressRequest -> Maybe Text
+ AWS.EC2: associateAddressRequestVpcPrivateIpAddress :: AssociateAddressRequest -> Maybe IPv4
- AWS.EC2: createCustomerGateway :: (MonadResource m, MonadBaseControl IO m) => Text -> Text -> Int -> EC2 m CustomerGateway
+ AWS.EC2: createCustomerGateway :: (MonadResource m, MonadBaseControl IO m) => Text -> IPv4 -> Int -> EC2 m CustomerGateway
- AWS.EC2: createVpc :: (MonadResource m, MonadBaseControl IO m) => Text -> Maybe Text -> EC2 m Vpc
+ AWS.EC2: createVpc :: (MonadResource m, MonadBaseControl IO m) => AddrRange IPv4 -> Maybe Text -> EC2 m Vpc
- AWS.EC2: releaseAddress :: (MonadResource m, MonadBaseControl IO m) => Maybe Text -> Maybe Text -> EC2 m EC2Return
+ AWS.EC2: releaseAddress :: (MonadResource m, MonadBaseControl IO m) => Maybe IPv4 -> Maybe Text -> EC2 m EC2Return
- AWS.EC2.Types: Address :: Text -> Maybe Text -> AddressDomain -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Address
+ AWS.EC2.Types: Address :: IPv4 -> Maybe Text -> AddressDomain -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe IPv4 -> Address
- AWS.EC2.Types: AllocateAddress :: Text -> AddressDomain -> Maybe Text -> AllocateAddress
+ AWS.EC2.Types: AllocateAddress :: IPv4 -> AddressDomain -> Maybe Text -> AllocateAddress
- AWS.EC2.Types: AssociateAddressRequestEc2 :: Text -> Text -> AssociateAddressRequest
+ AWS.EC2.Types: AssociateAddressRequestEc2 :: IPv4 -> Text -> AssociateAddressRequest
- AWS.EC2.Types: AssociateAddressRequestVpc :: Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Bool -> AssociateAddressRequest
+ AWS.EC2.Types: AssociateAddressRequestVpc :: Text -> Maybe Text -> Maybe Text -> Maybe IPv4 -> Maybe Bool -> AssociateAddressRequest
- AWS.EC2.Types: CreateSubnetRequest :: Text -> Text -> Maybe Text -> CreateSubnetRequest
+ AWS.EC2.Types: CreateSubnetRequest :: Text -> AddrRange IPv4 -> Maybe Text -> CreateSubnetRequest
- AWS.EC2.Types: CustomerGateway :: Text -> CustomerGatewayState -> Text -> Text -> Int -> [ResourceTag] -> CustomerGateway
+ AWS.EC2.Types: CustomerGateway :: Text -> CustomerGatewayState -> Text -> IPv4 -> Int -> [ResourceTag] -> CustomerGateway
- AWS.EC2.Types: DisassociateAddressRequestEc2 :: Text -> DisassociateAddressRequest
+ AWS.EC2.Types: DisassociateAddressRequestEc2 :: IPv4 -> DisassociateAddressRequest
- AWS.EC2.Types: DisassociateAddressRequestVpc :: Text -> DisassociateAddressRequest
+ AWS.EC2.Types: DisassociateAddressRequestVpc :: IPv4 -> DisassociateAddressRequest
- AWS.EC2.Types: Image :: Text -> Text -> ImageState -> Text -> Bool -> [ProductCode] -> Text -> ImageType -> Maybe Text -> Maybe Text -> Platform -> Maybe StateReason -> Maybe Bool -> Maybe Text -> Text -> Text -> [Text] -> RootDeviceType -> Maybe Text -> [BlockDeviceMapping] -> VirtualizationType -> [ResourceTag] -> Hypervisor -> Image
+ AWS.EC2.Types: Image :: Text -> Text -> ImageState -> Text -> Bool -> [ProductCode] -> Text -> ImageType -> Maybe Text -> Maybe Text -> Platform -> Maybe StateReason -> Maybe Bool -> Maybe Text -> Maybe Text -> Maybe Text -> [Text] -> RootDeviceType -> Maybe Text -> [BlockDeviceMapping] -> VirtualizationType -> [ResourceTag] -> Hypervisor -> Image
- AWS.EC2.Types: Instance :: Text -> Text -> InstanceState -> Text -> Text -> Text -> Maybe Text -> Text -> [ProductCode] -> Text -> UTCTime -> Placement -> Maybe Text -> Maybe Text -> Maybe Text -> InstanceMonitoringState -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Bool -> [Group] -> Maybe StateReason -> Architecture -> RootDeviceType -> Maybe Text -> [InstanceBlockDeviceMapping] -> InstanceLifecycle -> Maybe Text -> VirtualizationType -> Text -> [ResourceTag] -> Hypervisor -> [InstanceNetworkInterface] -> Maybe IamInstanceProfile -> Bool -> Instance
+ AWS.EC2.Types: Instance :: Text -> Text -> InstanceState -> Text -> Text -> Text -> Maybe Text -> Text -> [ProductCode] -> Text -> UTCTime -> Placement -> Maybe Text -> Maybe Text -> Maybe Text -> InstanceMonitoringState -> Maybe Text -> Maybe Text -> Maybe IPv4 -> Maybe IPv4 -> Maybe Bool -> [Group] -> Maybe StateReason -> Architecture -> RootDeviceType -> Maybe Text -> [InstanceBlockDeviceMapping] -> InstanceLifecycle -> Maybe Text -> VirtualizationType -> Text -> [ResourceTag] -> Hypervisor -> [InstanceNetworkInterface] -> Maybe IamInstanceProfile -> Bool -> Instance
- AWS.EC2.Types: InstanceNetworkInterface :: Text -> Text -> Text -> Text -> Text -> Text -> Text -> Maybe Text -> Bool -> [Group] -> NetworkInterfaceAttachment -> Maybe NetworkInterfaceAssociation -> [InstancePrivateIpAddress] -> InstanceNetworkInterface
+ AWS.EC2.Types: InstanceNetworkInterface :: Text -> Text -> Text -> Maybe Text -> Text -> Text -> IPv4 -> Maybe Text -> Bool -> [Group] -> InstanceNetworkInterfaceAttachment -> Maybe InstanceNetworkInterfaceAssociation -> [InstancePrivateIpAddress] -> InstanceNetworkInterface
- AWS.EC2.Types: InstancePrivateIpAddress :: Text -> Bool -> Maybe NetworkInterfaceAssociation -> InstancePrivateIpAddress
+ AWS.EC2.Types: InstancePrivateIpAddress :: IPv4 -> Bool -> Maybe InstanceNetworkInterfaceAssociation -> InstancePrivateIpAddress
- AWS.EC2.Types: IpPermission :: Text -> Maybe Int -> Maybe Int -> [UserIdGroupPair] -> [IpRange] -> IpPermission
+ AWS.EC2.Types: IpPermission :: Text -> Maybe Int -> Maybe Int -> [UserIdGroupPair] -> [AddrRange IPv4] -> IpPermission
- AWS.EC2.Types: NetworkInterfaceAssociation :: Text -> Text -> NetworkInterfaceAssociation
+ AWS.EC2.Types: NetworkInterfaceAssociation :: Maybe Text -> Maybe Text -> IPv4 -> Text -> Text -> NetworkInterfaceAssociation
- AWS.EC2.Types: NetworkInterfaceAttachment :: Text -> Int -> Text -> UTCTime -> Bool -> NetworkInterfaceAttachment
+ AWS.EC2.Types: NetworkInterfaceAttachment :: Text -> Maybe Text -> Text -> Int -> Text -> UTCTime -> Bool -> NetworkInterfaceAttachment
- AWS.EC2.Types: RunInstancesRequest :: Text -> Int -> Int -> Maybe Text -> [Text] -> [Text] -> Maybe ByteString -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> [BlockDeviceMappingParam] -> Maybe Bool -> Maybe Text -> Maybe Bool -> Maybe ShutdownBehavior -> Maybe Text -> Maybe Text -> [NetworkInterfaceParam] -> Maybe IamInstanceProfile -> Maybe Bool -> RunInstancesRequest
+ AWS.EC2.Types: RunInstancesRequest :: Text -> Int -> Int -> Maybe Text -> [Text] -> [Text] -> Maybe ByteString -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> Maybe Text -> [BlockDeviceMappingParam] -> Maybe Bool -> Maybe Text -> Maybe Bool -> Maybe ShutdownBehavior -> Maybe IPv4 -> Maybe Text -> [NetworkInterfaceParam] -> Maybe IamInstanceProfile -> Maybe Bool -> RunInstancesRequest
- AWS.EC2.Types: Subnet :: Text -> SubnetState -> Text -> Text -> Int -> Text -> [ResourceTag] -> Subnet
+ AWS.EC2.Types: Subnet :: Text -> SubnetState -> Text -> AddrRange IPv4 -> Int -> Text -> [ResourceTag] -> Subnet
- AWS.EC2.Types: Vpc :: Text -> VpcState -> Text -> Text -> [ResourceTag] -> Text -> Vpc
+ AWS.EC2.Types: Vpc :: Text -> VpcState -> AddrRange IPv4 -> Text -> [ResourceTag] -> Text -> Vpc
- AWS.EC2.Types: VpnTunnelTelemetry :: Text -> VpnTunnelTelemetryStatus -> UTCTime -> Text -> Int -> VpnTunnelTelemetry
+ AWS.EC2.Types: VpnTunnelTelemetry :: IPv4 -> VpnTunnelTelemetryStatus -> UTCTime -> Text -> Int -> VpnTunnelTelemetry
- AWS.EC2.Types: addressPrivateIpAddress :: Address -> Maybe Text
+ AWS.EC2.Types: addressPrivateIpAddress :: Address -> Maybe IPv4
- AWS.EC2.Types: addressPublicIp :: Address -> Text
+ AWS.EC2.Types: addressPublicIp :: Address -> IPv4
- AWS.EC2.Types: allocateAddressPublicIp :: AllocateAddress -> Text
+ AWS.EC2.Types: allocateAddressPublicIp :: AllocateAddress -> IPv4
- AWS.EC2.Types: associateAddressRequestEc2PublicIp :: AssociateAddressRequest -> Text
+ AWS.EC2.Types: associateAddressRequestEc2PublicIp :: AssociateAddressRequest -> IPv4
- AWS.EC2.Types: associateAddressRequestVpcPrivateIpAddress :: AssociateAddressRequest -> Maybe Text
+ AWS.EC2.Types: associateAddressRequestVpcPrivateIpAddress :: AssociateAddressRequest -> Maybe IPv4
- AWS.EC2.Types: createSubnetRequestCidrBlock :: CreateSubnetRequest -> Text
+ AWS.EC2.Types: createSubnetRequestCidrBlock :: CreateSubnetRequest -> AddrRange IPv4
- AWS.EC2.Types: customerGatewayIpAddress :: CustomerGateway -> Text
+ AWS.EC2.Types: customerGatewayIpAddress :: CustomerGateway -> IPv4
- AWS.EC2.Types: imageDescription :: Image -> Text
+ AWS.EC2.Types: imageDescription :: Image -> Maybe Text
- AWS.EC2.Types: imageName :: Image -> Text
+ AWS.EC2.Types: imageName :: Image -> Maybe Text
- AWS.EC2.Types: instanceIpAddress :: Instance -> Maybe Text
+ AWS.EC2.Types: instanceIpAddress :: Instance -> Maybe IPv4
- AWS.EC2.Types: instanceNetworkInterfaceAssociation :: InstanceNetworkInterface -> Maybe NetworkInterfaceAssociation
+ AWS.EC2.Types: instanceNetworkInterfaceAssociation :: InstanceNetworkInterface -> Maybe InstanceNetworkInterfaceAssociation
- AWS.EC2.Types: instanceNetworkInterfaceAttachment :: InstanceNetworkInterface -> NetworkInterfaceAttachment
+ AWS.EC2.Types: instanceNetworkInterfaceAttachment :: InstanceNetworkInterface -> InstanceNetworkInterfaceAttachment
- AWS.EC2.Types: instanceNetworkInterfaceDescription :: InstanceNetworkInterface -> Text
+ AWS.EC2.Types: instanceNetworkInterfaceDescription :: InstanceNetworkInterface -> Maybe Text
- AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddress :: InstanceNetworkInterface -> Text
+ AWS.EC2.Types: instanceNetworkInterfacePrivateIpAddress :: InstanceNetworkInterface -> IPv4
- AWS.EC2.Types: instancePrivateIpAddress :: Instance -> Maybe Text
+ AWS.EC2.Types: instancePrivateIpAddress :: Instance -> Maybe IPv4
- AWS.EC2.Types: instancePrivateIpAddressAddress :: InstancePrivateIpAddress -> Text
+ AWS.EC2.Types: instancePrivateIpAddressAddress :: InstancePrivateIpAddress -> IPv4
- AWS.EC2.Types: instancePrivateIpAddressAssociation :: InstancePrivateIpAddress -> Maybe NetworkInterfaceAssociation
+ AWS.EC2.Types: instancePrivateIpAddressAssociation :: InstancePrivateIpAddress -> Maybe InstanceNetworkInterfaceAssociation
- AWS.EC2.Types: ipPermissionIpRanges :: IpPermission -> [IpRange]
+ AWS.EC2.Types: ipPermissionIpRanges :: IpPermission -> [AddrRange IPv4]
- AWS.EC2.Types: networkInterfaceAssociationPublicIp :: NetworkInterfaceAssociation -> Text
+ AWS.EC2.Types: networkInterfaceAssociationPublicIp :: NetworkInterfaceAssociation -> IPv4
- AWS.EC2.Types: runInstancesRequestPrivateIpAddress :: RunInstancesRequest -> Maybe Text
+ AWS.EC2.Types: runInstancesRequestPrivateIpAddress :: RunInstancesRequest -> Maybe IPv4
- AWS.EC2.Types: subnetCidrBlock :: Subnet -> Text
+ AWS.EC2.Types: subnetCidrBlock :: Subnet -> AddrRange IPv4
- AWS.EC2.Types: vpcCidrBlock :: Vpc -> Text
+ AWS.EC2.Types: vpcCidrBlock :: Vpc -> AddrRange IPv4
- AWS.EC2.Types: vpnTunnelTelemetryOutsideIpAddress :: VpnTunnelTelemetry -> Text
+ AWS.EC2.Types: vpnTunnelTelemetryOutsideIpAddress :: VpnTunnelTelemetry -> IPv4

Files

AWS.hs view
@@ -24,7 +24,7 @@ -- >     cred <- loadCredential -- >     doc <- runResourceT $ -- >         runEC2 cred $--- >             Util.asList $ describeInstances [] []+-- >             Util.list $ describeInstances [] [] -- >     print doc -- >     putStr "Length: " -- >     print $ length doc@@ -38,6 +38,7 @@       -- * Environment     , AWS     , AWSException(..)+    , getLastRequestId     ) where  import AWS.Credential
AWS/Class.hs view
@@ -11,6 +11,8 @@     , runAWS     , AWSException(..)     , AWSContext(..)+    , getLastRequestId+    , monadThrow     ) where  import Control.Monad.State (StateT(..), MonadState)@@ -18,7 +20,7 @@ import Control.Monad.Reader (ReaderT(..), MonadReader) import qualified Control.Monad.Reader as R import Control.Applicative-import Control.Monad (liftM)+import Control.Monad import Control.Monad.Base (MonadBase) import Control.Monad.IO.Class (MonadIO, liftIO) import Control.Monad.Trans.Class (MonadTrans, lift)@@ -31,6 +33,7 @@     ) import Control.Exception (Exception) import Data.Typeable (Typeable)+import Data.Conduit (MonadThrow, monadThrow)  import qualified Network.HTTP.Conduit as HTTP import Data.Text (Text)@@ -41,11 +44,15 @@  data AWSException     = ClientError-        { errorStatus :: Int+        { errorAction :: ByteString+        , errorStatus :: Int         , errorCode :: Text         , errorMessage :: Text         , errorRequestId :: Text         } -- ^ This error is caused by client requests.+    | ResponseParseError Text+    | TextConversionException Text+        -- ^ parse error: cannot convert Text to oher data type.     | NextToken Text -- ^ This response has next token.   deriving (Show, Typeable) @@ -100,3 +107,6 @@     R.runReaderT         (S.evalStateT (runAWST app) $ ctx mgr)         cred++getLastRequestId :: (Monad m, Functor m) => AWS AWSContext m (Maybe Text)+getLastRequestId = lastRequestId <$> S.get
AWS/CloudWatch.hs view
@@ -19,7 +19,7 @@ import Data.Monoid ((<>))  import AWS.Class-import AWS.Util+import AWS.Lib.Query (textToBS)  import AWS import AWS.CloudWatch.Internal
AWS/CloudWatch/Metric.hs view
@@ -61,13 +61,13 @@ getMetricStatistics ds start end mn ns pe sts unit =     cloudWatchQuery "GetMetricStatistics" params $ (,)         <$> members "Datapoints" (Datapoint-            <$> getF "Timestamp" textToTime-            <*> getM "SampleCount" (textToDouble <$>)+            <$> getT "Timestamp"+            <*> getT "SampleCount"             <*> getT "Unit"-            <*> getM "Minimum" (textToDouble <$>)-            <*> getM "Maximum" (textToDouble <$>)-            <*> getM "Sum" (textToDouble <$>)-            <*> getM "Average" (textToDouble <$>)+            <*> getT "Minimum"+            <*> getT "Maximum"+            <*> getT "Sum"+            <*> getT "Average"             )         <*> getT "Label"   where
AWS/EC2.hs view
@@ -6,6 +6,7 @@       EC2     , runEC2     , setRegion+    , setEndpoint       -- * Instances     , module AWS.EC2.Instance       -- * Images@@ -20,6 +21,8 @@     , module AWS.EC2.KeyPair       -- * SecurityGroups     , module AWS.EC2.SecurityGroup+      -- * NetworkInterface+    , module AWS.EC2.NetworkInterface       -- * Placements     , module AWS.EC2.Region     , module AWS.EC2.AvailabilityZone@@ -36,9 +39,10 @@ import Control.Monad.Trans.Control (MonadBaseControl) import qualified Control.Monad.State as State import Data.Text (Text)+import Data.ByteString (ByteString) -import AWS.Util import AWS.Class+import AWS.Lib.Query (textToBS) import AWS.EC2.Internal import AWS.EC2.Types import qualified AWS.EC2.Util as Util@@ -57,18 +61,23 @@ import AWS.EC2.Subnets import AWS.EC2.Acl import AWS.EC2.RouteTable+import AWS.EC2.NetworkInterface --- | set endpoint to EC2 context.+-- | set endpoint to EC2 context by giving the EC2 region. setRegion     :: (MonadResource m, MonadBaseControl IO m)     => Text -- ^ RegionName     -> EC2 m () setRegion name = do     region <- Util.head $ describeRegions [name] []-    ctx <- State.get-    maybe-        (fail "region not found")-        (\r -> State.put ctx { endpoint = f r })-        region+    maybe (fail "region not found") (setEndpoint . g) region   where-    f = textToBS . regionEndpoint+    g = textToBS . regionEndpoint++-- | set endpoint to EC2 context.+setEndpoint :: (MonadResource m, MonadBaseControl IO m)+    => ByteString -- ^ ec2 endpoint domain <http://docs.amazonwebservices.com/general/latest/gr/rande.html>+    -> EC2 m ()+setEndpoint endpoint = do+    ctx <- State.get+    State.put ctx { endpoint = endpoint }
AWS/EC2/Acl.hs view
@@ -16,7 +16,6 @@ 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@@ -42,20 +41,20 @@ networkAclSink = NetworkAcl     <$> getT "networkAclId"     <*> getT "vpcId"-    <*> getF "default" textToBool+    <*> getT "default"     <*> itemsSet "entrySet" (NetworkAclEntry-        <$> getF "ruleNumber" textToInt-        <*> getF "protocol" textToInt-        <*> getF "ruleAction" networkAclRuleAction-        <*> getF "egress" textToBool+        <$> getT "ruleNumber"+        <*> getT "protocol"+        <*> getT "ruleAction"+        <*> getT "egress"         <*> getT "cidrBlock"         <*> elementM "icmpTypeCode" (IcmpTypeCode-            <$> getF "code" textToInt-            <*> getF "type" textToInt+            <$> getT "code"+            <*> getT "type"             )         <*> elementM "portRange" (PortRange-            <$> getF "from" textToInt-            <*> getF "to" textToInt))+            <$> getT "from"+            <*> getT "to"))     <*> itemsSet "associationSet" (NetworkAclAssociation         <$> getT "networkAclAssociationId"         <*> getT "networkAclId"@@ -98,7 +97,7 @@     => NetworkAclEntryRequest     -> EC2 m Bool createNetworkAclEntry req =-    ec2Query "CreateNetworkAclEntry" params returnBool+    ec2Query "CreateNetworkAclEntry" params $ getT "return"   where     params = reqToParams req @@ -145,7 +144,7 @@     -> Bool -- ^ Egress     -> EC2 m Bool deleteNetworkAclEntry aclid rule egress =-    ec2Query "DeleteNetworkAclEntry" params returnBool+    ec2Query "DeleteNetworkAclEntry" params $ getT "return"   where     params =         [ ValueParam "NetworkAclId" aclid@@ -158,6 +157,6 @@     => NetworkAclEntryRequest     -> EC2 m Bool replaceNetworkAclEntry req =-    ec2Query "ReplaceNetworkAclEntry" params returnBool+    ec2Query "ReplaceNetworkAclEntry" params $ getT "return"   where     params = reqToParams req
AWS/EC2/Address.hs view
@@ -11,13 +11,12 @@     ) where  import Data.Text (Text)-+import Data.IP (IPv4) 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@@ -44,13 +43,13 @@     addressSet :: MonadThrow m => GLConduit Event m Address     addressSet = itemConduit "addressesSet" $ Address         <$> getT "publicIp"-        <*> getMT "allocationId"-        <*> getM "domain" addressDomain'-        <*> getMT "instanceId"-        <*> getMT "associationId"-        <*> getMT "networkInterfaceId"-        <*> getMT "networkInterfaceOwnerId"-        <*> getMT "privateIpAddress"+        <*> getT "allocationId"+        <*> getT "domain"+        <*> getT "instanceId"+        <*> getT "associationId"+        <*> getT "networkInterfaceId"+        <*> getT "networkInterfaceOwnerId"+        <*> getT "privateIpAddress"  ----------------------------------------------------- -- AllocateAddress@@ -63,8 +62,8 @@     ec2Query "AllocateAddress" params $         AllocateAddress         <$> getT "publicIp"-        <*> getM "domain" addressDomain'-        <*> getMT "allocationId"+        <*> getT "domain"+        <*> getT "allocationId"   where     params = if isVpc then [ValueParam "Domain" "vpc"] else [] @@ -73,14 +72,14 @@ ----------------------------------------------------- releaseAddress     :: (MonadResource m, MonadBaseControl IO m)-    => Maybe Text -- ^ PublicIp+    => Maybe IPv4 -- ^ PublicIp     -> Maybe Text -- ^ AllocationId     -> EC2 m EC2Return releaseAddress addr allocid = do-    ec2Query "ReleaseAddress" params $ getF "return" ec2Return+    ec2Query "ReleaseAddress" params $ getT "return"   where     params = maybeParams-        [ ("PublicIp", addr)+        [ ("PublicIp", toText <$> addr)         , ("AllocationId", allocid)         ] @@ -92,15 +91,15 @@     => AssociateAddressRequest     -> EC2 m (Bool, Maybe Text) associateAddress param = ec2Query "AssociateAddress" params $-    (,) <$> getF "return" textToBool-        <*> getMT "associationId"+    (,) <$> getT "return"+        <*> getT "associationId"   where     params = associateAddressParam param  associateAddressParam     :: AssociateAddressRequest -> [QueryParam] associateAddressParam (AssociateAddressRequestEc2 ip iid) =-    [ ValueParam "PublicIp" ip+    [ ValueParam "PublicIp" $ toText ip     , ValueParam "InstanceId" iid     ] associateAddressParam@@ -109,7 +108,7 @@     ++ maybeParams         [ ("InstanceId", iid)         , ("NetworkInterfaceId", nid)-        , ("PrivateIpAddress", pip)+        , ("PrivateIpAddress", toText <$> pip)         , ("AllowReassociation", boolToText <$> ar)         ] @@ -119,9 +118,9 @@     -> EC2 m Bool disassociateAddress param =     ec2Query "DisassociateAddress" (p param)-        $ getF "return" textToBool+        $ getT "return"   where     p (DisassociateAddressRequestEc2 pip)-        = [ValueParam "PublicIp" pip]+        = [ValueParam "PublicIp" $ toText pip]     p (DisassociateAddressRequestVpc aid)-        = [ValueParam "AssociationId" aid]+        = [ValueParam "AssociationId" $ toText aid]
− AWS/EC2/Convert.hs
@@ -1,200 +0,0 @@-{-# LANGUAGE RankNTypes, TemplateHaskell #-}--module AWS.EC2.Convert-    where--import Data.Text (Text)--import AWS.Util-import AWS.Lib.Convert-import AWS.EC2.Types--mkConvertFunc-    "imageState"-    ''ImageState-    ["available", "pending", "failed"]--mkConvertFunc-    "productCodeType'"-    ''ProductCodeType-    ["devpay", "marketplace"]--mkConvertFunc-    "imageType"-    ''ImageType-    ["machine", "kernel", "ramdisk"]--platform :: Maybe Text -> Platform-platform Nothing   = PlatformOther-platform (Just t)-    | t == "windows" = PlatformWindows-    | otherwise      = PlatformOther--mkConvertFunc-    "rootDeviceType"-    ''RootDeviceType-    ["ebs", "instance-store"]--volumeType :: Text -> Maybe Int -> VolumeType-volumeType t Nothing  | t == "standard" = VolumeTypeStandard-volumeType t (Just i) | t == "io1"      = VolumeTypeIO1 i-volumeType t _ = err "volume type" t--mkConvertFunc-    "virtualizationType"-    ''VirtualizationType ["paravirtual", "hvm"]--mkConvertFunc "hypervisor" ''Hypervisor ["ovm", "xen"]--mkConvertFunc-    "instanceStatusEventCode'"-    ''InstanceStatusEventCode-    [ "instance-reboot"-    , "instance-stop"-    , "system-reboot"-    , "instance-retirement"-    ]--mkConvertFunc-    "instanceStatusTypeStatus'"-    ''InstanceStatusTypeStatus-    ["ok", "impaired", "insufficient-data", "not-applicable"]--instanceStateCodes :: [(Int, InstanceState)]-instanceStateCodes =-    [ (0, InstanceStatePending)-    , (16, InstanceStateRunning)-    , (32, InstanceStateShuttingDown)-    , (48, InstanceStateTerminated)-    , (64, InstanceStateStopping)-    , (80, InstanceStateStopped)-    ]--codeToState :: Int -> InstanceState-codeToState code = maybe-    (InstanceStateUnknown code)-    id-    (lookup code instanceStateCodes)--mkConvertFunc-    "instanceMonitoringState"-    ''InstanceMonitoringState-    ["disabled", "enabled", "pending"]--mkConvertFunc "architecture" ''Architecture ["i386", "x86_64"]--addressDomain' :: Maybe Text -> AddressDomain-addressDomain' Nothing = AddressDomainStandard-addressDomain' (Just t)-    | t == "standard" = AddressDomainStandard-    | t == "vpc"      = AddressDomainVPC-    | otherwise       = err "address domain" t--ec2Return :: Text -> EC2Return-ec2Return t-    | t == "true" = EC2Success-    | otherwise   = EC2Error t--mkConvertFunc-    "snapshotStatus'"-    ''SnapshotStatus-    ["pending", "completed", "error"]--mkConvertFunc-    "volumeStatus'"-    ''VolumeState-    [ "creating"-    , "available"-    , "in-use"-    , "deleting"-    , "deleted"-    , "error"]--mkConvertFunc-    "attachmentSetItemResponseStatus'"-    ''AttachmentSetItemResponseStatus-    ["attaching", "attached", "detaching", "detached"]--mkConvertFunc-    "shutdownBehavior"-    ''ShutdownBehavior-    ["stop", "terminate"]--mkConvertFunc-    "vpnConnectionState'"-    ''VpnConnectionState-    ["pending", "available", "deleting", "deleted"]--mkConvertFunc-    "vpnTunnelTelemetryStatus'"-    ''VpnTunnelTelemetryStatus-    ["UP", "DOWN"]--mkConvertFunc-    "vpnStaticRouteSource'"-    ''VpnStaticRouteSource-    ["Static"]--mkConvertFunc-    "vpnStaticRouteState'"-    ''VpnStaticRouteState-    ["pending", "available", "deleting", "deleted"]--instanceLifecycle :: Maybe Text -> InstanceLifecycle-instanceLifecycle Nothing = LifecycleNone-instanceLifecycle (Just t)-    | t == "spot"   = LifecycleSpot-    | otherwise     = err "lifecycle" t--mkConvertFunc-    "subnetState'"-    ''SubnetState-    ["pending", "available"]--mkConvertFunc-    "volumeStatusInfoStatus'"-    ''VolumeStatusInfoStatus-    ["ok", "impaired", "insufficient-data"]--mkConvertFunc-    "networkAclRuleAction"-    ''NetworkAclRuleAction-    ["allow", "deny"]--mkConvertFunc-    "routeState'"-    ''RouteState-    ["active", "blackhole"]--mkConvertFunc-    "routeOrigin'"-    ''RouteOrigin-    [ "CreateRouteTable"-    , "CreateRoute"-    , "EnableVgwRoutePropagation"-    ]--mkConvertFunc-    "vpcState'"-    ''VpcState-    ["pending", "available"]--mkConvertFunc-    "vpnGatewayState'"-    ''VpnGatewayState-    ["pending", "available", "deleting", "deleted"]--mkConvertFunc-    "attachmentState'"-    ''AttachmentState-    ["attaching", "attached", "detaching", "detached"]--mkConvertFunc-    "customerGatewayState'"-    ''CustomerGatewayState-    ["pending", "available", "deleting", "deleted"]--mkConvertFunc-    "internetGatewayAttachmentState'"-    ''InternetGatewayAttachmentState-    ["attaching", "attached", "detaching", "detached", "available"]
AWS/EC2/Image.hs view
@@ -17,7 +17,6 @@ import Control.Applicative import Control.Monad (join) -import AWS.EC2.Convert import AWS.EC2.Internal import AWS.EC2.Types import AWS.EC2.Params@@ -48,38 +47,38 @@ imageItem = Image     <$> getT "imageId"     <*> getT "imageLocation"-    <*> getF "imageState" imageState+    <*> getT "imageState"     <*> getT "imageOwnerId"-    <*> getF "isPublic" textToBool+    <*> getT "isPublic"     <*> productCodeSink     <*> getT "architecture"-    <*> getF "imageType" imageType-    <*> getMT "kernelId"-    <*> getMT "ramdiskId"-    <*> getM "platform" platform+    <*> getT "imageType"+    <*> getT "kernelId"+    <*> getT "ramdiskId"+    <*> getT "platform"     <*> stateReasonSink-    <*> getM "viridianEnabled" (textToBool <$>)-    <*> getMT "imageOwnerAlias"-    <*> getM "name" orEmpty-    <*> getM "description" orEmpty+    <*> getT "viridianEnabled"+    <*> getT "imageOwnerAlias"+    <*> getT "name"+    <*> getT "description"     <*> itemsSet "billingProducts" (getT "billingProduct")-    <*> getF "rootDeviceType" rootDeviceType-    <*> getMT "rootDeviceName"+    <*> getT "rootDeviceType"+    <*> getT "rootDeviceName"     <*> blockDeviceMappingSink-    <*> getF "virtualizationType" virtualizationType+    <*> getT "virtualizationType"     <*> resourceTagSink-    <*> getF "hypervisor" hypervisor+    <*> getT "hypervisor"  blockDeviceMappingSink :: MonadThrow m => GLSink Event m [BlockDeviceMapping] blockDeviceMappingSink = itemsSet "blockDeviceMapping" (     BlockDeviceMapping     <$> getT "deviceName"-    <*> getMT "virtualName"+    <*> getT "virtualName"     <*> elementM "ebs" (         EbsBlockDevice-        <$> getMT "snapshotId"-        <*> getF "volumeSize" textToInt-        <*> getF "deleteOnTermination" textToBool+        <$> getT "snapshotId"+        <*> getT "volumeSize"+        <*> getT "deleteOnTermination"         <*> volumeTypeSink         )     )@@ -133,7 +132,7 @@     => Text -- ^ ImageId     -> EC2 m Bool deregisterImage iid =-    ec2Query "DeregisterImage" params returnBool+    ec2Query "DeregisterImage" params $ getT "return"   where     params = [ValueParam "ImageId" iid] @@ -157,7 +156,7 @@         <*> getMMT "description"         <*> blockDeviceMappingSink   where-    getMMT name = join <$> elementM name (getMT "value")+    getMMT name = join <$> elementM name (getT "value")     params = [ ValueParam "ImageId" iid              , ValueParam "Attribute" param              ]
AWS/EC2/Instance.hs view
@@ -21,10 +21,11 @@ import Data.Conduit import Control.Monad.Trans.Control (MonadBaseControl) import Control.Applicative-import Data.Maybe (fromJust)+import Data.Maybe (fromMaybe, fromJust) import qualified Data.Map as Map+import Data.Monoid+import Control.Monad -import AWS.EC2.Convert import AWS.EC2.Internal import AWS.EC2.Types import AWS.EC2.Params@@ -57,12 +58,7 @@     <*> getT "ownerId"     <*> groupSetSink     <*> instanceSetSink-    <*> getMT "requesterId"--groupSetSink :: MonadThrow m => GLSink Event m [Group]-groupSetSink = itemsSet "groupSet" $ Group-    <$> getT "groupId"-    <*> getT "groupName"+    <*> getT "requesterId"  instanceSetSink :: MonadThrow m     => GLSink Event m [Instance]@@ -74,45 +70,45 @@     <*> getT "privateDnsName"     <*> getT "dnsName"     <*> getT "reason"-    <*> getMT "keyName"+    <*> getT "keyName"     <*> getT "amiLaunchIndex"     <*> productCodeSink     <*> getT "instanceType"-    <*> getF "launchTime" textToTime+    <*> getT "launchTime"     <*> element "placement" (         Placement         <$> getT "availabilityZone"         <*> getT "groupName"         <*> getT "tenancy"         )-    <*> getMT "kernelId"-    <*> getMT "ramdiskId"-    <*> getMT "platform"-    <*> element "monitoring" (getF "state" instanceMonitoringState)-    <*> getMT "subnetId"-    <*> getMT "vpcId"-    <*> getMT "privateIpAddress"-    <*> getMT "ipAddress"-    <*> getM "sourceDestCheck" (textToBool <$>)+    <*> getT "kernelId"+    <*> getT "ramdiskId"+    <*> getT "platform"+    <*> element "monitoring" (getT "state")+    <*> getT "subnetId"+    <*> getT "vpcId"+    <*> getT "privateIpAddress"+    <*> getT "ipAddress"+    <*> getT "sourceDestCheck"     <*> groupSetSink     <*> stateReasonSink-    <*> getF "architecture" architecture-    <*> getF "rootDeviceType" rootDeviceType-    <*> getMT "rootDeviceName"+    <*> getT "architecture"+    <*> getT "rootDeviceType"+    <*> getT "rootDeviceName"     <*> instanceBlockDeviceMappingsSink-    <*> getM "instanceLifecycle" instanceLifecycle-    <*> getMT "spotInstanceRequestId"-    <*> getF "virtualizationType" virtualizationType+    <*> getT "instanceLifecycle"+    <*> getT "spotInstanceRequestId"+    <*> getT "virtualizationType"     <*> getT "clientToken"     <*> resourceTagSink-    <*> getF "hypervisor" hypervisor+    <*> getT "hypervisor"     <*> networkInterfaceSink     <*> elementM "iamInstanceProfile" (         IamInstanceProfile         <$> getT "arn"         <*> getT "id"         )-    <*> getF "ebsOptimized" textToBool+    <*> getT "ebsOptimized"  instanceBlockDeviceMappingsSink :: MonadThrow m     => GLSink Event m [InstanceBlockDeviceMapping]@@ -122,18 +118,32 @@     <*> element "ebs" (         EbsInstanceBlockDevice         <$> getT "volumeId"-        <*> getF "status" attachmentSetItemResponseStatus'-        <*> getF "attachTime" textToTime-        <*> getF "deleteOnTermination" textToBool+        <*> getT "status"+        <*> getT "attachTime"+        <*> getT "deleteOnTermination"         )     ) +instanceStateCodes :: [(Int, InstanceState)]+instanceStateCodes =+    [ ( 0, InstanceStatePending)+    , (16, InstanceStateRunning)+    , (32, InstanceStateShuttingDown)+    , (48, InstanceStateTerminated)+    , (64, InstanceStateStopping)+    , (80, InstanceStateStopped)+    ]++codeToState :: Int -> Text -> InstanceState+codeToState code _name = fromMaybe+    (InstanceStateUnknown code)+    (lookup code instanceStateCodes)+ instanceStateSink :: MonadThrow m     => Text -> GLSink Event m InstanceState-instanceStateSink label = element label $-    codeToState-    <$> getF "code" textToInt-    <* getT "name"+instanceStateSink label = element label $ codeToState+    <$> getT "code"+    <*> getT "name"  networkInterfaceSink :: MonadThrow m     => GLSink Event m [InstanceNetworkInterface]@@ -142,33 +152,33 @@     <$> getT "networkInterfaceId"     <*> getT "subnetId"     <*> getT "vpcId"-    <*> getM "description" orEmpty+    <*> getT "description"     <*> getT "ownerId"     <*> getT "status"     <*> getT "privateIpAddress"-    <*> getMT "privateDnsName"-    <*> getF "sourceDestCheck" textToBool+    <*> getT "privateDnsName"+    <*> getT "sourceDestCheck"     <*> groupSetSink     <*> element "attachment" (-        NetworkInterfaceAttachment+        InstanceNetworkInterfaceAttachment         <$> getT "attachmentId"-        <*> getF "deviceIndex" textToInt+        <*> getT "deviceIndex"         <*> getT "status"-        <*> getF "attachTime" textToTime-        <*> getF "deleteOnTermination" textToBool+        <*> getT "attachTime"+        <*> getT "deleteOnTermination"         )-    <*> niAssociationSink+    <*> instanceNetworkInterfaceAssociationSink     <*> itemsSet "privateIpAddressesSet" (         InstancePrivateIpAddress         <$> getT "privateIpAddress"-        <*> getF "primary" textToBool-        <*> niAssociationSink+        <*> getT "primary"+        <*> instanceNetworkInterfaceAssociationSink         ) -niAssociationSink :: MonadThrow m-    => GLSink Event m (Maybe NetworkInterfaceAssociation)-niAssociationSink = elementM "association" $-    NetworkInterfaceAssociation+instanceNetworkInterfaceAssociationSink :: MonadThrow m+    => GLSink Event m (Maybe InstanceNetworkInterfaceAssociation)+instanceNetworkInterfaceAssociationSink = elementM "association" $+    InstanceNetworkInterfaceAssociation     <$> getT "publicIp"     <*> getT "ipOwnerId" @@ -201,10 +211,10 @@         <*> getT "availabilityZone"         <*> itemsSet "eventsSet" (             InstanceStatusEvent-            <$> getF "code" instanceStatusEventCode'+            <$> getT "code"             <*> getT "description"-            <*> getM "notBefore" (textToTime <$>)-            <*> getM "notAfter" (textToTime <$>)+            <*> getT "notBefore"+            <*> getT "notAfter"             )         <*> instanceStateSink "instanceState"         <*> instanceStatusTypeSink "systemStatus"@@ -214,12 +224,12 @@     => Text -> GLSink Event m InstanceStatusType instanceStatusTypeSink name = element name $     InstanceStatusType-    <$> getF "status" instanceStatusTypeStatus'+    <$> getT "status"     <*> itemsSet "details" (         InstanceStatusDetail         <$> getT "name"         <*> getT "status"-        <*> getM "impairedSince" (textToTime <$>)+        <*> getT "impairedSince"         )  ------------------------------------------------------------@@ -266,7 +276,7 @@     => [Text] -- ^ InstanceIds     -> EC2 m Bool rebootInstances instanceIds =-    ec2Query "RebootInstances" params returnBool+    ec2Query "RebootInstances" params $ getT "return"   where     params = [ArrayParams "InstanceId" instanceIds] @@ -306,7 +316,9 @@             $ runInstancesRequestSecurityGroups param         , blockDeviceMappingParams             $ runInstancesRequestBlockDeviceMappings param-        ] ++ maybeParams+        ] ++ networkInterfaceParams+             (runInstancesRequestNetworkInterfaces param)+          ++ maybeParams             [ ("KeyName", runInstancesRequestKeyName param)             , ("UserData"               , bsToText <$> runInstancesRequestUserData param@@ -339,7 +351,8 @@                 <$> runInstancesRequestShutdownBehavior param               )             , ("PrivateIpAddress"-              , runInstancesRequestPrivateIpAddress param+              , toText+                <$> runInstancesRequestPrivateIpAddress param               )             , ("ClientToken", runInstancesRequestClientToken param)             , ("IamInstanceProfile.Arn"@@ -388,6 +401,42 @@         Nothing         Nothing +networkInterfaceParams :: [NetworkInterfaceParam] -> [QueryParam]+networkInterfaceParams nips = f 1 nips+  where+    f :: Int -> [NetworkInterfaceParam] -> [QueryParam]+    f _ [] = []+    f n (ni:nis) = g n ni ++ f (n + 1) nis+    g n (NetworkInterfaceParamAttach nid idx dot) =+        [ ValueParam (p n "NetworkInterfaceId") nid+        , ValueParam (p n "DeviceIndex") $ toText idx+        , ValueParam (p n "DeleteOnTermination") $ boolToText dot+        ]+    g n (NetworkInterfaceParamCreate idx sn desc pip sip sec dot) =+        [ ValueParam (p n "DeviceIndex") $ toText idx+        , ValueParam (p n "SubnetId") sn+        , ValueParam (p n "Description") desc+        , ArrayParams (p n "SecurityroupId") sec+        , ValueParam (p n "DeleteOnTermination") $ boolToText dot+        ] ++ maybeParams [(p n "PrivateIpAddress", toText <$> pip)]+          ++ s n sip+    p n name = "NetworkInterface." <> toText n <> "." <> name+    s _ SecondaryPrivateIpAddressParamNothing = []+    s n (SecondaryPrivateIpAddressParamCount c) =+        [ ValueParam+          (p n "SecondaryPrivateIpAddressCount")+          $ toText c+        ]+    s n (SecondaryPrivateIpAddressParamSpecified addrs pr) =+        [ privateIpAddressesParam (p n "PrivateIpAddresses") addrs+        ] ++ maybe+            []+            (\i -> [+              ValueParam+              (p n "PrivateIpAddresses." <> toText i <> ".Primary")+              "true"])+            pr+ sbToText :: ShutdownBehavior -> Text sbToText ShutdownBehaviorStop      = "stop" sbToText ShutdownBehaviorTerminate = "terminate"@@ -403,7 +452,7 @@     ec2Query "GetConsoleOutput" [ValueParam "InstanceId" iid] $         ConsoleOutput         <$> getT "instanceId"-        <*> getF "timestamp" textToTime+        <*> getT "timestamp"         <*> getT "output"  ------------------------------------------------------------@@ -417,7 +466,7 @@     ec2Query "GetPasswordData" [ValueParam "InstanceId" iid] $         PasswordData         <$> getT "instanceId"-        <*> getF "timestamp" textToTime+        <*> getT "timestamp"         <*> getT "passwordData"  describeInstanceAttribute@@ -427,7 +476,7 @@     -> EC2 m InstanceAttribute describeInstanceAttribute iid attr =     ec2Query "DescribeInstanceAttribute" params-        $ getT "instanceId" *> f attr+        $ getT_ "instanceId" *> f attr   where     str = iar attr     params =@@ -449,19 +498,21 @@         , (InstanceAttributeRequestRamdiskId, InstanceAttributeRamdiskId)         , (InstanceAttributeRequestUserData, InstanceAttributeUserData)         , (InstanceAttributeRequestDisableApiTermination,-           InstanceAttributeDisableApiTermination-           . textToBool . fromJust)+           InstanceAttributeDisableApiTermination . just)         , (InstanceAttributeRequestShutdownBehavior,            InstanceAttributeShutdownBehavior-           . shutdownBehavior . fromJust)-        , (InstanceAttributeRequestRootDeviceName, InstanceAttributeRootDeviceName)+           . fromJust . fromTextMay . fromJust)+        , (InstanceAttributeRequestRootDeviceName,+           InstanceAttributeRootDeviceName)         , (InstanceAttributeRequestSourceDestCheck,-           InstanceAttributeSourceDestCheck . (textToBool <$>))+           InstanceAttributeSourceDestCheck+           . fromTextMay . fromJust)         , (InstanceAttributeRequestEbsOptimized,-           InstanceAttributeEbsOptimized . textToBool . fromJust)+           InstanceAttributeEbsOptimized . just)         ]+    just = fromJust . join . (fromTextMay <$>)     valueSink name val =-        (element name $ getMT "value") >>= return . val+        (element name $ getT "value") >>= return . val  iar :: InstanceAttributeRequest -> Text iar InstanceAttributeRequestInstanceType          = "instanceType"@@ -488,7 +539,7 @@     -> ResetInstanceAttributeRequest     -> EC2 m Bool resetInstanceAttribute iid attr =-    ec2Query "ResetInstanceAttribute" params returnBool+    ec2Query "ResetInstanceAttribute" params $ getT "return"   where     params =         [ ValueParam "InstanceId" iid@@ -502,7 +553,7 @@     -> [ModifyInstanceAttributeRequest]     -> EC2 m Bool modifyInstanceAttribute iid attrs =-    ec2Query "ModifyInstanceAttribute" params returnBool+    ec2Query "ModifyInstanceAttribute" params $ getT "return"   where     params = ValueParam "InstanceId" iid:concatMap miap attrs 
AWS/EC2/Internal.hs view
@@ -1,9 +1,22 @@ {-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}  module AWS.EC2.Internal-    where+    ( module AWS.Class+    , EC2+    , initialEC2Context+    , runEC2+    , itemConduit+    , itemsSet+    , resourceTagSink+    , productCodeSink+    , stateReasonSink+    , volumeTypeSink+    , groupSetSink+    ) where  import Control.Monad.IO.Class (MonadIO)+import Control.Monad.Trans.Class (lift) import qualified Network.HTTP.Conduit as HTTP import Data.ByteString.Char8 () import Control.Applicative@@ -13,9 +26,7 @@ import Data.Text (Text)  import AWS.Class-import AWS.EC2.Convert import AWS.Credential-import AWS.Util import AWS.Lib.Parser import AWS.EC2.Types @@ -49,14 +60,14 @@ resourceTagSink = itemsSet "tagSet" $     ResourceTag     <$> getT "key"-    <*> getMT "value"+    <*> getT "value"  productCodeSink :: MonadThrow m     => GLSink Event m [ProductCode] productCodeSink = itemsSet "productCodes" $     ProductCode     <$> getT "productCode"-    <*> getF "type" productCodeType'+    <*> getT "type"  stateReasonSink :: MonadThrow m     => GLSink Event m (Maybe StateReason)@@ -65,11 +76,16 @@     <$> getT "code"     <*> getT "message" +volumeType :: MonadThrow m => Text -> Maybe Int -> m VolumeType+volumeType t Nothing  | t == "standard" = return $ VolumeTypeStandard+volumeType t (Just i) | t == "io1"      = return $ VolumeTypeIO1 i+volumeType t _ = monadThrow $ TextConversionException t+ volumeTypeSink :: MonadThrow m-    => GLSink Event m VolumeType-volumeTypeSink = volumeType-    <$> getT "volumeType"-    <*> getM "iops" (textToInt <$>)+    => Pipe Event Event o u m VolumeType+volumeTypeSink = volumeType <$> getT "volumeType" <*> getT "iops" >>= lift -returnBool :: MonadThrow m => GLSink Event m Bool-returnBool = getF "return" textToBool+groupSetSink :: MonadThrow m => GLSink Event m [Group]+groupSetSink = itemsSet "groupSet" $ Group+    <$> getT "groupId"+    <*> getT "groupName"
+ AWS/EC2/NetworkInterface.hs view
@@ -0,0 +1,111 @@+{-# LANGUAGE FlexibleContexts, RankNTypes #-}++module AWS.EC2.NetworkInterface+    ( assignPrivateIpAddresses+    , unassignPrivateIpAddresses+    , describeNetworkInterfaces+    ) 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+import AWS.EC2.Types+import AWS.EC2.Params+import AWS.EC2.Query+import AWS.Lib.Parser+import AWS.Util++assignPrivateIpAddresses+    :: (MonadBaseControl IO m, MonadResource m)+    => Text -- ^ NetworkInterfaceId+    -> Either [IPv4] Int -- ^ PrivateIpAddresses or Count+    -> Maybe Bool+    -> EC2 m Bool+assignPrivateIpAddresses niid epip ar =+    ec2Query "AssignPrivateIpAddresses" params $ getT "return"+  where+    params = [ValueParam "NetworkInterfaceId" niid]+        ++ either f g epip+        ++ maybeParams [("AllowReassignment", boolToText <$> ar)]+    f addrs = [privateIpAddressesParam "PrivateIpAddress" addrs]+    g cnt = [ValueParam "SecondaryPrivateIpAddressCount"+        $ toText cnt]++unassignPrivateIpAddresses+    :: (MonadBaseControl IO m, MonadResource m)+    => Text -- ^ NetworkInterfaceId+    -> [IPv4] -- ^ PrivateIpAddresses+    -> EC2 m Bool+unassignPrivateIpAddresses niid addrs =+    ec2Query "UnassignPrivateIpAddresses" params $ getT "return"+  where+    params =+        [ ValueParam "NetworkInterfaceId" niid+        , privateIpAddressesParam "PrivateIpAddress" addrs+        ]++describeNetworkInterfaces+    :: (MonadBaseControl IO m, MonadResource m)+    => [Text] -- ^ NetworkInterfaceIds+    -> [Filter]+    -> EC2 m (ResumableSource m NetworkInterface)+describeNetworkInterfaces niid filters =+    ec2QuerySource "DescribeNetworkInterfaces" params+        $ itemConduit "networkInterfaceSet" networkInterfaceSink+  where+    params =+        [ ArrayParams "NetworkInterfaceId" niid+        , FilterParams filters+        ]++networkInterfaceSink+    :: MonadThrow m+    => GLSink Event m NetworkInterface+networkInterfaceSink = NetworkInterface+    <$> getT "networkInterfaceId"+    <*> getT "subnetId"+    <*> getT "vpcId"+    <*> getT "availabilityZone"+    <*> getT "description"+    <*> getT "ownerId"+    <*> getT "requesterId"+    <*> getT "requesterManaged"+    <*> getT "status"+    <*> getT "macAddress"+    <*> getT "privateIpAddress"+    <*> getT "privateDnsName"+    <*> getT "sourceDestCheck"+    <*> groupSetSink+    <*> elementM "attachment" (NetworkInterfaceAttachment+        <$> getT "attachmentId"+        <*> getT "instanceId"+        <*> getT "instanceOwnerId"+        <*> getT "deviceIndex"+        <*> getT "status"+        <*> getT "attachTime"+        <*> getT "deleteOnTermination"+        )+    <*> networkInterfaceAssociationSink+    <*> resourceTagSink+    <*> itemsSet "privateIpAddressesSet" (+        NetworkInterfacePrivateIpAddress+        <$> getT "privateIpAddress"+        <*> getT "primary"+        <*> networkInterfaceAssociationSink+        )++networkInterfaceAssociationSink+    :: MonadThrow m+    => GLSink Event m (Maybe NetworkInterfaceAssociation)+networkInterfaceAssociationSink =+    elementM "association" $ NetworkInterfaceAssociation+        <$> getT "attachmentId"+        <*> getT "instanceId"+        <*> getT "publicIp"+        <*> getT "ipOwnerId"+        <*> getT "associationId"
AWS/EC2/Params.hs view
@@ -1,7 +1,9 @@ module AWS.EC2.Params where  import Control.Applicative+import Data.Text (Text) import qualified Data.Text as T+import Data.IP (IPv4)  import AWS.EC2.Query (QueryParam(..)) import AWS.EC2.Types@@ -37,3 +39,9 @@         [ ("Ebs.VolumeType", "io1")         , ("Ebs.Iops", T.pack $ show iops)         ]++privateIpAddressesParam :: Text -> [IPv4] -> QueryParam+privateIpAddressesParam name addrs = StructArrayParams+    name+    $ unconcat $ zip (repeat "PrivateIpAddress")+    $ map toText addrs
AWS/EC2/Query.hs view
@@ -36,6 +36,7 @@  #ifdef DEBUG import Debug.Trace+import Control.Monad.IO.Class (liftIO) import qualified Data.Conduit.Binary as CB #endif @@ -49,14 +50,14 @@     await -- EventBeginElement DescribeImagesResponse     getT "requestId" -sinkError :: MonadThrow m => Int -> GLSink Event m a-sinkError s = do+sinkError :: MonadThrow m => ByteString -> Int -> GLSink Event m a+sinkError a s = do     await     element "Response" $ do         (c,m) <- element "Errors" $ element "Error" $             (,) <$> getT "Code" <*> getT "Message"         r <- getT "RequestID"-        lift $ monadThrow $ ClientError s c m r+        lift $ monadThrow $ ClientError a s c m r  ec2Query     :: (MonadResource m, MonadBaseControl IO m)@@ -106,18 +107,19 @@         (\t -> ValueParam "NextToken" t:params) token  nextToken :: MonadThrow m => Conduit Event m o-nextToken = getMT "nextToken" >>= maybe (return ()) (E.throw . NextToken)+nextToken = getT "nextToken" >>= maybe (return ()) (E.throw . NextToken)  #ifdef DEBUG ec2QueryDebug     :: (MonadResource m, MonadBaseControl IO m)     => ByteString     -> [QueryParam]-    -> EC2 m (Source m o)+    -> 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"@@ -130,4 +132,4 @@     -> Text -- ^ ID of Target     -> EC2 m Bool ec2Delete apiName idName targetId = do-    ec2Query apiName [ ValueParam idName targetId ] returnBool+    ec2Query apiName [ ValueParam idName targetId ] $ getT "return"
AWS/EC2/RouteTable.hs view
@@ -15,12 +15,10 @@ 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  ------------------------------------------------------------ -- describeRouteTables@@ -46,27 +44,27 @@     <*> getT "vpcId"     <*> routeSink     <*> routeTableAssociationSink-    <*> getMT "propagatingVgwSet"+    <*> getT "propagatingVgwSet"     <*> resourceTagSink  routeSink :: MonadThrow m     => GLSink Event m [Route] routeSink = itemsSet "routeSet" $ Route     <$> getT "destinationCidrBlock"-    <*> getMT "gatewayId"-    <*> getMT "instanceId"-    <*> getMT "instanceOwnerId"-    <*> getMT "networkInterfaceId"-    <*> getF "state" routeState'-    <*> getM "origin" (routeOrigin' <$>)+    <*> getT "gatewayId"+    <*> getT "instanceId"+    <*> getT "instanceOwnerId"+    <*> getT "networkInterfaceId"+    <*> getT "state"+    <*> getT "origin"  routeTableAssociationSink :: MonadThrow m     => GLSink Event m [RouteTableAssociation] routeTableAssociationSink = itemsSet "associationSet" $ RouteTableAssociation     <$> getT "routeTableAssociationId"     <*> getT "routeTableId"-    <*> getMT "subnetId"-    <*> getM "main" (textToBool <$>)+    <*> getT "subnetId"+    <*> getT "main"  ------------------------------------------------------------ -- createRouteTable@@ -112,8 +110,9 @@     => Text -- ^ AssociationId     -> EC2 m Bool -- ^ return disassociateRouteTable aid =-   ec2Query "DisassociateRouteTable" [ValueParam "AssociationId" aid]-        $ getF "return" textToBool+    ec2Query "DisassociateRouteTable"+        [ValueParam "AssociationId" aid]+            $ getT "return"  ------------------------------------------------------------ -- replaceRouteTableAssociation
AWS/EC2/SecurityGroup.hs view
@@ -39,7 +39,7 @@         <*> getT "groupId"         <*> getT "groupName"         <*> getT "groupDescription"-        <*> getMT "vpcId"+        <*> getT "vpcId"         <*> ipPermissionsSink "ipPermissions"         <*> ipPermissionsSink "ipPermissionsEgress"         <*> resourceTagSink@@ -53,15 +53,16 @@ ipPermissionsSink :: MonadThrow m     => Text -> GLSink Event m [IpPermission] ipPermissionsSink name = itemsSet name $ IpPermission-    <$> getT "ipProtocol" <*> getM "fromPort" (textToInt <$>)-    <*> getM "toPort" (textToInt <$>)+    <$> getT "ipProtocol"+    <*> getT "fromPort"+    <*> getT "toPort"     <*> itemsSet "groups" (         UserIdGroupPair-        <$> getMT "userId"+        <$> getT "userId"         <*> getT "groupId"-        <*> getMT "groupName"+        <*> getT "groupName"         )-    <*> itemsSet "ipRanges" (IpRange <$> getT "cidrIp")+    <*> itemsSet "ipRanges" (getT "cidrIp")  createSecurityGroup     :: (MonadResource m, MonadBaseControl IO m)@@ -71,7 +72,7 @@     -> EC2 m (Maybe Text) -- ^ GroupId createSecurityGroup name desc vpc =     ec2Query "CreateSecurityGroup" params-        $ getT "return" *> getMT "groupId"+        $ getT_ "return" *> getT "groupId"   where     params =         [ ValueParam "GroupName" name@@ -83,8 +84,7 @@     => SecurityGroupRequest     -> EC2 m Bool deleteSecurityGroup param =-    ec2Query "DeleteSecurityGroup" [p param]-        $ getF "return" textToBool+    ec2Query "DeleteSecurityGroup" [p param] $ getT "return"  p :: SecurityGroupRequest -> QueryParam p (SecurityGroupRequestGroupId t)   = ValueParam "GroupId" t@@ -135,7 +135,7 @@     -> [IpPermission]     -> EC2 m Bool securityGroupQuery act param ipps =-    ec2Query act params $ getF "return" textToBool+    ec2Query act params $ getT "return"   where     params = [p param]         ++ concatMap (uncurry ipPermissionParam) (zip intstr ipps)@@ -170,4 +170,4 @@             ])     ipr n r = ValueParam         (pre <> ".IPRanges." <> toText n <> ".CidrIp")-        $ ipRangeCidrIp r+        $ toText r
AWS/EC2/Snapshot.hs view
@@ -17,8 +17,6 @@ import AWS.EC2.Types import AWS.EC2.Query import AWS.Lib.Parser-import AWS.Util-import AWS.EC2.Convert  describeSnapshots     :: (MonadResource m, MonadBaseControl IO m)@@ -43,18 +41,18 @@ snapshotSink = Snapshot         <$> getT "snapshotId"         <*> getT "volumeId"-        <*> getF "status" snapshotStatus'-        <*> getF "startTime" textToTime+        <*> getT "status"+        <*> getT "startTime"         <*> getT "progress"         <*> getT "ownerId"-        <*> getF "volumeSize" textToInt+        <*> getT "volumeSize"         <*> getT "description"-        <*> getMT "ownerAlias"+        <*> getT "ownerAlias"         <*> resourceTagSink  createSnapshot     :: (MonadResource m, MonadBaseControl IO m)-    => Text -- ^ SnapshotId+    => Text -- ^ VolumeId     -> Maybe Text -- ^ Description     -> EC2 m Snapshot createSnapshot volid desc =@@ -68,6 +66,6 @@     => Text -- ^ SnapshotId     -> EC2 m Bool deleteSnapshot ssid =-    ec2Query "DeleteSnapshot" params $ getF "return" textToBool+    ec2Query "DeleteSnapshot" params $ getT "return"   where     params = [ValueParam "SnapshotId" ssid]
AWS/EC2/Subnets.hs view
@@ -12,7 +12,6 @@ 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@@ -40,10 +39,10 @@     => GLSink Event m Subnet subnetSink = Subnet     <$> getT "subnetId"-    <*> getF "state" subnetState'+    <*> getT "state"     <*> getT "vpcId"     <*> getT "cidrBlock"-    <*> getF "availableIpAddressCount" textToInt+    <*> getT "availableIpAddressCount"     <*> getT "availabilityZone"     <*> resourceTagSink @@ -63,7 +62,7 @@ createSubnetParam :: CreateSubnetRequest -> [QueryParam] createSubnetParam (CreateSubnetRequest vid cidr zone) =     [ ValueParam "VpcId" vid-    , ValueParam "CidrBlock" cidr+    , ValueParam "CidrBlock" $ toText cidr     ] ++ maybe [] (\a -> [ValueParam "AvailabilityZone" a]) zone  ------------------------------------------------------------
AWS/EC2/Tag.hs view
@@ -28,7 +28,7 @@         <$> getT "resourceId"         <*> getT "resourceType"         <*> getT "key"-        <*> getMT "value"+        <*> getT "value"   where     params = [FilterParams filters] @@ -38,7 +38,7 @@     -> [(Text, Text)] -- ^ (Key, Value)     -> EC2 m Bool createTags rids kvs =-    ec2Query "CreateTags" params returnBool+    ec2Query "CreateTags" params $ getT "return"   where     params =         [ ArrayParams "ResourceId" rids ]@@ -54,7 +54,7 @@     -> [ResourceTag]     -> EC2 m Bool deleteTags rids tags =-    ec2Query "DeleteTags" params returnBool+    ec2Query "DeleteTags" params $ getT "return"   where     params =         [ ArrayParams "ResourceId" rids ]
AWS/EC2/Types.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE TemplateHaskell #-} module AWS.EC2.Types     ( Address(..)     , AddressDomain(..)@@ -25,6 +26,7 @@     , EbsInstanceBlockDevice(..)     , EbsSource(..)     , EC2Return(..)+    , Filter     , Group(..)     , Hypervisor(..)     , IamInstanceProfile(..)@@ -39,6 +41,8 @@     , InstanceLifecycle(..)     , InstanceMonitoringState(..)     , InstanceNetworkInterface(..)+    , InstanceNetworkInterfaceAssociation(..)+    , InstanceNetworkInterfaceAttachment(..)     , InstancePrivateIpAddress(..)     , InstanceState(..)     , InstanceStateChange(..)@@ -51,7 +55,6 @@     , InstanceStatusDetailName     , InstanceStatusDetailStatus     , IpPermission(..)-    , IpRange(..)     , KeyPair(..)     , ModifyInstanceAttributeRequest(..)     , LaunchPermissionItem(..)@@ -60,9 +63,12 @@     , NetworkAclEntry(..)     , NetworkAclEntryRequest(..)     , NetworkAclRuleAction(..)+    , NetworkInterface(..)     , NetworkInterfaceAssociation(..)     , NetworkInterfaceAttachment(..)     , NetworkInterfaceParam(..)+    , NetworkInterfacePrivateIpAddress(..)+    , NetworkInterfaceStatus(..)     , PasswordData(..)     , Placement(..)     , Platform(..)@@ -82,6 +88,7 @@     , RouteState(..)     , RouteOrigin(..)     , RunInstancesRequest(..)+    , SecondaryPrivateIpAddressParam(..)     , SecurityGroup(..)     , SecurityGroupRequest(..)     , ShutdownBehavior(..)@@ -121,10 +128,14 @@     , InternetGatewayAttachmentState(..)     ) where +import Data.IP (IPv4, AddrRange) import Data.Text (Text) import Data.ByteString (ByteString) import Data.Time (UTCTime) +import AWS.Class+import AWS.Lib.FromText+ data Image = Image     { imageId :: Text     , imageLocation :: Text@@ -140,8 +151,8 @@     , imageStateReason :: Maybe StateReason     , imageViridianEnabled :: Maybe Bool     , imageOwnerAlias :: Maybe Text-    , imageName :: Text-    , imageDescription :: Text+    , imageName :: Maybe Text+    , imageDescription :: Maybe Text     , imageBillingProducts :: [Text]     , imageRootDeviceType :: RootDeviceType     , imageRootDeviceName :: Maybe Text@@ -150,7 +161,7 @@     , imageTagSet :: [ResourceTag]     , imageHypervisor :: Hypervisor     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AMIAttribute     = AMIDescription@@ -159,7 +170,7 @@     | AMILaunchPermission     | AMIProductCodes     | AMIBlockDeviceMapping-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AMIAttributeDescription = AMIAttributeDescription     { amiAttributeDescriptionImageId :: Text@@ -170,64 +181,64 @@     , amiAttributeDescriptionDescription :: Maybe Text     , amiAttributeDescriptionBlockDeviceMapping :: [BlockDeviceMapping]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data LaunchPermissionItem = LaunchPermissionItem     { launchPermissionItemGroup :: Text     , launchPermissionUserId :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ImageState     = ImageStateAvailable     | ImageStatePending     | ImageStateFailed-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ProductCode = ProductCode     { productCodeCode :: Text     , productCodeType :: ProductCodeType     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ProductCodeItem = ProductCodeItem     { productCodeItemProductCode :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ProductCodeType     = ProductCodeDevpay     | ProductCodeMarketplace-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ImageType     = ImageTypeMachine     | ImageTypeKernel     | ImageTypeRamDisk-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Platform     = PlatformWindows     | PlatformOther-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data StateReason = StateReason     { stateReasonCode :: Text     , stateReasonMessage :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RootDeviceType     = RootDeviceTypeEBS     | RootDeviceTypeInstanceStore-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data BlockDeviceMapping = BlockDeviceMapping     { blockDeviceMappingDeviceName :: Text     , blockDeviceMappingVirtualName :: Maybe Text     , blockDeviceMappingEbs :: Maybe EbsBlockDevice     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data EbsBlockDevice = EbsBlockDevice     { ebsSnapshotId :: Maybe Text@@ -235,34 +246,34 @@     , ebsDeleteOnTermination :: Bool     , ebsVolumeType :: VolumeType     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeType     = VolumeTypeStandard     | VolumeTypeIO1 Int-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VirtualizationType     = VirtualizationTypeParavirtual     | VirtualizationTypeHVM-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ResourceTag = ResourceTag     { resourceTagKey :: Text     , resourceTagValue :: Maybe Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Hypervisor     = HypervisorOVM     | HypervisorXen-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Region = Region     { regionName :: Text     , regionEndpoint :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AvailabilityZone = AvailabilityZone     { zoneName :: Text@@ -270,7 +281,7 @@     , zoneRegionName :: Text     , zoneMessageSet :: [AvailabilityZoneMessage]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  type AvailabilityZoneMessage = Text @@ -281,7 +292,7 @@     , reservationInstanceSet :: [Instance]     , reservationRequesterId :: Maybe Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Instance = Instance     { instanceId :: Text@@ -302,8 +313,8 @@     , instanceMonitoring :: InstanceMonitoringState     , instanceSubnetId :: Maybe Text     , instanceVpcId :: Maybe Text-    , instancePrivateIpAddress :: Maybe Text-    , instanceIpAddress :: Maybe Text+    , instancePrivateIpAddress :: Maybe IPv4+    , instanceIpAddress :: Maybe IPv4     , instanceSourceDestCheck :: Maybe Bool     , instancevpcGroupSet :: [Group]     , instanceStateReason :: Maybe StateReason@@ -321,7 +332,7 @@     , instanceIamInstanceProfile :: Maybe IamInstanceProfile     , instanceEbsOptimized :: Bool -- default: false     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatus = InstanceStatus     { instanceStatusInstanceId :: Text@@ -331,7 +342,7 @@     , instanceStatusSystemStatus :: InstanceStatusType     , instanceStatusInstanceStatus :: InstanceStatusType     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatusEvent = InstanceStatusEvent     { instanceStatusEventCode :: InstanceStatusEventCode@@ -339,34 +350,34 @@     , instanceStatusEventNotBefore :: Maybe UTCTime     , instanceStatusEventNotAfter :: Maybe UTCTime     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatusEventCode     = InstanceStatusEventCodeInstanceReboot     | InstanceStatusEventCodeInstanceStop     | InstanceStatusEventCodeSystemReboot     | InstanceStatusEventCodeInstanceRetirement-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatusType = InstanceStatusType     { instanceStatusTypeStatus :: InstanceStatusTypeStatus     , instanceStatusTypeDetails :: [InstanceStatusDetail]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatusTypeStatus     = InstanceStatusTypeStatusOK     | InstanceStatusTypeStatusImpaired     | InstanceStatusTypeStatusInsufficientData     | InstanceStatusTypeStatusNotApplicable-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStatusDetail = InstanceStatusDetail     { instanceStatusDetailName :: InstanceStatusDetailName     , instanceStatusDetailStatus :: InstanceStatusDetailStatus     , instanceStatusDetailImpairedSince :: Maybe UTCTime     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  type InstanceStatusDetailName = Text @@ -376,7 +387,7 @@     { groupId :: Text     , groupName :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceState     = InstanceStatePending@@ -386,28 +397,28 @@     | InstanceStateStopping     | InstanceStateStopped     | InstanceStateUnknown Int-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Placement = Placement     { placementAvailabilityZone :: Text     , placementGroupName :: Text     , placementTenancy :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceMonitoringState     = MonitoringDisabled     | MonitoringEnabled     | MonitoringPending-  deriving (Show, Eq)+  deriving (Show, Read, Eq) -data Architecture = I386 | X86_64 deriving (Show, Eq)+data Architecture = I386 | X86_64 deriving (Show, Read, Eq)  data InstanceBlockDeviceMapping = InstanceBlockDeviceMapping     { instanceBlockDeviceMappingDeviceName :: Text     , instanceBlockDeviceMappingEbs :: EbsInstanceBlockDevice     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data EbsInstanceBlockDevice = EbsInstanceBlockDevice     { ebsInstanceBlockDeviceVolumeId :: Text@@ -415,65 +426,68 @@     , ebsInstanceBlockDeviceAttachTime :: UTCTime     , ebsInstanceBlockDeviceDeleteOnTermination :: Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceLifecycle     = LifecycleSpot     | LifecycleNone-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceNetworkInterface = InstanceNetworkInterface     { instanceNetworkInterfaceId :: Text     , instanceNetworkInterfaceSubnetId :: Text     , instanceNetworkInterfaceVpcId :: Text-    , instanceNetworkInterfaceDescription :: Text+    , instanceNetworkInterfaceDescription :: Maybe Text     , instanceNetworkInterfaceOwnerId :: Text     , instanceNetworkInterfaceStatus :: Text-    , instanceNetworkInterfacePrivateIpAddress :: Text+    , instanceNetworkInterfacePrivateIpAddress :: IPv4     , instanceNetworkInterfacePrivateDnsName :: Maybe Text     , instanceNetworkInterfaceSourceDestCheck :: Bool     , instanceNetworkInterfaceGroupSet :: [Group]     , instanceNetworkInterfaceAttachment-        :: NetworkInterfaceAttachment+        :: InstanceNetworkInterfaceAttachment     , instanceNetworkInterfaceAssociation-        :: Maybe NetworkInterfaceAssociation-    , instanceNetworkInterfacePrivateIpAddressSet+        :: Maybe InstanceNetworkInterfaceAssociation+    , instanceNetworkInterfacePrivateIpAddressesSet         :: [InstancePrivateIpAddress]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq) -data NetworkInterfaceAttachment = NetworkInterfaceAttachment-    { networkInterfaceAttachmentId :: Text-    , networkInterfaceAttachmentDeviceIndex :: Int-    , networkInterfaceAttachmentStatus :: Text-    , networkInterfaceAttachmentAttachTime :: UTCTime-    , networkInterfaceAttachmentDeleteOnTermination :: Bool+data InstanceNetworkInterfaceAttachment = InstanceNetworkInterfaceAttachment+    { instanceNetworkInterfaceAttachmentId :: Text+    , instanceNetworkInterfaceAttachmentDeviceIndex :: Int+    , instanceNetworkInterfaceAttachmentStatus :: Text+    , instanceNetworkInterfaceAttachmentAttachTime :: UTCTime+    , instanceNetworkInterfaceAttachmentDeleteOnTermination+        :: Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq) -data NetworkInterfaceAssociation = NetworkInterfaceAssociation-    { networkInterfaceAssociationPublicIp :: Text-    , networkInterfaceAssociationIpOwnerId :: Text+data InstanceNetworkInterfaceAssociation+    = InstanceNetworkInterfaceAssociation+    { instanceNetworkInterfaceAssociationPublicIp :: Text+    , instanceNetworkInterfaceAssociationIpOwnerId :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstancePrivateIpAddress = InstancePrivateIpAddress-    { instancePrivateIpAddressAddress :: Text+    { instancePrivateIpAddressAddress :: IPv4     , instancePrivateIpAddressPrimary :: Bool-    , instancePrivateIpAddressAssociation :: Maybe NetworkInterfaceAssociation+    , instancePrivateIpAddressAssociation+        :: Maybe InstanceNetworkInterfaceAssociation     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data IamInstanceProfile = IamInstanceProfile     { iamInstanceProfileArn :: Text     , iamInstanceProfileId :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ShutdownBehavior     = ShutdownBehaviorStop     | ShutdownBehaviorTerminate-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceAttribute     = InstanceAttributeInstanceType Text@@ -488,32 +502,32 @@     | InstanceAttributeGroupSet [Text]     | InstanceAttributeProductCodes [ProductCode]     | InstanceAttributeEbsOptimized Bool-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Address = Address-    { addressPublicIp :: Text+    { addressPublicIp :: IPv4     , addressAllocationId :: Maybe Text     , addressDomain :: AddressDomain     , addressInstanceId :: Maybe Text     , addressAssociationId :: Maybe Text     , addressNetworkInterfaceId :: Maybe Text     , addressNetworkInterfaceOwnerId :: Maybe Text-    , addressPrivateIpAddress :: Maybe Text+    , addressPrivateIpAddress :: Maybe IPv4     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AddressDomain = AddressDomainStandard | AddressDomainVPC-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AllocateAddress = AllocateAddress-    { allocateAddressPublicIp :: Text+    { allocateAddressPublicIp :: IPv4     , allocateAddressDomain :: AddressDomain     , allocateAddressAllocationId :: Maybe Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data EC2Return = EC2Success | EC2Error Text-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Tag = Tag     { tagResourceId :: Text@@ -521,14 +535,14 @@     , tagKey :: Text     , tagValue :: Maybe Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceStateChange = InstanceStateChange     { instanceStateChangeInstanceId :: Text     , instanceStateChangeCurrentState :: InstanceState     , instanceStateChangePreviousState :: InstanceState     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ConsoleOutput = ConsoleOutput     { consoleOutputInstanceId :: Text@@ -536,7 +550,7 @@         -- ^ The time the data was last updated.     , consoleOutputOutput :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data PasswordData = PasswordData     { passwordDataInstanceId :: Text@@ -544,7 +558,7 @@       -- ^ The time the data was last updated.     , passwordDataPasswordData :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Snapshot = Snapshot     { snapshotId :: Text@@ -558,13 +572,13 @@     , snapshotOwnerAlias :: Maybe Text     , snapshotTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data SnapshotStatus     = SnapshotPending     | SnapshotCompleted     | SnapshotError-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Volume = Volume     { volumeId :: Text@@ -577,7 +591,7 @@     , volumeTagSet :: [ResourceTag]     , volumeVolumeType :: VolumeType     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeState     = VolumeStateCreating@@ -586,7 +600,7 @@     | VolumeStateDeleting     | VolumeStateDeleted     | VolumeStateError-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AttachmentSetItemResponse = AttachmentSetItemResponse     { attachmentSetItemResponseVolumeId :: Text@@ -597,20 +611,20 @@     , attachmentSetItemResponseAttachTime :: UTCTime     , attachmentSetItemResponseDeleteOnTermination :: Maybe Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AttachmentSetItemResponseStatus     = AttachmentSetItemResponseStatusAttaching     | AttachmentSetItemResponseStatusAttached     | AttachmentSetItemResponseStatusDetaching     | AttachmentSetItemResponseStatusDetached-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data KeyPair = KeyPair     { keyPairName :: Text     , keyPairFingerprint :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data SecurityGroup = SecurityGroup     { securityGroupOwnerId :: Text@@ -622,28 +636,23 @@     , securityGroupIpPermissionsEgress :: [IpPermission]     , securityGroupTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data IpPermission = IpPermission     { ipPermissionIpProtocol :: Text     , ipPermissionFromPort :: Maybe Int     , ipPermissionToPort :: Maybe Int     , ipPermissionGroups :: [UserIdGroupPair]-    , ipPermissionIpRanges :: [IpRange]+    , ipPermissionIpRanges :: [AddrRange IPv4]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data UserIdGroupPair = UserIdGroupPair     { userIdGroupPairUserId :: Maybe Text     , userIdGroupPairGroupId :: Text     , userIdGroupPairGroupName :: Maybe Text     }-  deriving (Show, Eq)--data IpRange = IpRange-    { ipRangeCidrIp :: Text-    }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data BlockDeviceMappingParam     = BlockDeviceMappingParamEbs@@ -661,24 +670,42 @@         , blockDeviceMappingParamInstanceStoreVirtualName             :: Maybe Text         }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data EbsSource     = EbsSourceSnapshotId Text     | EbsSourceVolumeSize Int-  deriving (Show, Eq)+  deriving (Show, Read, Eq) -data NetworkInterfaceParam = NetworkInterfaceParam-    { networkInterfaceParamInterfaceId :: Maybe Text-    , networkInterfaceParamDeviceIndex :: Maybe Text-    , networkInterfaceParamSubnetId :: Maybe Text-    , networkInterfaceParamDescription :: Maybe Text-    , networkInterfaceParamPrivateIpAddresses :: [Text]-    , networkInterfaceParamSecurityGroupIds :: [Text]-    , networkInterfaceParamDeleteOnTermination :: Maybe Bool-    }-  deriving (Show, Eq)+data NetworkInterfaceParam+    = NetworkInterfaceParamCreate+        { networkInterfaceParamCreateDeviceIndex :: Int+        , networkInterfaceParamCreateSubnetId :: Text+        , networkInterfaceParamCreateDescription :: Text+        , networkInterfaceParamCreatePrivateIpAddress+            :: Maybe IPv4+        , networkInterfaceParamCreatePrivateIpAddresses+            :: SecondaryPrivateIpAddressParam+        , networkInterfaceParamCreateSecurityGroupIds :: [Text]+        , networkInterfaceParamCreateDeleteOnTermination :: Bool+        }+    | NetworkInterfaceParamAttach+        { networkInterfaceParamAttachInterfaceId :: Text+        , networkInterfaceParamAttachDeviceIndex :: Int+        , networkInterfaceParamAttachDeleteOnTermination :: Bool+        }+  deriving (Show, Read, Eq) +data SecondaryPrivateIpAddressParam+    = SecondaryPrivateIpAddressParamNothing+    | SecondaryPrivateIpAddressParamCount Int+    | SecondaryPrivateIpAddressParamSpecified+      { secondaryPrivateIpAddressParamSpecifiedAddresses :: [IPv4]+      , secondaryPrivateIpAddressParamSpecifiedPrimary+        :: Maybe Int+      }+  deriving (Show, Read, Eq)+ data VpnConnection = VpnConnection     { vpnConnectionId :: Text     , vpnConnectionState :: VpnConnectionState@@ -691,50 +718,50 @@     , vpnConnectionOptions :: Maybe VpnConnectionOptionsRequest     , vpnConnectionRoutes :: Maybe VpnStaticRoute     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnConnectionState     = VpnConnectionStatePending     | VpnConnectionStateAvailable     | VpnConnectionStateDeleting     | VpnConnectionStateDeleted-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnTunnelTelemetry = VpnTunnelTelemetry-    { vpnTunnelTelemetryOutsideIpAddress :: Text+    { vpnTunnelTelemetryOutsideIpAddress :: IPv4     , vpnTunnelTelemetryStatus :: VpnTunnelTelemetryStatus     , vpnTunnelTelemetryLastStatusChange :: UTCTime     , vpnTunnelTelemetryStatusMessage :: Text     , vpnTunnelTelemetryAcceptRouteCount :: Int     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnTunnelTelemetryStatus     = VpnTunnelTelemetryStatusUp     | VpnTunnelTelemetryStatusDown-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnConnectionOptionsRequest = VpnConnectionOptionsRequest     { vpnConnectionOptionsRequestStaticRoutesOnly :: Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnStaticRoute = VpnStaticRoute     { vpnStaticRouteDestinationCidrBlock :: Text     , vpnStaticRouteSource :: VpnStaticRouteSource     , vpnStaticRouteState :: VpnStaticRouteState     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnStaticRouteSource = VpnStaticRouteSourceStatic-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnStaticRouteState     = VpnStaticRouteStatePending     | VpnStaticRouteStateAvailable     | VpnStaticRouteStateDeleting     | VpnStaticRouteStateDeleted-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RunInstancesRequest = RunInstancesRequest     { runInstancesRequestImageId :: Text -- ^ Required@@ -760,15 +787,15 @@     , runInstancesRequestDisableApiTermination :: Maybe Bool     , runInstancesRequestShutdownBehavior         :: Maybe ShutdownBehavior-    , runInstancesRequestPrivateIpAddress :: Maybe Text+    , runInstancesRequestPrivateIpAddress :: Maybe IPv4     , runInstancesRequestClientToken :: Maybe Text-    , runInstancesRequestNetworkInterface-        :: [NetworkInterfaceParam] -- ^ XXX: not implemented+    , runInstancesRequestNetworkInterfaces+        :: [NetworkInterfaceParam]     , runInstancesRequestIamInstanceProfile         :: Maybe IamInstanceProfile     , runInstancesRequestEbsOptimized :: Maybe Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InstanceAttributeRequest     = InstanceAttributeRequestInstanceType@@ -789,7 +816,7 @@     = ResetInstanceAttributeRequestKernel     | ResetInstanceAttributeRequestRamdisk     | ResetInstanceAttributeRequestSourceDestCheck-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data ModifyInstanceAttributeRequest     = ModifyInstanceAttributeRequestInstanceType Text@@ -805,7 +832,7 @@     | ModifyInstanceAttributeRequestSourceDestCheck Bool     | ModifyInstanceAttributeRequestGroupSet [Text]     | ModifyInstanceAttributeRequestEbsOptimized Bool-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RegisterImageRequest = RegisterImageRequest     { registerImageRequestName :: Text@@ -818,7 +845,7 @@     , registerImageRequestBlockDeviceMappings         :: [BlockDeviceMappingParam]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data CreateVolumeRequest     = CreateNewVolume@@ -832,11 +859,11 @@         , createFromSnapshotSize :: Maybe Int         , createFromSnapshotVolumeType :: Maybe VolumeType         }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AssociateAddressRequest     = AssociateAddressRequestEc2-        { associateAddressRequestEc2PublicIp :: Text+        { associateAddressRequestEc2PublicIp :: IPv4         , associateAddressRequestEc2InstanceId :: Text         }     | AssociateAddressRequestVpc@@ -844,43 +871,43 @@         , associateAddressRequestVpcInstanceId :: Maybe Text         , associateAddressRequestVpcNetworkInterfaceId             :: Maybe Text-        , associateAddressRequestVpcPrivateIpAddress :: Maybe Text+        , associateAddressRequestVpcPrivateIpAddress :: Maybe IPv4         , associateAddressRequestVpcAllowReassociation             :: Maybe Bool         }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data DisassociateAddressRequest-    = DisassociateAddressRequestEc2 Text -- ^ PublicIp for EC2-    | DisassociateAddressRequestVpc Text+    = DisassociateAddressRequestEc2 IPv4 -- ^ PublicIp for EC2+    | DisassociateAddressRequestVpc IPv4       -- ^ AssociationId for VPC-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data SecurityGroupRequest     = SecurityGroupRequestGroupId Text     | SecurityGroupRequestGroupName Text-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Subnet = Subnet     { subnetId :: Text     , subnetState :: SubnetState     , subnetVpicId :: Text-    , subnetCidrBlock :: Text+    , subnetCidrBlock :: AddrRange IPv4     , subnetAvailableIpAddressCount :: Int     , subnetAvailabilityZone :: Text     , subnetTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data SubnetState = SubnetStatePending | SubnetStateAvailable-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data CreateSubnetRequest = CreateSubnetRequest     { createSubnetRequestVpcId :: Text-    , createSubnetRequestCidrBlock :: Text+    , createSubnetRequestCidrBlock :: AddrRange IPv4     , createSubnetRequestAvailabilityZone :: Maybe Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatus = VolumeStatus     { volumeStatusVolumeId :: Text@@ -889,25 +916,25 @@     , volumeStatusEventSet :: [VolumeStatusEvent]     , volumeStatusActionSet :: [VolumeStatusAction]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatusInfo = VolumeStatusInfo     { volumeStatusInfoStatus :: VolumeStatusInfoStatus     , volumeStatusInfoDetails :: [VolumeStatusDetail]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatusInfoStatus     = VolumeStatusInfoStatusOK     | VolumeStatusInfoStatusImpaired     | VolumeStatusInfoStatusInsufficientData-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatusDetail = VolumeStatusDetail     { volumeStatusDetailName :: Text     , volumeStatusDetailStatus :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatusEvent = VolumeStatusEvent     { volumeStatusEventType :: Text@@ -916,7 +943,7 @@     , volumeStatusEventNotBefore :: Maybe UTCTime     , volumeStatusEventNotAfter :: Maybe UTCTime     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeStatusAction = VolumeStatusAction     { volumeStatusActionCode :: Text@@ -924,17 +951,17 @@     , volumeStatusActionEventId :: Text     , volumeStatusActionDescription :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeAttribute     = VolumeAttributeAutoEnableIO Bool     | VolumeAttributeProductCodes [ProductCode]-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VolumeAttributeRequest     = VolumeAttributeRequestAutoEnableIO     | VolumeAttributeRequestProductCodes-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data NetworkAcl = NetworkAcl     { networkAclId :: Text@@ -944,7 +971,7 @@     , networkAclAssociationSet :: [NetworkAclAssociation]     , networkAclTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data NetworkAclEntry = NetworkAclEntry     { networkAclEntryRuleNumber :: Int@@ -955,31 +982,31 @@     , networkAclEntryIcmpTypeCode :: Maybe IcmpTypeCode     , networkAclEntryPortRange :: Maybe PortRange     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data NetworkAclRuleAction     = NetworkAclRuleActionAllow     | NetworkAclRuleActionDeny-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data IcmpTypeCode = IcmpTypeCode     { icmpTypeCodeCode :: Int     , icmpTypeCodeType :: Int     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data PortRange = PortRange     { portRangeFrom :: Int     , portRangeTo :: Int     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data NetworkAclAssociation = NetworkAclAssociation     { networkAclAssociationId :: Text     , networkAclAssociationNetworkAclId :: Text     , networkAclAssociationSubnetId :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data NetworkAclEntryRequest = NetworkAclEntryRequest     { networkAclEntryRequestNetworkAclId :: Text@@ -992,7 +1019,7 @@     , networkAclEntryRequestIcmp :: Maybe IcmpTypeCode     , networkAclEntryRequestPortRange :: Maybe PortRange     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RouteTable = RouteTable     { routeTableId :: Text@@ -1002,7 +1029,7 @@     , routeTablePropagatingVgw :: Maybe PropagatingVgw     , routeTableTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Route = Route     { routeDestinationCidrBlock :: Text@@ -1013,16 +1040,16 @@     , routeState :: RouteState     , routeOrigin :: Maybe RouteOrigin     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RouteState = RouteStateActive | RouteStateBlackhole-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RouteOrigin     = RouteOriginCreateRouteTable     | RouteOriginCreateRoute     | RouteOriginTableEnableVgwRoutePropagation-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data RouteTableAssociation = RouteTableAssociation     { routeTableAssociationId :: Text@@ -1030,22 +1057,22 @@     , routeTableAssociationSubnetId :: Maybe Text     , routeTableAssociationMain :: Maybe Bool     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  type PropagatingVgw = Text  data Vpc = Vpc     { vpcId :: Text     , vpcState :: VpcState-    , vpcCidrBlock :: Text+    , vpcCidrBlock :: AddrRange IPv4     , vpcDhcpOptionsId :: Text     , vpcTagSet :: [ResourceTag]     , vpcInstanceTenancy :: Text     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpcState = VpcStatePending | VpcStateAvailable-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnGateway = VpnGateway     { vpnGatewayId :: Text@@ -1055,27 +1082,27 @@     , vpnGatewayAttachments :: [Attachment]     , vpnGatewayTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data VpnGatewayState     = VpnGatewayStatePending     | VpnGatewayStateAvailable     | VpnGatewayStateDeleting     | VpnGatewayStateDeleted-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data Attachment = Attachment     { attachmentVpcId :: Text     , attachmentState :: AttachmentState     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data AttachmentState     = AttachmentStateAttaching     | AttachmentStateAttached     | AttachmentStateDetaching     | AttachmentStateDetached-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data CreateVpnGatewayType = CreateVpnGatewayTypeIpsec1 @@ -1083,31 +1110,31 @@     { customerGatewayId :: Text     , customerGatewayState :: CustomerGatewayState     , customerGatewayType :: Text-    , customerGatewayIpAddress :: Text+    , customerGatewayIpAddress :: IPv4     , customerGatewayBgpAsn :: Int     , customerGatewayTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data CustomerGatewayState     = CustomerGatewayStatePending     | CustomerGatewayStateAvailable     | CustomerGatewayStateDeleting     | CustomerGatewayStateDeleted-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InternetGateway = InternetGateway     { internetGatewayInternetGatewayId :: Text     , internetGatewayAttachmentSet :: [InternetGatewayAttachment]     , internetGatewayTagSet :: [ResourceTag]     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InternetGatewayAttachment = InternetGatewayAttachment     { internetGatewayAttachmentVpcId :: Text     , internetGatewayAttachmentState :: InternetGatewayAttachmentState     }-  deriving (Show, Eq)+  deriving (Show, Read, Eq)  data InternetGatewayAttachmentState     = InternetGatewayAttachmentStateAttaching@@ -1115,4 +1142,149 @@     | InternetGatewayAttachmentStateDetaching     | InternetGatewayAttachmentStateDetached     | InternetGatewayAttachmentStateAvailable-  deriving (Show, Eq)+  deriving (Show, Read, Eq)++data NetworkInterface = NetworkInterface+    { networkInterfaceId :: Text+    , networkInterfaceSubnetId :: Text+    , networkInterfaceVpcId :: Text+    , networkInterfaceAvailabilityZone :: Text+    , networkInterfaceDescription :: Text+    , networkInterfaceOwnerId :: Text+    , networkInterfaceRequesterId :: Maybe Text+    , networkInterfaceRequesterManaged :: Text+    , networkInterfaceStatus :: NetworkInterfaceStatus+    , networkInterfaceMacAddress :: Text+    , networkInterfacePrivateIpAddress :: IPv4+    , networkInterfacePrivateDnsName :: Maybe Text+    , networkInterfaceSourceDestCheck :: Bool+    , networkInterfaceGroupSet :: [Group]+    , networkInterfaceAttachment+        :: Maybe NetworkInterfaceAttachment+    , networkInterfaceAssociation+        :: Maybe NetworkInterfaceAssociation+    , networkInterfaceTagSet :: [ResourceTag]+    , networkInterfacePrivateIpAddressesSet+        :: [NetworkInterfacePrivateIpAddress]+    }+  deriving (Show, Read, Eq)++type Filter = (Text, [Text])++data NetworkInterfaceStatus+    = NetworkInterfaceStatusAvailable+    | NetworkInterfaceStatusInUse+  deriving (Show, Read, Eq)++data NetworkInterfaceAttachment = NetworkInterfaceAttachment+    { networkInterfaceAttachmentId :: Text+    , networkInterfaceAttachmentInstanceId :: Maybe Text+    , networkInterfaceAttachmentInstanceOwnerId :: Text+    , networkInterfaceAttachmentDeviceIndex :: Int+    , networkInterfaceAttachmentStatus :: Text+    , networkInterfaceAttachmentAttachTime :: UTCTime+    , networkInterfaceAttachmentDeleteOnTermination :: Bool+    }+  deriving (Show, Read, Eq)++data NetworkInterfaceAssociation = NetworkInterfaceAssociation+    { networkInterfaceAssociationAttachmentId :: Maybe Text+    , networkInterfaceAssociationInstanceId :: Maybe Text+    , networkInterfaceAssociationPublicIp :: IPv4+    , networkInterfaceAssociationIpOwnerId :: Text+    , networkInterfaceAssociationId :: Text+    }+  deriving (Show, Read, Eq)++data NetworkInterfacePrivateIpAddress+    = NetworkInterfacePrivateIpAddress+    { networkInterfacePrivateIpAddressPrivateIpAddress :: IPv4+    , networkInterfacePrivateIpAddressPrimary :: Bool+    , networkInterfacePrivateIpAddressAssociation+        :: Maybe NetworkInterfaceAssociation+    }+  deriving (Show, Read, Eq)++instance FromText Platform+  where+    fromMaybeText Nothing  = return PlatformOther+    fromMaybeText (Just t)+        | t == "windows" = return PlatformWindows+        | otherwise      = return PlatformOther++instance FromText AddressDomain+  where+    fromMaybeText Nothing  = return AddressDomainStandard+    fromMaybeText (Just t)+        | t == "standard" = return AddressDomainStandard+        | t == "vpc"      = return AddressDomainVPC+        | otherwise       = monadThrow $ TextConversionException t++instance FromText EC2Return+  where+    fromTextMay t+        | t == "true" = Just EC2Success+        | otherwise   = Just $ EC2Error t++instance FromText InstanceLifecycle+  where+    fromMaybeText Nothing  = return LifecycleNone+    fromMaybeText (Just t)+        | t == "spot" = return LifecycleSpot+        | otherwise   = monadThrow $ TextConversionException t++deriveFromText "ImageState" ["available", "pending", "failed"]+deriveFromText "ProductCodeType" ["devpay", "marketplace"]+deriveFromText "ImageType" ["machine", "kernel", "ramdisk"]+deriveFromText "RootDeviceType" ["ebs", "instance-store"]+deriveFromText "VirtualizationType" ["paravirtual", "hvm"]+deriveFromText "Hypervisor" ["ovm", "xen"]+deriveFromText "InstanceStatusEventCode"+    [ "instance-reboot"+    , "instance-stop"+    , "system-reboot"+    , "instance-retirement"+    ]+deriveFromText "InstanceStatusTypeStatus"+    ["ok", "impaired", "insufficient-data", "not-applicable"]+deriveFromText "InstanceMonitoringState"+    ["disabled", "enabled", "pending"]+deriveFromText "Architecture" ["i386", "x86_64"]+deriveFromText "SnapshotStatus" ["pending", "completed", "error"]+deriveFromText "VolumeState"+    [ "creating"+    , "available"+    , "in-use"+    , "deleting"+    , "deleted"+    , "error"+    ]+deriveFromText "AttachmentSetItemResponseStatus"+    ["attaching", "attached", "detaching", "detached"]+deriveFromText "ShutdownBehavior" ["stop", "terminate"]+deriveFromText "VpnConnectionState"+    ["pending", "available", "deleting", "deleted"]+deriveFromText "VpnTunnelTelemetryStatus" ["UP", "DOWN"]+deriveFromText "VpnStaticRouteSource" ["Static"]+deriveFromText "VpnStaticRouteState"+    ["pending", "available", "deleting", "deleted"]+deriveFromText "SubnetState" ["pending", "available"]+deriveFromText "VolumeStatusInfoStatus"+    ["ok", "impaired", "insufficient-data"]+deriveFromText "NetworkAclRuleAction" ["allow", "deny"]+deriveFromText "RouteState" ["active", "blackhole"]+deriveFromText "RouteOrigin"+    [ "CreateRouteTable"+    , "CreateRoute"+    , "EnableVgwRoutePropagation"+    ]+deriveFromText "VpcState" ["pending", "available"]+deriveFromText "VpnGatewayState"+    ["pending", "available", "deleting", "deleted"]+deriveFromText "AttachmentState"+    ["attaching", "attached", "detaching", "detached"]+deriveFromText "CustomerGatewayState"+    ["pending", "available", "deleting", "deleted"]+deriveFromText "InternetGatewayAttachmentState"+    ["attaching", "attached", "detaching", "detached", "available"]+deriveFromText "NetworkInterfaceStatus" ["available", "in-use"]
AWS/EC2/Util.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleContexts, ScopedTypeVariables #-}  module AWS.EC2.Util     ( list@@ -8,6 +8,8 @@     , wait     , count     , findTag+    , sleep+    , retry     ) where  import Data.Conduit@@ -22,6 +24,8 @@ import Control.Applicative 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))@@ -111,3 +115,20 @@ findTag key tags = find f tags   where     f t = resourceTagKey t == key++sleep :: MonadIO m => Int -> EC2 m ()+sleep sec = liftIO $ CC.threadDelay $ sec * 1000 * 1000++retry+    :: forall m a. (MonadBaseControl IO m, MonadResource m)+    => Int -- ^ sleep count+    -> Int -- ^ number of retry+    -> EC2 m a+    -> EC2 m a+retry _   0   f = f+retry sec cnt f = f `E.catch` handler+  where+    handler :: E.SomeException -> EC2 m a+    handler _ = do+        sleep sec+        retry sec (cnt - 1) f
AWS/EC2/VPC.hs view
@@ -19,13 +19,12 @@     ) 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.Convert import AWS.EC2.Internal import AWS.EC2.Types import AWS.EC2.Query@@ -43,8 +42,7 @@     -> Text -- ^ VpcId     -> EC2 m Bool attachInternetGateway internetGatewayId vid =-    ec2Query "AttachInternetGateway" params $-        getF "return" textToBool+    ec2Query "AttachInternetGateway" params $ getT "return"   where     params =         [ ValueParam "InternetGatewayId" internetGatewayId@@ -59,8 +57,7 @@     -> Text -- ^ VpcId     -> EC2 m Bool detachInternetGateway internetGatewayId vid =-    ec2Query "DetachInternetGateway" params $-        getF "return" textToBool+    ec2Query "DetachInternetGateway" params $ getT "return"   where     params =         [ ValueParam "InternetGatewayId" internetGatewayId@@ -113,7 +110,7 @@     => GLSink Event m InternetGatewayAttachment internetGatewayAttachmentSink = InternetGatewayAttachment     <$> getT "vpcId"-    <*> getF "state" internetGatewayAttachmentState'+    <*> getT "state" describeVpnConnections     :: (MonadBaseControl IO m, MonadResource m)     => [Text] -- ^ VpnConnectionIds@@ -133,7 +130,7 @@     <$> do         a <- getT "vpnConnectionId"         traceShow a $ return a-    <*> getF "state" vpnConnectionState'+    <*> getT "state"     <*> getT "customerGatewayConfiguration"     <*> getT "type"     <*> getT "customerGatewayId"@@ -142,20 +139,20 @@     <*> itemsSet "vgwTelemetry"         (VpnTunnelTelemetry         <$> getT "outsideIpAddress"-        <*> getF "status" vpnTunnelTelemetryStatus'-        <*> getF "lastStatusChange" textToTime+        <*> getT "status"+        <*> getT "lastStatusChange"         <*> getT "statusMessage"-        <*> getF "acceptedRouteCount" textToInt+        <*> getT "acceptedRouteCount"         )     <*> elementM "options"         (VpnConnectionOptionsRequest-        <$> getF "staticRoutesOnly" textToBool+        <$> getT "staticRoutesOnly"         )     <*> elementM "routes"         (VpnStaticRoute         <$> getT "destinationCidrBlock"-        <*> getF "source" vpnStaticRouteSource'-        <*> getF "state" vpnStaticRouteState'+        <*> getT "source"+        <*> getT "state"         )  ------------------------------------------------------------@@ -179,7 +176,7 @@     => GLSink Event m Vpc vpcSink = Vpc     <$> getT "vpcId"-    <*> getF "state" vpcState'+    <*> getT "state"     <*> getT "cidrBlock"     <*> getT "dhcpOptionsId"     <*> resourceTagSink@@ -190,7 +187,7 @@ ------------------------------------------------------------ createVpc     :: (MonadResource m, MonadBaseControl IO m)-    => Text -- ^ CidrBlock+    => AddrRange IPv4 -- ^ CidrBlock     -> Maybe Text -- ^ instanceTenancy     -> EC2 m Vpc createVpc cidrBlock instanceTenancy =@@ -198,7 +195,7 @@         element "vpc" vpcSink   where     params =-        [ ValueParam "CidrBlock" cidrBlock+        [ ValueParam "CidrBlock" $ toText cidrBlock         ] ++ maybeParams [ ("instanceTenancy", instanceTenancy) ]  ------------------------------------------------------------@@ -231,9 +228,9 @@     => GLSink Event m VpnGateway vpnGatewaySink = VpnGateway     <$> getT "vpnGatewayId"-    <*> getF "state" vpnGatewayState'+    <*> getT "state"     <*> getT "type"-    <*> getMT "availabilityZone"+    <*> getT "availabilityZone"     <*> itemsSet "attachments" attachmentSink     <*> resourceTagSink @@ -241,7 +238,7 @@     => GLSink Event m Attachment attachmentSink = Attachment     <$> getT "vpcId"-    <*> getF "state" attachmentState'+    <*> getT "state"  ------------------------------------------------------------ -- createVpnGateway@@ -289,10 +286,10 @@     => GLSink Event m CustomerGateway customerGatewaySink = CustomerGateway     <$> getT "customerGatewayId"-    <*> getF "state" customerGatewayState'+    <*> getT "state"     <*> getT "type"     <*> getT "ipAddress"-    <*> getF "bgpAsn" textToInt+    <*> getT "bgpAsn"     <*> resourceTagSink  ------------------------------------------------------------@@ -301,7 +298,7 @@ createCustomerGateway     :: (MonadResource m, MonadBaseControl IO m)     => Text -- ^ Type-    -> Text -- ^ IpAddress+    -> IPv4 -- ^ IpAddress     -> Int -- ^ BgpAsn     -> EC2 m CustomerGateway createCustomerGateway type' ipAddr bgpAsn = do@@ -310,7 +307,7 @@   where     params =         [ ValueParam "Type" type' -        , ValueParam "IpAddress" ipAddr+        , ValueParam "IpAddress" $ toText ipAddr         , ValueParam "BgpAsn" (toText bgpAsn)         ] 
AWS/EC2/Volume.hs view
@@ -18,7 +18,6 @@ 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@@ -43,11 +42,11 @@     => GLSink Event m Volume volumeSink = Volume     <$> getT "volumeId"-    <*> getF "size" textToInt-    <*> getMT "snapshotId"+    <*> getT "size"+    <*> getT "snapshotId"     <*> getT "availabilityZone"-    <*> getF "status" volumeStatus'-    <*> getF "createTime" textToTime+    <*> getT "status"+    <*> getT "createTime"     <*> itemsSet "attachmentSet" attachmentSink     <*> resourceTagSink     <*> volumeTypeSink@@ -57,9 +56,9 @@     <$> getT "volumeId"     <*> getT "instanceId"     <*> getT "device"-    <*> getF "status" attachmentSetItemResponseStatus'-    <*> getF "attachTime" textToTime-    <*> getM "deleteOnTermination" (textToBool <$>)+    <*> getT "status"+    <*> getT "attachTime"+    <*> getT "deleteOnTermination"  volumeTypeParam :: VolumeType -> [QueryParam] volumeTypeParam VolumeTypeStandard =@@ -149,7 +148,7 @@     <$> getT "volumeId"     <*> getT "availabilityZone"     <*> element "volumeStatus" (VolumeStatusInfo-        <$> getF "status" volumeStatusInfoStatus'+        <$> getT "status"         <*> itemsSet "details" (VolumeStatusDetail             <$> getT "name"             <*> getT "status"@@ -159,8 +158,8 @@         <$> getT "eventType"         <*> getT "eventId"         <*> getT "description"-        <*> getM "notBefore" (textToTime <$>)-        <*> getM "notAfter" (textToTime <$>)+        <*> getT "notBefore"+        <*> getT "notAfter"         )     <*> itemsSet "actionsSet" (VolumeStatusAction         <$> getT "code"@@ -175,7 +174,7 @@     -> Bool -- ^ AutoEnableIO     -> EC2 m Bool modifyVolumeAttribute vid enable =-    ec2Query "ModifyVolumeAttribute" params returnBool+    ec2Query "ModifyVolumeAttribute" params $ getT "return"   where     params =         [ ValueParam "VolumeId" vid@@ -187,7 +186,7 @@     => Text -- ^ VolumeId     -> EC2 m Bool enableVolumeIO vid =-    ec2Query "EnableVolumeIO" params returnBool+    ec2Query "EnableVolumeIO" params $ getT "return"   where     params = [ValueParam "VolumeId" vid] @@ -215,8 +214,7 @@     -> GLSink Event m VolumeAttribute volumeAttributeSink VolumeAttributeRequestAutoEnableIO     = VolumeAttributeAutoEnableIO-    <$> element "autoEnableIO"-        (getF "value" textToBool)+    <$> element "autoEnableIO" (getT "value") volumeAttributeSink VolumeAttributeRequestProductCodes     = VolumeAttributeProductCodes     <$> productCodeSink
AWS/ELB.hs view
@@ -18,7 +18,7 @@ import Data.Monoid  import AWS.Class-import AWS.Util+import AWS.Lib.Query (textToBS)  import AWS import AWS.ELB.Internal
AWS/ELB/LoadBalancer.hs view
@@ -10,7 +10,6 @@ import Control.Monad.Trans.Control (MonadBaseControl) import Data.XML.Types (Event(..)) -import AWS.Util import AWS.Lib.Parser import AWS.Lib.Query @@ -34,26 +33,26 @@     LoadBalancerDescription     <$> members "SecurityGroups" text     <*> getT "LoadBalancerName"-    <*> getF "CreatedTime" textToTime+    <*> getT "CreatedTime"     <*> element "HealthCheck"         (HealthCheck-        <$> getF "Interval" textToInt+        <$> getT "Interval"         <*> getT "Target"-        <*> getF "HealthyThreshold" textToInt-        <*> getF "Timeout" textToInt-        <*> getF "UnhealthyThreshold" textToInt+        <*> getT "HealthyThreshold"+        <*> getT "Timeout"+        <*> getT "UnhealthyThreshold"         )-    <*> getMT "VPCId"+    <*> getT "VPCId"     <*> members "ListenerDescriptions"         (ListenerDescription         <$> members "PolicyNames" text         <*> element "Listener"             (Listener             <$> getT "Protocol"-            <*> getF "LoadBalancerPort" textToInt+            <*> getT "LoadBalancerPort"             <*> getT "InstanceProtocol"-            <*> getMT "SSLCertificateId"-            <*> getF "InstancePort" textToInt+            <*> getT "SSLCertificateId"+            <*> getT "InstancePort"             )         )     <*> members "Instances"@@ -68,7 +67,7 @@         <*> members "OtherPolicies" text         <*> members "LBCookieStickinessPolicies"             (LBCookieStickinessPolicy-            <$> getF "CookieExpirationPeriod" textToInt+            <$> getT "CookieExpirationPeriod"             <*> getT "PolicyName"             )         )@@ -84,7 +83,7 @@     <*> getT "DNSName"     <*> members "BackendServerDescriptions"         (BackendServerDescription-        <$> getF "InstancePort" textToInt+        <$> getT "InstancePort"         <*> members "PolicyNames" text         )     <*> members "Subnets" text
− AWS/Lib/Convert.hs
@@ -1,24 +0,0 @@-{-# LANGUAGE RankNTypes, OverloadedStrings, TemplateHaskell #-}--module AWS.Lib.Convert-    where--import Language.Haskell.TH-import Control.Applicative ((<$>))-import Data.Text (Text)--import AWS.Util--mkConvertFunc :: String -> Name -> [String] -> Q [Dec]-mkConvertFunc fs d strs = runQ $ do-  v <- newName "v"-  ctrs <- (\(TyConI (DataD [] _ [] x [])) -> map (\(NormalC name []) -> name) x)-          <$> reify d-  return $-      [ SigD (mkName fs) (AppT (AppT ArrowT (ConT ''Text)) (ConT d))-      , FunD (mkName fs) [Clause [VarP v] (NormalB-        (CaseE (VarE v)-           $ (map (\(s,t) -> Match (LitP (StringL s)) (NormalB (ConE t)) []) $ zip strs ctrs)-           ++ [Match WildP (NormalB (AppE (AppE (VarE 'err) (LitE (StringL $ show d))) (LitE (StringL $ show v)))) []])-      ) []]-      ]
+ AWS/Lib/FromText.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE RankNTypes, OverloadedStrings, TemplateHaskell, FlexibleInstances #-}++module AWS.Lib.FromText+    where++import Control.Applicative ((<$>))+import Control.Monad+import Data.Conduit (MonadThrow)+import Data.IP (IPv4, AddrRange)+import Data.Text (Text)+import qualified Data.Text as T+import Data.Time (UTCTime)+import qualified Data.Time as Time+import qualified Data.Time.Parse as TP+import Language.Haskell.TH+import Safe++import AWS.Class++class Read a => FromText a+  where+    fromText :: MonadThrow m => Text -> m a+    fromText t+        = maybe (monadThrow $ TextConversionException t) return+        . fromTextMay+        $ t++    fromTextMay :: Text -> Maybe a+    fromTextMay = readMay . T.unpack++    fromMaybeText :: MonadThrow m => Maybe Text -> m a+    fromMaybeText+        = maybe+            (monadThrow $ TextConversionException "no text")+            fromText++instance FromText a => FromText (Maybe a)+  where+    fromText = return . join . fromTextMay+    fromMaybeText Nothing  = return Nothing+    fromMaybeText (Just t) = fromText t >>= return . Just+    fromTextMay = Just . fromTextMay++instance FromText Int+instance FromText Integer+instance FromText Double+instance FromText IPv4+instance FromText (AddrRange IPv4)++instance FromText Text+  where+    fromTextMay = Just++instance FromText Bool+  where+    fromTextMay "true"  = Just True+    fromTextMay "false" = Just False+    fromTextMay _       = Nothing++instance FromText UTCTime+  where+    fromTextMay t+        = Time.localTimeToUTC Time.utc . fst+        <$> (TP.strptime fmt $ T.unpack t)+      where+        fmt = "%FT%T"++deriveFromText :: String -> [String] -> DecsQ+deriveFromText dstr strs = do+    ctrs <- map (\(NormalC name _) -> name) <$> cons+    x <- newName "x"+    let cases = caseE (varE x) (map f (zip strs ctrs) ++ [wild])+    let fun = funD 'fromTextMay [clause [varP x] (normalB cases) []]+    (:[]) <$> instanceD ctx typ [fun]+  where+    d = mkName dstr+    cons = do+        (TyConI (DataD _ _ _ cs _)) <- reify d+        return cs+    f (s, t) = match (litP $ stringL s) (normalB $ [|Just $(conE t)|]) []+    wild = match wildP (normalB [|Nothing|]) []+    typ = appT (conT ''FromText) (conT d)+    ctx = return []
AWS/Lib/Parser.hs view
@@ -1,11 +1,28 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE FlexibleContexts, RankNTypes, ScopedTypeVariables, FlexibleInstances #-}+{-# LANGUAGE UndecidableInstances #-}+ module AWS.Lib.Parser-    where+    ( RequestId+    , getT+    , getT_+    , element+    , elementM+    , listConduit+    , listConsumer+    , isBeginTagName+    , awaitWhile+    , sinkResponse+    , sinkResponseMetadata+    , sinkError+    , sinkEventBeginDocument+    , members+    , text+    , FromText(..)+    ) where  import Data.XML.Types (Event(..), Name(..)) import Data.Text (Text)-import qualified Data.Text as T+import Data.ByteString (ByteString) import Data.Conduit import qualified Data.Conduit.List as CL import qualified Text.XML.Stream.Parse as XML@@ -14,6 +31,7 @@ import Control.Monad.Trans.Class (lift)  import AWS.Class+import AWS.Lib.FromText  type RequestId = Text @@ -67,29 +85,17 @@         | f a       = return $ Just a         | otherwise = awaitWhile f -getF :: MonadThrow m-    => Text-    -> (Text -> b)-    -> Pipe Event Event o u m b-getF name f = tagContent name >>= return . f--getT :: MonadThrow m-    => Text-    -> Pipe Event Event o u m Text-getT name = getF name id--getM :: MonadThrow m+getT :: (MonadThrow m, FromText a)     => Text-    -> (Maybe Text -> b)-    -> Pipe Event Event o u m b-getM name f = tagContentM name >>= return . f+    -> Pipe Event Event o u m a+getT name = elementM name text >>= lift . fromMaybeText -getMT :: MonadThrow m+getT_ :: forall m o u . MonadThrow m     => Text-    -> Pipe Event Event o u m (Maybe Text)-getMT name = getM name id+    -> Pipe Event Event o u m ()+getT_ name = () <$ (getT name :: Pipe Event Event o u m Text) -elementM :: MonadThrow m+elementM :: forall o u m a . MonadThrow m     => Text     -> Pipe Event Event o u m a     -> Pipe Event Event o u m (Maybe a)@@ -99,22 +105,12 @@   where     g n = (nameLocalName n == name) -element :: MonadThrow m+element :: forall o u m a . MonadThrow m     => Text     -> Pipe Event Event o u m a     -> Pipe Event Event o u m a-element name inner = XML.force ("parse error:" ++ T.unpack name) $ elementM name inner--tagContentM :: MonadThrow m-    => Text-    -> GLSink Event m (Maybe Text)-tagContentM name = elementM name text--tagContent :: MonadThrow m-    => Text-    -> GLSink Event m Text-tagContent name =-    XML.force ("parse error:" ++ T.unpack name) $ tagContentM name+element name inner = elementM name inner >>=+    maybe (lift $ monadThrow $ ResponseParseError name) return  sinkResponse     :: MonadThrow m@@ -144,15 +140,13 @@         Just EventBeginDocument -> return ()         Just _ -> fail $ "unexpected: " <> show me -sinkError :: MonadThrow m => Int -> GLSink Event m a-sinkError status = element "ErrorResponse" $ do-    (_t,c,m) <- element "Error" $-        (,,)-        <$> getT "Type"-        <*> getT "Code"+sinkError :: MonadThrow m => ByteString -> Int -> GLSink Event m a+sinkError action status = element "ErrorResponse" $ do+    (c,m) <- element "Error" $ (,)+        <$> (getT_ "Type" *> getT "Code")         <*> getT "Message"     rid <- getT "RequestId"-    lift $ monadThrow $ ClientError status c m rid+    lift $ monadThrow $ ClientError action status c m rid  members :: MonadThrow m     => Text
AWS/Lib/Query.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE FlexibleContexts, RankNTypes, CPP #-} -#define DEBUG module AWS.Lib.Query     ( requestQuery     , QueryParam(..)@@ -10,12 +9,15 @@ #ifdef DEBUG     , debugQuery #endif+    , textToBS     ) where  import           Data.ByteString (ByteString) import qualified Data.ByteString as BS import           Data.ByteString.Lazy.Char8 () import qualified Data.ByteString.Char8 as BSC+import Data.Text (Text)+import qualified Data.Text as T  import Data.Monoid import Data.XML.Types (Event(..))@@ -33,7 +35,6 @@ import Control.Monad.IO.Class (MonadIO, liftIO) import Control.Monad.Trans.Class (lift) import Control.Exception.Lifted as E-import Data.Text (Text) import qualified Control.Monad.State as State import qualified Control.Monad.Reader as Reader @@ -41,13 +42,12 @@ import AWS.Util import AWS.Credential import AWS.Lib.Parser+import AWS.EC2.Types (Filter)  #ifdef DEBUG import qualified Data.Conduit.Binary as CB #endif -type Filter = (Text, [Text])- data QueryParam     = ArrayParams Text [Text]     | FilterParams [Filter]@@ -89,6 +89,9 @@     qheader = Map.fromList $ queryHeader action time cred ver     qparam = queryStr $ Map.unions (qheader : map toArrayParams params) +textToBS :: Text -> ByteString+textToBS = BSC.pack . T.unpack+ toArrayParams :: QueryParam -> Map ByteString ByteString toArrayParams (ArrayParams name params) = Map.fromList      [ (textToBS name <> "." <> bsShow i, textToBS param)@@ -155,7 +158,7 @@     -> ByteString     -> [QueryParam]     -> ByteString-    -> (Int -> GLSink Event m a)+    -> (ByteString -> Int -> GLSink Event m a)     -> m (ResumableSource m ByteString) requestQuery cred ctx action params ver errSink = do     let mgr = manager ctx@@ -170,7 +173,7 @@     if st < 400         then return body         else do-            clientError st body errSink+            clientError st body $ errSink action             fail "not reached"  maybeParams :: [(Text, Maybe Text)] -> [QueryParam]
AWS/RDS.hs view
@@ -18,7 +18,7 @@ import Data.Monoid ((<>))  import AWS.Class-import AWS.Util+import AWS.Lib.Query (textToBS)  import AWS import AWS.RDS.Internal
AWS/RDS/DBInstance.hs view
@@ -38,9 +38,9 @@     => GLSink Event m [DBInstance] sinkDBInstances = elements "DBInstance" $     DBInstance-    <$> getM "Iops" (textToInt <$>)-    <*> getF "BackupRetentionPeriod" textToInt-    <*> getF "MultiAZ" textToBool+    <$> getT "Iops"+    <*> getT "BackupRetentionPeriod"+    <*> getT "MultiAZ"     <*> getT "DBInstanceStatus"     <*> getT "DBInstanceIdentifier"     <*> getT "PreferredBackupWindow"@@ -51,11 +51,11 @@         <*> getT "Status"         )     <*> getT "AvailabilityZone"-    <*> getM "LatestRestorableTime" (textToTime <$>)+    <*> getT "LatestRestorableTime"     <*> elements "ReadReplicaDBInstanceIdentifier" text     <*> getT "Engine"     <*> sinkPendingModifiedValues-    <*> getMT "CharacterSetName"+    <*> getT "CharacterSetName"     <*> getT "LicenseModel"     <*> elementM "DBSubnetGroup"         (DBSubnetGroup@@ -70,7 +70,7 @@             <*> element "SubnetAvailabilityZone"                 (AvailabilityZone                 <$> getT "Name"-                <*> getF "ProvisionedIopsCapable" textToBool+                <*> getT "ProvisionedIopsCapable"                 )             )         )@@ -81,20 +81,20 @@         )     <*> elementM "Endpoint"         (Endpoint-        <$> getF "Port" textToInt+        <$> getT "Port"         <*> getT "Address"         )     <*> getT "EngineVersion"-    <*> getMT "ReadReplicaSourceDBInstanceIdentifier"+    <*> getT "ReadReplicaSourceDBInstanceIdentifier"     <*> elements "DBSecurityGroup"         (DBSecurityGroupMembership         <$> getT "Status"         <*> getT "DBSecurityGroupName"         )-    <*> getMT "DBName"-    <*> getF "AutoMinorVersionUpgrade" textToBool-    <*> getM "InstanceCreateTime" (textToTime <$>)-    <*> getF "AllocatedStorage" textToInt+    <*> getT "DBName"+    <*> getT "AutoMinorVersionUpgrade"+    <*> getT "InstanceCreateTime"+    <*> getT "AllocatedStorage"     <*> getT "DBInstanceClass"     <*> getT "MasterUsername"  @@ -102,15 +102,15 @@     :: MonadThrow m     => GLSink Event m [PendingModifiedValue] sinkPendingModifiedValues = element "PendingModifiedValues" $-    catMaybes <$> sequence [ m "MasterUserPassword" PMVMasterUserPassword-        , m "Iops" (PMVIops . textToInt)-        , m "MultiAZ" (PMVMultiAZ . textToBool)-        , m "AllocatedStorage" (PMVAllocatedStorage . textToInt)-        , m "EngineVersion" PMVEngineVersion-        , m "DBInstanceClass" PMVDBInstanceClass-        , m "BackupRetentionPeriod"-            (PMVBackupRetentionPeriod . textToInt)-        , m "Port" (PMVPort . textToInt)+    catMaybes <$> sequence+        [ f PMVMasterUserPassword "MasterUserPassword"+        , f PMVIops "Iops"+        , f PMVMultiAZ "MultiAZ"+        , f PMVAllocatedStorage "AllocatedStorage"+        , f PMVEngineVersion "EngineVersion"+        , f PMVDBInstanceClass "DBInstanceClass"+        , f PMVBackupRetentionPeriod "BackupRetentionPeriod"+        , f PMVPort "Port"         ]   where-    m t f = getM t (f <$>)+    f c name = fmap c <$> getT name
AWS/Util.hs view
@@ -6,10 +6,8 @@ import qualified Data.ByteString.Lazy as BSL import Data.Text (Text) import qualified Data.Text as T-import qualified Data.Text.Read as TR import Data.Time (UTCTime) import qualified Data.Time as Time-import qualified Data.Time.Parse as TP import System.Locale (defaultTimeLocale)  toS :: BSL.ByteString -> ByteString@@ -24,33 +22,6 @@ err :: String -> Text -> a err v m = error $ "unknown " ++ v ++ ": " ++ T.unpack m -textToBool :: Text -> Bool-textToBool a-    | a == "true"  = True-    | a == "false" = False-    | otherwise    = err "value" a--textToInt :: Integral a => Text -> a-textToInt t = either -    (const $ error "not decimal")-    fst-    (TR.signed TR.decimal t)--textToDouble :: Fractional a => Text -> a-textToDouble t = either-    (const $ error "not double value")-    fst-    (TR.signed TR.rational t)--textToTime :: Text -> UTCTime-textToTime-    = Time.localTimeToUTC Time.utc-    . maybe (error "time format error.") fst-    . TP.strptime fmt-    . T.unpack-  where-    fmt = "%FT%T"- timeToText :: UTCTime -> Text timeToText     = T.pack@@ -58,9 +29,6 @@   where     fmt = "%FT%T" -orEmpty :: Maybe Text -> Text-orEmpty = maybe "" id- boolToText :: Bool -> Text boolToText True  = "true" boolToText False = "false"@@ -71,5 +39,5 @@ bsToText :: ByteString -> Text bsToText = T.pack . BSC.unpack -textToBS :: Text -> ByteString-textToBS = BSC.pack . T.unpack+unconcat :: [a] -> [[a]]+unconcat = map (:[])
Tests/Main.hs view
@@ -22,3 +22,4 @@     runAvailabilityZoneTests     runTagTests     runKeyPairTests+    runNetworkInterfaceTests
aws-sdk.cabal view
@@ -1,5 +1,5 @@ name:                aws-sdk-version:             0.7.0.0+version:             0.7.1.0 synopsis:            AWS SDK for Haskell description:         An AWS(Amazon Web Services) liblary for Haskell. license:             BSD3@@ -30,7 +30,6 @@                    , AWS.EC2.Internal                    , AWS.EC2.Address                    , AWS.EC2.AvailabilityZone-                   , AWS.EC2.Convert                    , AWS.EC2.Image                    , AWS.EC2.Instance                    , AWS.EC2.Volume@@ -43,9 +42,10 @@                    , AWS.EC2.Region                    , AWS.EC2.VPC                    , AWS.EC2.Acl+                   , AWS.EC2.NetworkInterface                    , AWS.EC2.Tag                    , AWS.EC2.Params-                   , AWS.Lib.Convert+                   , AWS.Lib.FromText                    , AWS.Lib.Parser                    , AWS.Lib.Query                    , AWS.RDS.Internal@@ -82,12 +82,15 @@                    , strptime                    , template-haskell                    , parallel+                   , iproute >= 1.2.9  test-suite test     type:              exitcode-stdio-1.0     main-is:           Main.hs     hs-source-dirs:    Tests-    ghc-options:       -Wall -threaded+    ghc-options:       -Wall+                       -threaded+                       -fno-warn-unused-do-bind     extensions: OverloadedStrings     build-depends: base                  , aws-sdk@@ -100,6 +103,8 @@                  , QuickCheck                  , hspec                  , HUnit+                 , lifted-base+                 , iproute  source-repository head     type:            git