diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2019-07-31 14:17:00 +0200 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2019-08-07 09:13:56 +0200 |
commit | c7bd03cf688c7059c694e07da34506f4a64a21ac (patch) | |
tree | 5503b4a3cbffead0ab7fa5c7960c8220045835a7 /devstack | |
parent | af61985d0366d7db442289e1e4f1203001096e2d (diff) | |
download | ironic-c7bd03cf688c7059c694e07da34506f4a64a21ac.tar.gz |
devstack: allow creating more than one volume for a VM
This is needed to easily test software RAID.
Change-Id: Ia1bc81db97c6d5d1f79c4e1cfea1ab29fd988c3f
Diffstat (limited to 'devstack')
-rw-r--r-- | devstack/lib/ironic | 4 | ||||
-rwxr-xr-x | devstack/tools/ironic/scripts/configure-vm.py | 11 | ||||
-rwxr-xr-x | devstack/tools/ironic/scripts/create-node.sh | 31 | ||||
-rw-r--r-- | devstack/tools/ironic/templates/vm.xml | 10 |
4 files changed, 39 insertions, 17 deletions
diff --git a/devstack/lib/ironic b/devstack/lib/ironic index 1292390c0..6aa0687c5 100644 --- a/devstack/lib/ironic +++ b/devstack/lib/ironic @@ -147,6 +147,7 @@ IRONIC_VM_EMULATOR=${IRONIC_VM_EMULATOR:-'/usr/bin/qemu-system-x86_64'} IRONIC_VM_ENGINE=${IRONIC_VM_ENGINE:-qemu} IRONIC_VM_NETWORK_BRIDGE=${IRONIC_VM_NETWORK_BRIDGE:-brbm} IRONIC_VM_INTERFACE_COUNT=${IRONIC_VM_INTERFACE_COUNT:-2} +IRONIC_VM_VOLUME_COUNT=${IRONIC_VM_VOLUME_COUNT:-1} IRONIC_VM_MACS_CSV_FILE=${IRONIC_VM_MACS_CSV_FILE:-$IRONIC_DATA_DIR/ironic_macs.csv} IRONIC_CLEAN_NET_NAME=${IRONIC_CLEAN_NET_NAME:-${IRONIC_PROVISION_NETWORK_NAME:-${PRIVATE_NETWORK_NAME}}} IRONIC_RESCUE_NET_NAME=${IRONIC_RESCUE_NET_NAME:-${IRONIC_CLEAN_NET_NAME}} @@ -1812,7 +1813,8 @@ function create_bridge_and_vms { $IRONIC_SCRIPTS_DIR/create-node.sh -n $vm_name \ -c $IRONIC_VM_SPECS_CPU -m $IRONIC_VM_SPECS_RAM -d $IRONIC_VM_SPECS_DISK \ -a $IRONIC_VM_SPECS_CPU_ARCH -b $IRONIC_VM_NETWORK_BRIDGE $vm_opts -p $vbmc_port -o $pdu_outlet \ - -i $IRONIC_VM_INTERFACE_COUNT -f $IRONIC_VM_SPECS_DISK_FORMAT -M $PUBLIC_BRIDGE_MTU $log_arg >> $IRONIC_VM_MACS_CSV_FILE + -i $IRONIC_VM_INTERFACE_COUNT -f $IRONIC_VM_SPECS_DISK_FORMAT -M $PUBLIC_BRIDGE_MTU $log_arg \ + -v $IRONIC_VM_VOLUME_COUNT >> $IRONIC_VM_MACS_CSV_FILE SUBSHELL if is_deployed_by_ipmi; then diff --git a/devstack/tools/ironic/scripts/configure-vm.py b/devstack/tools/ironic/scripts/configure-vm.py index b381269ba..a1b3a65df 100755 --- a/devstack/tools/ironic/scripts/configure-vm.py +++ b/devstack/tools/ironic/scripts/configure-vm.py @@ -15,6 +15,8 @@ import argparse import os.path +import string +import sys import jinja2 import libvirt @@ -57,7 +59,7 @@ def main(): description="Configure a kvm virtual machine for the seed image.") parser.add_argument('--name', default='seed', help='the name to give the machine in libvirt.') - parser.add_argument('--image', + parser.add_argument('--image', action='append', default=[], help='Use a custom image file (must be qcow2).') parser.add_argument('--engine', default='qemu', help='The virtualization engine to use') @@ -92,9 +94,14 @@ def main(): env = jinja2.Environment(loader=jinja2.FileSystemLoader(templatedir)) template = env.get_template('vm.xml') + images = list(zip(args.image, string.ascii_lowercase)) + if not images or len(images) > 6: + # 6 is an artificial limitation because of the way we generate PCI IDs + sys.exit("Up to 6 images are required") + params = { 'name': args.name, - 'imagefile': args.image, + 'images': images, 'engine': args.engine, 'arch': args.arch, 'memory': args.memory, diff --git a/devstack/tools/ironic/scripts/create-node.sh b/devstack/tools/ironic/scripts/create-node.sh index 67d261572..aa823aaae 100755 --- a/devstack/tools/ironic/scripts/create-node.sh +++ b/devstack/tools/ironic/scripts/create-node.sh @@ -12,7 +12,7 @@ export PS4='+ ${BASH_SOURCE:-}:${FUNCNAME[0]:-}:L${LINENO:-}: ' # Keep track of the DevStack directory TOP_DIR=$(cd $(dirname "$0")/.. && pwd) -while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:" arg; do +while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:v:" arg; do case $arg in n) NAME=$OPTARG;; c) CPU=$OPTARG;; @@ -34,6 +34,7 @@ while getopts "n:c:i:m:M:d:a:b:e:E:p:o:f:l:L:N:A:D:" arg; do N) UEFI_NVRAM=$OPTARG;; A) MAC_ADDRESS=$OPTARG;; D) NIC_DRIVER=$OPTARG;; + v) VOLUME_COUNT=$OPTARG;; esac done @@ -76,7 +77,6 @@ if [ -n "$LOGDIR" ] ; then else VM_LOGGING="" fi -VOL_NAME="${NAME}.${DISK_FORMAT}" UEFI_OPTS="" if [ ! -z "$UEFI_LOADER" ]; then @@ -111,20 +111,31 @@ if [ -n "$MAC_ADDRESS" ] ; then MAC_ADDRESS="--mac $MAC_ADDRESS" fi +VOLUME_COUNT=${VOLUME_COUNT:-1} + if ! virsh list --all | grep -q $NAME; then - virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $VOL_NAME && - virsh vol-delete $VOL_NAME --pool $LIBVIRT_STORAGE_POOL >&2 - virsh vol-create-as $LIBVIRT_STORAGE_POOL ${VOL_NAME} ${DISK}G --format $DISK_FORMAT $PREALLOC >&2 - volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $VOL_NAME) - # Pre-touch the VM to set +C, as it can only be set on empty files. - sudo touch "$volume_path" - sudo chattr +C "$volume_path" || true vm_opts="" + for int in $(seq 1 $VOLUME_COUNT); do + if [[ "$int" == "1" ]]; then + # Compatibility with old naming + vol_name="$NAME.$DISK_FORMAT" + else + vol_name="$NAME-$int.$DISK_FORMAT" + fi + virsh vol-list --pool $LIBVIRT_STORAGE_POOL | grep -q $vol_name && + virsh vol-delete $vol_name --pool $LIBVIRT_STORAGE_POOL >&2 + virsh vol-create-as $LIBVIRT_STORAGE_POOL ${vol_name} ${DISK}G --format $DISK_FORMAT $PREALLOC >&2 + volume_path=$(virsh vol-path --pool $LIBVIRT_STORAGE_POOL $vol_name) + # Pre-touch the VM to set +C, as it can only be set on empty files. + sudo touch "$volume_path" + sudo chattr +C "$volume_path" || true + vm_opts+="--image $volume_path " + done if [[ -n "$EMULATOR" ]]; then vm_opts+="--emulator $EMULATOR " fi $PYTHON $TOP_DIR/scripts/configure-vm.py \ - --bootdev network --name $NAME --image "$volume_path" \ + --bootdev network --name $NAME \ --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ --disk-format $DISK_FORMAT $VM_LOGGING --engine $ENGINE $UEFI_OPTS $vm_opts \ --interface-count $INTERFACE_COUNT $MAC_ADDRESS >&2 diff --git a/devstack/tools/ironic/templates/vm.xml b/devstack/tools/ironic/templates/vm.xml index 8a009f476..2be30a549 100644 --- a/devstack/tools/ironic/templates/vm.xml +++ b/devstack/tools/ironic/templates/vm.xml @@ -30,19 +30,21 @@ <on_crash>restart</on_crash> <devices> <emulator>{{ emulator }}</emulator> + {% for (imagefile, letter) in images %} <disk type='file' device='disk'> <driver name='qemu' type='{{ disk_format }}' cache='writeback'/> <source file='{{ imagefile }}'/> <!-- NOTE(lucasagomes): The virtio disk controller apparently does not work with UEFI, so let's use IDE. --> {% if uefi_loader %} - <target dev='vda' bus='ide'/> - <address type='drive' controller='0' bus='0' target='0' unit='0'/> + <target dev='vd{{ letter }}' bus='ide'/> + <address type='drive' controller='0' bus='0' target='0' unit='{{ loop.index }}'/> {% else %} - <target dev='vda' bus='virtio'/> - <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> + <target dev='vd{{ letter }}' bus='virtio'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x0{{ letter }}' function='0x0'/> {% endif %} </disk> + {% endfor %} <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> |