Add systemd init support for deploy from source

systemd is used instead of upstart by default since Ubuntu 15.10
(Wily).  This adds systemd init file support for glance services
that are deployed from source.

Change-Id: I4117e9cbe5a30ed19ef2976d4e7160b82c09d4d3
This commit is contained in:
Corey Bryant 2016-06-08 18:39:44 +00:00
parent c4c2293c5e
commit 8b49c92fc2
6 changed files with 151 additions and 44 deletions

View File

@ -54,11 +54,12 @@ from charmhelpers.contrib.hahelpers.cluster import (
from charmhelpers.contrib.openstack.alternatives import install_alternative
from charmhelpers.contrib.openstack.utils import (
get_os_codename_install_source,
git_install_requested,
git_clone_and_install,
git_generate_systemd_init_files,
git_install_requested,
git_pip_venv_dir,
git_src_dir,
git_yaml_value,
git_pip_venv_dir,
configure_installation_source,
os_release,
set_os_workload_status,
@ -90,6 +91,7 @@ BASE_GIT_PACKAGES = [
'libxslt1-dev',
'libssl-dev',
'libyaml-dev',
'openstack-pkg-tools',
'python-dev',
'python-pip',
'python-setuptools',
@ -259,7 +261,7 @@ def migrate_database():
def do_openstack_upgrade(configs):
"""Perform an uprade of cinder. Takes care of upgrading
"""Perform an upgrade of glance. Takes care of upgrading
packages, rewriting configs + database migration and potentially
any other post-upgrade actions.
@ -406,6 +408,20 @@ def git_post_install(projects_yaml):
os.symlink(s['src'], s['link'])
bin_dir = os.path.join(git_pip_venv_dir(projects_yaml), 'bin')
# Use systemd init units/scripts from ubuntu wily onward
if lsb_release()['DISTRIB_RELEASE'] >= '15.10':
templates_dir = os.path.join(charm_dir(), 'templates/git')
daemons = ['glance-api', 'glance-glare', 'glance-registry']
for daemon in daemons:
glance_context = {
'daemon_path': os.path.join(bin_dir, daemon),
}
template_file = 'git/{}.init.in.template'.format(daemon)
init_in_file = '{}.init.in'.format(daemon)
render(template_file, os.path.join(templates_dir, init_in_file),
glance_context, perms=0o644)
git_generate_systemd_init_files(templates_dir)
else:
glance_api_context = {
'service_description': 'Glance API server',
'service_name': 'Glance',
@ -428,13 +444,14 @@ def git_post_install(projects_yaml):
'log_file': '/var/log/glance/registry.log',
}
# NOTE(coreycb): Needs systemd support
templates_dir = 'hooks/charmhelpers/contrib/openstack/templates'
templates_dir = os.path.join(charm_dir(), templates_dir)
render('git.upstart', '/etc/init/glance-api.conf',
glance_api_context, perms=0o644, templates_dir=templates_dir)
glance_api_context, perms=0o644,
templates_dir=templates_dir)
render('git.upstart', '/etc/init/glance-registry.conf',
glance_registry_context, perms=0o644, templates_dir=templates_dir)
glance_registry_context, perms=0o644,
templates_dir=templates_dir)
# Don't restart services if the unit is supposed to be paused.
if not is_unit_paused_set():

View File

@ -0,0 +1,21 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: glance-api
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: postgresql mysql keystone ntp rabbitmq-server
# Should-Stop: postgresql mysql keystone ntp rabbitmq-server
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Glance API server
# Description: Frontend Glance API server
### END INIT INFO
# Author: Julien Danjou <acid@debian.org>
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Image Service API"
PROJECT_NAME=glance
NAME=${PROJECT_NAME}-api
CONFIG_FILE=/etc/${PROJECT_NAME}/${NAME}.conf
DAEMON={{ daemon_path }}

View File

@ -0,0 +1,21 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: glance-glare
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: postgresql mysql keystone ntp rabbitmq-server
# Should-Stop: postgresql mysql keystone ntp rabbitmq-server
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Glance Artifact Repository API
# Description: Frontend Glance Artifact Repository API
### END INIT INFO
# Author: Corey Bryant <corey.bryant@canonical.com>
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Glance Artifact Repository API"
PROJECT_NAME=glance
NAME=${PROJECT_NAME}-glare
CONFIG_FILE=/etc/${PROJECT_NAME}/${NAME}.conf
DAEMON={{ daemon_path }}

View File

@ -0,0 +1,21 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: glance-registry
# Required-Start: $network $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Should-Start: postgresql mysql keystone ntp rabbitmq-server
# Should-Stop: postgresql mysql keystone ntp rabbitmq-server
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Glance registry server
# Description: Frontend Glance registry server
### END INIT INFO
# Author: Julien Danjou <acid@debian.org>
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="OpenStack Image Service Registry"
PROJECT_NAME=glance
NAME=${PROJECT_NAME}-registry
CONFIG_FILE=/etc/${PROJECT_NAME}/${NAME}.conf
DAEMON={{ daemon_path }}

View File

@ -142,9 +142,9 @@ class GlanceRelationTests(CharmTestCase):
self.apt_install.assert_called_with(
['apache2', 'haproxy', 'libffi-dev', 'libmysqlclient-dev',
'libssl-dev', 'libxml2-dev', 'libxslt1-dev', 'libyaml-dev',
'python-dev', 'python-mysqldb', 'python-pip', 'python-psycopg2',
'python-setuptools', 'python-six', 'uuid', 'zlib1g-dev'],
fatal=True)
'openstack-pkg-tools', 'python-dev', 'python-mysqldb',
'python-pip', 'python-psycopg2', 'python-setuptools',
'python-six', 'uuid', 'zlib1g-dev'], fatal=True)
self.git_install.assert_called_with(projects_yaml)
def test_db_joined(self):

