Enable Zesty-Ocata Amulet Tests

- Turn on Zesty-Ocata Amulet test definitions.
- Standardize test-requirements.txt
- Sync charm helpers for various fixes

Change-Id: I22d7f8f37bf53635cb689803eb6e9b5170181bb1
This commit is contained in:
David Ames 2017-04-27 11:31:51 -07:00
parent 7f1b953982
commit 45f5a8a9a6
8 changed files with 72 additions and 35 deletions

View File

@ -239,6 +239,16 @@ def format_ipv6_addr(address):
return None return None
def is_ipv6_disabled():
try:
result = subprocess.check_output(
['sysctl', 'net.ipv6.conf.all.disable_ipv6'],
stderr=subprocess.STDOUT)
return "net.ipv6.conf.all.disable_ipv6 = 1" in result
except subprocess.CalledProcessError:
return True
def get_iface_addr(iface='eth0', inet_type='AF_INET', inc_aliases=False, def get_iface_addr(iface='eth0', inet_type='AF_INET', inc_aliases=False,
fatal=True, exc_list=None): fatal=True, exc_list=None):
"""Return the assigned IP address for a given interface, if any. """Return the assigned IP address for a given interface, if any.
@ -544,31 +554,38 @@ def assert_charm_supports_ipv6():
"versions less than Trusty 14.04") "versions less than Trusty 14.04")
def get_relation_ip(interface, config_override=None): def get_relation_ip(interface, cidr_network=None):
"""Return this unit's IP for the given relation. """Return this unit's IP for the given interface.
Allow for an arbitrary interface to use with network-get to select an IP. Allow for an arbitrary interface to use with network-get to select an IP.
Handle all address selection options including configuration parameter Handle all address selection options including passed cidr network and
override and IPv6. IPv6.
Usage: get_relation_ip('amqp', config_override='access-network') Usage: get_relation_ip('amqp', cidr_network='10.0.0.0/8')
@param interface: string name of the relation. @param interface: string name of the relation.
@param config_override: string name of the config option for network @param cidr_network: string CIDR Network to select an address from.
override. Supports legacy network override configuration parameters.
@raises Exception if prefer-ipv6 is configured but IPv6 unsupported. @raises Exception if prefer-ipv6 is configured but IPv6 unsupported.
@returns IPv6 or IPv4 address @returns IPv6 or IPv4 address
""" """
# Select the interface address first
# For possible use as a fallback bellow with get_address_in_network
try:
# Get the interface specific IP
address = network_get_primary_address(interface)
except NotImplementedError:
# If network-get is not available
address = get_host_ip(unit_get('private-address'))
fallback = get_host_ip(unit_get('private-address'))
if config('prefer-ipv6'): if config('prefer-ipv6'):
# Currently IPv6 has priority, eventually we want IPv6 to just be
# another network space.
assert_charm_supports_ipv6() assert_charm_supports_ipv6()
return get_ipv6_addr()[0] return get_ipv6_addr()[0]
elif config_override and config(config_override): elif cidr_network:
return get_address_in_network(config(config_override), # If a specific CIDR network is passed get the address from that
fallback) # network.
else: return get_address_in_network(cidr_network, address)
try:
return network_get_primary_address(interface) # Return the interface address
except NotImplementedError: return address
return fallback

View File

