Pre-release charm-helpers sync 16.10
Get each charm up to date with lp:charm-helpers for release testing. Change-Id: I3a5e6568cb449c59edf349fb28021c8914b494c3
This commit is contained in:
parent
cfc38a0086
commit
3428bbbc64
|
@ -78,11 +78,15 @@ class AmuletDeployment(object):
|
|||
|
||||
def _deploy(self):
|
||||
"""Deploy environment and wait for all hooks to finish executing."""
|
||||
timeout = int(os.environ.get('AMULET_SETUP_TIMEOUT', 900))
|
||||
try:
|
||||
self.d.setup(timeout=900)
|
||||
self.d.sentry.wait(timeout=900)
|
||||
self.d.setup(timeout=timeout)
|
||||
self.d.sentry.wait(timeout=timeout)
|
||||
except amulet.helpers.TimeoutError:
|
||||
amulet.raise_status(amulet.FAIL, msg="Deployment timed out")
|
||||
amulet.raise_status(
|
||||
amulet.FAIL,
|
||||
msg="Deployment timed out ({}s)".format(timeout)
|
||||
)
|
||||
except Exception:
|
||||
raise
|
||||
|
||||
|
|
|
@ -98,8 +98,47 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
|||
|
||||
return other_services
|
||||
|
||||
def _add_services(self, this_service, other_services):
|
||||
"""Add services to the deployment and set openstack-origin/source."""
|
||||
def _add_services(self, this_service, other_services, use_source=None,
|
||||
no_origin=None):
|
||||
"""Add services to the deployment and optionally set
|
||||
openstack-origin/source.
|
||||
|
||||
:param this_service dict: Service dictionary describing the service
|
||||
whose amulet tests are being run
|
||||
:param other_services dict: List of service dictionaries describing
|
||||
the services needed to support the target
|
||||
service
|
||||
:param use_source list: List of services which use the 'source' config
|
||||
option rather than 'openstack-origin'
|
||||
:param no_origin list: List of services which do not support setting
|
||||
the Cloud Archive.
|
||||
Service Dict:
|
||||
{
|
||||
'name': str charm-name,
|
||||
'units': int number of units,
|
||||
'constraints': dict of juju constraints,
|
||||
'location': str location of charm,
|
||||
}
|
||||
eg
|
||||
this_service = {
|
||||
'name': 'openvswitch-odl',
|
||||
'constraints': {'mem': '8G'},
|
||||
}
|
||||
other_services = [
|
||||
{
|
||||
'name': 'nova-compute',
|
||||
'units': 2,
|
||||
'constraints': {'mem': '4G'},
|
||||
'location': cs:~bob/xenial/nova-compute
|
||||
},
|
||||
{
|
||||
'name': 'mysql',
|
||||
'constraints': {'mem': '2G'},
|
||||
},
|
||||
{'neutron-api-odl'}]
|
||||
use_source = ['mysql']
|
||||
no_origin = ['neutron-api-odl']
|
||||
"""
|
||||
self.log.info('OpenStackAmuletDeployment: adding services')
|
||||
|
||||
other_services = self._determine_branch_locations(other_services)
|
||||
|
@ -110,16 +149,22 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
|||
services = other_services
|
||||
services.append(this_service)
|
||||
|
||||
use_source = use_source or []
|
||||
no_origin = no_origin or []
|
||||
|
||||
# Charms which should use the source config option
|
||||
use_source = ['mysql', 'mongodb', 'rabbitmq-server', 'ceph',
|
||||
'ceph-osd', 'ceph-radosgw', 'ceph-mon', 'ceph-proxy']
|
||||
use_source = list(set(
|
||||
use_source + ['mysql', 'mongodb', 'rabbitmq-server', 'ceph',
|
||||
'ceph-osd', 'ceph-radosgw', 'ceph-mon',
|
||||
'ceph-proxy']))
|
||||
|
||||
# Charms which can not use openstack-origin, ie. many subordinates
|
||||
no_origin = ['cinder-ceph', 'hacluster', 'neutron-openvswitch', 'nrpe',
|
||||
'openvswitch-odl', 'neutron-api-odl', 'odl-controller',
|
||||
'cinder-backup', 'nexentaedge-data',
|
||||
'nexentaedge-iscsi-gw', 'nexentaedge-swift-gw',
|
||||
'cinder-nexentaedge', 'nexentaedge-mgmt']
|
||||
no_origin = list(set(
|
||||
no_origin + ['cinder-ceph', 'hacluster', 'neutron-openvswitch',
|
||||
'nrpe', 'openvswitch-odl', 'neutron-api-odl',
|
||||
'odl-controller', 'cinder-backup', 'nexentaedge-data',
|
||||
'nexentaedge-iscsi-gw', 'nexentaedge-swift-gw',
|
||||
'cinder-nexentaedge', 'nexentaedge-mgmt']))
|
||||
|
||||
if self.openstack:
|
||||
for svc in services:
|
||||
|
@ -220,7 +265,8 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
|||
self.trusty_icehouse, self.trusty_juno, self.utopic_juno,
|
||||
self.trusty_kilo, self.vivid_kilo, self.trusty_liberty,
|
||||
self.wily_liberty, self.trusty_mitaka,
|
||||
self.xenial_mitaka) = range(14)
|
||||
self.xenial_mitaka, self.xenial_newton,
|
||||
self.yakkety_newton) = range(16)
|
||||
|
||||
releases = {
|
||||
('precise', None): self.precise_essex,
|
||||
|
@ -236,7 +282,10 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
|||
('utopic', None): self.utopic_juno,
|
||||
('vivid', None): self.vivid_kilo,
|
||||
('wily', None): self.wily_liberty,
|
||||
('xenial', None): self.xenial_mitaka}
|
||||
('xenial', None): self.xenial_mitaka,
|
||||
('xenial', 'cloud:xenial-newton'): self.xenial_newton,
|
||||
('yakkety', None): self.yakkety_newton,
|
||||
}
|
||||
return releases[(self.series, self.openstack)]
|
||||
|
||||
def _get_openstack_release_string(self):
|
||||
|
@ -254,6 +303,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
|
|||
('vivid', 'kilo'),
|
||||
('wily', 'liberty'),
|
||||
('xenial', 'mitaka'),
|
||||
('yakkety', 'newton'),
|
||||
])
|
||||
if self.openstack:
|
||||
os_origin = self.openstack.split(':')[1]
|
||||
|
|
|
@ -83,6 +83,56 @@ class OpenStackAmuletUtils(AmuletUtils):
|
|||
if not found:
|
||||
return 'endpoint not found'
|
||||
|
||||
def validate_v3_endpoint_data(self, endpoints, admin_port, internal_port,
|
||||
public_port, expected):
|
||||
"""Validate keystone v3 endpoint data.
|
||||
|
||||
Validate the v3 endpoint data which has changed from v2. The
|
||||
ports are used to find the matching endpoint.
|
||||
|
||||
The new v3 endpoint data looks like:
|
||||
|
||||
[<Endpoint enabled=True,
|
||||
id=0432655fc2f74d1e9fa17bdaa6f6e60b,
|
||||
interface=admin,
|
||||
links={u'self': u'<RESTful URL of this endpoint>'},
|
||||
region=RegionOne,
|
||||
region_id=RegionOne,
|
||||
service_id=17f842a0dc084b928e476fafe67e4095,
|
||||
url=http://10.5.6.5:9312>,
|
||||
<Endpoint enabled=True,
|
||||
id=6536cb6cb92f4f41bf22b079935c7707,
|
||||
interface=admin,
|
||||
links={u'self': u'<RESTful url of this endpoint>'},
|
||||
region=RegionOne,
|
||||
region_id=RegionOne,
|
||||
service_id=72fc8736fb41435e8b3584205bb2cfa3,
|
||||
url=http://10.5.6.6:35357/v3>,
|
||||
... ]
|
||||
"""
|
||||
self.log.debug('Validating v3 endpoint data...')
|
||||
self.log.debug('actual: {}'.format(repr(endpoints)))
|
||||
found = []
|
||||
for ep in endpoints:
|
||||
self.log.debug('endpoint: {}'.format(repr(ep)))
|
||||
if ((admin_port in ep.url and ep.interface == 'admin') or
|
||||
(internal_port in ep.url and ep.interface == 'internal') or
|
||||
(public_port in ep.url and ep.interface == 'public')):
|
||||
found.append(ep.interface)
|
||||
# note we ignore the links member.
|
||||
actual = {'id': ep.id,
|
||||
'region': ep.region,
|
||||
'region_id': ep.region_id,
|
||||
'interface': self.not_null,
|
||||
'url': ep.url,
|
||||
'service_id': ep.service_id, }
|
||||
ret = self._validate_dict_data(expected, actual)
|
||||
if ret:
|
||||
return 'unexpected endpoint data - {}'.format(ret)
|
||||
|
||||
if len(found) != 3:
|
||||
return 'Unexpected number of endpoints found'
|
||||
|
||||
def validate_svc_catalog_endpoint_data(self, expected, actual):
|
||||
"""Validate service catalog endpoint data.
|
||||
|
||||
|
@ -100,6 +150,72 @@ class OpenStackAmuletUtils(AmuletUtils):
|
|||
return "endpoint {} does not exist".format(k)
|
||||
return ret
|
||||
|
||||
def validate_v3_svc_catalog_endpoint_data(self, expected, actual):
|
||||
"""Validate the keystone v3 catalog endpoint data.
|
||||
|
||||
Validate a list of dictinaries that make up the keystone v3 service
|
||||
catalogue.
|
||||
|
||||
It is in the form of:
|
||||
|
||||
|
||||
{u'identity': [{u'id': u'48346b01c6804b298cdd7349aadb732e',
|
||||
u'interface': u'admin',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.224:35357/v3'},
|
||||
{u'id': u'8414f7352a4b47a69fddd9dbd2aef5cf',
|
||||
u'interface': u'public',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.224:5000/v3'},
|
||||
{u'id': u'd5ca31440cc24ee1bf625e2996fb6a5b',
|
||||
u'interface': u'internal',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.224:5000/v3'}],
|
||||
u'key-manager': [{u'id': u'68ebc17df0b045fcb8a8a433ebea9e62',
|
||||
u'interface': u'public',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.223:9311'},
|
||||
{u'id': u'9cdfe2a893c34afd8f504eb218cd2f9d',
|
||||
u'interface': u'internal',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.223:9311'},
|
||||
{u'id': u'f629388955bc407f8b11d8b7ca168086',
|
||||
u'interface': u'admin',
|
||||
u'region': u'RegionOne',
|
||||
u'region_id': u'RegionOne',
|
||||
u'url': u'http://10.5.5.223:9312'}]}
|
||||
|
||||
Note, that an added complication is that the order of admin, public,
|
||||
internal against 'interface' in each region.
|
||||
|
||||
Thus, the function sorts the expected and actual lists using the
|
||||
interface key as a sort key, prior to the comparison.
|
||||
"""
|
||||
self.log.debug('Validating v3 service catalog endpoint data...')
|
||||
self.log.debug('actual: {}'.format(repr(actual)))
|
||||
for k, v in six.iteritems(expected):
|
||||
if k in actual:
|
||||
l_expected = sorted(v, key=lambda x: x['interface'])
|
||||
l_actual = sorted(actual[k], key=lambda x: x['interface'])
|
||||
if len(l_actual) != len(l_expected):
|
||||
return ("endpoint {} has differing number of interfaces "
|
||||
" - expected({}), actual({})"
|
||||
.format(k, len(l_expected), len(l_actual)))
|
||||
for i_expected, i_actual in zip(l_expected, l_actual):
|
||||
self.log.debug("checking interface {}"
|
||||
.format(i_expected['interface']))
|
||||
ret = self._validate_dict_data(i_expected, i_actual)
|
||||
if ret:
|
||||
return self.endpoint_error(k, ret)
|
||||
else:
|
||||
return "endpoint {} does not exist".format(k)
|
||||
return ret
|
||||
|
||||
def validate_tenant_data(self, expected, actual):
|
||||
"""Validate tenant data.
|
||||
|
||||
|
@ -928,7 +1044,8 @@ class OpenStackAmuletUtils(AmuletUtils):
|
|||
retry_delay=5,
|
||||
socket_timeout=1)
|
||||
connection = pika.BlockingConnection(parameters)
|
||||
assert connection.server_properties['product'] == 'RabbitMQ'
|
||||
assert connection.is_open is True
|
||||
assert connection.is_closing is False
|
||||
self.log.debug('Connect OK')
|
||||
return connection
|
||||
except Exception as e:
|
||||
|
|
Loading…
Reference in New Issue