Sync charm-helpers

Change-Id: Icc0cfdc66ee1b5b211818ba93e64fe2f440b2d25
This commit is contained in:
Ryan Beisner 2017-11-22 18:24:06 +00:00
parent 19ff534498
commit 0db8606fe0
8 changed files with 47 additions and 21 deletions

View File

@ -90,6 +90,6 @@ def install_ca_cert(ca_cert):
log("CA cert is the same as installed version", level=INFO) log("CA cert is the same as installed version", level=INFO)
else: else:
log("Installing new CA cert", level=INFO) log("Installing new CA cert", level=INFO)
with open(cert_file, 'w') as crt: with open(cert_file, 'wb') as crt:
crt.write(ca_cert) crt.write(ca_cert)
subprocess.check_call(['update-ca-certificates', '--fresh']) subprocess.check_call(['update-ca-certificates', '--fresh'])

View File

@ -250,7 +250,14 @@ class OpenStackAmuletDeployment(AmuletDeployment):
self.log.debug('Waiting up to {}s for extended status on services: ' self.log.debug('Waiting up to {}s for extended status on services: '
'{}'.format(timeout, services)) '{}'.format(timeout, services))
service_messages = {service: message for service in services} service_messages = {service: message for service in services}
# Check for idleness
self.d.sentry.wait()
# Check for error states and bail early
self.d.sentry.wait_for_status(self.d.juju_env, services)
# Check for ready messages
self.d.sentry.wait_for_messages(service_messages, timeout=timeout) self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
self.log.info('OK') self.log.info('OK')
def _get_openstack_release(self): def _get_openstack_release(self):
@ -263,7 +270,8 @@ class OpenStackAmuletDeployment(AmuletDeployment):
(self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty, (self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty,
self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton, self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton,
self.yakkety_newton, self.xenial_ocata, self.zesty_ocata, self.yakkety_newton, self.xenial_ocata, self.zesty_ocata,
self.xenial_pike, self.artful_pike) = range(11) self.xenial_pike, self.artful_pike, self.xenial_queens,
self.bionic_queens,) = range(13)
releases = { releases = {
('trusty', None): self.trusty_icehouse, ('trusty', None): self.trusty_icehouse,
@ -274,9 +282,11 @@ class OpenStackAmuletDeployment(AmuletDeployment):
('xenial', 'cloud:xenial-newton'): self.xenial_newton, ('xenial', 'cloud:xenial-newton'): self.xenial_newton,
('xenial', 'cloud:xenial-ocata'): self.xenial_ocata, ('xenial', 'cloud:xenial-ocata'): self.xenial_ocata,
('xenial', 'cloud:xenial-pike'): self.xenial_pike, ('xenial', 'cloud:xenial-pike'): self.xenial_pike,
('xenial', 'cloud:xenial-queens'): self.xenial_queens,
('yakkety', None): self.yakkety_newton, ('yakkety', None): self.yakkety_newton,
('zesty', None): self.zesty_ocata, ('zesty', None): self.zesty_ocata,
('artful', None): self.artful_pike, ('artful', None): self.artful_pike,
('bionic', None): self.bionic_queens,
} }
return releases[(self.series, self.openstack)] return releases[(self.series, self.openstack)]
@ -291,6 +301,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
('yakkety', 'newton'), ('yakkety', 'newton'),
('zesty', 'ocata'), ('zesty', 'ocata'),
('artful', 'pike'), ('artful', 'pike'),
('bionic', 'queens'),
]) ])
if self.openstack: if self.openstack:
os_origin = self.openstack.split(':')[1] os_origin = self.openstack.split(':')[1]
@ -303,8 +314,8 @@ class OpenStackAmuletDeployment(AmuletDeployment):
test scenario, based on OpenStack release and whether ceph radosgw test scenario, based on OpenStack release and whether ceph radosgw
is flagged as present or not.""" is flagged as present or not."""
if self._get_openstack_release() <= self.trusty_juno: if self._get_openstack_release() == self.trusty_icehouse:
# Juno or earlier # Icehouse
pools = [ pools = [
'data', 'data',
'metadata', 'metadata',
@ -312,7 +323,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
'cinder-ceph', 'cinder-ceph',
'glance' 'glance'
] ]
elif (self.trust_kilo <= self._get_openstack_release() <= elif (self.trusty_kilo <= self._get_openstack_release() <=
self.zesty_ocata): self.zesty_ocata):
# Kilo through Ocata # Kilo through Ocata
pools = [ pools = [

View File

@ -43,7 +43,6 @@ import swiftclient
from charmhelpers.contrib.amulet.utils import ( from charmhelpers.contrib.amulet.utils import (
AmuletUtils AmuletUtils
) )
from charmhelpers.core.decorators import retry_on_exception
from charmhelpers.core.host import CompareHostReleases from charmhelpers.core.host import CompareHostReleases
DEBUG = logging.DEBUG DEBUG = logging.DEBUG
@ -311,7 +310,6 @@ class OpenStackAmuletUtils(AmuletUtils):
self.log.debug('Checking if tenant exists ({})...'.format(tenant)) self.log.debug('Checking if tenant exists ({})...'.format(tenant))
return tenant in [t.name for t in keystone.tenants.list()] return tenant in [t.name for t in keystone.tenants.list()]
@retry_on_exception(5, base_delay=10)
def keystone_wait_for_propagation(self, sentry_relation_pairs, def keystone_wait_for_propagation(self, sentry_relation_pairs,
api_version): api_version):
"""Iterate over list of sentry and relation tuples and verify that """Iterate over list of sentry and relation tuples and verify that
@ -327,7 +325,7 @@ class OpenStackAmuletUtils(AmuletUtils):
rel = sentry.relation('identity-service', rel = sentry.relation('identity-service',
relation_name) relation_name)
self.log.debug('keystone relation data: {}'.format(rel)) self.log.debug('keystone relation data: {}'.format(rel))
if rel['api_version'] != str(api_version): if rel.get('api_version') != str(api_version):
raise Exception("api_version not propagated through relation" raise Exception("api_version not propagated through relation"
" data yet ('{}' != '{}')." " data yet ('{}' != '{}')."
"".format(rel['api_version'], api_version)) "".format(rel['api_version'], api_version))
@ -349,6 +347,7 @@ class OpenStackAmuletUtils(AmuletUtils):
config = {'preferred-api-version': api_version} config = {'preferred-api-version': api_version}
deployment.d.configure('keystone', config) deployment.d.configure('keystone', config)
deployment._auto_wait_for_status()
self.keystone_wait_for_propagation(sentry_relation_pairs, api_version) self.keystone_wait_for_propagation(sentry_relation_pairs, api_version)
def authenticate_cinder_admin(self, keystone_sentry, username, def authenticate_cinder_admin(self, keystone_sentry, username,

View File

@ -293,7 +293,7 @@ class PostgresqlDBContext(OSContextGenerator):
def db_ssl(rdata, ctxt, ssl_dir): def db_ssl(rdata, ctxt, ssl_dir):
if 'ssl_ca' in rdata and ssl_dir: if 'ssl_ca' in rdata and ssl_dir:
ca_path = os.path.join(ssl_dir, 'db-client.ca') ca_path = os.path.join(ssl_dir, 'db-client.ca')
with open(ca_path, 'w') as fh: with open(ca_path, 'wb') as fh:
fh.write(b64decode(rdata['ssl_ca'])) fh.write(b64decode(rdata['ssl_ca']))
ctxt['database_ssl_ca'] = ca_path ctxt['database_ssl_ca'] = ca_path
@ -308,12 +308,12 @@ def db_ssl(rdata, ctxt, ssl_dir):
log("Waiting 1m for ssl client cert validity", level=INFO) log("Waiting 1m for ssl client cert validity", level=INFO)
time.sleep(60) time.sleep(60)
with open(cert_path, 'w') as fh: with open(cert_path, 'wb') as fh:
fh.write(b64decode(rdata['ssl_cert'])) fh.write(b64decode(rdata['ssl_cert']))
ctxt['database_ssl_cert'] = cert_path ctxt['database_ssl_cert'] = cert_path
key_path = os.path.join(ssl_dir, 'db-client.key') key_path = os.path.join(ssl_dir, 'db-client.key')
with open(key_path, 'w') as fh: with open(key_path, 'wb') as fh:
fh.write(b64decode(rdata['ssl_key'])) fh.write(b64decode(rdata['ssl_key']))
ctxt['database_ssl_key'] = key_path ctxt['database_ssl_key'] = key_path
@ -459,7 +459,7 @@ class AMQPContext(OSContextGenerator):
ca_path = os.path.join( ca_path = os.path.join(
self.ssl_dir, 'rabbit-client-ca.pem') self.ssl_dir, 'rabbit-client-ca.pem')
with open(ca_path, 'w') as fh: with open(ca_path, 'wb') as fh:
fh.write(b64decode(ctxt['rabbit_ssl_ca'])) fh.write(b64decode(ctxt['rabbit_ssl_ca']))
ctxt['rabbit_ssl_ca'] = ca_path ctxt['rabbit_ssl_ca'] = ca_path

View File

@ -18,7 +18,7 @@ rbd default features = {{ rbd_features }}
[client] [client]
{% if rbd_client_cache_settings -%} {% if rbd_client_cache_settings -%}
{% for key, value in rbd_client_cache_settings.iteritems() -%} {% for key, value in rbd_client_cache_settings.items() -%}
{{ key }} = {{ value }} {{ key }} = {{ value }}
{% endfor -%} {% endfor -%}
{%- endif %} {%- endif %}

View File

@ -140,6 +140,7 @@ UBUNTU_OPENSTACK_RELEASE = OrderedDict([
('yakkety', 'newton'), ('yakkety', 'newton'),
('zesty', 'ocata'), ('zesty', 'ocata'),
('artful', 'pike'), ('artful', 'pike'),
('bionic', 'queens'),
]) ])
@ -157,6 +158,7 @@ OPENSTACK_CODENAMES = OrderedDict([
('2016.2', 'newton'), ('2016.2', 'newton'),
('2017.1', 'ocata'), ('2017.1', 'ocata'),
('2017.2', 'pike'), ('2017.2', 'pike'),
('2018.1', 'queens'),
]) ])
# The ugly duckling - must list releases oldest to newest # The ugly duckling - must list releases oldest to newest
@ -187,6 +189,8 @@ SWIFT_CODENAMES = OrderedDict([
['2.11.0', '2.12.0', '2.13.0']), ['2.11.0', '2.12.0', '2.13.0']),
('pike', ('pike',
['2.13.0', '2.15.0']), ['2.13.0', '2.15.0']),
('queens',
['2.16.0']),
]) ])
# >= Liberty version->codename mapping # >= Liberty version->codename mapping
@ -412,6 +416,8 @@ def get_os_codename_package(package, fatal=True):
cmd = ['snap', 'list', package] cmd = ['snap', 'list', package]
try: try:
out = subprocess.check_output(cmd) out = subprocess.check_output(cmd)
if six.PY3:
out = out.decode('UTF-8')
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
return None return None
lines = out.split('\n') lines = out.split('\n')

