Message ID | 20200529203458.1038-8-robert.foley@linaro.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | tests/vm: Add support for aarch64 VMs | expand |
On 5/29/20 10:34 PM, Robert Foley wrote: > Add a common Ubuntu python module and make use of > it with the ubuntu.i386 script. > This is preparation for adding an Ubuntu script > ubuntu.aarch64. Splitting out the common > logic such as build_image() will reduce duplication. > > Signed-off-by: Robert Foley <robert.foley@linaro.org> > --- > tests/vm/ubuntu.i386 | 46 +++++++++-------------------------- > tests/vm/ubuntuvm.py | 58 ++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 70 insertions(+), 34 deletions(-) > create mode 100644 tests/vm/ubuntuvm.py > > diff --git a/tests/vm/ubuntu.i386 b/tests/vm/ubuntu.i386 > index 1570775335..c699eaf8d7 100755 > --- a/tests/vm/ubuntu.i386 > +++ b/tests/vm/ubuntu.i386 > @@ -11,15 +11,22 @@ > # the COPYING file in the top-level directory. > # > > -import os > import sys > -import subprocess > import basevm > -import time > +import ubuntuvm > > -class UbuntuX86VM(basevm.BaseVM): > +DEFAULT_CONFIG = { > + 'install_cmds' : "apt-get update,"\ > + "apt-get build-dep -y qemu,"\ > + "apt-get install -y libfdt-dev flex bison language-pack-en", > +} > + > +class UbuntuX86VM(ubuntuvm.UbuntuVM): > name = "ubuntu.i386" > arch = "i386" > + image_link="https://cloud-images.ubuntu.com/releases/bionic/"\ > + "release-20191114/ubuntu-18.04-server-cloudimg-i386.img" > + image_sha256="28969840626d1ea80bb249c08eef1a4533e8904aa51a327b40f37ac4b4ff04ef" > BUILD_SCRIPT = """ > set -e; > cd $(mktemp -d); > @@ -29,34 +36,5 @@ class UbuntuX86VM(basevm.BaseVM): > make --output-sync {target} -j{jobs} {verbose}; > """ > > - def build_image(self, img): > - cimg = self._download_with_cache( > - "https://cloud-images.ubuntu.com/releases/bionic/release-20191114/ubuntu-18.04-server-cloudimg-i386.img", > - sha256sum="28969840626d1ea80bb249c08eef1a4533e8904aa51a327b40f37ac4b4ff04ef") > - img_tmp = img + ".tmp" > - subprocess.check_call(["cp", "-f", cimg, img_tmp]) > - self.exec_qemu_img("resize", img_tmp, "50G") > - self.boot(img_tmp, extra_args = [ > - "-device", "VGA", > - "-cdrom", self.gen_cloud_init_iso() > - ]) > - self.wait_ssh() > - self.ssh_root_check("touch /etc/cloud/cloud-init.disabled") > - self.ssh_root_check("apt-get update") > - self.ssh_root_check("apt-get install -y cloud-initramfs-growroot") > - # Don't check the status in case the guest hang up too quickly > - self.ssh_root("sync && reboot") > - time.sleep(5) > - self.wait_ssh() > - # The previous update sometimes doesn't survive a reboot, so do it again > - self.ssh_root_check("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list") > - self.ssh_root_check("apt-get update") > - self.ssh_root_check("apt-get build-dep -y qemu") > - self.ssh_root_check("apt-get install -y libfdt-dev flex bison language-pack-en") > - self.ssh_root("poweroff") > - self.wait() > - os.rename(img_tmp, img) > - return 0 > - > if __name__ == "__main__": > - sys.exit(basevm.main(UbuntuX86VM)) > + sys.exit(basevm.main(UbuntuX86VM, DEFAULT_CONFIG)) > diff --git a/tests/vm/ubuntuvm.py b/tests/vm/ubuntuvm.py > new file mode 100644 > index 0000000000..96f29dcc15 > --- /dev/null > +++ b/tests/vm/ubuntuvm.py > @@ -0,0 +1,58 @@ > +#!/usr/bin/env python3 > +# > +# Ubuntu VM testing library > +# Maybe: # Copyright 2017 Red Hat Inc. > +# Copyright 2020 Linaro > +# > +# Authors: And: # Fam Zheng <famz@redhat.com> or a line "copied from ..."? > +# Robert Foley <robert.foley@linaro.org> > +# > +# This code is licensed under the GPL version 2 or later. See > +# the COPYING file in the top-level directory. > + > +import os > +import subprocess > +import basevm > + > +class UbuntuVM(basevm.BaseVM): > + > + def __init__(self, args, config=None): > + self.login_prompt = "ubuntu-{}-guest login:".format(self.arch) > + basevm.BaseVM.__init__(self, args, config) > + > + def build_image(self, img): > + """Build an Ubuntu VM image. The child class will > + define the install_cmds to init the VM.""" > + os_img = self._download_with_cache(self.image_link, > + sha256sum=self.image_sha256) > + img_tmp = img + ".tmp" > + subprocess.check_call(["cp", "-f", os_img, img_tmp]) > + self.exec_qemu_img("resize", img_tmp, "+50G") > + ci_img = self.gen_cloud_init_iso() > + > + self.boot(img_tmp, extra_args = [ "-device", "VGA", "-cdrom", ci_img, ]) > + > + # First command we issue is fix for slow ssh login. > + self.wait_ssh(wait_root=True, > + cmd="chmod -x /etc/update-motd.d/*") > + # Wait for cloud init to finish > + self.wait_ssh(wait_root=True, > + cmd="ls /var/lib/cloud/instance/boot-finished") > + self.ssh_root("touch /etc/cloud/cloud-init.disabled") > + # Disable auto upgrades. > + # We want to keep the VM system state stable. > + self.ssh_root('sed -ie \'s/"1"/"0"/g\' '\ > + '/etc/apt/apt.conf.d/20auto-upgrades') > + self.ssh_root("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list") > + > + # If the user chooses not to do the install phase, > + # then we will jump right to the graceful shutdown > + if self._config['install_cmds'] != "": > + # Issue the install commands. > + # This can be overriden by the user in the config .yml. > + install_cmds = self._config['install_cmds'].split(',') > + for cmd in install_cmds: > + self.ssh_root(cmd) > + self.graceful_shutdown() > + os.rename(img_tmp, img) > + return 0 > Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
On Sun, 31 May 2020 at 06:37, Philippe Mathieu-Daudé <philmd@redhat.com> wrote: > > On 5/29/20 10:34 PM, Robert Foley wrote: > > Add a common Ubuntu python module and make use of > > it with the ubuntu.i386 script. > > This is preparation for adding an Ubuntu script > > ubuntu.aarch64. Splitting out the common > > logic such as build_image() will reduce duplication. <snip> > > diff --git a/tests/vm/ubuntuvm.py b/tests/vm/ubuntuvm.py > > new file mode 100644 > > index 0000000000..96f29dcc15 > > --- /dev/null > > +++ b/tests/vm/ubuntuvm.py > > @@ -0,0 +1,58 @@ > > +#!/usr/bin/env python3 > > +# > > +# Ubuntu VM testing library > > +# > > Maybe: > > # Copyright 2017 Red Hat Inc. > > > +# Copyright 2020 Linaro > > +# > > +# Authors: > > And: > > # Fam Zheng <famz@redhat.com> > > or a line "copied from ..."? Good catch! Will update this with all of the above suggestions. Thanks & Regards, -Rob > > > +# Robert Foley <robert.foley@linaro.org> > > +# > > +# This code is licensed under the GPL version 2 or later. See > > +# the COPYING file in the top-level directory. > > + > > +import os > > +import subprocess > > +import basevm > > + > > +class UbuntuVM(basevm.BaseVM): > > + > > + def __init__(self, args, config=None): > > + self.login_prompt = "ubuntu-{}-guest login:".format(self.arch) > > + basevm.BaseVM.__init__(self, args, config) > > + > > + def build_image(self, img): > > + """Build an Ubuntu VM image. The child class will > > + define the install_cmds to init the VM.""" > > + os_img = self._download_with_cache(self.image_link, > > + sha256sum=self.image_sha256) > > + img_tmp = img + ".tmp" > > + subprocess.check_call(["cp", "-f", os_img, img_tmp]) > > + self.exec_qemu_img("resize", img_tmp, "+50G") > > + ci_img = self.gen_cloud_init_iso() > > + > > + self.boot(img_tmp, extra_args = [ "-device", "VGA", "-cdrom", ci_img, ]) > > + > > + # First command we issue is fix for slow ssh login. > > + self.wait_ssh(wait_root=True, > > + cmd="chmod -x /etc/update-motd.d/*") > > + # Wait for cloud init to finish > > + self.wait_ssh(wait_root=True, > > + cmd="ls /var/lib/cloud/instance/boot-finished") > > + self.ssh_root("touch /etc/cloud/cloud-init.disabled") > > + # Disable auto upgrades. > > + # We want to keep the VM system state stable. > > + self.ssh_root('sed -ie \'s/"1"/"0"/g\' '\ > > + '/etc/apt/apt.conf.d/20auto-upgrades') > > + self.ssh_root("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list") > > + > > + # If the user chooses not to do the install phase, > > + # then we will jump right to the graceful shutdown > > + if self._config['install_cmds'] != "": > > + # Issue the install commands. > > + # This can be overriden by the user in the config .yml. > > + install_cmds = self._config['install_cmds'].split(',') > > + for cmd in install_cmds: > > + self.ssh_root(cmd) > > + self.graceful_shutdown() > > + os.rename(img_tmp, img) > > + return 0 > > > > Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com> >
diff --git a/tests/vm/ubuntu.i386 b/tests/vm/ubuntu.i386 index 1570775335..c699eaf8d7 100755 --- a/tests/vm/ubuntu.i386 +++ b/tests/vm/ubuntu.i386 @@ -11,15 +11,22 @@ # the COPYING file in the top-level directory. # -import os import sys -import subprocess import basevm -import time +import ubuntuvm -class UbuntuX86VM(basevm.BaseVM): +DEFAULT_CONFIG = { + 'install_cmds' : "apt-get update,"\ + "apt-get build-dep -y qemu,"\ + "apt-get install -y libfdt-dev flex bison language-pack-en", +} + +class UbuntuX86VM(ubuntuvm.UbuntuVM): name = "ubuntu.i386" arch = "i386" + image_link="https://cloud-images.ubuntu.com/releases/bionic/"\ + "release-20191114/ubuntu-18.04-server-cloudimg-i386.img" + image_sha256="28969840626d1ea80bb249c08eef1a4533e8904aa51a327b40f37ac4b4ff04ef" BUILD_SCRIPT = """ set -e; cd $(mktemp -d); @@ -29,34 +36,5 @@ class UbuntuX86VM(basevm.BaseVM): make --output-sync {target} -j{jobs} {verbose}; """ - def build_image(self, img): - cimg = self._download_with_cache( - "https://cloud-images.ubuntu.com/releases/bionic/release-20191114/ubuntu-18.04-server-cloudimg-i386.img", - sha256sum="28969840626d1ea80bb249c08eef1a4533e8904aa51a327b40f37ac4b4ff04ef") - img_tmp = img + ".tmp" - subprocess.check_call(["cp", "-f", cimg, img_tmp]) - self.exec_qemu_img("resize", img_tmp, "50G") - self.boot(img_tmp, extra_args = [ - "-device", "VGA", - "-cdrom", self.gen_cloud_init_iso() - ]) - self.wait_ssh() - self.ssh_root_check("touch /etc/cloud/cloud-init.disabled") - self.ssh_root_check("apt-get update") - self.ssh_root_check("apt-get install -y cloud-initramfs-growroot") - # Don't check the status in case the guest hang up too quickly - self.ssh_root("sync && reboot") - time.sleep(5) - self.wait_ssh() - # The previous update sometimes doesn't survive a reboot, so do it again - self.ssh_root_check("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list") - self.ssh_root_check("apt-get update") - self.ssh_root_check("apt-get build-dep -y qemu") - self.ssh_root_check("apt-get install -y libfdt-dev flex bison language-pack-en") - self.ssh_root("poweroff") - self.wait() - os.rename(img_tmp, img) - return 0 - if __name__ == "__main__": - sys.exit(basevm.main(UbuntuX86VM)) + sys.exit(basevm.main(UbuntuX86VM, DEFAULT_CONFIG)) diff --git a/tests/vm/ubuntuvm.py b/tests/vm/ubuntuvm.py new file mode 100644 index 0000000000..96f29dcc15 --- /dev/null +++ b/tests/vm/ubuntuvm.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +# +# Ubuntu VM testing library +# +# Copyright 2020 Linaro +# +# Authors: +# Robert Foley <robert.foley@linaro.org> +# +# This code is licensed under the GPL version 2 or later. See +# the COPYING file in the top-level directory. + +import os +import subprocess +import basevm + +class UbuntuVM(basevm.BaseVM): + + def __init__(self, args, config=None): + self.login_prompt = "ubuntu-{}-guest login:".format(self.arch) + basevm.BaseVM.__init__(self, args, config) + + def build_image(self, img): + """Build an Ubuntu VM image. The child class will + define the install_cmds to init the VM.""" + os_img = self._download_with_cache(self.image_link, + sha256sum=self.image_sha256) + img_tmp = img + ".tmp" + subprocess.check_call(["cp", "-f", os_img, img_tmp]) + self.exec_qemu_img("resize", img_tmp, "+50G") + ci_img = self.gen_cloud_init_iso() + + self.boot(img_tmp, extra_args = [ "-device", "VGA", "-cdrom", ci_img, ]) + + # First command we issue is fix for slow ssh login. + self.wait_ssh(wait_root=True, + cmd="chmod -x /etc/update-motd.d/*") + # Wait for cloud init to finish + self.wait_ssh(wait_root=True, + cmd="ls /var/lib/cloud/instance/boot-finished") + self.ssh_root("touch /etc/cloud/cloud-init.disabled") + # Disable auto upgrades. + # We want to keep the VM system state stable. + self.ssh_root('sed -ie \'s/"1"/"0"/g\' '\ + '/etc/apt/apt.conf.d/20auto-upgrades') + self.ssh_root("sed -ie s/^#\ deb-src/deb-src/g /etc/apt/sources.list") + + # If the user chooses not to do the install phase, + # then we will jump right to the graceful shutdown + if self._config['install_cmds'] != "": + # Issue the install commands. + # This can be overriden by the user in the config .yml. + install_cmds = self._config['install_cmds'].split(',') + for cmd in install_cmds: + self.ssh_root(cmd) + self.graceful_shutdown() + os.rename(img_tmp, img) + return 0
Add a common Ubuntu python module and make use of it with the ubuntu.i386 script. This is preparation for adding an Ubuntu script ubuntu.aarch64. Splitting out the common logic such as build_image() will reduce duplication. Signed-off-by: Robert Foley <robert.foley@linaro.org> --- tests/vm/ubuntu.i386 | 46 +++++++++-------------------------- tests/vm/ubuntuvm.py | 58 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 34 deletions(-) create mode 100644 tests/vm/ubuntuvm.py