Package: src:autopkgtest Version: 4.3 Severity: wishlist Tags: patch upstream
Hi there, I wanted to work on an autopkgtest bug in the qemu runner on the train. I've got a full mirror around which is available on my system. Currently autopkgtest-buildvm-ubuntu-cloud doesn't support file:// for --mirror though - the mirror isn't made available inside the VM. Maybe I could already achieve this by manually passing qemu parameters, but it's possible to support this OOTB. That's what the attached patch does. It makes it so that "--mirror file://foo" is mounted as /mirrors/ubuntu inside the VM. When you run the actual tests ("-- qemu foo.img"), you also have to tell the qemu runner where to find the mirror so that it can mount it. For that I added a new "--localmirror" option. This isn't DRY as you've already given that information when building the VM, but I don't know how to avoid that. I hope it's acceptable. Review / ideas for improvement appreciated! -- Iain Lane [ i...@orangesquash.org.uk ] Debian Developer [ la...@debian.org ] Ubuntu Developer [ la...@ubuntu.com ]
>From 872c7dfff9b0f883816a6c795068922c8037d397 Mon Sep 17 00:00:00 2001 From: Iain Lane <iain.l...@canonical.com> Date: Fri, 3 Feb 2017 12:35:57 +0000 Subject: [PATCH] autopkgtest-buildvm-ubuntu-cloud: Support mounting file:/// mirrors inside the VM Mount the mirror inside the VM as /mirrors/ubuntu. For this to be automounted at startup, we need to load the '9pnet_virtio' module in the initramfs. There's a corresponding new --localmirror option to autopkgtest-virt-qemu, which mounts the directory when the image is used for testing. It would be nice to not have to specify the same thing again since you already gave it to autopkgtest-buildvm-ubuntu-cloud, but I don't know how to avoid this. --- tools/autopkgtest-buildvm-ubuntu-cloud | 23 ++++++++++++++++++++--- virt/autopkgtest-virt-qemu | 10 ++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tools/autopkgtest-buildvm-ubuntu-cloud b/tools/autopkgtest-buildvm-ubuntu-cloud index 34662b1..4a44b68 100755 --- a/tools/autopkgtest-buildvm-ubuntu-cloud +++ b/tools/autopkgtest-buildvm-ubuntu-cloud @@ -217,7 +217,10 @@ ssh_pwauth: True manage_etc_hosts: True apt_proxy: %(proxy)s apt_mirror: %(mirror)s +mounts: + - %(mount)s runcmd: + - echo "9pnet_virtio" | tee -a /etc/initramfs-tools/modules; update-initramfs -u - sed -i 's/deb-systemd-invoke/true/' /var/lib/dpkg/info/cloud-init.prerm - mount -r /dev/vdb /mnt - env AUTOPKGTEST_SETUP_VM_UPGRADE=%(upgr)s AUTOPKGTEST_SETUP_VM_POST_COMMAND='%(postcmd)s' @@ -239,6 +242,13 @@ def build_seed(mirror, proxy, no_apt_upgrade, metadata_file=None, with open(os.path.join(workdir, 'meta-data'), 'w') as f: f.write(metadata) + # If this is a local mirror, mount it at /mirror + if mirror.startswith('file://'): + mirror = 'file:///mirror/ubuntu' + mounts = '[mirror, /mirror/ubuntu, 9p, "trans=virtio,version=9p2000.L"]' + else: + mounts = '[]' + upgr = no_apt_upgrade and 'false' or 'true' if userdata_file: userdata = open(userdata_file).read() @@ -246,7 +256,8 @@ def build_seed(mirror, proxy, no_apt_upgrade, metadata_file=None, userdata = DEFAULT_USERDATA % {'proxy': proxy or '', 'mirror': mirror, 'upgr': upgr, 'tz': host_tz(), 'postcmd': post_command or '', - 'shopt': verbose and '-x' or ''} + 'shopt': verbose and '-x' or '', + 'mount': mounts} # preserve proxy from host for v in ['http_proxy', 'https_proxy', 'no_proxy']: @@ -303,7 +314,7 @@ def host_tz(): return 'Etc/UTC' -def boot_image(image, seed, qemu_command, verbose, timeout): +def boot_image(image, seed, qemu_command, verbose, timeout, mirror): print('Booting image to run cloud-init...') tty_sock = os.path.join(workdir, 'ttyS0') @@ -317,6 +328,12 @@ def boot_image(image, seed, qemu_command, verbose, timeout): '-drive', 'file=%s,if=virtio' % image, '-drive', 'file=%s,if=virtio,readonly' % seed] + # if this is a local mirror, we need to mount it inside the VM + if mirror and mirror.startswith('file://'): + m = mirror[7:] + argv.append('-virtfs') + argv.append('local,id=mirror,path=%s,security_model=none,readonly,mount_tag=mirror' % m) + if os.path.exists('/dev/kvm'): argv.append('-enable-kvm') @@ -360,7 +377,7 @@ image = download_image(args.cloud_image_url, args.release, args.arch) resize_image(image, args.disk_size) seed = build_seed(args.mirror, args.proxy, args.no_apt_upgrade, args.metadata, args.userdata, args.post_command, args.verbose) -boot_image(image, seed, args.qemu_command, args.verbose, args.timeout) +boot_image(image, seed, args.qemu_command, args.verbose, args.timeout, args.mirror) if 'adt-buildvm' in sys.argv[0]: fname = 'adt-%s-%s-cloud.img' % (args.release, args.arch) diff --git a/virt/autopkgtest-virt-qemu b/virt/autopkgtest-virt-qemu index eb3b162..35c4990 100755 --- a/virt/autopkgtest-virt-qemu +++ b/virt/autopkgtest-virt-qemu @@ -84,6 +84,12 @@ def parse_args(): help='timeout for waiting for reboot (default: %(default)ss)') parser.add_argument('--show-boot', action='store_true', help='Show boot messages from serial console') + parser.add_argument('--localmirror', + help='Path to a directory containing a full archive ' + 'mirror to use inside the VM. Will be mounted inside ' + 'the VM, which must already be configured to use ' + 'this directory for APT (e.g. by ' + 'autopkgtest-buildvm-ubuntu-cloud --mirror).') parser.add_argument('-d', '--debug', action='store_true', help='Enable debugging output') parser.add_argument('--qemu-options', @@ -544,6 +550,10 @@ def hook_open(): argv.append('-drive') argv.append('file=%s,if=virtio,index=%i,readonly' % (image, i + 1)) + if args.localmirror: + argv.append('-virtfs') + argv.append('local,id=mirror,path=%s,security_model=none,mount_tag=mirror' % args.localmirror) + if os.path.exists('/dev/kvm'): argv.append('-enable-kvm') # Enable nested KVM by default on x86_64 -- 2.10.2