SciFlow-0.5.3.1: src/Scientific/Workflow/Utils.hs
{-# LANGUAGE CPP #-}
module Scientific.Workflow.Utils where
import qualified Data.ByteString.Char8 as B
import qualified Data.Text as T
import Debug.Trace (traceM)
import Rainbow
import System.IO
import qualified Data.Map as M
import Data.Yaml (encode)
import Scientific.Workflow.Types (DBData (..))
import System.Directory (getCurrentDirectory)
import System.Environment.Executable (getExecutablePath)
#ifdef SGE
import DRMAA (DrmaaAttribute (..),
defaultDrmaaConfig, drmaaRun,
withTmpFile)
#endif
debug :: Monad m => String -> m ()
debug txt = traceM $ B.unpack $ B.concat $
chunksToByteStrings toByteStringsColors8 [prefix, chunk txt & fore green]
where
prefix = bold $ chunk "[DEBUG] " & fore green
error' :: String -> IO ()
error' txt = B.hPutStrLn stderr $ B.concat $
chunksToByteStrings toByteStringsColors8 [prefix, chunk txt & fore red]
where
prefix = bold $ chunk "[ERROR] " & fore red
data RemoteOpts = RemoteOpts
{ extraParams :: String
, environment :: M.Map T.Text T.Text
}
defaultRemoteOpts :: RemoteOpts
defaultRemoteOpts = RemoteOpts
{ extraParams = ""
, environment = M.empty
}
runRemote :: (DBData a, DBData b) => RemoteOpts -> T.Text -> a -> IO b
#ifdef SGE
runRemote opts pid input = withTmpFile tmpDir $ \inputFl ->
withTmpFile tmpDir $ \outputFl -> withTmpFile tmpDir $ \configFl -> do
B.writeFile configFl $ encode $ environment opts
exePath <- getExecutablePath
wd <- getCurrentDirectory
let config = defaultDrmaaConfig{drmaa_wd=wd, drmaa_native=extraParams opts}
B.writeFile inputFl $ serialize input
drmaaRun exePath [ "execFunc", "--config", configFl, T.unpack pid
, inputFl, outputFl ] config :: IO ()
deserialize <$> B.readFile outputFl
where
tmpDir = "./"
#else
runRemote = error "SGE support was not turned on."
#endif