From 8af6faed817e8128498551603ee04470559410a5 Mon Sep 17 00:00:00 2001 From: Adam Gandelman Date: Fri, 11 Apr 2014 17:06:14 -0700 Subject: [PATCH] Enable console logging for Ironic baremetal VMs Logs console output of VMs created for use by Ironic to $DATA_DIR/ironic/logs. This gives Jenkins something to archive that will be useful for debugging any deployment ramdisk issue blocking provisioning. Change-Id: I7d234a6a13dbe8579f685e46d7712dae497272a5 --- lib/ironic | 15 ++++++++++- tools/ironic/scripts/configure-vm | 41 ++++++++++++++++++++----------- tools/ironic/scripts/create-nodes | 17 +++++++++++-- tools/ironic/templates/vm.xml | 9 +++++-- 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/lib/ironic b/lib/ironic index 8d7687bac5..1aa85eab80 100644 --- a/lib/ironic +++ b/lib/ironic @@ -65,6 +65,10 @@ IRONIC_VM_NETWORK_RANGE=${IRONIC_VM_NETWORK_RANGE:-192.0.2.0/24} IRONIC_VM_MACS_CSV_FILE=${IRONIC_VM_MACS_CSV_FILE:-$IRONIC_DATA_DIR/ironic_macs.csv} IRONIC_AUTHORIZED_KEYS_FILE=${IRONIC_AUTHORIZED_KEYS_FILE:-$HOME/.ssh/authorized_keys} +# By default, baremetal VMs will console output to file. +IRONIC_VM_LOG_CONSOLE=${IRONIC_VM_LOG_CONSOLE:-True} +IRONIC_VM_LOG_DIR=${IRONIC_VM_LOG_DIR:-$IRONIC_DATA_DIR/logs/} + DIB_DIR=${DIB_DIR:-$DEST/diskimage-builder} # Use DIB to create deploy ramdisk and kernel. @@ -177,6 +181,9 @@ function configure_ironic_conductor { iniset $IRONIC_CONF_FILE pxe tftp_server $HOST_IP iniset $IRONIC_CONF_FILE pxe tftp_root $IRONIC_TFTPBOOT_DIR iniset $IRONIC_CONF_FILE pxe tftp_master_path $IRONIC_TFTPBOOT_DIR/master_images + if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then + iniset $IRONIC_CONF_FILE pxe pxe_append_params "nofb nomodeset vga=normal console=ttyS0" + fi } # create_ironic_cache_dir() - Part of the init_ironic() process @@ -306,9 +313,15 @@ function configure_ironic_dirs { function create_bridge_and_vms { # Call libvirt setup scripts in a new shell to ensure any new group membership sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/setup-network" + if [[ "$IRONIC_VM_LOG_CONSOLE" == "True" ]] ; then + LOG_ARG="$IRONIC_VM_LOG_DIR" + else + LOG_ARG="" + fi sudo su $STACK_USER -c "$IRONIC_SCRIPTS_DIR/create-nodes \ $IRONIC_VM_SPECS_CPU $IRONIC_VM_SPECS_RAM $IRONIC_VM_SPECS_DISK \ - amd64 $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR" >> $IRONIC_VM_MACS_CSV_FILE + amd64 $IRONIC_VM_COUNT $IRONIC_VM_NETWORK_BRIDGE $IRONIC_VM_EMULATOR \ + $LOG_ARG" >> $IRONIC_VM_MACS_CSV_FILE } function enroll_vms { diff --git a/tools/ironic/scripts/configure-vm b/tools/ironic/scripts/configure-vm index 9936b76c4f..4c42c491c5 100755 --- a/tools/ironic/scripts/configure-vm +++ b/tools/ironic/scripts/configure-vm @@ -9,6 +9,25 @@ templatedir = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'templates') +CONSOLE_LOG = """ + + + + + + + + + + + + + + + +""" + + def main(): parser = argparse.ArgumentParser( description="Configure a kvm virtual machine for the seed image.") @@ -30,6 +49,8 @@ def main(): help='The libvirt network name to use') parser.add_argument('--libvirt-nic-driver', default='e1000', help='The libvirt network driver to use') + parser.add_argument('--console-log', + help='File to log console') parser.add_argument('--emulator', default=None, help='Path to emulator bin for vm template') args = parser.parse_args() @@ -44,6 +65,7 @@ def main(): 'cpus': args.cpus, 'bootdev': args.bootdev, 'network': args.network, + 'nicdriver': args.libvirt_nic_driver, 'emulator': args.emulator, } @@ -55,22 +77,13 @@ def main(): elif os.path.exists("/usr/bin/qemu-kvm"): # Redhat params['emulator'] = "/usr/bin/qemu-kvm" - nicparams = { - 'nicdriver': args.libvirt_nic_driver, - 'network': args.network, - } - - params['bm_network'] = """ - - - - - -
-""" % nicparams - + if args.console_log: + params['console_log'] = CONSOLE_LOG % {'console_log': args.console_log} + else: + params['console_log'] = '' libvirt_template = source_template % params conn = libvirt.open("qemu:///system") + a = conn.defineXML(libvirt_template) print ("Created machine %s with UUID %s" % (args.name, a.UUIDString())) diff --git a/tools/ironic/scripts/create-nodes b/tools/ironic/scripts/create-nodes index d81113a4d5..140bffe46f 100755 --- a/tools/ironic/scripts/create-nodes +++ b/tools/ironic/scripts/create-nodes @@ -4,7 +4,7 @@ # Creates baremetal poseur nodes for ironic testing purposes -set -exu +set -ex # Keep track of the devstack directory TOP_DIR=$(cd $(dirname "$0")/.. && pwd) @@ -24,6 +24,7 @@ esac TOTAL=$(($5 - 1)) BRIDGE=$6 EMULATOR=$7 +LOGDIR=$8 LIBVIRT_NIC_DRIVER=${LIBVIRT_NIC_DRIVER:-"e1000"} LIBVIRT_STORAGE_POOL=${LIBVIRT_STORAGE_POOL:-"default"} @@ -43,6 +44,10 @@ if [ "$pool_state" != "running" ] ; then virsh pool-start $LIBVIRT_STORAGE_POOL >&2 fi +if [ -n "$LOGDIR" ] ; then + mkdir -p "$LOGDIR" +fi + PREALLOC= if [ -f /etc/debian_version ]; then PREALLOC="--prealloc-metadata" @@ -51,6 +56,11 @@ fi DOMS="" for idx in $(seq 0 $TOTAL) ; do NAME="baremetal${BRIDGE}_${idx}" + if [ -n "$LOGDIR" ] ; then + VM_LOGGING="--console-log $LOGDIR/${NAME}_console.log" + else + VM_LOGGING="" + fi DOMS="$DOMS $NAME" VOL_NAME="baremetal${BRIDGE}-${idx}.qcow2" (virsh list --all | grep -q $NAME) && continue @@ -62,7 +72,10 @@ for idx in $(seq 0 $TOTAL) ; do # 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 - $TOP_DIR/scripts/configure-vm --bootdev network --name $NAME --image "$volume_path" --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER --emulator $EMULATOR --network $BRIDGE >&2 + $TOP_DIR/scripts/configure-vm \ + --bootdev network --name $NAME --image "$volume_path" \ + --arch $ARCH --cpus $CPU --memory $MEM --libvirt-nic-driver $LIBVIRT_NIC_DRIVER \ + --emulator $EMULATOR --network $BRIDGE $VM_LOGGING >&2 done for dom in $DOMS ; do diff --git a/tools/ironic/templates/vm.xml b/tools/ironic/templates/vm.xml index b18dec055f..4f40334b7d 100644 --- a/tools/ironic/templates/vm.xml +++ b/tools/ironic/templates/vm.xml @@ -27,14 +27,19 @@
- %(network)s - %(bm_network)s + + + + +
+