freckle-app-1.5.0.0: library/Freckle/App/Ecs.hs
module Freckle.App.Ecs
( EcsMetadata(..)
, EcsContainerMetadata(..)
, EcsContainerTaskMetadata(..)
, getEcsMetadata
) where
import Freckle.App.Prelude
import Control.Error.Util (hush)
import Data.Aeson
import Data.List.Extra (dropPrefix)
import Freckle.App.Http
import System.Environment (lookupEnv)
data EcsMetadata = EcsMetadata
{ emContainerMetadata :: EcsContainerMetadata
, emContainerTaskMetadata :: EcsContainerTaskMetadata
}
data EcsContainerMetadata = EcsContainerMetadata
{ ecmDockerId :: Text
, ecmDockerName :: Text
, ecmImage :: Text
, ecmImageID :: Text
}
deriving stock Generic
instance FromJSON EcsContainerMetadata where
parseJSON = genericParseJSON $ aesonDropPrefix "ecm"
data EcsContainerTaskMetadata = EcsContainerTaskMetadata
{ ectmCluster :: Text
, ectmTaskARN :: Text
, ectmFamily :: Text
, ectmRevision :: Text
}
deriving stock Generic
instance FromJSON EcsContainerTaskMetadata where
parseJSON = genericParseJSON $ aesonDropPrefix "ectm"
aesonDropPrefix :: String -> Options
aesonDropPrefix x = defaultOptions { fieldLabelModifier = dropPrefix x }
getEcsMetadata :: MonadIO m => m (Maybe EcsMetadata)
getEcsMetadata =
liftA2 EcsMetadata
<$> makeContainerMetadataRequest "/"
<*> makeContainerMetadataRequest "/task"
makeContainerMetadataRequest :: (MonadIO m, FromJSON a) => Text -> m (Maybe a)
makeContainerMetadataRequest path = do
mURI <- liftIO $ lookupEnv "ECS_CONTAINER_METADATA_URI"
meMetadata <- for mURI $ \uri -> do
httpJson $ parseRequest_ $ uri <> unpack path
pure $ hush . getResponseBody =<< meMetadata