Refactored test framework so that we have more flexibility in terms of installing various versions of microstack before and after running some tests. Moved in class "globals" into per instance variables, to avoid broken cases with incomplete cleanup. Added test_refresh.py, plus matching env in tox. Refresh tests will fail currently, because we have some pending issues that break refreshes. Fixing those is a subject for a different commit. Refactored cluster_test.py and control_test.py to use new framework. Should (and do) pass. Framework now cleans up multipass hosts regardless of whether or not the tests passed. Leaning on the .tar.gz for local troubleshooting helps us make it better for in gate troubleshooting. Change-Id: I6a45b39132f5959c2944fe1ebbe10f71408ee777
118 lines
3.9 KiB
Python
Executable File
118 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python
|
|
"""
|
|
cluster_test.py
|
|
|
|
This is a test to verify that we can setup a small, two node cluster.
|
|
|
|
The host running this test must have at least 16GB of RAM, four cpu
|
|
cores, a large amount of disk space, and the ability to run multipass
|
|
vms.
|
|
|
|
"""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
import unittest
|
|
|
|
sys.path.append(os.getcwd())
|
|
|
|
from tests.framework import Framework, check, check_output, call # noqa E402
|
|
|
|
|
|
os.environ['MULTIPASS'] = 'true' # TODO better way to do this.
|
|
|
|
|
|
class TestCluster(Framework):
|
|
|
|
def test_cluster(self):
|
|
|
|
# After the setUp step, we should have a control node running
|
|
# in a multipass vm. Let's look up its cluster password and ip
|
|
# address.
|
|
|
|
openstack = '/snap/bin/microstack.openstack'
|
|
control_host = self.get_host()
|
|
control_host.install()
|
|
control_host.init(flag='control')
|
|
|
|
control_prefix = control_host.prefix
|
|
cluster_password = check_output(*control_prefix, 'sudo', 'snap',
|
|
'get', 'microstack',
|
|
'config.cluster.password')
|
|
control_ip = check_output(*control_prefix, 'sudo', 'snap',
|
|
'get', 'microstack',
|
|
'config.network.control-ip')
|
|
|
|
self.assertTrue(cluster_password)
|
|
self.assertTrue(control_ip)
|
|
|
|
compute_host = self.add_host()
|
|
compute_host.install()
|
|
|
|
compute_machine = compute_host.machine
|
|
compute_prefix = compute_host.prefix
|
|
|
|
# TODO add the following to args for init
|
|
check(*compute_prefix, 'sudo', 'snap', 'set', 'microstack',
|
|
'config.network.control-ip={}'.format(control_ip))
|
|
|
|
check(*compute_prefix, 'sudo', 'microstack.init', '--compute',
|
|
'--cluster-password', cluster_password, '--debug')
|
|
|
|
# Verify that our services look setup properly on compute node.
|
|
services = check_output(
|
|
*compute_prefix, 'systemctl', 'status', 'snap.microstack.*',
|
|
'--no-page')
|
|
|
|
self.assertTrue('nova-compute' in services)
|
|
self.assertFalse('keystone-' in services)
|
|
|
|
check(*compute_prefix, '/snap/bin/microstack.launch', 'cirros',
|
|
'--name', 'breakfast', '--retry',
|
|
'--availability-zone', 'nova:{}'.format(compute_machine))
|
|
|
|
# TODO: verify horizon dashboard on control node.
|
|
|
|
# Verify endpoints
|
|
compute_ip = check_output(*compute_prefix, 'sudo', 'snap',
|
|
'get', 'microstack',
|
|
'config.network.compute-ip')
|
|
self.assertFalse(compute_ip == control_ip)
|
|
|
|
# Ping the instance
|
|
ip = None
|
|
servers = check_output(*compute_prefix, openstack,
|
|
'server', 'list', '--format', 'json')
|
|
servers = json.loads(servers)
|
|
for server in servers:
|
|
if server['Name'] == 'breakfast':
|
|
ip = server['Networks'].split(",")[1].strip()
|
|
break
|
|
|
|
self.assertTrue(ip)
|
|
|
|
pings = 1
|
|
max_pings = 60 # ~1 minutes
|
|
# Ping the machine from the control node (we don't have
|
|
# networking wired up for the other nodes).
|
|
while not call(*control_prefix, 'ping', '-c1', '-w1', ip):
|
|
pings += 1
|
|
if pings > max_pings:
|
|
self.assertFalse(
|
|
True,
|
|
msg='Max pings reached for instance on {}!'.format(
|
|
compute_machine))
|
|
|
|
self.passed = True
|
|
|
|
# Compute machine cleanup
|
|
check('sudo', 'multipass', 'delete', compute_machine)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
# 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.)
|
|
unittest.main(warnings='ignore')
|