packages feed

groot-0.0.1.0: src/Groot/CLI/Cluster/Events.hs

module Groot.CLI.Cluster.Events
     ( ClusterEventOptions
     , clusterEventsOpt
     , runClusterEvents
     ) where

import           Control.Monad.Reader
import           Data.Conduit
import qualified Data.Conduit.List    as CL
import           Data.Semigroup       ((<>))
import           Data.String
import           Network.AWS
import           Options.Applicative

import           Groot.CLI.Common
import           Groot.Core
import           Groot.Core.Events
import           Groot.Types

data ClusterEventOptions = ClusterEventOptions
  { _follow       :: Bool
  , _eventCount   :: Int
  , _clusterNames :: [ClusterRef]
  } deriving (Eq, Show)

clusterRefArg :: Parser ClusterRef
clusterRefArg = fromString <$> argument str (metavar "CLUSTER_NAMES")

clusterEventsOpt :: Parser ClusterEventOptions
clusterEventsOpt = ClusterEventOptions
                <$> switch
                  ( long "follow"
                <> short 'f'
                <> help "Folow the trail of events" )
                <*> eventCountOpt
                <*> many clusterRefArg

runClusterEvents :: ClusterEventOptions -> GrootM IO ()
runClusterEvents (ClusterEventOptions follow lastN []) = do
  env <- ask
  clusterRefs <- runResourceT . runAWS env . sourceToList $ fetchClusters =$= CL.mapMaybe clusterName
  runClusterEvents (ClusterEventOptions follow lastN clusterRefs)
runClusterEvents (ClusterEventOptions follow lastN clusterRefs) = mapReaderT runResourceT $ do
  eventSource <- clusterServiceEventLog clusterRefs follow lastN
  runConduit $ eventSource =$ printEventSink