module AWS.EC2.Volume
( describeVolumes
, createVolume
, deleteVolume
, attachVolume
, detachVolume
, describeVolumeStatus
, enableVolumeIO
, describeVolumeAttribute
, modifyVolumeAttribute
) where
import Data.Text (Text)
import Data.XML.Types (Event)
import Data.Conduit
import Control.Applicative
import AWS.EC2.Internal
import AWS.EC2.Params
import AWS.EC2.Types
import AWS.EC2.Query
import AWS.Lib.Parser
import AWS.Util
describeVolumes
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m Volume)
describeVolumes vids filters =
ec2QuerySource "DescribeVolumes" params $
itemConduit "volumeSet" volumeSink
where
params =
[ "VolumeId" |.#= vids
, filtersParam filters
]
volumeSink :: MonadThrow m
=> GLSink Event m Volume
volumeSink = Volume
<$> getT "volumeId"
<*> getT "size"
<*> getT "snapshotId"
<*> getT "availabilityZone"
<*> getT "status"
<*> getT "createTime"
<*> itemsSet "attachmentSet" attachmentSink
<*> resourceTagSink
<*> volumeTypeSink
attachmentSink :: MonadThrow m => GLSink Event m AttachmentSetItemResponse
attachmentSink = AttachmentSetItemResponse
<$> getT "volumeId"
<*> getT "instanceId"
<*> getT "device"
<*> getT "status"
<*> getT "attachTime"
<*> getT "deleteOnTermination"
createVolume
:: (MonadResource m, MonadBaseControl IO m)
=> CreateVolumeRequest
-> EC2 m Volume
createVolume param =
ec2Query "CreateVolume" param' volumeSink
where
param' = createVolumeParams param
createVolumeParams :: CreateVolumeRequest -> [QueryParam]
createVolumeParams (CreateNewVolume size zone vtype) =
[ "Size" |= toText size
, "AvailabilityZone" |= zone
] ++ maybe [] volumeTypeParams vtype
createVolumeParams (CreateFromSnapshot sid zone size vtype) =
[ "SnapshotId" |= sid
, "AvailabilityZone" |= zone
, "Size" |=? toText <$> size
] ++ maybe [] volumeTypeParams vtype
deleteVolume
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
deleteVolume = ec2Delete "DeleteVolume" "VolumeId"
attachVolume
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Text
-> Text
-> EC2 m AttachmentSetItemResponse
attachVolume volid iid dev =
ec2Query "AttachVolume" params attachmentSink
where
params =
[ "VolumeId" |= volid
, "InstanceId" |= iid
, "Device" |= dev
]
detachVolume
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Maybe Text
-> Maybe Text
-> Maybe Bool
-> EC2 m AttachmentSetItemResponse
detachVolume volid iid dev force =
ec2Query "DetachVolume" params attachmentSink
where
params =
[ "VolumeId" |= volid
, "InstanceId" |=? iid
, "Device" |=? dev
, "Force" |=? toText <$> force
]
describeVolumeStatus
:: (MonadResource m, MonadBaseControl IO m)
=> [Text]
-> [Filter]
-> Maybe Text
-> EC2 m (ResumableSource m VolumeStatus)
describeVolumeStatus vids filters token =
ec2QuerySource' "DescribeVolumeStatus" params token $
itemConduit "volumeStatusSet" $ volumeStatusSink
where
params =
[ "VolumeId" |.#= vids
, filtersParam filters
]
volumeStatusSink :: MonadThrow m
=> GLSink Event m VolumeStatus
volumeStatusSink = VolumeStatus
<$> getT "volumeId"
<*> getT "availabilityZone"
<*> element "volumeStatus" (VolumeStatusInfo
<$> getT "status"
<*> itemsSet "details" (VolumeStatusDetail
<$> getT "name"
<*> getT "status"
)
)
<*> itemsSet "eventsSet" (VolumeStatusEvent
<$> getT "eventType"
<*> getT "eventId"
<*> getT "description"
<*> getT "notBefore"
<*> getT "notAfter"
)
<*> itemsSet "actionsSet" (VolumeStatusAction
<$> getT "code"
<*> getT "eventType"
<*> getT "eventId"
<*> getT "description"
)
modifyVolumeAttribute
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> Bool
-> EC2 m Bool
modifyVolumeAttribute vid enable =
ec2Query "ModifyVolumeAttribute" params $ getT "return"
where
params =
[ "VolumeId" |= vid
, "AutoEnableIO" |.+ "Value" |= boolToText enable
]
enableVolumeIO
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> EC2 m Bool
enableVolumeIO vid =
ec2Query "EnableVolumeIO" params $ getT "return"
where
params = ["VolumeId" |= vid]
describeVolumeAttribute
:: (MonadResource m, MonadBaseControl IO m)
=> Text
-> VolumeAttributeRequest
-> EC2 m (Text, VolumeAttribute)
describeVolumeAttribute vid attr =
ec2Query "DescribeVolumeAttribute" params $ (,)
<$> getT "volumeId"
<*> volumeAttributeSink attr
where
params =
[ "VolumeId" |= vid
, "Attribute" |= s attr
]
s VolumeAttributeRequestAutoEnableIO = "autoEnableIO"
s VolumeAttributeRequestProductCodes = "productCodes"
volumeAttributeSink
:: MonadThrow m
=> VolumeAttributeRequest
-> GLSink Event m VolumeAttribute
volumeAttributeSink VolumeAttributeRequestAutoEnableIO
= VolumeAttributeAutoEnableIO
<$> element "autoEnableIO" (getT "value")
volumeAttributeSink VolumeAttributeRequestProductCodes
= VolumeAttributeProductCodes
<$> productCodeSink