module AWS.EC2.NetworkInterface
( assignPrivateIpAddresses
, unassignPrivateIpAddresses
, describeNetworkInterfaces
, createNetworkInterface
, deleteNetworkInterface
, attachNetworkInterface
, detachNetworkInterface
) where
import Data.IP (IPv4)
import Data.Text (Text)
import Data.XML.Types (Event)
import Data.Conduit
import Control.Applicative
import AWS.EC2.Internal
import AWS.EC2.Types
import AWS.EC2.Query
import AWS.Lib.Parser
import AWS.Util
assignPrivateIpAddresses
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> Either [IPv4] Int
-> Maybe Bool
-> EC2 m Bool
assignPrivateIpAddresses niid epip ar =
ec2Query "AssignPrivateIpAddresses" params $ getT "return"
where
params =
[ "NetworkInterfaceId" |= niid
, either f g epip
, "AllowReassignment" |=? boolToText <$> ar
]
f = ("PrivateIpAddress" |.#=) . map toText
g = ("SecondaryPrivateIpAddressCount" |=) . toText
unassignPrivateIpAddresses
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> [IPv4]
-> EC2 m Bool
unassignPrivateIpAddresses niid addrs =
ec2Query "UnassignPrivateIpAddresses" params $ getT "return"
where
params =
[ "NetworkInterfaceId" |= niid
, "PrivateIpAddress" |.#= map toText addrs
]
describeNetworkInterfaces
:: (MonadBaseControl IO m, MonadResource m)
=> [Text]
-> [Filter]
-> EC2 m (ResumableSource m NetworkInterface)
describeNetworkInterfaces niid filters =
ec2QuerySource "DescribeNetworkInterfaces" params
$ itemConduit "networkInterfaceSet" networkInterfaceSink
where
params =
[ "NetworkInterfaceId" |.#= niid
, filtersParam 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
<*> networkInterfaceAttachmentSink
<*> networkInterfaceAssociationSink
<*> resourceTagSink
<*> itemsSet "privateIpAddressesSet" (
NetworkInterfacePrivateIpAddress
<$> getT "privateIpAddress"
<*> getT "privateDnsName"
<*> getT "primary"
<*> networkInterfaceAssociationSink
)
networkInterfaceAssociationSink
:: MonadThrow m
=> GLSink Event m (Maybe NetworkInterfaceAssociation)
networkInterfaceAssociationSink =
elementM "association" $ NetworkInterfaceAssociation
<$> getT "attachmentId"
<*> getT "instanceId"
<*> getT "publicIp"
<*> getT "publicDnsName"
<*> getT "ipOwnerId"
<*> getT "associationId"
createNetworkInterface
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> SecondaryPrivateIpAddressParam
-> Maybe Text
-> [Text]
-> EC2 m NetworkInterface
createNetworkInterface subnet privateAddresses description securityGroupIds =
ec2Query "CreateNetworkInterface" params $ element "networkInterface" networkInterfaceSink
where
params :: [QueryParam]
params =
[ "SubnetId" |= subnet
, "Description" |=? description
, "SecurityGroup" |.#= securityGroupIds
] ++ fromSecondary privateAddresses
fromSecondary :: SecondaryPrivateIpAddressParam -> [QueryParam]
fromSecondary SecondaryPrivateIpAddressParamNothing = []
fromSecondary (SecondaryPrivateIpAddressParamCount n) = ["SecondaryPrivateIpAddressCount" |= toText n]
fromSecondary (SecondaryPrivateIpAddressParamSpecified addrs primary) =
[ "PrivateIpAddresses" |.#. map (\addr -> ["PrivateIpAddress" |= toText addr]) addrs
, maybeParam $ primaryParam <$> primary
]
primaryParam :: Int -> QueryParam
primaryParam n = "PrivateIpAddresses" |.+ toText n |.+ "Primary" |= "true"
deleteNetworkInterface
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> EC2 m Bool
deleteNetworkInterface networkInterface =
ec2Query "DeleteNetworkInterface" ["NetworkInterfaceId" |= networkInterface] $ getT "return"
attachNetworkInterface
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> Text
-> Int
-> EC2 m Text
attachNetworkInterface networkInterface inst deviceIdx =
ec2Query "AttachNetworkInterface" params $ getT "attachmentId"
where
params =
[ "NetworkInterfaceId" |= networkInterface
, "InstanceId" |= inst
, "DeviceIndex" |= toText deviceIdx
]
detachNetworkInterface
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> Maybe Bool
-> EC2 m Bool
detachNetworkInterface attachment force =
ec2Query "DetachNetworkInterface" params $ getT "return"
where
params =
[ "AttachmentId" |= attachment
, "Force" |=? toText <$> force
]