groot-0.0.1.0: src/Groot/Compose/Service/DryRun.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
module Groot.Compose.Service.DryRun (dryRunServiceCompose) where
import Control.Monad.Free
import Control.Monad.Reader
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Resource
import Data.Semigroup ((<>))
import Network.AWS
import Groot.Compose.Service.AWS (serviceExists',
verifyActiveCluster')
import Groot.Compose.Service.Free
import Groot.Console
import Groot.Core
import Groot.Data.Text
import Groot.Exception
import Groot.Manifest
import Groot.Types
registerTask' :: (MonadConsole m, MonadResource m, MonadBaseControl IO m)
=> NamedServiceDeployment
-> GrootM m TaskDefId
registerTask' (serviceName, _) = do
putInfo $ "Registering task definition for service " <> styled yellowStyle serviceName
env <- ask
tdId <- runAWS env . runMaybeT $ do
taskDef <- getTaskDef (TaskDefRef serviceName)
MaybeT . pure $ nextTaskDefId <$> taskDefId taskDef
case tdId of
Nothing -> do
let theId = TaskDefId (TaskFamily serviceName) 0
putSuccess $ "Would have created task" <+> (styled yellowStyle $ toText theId)
return theId
Just theId -> do
putSuccess $ "Would have upgrade task to" <+> (styled yellowStyle $ toText theId)
return theId
createService' :: MonadConsole m
=> NamedServiceDeployment
-> ClusterRef
-> TaskDefId
-> m ()
createService' (serviceName, _) clusterRef tdId =
putInfo $ "Creates a new service named" <+> (styled yellowStyle serviceName)
<+> "in cluster" <+> (styled yellowStyle $ toText clusterRef)
<+> "linked to task" <+> (styled yellowStyle $ toText tdId)
updateService' :: MonadConsole m
=> NamedServiceDeployment
-> ClusterRef
-> TaskDefId
-> m ()
updateService' (serviceName, _) clusterRef tdId =
putInfo $ "Updates service named" <+> (styled yellowStyle serviceName)
<+> "in cluster" <+> (styled yellowStyle $ toText clusterRef)
<+> "linked to task" <+> (styled yellowStyle $ toText tdId)
removeService' :: MonadConsole m
=> NamedServiceDeployment
-> ClusterRef
-> m ()
removeService' (serviceName, _) clusterRef =
putInfo $ "Deletes service named" <+> (styled yellowStyle serviceName)
<+> "from cluster" <+> (styled yellowStyle $ toText clusterRef)
dryRunServiceCompose :: (MonadConsole m, MonadResource m, MonadBaseControl IO m)
=> GrootManifest
-> ServiceComposeM a
-> GrootM m a
dryRunServiceCompose _ = foldFree $ \case
RegisterTask service next ->
next <$> registerTask' service
ServiceExists name clusterRef next ->
next <$> serviceExists' name clusterRef
CreateService service cluster taskId next ->
(const next) <$> createService' service cluster taskId
UpdateService service cluster taskId next ->
(const next) <$> updateService' service cluster taskId
RemoveService service cluster next ->
(const next) <$> removeService' service cluster
VerifyActiveCluster cluster next ->
(const next) <$> verifyActiveCluster' cluster