X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fcreate-vm.sh;h=617ec51cf26496782725ea61379b06ac33fd8044;hb=b1b042a53d694d548a0da1cd0793ad1e9a3734ea;hp=6baafc5a6919d6108a573f0803740a1dd5e9dfe8;hpb=4139609455bd92533c092a7875b7e414e801cab0;p=infrastructure.git diff --git a/scripts/create-vm.sh b/scripts/create-vm.sh index 6baafc5..617ec51 100755 --- a/scripts/create-vm.sh +++ b/scripts/create-vm.sh @@ -4,56 +4,84 @@ COMMAND=$(basename $0) DIRNAME=$(dirname $0) BUILD="${HOME}/git-build" + +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=f23 +DEFAULT_MEMORY=4096 -INTERACTIVE= -DISTRO=$DEFAULT_DISTRO -PERSO=$DEFAULT_PERSO +CONFIRM= function usage () { - message="$1" ; shift - echo "usage : $COMMAND [-i] [-f distro] [-p perso] hostname" - echo " default distro is $DEFAULT_DISTRO" - echo " default perso is $DEFAULT_PERSO" + message="$@" + 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 $DEFAULT_MEMORY" + 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 "fp: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" - +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/" - -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}') - +echo "Updating $BUILD" cd $BUILD git pull cd - -command="$BUILD/vtest-init-vserver.sh -p $PERSO -f $DISTRO $HOSTNAME none -- --netdev eth0 --interface $ip --interface nodev:127.0.0.1 --hostname $fqdn" --flags '~single_ip' +# compute all vars from args +[ -z "$DISTRO" ] && DISTRO="$DEFAULT_DISTRO" +[ -z "$MEMORY" ] && MEMORY="$DEFAULT_MEMORY" +[ -z "$VM_HOSTNAME" ] && VM_HOSTNAME="$container" +fqdn=$VM_HOSTNAME.$DOMAIN -if [ -n "$INTERACTIVE" ] ; then - echo -n "Run $command OK ? " +# 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" + +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 +