From c853b3e8c89a9043994c05eeb7f1c3ad22628c6f Mon Sep 17 00:00:00 2001 From: Corey Bryant Date: Fri, 12 Mar 2021 08:53:23 -0500 Subject: [PATCH] Enable rw snap mount for test debugging Add support for using unsquashfs to uncompress the microstack snap followed by 'snap try ./squashfs-root/'. This enables installation of the snap as an rw mount, and local files can be modified in ./squashfs-root/ and will go live instantly. See 'snap try --help' for more details. New tox targets are added for snap-try, snap-try-basic, and snap-try-cluster. Change-Id: I54fb8dc864fd4f346f20ae986155ad36bb7c1fac --- tests/framework.py | 22 +++++++++++++++++----- tests/test_basic.py | 13 ++++++++++++- tests/test_cluster.py | 21 +++++++++++++++++++-- tox.ini | 24 ++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 8 deletions(-) diff --git a/tests/framework.py b/tests/framework.py index b90a6b8..2fdbe07 100644 --- a/tests/framework.py +++ b/tests/framework.py @@ -1,7 +1,7 @@ import logging import json -import unittest import subprocess +import unittest import yaml import petname @@ -62,6 +62,15 @@ class TestHost: def install_snap(self, name, options): self.check_output(['sudo', 'snap', 'install', name, *options]) + def try_snap(self, name): + try: + self.check_output(['unsquashfs', name]) + except subprocess.CalledProcessError: + logger.warning("Re-using existing squashfs-root directory with " + "'snap try squashfs-root'") + self.check_output(['sudo', 'snap', 'try', 'squashfs-root', + '--devmode']) + def remove_snap(self, name, options): self.check_output(['sudo', 'snap', 'remove', name, *options]) @@ -69,13 +78,16 @@ class TestHost: self.check_output(['sudo', 'snap', 'connect', f'{snap_name}:{plug_name}']) - def install_microstack(self, *, channel='edge', path=None): + def install_microstack(self, *, channel='edge', path=None, snap_try=False): """Install MicroStack at this host and connect relevant plugs. """ - if path is not None: - self.install_snap(path, ['--devmode']) + if path and snap_try: + self.try_snap(path) else: - self.install_snap('microstack', [f'--{channel}', '--devmode']) + if path is not None: + self.install_snap(path, ['--devmode']) + else: + self.install_snap('microstack', [f'--{channel}', '--devmode']) # TODO: add microstack-support once it is merged into snapd. plugs = [ diff --git a/tests/test_basic.py b/tests/test_basic.py index 72610ec..b676a80 100755 --- a/tests/test_basic.py +++ b/tests/test_basic.py @@ -14,6 +14,7 @@ Web IDE. """ +import argparse import os import sys import unittest @@ -24,6 +25,7 @@ from tests.framework import Framework # noqa E402 class TestBasics(Framework): + snap_try = False def test_basics(self): """Basic test @@ -32,7 +34,8 @@ class TestBasics(Framework): open the Horizon GUI. """ - self._localhost.install_microstack(path='microstack_ussuri_amd64.snap') + self._localhost.install_microstack(path='microstack_ussuri_amd64.snap', + snap_try=self.snap_try) self._localhost.init_microstack([ '--auto', '--control', @@ -100,6 +103,14 @@ class TestBasics(Framework): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--snap-try", help="Install snap as rw mount from " + "squashfs-root directory", action='store_true') + parser.add_argument('unittest_args', nargs='*') + args = parser.parse_args() + TestBasics.snap_try = args.snap_try + sys.argv[1:] = args.unittest_args + # Run our tests, ignoring deprecation warnings and warnings about # unclosed sockets. (TODO: setup a selenium server so that we can # move from PhantomJS, which is deprecated, to to Selenium headless.) diff --git a/tests/test_cluster.py b/tests/test_cluster.py index e898618..26c1561 100755 --- a/tests/test_cluster.py +++ b/tests/test_cluster.py @@ -10,6 +10,7 @@ vms. """ +import argparse import json import os import sys @@ -32,11 +33,13 @@ logger.addHandler(stream) class TestCluster(Framework): + snap_try = False def test_cluster(self): openstack_cmd = '/snap/bin/microstack.openstack' control_host = self._localhost - control_host.install_microstack(path='microstack_ussuri_amd64.snap') + control_host.install_microstack(path='microstack_ussuri_amd64.snap', + snap_try=self.snap_try) # Get an IP address on the lxdbr0 bridge and use it for the # control IP so that the tunnel ports of the compute node target the @@ -74,7 +77,13 @@ class TestCluster(Framework): wait_addr() - compute_host.install_microstack(path='microstack_ussuri_amd64.snap') + if self.snap_try: + # Note(coreycb): Work-around for https://pad.lv/1908424 + compute_host.check_call([ + 'sudo', 'apt', 'install', '--yes', '--allow-downgrades', + 'snapd=2.44.3+20.04']) + compute_host.install_microstack(path='microstack_ussuri_amd64.snap', + snap_try=self.snap_try) # TODO add the following to args for init compute_host.check_call([ @@ -143,4 +152,12 @@ class TestCluster(Framework): if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--snap-try", help="Install snap as rw mount from " + "squashfs-root directory", action='store_true') + parser.add_argument('unittest_args', nargs='*') + args = parser.parse_args() + TestCluster.snap_try = args.snap_try + sys.argv[1:] = args.unittest_args + unittest.main(warnings='ignore') diff --git a/tox.ini b/tox.ini index 4796d3a..09dbde2 100644 --- a/tox.ini +++ b/tox.ini @@ -30,6 +30,30 @@ commands = bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_basic.py" bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_cluster.py" +[testenv:snap-try] +# Testing environment for local debugging. Mounts rw snap from squashfs-root dir. +commands = + {toxinidir}/tools/lxd_build.sh + flake8 {toxinidir}/tests/ + # Specify tests in sequence, as they can't run in parallel if not + # using multipass. + bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_basic.py --snap-try" + bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_cluster.py --snap-try" + +[testenv:snap-try-basic] +# Testing environment for local debugging. Mounts rw snap from squashfs-root dir. +commands = + {toxinidir}/tools/lxd_build.sh + flake8 {toxinidir}/tests/ + bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_basic.py --snap-try" + +[testenv:snap-try-cluster] +# Testing environment for local debugging. Mounts rw snap from squashfs-root dir. +commands = + {toxinidir}/tools/lxd_build.sh + flake8 {toxinidir}/tests/ + bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_cluster.py --snap-try" + [testenv:multipass] # Default testing environment for a human operated machine. Builds the # snap in a multipass instance, then runs tests in a separate multipass