View File

@ -22,13 +22,18 @@ TO_PATCH = [
'apt_update',
'apt_upgrade',
'apt_install',
'git_pip_venv_dir',
'git_src_dir',
'mkdir',
'os_release',
'pip_install',
'render',
'service_restart',
'service_start',
'service_stop',
'service_name',
'install_alternative'
'install_alternative',
'lsb_release',
]
DPKG_OPTS = [
@ -227,22 +232,18 @@ class TestGlanceUtils(CharmTestCase):
]
self.assertEquals(write_file.call_args_list, expected)
@patch.object(utils, 'git_src_dir')
@patch.object(utils, 'service_restart')
@patch.object(utils, 'render')
@patch.object(utils, 'git_pip_venv_dir')
@patch('os.path.join')
@patch('os.path.exists')
@patch('os.symlink')
@patch('shutil.copytree')
@patch('shutil.rmtree')
@patch('subprocess.check_call')
def test_git_post_install(self, check_call, rmtree, copytree, symlink,
exists, join, venv, render, service_restart,
git_src_dir):
def test_git_post_install_upstart(self, check_call, rmtree, copytree,
symlink, exists, join):
projects_yaml = openstack_origin_git
join.return_value = 'joined-string'
venv.return_value = '/mnt/openstack-git/venv'
self.git_pip_venv_dir.return_value = '/mnt/openstack-git/venv'
self.lsb_release.return_value = {'DISTRIB_RELEASE': '15.04'}
utils.git_post_install(projects_yaml)
expected = [
call('joined-string', '/etc/glance'),
@ -280,12 +281,38 @@ class TestGlanceUtils(CharmTestCase):
glance_registry_context, perms=0o644,
templates_dir='joined-string'),
]
self.assertEquals(render.call_args_list, expected)
self.assertEquals(self.render.call_args_list, expected)
expected = [
call('glance-api'),
call('glance-registry'),
]
self.assertEquals(service_restart.call_args_list, expected)
self.assertEquals(self.service_restart.call_args_list, expected)
@patch.object(utils, 'services')
@patch('os.listdir')
@patch('os.path.join')
@patch('os.path.exists')
@patch('os.symlink')
@patch('shutil.copytree')
@patch('shutil.rmtree')
@patch('subprocess.check_call')
def test_git_post_install_systemd(self, check_call, rmtree, copytree,
symlink, exists, join, listdir,
services):
projects_yaml = openstack_origin_git
join.return_value = 'joined-string'
self.lsb_release.return_value = {'DISTRIB_RELEASE': '15.10'}
utils.git_post_install(projects_yaml)
expected = [
call('git/glance-api.init.in.template', 'joined-string',
{'daemon_path': 'joined-string'}, perms=420),
call('git/glance-glare.init.in.template', 'joined-string',
{'daemon_path': 'joined-string'}, perms=420),
call('git/glance-registry.init.in.template', 'joined-string',
{'daemon_path': 'joined-string'}, perms=420),
]
self.assertEquals(self.render.call_args_list, expected)
def test_assess_status(self):
with patch.object(utils, 'assess_status_func') as asf: