task-distribution-0.1.0.0: src/Control/Distributed/Task/Util/Configuration.hs
module Control.Distributed.Task.Util.Configuration (
Configuration(..), getConfiguration, DistributionStrategy(..)
)where
import Data.List.Split (splitOn)
import Control.Distributed.Task.Types.HdfsConfigTypes
data Configuration = Configuration {
_maxTasksPerNode :: Int,
_hdfsConfig :: HdfsConfig,
_pseudoDBPath :: FilePath,
_distributionStrategy :: DistributionStrategy,
_taskLogFile :: FilePath,
_sourceCodeDistributionHome :: FilePath,
_sourceCodeModules :: [(String, Maybe String)],
_objectCodePathOnMaster :: FilePath,
_packageDbPath :: FilePath,
_objectCodeResourcesPathSrc :: FilePath,
_objectCodeResourcesPathExtra :: FilePath
}
data DistributionStrategy
= FirstTaskWithData
| AnywhereIsFine
getConfiguration :: IO Configuration
getConfiguration = do
confFile <- readFile "etc/config"
sourceCodeModulesFile <- readFile "etc/sourcecodemodules"
return $ parseConfig confFile sourceCodeModulesFile
where
parseConfig conf sourceCodeModulesFile =
Configuration
(read $ f "max-tasks-per-node")
(readEndpoint $ f "hdfs")
(f "pseudo-db-path")
(readStrat $ f "distribution-strategy")
(f "task-log-file")
(f "source-code-distribution-home")
(map mkSourceCodeModule $ lines sourceCodeModulesFile)
(f "object-code-path-on-master")
(f "package-db-path")
(f "object-code-resources-path-src")
(f "object-code-resources-path-extra")
where
f = getConfig conf
readStrat s = case s of
"local" -> FirstTaskWithData
"anywhere" -> AnywhereIsFine
_ -> error $ "unknown strategy: "++s
readEndpoint str = let es = splitOn ":" str
in if length es == 2
then (es !! 0, read $ es !! 1)
else error $ "endpoint not properly configured in etc/config (example: hdfs=localhost:55555): "++str
mkSourceCodeModule line = let es = splitOn ":" line in if (length es) == 1 then (es !! 0, Nothing) else (es !! 0, Just $ es !! 1)
getConfig :: String -> String -> String
getConfig file key =
let conf = (filter (not . null . fst) . map parseConfig . map (splitOn "=") . lines) file
in maybe (error $ "not configured: "++key) id $ lookup key conf
where
parseConfig :: [String] -> (String, String)
parseConfig es = if length es < 2 then ("", "") else (head es, concat $ tail es)