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')
|