@ -191,7 +191,7 @@ def service_pause(service_name, init_dir="/etc/init", initd_dir="/etc/init.d",
upstart_file = os.path.join(init_dir, "{}.conf".format(service_name)) upstart_file = os.path.join(init_dir, "{}.conf".format(service_name))
sysv_file = os.path.join(initd_dir, service_name) sysv_file = os.path.join(initd_dir, service_name)
if init_is_systemd(): if init_is_systemd():
service('disable', service_name) service('mask', service_name)
elif os.path.exists(upstart_file): elif os.path.exists(upstart_file):
override_path = os.path.join( override_path = os.path.join(
init_dir, '{}.override'.format(service_name)) init_dir, '{}.override'.format(service_name))
@ -224,7 +224,7 @@ def service_resume(service_name, init_dir="/etc/init",
upstart_file = os.path.join(init_dir, "{}.conf".format(service_name)) upstart_file = os.path.join(init_dir, "{}.conf".format(service_name))
sysv_file = os.path.join(initd_dir, service_name) sysv_file = os.path.join(initd_dir, service_name)
if init_is_systemd(): if init_is_systemd():
service('enable', service_name) service('unmask', service_name)
elif os.path.exists(upstart_file): elif os.path.exists(upstart_file):
override_path = os.path.join( override_path = os.path.join(
init_dir, '{}.override'.format(service_name)) init_dir, '{}.override'.format(service_name))

View File

@ -10,4 +10,3 @@ Jinja2>=2.6 # BSD License (3 clause)
six>=1.9.0 six>=1.9.0
dnspython>=1.12.0 dnspython>=1.12.0
psutil>=1.1.1,<2.0.0 psutil>=1.1.1,<2.0.0
python-neutronclient>=2.6.0

View File

@ -11,13 +11,17 @@ requests==2.6.0
# Liberty client lower constraints # Liberty client lower constraints
amulet>=1.14.3,<2.0 amulet>=1.14.3,<2.0
bundletester>=0.6.1,<1.0 bundletester>=0.6.1,<1.0
python-ceilometerclient>=1.5.0,<2.0 python-ceilometerclient>=1.5.0
python-cinderclient>=1.4.0,<2.0 python-cinderclient>=1.4.0
python-glanceclient>=1.1.0,<2.0 python-glanceclient>=1.1.0
python-heatclient>=0.8.0,<1.0 python-heatclient>=0.8.0
python-novaclient>=2.30.1,<3.0 python-keystoneclient>=1.7.1
python-openstackclient>=1.7.0,<2.0 python-neutronclient>=3.1.0
python-swiftclient>=2.6.0,<3.0 python-novaclient>=2.30.1
python-openstackclient>=1.7.0
python-swiftclient>=2.6.0
pika>=0.10.0,<1.0 pika>=0.10.0,<1.0
distro-info distro-info
# END: Amulet OpenStack Charm Helper Requirements # END: Amulet OpenStack Charm Helper Requirements
# NOTE: workaround for 14.04 pip/tox
pytz

View File

@ -39,6 +39,12 @@ class BasicDeployment(OpenStackAmuletDeployment):
("Please set the vip in local.yaml or " ("Please set the vip in local.yaml or "
"env var AMULET_OS_VIP to run this test " "env var AMULET_OS_VIP to run this test "
"suite")) "suite"))
# Currenlty serverstack is unable to validate HA
# temporarily turn off HA
self.vip = None
self.ha = False
self.log = self.utils.get_logger() self.log = self.utils.get_logger()
def _add_services(self): def _add_services(self):
@ -51,7 +57,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
this_service = {'name': 'percona-cluster', this_service = {'name': 'percona-cluster',
'units': self.units} 'units': self.units}
other_services = [] other_services = []
if self.units > 1: if self.units > 1 and self.ha:
other_services.append({'name': 'hacluster'}) other_services.append({'name': 'hacluster'})
super(BasicDeployment, self)._add_services(this_service, super(BasicDeployment, self)._add_services(this_service,
@ -59,7 +65,8 @@ class BasicDeployment(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."""
if self.units > 1:
if self.units > 1 and self.ha:
relations = {'percona-cluster:ha': 'hacluster:ha'} relations = {'percona-cluster:ha': 'hacluster:ha'}
super(BasicDeployment, self)._add_relations(relations) super(BasicDeployment, self)._add_relations(relations)
@ -76,7 +83,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
'C1w=')} 'C1w=')}
configs = {} configs = {}
if self.units > 1: if self.units > 1 and self.ha:
cfg_ha['cluster_count'] = str(self.units) cfg_ha['cluster_count'] = str(self.units)
configs['hacluster'] = cfg_ha configs['hacluster'] = cfg_ha
configs['percona-cluster'] = cfg_percona configs['percona-cluster'] = cfg_percona
@ -101,7 +108,8 @@ class BasicDeployment(OpenStackAmuletDeployment):
self.test_bootstrapped_and_clustered() self.test_bootstrapped_and_clustered()
self.test_bootstrap_uuid_set_in_the_relation() self.test_bootstrap_uuid_set_in_the_relation()
self.test_pause_resume() self.test_pause_resume()
self.test_kill_master() if self.ha:
self.test_kill_master()
def test_pacemaker(self): def test_pacemaker(self):
''' '''
@ -110,10 +118,11 @@ class BasicDeployment(OpenStackAmuletDeployment):
side effect: self.master_unit should be set after execution side effect: self.master_unit should be set after execution
''' '''
if self.units > 1:
if self.units > 1 and self.ha:
i = 0 i = 0
while i < 30 and not self.master_unit: while i < 30 and not self.master_unit:
self.master_unit = self.find_master() self.master_unit = self.find_master(ha=self.ha)
i += 1 i += 1
time.sleep(10) time.sleep(10)
@ -129,7 +138,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
assert sorted(self.get_pcmkr_resources()) == sorted(resources) assert sorted(self.get_pcmkr_resources()) == sorted(resources)
else: else:
self.master_unit = self.find_master(ha=False) self.master_unit = self.find_master(ha=self.ha)
def test_pxc_running(self): def test_pxc_running(self):
''' '''
@ -217,7 +226,7 @@ class BasicDeployment(OpenStackAmuletDeployment):
while i < 10 and not changed: while i < 10 and not changed:
i += 1 i += 1
time.sleep(5) # give some time to pacemaker to react time.sleep(5) # give some time to pacemaker to react
new_master = self.find_master() new_master = self.find_master(ha=self.ha)
if (new_master and new_master.info['unit_name'] != if (new_master and new_master.info['unit_name'] !=
old_master.info['unit_name']): old_master.info['unit_name']):

View File

@ -547,7 +547,7 @@ class OpenStackAmuletUtils(AmuletUtils):
"""Create the specified instance.""" """Create the specified instance."""
self.log.debug('Creating instance ' self.log.debug('Creating instance '
'({}|{}|{})'.format(instance_name, image_name, flavor)) '({}|{}|{})'.format(instance_name, image_name, flavor))
image = nova.images.find(name=image_name) image = nova.glance.find_image(image_name)
flavor = nova.flavors.find(name=flavor) flavor = nova.flavors.find(name=flavor)
instance = nova.servers.create(name=instance_name, image=image, instance = nova.servers.create(name=instance_name, image=image,
flavor=flavor) flavor=flavor)

8
tests/gate-basic-xenial-ocata Executable file
View File

@ -0,0 +1,8 @@
#!/usr/bin/env python
import basic_deployment
if __name__ == "__main__":
t = basic_deployment.BasicDeployment(units=3, series='xenial')
t.run()

0
tests/gate-basic-zesty-ocata Normal file → Executable file
View File