Experimental garlic tool
This commit is contained in:
parent
d5d42b3c09
commit
6b40e6f9e9
35
garlic/sh/default.nix
Normal file
35
garlic/sh/default.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
stdenv
|
||||||
|
, garlicTools
|
||||||
|
, sshHost
|
||||||
|
, rsync
|
||||||
|
, openssh
|
||||||
|
, nix
|
||||||
|
}:
|
||||||
|
|
||||||
|
with garlicTools;
|
||||||
|
|
||||||
|
let
|
||||||
|
garlicOut = "/mnt/garlic/out";
|
||||||
|
garlicTemp = "/tmp/garlic";
|
||||||
|
in
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "garlic-tool";
|
||||||
|
preferLocalBuild = true;
|
||||||
|
|
||||||
|
buildInputs = [ rsync openssh nix ];
|
||||||
|
phases = [ "unpackPhase" "installPhase" ];
|
||||||
|
|
||||||
|
src = ./.;
|
||||||
|
|
||||||
|
inherit garlicOut garlicTemp sshHost;
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
substituteAllInPlace garlic
|
||||||
|
substituteInPlace garlic \
|
||||||
|
--replace @PATH@ $PATH
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp garlic $out/bin
|
||||||
|
chmod +x $out/bin/garlic
|
||||||
|
'';
|
||||||
|
}
|
197
garlic/sh/garlic
Executable file
197
garlic/sh/garlic
Executable file
@ -0,0 +1,197 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
garlicOut=@garlicOut@
|
||||||
|
garlicTemp=@garlicTemp@
|
||||||
|
sshHost=@sshHost@
|
||||||
|
PATH=@PATH@
|
||||||
|
|
||||||
|
usage() { echo "Usage: garlic [-RFwq] [-e experiment] [-t trebuchet]" 1>&2; exit 1; }
|
||||||
|
|
||||||
|
trebuchetFromExperiment() {
|
||||||
|
nix-store -q --referrers $1 | grep trebuchet
|
||||||
|
}
|
||||||
|
experimentFromTrebuchet() {
|
||||||
|
nix-store -qR $1 | grep experiment
|
||||||
|
}
|
||||||
|
|
||||||
|
drvFromOutput() {
|
||||||
|
nix-store -q --deriver $1
|
||||||
|
}
|
||||||
|
|
||||||
|
checkTrebuchet() {
|
||||||
|
if [ ! -e "$trebuchet" ]; then
|
||||||
|
>&2 echo "$trebuchet: not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$trebuchet" ]; then
|
||||||
|
>&2 echo "$trebuchet: not a file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# FIXME: We need a better way to determine a trebuchet
|
||||||
|
if [ -z "$(grep "This trebuchet launches" $trebuchet)" ]; then
|
||||||
|
>&2 echo "$trebuchet: not a trebuchet"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
checkExperiment() {
|
||||||
|
if [ ! -e "$experiment" ]; then
|
||||||
|
>&2 echo "$experiment: not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$experiment" ]; then
|
||||||
|
>&2 echo "$experiment: not a file"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# FIXME: We need a better way to determine a experiment
|
||||||
|
if [ -z "$(grep "This is an experiment" $experiment)" ]; then
|
||||||
|
>&2 echo "$experiment: not an experiment"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
do_fetch() {
|
||||||
|
expName=$(basename $experiment)
|
||||||
|
user=$(ssh -G "$sshHost" | awk '/^user /{print $2}')
|
||||||
|
exp=$garlicOut/$user/$expName
|
||||||
|
|
||||||
|
if [ ! -e "$exp" ]; then
|
||||||
|
echo "missing experiment: $exp"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cwd=$(pwd)
|
||||||
|
|
||||||
|
repeat=1
|
||||||
|
while [ 1 ]; do
|
||||||
|
repeat=0
|
||||||
|
cd $exp
|
||||||
|
test $verbose && >&2 echo "$exp: checking units"
|
||||||
|
|
||||||
|
for unit in *-unit; do
|
||||||
|
cd $exp/$unit
|
||||||
|
if [ ! -e status ]; then
|
||||||
|
|
||||||
|
test $verbose && >&2 echo "$unit: no status"
|
||||||
|
repeat=1
|
||||||
|
else
|
||||||
|
st=$(cat status)
|
||||||
|
test $verbose && >&2 echo "$unit: $st"
|
||||||
|
if [ "$st" != "completed" ]; then
|
||||||
|
repeat=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $repeat -eq 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $waitResults -eq 1 ]; then
|
||||||
|
#echo "waiting 3 seconds to try again"
|
||||||
|
sleep 3
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $repeat -eq 1 ]; then
|
||||||
|
>&2 echo "$exp: execution incomplete"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$cwd"
|
||||||
|
|
||||||
|
test $verbose && >&2 echo "$exp: execution complete, fetching results"
|
||||||
|
|
||||||
|
mkdir -p $garlicTemp
|
||||||
|
|
||||||
|
rsync -rt --copy-links \
|
||||||
|
--include='*/*/garlic_config.json' \
|
||||||
|
--include='*/*/std*.log' \
|
||||||
|
--include='*/*/*/std*.log' \
|
||||||
|
--exclude='*/*/*/*' \
|
||||||
|
$exp $garlicTemp
|
||||||
|
|
||||||
|
nix-build -E "(with import ./default.nix; \
|
||||||
|
garlic.pp.store { \
|
||||||
|
experimentStage = import \"$experimentDrv\";
|
||||||
|
trebuchetStage = import \"$trebuchetDrv\";
|
||||||
|
})"
|
||||||
|
|
||||||
|
rm -rf $garlicTemp/$expName
|
||||||
|
}
|
||||||
|
|
||||||
|
do_run() {
|
||||||
|
|
||||||
|
$trebuchet
|
||||||
|
}
|
||||||
|
|
||||||
|
waitResults=1
|
||||||
|
verbose=1
|
||||||
|
operation=
|
||||||
|
target=
|
||||||
|
enableRun=
|
||||||
|
enableFetch=
|
||||||
|
|
||||||
|
while getopts "qwRFe:t:" o; do
|
||||||
|
case "${o}" in
|
||||||
|
e) experiment=${OPTARG} ;;
|
||||||
|
t) trebuchet=${OPTARG} ;;
|
||||||
|
R) enableRun=1 ;;
|
||||||
|
F) enableFetch=1 ;;
|
||||||
|
w) waitResults=0 ;;
|
||||||
|
q) verbose= ;;
|
||||||
|
*) usage ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
#target="$1"
|
||||||
|
|
||||||
|
if [ -z "$trebuchet" -a -z "$experiment" ]; then
|
||||||
|
>&2 echo "missing trebuchet or experiment"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$enableRun" -a -z "$enableFetch" ]; then
|
||||||
|
>&2 echo "missing operation"
|
||||||
|
usage
|
||||||
|
fi
|
||||||
|
|
||||||
|
#if [ -z "$target" ]; then
|
||||||
|
# >&2 echo "missing target"
|
||||||
|
# usage
|
||||||
|
#fi
|
||||||
|
|
||||||
|
#trebuchet=$(nix-build -A "exp.$target")
|
||||||
|
#checkTrebuchet $trebuchet
|
||||||
|
#experiment=$(experimentFromTrebuchet $trebuchet)
|
||||||
|
#checkExperiment $experiment
|
||||||
|
|
||||||
|
if [ ! -z "$trebuchet" ]; then
|
||||||
|
checkTrebuchet $trebuchet
|
||||||
|
trebuchet=$(readlink -f $trebuchet)
|
||||||
|
experiment=$(experimentFromTrebuchet $trebuchet)
|
||||||
|
checkExperiment $experiment
|
||||||
|
else
|
||||||
|
checkExperiment $experiment
|
||||||
|
experiment=$(readlink -f $experiment)
|
||||||
|
trebuchet=$(trebuchetFromExperiment $experiment)
|
||||||
|
checkTrebuchet $trebuchet
|
||||||
|
fi
|
||||||
|
|
||||||
|
trebuchetDrv=$(drvFromOutput $trebuchet)
|
||||||
|
experimentDrv=$(drvFromOutput $experiment)
|
||||||
|
|
||||||
|
if [ $enableRun ]; then do_run; fi
|
||||||
|
if [ $enableFetch ]; then do_fetch; fi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user