{-# LANGUAGE OverloadedStrings #-}

{-|
Controls host muting in Datadog.
-}
module Network.Datadog.Host
( muteHost
, unmuteHost
) where


import Control.Monad (void)

import Data.Aeson
import Data.Text (Text, unpack)
import Data.Time.Clock
import Data.Time.Clock.POSIX

import Network.HTTP.Types

import Network.Datadog.Internal


muteHost :: Environment -> Text -> Maybe UTCTime -> Bool -> IO ()
-- ^ Do not allow alerts to trigger on a specific host
muteHost :: Environment -> Text -> Maybe UTCTime -> Bool -> IO ()
muteHost Environment
env Text
hostname Maybe UTCTime
mtime Bool
override =
  let path :: [Char]
path = [Char]
"host/" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
unpack Text
hostname [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"/mute"
      q :: [([Char], [Char])]
q = [([Char]
"override", [Char]
"true") | Bool
override]
      body :: Value
body = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$
             (UTCTime -> Pair) -> Maybe UTCTime -> [Pair] -> [Pair]
forall a b. (a -> b) -> Maybe a -> [b] -> [b]
prependMaybe (\UTCTime
a -> Key
"end" Key -> Integer -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (POSIXTime -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
ceiling (UTCTime -> POSIXTime
utcTimeToPOSIXSeconds UTCTime
a) :: Integer)) Maybe UTCTime
mtime ([Pair] -> [Pair]) -> [Pair] -> [Pair]
forall a b. (a -> b) -> a -> b
$
             Bool -> Pair -> [Pair] -> [Pair]
forall b. Bool -> b -> [b] -> [b]
prependBool Bool
override (Key
"override" Key -> Bool -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Bool
True)
             [Key
"hostname" Key -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
hostname]
  in IO ByteString -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO ByteString -> IO ()) -> IO ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ Environment
-> [Char]
-> [([Char], [Char])]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env [Char]
path [([Char], [Char])]
q StdMethod
POST (Maybe ByteString -> IO ByteString)
-> Maybe ByteString -> IO ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode Value
body


unmuteHost :: Environment -> Text -> IO ()
-- ^ Allow alerts to trigger on a specific host
unmuteHost :: Environment -> Text -> IO ()
unmuteHost Environment
env Text
hostname =
  let path :: [Char]
path = [Char]
"host/" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Text -> [Char]
unpack Text
hostname [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"/unmute"
      body :: Value
body = [Pair] -> Value
object [Key
"hostname" Key -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Text
hostname]
  in IO ByteString -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO ByteString -> IO ()) -> IO ByteString -> IO ()
forall a b. (a -> b) -> a -> b
$ Environment
-> [Char]
-> [([Char], [Char])]
-> StdMethod
-> Maybe ByteString
-> IO ByteString
datadogHttp Environment
env [Char]
path [] StdMethod
POST (Maybe ByteString -> IO ByteString)
-> Maybe ByteString -> IO ByteString
forall a b. (a -> b) -> a -> b
$ ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (ByteString -> Maybe ByteString) -> ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Value -> ByteString
forall a. ToJSON a => a -> ByteString
encode Value
body