{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} module Boots.Factory.Consul( buildConsul ) where import Boots import Boots.Factory.Client () import Boots.Web import Control.Monad (void) import qualified Data.HashMap.Strict as HM import Data.Version (showVersion) import Network.Consul -- | Register consule service. buildConsul :: (MonadMask n, MonadIO n, HasSalak env, HasApp env, HasLogger env) => Factory n (WebEnv env context) () buildConsul = tryBuildByKey False "consul.enabled" $ do AppEnv{..} <- asksEnv (view askApp) WebConfig{..} <- view askWebConfig <$> getEnv mst <- require "consul.client" cc@ConsulConfig{..} <- require "consul" let ConsulApi{..} = consulApi cc mst met2 = HM.insert "version" (fromString $ showVersion version) meta open = registerService $ newServer $ HttpServer name instanceId (Just hostname) (Just port) tags met2 $ ServiceCheck name instanceId interval dcsa $ "http://" <> hostname <> ":" <> show port <>"/endpoints/health" close _ = void $ deregisterService instanceId delay $ logInfo "Service deregistered from consul." _ <- produce open close logInfo "Service registered to consul."