Initial commit
This commit is contained in:
commit
c6e0e37381
178
qemu.hook
Normal file
178
qemu.hook
Normal file
|
@ -0,0 +1,178 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
"""
|
||||||
|
Creates an empemeral image and patches it
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Script /etc/libvirt/hooks/qemu
|
||||||
|
# Don't forget to execute service libvirt-bin restart
|
||||||
|
# Also see https://www.libvirt.org/hooks.html
|
||||||
|
|
||||||
|
# This script make clean VM for each start using base image
|
||||||
|
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import xml.etree.ElementTree as et
|
||||||
|
|
||||||
|
from jinja2 import Environment, exceptions, FileSystemLoader
|
||||||
|
|
||||||
|
|
||||||
|
BACKINGSTORE_PATH = '/var/lib/libvirt/backingstore/'
|
||||||
|
IMAGES_PATH = '/var/lib/libvirt/images/'
|
||||||
|
EPHEMERAL_PATH = '/var/lib/libvirt/ephemeral/'
|
||||||
|
CLOUDINIT_PATH = '/mnt/nfsimages'
|
||||||
|
VENDOR_EXT = '.vendor'
|
||||||
|
USER_EXT = '.user'
|
||||||
|
CLOUDINIT_EXT = '.iso'
|
||||||
|
|
||||||
|
xml = None
|
||||||
|
|
||||||
|
|
||||||
|
def parse_xml():
|
||||||
|
"""
|
||||||
|
Parse XML provided in stdin
|
||||||
|
"""
|
||||||
|
global xml
|
||||||
|
if xml is None:
|
||||||
|
data = sys.stdin.read()
|
||||||
|
xml = et.fromstring(data)
|
||||||
|
return xml
|
||||||
|
|
||||||
|
|
||||||
|
def find_base(domain):
|
||||||
|
"""
|
||||||
|
Convert VM name into hostname (part before first _)
|
||||||
|
"""
|
||||||
|
return domain.split("_", 2)[0]
|
||||||
|
|
||||||
|
|
||||||
|
def prepare_files(domain, env_):
|
||||||
|
"""
|
||||||
|
Create the ephemeral images
|
||||||
|
"""
|
||||||
|
xml = parse_xml()
|
||||||
|
base = find_base(domain)
|
||||||
|
for disk in xml.iterfind("./devices/disk[@device='disk']/source"):
|
||||||
|
disk = disk.get('file')
|
||||||
|
if not os.path.exists(os.path.join(BACKINGSTORE_PATH,
|
||||||
|
base + '.qcow2')):
|
||||||
|
continue
|
||||||
|
if not disk.startswith(EPHEMERAL_PATH):
|
||||||
|
continue
|
||||||
|
cmd = ['/usr/bin/qemu-img',
|
||||||
|
'create', '-b',
|
||||||
|
os.path.join(BACKINGSTORE_PATH, base + '.qcow2'),
|
||||||
|
'-f', 'qcow2',
|
||||||
|
'-F', 'qcow2',
|
||||||
|
disk]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
|
||||||
|
# resize
|
||||||
|
cmd = ['/usr/bin/qemu-img',
|
||||||
|
'resize', disk, "+10G"
|
||||||
|
]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
|
||||||
|
try:
|
||||||
|
x = xml.find("./metadata/{http://buildbot.net/}auth")
|
||||||
|
username, password, master = (x.attrib["username"],
|
||||||
|
x.attrib["password"],
|
||||||
|
x.attrib["master"])
|
||||||
|
except Exception:
|
||||||
|
username = domain
|
||||||
|
password = domain
|
||||||
|
master = None
|
||||||
|
|
||||||
|
for cdrom in xml.iterfind("./devices/disk[@device='cdrom']/source"):
|
||||||
|
cdrom = cdrom.get('file')
|
||||||
|
if not cdrom.startswith(EPHEMERAL_PATH):
|
||||||
|
continue
|
||||||
|
# cloud init
|
||||||
|
if not os.path.exists(os.path.join(BACKINGSTORE_PATH,
|
||||||
|
base + USER_EXT)):
|
||||||
|
continue
|
||||||
|
|
||||||
|
hostname = os.uname()[1].replace('.', '_')
|
||||||
|
|
||||||
|
userdata = {
|
||||||
|
'guest': hostname,
|
||||||
|
'hostname': domain,
|
||||||
|
'buildbot_username': username,
|
||||||
|
'buildbot_password': password,
|
||||||
|
'buildbot_master': master
|
||||||
|
}
|
||||||
|
|
||||||
|
with tempfile.NamedTemporaryFile(mode='w+t') as temp_file:
|
||||||
|
# jinja user data
|
||||||
|
try:
|
||||||
|
temp_file.write(env_.get_template(domain + USER_EXT).
|
||||||
|
render(userdata))
|
||||||
|
except exceptions.TemplateNotFound:
|
||||||
|
temp_file.write(env_.get_template(base + USER_EXT).
|
||||||
|
render(userdata))
|
||||||
|
temp_file.flush()
|
||||||
|
|
||||||
|
# make ISO
|
||||||
|
cmd = ['/usr/bin/cloud-localds',
|
||||||
|
# '-V', os.path.join(CLOUDINIT_PATH,
|
||||||
|
# domain + VENDOR_EXT),
|
||||||
|
# '-H', HOSTNAME,
|
||||||
|
os.path.join(cdrom),
|
||||||
|
temp_file.name
|
||||||
|
]
|
||||||
|
subprocess.call(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def cleanup_files():
|
||||||
|
"""
|
||||||
|
Delete the ephemeral images
|
||||||
|
"""
|
||||||
|
xml = parse_xml()
|
||||||
|
for disk in xml.iterfind("./devices/disk[@device='disk']/source"):
|
||||||
|
disk = disk.get('file')
|
||||||
|
if disk.startswith(EPHEMERAL_PATH):
|
||||||
|
try:
|
||||||
|
os.remove(disk)
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
for cdrom in xml.iterfind("./devices/disk[@device='cdrom']/source"):
|
||||||
|
cdrom = cdrom.get('file')
|
||||||
|
if cdrom.startswith(EPHEMERAL_PATH):
|
||||||
|
try:
|
||||||
|
os.remove(cdrom)
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_buildbot_password():
|
||||||
|
"""
|
||||||
|
Retrieve buildbot password for guest
|
||||||
|
"""
|
||||||
|
fname = '/etc/libvirt/buildbot.pwd'
|
||||||
|
with open(fname) as file_handle:
|
||||||
|
content = [line.rstrip('\n') for line in file_handle]
|
||||||
|
try:
|
||||||
|
return content[0]
|
||||||
|
except (TypeError, IndexError):
|
||||||
|
return "password"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
# pylint: disable=unbalanced-tuple-unpacking
|
||||||
|
VIR_DOMAIN, ACTION = sys.argv[1:3]
|
||||||
|
except IndexError:
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
ENV = Environment(autoescape=False,
|
||||||
|
loader=FileSystemLoader(BACKINGSTORE_PATH),
|
||||||
|
trim_blocks=False)
|
||||||
|
|
||||||
|
if ACTION in ["prepare"]:
|
||||||
|
cleanup_files()
|
||||||
|
prepare_files(VIR_DOMAIN, ENV)
|
||||||
|
|
||||||
|
if ACTION in ["release"]:
|
||||||
|
cleanup_files()
|
102
test-checkdeps.sh
Normal file
102
test-checkdeps.sh
Normal file
|
@ -0,0 +1,102 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# tests checkdeps.py with all possible subsets of dependency packages installed
|
||||||
|
|
||||||
|
distro=$(grep ^VERSION_CODENAME= /etc/os-release | cut -d= -f2)
|
||||||
|
|
||||||
|
case $distro in
|
||||||
|
trusty)
|
||||||
|
method="apt-get"
|
||||||
|
packages=(python-qt4 python-msgpack python-pyopencl python-setuptools build-essential libssl-dev libcap-dev python-prctl)
|
||||||
|
;;
|
||||||
|
xenial)
|
||||||
|
method="apt-get"
|
||||||
|
packages=(python-qt4 python-msgpack python-pyopencl python-setuptools build-essential libssl-dev libcap-dev python-prctl)
|
||||||
|
;;
|
||||||
|
bionic)
|
||||||
|
method="apt-get"
|
||||||
|
packages=(python-qt4 python-msgpack python-pyopencl python-setuptools build-essential libssl-dev libcap-dev python-prctl)
|
||||||
|
;;
|
||||||
|
focal)
|
||||||
|
method="apt-get"
|
||||||
|
packages=(python-setuptools build-essential libssl-dev libcap-dev)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown distro"
|
||||||
|
exit 0
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Using $method on $distro"
|
||||||
|
|
||||||
|
output=$(mktemp)
|
||||||
|
succeeded=0
|
||||||
|
failed=0
|
||||||
|
|
||||||
|
# 0 - 2^n -1
|
||||||
|
for i in $(seq 0 $((2**${#packages[@]}-1))); do
|
||||||
|
declare -a missing
|
||||||
|
missing=()
|
||||||
|
case $method in
|
||||||
|
apt-get)
|
||||||
|
cmd="sudo apt-get remove --autoremove -y -qq"
|
||||||
|
;;
|
||||||
|
*);;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# iterate packages
|
||||||
|
for j in $(seq 0 $((${#packages[@]}-1))); do
|
||||||
|
# should j-th item be included in i-th iteration?
|
||||||
|
if [ $(((i>>j)%2)) -eq 1 ]; then
|
||||||
|
case $method in
|
||||||
|
apt-get)
|
||||||
|
cmd="$cmd ${packages[j]}+"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
else
|
||||||
|
case $method in
|
||||||
|
apt-get)
|
||||||
|
missing+=("${packages[j]}")
|
||||||
|
cmd="$cmd ${packages[j]}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo -n "${missing[*]}: "
|
||||||
|
$cmd &> /dev/null
|
||||||
|
#echo "python checkdeps.py"
|
||||||
|
python checkdeps.py > "$output" 2> /dev/null
|
||||||
|
toinstall=$(sed -E 's/.*apt-get install (.*)(`.*|$)/\1/p;d' < "$output" | xargs -n 1 echo)
|
||||||
|
toinstalla=($toinstall)
|
||||||
|
fail=0
|
||||||
|
for a in ${missing[*]}; do
|
||||||
|
for b in ${toinstalla[*]}; do
|
||||||
|
if [ "$a" == "$b" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if ! [ "$a" == "$b" ]; then
|
||||||
|
fail=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
for a in ${toinstalla[*]}; do
|
||||||
|
for b in ${missing[*]}; do
|
||||||
|
if [ "$a" == "$b" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if ! [ "$a" == "$b" ]; then
|
||||||
|
fail=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ $fail -eq 0 ]; then
|
||||||
|
echo "OK"
|
||||||
|
succeeded=$((succeeded+1))
|
||||||
|
else
|
||||||
|
echo "FAIL"
|
||||||
|
echo " " $toinstall
|
||||||
|
failed=$((failed+1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Succeeded: $succeeded"
|
||||||
|
echo " Failed: $failed"
|
177
travis2bash.sh
Normal file
177
travis2bash.sh
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# shellcheck disable=SC1003
|
||||||
|
# pulled from https://raw.githubusercontent.com/jasperes/bash-yaml/master/script/yaml.sh
|
||||||
|
# Licensed under MIT license
|
||||||
|
|
||||||
|
# Based on https://gist.github.com/pkuczynski/8665367
|
||||||
|
|
||||||
|
failure=0
|
||||||
|
|
||||||
|
parse_yaml() {
|
||||||
|
local yaml_file=$1
|
||||||
|
local prefix=$2
|
||||||
|
local s
|
||||||
|
local w
|
||||||
|
local fs
|
||||||
|
|
||||||
|
s='[[:space:]]*'
|
||||||
|
w='[a-zA-Z0-9_.-]*'
|
||||||
|
fs="$(echo @|tr @ '\034')"
|
||||||
|
|
||||||
|
(
|
||||||
|
sed -e '/- [^\“]'"[^\']"'.*: /s|\([ ]*\)- \([[:space:]]*\)|\1-\'$'\n'' \1\2|g' |
|
||||||
|
|
||||||
|
sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
|
||||||
|
-e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
|
||||||
|
-e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
||||||
|
-e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
|
||||||
|
|
||||||
|
awk -F"$fs" '{
|
||||||
|
indent = length($1)/2;
|
||||||
|
if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
|
||||||
|
vname[indent] = $2;
|
||||||
|
for (i in vname) {if (i > indent) {delete vname[i]}}
|
||||||
|
if (length($3) > 0) {
|
||||||
|
vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
|
||||||
|
printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1],$3);
|
||||||
|
}
|
||||||
|
}' |
|
||||||
|
|
||||||
|
sed -e 's/_=/+=/g' |
|
||||||
|
|
||||||
|
awk 'BEGIN {
|
||||||
|
FS="=";
|
||||||
|
OFS="="
|
||||||
|
}
|
||||||
|
/(-|\.).*=/ {
|
||||||
|
gsub("-|\\.", "_", $1)
|
||||||
|
}
|
||||||
|
{ print }'
|
||||||
|
) < "$yaml_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_variables() {
|
||||||
|
local yaml_file="$1"
|
||||||
|
local prefix="$2"
|
||||||
|
eval "$(parse_yaml "$yaml_file" "$prefix")"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ ! -e .travis.yml ]; then
|
||||||
|
echo "No .travis.yml found, exiting"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function aptinstall() {
|
||||||
|
# apt install
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
if [[ "$(declare -p travis_addons_apt_packages)" =~ "declare -a" ]]; then
|
||||||
|
echo -e "\nsudo apt -y update\n"
|
||||||
|
sudo apt -y update
|
||||||
|
for ((i = 0; i < ${#travis_addons_apt_packages[@]}; i++))
|
||||||
|
do
|
||||||
|
echo -e "\napt-get -yq --no-install-suggests --no-install-recommends install ${travis_addons_apt_packages[$i]}\n"
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
sudo apt-get -yq --no-install-suggests --no-install-recommends \
|
||||||
|
install \
|
||||||
|
${travis_addons_apt_packages[$i]}
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function virtualenv_init() {
|
||||||
|
# init virtualenv directory
|
||||||
|
if [ -n "$1" -a -n "$2" ]; then
|
||||||
|
echo -e "\nvirtualenv -p \"$1\" ~/.venv-$2\n"
|
||||||
|
virtualenv -p "$1" ~/.venv-"$2"
|
||||||
|
else
|
||||||
|
echo -e "\nvirtualenv ~/.venv\n"
|
||||||
|
virtualenv ~/.venv
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function virtualenv_activate() {
|
||||||
|
# activate virtualenv
|
||||||
|
# shellcheck disable=SC1090
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
echo -e "\n. ~/.venv-$1/bin/activate\n"
|
||||||
|
. ~/.venv-$1/bin/activate
|
||||||
|
else
|
||||||
|
echo -e "\n. ~/.venv/bin/activate\n"
|
||||||
|
. ~/.venv/bin/activate
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function python_run() {
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
if [[ "$(declare -p travis_env)" =~ "declare -a" ]]; then
|
||||||
|
echo "Setting up environment variables"
|
||||||
|
for ((i = 0; i < ${#travis_env[@]}; i++))
|
||||||
|
do
|
||||||
|
echo -e "\n${travis_env[$i]}\n"
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
export ${travis_env[$i]}
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
if [[ "$(declare -p travis_install)" =~ "declare -a" ]]; then
|
||||||
|
echo "Running \"install\""
|
||||||
|
if [ -n "$2" ]; then
|
||||||
|
if [ -e "requirements-${2}.txt" ]; then
|
||||||
|
echo "Running \"pip install -r requirements-${2}.txt\""
|
||||||
|
pip install -r "requirements-${2}.txt"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
for ((i = 0; i < ${#travis_install[@]}; i++))
|
||||||
|
do
|
||||||
|
cd "$rundir" || continue
|
||||||
|
echo -e "\n${travis_install[$i]}\n"
|
||||||
|
if ! bash -c "${travis_install[$i]}"; then
|
||||||
|
failure=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
if [[ "$(declare -p travis_script)" =~ "declare -a" ]]; then
|
||||||
|
echo "Running \"script\""
|
||||||
|
for ((i = 0; i < ${#travis_script[@]}; i++))
|
||||||
|
do
|
||||||
|
cd "$rundir" || continue
|
||||||
|
echo -e "\n${travis_script[$i]}\n"
|
||||||
|
if ! bash -c "${travis_script[$i]}"; then
|
||||||
|
failure=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_variables .travis.yml travis_
|
||||||
|
|
||||||
|
rundir=$(pwd)
|
||||||
|
|
||||||
|
aptinstall
|
||||||
|
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
if [[ "$(declare -p travis_python)" =~ "declare -a" ]]; then
|
||||||
|
# shellcheck disable=SC2068
|
||||||
|
for pv in ${travis_python[@]}; do
|
||||||
|
# strip quotes
|
||||||
|
temp="${pv%\"}"
|
||||||
|
pv="${temp#\"}"
|
||||||
|
ppath=/usr/bin/python$pv
|
||||||
|
#if [ ! -e "$ppath" ]; then
|
||||||
|
sudo apt -y install "python$pv" "python${pv}-dev"
|
||||||
|
#fi
|
||||||
|
virtualenv_init "$ppath" "$pv"
|
||||||
|
virtualenv_activate "$pv"
|
||||||
|
python_run "$ppath" "$pv"
|
||||||
|
deactivate
|
||||||
|
done
|
||||||
|
else
|
||||||
|
virtualenv_init
|
||||||
|
virtualenv_activate
|
||||||
|
python_run
|
||||||
|
deactivate
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $failure
|
160
virt-install-all.sh
Normal file
160
virt-install-all.sh
Normal file
|
@ -0,0 +1,160 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
trusty()
|
||||||
|
{
|
||||||
|
id="$1"
|
||||||
|
qemu-img create -b /var/lib/libvirt/backingstore/trusty.qcow2 -f qcow2 \
|
||||||
|
/var/lib/libvirt/ephemeral/trusty_"${hostname}_${id}".qcow2
|
||||||
|
cloud-localds /var/lib/libvirt/ephemeral/trusty_"${hostname}_${id}".iso \
|
||||||
|
/var/lib/libvirt/backingstore/trusty.user
|
||||||
|
|
||||||
|
virsh undefine trusty_"${hostname}_${id}"
|
||||||
|
|
||||||
|
xml=$(mktemp)
|
||||||
|
|
||||||
|
virt-install -r $mempercore --vcpus=2,maxvcpus=2,sockets=1,cores=1,threads=2 \
|
||||||
|
-n trusty_"${hostname}_${id}" -w network=default --nographics \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/trusty_"${hostname}_${id}".qcow2 \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/trusty_"${hostname}_${id}".iso,device=cdrom \
|
||||||
|
--import --noautoconsole \
|
||||||
|
--print-xml --dry-run --check disk_size=off,path_in_use=off \
|
||||||
|
--boot=hd --os-type=Linux --os-variant ubuntu14.04 > "$xml"
|
||||||
|
|
||||||
|
virsh define "$xml"
|
||||||
|
|
||||||
|
rm -f "$xml" /var/lib/libvirt/ephemeral/trusty_"${hostname}_${id}".{iso,qcow2}
|
||||||
|
}
|
||||||
|
|
||||||
|
xenial()
|
||||||
|
{
|
||||||
|
id="$1"
|
||||||
|
qemu-img create -b /var/lib/libvirt/backingstore/xenial.qcow2 -f qcow2 \
|
||||||
|
/var/lib/libvirt/ephemeral/xenial_"${hostname}_${id}".qcow2
|
||||||
|
cloud-localds /var/lib/libvirt/ephemeral/xenial_"${hostname}_${id}".iso \
|
||||||
|
/var/lib/libvirt/backingstore/xenial.user
|
||||||
|
|
||||||
|
virsh undefine xenial_"${hostname}_${id}"
|
||||||
|
|
||||||
|
xml=$(mktemp)
|
||||||
|
|
||||||
|
virt-install -r $mempercore --vcpus=2,maxvcpus=2,sockets=1,cores=1,threads=2 \
|
||||||
|
-n xenial_"${hostname}_${id}" -w network=default --nographics \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/xenial_"${hostname}_${id}".qcow2 \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/xenial_"${hostname}_${id}".iso,device=cdrom \
|
||||||
|
--import --noautoconsole \
|
||||||
|
--print-xml --dry-run --check disk_size=off,path_in_use=off \
|
||||||
|
--boot=hd --os-type=Linux --os-variant ubuntu16.04 > "$xml"
|
||||||
|
|
||||||
|
virsh define "$xml"
|
||||||
|
|
||||||
|
rm -f "$xml" /var/lib/libvirt/ephemeral/xenial_"${hostname}_${id}".{iso,qcow2}
|
||||||
|
}
|
||||||
|
|
||||||
|
bionic()
|
||||||
|
{
|
||||||
|
id="$1"
|
||||||
|
qemu-img create -b /var/lib/libvirt/backingstore/bionic.qcow2 -f qcow2 \
|
||||||
|
/var/lib/libvirt/ephemeral/bionic_"${hostname}_${id}".qcow2
|
||||||
|
cloud-localds /var/lib/libvirt/ephemeral/bionic_"${hostname}_${id}".iso \
|
||||||
|
/var/lib/libvirt/backingstore/bionic.user
|
||||||
|
|
||||||
|
virsh undefine bionic_"${hostname}_${id}"
|
||||||
|
|
||||||
|
xml=$(mktemp)
|
||||||
|
|
||||||
|
virt-install -r $mempercore --vcpus=2,maxvcpus=2,sockets=1,cores=1,threads=2 \
|
||||||
|
-n bionic_"${hostname}_${id}" -w network=default --nographics \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/bionic_"${hostname}_${id}".qcow2 \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/bionic_"${hostname}_${id}".iso,device=cdrom \
|
||||||
|
--import --noautoconsole \
|
||||||
|
--print-xml --dry-run --check disk_size=off,path_in_use=off \
|
||||||
|
--boot=hd --os-type=Linux --os-variant ubuntu18.04 > "$xml"
|
||||||
|
|
||||||
|
virsh define "$xml"
|
||||||
|
|
||||||
|
rm -f "$xml" /var/lib/libvirt/ephemeral/bionic_"${hostname}_${id}".{iso,qcow2}
|
||||||
|
}
|
||||||
|
|
||||||
|
focal()
|
||||||
|
{
|
||||||
|
id="$1"
|
||||||
|
qemu-img create -b /var/lib/libvirt/backingstore/focal.qcow2 -f qcow2 \
|
||||||
|
/var/lib/libvirt/ephemeral/focal_"${hostname}_${id}".qcow2
|
||||||
|
cloud-localds /var/lib/libvirt/ephemeral/focal_"${hostname}_${id}".iso \
|
||||||
|
/var/lib/libvirt/backingstore/focal.user
|
||||||
|
|
||||||
|
virsh undefine focal_"${hostname}_${id}"
|
||||||
|
|
||||||
|
xml=$(mktemp)
|
||||||
|
|
||||||
|
virt-install -r $mempercore --vcpus=2,maxvcpus=2,sockets=1,cores=1,threads=2 \
|
||||||
|
-n focal_"${hostname}_${id}" -w network=default --nographics \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/focal_"${hostname}_${id}".qcow2 \
|
||||||
|
--disk path=/var/lib/libvirt/ephemeral/focal_"${hostname}_${id}".iso,device=cdrom \
|
||||||
|
--import --noautoconsole \
|
||||||
|
--print-xml --dry-run --check disk_size=off,path_in_use=off \
|
||||||
|
--boot=hd --os-type=Linux --os-variant ubuntu18.04 > "$xml"
|
||||||
|
|
||||||
|
virsh define "$xml"
|
||||||
|
|
||||||
|
rm -f "$xml" /var/lib/libvirt/ephemeral/focal_"${hostname}_${id}".{iso,qcow2}
|
||||||
|
}
|
||||||
|
|
||||||
|
elcapitan()
|
||||||
|
{
|
||||||
|
local id
|
||||||
|
local threads
|
||||||
|
local cores
|
||||||
|
id="$1"
|
||||||
|
|
||||||
|
virsh undefine elcapitan_"${hostname}_${id}"
|
||||||
|
|
||||||
|
xml=$(mktemp)
|
||||||
|
|
||||||
|
cat /var/lib/libvirt/backingstore/elcapitan.xml > "$xml"
|
||||||
|
|
||||||
|
threads="$(grep -c processor /proc/cpuinfo)"
|
||||||
|
if [ "$threads" -gt 16 ]; then
|
||||||
|
threads=16
|
||||||
|
fi
|
||||||
|
cores="$((threads/2))"
|
||||||
|
|
||||||
|
cp /var/lib/libvirt/backingstore/enoch_rev2839_boot \
|
||||||
|
/var/lib/libvirt/ephemeral/enoch_rev2839_boot
|
||||||
|
|
||||||
|
sed -Ei "
|
||||||
|
s#<name>.*<#<name>elcapitan_${hostname}_${id}<#;
|
||||||
|
s#<vcpu (.*)>[0-9]+#<vcpu \\1>$threads#;
|
||||||
|
s#<topology (.*)cores='[0-9]+'#<topology \\1cores='$cores'#;
|
||||||
|
s#<source file='(.*\\.qcow2)'#<source file='/var/lib/libvirt/ephemeral/elcapitan_${hostname}_${id}.qcow2'#;
|
||||||
|
" "$xml"
|
||||||
|
|
||||||
|
virsh define "$xml"
|
||||||
|
|
||||||
|
rm -f "$xml"
|
||||||
|
}
|
||||||
|
|
||||||
|
hostname=$(hostname|cut -d. -f1)
|
||||||
|
|
||||||
|
cores=$(grep -E '^cpu cores' /proc/cpuinfo |head -1|cut -d: -f2|tr -d '[:space:]')
|
||||||
|
mem=$(sed -E 's/^MemTotal: +([0-9]+) kB/\1/p;d' < /proc/meminfo)
|
||||||
|
mempercore=$(((mem/1024-4096)/cores))
|
||||||
|
|
||||||
|
elcapitan 1
|
||||||
|
|
||||||
|
for i in $(seq "$cores"); do
|
||||||
|
trusty "$i" &
|
||||||
|
done
|
||||||
|
wait
|
||||||
|
for i in $(seq "$cores"); do
|
||||||
|
xenial "$i" &
|
||||||
|
done
|
||||||
|
wait
|
||||||
|
for i in $(seq "$cores"); do
|
||||||
|
bionic "$i" &
|
||||||
|
done
|
||||||
|
wait
|
||||||
|
for i in $(seq "$cores"); do
|
||||||
|
focal "$i" &
|
||||||
|
done
|
||||||
|
wait
|
Loading…
Reference in New Issue
Block a user