Commit f440c7a5 authored by Valentin Reis's avatar Valentin Reis

Merge branch 'refactor-powerexpe'

parents 53721368 489a6b98
Pipeline #4993 failed with stage
in 1 minute
......@@ -12,6 +12,21 @@ library
exposed-Modules: Argo.Stack
Argo.Utils
Argo.Args
build-depends: base >=4 && <=8, turtle, data-default, managed, ansi-terminal, unix, system-filepath, async, process, text, optparse-applicative, extra, foldl, conduit,conduit-extra, bytestring, stm, pretty-show
build-depends: base >=4 && <=8, turtle, data-default, managed, ansi-terminal, unix, system-filepath, async, process, text, optparse-applicative, extra, foldl, conduit,conduit-extra, bytestring, stm, pretty-show, unliftio-core
hs-source-dirs: src
default-language: Haskell2010
ghc-options:
-Wall
-Wincomplete-uni-patterns
-Wincomplete-record-updates
-Wmissing-home-modules
-Widentities
-Wredundant-constraints
-Wcpp-undef
-Wmissing-export-li
-fwarn-tabs
-fwarn-unused-imports
-fwarn-missing-signatures
-fwarn-name-shadowing
-fwarn-incomplete-patternssts
-fprint-potential-instances
{-|
Module : Argo
Description : The holt core package
Copyright : (c) Valentin Reis, 2018
License : MIT
Maintainer : fre@freux.fr
-}
module Argo
( module Argo.Stack
( module Argo.Args
, module Argo.Args
, module Argo.Utils
)
where
......
......@@ -11,14 +11,12 @@ import Data.Text as T
import Turtle hiding ( option )
import Prelude hiding ( FilePath )
import System.Process hiding ( shell )
data OutputFiles = OutputFiles FilePath FilePath
data StackArgs = StackArgs
{ verbosity :: Verbosity
, app :: AppName
, args :: AppArgs
, args :: [AppArg]
, containerName :: ContainerName
, workingDirectory :: WorkingDirectory
, manifestDir :: ManifestDir
......@@ -27,11 +25,13 @@ data StackArgs = StackArgs
, cmdrun :: ProcessBehavior
, cmdlisten :: ProcessBehavior
, cmdlistenprogress :: ProcessBehavior
, cmdlistenperformance :: ProcessBehavior
, cmdlistenpower :: ProcessBehavior
}
} deriving (Show)
{-data OutputFiles = OutputFiles FilePath FilePath-}
data Verbosity = Normal | Verbose deriving (Show,Read,Eq)
newtype AppArgs = AppArgs [Text] deriving (Show, Read)
newtype AppArg = AppArg Text deriving (IsString, Show, Read)
newtype WorkingDirectory = WorkingDirectory FilePath deriving (IsString, Show)
newtype AppName = AppName Text deriving (IsString, Show, Read)
newtype ContainerName = ContainerName Text deriving (IsString, Show, Read)
......@@ -56,7 +56,7 @@ instance Default StackArgs where
def = StackArgs
{ verbosity = Normal
, app = AppName "ls"
, args = AppArgs []
, args = []
, containerName = ContainerName "testContainer"
, workingDirectory = WorkingDirectory "_output"
, manifestDir = ManifestDir "manifests"
......@@ -65,83 +65,93 @@ instance Default StackArgs where
, cmdrun = DontRun
, cmdlisten = DontRun
, cmdlistenprogress = DontRun
, cmdlistenperformance = DontRun
, cmdlistenpower = DontRun
}
parseExtendStackArgs :: StackArgs -> Parser StackArgs
parseExtendStackArgs StackArgs {..} = do
parseExtendStackArgs sa = do
verbosity <- flag
Normal
Verbose
(long "verbose" <> short 'v' <> help "Enable verbose mode")
app <- strOption
( long "application"
( long "app"
<> metavar "APP"
<> help "Target application executable name. PATH is inherited."
<> showDefault
<> value app
<> value (app sa)
)
containerName <- strOption
( long "container_name"
<> metavar "ARGO_CONTAINER_UUID"
<> help "Container name"
<> showDefault
<> value containerName
<> value (containerName sa)
)
workingDirectory <- strOption
( long "output_dir"
<> metavar "DIR"
<> help "Working directory."
<> showDefault
<> value workingDirectory
<> value (workingDirectory sa)
)
manifestDir <- strOption
( long "manifest_directory"
<> metavar "DIR"
<> help "Manifest lookup directory"
<> showDefault
<> value manifestDir
<> value (manifestDir sa)
)
manifestName <- strOption
( long "manifest_name"
<> metavar "FILENAME"
<> help "Manifest file basename (relative to --manifest_directory)"
<> showDefault
<> value manifestName
<> value (manifestName sa)
)
daemon <- behaviorOption
( long "daemon"
<> metavar "BEHAVIOR"
<> help "`daemon` behavior"
<> showDefault
<> value daemon
<> value (daemon sa)
)
cmdrun <- behaviorOption
( long "cmd_run"
<> metavar "BEHAVIOR"
<> help "`cmd run` behavior"
<> showDefault
<> value cmdrun
<> value (cmdrun sa)
)
cmdlisten <- behaviorOption
( long "cmd_listen"
<> metavar "BEHAVIOR"
<> help "`cmd listen` behavior"
<> showDefault
<> value cmdlisten
<> value (cmdlisten sa)
)
cmdlistenperformance <- behaviorOption
( long "cmd_listen_performance"
<> metavar "BEHAVIOR"
<> help "`cmd listen --filter performance` behavior"
<> showDefault
<> value (cmdlistenperformance sa)
)
cmdlistenprogress <- behaviorOption
( long "cmd_listen_progress"
<> metavar "BEHAVIOR"
<> help "`cmd listen --filter progress` behavior"
<> showDefault
<> value cmdlistenprogress
<> value (cmdlistenprogress sa)
)
cmdlistenpower <- behaviorOption
( long "cmd_listen_power"
<> metavar "BEHAVIOR"
<> help "`cmd listen --filter power` behavior"
<> showDefault
<> value cmdlistenpower
<> value (cmdlistenpower sa)
)
args <- some (argument str (metavar "ARGS" <> help "Application arguments."))
<|> pure (args sa)
pure StackArgs {..}
This diff is collapsed.
{-# LANGUAGE LambdaCase, OverloadedStrings, DataKinds,
FlexibleInstances, TypeOperators, RecordWildCards #-}
FlexibleInstances, ScopedTypeVariables, TypeOperators #-}
module Argo.Utils where
......@@ -14,15 +14,24 @@ import Data.Conduit
import Data.Conduit.Process hiding ( shell )
import Data.ByteString as B
hiding ( empty )
import System.IO ( BufferMode(NoBuffering)
, hSetBuffering
)
import Control.Monad.IO.Unlift ( MonadIO(..)
, MonadUnliftIO
, withRunInIO
)
import Data.Text.Encoding as TE
import Data.Conduit.Combinators as CC
import Control.Exception.Base
import Data.Typeable
import Data.Text as T
import qualified System.IO as IO
-- | Miscellaneous printing utilities
colorShell :: Color -> Shell () -> Shell ()
colorShell color s = setC color *> s *> setC White
colorShell color she = setC color *> she *> setC White
where setC c = liftIO $ setSGR [SetColor Foreground Dull c]
printInfo :: Text -> Shell ()
......@@ -33,22 +42,24 @@ printSuccess :: Text -> Shell ()
printTest :: Text -> Shell ()
dieRed :: Text -> Shell ()
printInfo = printf ("Info: " % s)
printInfo = printf ("Info: " % s% "\n")
printCommand = printf ("Running: " % s % "\n")
printWarning = colorShell Yellow . printf ("Warning: " % s)
printError = colorShell Red . printf ("Error: " % s)
printSuccess = colorShell Green . printf ("Success: " % s)
printWarning = colorShell Yellow . printf ("Warning: " % s% "\n")
printError = colorShell Red . printf ("Error: " % s% "\n")
printSuccess = colorShell Green . printf ("Success: " % s% "\n")
printTest = colorShell Green . printf ("RUNNING TEST: " % s % "\n")
dieRed str =
colorShell Red (printf ("Failure: " % s) str) >> exit (ExitFailure 1)
myWhich :: FilePath -> Shell FilePath
myWhich str = which str >>= \case
(Just p) ->
printInfo (format ("Found " % fp % " at " % fp % "\n") str p) >> return p
printInfo (format ("Found " % fp % " at " % fp) str p) >> return p
Nothing -> die $ format ("Argo `" % fp % "` not in $PATH.") str
myWhichMaybe :: FilePath -> Shell (Maybe FilePath)
myWhichMaybe str = which str >>= \case
(Just p) -> printInfo (format ("Found " % fp % " at " % fp % "\n") str p)
(Just p) -> printInfo (format ("Found " % fp % " at " % fp) str p)
>> return (Just p)
Nothing -> return Nothing
......@@ -56,7 +67,7 @@ sudoRemoveFile :: (Text -> Shell ()) -> Text -> FilePath -> Shell ()
sudoRemoveFile printer desc filePath = do
foundSocket <- testfile filePath
when foundSocket $ go False
printInfo $ format ("OK: " % s % " " % fp % "\n") desc filePath
printInfo $ format ("OK: " % s % " " % fp) desc filePath
where
go useSudo = do
printer $ format ("found stale " % s % " at " % fp % ".. ") desc filePath
......@@ -65,7 +76,7 @@ sudoRemoveFile printer desc filePath = do
Turtle.empty
>>= \case
ExitSuccess -> colorShell Green $ printf " Successfully removed.\n"
ExitFailure n -> if useSudo
ExitFailure _ -> if useSudo
then printer $ format
("Failed to remove stale " % s % ", even with sudo.")
desc
......@@ -76,13 +87,14 @@ sudoRemoveFile printer desc filePath = do
go True
verboseShell :: Text -> Shell Line -> Shell ExitCode
verboseShell command input = printCommand command >> shell command input
verboseShell command i = printCommand command >> shell command i
verboseShell' :: Text -> Shell Line -> Shell (ExitCode, Text, Text)
verboseShell' command input =
printCommand command >> shellStrictWithErr command input
verboseShell' command i = printCommand command >> shellStrictWithErr command i
cleanSocket :: FilePath -> Shell ()
cleanSocket = sudoRemoveFile printError "socket"
cleanLog :: FilePath -> Shell ()
cleanLog = sudoRemoveFile printWarning "log folder"
kbInstallHandler :: IO () -> IO Handler
......@@ -99,17 +111,16 @@ data Instrumentation = Instrumentation
deriving (Show)
runI :: Instrumentation -> IO (Either PatternMatched (ExitCode, (), ()))
runI (Instrumentation cp outlog@(StdOutLog out) errlog@(StdErrLog err) t) = try
(reroutedDaemon cp)
runI (Instrumentation crProc (StdOutLog stdOut) (StdErrLog stdErr) t) = try
(reroutedDaemon crProc)
where
reroutedDaemon process =
withSinkFile (T.unpack out)
$ \outSink ->
withSinkFile (T.unpack err) $ \errSink -> sourceProcessWithStreams
process
mempty
(makeMatcher t .| outSink)
(makeMatcher t .| errSink)
withSinkFileNoBuffering (T.unpack stdOut) $ \outSink ->
withSinkFile (T.unpack stdErr) $ \errSink -> sourceProcessWithStreams
process
mempty
(makeMatcher t .| outSink)
(makeMatcher t .| errSink)
makeMatcher maybeMessage = case maybeMessage of
Just (TestText msg) -> untilMatch msg
Nothing -> awaitForever yield
......@@ -124,8 +135,19 @@ runI (Instrumentation cp outlog@(StdOutLog out) errlog@(StdErrLog err) t) = try
untilMatch message
_ -> return ()
withSinkFileNoBuffering
:: (MonadUnliftIO m, MonadIO n)
=> IO.FilePath
-> (ConduitM ByteString o n () -> m a)
-> m a
withSinkFileNoBuffering filepath inner =
withRunInIO $ \run -> IO.withBinaryFile filepath IO.WriteMode $ \h -> do
hSetBuffering h NoBuffering
run $ inner $ sinkHandle h
processBehaviorToI :: CreateProcess -> ProcessBehavior -> Maybe Instrumentation
processBehaviorToI cp = \case
DontRun -> Nothing
JustRun out err -> Just $ Instrumentation cp out err Nothing
SucceedTestOnMessage t out err -> Just $ Instrumentation cp out err (Just t)
processBehaviorToI crProc = \case
DontRun -> Nothing
JustRun stdOut stdErr -> Just $ Instrumentation crProc stdOut stdErr Nothing
SucceedTestOnMessage t stdOut stdErr ->
Just $ Instrumentation crProc stdOut stdErr (Just t)
......@@ -19,4 +19,18 @@ executable argotk
build-depends: base, shake, argo, turtle, data-default, async, unix, text, optparse-applicative, foldl, ansi-terminal
--hs-source-dirs: src
default-language: Haskell2010
GHC-Options: -Wall
ghc-options:
-Wall
-Wincomplete-uni-patterns
-Wincomplete-record-updates
-Wmissing-home-modules
-Widentities
-Wredundant-constraints
-Wcpp-undef
-Wmissing-export-li
-fwarn-tabs
-fwarn-unused-imports
-fwarn-missing-signatures
-fwarn-name-shadowing
-fwarn-incomplete-patternssts
-fprint-potential-instances
#! /usr/bin/env runhaskell
{-# LANGUAGE OverloadedStrings, RecordWildCards, LambdaCase #-}
import Argo.Stack
......@@ -17,8 +16,8 @@ opts :: StackArgs -> Parser (Shell ())
opts sa = hsubparser
( command "clean"
(info (pure $ clean sa) (progDesc "Clean sockets, logfiles."))
<> (mconcat $ fmap commandTest [(minBound :: TestType) ..])
<> commandTests [TestHello, TestListen, TestPerfwrapper]
<> mconcat (fmap commandTest [(minBound :: TestType) ..])
<> commandTests [TestHello, TestListen, TestPerfwrapper, TestSTREAM]
"tests"
"Run hardware-independent CI tests"
<> help
......@@ -42,7 +41,11 @@ data TestType =
| TestHello
| TestListen
| TestPerfwrapper
| TestPower deriving (Enum,Bounded,Show)
| TestPower
| TestAMG
| TestSTREAM
| RunAMG
| RunSTREAM deriving (Enum,Bounded,Show)
data TestSpec = TestSpec
{ stackArgsUpdate :: StackArgs -> StackArgs
......@@ -61,7 +64,7 @@ doSpec :: TestSpec -> StackArgs -> Shell ()
doSpec spec stackArgs = do
printTest $ T.pack $ description spec
fullStack (isTest spec) stackArgs
printSuccess "Test Successful."
printSuccess "Test Successful.\n"
configureTest :: TestType -> TestSpec
configureTest = \case
......@@ -71,26 +74,29 @@ configureTest = \case
, isTest = IsTest False
}
DaemonAndApp -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlistenprogress = JustRun (StdOutLog "progress.csv")
(StdErrLog "progress.log")
, cmdlistenpower = JustRun (StdOutLog "power.csv") (StdErrLog "power.log")
}
{ stackArgsUpdate = \sa ->
sa { daemon = daemonBehavior, cmdrun = runBehavior }
, description = "Set up and start daemon, run a command in a container."
, isTest = IsTest False
}
CsvLogs -> TestSpec
{ stackArgsUpdate = \sa ->
sa { daemon = daemonBehavior, cmdrun = runBehavior }
{ stackArgsUpdate = \sa -> sa
{ manifestName = "perfwrap.json"
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlistenperformance = JustRun (StdOutLog "performance.csv")
(StdErrLog "performance.log")
, cmdlistenpower = JustRun (StdOutLog "power.csv") (StdErrLog "power.log")
, cmdlistenprogress = JustRun (StdOutLog "progress.csv")
(StdErrLog "progress.log")
}
, description = "Set up and start daemon, run a command in a container."
, isTest = IsTest False
}
TestHello -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ app = AppName "echo"
, args = AppArgs [msg]
, args = [AppArg msg]
, daemon = daemonBehavior
, cmdrun = SucceedTestOnMessage (TestText msg)
(StdOutLog "monitored-cmdrun-out.log")
......@@ -103,7 +109,7 @@ configureTest = \case
TestListen -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ app = AppName "sleep"
, args = AppArgs ["15"]
, args = [AppArg "15"]
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlisten = listentestBehavior (TestText ",")
......@@ -116,10 +122,10 @@ configureTest = \case
{ stackArgsUpdate = \sa -> sa
{ manifestName = "perfwrap.json"
, app = AppName "sleep"
, args = AppArgs ["15"]
, args = [AppArg "15"]
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlisten = listentestBehavior (TestText "performance")
, cmdlistenperformance = listenprogresstestBehavior (TestText ",")
}
, description = "3: Setup stack and check that argo-perf-wrapper sends\
\ at least one *performance* message to cmd listen through the\
......@@ -129,7 +135,7 @@ configureTest = \case
TestPower -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ app = AppName "sleep"
, args = AppArgs ["15"]
, args = [AppArg "15"]
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlisten = listentestBehavior (TestText "power")
......@@ -139,7 +145,78 @@ configureTest = \case
\ daemon."
, isTest = IsTest True
}
TestAMG -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ manifestName = "parallel.json"
, app = AppName "mpiexec"
, args = [ AppArg "-n"
, AppArg "24"
, AppArg "amg"
, AppArg "-problem"
, AppArg "2"
, AppArg "-n"
, AppArg "1"
, AppArg "1"
, AppArg "1"
, AppArg "-P"
, AppArg "8"
, AppArg "3"
, AppArg "1"
]
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlistenprogress = listenprogresstestBehavior (TestText ",")
}
, description = "5: Setup stack, run AMG and check that it sends\
\ at least one progress message to the daemon."
, isTest = IsTest True
}
TestSTREAM -> TestSpec
{ stackArgsUpdate = \sa -> sa
{ app = AppName "stream_c_20"
, args = []
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlistenprogress = listenprogresstestBehavior (TestText ",")
}
, description = "6: Setup stack, run STREAM and check that it sends\
\ at least one progress message to the daemon."
, isTest = IsTest True
}
RunAMG -> runAppSpec
(AppName "mpiexec")
[ AppArg "-n"
, AppArg "24"
, AppArg "amg"
, AppArg "-problem"
, AppArg "2"
, AppArg "-n"
, AppArg "10"
, AppArg "10"
, AppArg "10"
, AppArg "-P"
, AppArg "8"
, AppArg "3"
, AppArg "1"
]
RunSTREAM -> runAppSpec (AppName "stream_c_20000") []
where
runAppSpec appName appArgs = TestSpec
{ stackArgsUpdate = \sa -> sa
{ app = appName
, args = appArgs
, manifestName = "parallel.json"
, daemon = daemonBehavior
, cmdrun = runBehavior
, cmdlistenperformance = JustRun (StdOutLog "performance.csv")
(StdErrLog "performance.log")
, cmdlistenpower = JustRun (StdOutLog "power.csv") (StdErrLog "power.log")
, cmdlistenprogress = JustRun (StdOutLog "progress.csv")
(StdErrLog "progress.log")
}
, description = "Set up and start daemon, run app in a container."
, isTest = IsTest False
}
msg = "someComplicatedMessage"
daemonBehavior =
JustRun (StdOutLog "daemon_out.log") (StdErrLog "daemon_err.log")
......@@ -149,22 +226,25 @@ configureTest = \case
t
(StdOutLog "cmd_listen_out.log")
(StdErrLog "cmd_listen_err.log")
listenprogresstestBehavior t = SucceedTestOnMessage
t
(StdOutLog "cmd_listen_progress_out.log")
(StdErrLog "cmd_listen_progress_err.log")
newtype IsTest = IsTest Bool
fullStack :: IsTest -> StackArgs -> Shell ()
fullStack (IsTest b) a@StackArgs {..} = runStack a >>= \case
FoundMessage -> printSuccess "Found message!\n"
FoundMessage -> printSuccess "Found message!"
Died stacki errorcode -> if b
then
printError
( repr stacki
<> " died before a message could be found:"
<> repr errorcode
<> "\n"
)
>> exit (ExitFailure 1)
else exit (ExitSuccess)
else exit ExitSuccess
clean :: StackArgs -> Shell ()
clean StackArgs {..} = cleanLeftovers workingDirectory
......
......@@ -8,9 +8,13 @@
inherit (pinnedVersion) url rev sha256;
},
pkgs ? import argopkgs-src {},
nrm-src ? pkgs.nodelevel.nrm.src,
nrm-src ? pkgs.nodelevel.nrm.src,
containers-src ? pkgs.nodelevel.containers.src,
libnrm-src ? pkgs.nodelevel.libnrm.src
libnrm-src ? pkgs.nodelevel.libnrm.src,
amg-src ? pkgs.applications.nrm.amg.src,
lammps-src ? pkgs.applications.nrm.lammps.src,
qmcpack-src ? pkgs.applications.nrm.qmcpack.src,
stream-src ? pkgs.applications.nrm.stream.src,
}:
let
filterHdevTools = builtins.filterSource (path: type: baseNameOf path != ".hdevtools.sock");
......@@ -44,11 +48,14 @@ let
in rec
{
nrm = pkgs.nodelevel.nrm.overrideAttrs (old: { src = nrm-src; });
libnrm = pkgs.nodelevel.libnrm.overrideAttrs (old: { src = libnrm-src; });
containers = pkgs.nodelevel.containers.overrideAttrs (old: { src = containers-src; });
amg = pkgs.applications.nrm.amg;
nrm = pkgs.nodelevel.nrm.overrideAttrs (old: {src = nrm-src;} );
libnrm = pkgs.nodelevel.libnrm.overrideAttrs (old: {src = libnrm-src;} );
containers = pkgs.nodelevel.containers.overrideAttrs (old: {src = containers-src;} );
amg = (pkgs.applications.nrm.amg.overrideAttrs (old: {src = amg-src;} )).override {libnrm=libnrm;};
qmcpack = (pkgs.applications.nrm.qmcpack.overrideAttrs (old: {src = qmcpack-src;} )).override {libnrm=libnrm;};
stream-test = (pkgs.applications.nrm.stream.overrideAttrs (old: {src = stream-src;} )).override {libnrm=libnrm; iterationCount = "20";};
stream = (pkgs.applications.nrm.stream.overrideAttrs (old: {src = stream-src;} )).override {libnrm=libnrm; iterationCount = "20000";};
lammps = (pkgs.applications.nrm.lammps.overrideAttrs (old: {src = lammps-src;} )).override {libnrm=libnrm;};
inherit(hpkgs) argo argotk;
......@@ -95,7 +102,10 @@ in rec
pkgs.coreutils
pkgs.utillinux
containers
amg
amg stream stream-test
#qmcpack
#lammps
pkgs.mpich2
nrm
];
inherit shellHook;
......@@ -107,8 +117,10 @@ in rec
env = pkgs.buildEnv { name = name; paths = buildInputs; };
buildInputs = [
containers
amg
nrm
amg stream stream-test
#qmcpack
#lammps
(hpkgs.ghcWithPackages (p: devHPackages ++ [
argotk
argo
......@@ -137,7 +149,4 @@ in rec
in pkgs.writeText "test-list" (''
Available test provenance configurations:
''+(builtins.concatStringsSep "\n" (pkgs.lib.mapAttrsToList showTest tests)));
#testsRepresentations = pkgs.lib.mapAttrsToList (name: value: name ) tests;
#output = builtins.concatStringsSep "\n" testsRepresentations;
}
......@@ -75,6 +75,20 @@ nrm.build:
- XDG_CACHE_HOME=$CACHE nix-shell .nix -A test --run "argotk.hs TestSTREAM --verbose"
- rm -rf $CACHE
.TestAMG.test:
extends: .nix-integration
script:
- CACHE=$(mktemp -d --suffix=nixcache /tmp/deletable-nix-cache-XXXX)
- XDG_CACHE_HOME=$CACHE nix-shell .nix -A test --run "argotk.hs TestAMG"
- rm -rf $CACHE
.TestSTREAM.test:
extends: .nix-integration
script:
- CACHE=$(mktemp -d --suffix=nixcache /tmp/deletable-nix-cache-XXXX)
- XDG_CACHE_HOME=$CACHE nix-shell .nix -A test --run "argotk.hs TestSTREAM"
- rm -rf $CACHE
KNL-Power.test:
extends: .TestPower.test
tags:
......
{
"acKind": "ImageManifest",
"acVersion": "0.6.0",
"name": "test",
"app": {
"isolators": [
{
"name": "argo/scheduler",
"value": {
"policy": "SCHED_OTHER",
"priority": "0"
}
},
{
"name": "argo/container",
"value": {
"cpus": "24",
"mems": "1"
}
},
{
"name": "argo/perfwrapper",
"value": {
"enabled": "1"
}
},
{
"name": "argo/power",
"value": {
"enabled": "0",
"profile": "0",
"policy": "NONE",
"damper": "0.1",
"slowdown": "1.1"
}
}
]
}
}
let
ghcOpts = [
"-Wall"
"-Wincomplete-uni-patterns"
"-Wincomplete-record-updates"
"-Wmissing-home-modules"
"-Widentities"
"-Wredundant-constraints"
"-Wcpp-undef"
#"-fwarn-missing-export-li"
"-fwarn-tabs"
"-fwarn-unused-imports"
"-fwarn-missing-signatures"
"-fwarn-name-shadowing"
"-fwarn-incomplete-patterns"
"-fprint-potential-instances"
];
argo = {
src = ./argo/src;
dependencies = [
"base"
"turtle"
"data-default"
"managed"
"ansi-terminal"
"unix"
"system-filepath"
"async"
"process"
"text"
"optparse-applicative"
"extra"