DIRNAME=$(dirname $0)
BUILD="${HOME}/git-build"
+
+echo "Updating $BUILD"
+cd $BUILD
+git pull
+cd -
+
+LOGS=$HOME/machines
+
+[ -d $LOGS ] || { echo "Creating logs dir $LOGS" ; mkdir -p $LOGS; }
+
DOMAIN=pl.sophia.inria.fr
-DEFAULT_DISTRO=f14
-DEFAULT_PERSO=linux64
+DEFAULT_DISTRO=f20
-INTERACTIVE=
-DISTRO=$DEFAULT_DISTRO
-PERSO=$DEFAULT_PERSO
+CONFIRM=
function usage () {
message="$@"
- echo "usage : $COMMAND [-i] [-f distro] [-p perso] hostname"
- echo " default distro is $DEFAULT_DISTRO"
- echo " default perso is $DEFAULT_PERSO"
+ echo "usage : $COMMAND [-c] [-f distro] [-i image] [ -m memory ] [ -n hostname ] [-s] container"
+ echo " -c : confirm, will show the command and prompt for confirmation "
+ echo " -f : set distro, default is $DEFAULT_DISTRO"
+ echo " -i : if specified, image is rsynced into /vservers"
+ echo " warning: we cannot use an image already in /vservers..."
+ echo " -m : memory size in Mb - default is 512"
+ echo " -n : specify hostname if different from container"
+ echo " -s : do not start VM"
+ echo " container : used for /vservers/foo as well as the lxc/libvirt name"
+ echo "examples"
+ echo " create-vm.sh sandbox"
+ echo " Builds a brand new $DEFAULT_DISTRO 64bits VM named sandbox with hostname sandbox.pl.sophia.inria.fr"
+ echo " create-vm.sh -i /vservers/migrating/testmaster -n testmaster testmaster.f14"
+ echo " Create a container named testmaster.f14 from the specified image with hostname testmaster.pl.sophia.inria.fr"
[ -n "$message" ] && echo $message
exit 1
}
-while getopts "f:p:ih" flag; do
+# using HOSTNAME won't work as this is already set in environment
+while getopts "cf:i:m:n:sh" flag; do
case $flag in
- f) DISTRO=$OPTARG;;
- p) PERSO=$OPTARG;;
- i) INTERACTIVE=true ;;
+ c) CONFIRM=true ;;
+ f) DISTRO=$OPTARG ;;
+ i) IMAGE=$OPTARG ;;
+ m) MEMORY=$OPTARG ;;
+ n) VM_HOSTNAME=$OPTARG ;;
+ s) DO_NOT_START_VM=true ;;
?|h) usage "" ;;
esac
done
+# parse args
shift $((OPTIND-1))
[[ -z "$@" ]] && usage "no hostname provided"
-HOSTNAME="$1" ; shift
-[[ -n "$@" ]] && usage "extra arguments" "$@" "(hostname=$HOSTNAME)"
-
+container="$1" ; shift
+[[ -n "$@" ]] && usage "extra arguments" "$@" "(container=$container)"
+# sanity checks
[ -d "$BUILD" ] || usage "Could not find directory $BUILD"
+[ -d /vservers/$container ] && usage "container $container already exists in /vservers"
-[ -d /vservers/$HOSTNAME ] && usage "vserver $HOSTNAME already exists in /vservers"
-[ -d /etc/vservers/.distributions/$DISTRO ] || usage "distro $DISTRO not known in /etc/vservers/.distributions/"
+# compute all vars from args
+[ -z "$DISTRO" ] && DISTRO="$DEFAULT_DISTRO"
+[ -z "$VM_HOSTNAME" ] && VM_HOSTNAME="$container"
+fqdn=$VM_HOSTNAME.$DOMAIN
-fqdn=$HOSTNAME.$DOMAIN
-## compute IP
-host $fqdn | grep -q 'has address' || usage "hostname $fqdn not known to DNS"
-ip=$(host $fqdn | grep 'has address' | awk '{print $4}')
+# prepare initvm command
+initvm="$BUILD/lbuild-initvm.sh"
+[ -z "$IMAGE" ] && initvm="$initvm -f $DISTRO" || initvm="$initvm -i $IMAGE"
+initvm="$initvm -n $fqdn"
+[ -n "$DO_NOT_START_VM" ] && initvm="$initvm -s"
+[ -n "$MEMORY" ] && initvm="$initvm -m $MEMORY"
+initvm="$initvm $container"
-cd $BUILD
-git pull
-cd -
-
-# single_ip needs to be turned off, vtest-initvm now takes care of that
-command="$BUILD/vtest-initvm.sh -p $PERSO -f $DISTRO $HOSTNAME none -- --interface eth0:$ip --hostname $fqdn"
-
-if [ -n "$INTERACTIVE" ] ; then
- echo -n "Run $command OK ? "
+if [ -n "$CONFIRM" ] ; then
+ echo -n "Run $initvm OK ? "
read answer ; case $answer in [nN]*) exit 1 ;; esac
fi
-$command
+echo "Running $initvm"
+echo "Storing output in $LOGS/$container.log"
+$initvm >& $LOGS/$container.log
+