1*387f9dfdSAndroid Build Coastguard Worker#!/bin/bash 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker#set -x 4*387f9dfdSAndroid Build Coastguard Workerset -e 5*387f9dfdSAndroid Build Coastguard Worker 6*387f9dfdSAndroid Build Coastguard Workerfunction usage() { 7*387f9dfdSAndroid Build Coastguard Worker cat <<DELIM__ 8*387f9dfdSAndroid Build Coastguard Workerusage: $(basename $0) [options] 9*387f9dfdSAndroid Build Coastguard Worker 10*387f9dfdSAndroid Build Coastguard WorkerOptions: 11*387f9dfdSAndroid Build Coastguard Worker -b, --bridge BRNAME Which linux bridge to attach to 12*387f9dfdSAndroid Build Coastguard Worker -c, --cpu NUM Number of CPUs to reserve to the instance (default 4) 13*387f9dfdSAndroid Build Coastguard Worker -g, --github_token X HTTP Github oauth token (for buildbots) 14*387f9dfdSAndroid Build Coastguard Worker -k, --kickstart KS Path to kickstart file to use (required) 15*387f9dfdSAndroid Build Coastguard Worker -m, --mirror URL URL at which to reach netinstallable packages 16*387f9dfdSAndroid Build Coastguard Worker -M, --mem NUM Number of MB to reserve to the instance (default 4094) 17*387f9dfdSAndroid Build Coastguard Worker -n, --name NAME Name of the instance (required) 18*387f9dfdSAndroid Build Coastguard Worker -p, --password PASS Password to set in the VM 19*387f9dfdSAndroid Build Coastguard Worker -s, --size NUM Size in GB to reserve for the virtual HDD (default 40GB) 20*387f9dfdSAndroid Build Coastguard WorkerDELIM__ 21*387f9dfdSAndroid Build Coastguard Worker} 22*387f9dfdSAndroid Build Coastguard Worker 23*387f9dfdSAndroid Build Coastguard WorkerTEMP=$(getopt -o b:c:k:m:M:n:p:s: --long bridge:,cpu:,kickstart:,mirror:,mem:,name:,password:size: -- "$@") 24*387f9dfdSAndroid Build Coastguard Workerif [[ $? -ne 0 ]]; then 25*387f9dfdSAndroid Build Coastguard Worker usage 26*387f9dfdSAndroid Build Coastguard Worker exit 1 27*387f9dfdSAndroid Build Coastguard Workerfi 28*387f9dfdSAndroid Build Coastguard Worker 29*387f9dfdSAndroid Build Coastguard Workereval set -- "$TEMP" 30*387f9dfdSAndroid Build Coastguard Worker 31*387f9dfdSAndroid Build Coastguard Workerwhile true; do 32*387f9dfdSAndroid Build Coastguard Worker case "$1" in 33*387f9dfdSAndroid Build Coastguard Worker -b|--bridge) BRIDGE="$2"; shift 2 ;; 34*387f9dfdSAndroid Build Coastguard Worker -c|--cpu) CPU="$2"; shift 2 ;; 35*387f9dfdSAndroid Build Coastguard Worker -k|--kickstart) KICKSTART="$2"; shift 2 ;; 36*387f9dfdSAndroid Build Coastguard Worker -n|--name) NAME="$2"; shift 2 ;; 37*387f9dfdSAndroid Build Coastguard Worker -m|--mirror) MIRROR="$2"; shift 2 ;; 38*387f9dfdSAndroid Build Coastguard Worker -M|--mem) MEM="$2"; shift 2 ;; 39*387f9dfdSAndroid Build Coastguard Worker -p|--password) PASSWORD="$2"; shift 2 ;; 40*387f9dfdSAndroid Build Coastguard Worker -s|--size) SIZE="$2"; shift 2 ;; 41*387f9dfdSAndroid Build Coastguard Worker --) shift; break ;; 42*387f9dfdSAndroid Build Coastguard Worker *) usage; exit 1 43*387f9dfdSAndroid Build Coastguard Worker ;; 44*387f9dfdSAndroid Build Coastguard Worker esac 45*387f9dfdSAndroid Build Coastguard Workerdone 46*387f9dfdSAndroid Build Coastguard Worker[[ ! -f "$KICKSTART" ]] && { usage; exit 1; } 47*387f9dfdSAndroid Build Coastguard Worker[[ -z "$NAME" ]] && { usage; exit 1; } 48*387f9dfdSAndroid Build Coastguard Worker 49*387f9dfdSAndroid Build Coastguard WorkerPASSWORD=${PASSWORD:-"iovisor"} 50*387f9dfdSAndroid Build Coastguard WorkerBRIDGE=${BRIDGE:-virbr0} 51*387f9dfdSAndroid Build Coastguard WorkerMIRROR=${MIRROR:-http://mirror.pnl.gov/fedora/linux/releases/22} 52*387f9dfdSAndroid Build Coastguard WorkerMEM=${MEM:-4094} 53*387f9dfdSAndroid Build Coastguard WorkerCPU=${CPU:-4} 54*387f9dfdSAndroid Build Coastguard WorkerSIZE=${SIZE:-40} 55*387f9dfdSAndroid Build Coastguard Worker 56*387f9dfdSAndroid Build Coastguard Workerif [[ "$(id -u)" != "0" ]]; then 57*387f9dfdSAndroid Build Coastguard Worker sudo="sudo" 58*387f9dfdSAndroid Build Coastguard Workerfi 59*387f9dfdSAndroid Build Coastguard Worker 60*387f9dfdSAndroid Build Coastguard Workerif ! which virt-install &> /dev/null; then 61*387f9dfdSAndroid Build Coastguard Worker echo "Error: virt-install is not installed" 62*387f9dfdSAndroid Build Coastguard Worker exit 1 63*387f9dfdSAndroid Build Coastguard Workerfi 64*387f9dfdSAndroid Build Coastguard Worker 65*387f9dfdSAndroid Build Coastguard Workerlibvirt_dir=/var/lib/libvirt/images 66*387f9dfdSAndroid Build Coastguard Workerimg_name=$NAME 67*387f9dfdSAndroid Build Coastguard Workertmpdir=$(mktemp -d /tmp/virt-install_XXXXX) 68*387f9dfdSAndroid Build Coastguard Workertmp_ks_file=$tmpdir/$img_name.ks 69*387f9dfdSAndroid Build Coastguard Worker 70*387f9dfdSAndroid Build Coastguard Workerfunction cleanup() { 71*387f9dfdSAndroid Build Coastguard Worker set +e 72*387f9dfdSAndroid Build Coastguard Worker [[ -d "$tmpdir" ]] && rm -fr "$tmpdir" 73*387f9dfdSAndroid Build Coastguard Worker local destroy_kvm=n 74*387f9dfdSAndroid Build Coastguard Worker [[ -f "/etc/libvirt/qemu/$img_name.xml" ]] && read -p "Destroy libvirt VM (y/n)? " destroy_kvm 75*387f9dfdSAndroid Build Coastguard Worker if [[ "$destroy_kvm" != n* ]]; then 76*387f9dfdSAndroid Build Coastguard Worker virsh destroy $img_name 77*387f9dfdSAndroid Build Coastguard Worker virsh undefine $img_name 78*387f9dfdSAndroid Build Coastguard Worker virsh vol-delete $img_name.img --pool default 79*387f9dfdSAndroid Build Coastguard Worker $sudo rm -f $libvirt_dir/$img_name.img 80*387f9dfdSAndroid Build Coastguard Worker fi 81*387f9dfdSAndroid Build Coastguard Worker} 82*387f9dfdSAndroid Build Coastguard Workertrap cleanup EXIT 83*387f9dfdSAndroid Build Coastguard Worker 84*387f9dfdSAndroid Build Coastguard Workerruby <<DELIM__ 85*387f9dfdSAndroid Build Coastguard Workerrequire 'erb' 86*387f9dfdSAndroid Build Coastguard Worker@password="$PASSWORD" 87*387f9dfdSAndroid Build Coastguard Worker@name="$NAME" 88*387f9dfdSAndroid Build Coastguard Worker@domain="example.com" 89*387f9dfdSAndroid Build Coastguard Worker@github_access_token="$GITHUB_ACCESS_TOKEN" 90*387f9dfdSAndroid Build Coastguard Worker@mirror="$MIRROR" 91*387f9dfdSAndroid Build Coastguard WorkerFile.open('$tmp_ks_file', 'w') do |f| 92*387f9dfdSAndroid Build Coastguard Worker f.puts ERB.new(File.open('$KICKSTART', 'rb').read, nil, '-').result() 93*387f9dfdSAndroid Build Coastguard Workerend 94*387f9dfdSAndroid Build Coastguard WorkerDELIM__ 95*387f9dfdSAndroid Build Coastguard Worker 96*387f9dfdSAndroid Build Coastguard Workertree=$MIRROR/Server/x86_64/os/ 97*387f9dfdSAndroid Build Coastguard Workervirt-install --connect=qemu:///system \ 98*387f9dfdSAndroid Build Coastguard Worker --network=bridge:$BRIDGE \ 99*387f9dfdSAndroid Build Coastguard Worker --initrd-inject=$tmp_ks_file \ 100*387f9dfdSAndroid Build Coastguard Worker --controller type=scsi,model=virtio-scsi \ 101*387f9dfdSAndroid Build Coastguard Worker --extra-args="ks=file:/$(basename $tmp_ks_file) console=tty0 console=ttyS0,115200" \ 102*387f9dfdSAndroid Build Coastguard Worker --name=$img_name \ 103*387f9dfdSAndroid Build Coastguard Worker --disk $libvirt_dir/$img_name.img,cache=none,format=qcow2,size=$SIZE,bus=scsi \ 104*387f9dfdSAndroid Build Coastguard Worker --ram $MEM \ 105*387f9dfdSAndroid Build Coastguard Worker --vcpus=$CPU \ 106*387f9dfdSAndroid Build Coastguard Worker --check-cpu \ 107*387f9dfdSAndroid Build Coastguard Worker --accelerate \ 108*387f9dfdSAndroid Build Coastguard Worker --hvm \ 109*387f9dfdSAndroid Build Coastguard Worker --location=$tree \ 110*387f9dfdSAndroid Build Coastguard Worker --nographics 111*387f9dfdSAndroid Build Coastguard Worker 112*387f9dfdSAndroid Build Coastguard Workerecho "SUCCESS" 113*387f9dfdSAndroid Build Coastguard Workerexit 0 114