Add upgrade support

This commit is contained in:
James Page 2014-04-01 17:53:45 +01:00
parent 53061c8f3c
commit d9f2fab0bb
6 changed files with 126 additions and 5 deletions

View File

@ -17,13 +17,15 @@ from charmhelpers.core.host import (
lsb_release,
)
from charmhelpers.contrib.openstack.utils import (
configure_installation_source
configure_installation_source,
openstack_upgrade_available
)
from ceilometer_utils import (
restart_map,
register_configs,
CEILOMETER_AGENT_PACKAGES,
NOVA_SETTINGS
NOVA_SETTINGS,
do_openstack_upgrade
)
hooks = Hooks()
@ -55,6 +57,13 @@ def ceilometer_changed():
CONFIGS.write_all()
@hooks.hook('config-changed')
@restart_on_change(restart_map(), stopstart=True)
def config_changed():
if openstack_upgrade_available('ceilometer-common'):
do_openstack_upgrade(CONFIGS)
CONFIGS.write_all()
if __name__ == '__main__':
try:
hooks.execute(sys.argv)

View File

@ -5,8 +5,15 @@ from ceilometer_contexts import (
CeilometerServiceContext
)
from charmhelpers.contrib.openstack.utils import (
get_os_codename_package
get_os_codename_package,
get_os_codename_install_source,
configure_installation_source
)
from charmhelpers.core.hookenv import (
config,
log,
)
from charmhelpers.fetch import apt_update, apt_install, apt_upgrade
CEILOMETER_CONF_DIR = "/etc/ceilometer"
CEILOMETER_CONF = "%s/ceilometer.conf" % CEILOMETER_CONF_DIR
@ -85,3 +92,31 @@ def restart_map():
if svcs:
_map[f] = svcs
return _map
def do_openstack_upgrade(configs):
"""
Perform an upgrade. Takes care of upgrading packages, rewriting
configs, database migrations and potentially any other post-upgrade
actions.
:param configs: The charms main OSConfigRenderer object.
"""
new_src = config('openstack-origin')
new_os_rel = get_os_codename_install_source(new_src)
log('Performing OpenStack upgrade to %s.' % (new_os_rel))
configure_installation_source(new_src)
dpkg_opts = [
'--option', 'Dpkg::Options::=--force-confnew',
'--option', 'Dpkg::Options::=--force-confdef',
]
apt_update(fatal=True)
apt_upgrade(options=dpkg_opts, fatal=True, dist=True)
apt_install(packages=CEILOMETER_AGENT_PACKAGES,
options=dpkg_opts,
fatal=True)
# set CONFIGS to load templates from new release
configs.set_release(openstack_release=new_os_rel)

View File

@ -147,7 +147,8 @@ class SharedDBContext(OSContextGenerator):
'database_host': rdata.get('db_host'),
'database': self.database,
'database_user': self.user,
'database_password': rdata.get(password_setting)
'database_password': rdata.get(password_setting),
'database_type': 'mysql'
}
if context_complete(ctxt):
db_ssl(rdata, ctxt, self.ssl_dir)
@ -155,6 +156,35 @@ class SharedDBContext(OSContextGenerator):
return {}
class PostgresqlDBContext(OSContextGenerator):
interfaces = ['pgsql-db']
def __init__(self, database=None):
self.database = database
def __call__(self):
self.database = self.database or config('database')
if self.database is None:
log('Could not generate postgresql_db context. '
'Missing required charm config options. '
'(database name)')
raise OSContextError
ctxt = {}
for rid in relation_ids(self.interfaces[0]):
for unit in related_units(rid):
ctxt = {
'database_host': relation_get('host', rid=rid, unit=unit),
'database': self.database,
'database_user': relation_get('user', rid=rid, unit=unit),
'database_password': relation_get('password', rid=rid, unit=unit),
'database_type': 'postgresql',
}
if context_complete(ctxt):
return ctxt
return {}
def db_ssl(rdata, ctxt, ssl_dir):
if 'ssl_ca' in rdata and ssl_dir:
ca_path = os.path.join(ssl_dir, 'db-client.ca')

1
hooks/config-changed Symbolic link
View File

@ -0,0 +1 @@
ceilometer_hooks.py

View File

@ -21,6 +21,8 @@ TO_PATCH = [
'filter_installed_packages',
'CONFIGS',
'relation_set',
'openstack_upgrade_available',
'do_openstack_upgrade'
]
@ -53,3 +55,19 @@ class CeilometerHooksTest(CharmTestCase):
hooks.hooks.execute(['hooks/nova-ceilometer-relation-joined'])
self.relation_set.assert_called_with(
subordinate_configuration=json.dumps(ceilometer_utils.NOVA_SETTINGS))
def test_config_changed_no_upgrade(self):
self.openstack_upgrade_available.return_value = False
hooks.hooks.execute(['hooks/config-changed'])
self.openstack_upgrade_available.\
assert_called_with('ceilometer-common')
self.assertFalse(self.do_openstack_upgrade.called)
self.assertTrue(self.CONFIGS.write_all.called)
def test_config_changed_upgrade(self):
self.openstack_upgrade_available.return_value = True
hooks.hooks.execute(['hooks/config-changed'])
self.openstack_upgrade_available.\
assert_called_with('ceilometer-common')
self.assertTrue(self.do_openstack_upgrade.called)
self.assertTrue(self.CONFIGS.write_all.called)

View File

@ -1,4 +1,4 @@
from mock import patch, call
from mock import patch, call, MagicMock
import ceilometer_utils as utils
@ -8,6 +8,13 @@ TO_PATCH = [
'get_os_codename_package',
'templating',
'CeilometerServiceContext',
'config',
'get_os_codename_install_source',
'configure_installation_source',
'apt_install',
'apt_update',
'apt_upgrade',
'log'
]
@ -32,3 +39,24 @@ class CeilometerUtilsTest(CharmTestCase):
self.assertEquals(restart_map,
{'/etc/ceilometer/ceilometer.conf': [
'ceilometer-agent-compute']})
def test_do_openstack_upgrade(self):
self.config.side_effect = self.test_config.get
self.test_config.set('openstack-origin', 'cloud:precise-havana')
self.get_os_codename_install_source.return_value = 'havana'
configs = MagicMock()
utils.do_openstack_upgrade(configs)
configs.set_release.assert_called_with(openstack_release='havana')
self.log.assert_called()
self.apt_update.assert_called_with(fatal=True)
dpkg_opts = [
'--option', 'Dpkg::Options::=--force-confnew',
'--option', 'Dpkg::Options::=--force-confdef',
]
self.apt_install.assert_called_with(
packages=utils.CEILOMETER_AGENT_PACKAGES,
options=dpkg_opts, fatal=True
)
self.configure_installation_source.assert_called_with(
'cloud:precise-havana'
)