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
This commit is contained in:
parent
0ac2f83505
commit
c853b3e8c8
@ -1,7 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import json
|
import json
|
||||||
import unittest
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import unittest
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
import petname
|
import petname
|
||||||
@ -62,6 +62,15 @@ class TestHost:
|
|||||||
def install_snap(self, name, options):
|
def install_snap(self, name, options):
|
||||||
self.check_output(['sudo', 'snap', 'install', 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):
|
def remove_snap(self, name, options):
|
||||||
self.check_output(['sudo', 'snap', 'remove', name, *options])
|
self.check_output(['sudo', 'snap', 'remove', name, *options])
|
||||||
|
|
||||||
@ -69,13 +78,16 @@ class TestHost:
|
|||||||
self.check_output(['sudo', 'snap', 'connect',
|
self.check_output(['sudo', 'snap', 'connect',
|
||||||
f'{snap_name}:{plug_name}'])
|
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.
|
"""Install MicroStack at this host and connect relevant plugs.
|
||||||
"""
|
"""
|
||||||
if path is not None:
|
if path and snap_try:
|
||||||
self.install_snap(path, ['--devmode'])
|
self.try_snap(path)
|
||||||
else:
|
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.
|
# TODO: add microstack-support once it is merged into snapd.
|
||||||
plugs = [
|
plugs = [
|
||||||
|
@ -14,6 +14,7 @@ Web IDE.
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
@ -24,6 +25,7 @@ from tests.framework import Framework # noqa E402
|
|||||||
|
|
||||||
|
|
||||||
class TestBasics(Framework):
|
class TestBasics(Framework):
|
||||||
|
snap_try = False
|
||||||
|
|
||||||
def test_basics(self):
|
def test_basics(self):
|
||||||
"""Basic test
|
"""Basic test
|
||||||
@ -32,7 +34,8 @@ class TestBasics(Framework):
|
|||||||
open the Horizon GUI.
|
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([
|
self._localhost.init_microstack([
|
||||||
'--auto',
|
'--auto',
|
||||||
'--control',
|
'--control',
|
||||||
@ -100,6 +103,14 @@ class TestBasics(Framework):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
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
|
# Run our tests, ignoring deprecation warnings and warnings about
|
||||||
# unclosed sockets. (TODO: setup a selenium server so that we can
|
# unclosed sockets. (TODO: setup a selenium server so that we can
|
||||||
# move from PhantomJS, which is deprecated, to to Selenium headless.)
|
# move from PhantomJS, which is deprecated, to to Selenium headless.)
|
||||||
|
@ -10,6 +10,7 @@ vms.
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@ -32,11 +33,13 @@ logger.addHandler(stream)
|
|||||||
|
|
||||||
|
|
||||||
class TestCluster(Framework):
|
class TestCluster(Framework):
|
||||||
|
snap_try = False
|
||||||
|
|
||||||
def test_cluster(self):
|
def test_cluster(self):
|
||||||
openstack_cmd = '/snap/bin/microstack.openstack'
|
openstack_cmd = '/snap/bin/microstack.openstack'
|
||||||
control_host = self._localhost
|
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
|
# 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
|
# control IP so that the tunnel ports of the compute node target the
|
||||||
@ -74,7 +77,13 @@ class TestCluster(Framework):
|
|||||||
|
|
||||||
wait_addr()
|
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
|
# TODO add the following to args for init
|
||||||
compute_host.check_call([
|
compute_host.check_call([
|
||||||
@ -143,4 +152,12 @@ class TestCluster(Framework):
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
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')
|
unittest.main(warnings='ignore')
|
||||||
|
24
tox.ini
24
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_basic.py"
|
||||||
bash -c "unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY ; {toxinidir}/tests/test_cluster.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]
|
[testenv:multipass]
|
||||||
# Default testing environment for a human operated machine. Builds the
|
# Default testing environment for a human operated machine. Builds the
|
||||||
# snap in a multipass instance, then runs tests in a separate multipass
|
# snap in a multipass instance, then runs tests in a separate multipass
|
||||||
|
Loading…
x
Reference in New Issue
Block a user