packages feed

groot-0.0.1.0: src/Groot/Compose/Service/Free.hs

{-# LANGUAGE DeriveFunctor    #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TemplateHaskell  #-}

module Groot.Compose.Service.Free where

import           Control.Monad
import           Control.Monad.Free
import           Control.Monad.Free.TH
import           Data.Text             (Text)

import           Groot.Manifest
import           Groot.Types

data ServiceComposeOp next =
    RegisterTask NamedServiceDeployment (TaskDefId -> next)
  | ServiceExists Text ClusterRef (Bool -> next)
  | CreateService NamedServiceDeployment ClusterRef TaskDefId next
  | UpdateService NamedServiceDeployment ClusterRef TaskDefId next
  | RemoveService NamedServiceDeployment ClusterRef next
  | VerifyActiveCluster ClusterRef next
  deriving Functor

makeFree ''ServiceComposeOp

type ServiceComposeM = Free ServiceComposeOp

deployService :: ClusterRef -> NamedServiceDeployment -> ServiceComposeM ()
deployService clusterRef service = do
  verifyActiveCluster clusterRef
  taskDefId <- registerTask service
  exists    <- serviceExists (fst service) clusterRef
  if exists
  then updateService service clusterRef taskDefId
  else createService service clusterRef taskDefId

deployServices :: Traversable f => ClusterRef -> f NamedServiceDeployment -> ServiceComposeM ()
deployServices clusterRef = void . traverse (\serv -> deployService clusterRef serv)
{-# INLINE deployServices #-}

deleteServices :: Traversable f => ClusterRef -> f NamedServiceDeployment -> ServiceComposeM ()
deleteServices clusterRef = void . traverse (\serv -> removeService serv clusterRef)
{-# INLINE deleteServices #-}