View File

@ -250,7 +250,14 @@ class OpenStackAmuletDeployment(AmuletDeployment):
self.log.debug('Waiting up to {}s for extended status on services: ' self.log.debug('Waiting up to {}s for extended status on services: '
'{}'.format(timeout, services)) '{}'.format(timeout, services))
service_messages = {service: message for service in services} service_messages = {service: message for service in services}
# Check for idleness
self.d.sentry.wait()
# Check for error states and bail early
self.d.sentry.wait_for_status(self.d.juju_env, services)
# Check for ready messages
self.d.sentry.wait_for_messages(service_messages, timeout=timeout) self.d.sentry.wait_for_messages(service_messages, timeout=timeout)
self.log.info('OK') self.log.info('OK')
def _get_openstack_release(self): def _get_openstack_release(self):
@ -263,7 +270,8 @@ class OpenStackAmuletDeployment(AmuletDeployment):
(self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty, (self.trusty_icehouse, self.trusty_kilo, self.trusty_liberty,
self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton, self.trusty_mitaka, self.xenial_mitaka, self.xenial_newton,
self.yakkety_newton, self.xenial_ocata, self.zesty_ocata, self.yakkety_newton, self.xenial_ocata, self.zesty_ocata,
self.xenial_pike, self.artful_pike) = range(11) self.xenial_pike, self.artful_pike, self.xenial_queens,
self.bionic_queens,) = range(13)
releases = { releases = {
('trusty', None): self.trusty_icehouse, ('trusty', None): self.trusty_icehouse,
@ -274,9 +282,11 @@ class OpenStackAmuletDeployment(AmuletDeployment):
('xenial', 'cloud:xenial-newton'): self.xenial_newton, ('xenial', 'cloud:xenial-newton'): self.xenial_newton,
('xenial', 'cloud:xenial-ocata'): self.xenial_ocata, ('xenial', 'cloud:xenial-ocata'): self.xenial_ocata,
('xenial', 'cloud:xenial-pike'): self.xenial_pike, ('xenial', 'cloud:xenial-pike'): self.xenial_pike,
('xenial', 'cloud:xenial-queens'): self.xenial_queens,
('yakkety', None): self.yakkety_newton, ('yakkety', None): self.yakkety_newton,
('zesty', None): self.zesty_ocata, ('zesty', None): self.zesty_ocata,
('artful', None): self.artful_pike, ('artful', None): self.artful_pike,
('bionic', None): self.bionic_queens,
} }
return releases[(self.series, self.openstack)] return releases[(self.series, self.openstack)]
@ -291,6 +301,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
('yakkety', 'newton'), ('yakkety', 'newton'),
('zesty', 'ocata'), ('zesty', 'ocata'),
('artful', 'pike'), ('artful', 'pike'),
('bionic', 'queens'),
]) ])
if self.openstack: if self.openstack:
os_origin = self.openstack.split(':')[1] os_origin = self.openstack.split(':')[1]
@ -303,8 +314,8 @@ class OpenStackAmuletDeployment(AmuletDeployment):
test scenario, based on OpenStack release and whether ceph radosgw test scenario, based on OpenStack release and whether ceph radosgw
is flagged as present or not.""" is flagged as present or not."""
if self._get_openstack_release() <= self.trusty_juno: if self._get_openstack_release() == self.trusty_icehouse:
# Juno or earlier # Icehouse
pools = [ pools = [
'data', 'data',
'metadata', 'metadata',
@ -312,7 +323,7 @@ class OpenStackAmuletDeployment(AmuletDeployment):
'cinder-ceph', 'cinder-ceph',
'glance' 'glance'
] ]
elif (self.trust_kilo <= self._get_openstack_release() <= elif (self.trusty_kilo <= self._get_openstack_release() <=
self.zesty_ocata): self.zesty_ocata):
# Kilo through Ocata # Kilo through Ocata
pools = [ pools = [

View File

@ -43,7 +43,6 @@ import swiftclient
from charmhelpers.contrib.amulet.utils import ( from charmhelpers.contrib.amulet.utils import (
AmuletUtils AmuletUtils
) )
from charmhelpers.core.decorators import retry_on_exception
from charmhelpers.core.host import CompareHostReleases from charmhelpers.core.host import CompareHostReleases
DEBUG = logging.DEBUG DEBUG = logging.DEBUG
@ -311,7 +310,6 @@ class OpenStackAmuletUtils(AmuletUtils):
self.log.debug('Checking if tenant exists ({})...'.format(tenant)) self.log.debug('Checking if tenant exists ({})...'.format(tenant))
return tenant in [t.name for t in keystone.tenants.list()] return tenant in [t.name for t in keystone.tenants.list()]
@retry_on_exception(5, base_delay=10)
def keystone_wait_for_propagation(self, sentry_relation_pairs, def keystone_wait_for_propagation(self, sentry_relation_pairs,
api_version): api_version):
"""Iterate over list of sentry and relation tuples and verify that """Iterate over list of sentry and relation tuples and verify that
@ -327,7 +325,7 @@ class OpenStackAmuletUtils(AmuletUtils):
rel = sentry.relation('identity-service', rel = sentry.relation('identity-service',
relation_name) relation_name)
self.log.debug('keystone relation data: {}'.format(rel)) self.log.debug('keystone relation data: {}'.format(rel))
if rel['api_version'] != str(api_version): if rel.get('api_version') != str(api_version):
raise Exception("api_version not propagated through relation" raise Exception("api_version not propagated through relation"
" data yet ('{}' != '{}')." " data yet ('{}' != '{}')."
"".format(rel['api_version'], api_version)) "".format(rel['api_version'], api_version))
@ -349,6 +347,7 @@ class OpenStackAmuletUtils(AmuletUtils):
config = {'preferred-api-version': api_version} config = {'preferred-api-version': api_version}
deployment.d.configure('keystone', config) deployment.d.configure('keystone', config)
deployment._auto_wait_for_status()
self.keystone_wait_for_propagation(sentry_relation_pairs, api_version) self.keystone_wait_for_propagation(sentry_relation_pairs, api_version)
def authenticate_cinder_admin(self, keystone_sentry, username, def authenticate_cinder_admin(self, keystone_sentry, username,