module AWS.ELB.LoadBalancer
( describeLoadBalancers
, createLoadBalancer
, deleteLoadBalancer
) where
import Data.Text (Text)
import Data.IP (IPv4, AddrRange)
import Data.Conduit
import Control.Applicative
import Data.XML.Types (Event(..))
import AWS.Lib.Parser
import AWS.Lib.Query
import AWS.ELB.Types
import AWS.ELB.Internal
import AWS.Util (toText)
describeLoadBalancers
:: (MonadBaseControl IO m, MonadResource m)
=> [Text]
-> Maybe Text
-> ELB m [LoadBalancer]
describeLoadBalancers lbs marker =
elbQuery "DescribeLoadBalancers" params sinkLoadBalancers
where
params =
[ "LoadBalancerNames.member" |.#= lbs
, "Marker" |=? marker
]
sinkLoadBalancers :: MonadThrow m
=> GLSink Event m [LoadBalancer]
sinkLoadBalancers = members "LoadBalancerDescriptions" $
LoadBalancer
<$> members "SecurityGroups" text
<*> getT "CreatedTime"
<*> getT "LoadBalancerName"
<*> element "HealthCheck"
(HealthCheck
<$> getT "Interval"
<*> getT "Target"
<*> getT "HealthyThreshold"
<*> getT "Timeout"
<*> getT "UnhealthyThreshold"
)
<*> getT "VPCId"
<*> members "ListenerDescriptions"
(ListenerDescription
<$> members "PolicyNames" text
<*> element "Listener"
(Listener
<$> getT "Protocol"
<*> getT "LoadBalancerPort"
<*> getT "InstanceProtocol"
<*> getT "SSLCertificateId"
<*> getT "InstancePort"
)
)
<*> members "Instances"
(Instance <$> getT "InstanceId")
<*> element "Policies"
(Policies
<$> members "AppCookieStickinessPolicies"
(AppCookieStickinessPolicy
<$> getT "CookieName"
<*> getT "PolicyName"
)
<*> members "OtherPolicies" text
<*> members "LBCookieStickinessPolicies"
(LBCookieStickinessPolicy
<$> getT "CookieExpirationPeriod"
<*> getT "PolicyName"
)
)
<*> members "AvailabilityZones" text
<*> getT "CanonicalHostedZoneName"
<*> getT "CanonicalHostedZoneNameID"
<*> getT "Scheme"
<*> elementM "SourceSecurityGroup"
(SourceSecurityGroup
<$> getT "OwnerAlias"
<*> getT "GroupName"
)
<*> getT "DNSName"
<*> members "BackendServerDescriptions"
(BackendServerDescription
<$> getT "InstancePort"
<*> members "PolicyNames" text
)
<*> members "Subnets" text
createLoadBalancer
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> [Listener]
-> [Text]
-> Maybe Text
-> [Text]
-> [AddrRange IPv4]
-> ELB m Text
createLoadBalancer name listeners zones scheme groups subnets =
elbQuery "CreateLoadBalancer" params $ getT "DNSName"
where
params =
[ "LoadBalancerName" |= name
, "Listeners.member" |.#. listeners'
, "AvailabilityZones.member" |.#= zones
, "Scheme" |=? scheme
, "SecurityGroups.member" |.#= groups
, "Subnets.member" |.#= map toText subnets
]
listeners' = flip map listeners $
\(Listener prot lbport iprot cert iport) ->
[ "Protocol" |= prot
, "LoadBalancerPort" |= toText lbport
, "InstanceProtocol" |= iprot
, "SSLCertificateId" |=? cert
, "InstancePort" |= toText iport
]
deleteLoadBalancer
:: (MonadBaseControl IO m, MonadResource m)
=> Text
-> ELB m ()
deleteLoadBalancer name = elbQuery "DeleteLoadBalancer" params $
getT_ "DeleteLoadBalancerResult"
where
params = ["LoadBalancerName" |= name]