[1chb1n, r=thedac] wait for unit status and turn on releases for amulet tests

This commit is contained in:
David Ames 2016-01-21 12:06:46 -08:00
commit 5e3aac4f9e
4 changed files with 75 additions and 24 deletions

0
tests/018-basic-trusty-liberty Normal file → Executable file
View File

0
tests/019-basic-trusty-mitaka Normal file → Executable file
View File

0
tests/020-basic-wily-liberty Normal file → Executable file
View File

View File

@ -9,6 +9,8 @@ from charmhelpers.contrib.openstack.amulet.deployment import (
OpenStackAmuletDeployment OpenStackAmuletDeployment
) )
# This file needs de-linted. The (mis)use of n-o q-a below causes all lint
# to go undetected. Remove that & fixme.
from charmhelpers.contrib.openstack.amulet.utils import ( from charmhelpers.contrib.openstack.amulet.utils import (
OpenStackAmuletUtils, OpenStackAmuletUtils,
DEBUG, # flake8: noqa DEBUG, # flake8: noqa
@ -36,6 +38,11 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
self._add_relations() self._add_relations()
self._configure_services() self._configure_services()
self._deploy() self._deploy()
u.log.info('Waiting on extended status checks...')
exclude_services = ['mysql']
self._auto_wait_for_status(exclude_services=exclude_services)
self._initialize_tests() self._initialize_tests()
def _add_services(self): def _add_services(self):
@ -45,9 +52,14 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
and the rest of the service are from lp branches that are and the rest of the service are from lp branches that are
compatible with the local charm (e.g. stable or next). compatible with the local charm (e.g. stable or next).
""" """
# Services and relations which are present merely to satisfy required_interfaces
# and workload status are not inspected. Fix me. Inspect those too.
this_service = {'name': 'neutron-openvswitch'} this_service = {'name': 'neutron-openvswitch'}
other_services = [{'name': 'nova-compute'}, other_services = [{'name': 'nova-compute'},
{'name': 'rabbitmq-server'}, {'name': 'rabbitmq-server'},
{'name': 'keystone'}, # satisfy workload stat
{'name': 'mysql'}, # satisfy workload stat
{'name': 'glance'}, # satisfy workload stat
{'name': 'neutron-api'}] {'name': 'neutron-api'}]
super(NeutronOVSBasicDeployment, self)._add_services(this_service, super(NeutronOVSBasicDeployment, self)._add_services(this_service,
other_services) other_services)
@ -55,11 +67,21 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
def _add_relations(self): def _add_relations(self):
"""Add all of the relations for the services.""" """Add all of the relations for the services."""
relations = { relations = {
'neutron-openvswitch:amqp': 'rabbitmq-server:amqp', 'neutron-openvswitch:amqp': 'rabbitmq-server:amqp',
'neutron-openvswitch:neutron-plugin': 'neutron-openvswitch:neutron-plugin':
'nova-compute:neutron-plugin', 'nova-compute:neutron-plugin',
'neutron-openvswitch:neutron-plugin-api': 'neutron-openvswitch:neutron-plugin-api':
'neutron-api:neutron-plugin-api', 'neutron-api:neutron-plugin-api',
# Satisfy workload stat:
'neutron-api:identity-service': 'keystone:identity-service',
'neutron-api:shared-db': 'mysql:shared-db',
'neutron-api:amqp': 'rabbitmq-server:amqp',
'nova-compute:amqp': 'rabbitmq-server:amqp',
'nova-compute:image-service': 'glance:image-service',
'glance:identity-service': 'keystone:identity-service',
'glance:shared-db': 'mysql:shared-db',
'glance:amqp': 'rabbitmq-server:amqp',
'keystone:shared-db': 'mysql:shared-db',
} }
super(NeutronOVSBasicDeployment, self)._add_relations(relations) super(NeutronOVSBasicDeployment, self)._add_relations(relations)
@ -124,22 +146,26 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
self.compute_sentry = self.d.sentry.unit['nova-compute/0'] self.compute_sentry = self.d.sentry.unit['nova-compute/0']
self.rabbitmq_sentry = self.d.sentry.unit['rabbitmq-server/0'] self.rabbitmq_sentry = self.d.sentry.unit['rabbitmq-server/0']
self.neutron_api_sentry = self.d.sentry.unit['neutron-api/0'] self.neutron_api_sentry = self.d.sentry.unit['neutron-api/0']
self.n_ovs_sentry = self.d.sentry.unit['neutron-openvswitch/0']
def test_services(self): def test_100_services(self):
"""Verify the expected services are running on the corresponding """Verify the expected services are running on the corresponding
service units.""" service units."""
u.log.debug('Checking system services on units...')
commands = { services = {
self.compute_sentry: ['status nova-compute', self.compute_sentry: ['nova-compute',
'status neutron-plugin-openvswitch-agent'], 'neutron-plugin-openvswitch-agent'],
self.rabbitmq_sentry: ['service rabbitmq-server status'], self.rabbitmq_sentry: ['rabbitmq-server'],
self.neutron_api_sentry: ['status neutron-server'], self.neutron_api_sentry: ['neutron-server'],
} }
ret = u.validate_services(commands) ret = u.validate_services_by_name(services)
if ret: if ret:
amulet.raise_status(amulet.FAIL, msg=ret) amulet.raise_status(amulet.FAIL, msg=ret)
u.log.debug('OK')
def test_rabbitmq_amqp_relation(self): def test_rabbitmq_amqp_relation(self):
"""Verify data in rabbitmq-server/neutron-openvswitch amqp relation""" """Verify data in rabbitmq-server/neutron-openvswitch amqp relation"""
unit = self.rabbitmq_sentry unit = self.rabbitmq_sentry
@ -189,6 +215,8 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
def check_ml2_setting_propagation(self, service, charm_key, def check_ml2_setting_propagation(self, service, charm_key,
config_file_key, vpair, config_file_key, vpair,
section): section):
# Needs love - test actions not clear in log
unit = self.compute_sentry unit = self.compute_sentry
conf = "/etc/neutron/plugins/ml2/ml2_conf.ini" conf = "/etc/neutron/plugins/ml2/ml2_conf.ini"
for value in vpair: for value in vpair:
@ -202,6 +230,8 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
def test_l2pop_propagation(self): def test_l2pop_propagation(self):
"""Verify that neutron-api l2pop setting propagates to neutron-ovs""" """Verify that neutron-api l2pop setting propagates to neutron-ovs"""
# Needs love - not idempotent
self.check_ml2_setting_propagation('neutron-api', self.check_ml2_setting_propagation('neutron-api',
'l2-population', 'l2-population',
'l2_population', 'l2_population',
@ -210,6 +240,8 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
def test_nettype_propagation(self): def test_nettype_propagation(self):
"""Verify that neutron-api nettype setting propagates to neutron-ovs""" """Verify that neutron-api nettype setting propagates to neutron-ovs"""
# Needs love - not idempotent
self.check_ml2_setting_propagation('neutron-api', self.check_ml2_setting_propagation('neutron-api',
'overlay-network-type', 'overlay-network-type',
'tunnel_types', 'tunnel_types',
@ -218,6 +250,8 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
def test_secgroup_propagation_local_override(self): def test_secgroup_propagation_local_override(self):
"""Verify disable-security-groups overrides what neutron-api says""" """Verify disable-security-groups overrides what neutron-api says"""
# Needs love - not idempotent
unit = self.compute_sentry unit = self.compute_sentry
conf = "/etc/neutron/plugins/ml2/ml2_conf.ini" conf = "/etc/neutron/plugins/ml2/ml2_conf.ini"
self.d.configure('neutron-api', {'neutron-security-groups': 'True'}) self.d.configure('neutron-api', {'neutron-security-groups': 'True'})
@ -237,20 +271,37 @@ class NeutronOVSBasicDeployment(OpenStackAmuletDeployment):
{'enable_security_group': 'True'}) {'enable_security_group': 'True'})
def test_z_restart_on_config_change(self): def test_z_restart_on_config_change(self):
"""Verify that the specified services are restarted when the config """Verify that the specified services are restarted when the
is changed. config is changed."""
Note(coreycb): The method name with the _z_ is a little odd sentry = self.n_ovs_sentry
but it forces the test to run last. It just makes things juju_service = 'neutron-openvswitch'
easier because restarting services requires re-authorization.
""" # Expected default and alternate values
conf = '/etc/neutron/neutron.conf' set_default = {'debug': 'False'}
self.d.configure('neutron-openvswitch', {'use-syslog': 'True'}) set_alternate = {'debug': 'True'}
if not u.service_restarted(self.compute_sentry,
'neutron-openvswitch-agent', conf, # Services which are expected to restart upon config change,
pgrep_full=True, sleep_time=60): # and corresponding config files affected by the change
self.d.configure('neutron-openvswitch', {'use-syslog': 'False'}) conf_file = '/etc/neutron/neutron.conf'
msg = ('service neutron-openvswitch-agent did not restart after ' services = {
'config change') 'neutron-openvswitch-agent': conf_file
amulet.raise_status(amulet.FAIL, msg=msg) }
self.d.configure('neutron-openvswitch', {'use-syslog': 'False'})
# Make config change, check for svc restart, conf file mod time change
u.log.debug('Making config change on {}...'.format(juju_service))
mtime = u.get_sentry_time(sentry)
self.d.configure(juju_service, set_alternate)
sleep_time = 60
for s, conf_file in services.iteritems():
u.log.debug("Checking that service restarted: {}".format(s))
if not u.validate_service_config_changed(sentry, mtime, s,
conf_file,
sleep_time=sleep_time):
self.d.configure(juju_service, set_default)
msg = "service {} didn't restart after config change".format(s)
amulet.raise_status(amulet.FAIL, msg=msg)
self.d.configure(juju_service, set_default)
u.log.debug('OK')