#!/bin/bash #set -x set -e function usage() { cat <<DELIM__ usage: $(basename $0) [options] Options: -b, --bridge BRNAME Which linux bridge to attach to -c, --cpu NUM Number of CPUs to reserve to the instance (default 4) -g, --github_token X HTTP Github oauth token (for buildbots) -k, --kickstart KS Path to kickstart file to use (required) -m, --mirror URL URL at which to reach netinstallable packages -M, --mem NUM Number of MB to reserve to the instance (default 4094) -n, --name NAME Name of the instance (required) -p, --password PASS Password to set in the VM -s, --size NUM Size in GB to reserve for the virtual HDD (default 40GB) DELIM__ } TEMP=$(getopt -o b:c:k:m:M:n:p:s: --long bridge:,cpu:,kickstart:,mirror:,mem:,name:,password:size: -- "$@") if [[ $? -ne 0 ]]; then usage exit 1 fi eval set -- "$TEMP" while true; do case "$1" in -b|--bridge) BRIDGE="$2"; shift 2 ;; -c|--cpu) CPU="$2"; shift 2 ;; -k|--kickstart) KICKSTART="$2"; shift 2 ;; -n|--name) NAME="$2"; shift 2 ;; -m|--mirror) MIRROR="$2"; shift 2 ;; -M|--mem) MEM="$2"; shift 2 ;; -p|--password) PASSWORD="$2"; shift 2 ;; -s|--size) SIZE="$2"; shift 2 ;; --) shift; break ;; *) usage; exit 1 ;; esac done [[ ! -f "$KICKSTART" ]] && { usage; exit 1; } [[ -z "$NAME" ]] && { usage; exit 1; } PASSWORD=${PASSWORD:-"iovisor"} BRIDGE=${BRIDGE:-virbr0} MIRROR=${MIRROR:-http://mirror.pnl.gov/fedora/linux/releases/22} MEM=${MEM:-4094} CPU=${CPU:-4} SIZE=${SIZE:-40} if [[ "$(id -u)" != "0" ]]; then sudo="sudo" fi if ! which virt-install &> /dev/null; then echo "Error: virt-install is not installed" exit 1 fi libvirt_dir=/var/lib/libvirt/images img_name=$NAME tmpdir=$(mktemp -d /tmp/virt-install_XXXXX) tmp_ks_file=$tmpdir/$img_name.ks function cleanup() { set +e [[ -d "$tmpdir" ]] && rm -fr "$tmpdir" local destroy_kvm=n [[ -f "/etc/libvirt/qemu/$img_name.xml" ]] && read -p "Destroy libvirt VM (y/n)? " destroy_kvm if [[ "$destroy_kvm" != n* ]]; then virsh destroy $img_name virsh undefine $img_name virsh vol-delete $img_name.img --pool default $sudo rm -f $libvirt_dir/$img_name.img fi } trap cleanup EXIT ruby <<DELIM__ require 'erb' @password="$PASSWORD" @name="$NAME" @domain="example.com" @github_access_token="$GITHUB_ACCESS_TOKEN" @mirror="$MIRROR" File.open('$tmp_ks_file', 'w') do |f| f.puts ERB.new(File.open('$KICKSTART', 'rb').read, nil, '-').result() end DELIM__ tree=$MIRROR/Server/x86_64/os/ virt-install --connect=qemu:///system \ --network=bridge:$BRIDGE \ --initrd-inject=$tmp_ks_file \ --controller type=scsi,model=virtio-scsi \ --extra-args="ks=file:/$(basename $tmp_ks_file) console=tty0 console=ttyS0,115200" \ --name=$img_name \ --disk $libvirt_dir/$img_name.img,cache=none,format=qcow2,size=$SIZE,bus=scsi \ --ram $MEM \ --vcpus=$CPU \ --check-cpu \ --accelerate \ --hvm \ --location=$tree \ --nographics echo "SUCCESS" exit 0