packages feed

groot-0.0.1.0: src/Groot/CLI/List/ContainerService.hs

{-# LANGUAGE DeriveDataTypeable    #-}
{-# LANGUAGE DeriveGeneric         #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings     #-}

module Groot.CLI.List.ContainerService
     ( printServiceSummary
     ) where

import           Control.Lens
import           Control.Monad.IO.Class
import           Control.Monad.Trans.Maybe
import           Control.Monad.Trans.Reader
import           Data.Conduit
import qualified Data.Conduit.List          as CL
import           Data.Data
import           Data.Text                  (Text)
import qualified Data.Text                  as T
import           GHC.Generics
import           Network.AWS
import qualified Network.AWS.ECS            as ECS
import           Text.PrettyPrint.Tabulate  (Tabulate, printTable)
import qualified Text.PrettyPrint.Tabulate  as Tabs

import           Groot.CLI.List.Common
import           Groot.Console
import           Groot.Core
import           Groot.Data.Text
import           Groot.Types

data ServiceSummary = ServiceSummary
  { name    :: String
  , cluster :: String
  , task    :: String
  , running :: Int
  , pending :: Int
  , desired :: Int
  } deriving (Eq, Show, Generic, Data)

instance Tabulate ServiceSummary Tabs.ExpandWhenNested

data ServiceAndRelatives = SR ECS.ContainerService ECS.Cluster

instance HasSummary ServiceAndRelatives ServiceSummary where
  summarize (SR service cluster) = ServiceSummary <$> sName <*> sClusterName <*> sTask <*> sRunning <*> sPending <*> sDesired
    where sName        = T.unpack <$> service ^. ECS.csServiceName
          sClusterName = T.unpack <$> cluster ^. ECS.cClusterName
          sTask        = T.unpack . toText . (view arnTaskDefId) <$> serviceTaskDefArn service
          sRunning     = service ^. ECS.csRunningCount
          sPending     = service ^. ECS.csPendingCount
          sDesired     = service ^. ECS.csDesiredCount

annotateService :: MonadAWS m => Conduit ECS.ContainerService m ServiceAndRelatives
annotateService = CL.mapMaybeM (\s -> runMaybeT $
    (SR s) <$> serviceCluster s
  )

summarizeServices :: Maybe ClusterRef -> AWS [ServiceSummary]
summarizeServices clusterId =
  sourceToList $ serviceSource clusterId =$= annotateService =$= CL.mapMaybe summarize
    where serviceSource Nothing    = fetchAllServices
          serviceSource (Just cid) = fetchServices cid

printServiceSummary :: Maybe ClusterRef -> GrootM IO ()
printServiceSummary clusterId = do
  env  <- ask
  desc <- runResourceT . runAWS env $ summarizeServices clusterId
  case desc of
    [] -> putWarn ("No services found" :: Text)
    xs -> liftIO $ printTable xs