[coreycb,r=james-page] Add deploy from source support
This commit is contained in:
commit
3921d72ad1
@ -1,3 +1,4 @@
|
||||
revision
|
||||
bin
|
||||
.coverage
|
||||
tags
|
||||
|
6
Makefile
6
Makefile
@ -2,7 +2,7 @@
|
||||
PYTHON := /usr/bin/env python
|
||||
|
||||
lint:
|
||||
@flake8 --exclude hooks/charmhelpers hooks unit_tests tests
|
||||
@flake8 --exclude hooks/charmhelpers actions hooks unit_tests tests
|
||||
@charm proof
|
||||
|
||||
unit_test:
|
||||
@ -15,7 +15,9 @@ test:
|
||||
# raise_status() messages to stderr:
|
||||
# https://bugs.launchpad.net/amulet/+bug/1320357
|
||||
@juju test -v -p AMULET_HTTP_PROXY --timeout 900 \
|
||||
00-setup 14-basic-precise-icehouse 15-basic-trusty-icehouse
|
||||
00-setup 14-basic-precise-icehouse 15-basic-trusty-icehouse \
|
||||
16-basic-trusty-icehouse-git 17-basic-trusty-juno \
|
||||
18-basic-trusty-juno-git
|
||||
|
||||
bin/charm_helpers_sync.py:
|
||||
@mkdir -p bin
|
||||
|
60
README.md
60
README.md
@ -68,3 +68,63 @@ go down, it must be removed from Juju i.e.
|
||||
Otherwise it will be assumed that this unit may come back at some point and
|
||||
therefore must be know to be in-sync with the rest before continuing.
|
||||
|
||||
Deploying from source
|
||||
---------------------
|
||||
|
||||
The minimum openstack-origin-git config required to deploy from source is:
|
||||
|
||||
openstack-origin-git:
|
||||
"repositories:
|
||||
- {name: requirements,
|
||||
repository: 'git://git.openstack.org/openstack/requirements',
|
||||
branch: stable/juno}
|
||||
- {name: keystone,
|
||||
repository: 'git://git.openstack.org/openstack/keystone',
|
||||
branch: stable/juno}"
|
||||
|
||||
Note that there are only two 'name' values the charm knows about: 'requirements'
|
||||
and 'keystone'. These repositories must correspond to these 'name' values.
|
||||
Additionally, the requirements repository must be specified first and the
|
||||
keystone repository must be specified last. All other repostories are installed
|
||||
in the order in which they are specified.
|
||||
|
||||
The following is a full list of current tip repos (may not be up-to-date):
|
||||
|
||||
openstack-origin-git:
|
||||
"repositories:
|
||||
- {name: requirements,
|
||||
repository: 'git://git.openstack.org/openstack/requirements',
|
||||
branch: master}
|
||||
- {name: oslo-concurrency,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.concurrency',
|
||||
branch: master}
|
||||
- {name: oslo-config,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.config',
|
||||
branch: master}
|
||||
- {name: oslo-db,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.db',
|
||||
branch: master}
|
||||
- {name: oslo-i18n,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.i18n',
|
||||
branch: master}
|
||||
- {name: oslo-serialization,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.serialization',
|
||||
branch: master}
|
||||
- {name: oslo-utils,
|
||||
repository: 'git://git.openstack.org/openstack/oslo.utils',
|
||||
branch: master}
|
||||
- {name: pbr,
|
||||
repository: 'git://git.openstack.org/openstack-dev/pbr',
|
||||
branch: master}
|
||||
- {name: python-keystoneclient,
|
||||
repository: 'git://git.openstack.org/openstack/python-keystoneclient',
|
||||
branch: master}
|
||||
- {name: sqlalchemy-migrate,
|
||||
repository: 'git://git.openstack.org/stackforge/sqlalchemy-migrate',
|
||||
branch: master}
|
||||
- {name: keystonemiddleware,
|
||||
repository: 'git://git.openstack.org/openstack/keystonemiddleware',
|
||||
branch: master}
|
||||
- {name: keystone,
|
||||
repository: 'git://git.openstack.org/openstack/keystone',
|
||||
branch: master}"
|
||||
|
2
actions.yaml
Normal file
2
actions.yaml
Normal file
@ -0,0 +1,2 @@
|
||||
git-reinstall:
|
||||
description: Reinstall keystone from the openstack-origin-git repositories.
|
1
actions/git-reinstall
Symbolic link
1
actions/git-reinstall
Symbolic link
@ -0,0 +1 @@
|
||||
git_reinstall.py
|
45
actions/git_reinstall.py
Executable file
45
actions/git_reinstall.py
Executable file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/python
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
sys.path.append('hooks/')
|
||||
|
||||
from charmhelpers.contrib.openstack.utils import (
|
||||
git_install_requested,
|
||||
)
|
||||
|
||||
from charmhelpers.core.hookenv import (
|
||||
action_set,
|
||||
action_fail,
|
||||
config,
|
||||
)
|
||||
|
||||
from keystone_utils import (
|
||||
git_install,
|
||||
)
|
||||
|
||||
from keystone_hooks import (
|
||||
config_changed,
|
||||
)
|
||||
|
||||
|
||||
def git_reinstall():
|
||||
"""Reinstall from source and restart services.
|
||||
|
||||
If the openstack-origin-git config option was used to install openstack
|
||||
from source git repositories, then this action can be used to reinstall
|
||||
from updated git repositories, followed by a restart of services."""
|
||||
if not git_install_requested():
|
||||
action_fail('openstack-origin-git is not configured')
|
||||
return
|
||||
|
||||
try:
|
||||
git_install(config('openstack-origin-git'))
|
||||
config_changed()
|
||||
except:
|
||||
action_set({'traceback': traceback.format_exc()})
|
||||
action_fail('git-reinstall resulted in an unexpected error')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
git_reinstall()
|
@ -8,6 +8,7 @@ include:
|
||||
- contrib.hahelpers:
|
||||
- apache
|
||||
- cluster
|
||||
- contrib.python
|
||||
- contrib.unison
|
||||
- payload.execd
|
||||
- contrib.peerstorage
|
||||
|
16
config.yaml
16
config.yaml
@ -22,6 +22,22 @@ options:
|
||||
Note that updating this setting to a source that is known to
|
||||
provide a later version of OpenStack will trigger a software
|
||||
upgrade.
|
||||
|
||||
Note that when openstack-origin-git is specified, openstack
|
||||
specific packages will be installed from source rather than
|
||||
from the openstack-origin repository.
|
||||
openstack-origin-git:
|
||||
default:
|
||||
type: string
|
||||
description: |
|
||||
Specifies a YAML-formatted dictionary listing the git
|
||||
repositories and branches from which to install OpenStack and
|
||||
its dependencies.
|
||||
|
||||
Note that the installed config files will be determined based on
|
||||
the OpenStack release of the openstack-origin option.
|
||||
|
||||
For more details see README.md.
|
||||
config-file:
|
||||
default: "/etc/keystone/keystone.conf"
|
||||
type: string
|
||||
|
@ -524,9 +524,10 @@ def git_clone_and_install(projects_yaml, core_project):
|
||||
projects = yaml.load(projects_yaml)
|
||||
_git_validate_projects_yaml(projects, core_project)
|
||||
|
||||
old_environ = dict(os.environ)
|
||||
|
||||
if 'http_proxy' in projects.keys():
|
||||
os.environ['http_proxy'] = projects['http_proxy']
|
||||
|
||||
if 'https_proxy' in projects.keys():
|
||||
os.environ['https_proxy'] = projects['https_proxy']
|
||||
|
||||
@ -544,6 +545,8 @@ def git_clone_and_install(projects_yaml, core_project):
|
||||
repo_dir = _git_clone_and_install_single(repo, branch, parent_dir,
|
||||
update_requirements=True)
|
||||
|
||||
os.environ = old_environ
|
||||
|
||||
|
||||
def _git_validate_projects_yaml(projects, core_project):
|
||||
"""
|
||||
|
56
hooks/charmhelpers/contrib/python/debug.py
Normal file
56
hooks/charmhelpers/contrib/python/debug.py
Normal file
@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env python
|
||||
# coding: utf-8
|
||||
|
||||
# Copyright 2014-2015 Canonical Limited.
|
||||
#
|
||||
# This file is part of charm-helpers.
|
||||
#
|
||||
# charm-helpers is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# charm-helpers is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import atexit
|
||||
import sys
|
||||
|
||||
from charmhelpers.contrib.python.rpdb import Rpdb
|
||||
from charmhelpers.core.hookenv import (
|
||||
open_port,
|
||||
close_port,
|
||||
ERROR,
|
||||
log
|
||||
)
|
||||
|
||||
__author__ = "Jorge Niedbalski <jorge.niedbalski@canonical.com>"
|
||||
|
||||
DEFAULT_ADDR = "0.0.0.0"
|
||||
DEFAULT_PORT = 4444
|
||||
|
||||
|
||||
def _error(message):
|
||||
log(message, level=ERROR)
|
||||
|
||||
|
||||
def set_trace(addr=DEFAULT_ADDR, port=DEFAULT_PORT):
|
||||
"""
|
||||
Set a trace point using the remote debugger
|
||||
"""
|
||||
atexit.register(close_port, port)
|
||||
try:
|
||||
log("Starting a remote python debugger session on %s:%s" % (addr,
|
||||
port))
|
||||
open_port(port)
|
||||
debugger = Rpdb(addr=addr, port=port)
|
||||
debugger.set_trace(sys._getframe().f_back)
|
||||
except:
|
||||
_error("Cannot start a remote debug session on %s:%s" % (addr,
|
||||
port))
|
58
hooks/charmhelpers/contrib/python/rpdb.py
Normal file
58
hooks/charmhelpers/contrib/python/rpdb.py
Normal file
@ -0,0 +1,58 @@
|
||||
# Copyright 2014-2015 Canonical Limited.
|
||||
#
|
||||
# This file is part of charm-helpers.
|
||||
#
|
||||
# charm-helpers is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# charm-helpers is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""Remote Python Debugger (pdb wrapper)."""
|
||||
|
||||
import pdb
|
||||
import socket
|
||||
import sys
|
||||
|
||||
__author__ = "Bertrand Janin <b@janin.com>"
|
||||
__version__ = "0.1.3"
|
||||
|
||||
|
||||
class Rpdb(pdb.Pdb):
|
||||
|
||||
def __init__(self, addr="127.0.0.1", port=4444):
|
||||
"""Initialize the socket and initialize pdb."""
|
||||
|
||||
# Backup stdin and stdout before replacing them by the socket handle
|
||||
self.old_stdout = sys.stdout
|
||||
self.old_stdin = sys.stdin
|
||||
|
||||
# Open a 'reusable' socket to let the webapp reload on the same port
|
||||
self.skt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
self.skt.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
|
||||
self.skt.bind((addr, port))
|
||||
self.skt.listen(1)
|
||||
(clientsocket, address) = self.skt.accept()
|
||||
handle = clientsocket.makefile('rw')
|
||||
pdb.Pdb.__init__(self, completekey='tab', stdin=handle, stdout=handle)
|
||||
sys.stdout = sys.stdin = handle
|
||||
|
||||
def shutdown(self):
|
||||
"""Revert stdin and stdout, close the socket."""
|
||||
sys.stdout = self.old_stdout
|
||||
sys.stdin = self.old_stdin
|
||||
self.skt.close()
|
||||
self.set_continue()
|
||||
|
||||
def do_continue(self, arg):
|
||||
"""Stop all operation on ``continue``."""
|
||||
self.shutdown()
|
||||
return 1
|
||||
|
||||
do_EOF = do_quit = do_exit = do_c = do_cont = do_continue
|
34
hooks/charmhelpers/contrib/python/version.py
Normal file
34
hooks/charmhelpers/contrib/python/version.py
Normal file
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python
|
||||
# coding: utf-8
|
||||
|
||||
# Copyright 2014-2015 Canonical Limited.
|
||||
#
|
||||
# This file is part of charm-helpers.
|
||||
#
|
||||
# charm-helpers is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||
# published by the Free Software Foundation.
|
||||
#
|
||||
# charm-helpers is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU Lesser General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU Lesser General Public License
|
||||
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import sys
|
||||
|
||||
__author__ = "Jorge Niedbalski <jorge.niedbalski@canonical.com>"
|
||||
|
||||
|
||||
def current_version():
|
||||
"""Current system python version"""
|
||||
return sys.version_info
|
||||
|
||||
|
||||
def current_version_string():
|
||||
"""Current system python version as string major.minor.micro"""
|
||||
return "{0}.{1}.{2}".format(sys.version_info.major,
|
||||
sys.version_info.minor,
|
||||
sys.version_info.micro)
|
@ -42,7 +42,9 @@ from charmhelpers.fetch import (
|
||||
)
|
||||
|
||||
from charmhelpers.contrib.openstack.utils import (
|
||||
config_value_changed,
|
||||
configure_installation_source,
|
||||
git_install_requested,
|
||||
openstack_upgrade_available,
|
||||
sync_db_with_multi_ipv6_addresses
|
||||
)
|
||||
@ -53,6 +55,7 @@ from keystone_utils import (
|
||||
do_openstack_upgrade,
|
||||
ensure_initial_admin,
|
||||
get_admin_passwd,
|
||||
git_install,
|
||||
migrate_database,
|
||||
save_script_rc,
|
||||
synchronize_ca_if_changed,
|
||||
@ -116,6 +119,8 @@ def install():
|
||||
apt_update()
|
||||
apt_install(determine_packages(), fatal=True)
|
||||
|
||||
git_install(config('openstack-origin-git'))
|
||||
|
||||
|
||||
@hooks.hook('config-changed')
|
||||
@restart_on_change(restart_map())
|
||||
@ -132,8 +137,12 @@ def config_changed():
|
||||
if not os.path.isdir(homedir):
|
||||
mkdir(homedir, SSH_USER, 'juju_keystone', 0o775)
|
||||
|
||||
if openstack_upgrade_available('keystone'):
|
||||
do_openstack_upgrade(configs=CONFIGS)
|
||||
if git_install_requested():
|
||||
if config_value_changed('openstack-origin-git'):
|
||||
git_install(config('openstack-origin-git'))
|
||||
else:
|
||||
if openstack_upgrade_available('keystone'):
|
||||
do_openstack_upgrade(configs=CONFIGS)
|
||||
|
||||
# Ensure ssl dir exists and is unison-accessible
|
||||
ensure_ssl_dir()
|
||||
|
@ -6,6 +6,7 @@ import json
|
||||
import os
|
||||
import pwd
|
||||
import re
|
||||
import shutil
|
||||
import subprocess
|
||||
import threading
|
||||
import time
|
||||
@ -40,14 +41,12 @@ from charmhelpers.contrib.openstack.utils import (
|
||||
configure_installation_source,
|
||||
error_out,
|
||||
get_os_codename_install_source,
|
||||
git_install_requested,
|
||||
git_clone_and_install,
|
||||
git_src_dir,
|
||||
os_release,
|
||||
save_script_rc as _save_script_rc)
|
||||
|
||||
from charmhelpers.core.host import (
|
||||
mkdir,
|
||||
write_file,
|
||||
)
|
||||
|
||||
from charmhelpers.core.strutils import (
|
||||
bool_from_string,
|
||||
)
|
||||
@ -59,6 +58,7 @@ from charmhelpers.core.decorators import (
|
||||
)
|
||||
|
||||
from charmhelpers.core.hookenv import (
|
||||
charm_dir,
|
||||
config,
|
||||
is_relation_made,
|
||||
log,
|
||||
@ -78,15 +78,20 @@ from charmhelpers.fetch import (
|
||||
apt_install,
|
||||
apt_update,
|
||||
apt_upgrade,
|
||||
add_source
|
||||
add_source,
|
||||
)
|
||||
|
||||
from charmhelpers.core.host import (
|
||||
adduser,
|
||||
add_group,
|
||||
add_user_to_group,
|
||||
mkdir,
|
||||
service_stop,
|
||||
service_start,
|
||||
service_restart,
|
||||
pwgen,
|
||||
lsb_release
|
||||
lsb_release,
|
||||
write_file,
|
||||
)
|
||||
|
||||
from charmhelpers.contrib.peerstorage import (
|
||||
@ -95,6 +100,8 @@ from charmhelpers.contrib.peerstorage import (
|
||||
peer_retrieve,
|
||||
)
|
||||
|
||||
from charmhelpers.core.templating import render
|
||||
|
||||
import keystone_context
|
||||
import keystone_ssl as ssl
|
||||
|
||||
@ -114,10 +121,25 @@ BASE_PACKAGES = [
|
||||
'uuid',
|
||||
]
|
||||
|
||||
BASE_GIT_PACKAGES = [
|
||||
'libxml2-dev',
|
||||
'libxslt1-dev',
|
||||
'python-dev',
|
||||
'python-pip',
|
||||
'python-setuptools',
|
||||
'zlib1g-dev',
|
||||
]
|
||||
|
||||
BASE_SERVICES = [
|
||||
'keystone',
|
||||
]
|
||||
|
||||
# ubuntu packages that should not be installed when deploying from git
|
||||
GIT_PACKAGE_BLACKLIST = [
|
||||
'keystone',
|
||||
'python-keystoneclient',
|
||||
]
|
||||
|
||||
API_PORTS = {
|
||||
'keystone-admin': config('admin-port'),
|
||||
'keystone-public': config('service-port')
|
||||
@ -305,6 +327,14 @@ def determine_packages():
|
||||
packages = [] + BASE_PACKAGES
|
||||
for k, v in resource_map().iteritems():
|
||||
packages.extend(v['services'])
|
||||
|
||||
if git_install_requested():
|
||||
packages.extend(BASE_GIT_PACKAGES)
|
||||
# don't include packages that will be installed from git
|
||||
packages = list(set(packages))
|
||||
for p in GIT_PACKAGE_BLACKLIST:
|
||||
packages.remove(p)
|
||||
|
||||
return list(set(packages))
|
||||
|
||||
|
||||
@ -1629,3 +1659,68 @@ def is_db_ready(use_current_context=False, db_rel=None):
|
||||
# If neither relation has units then we are probably in sqlite mode so
|
||||
# return True.
|
||||
return not rel_has_units
|
||||
|
||||
|
||||
def git_install(projects_yaml):
|
||||
"""Perform setup, and install git repos specified in yaml parameter."""
|
||||
if git_install_requested():
|
||||
git_pre_install()
|
||||
git_clone_and_install(projects_yaml, core_project='keystone')
|
||||
git_post_install(projects_yaml)
|
||||
|
||||
|
||||
def git_pre_install():
|
||||
"""Perform keystone pre-install setup."""
|
||||
dirs = [
|
||||
'/var/lib/keystone',
|
||||
'/var/lib/keystone/cache',
|
||||
'/var/log/keystone',
|
||||
]
|
||||
|
||||
logs = [
|
||||
'/var/log/keystone/keystone.log',
|
||||
]
|
||||
|
||||
adduser('keystone', shell='/bin/bash', system_user=True)
|
||||
add_group('keystone', system_group=True)
|
||||
add_user_to_group('keystone', 'keystone')
|
||||
|
||||
for d in dirs:
|
||||
mkdir(d, owner='keystone', group='keystone', perms=0700, force=False)
|
||||
|
||||
for l in logs:
|
||||
write_file(l, '', owner='keystone', group='keystone', perms=0600)
|
||||
|
||||
|
||||
def git_post_install(projects_yaml):
|
||||
"""Perform keystone post-install setup."""
|
||||
src_etc = os.path.join(git_src_dir(projects_yaml, 'keystone'), 'etc')
|
||||
configs = {
|
||||
'src': src_etc,
|
||||
'dest': '/etc/keystone',
|
||||
}
|
||||
|
||||
if os.path.exists(configs['dest']):
|
||||
shutil.rmtree(configs['dest'])
|
||||
shutil.copytree(configs['src'], configs['dest'])
|
||||
|
||||
render('git/logging.conf', '/etc/keystone/logging.conf', {}, perms=0o644)
|
||||
|
||||
keystone_context = {
|
||||
'service_description': 'Keystone API server',
|
||||
'service_name': 'Keystone',
|
||||
'user_name': 'keystone',
|
||||
'start_dir': '/var/lib/keystone',
|
||||
'process_name': 'keystone',
|
||||
'executable_name': '/usr/local/bin/keystone-all',
|
||||
'config_files': ['/etc/keystone/keystone.conf'],
|
||||
'log_file': '/var/log/keystone/keystone.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/keystone.conf', keystone_context,
|
||||
perms=0o644, templates_dir=templates_dir)
|
||||
|
||||
service_restart('keystone')
|
||||
|
39
templates/git/logging.conf
Normal file
39
templates/git/logging.conf
Normal file
@ -0,0 +1,39 @@
|
||||
[loggers]
|
||||
keys=root
|
||||
|
||||
[formatters]
|
||||
keys=normal,normal_with_name,debug
|
||||
|
||||
[handlers]
|
||||
keys=production,file,devel
|
||||
|
||||
[logger_root]
|
||||
level=WARNING
|
||||
handlers=file
|
||||
|
||||
[handler_production]
|
||||
class=handlers.SysLogHandler
|
||||
level=ERROR
|
||||
formatter=normal_with_name
|
||||
args=(('localhost', handlers.SYSLOG_UDP_PORT), handlers.SysLogHandler.LOG_USER)
|
||||
|
||||
[handler_file]
|
||||
class=FileHandler
|
||||
level=DEBUG
|
||||
formatter=normal_with_name
|
||||
args=('/var/log/keystone/keystone.log', 'a')
|
||||
|
||||
[handler_devel]
|
||||
class=StreamHandler
|
||||
level=NOTSET
|
||||
formatter=debug
|
||||
args=(sys.stdout,)
|
||||
|
||||
[formatter_normal]
|
||||
format=%(asctime)s %(levelname)s %(message)s
|
||||
|
||||
[formatter_normal_with_name]
|
||||
format=(%(name)s): %(asctime)s %(levelname)s %(message)s
|
||||
|
||||
[formatter_debug]
|
||||
format=(%(name)s): %(asctime)s %(levelname)s %(module)s %(funcName)s %(message)s
|
@ -1,9 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone deployment on precise-essex."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='precise')
|
||||
deployment.run_tests()
|
@ -1,11 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone deployment on precise-folsom."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='precise',
|
||||
openstack='cloud:precise-folsom',
|
||||
source='cloud:precise-updates/folsom')
|
||||
deployment.run_tests()
|
@ -1,11 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone deployment on precise-grizzly."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='precise',
|
||||
openstack='cloud:precise-grizzly',
|
||||
source='cloud:precise-updates/grizzly')
|
||||
deployment.run_tests()
|
@ -1,11 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone deployment on precise-havana."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='precise',
|
||||
openstack='cloud:precise-havana',
|
||||
source='cloud:precise-updates/havana')
|
||||
deployment.run_tests()
|
9
tests/16-basic-trusty-icehouse-git
Executable file
9
tests/16-basic-trusty-icehouse-git
Executable file
@ -0,0 +1,9 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone git deployment on trusty-icehouse."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='trusty', git=True)
|
||||
deployment.run_tests()
|
11
tests/17-basic-trusty-juno
Executable file
11
tests/17-basic-trusty-juno
Executable file
@ -0,0 +1,11 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone deployment on trusty-juno."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='trusty',
|
||||
openstack='cloud:trusty-juno',
|
||||
source='cloud:trusty-updates/juno')
|
||||
deployment.run_tests()
|
12
tests/18-basic-trusty-juno-git
Executable file
12
tests/18-basic-trusty-juno-git
Executable file
@ -0,0 +1,12 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
"""Amulet tests on a basic keystone git deployment on trusty-juno."""
|
||||
|
||||
from basic_deployment import KeystoneBasicDeployment
|
||||
|
||||
if __name__ == '__main__':
|
||||
deployment = KeystoneBasicDeployment(series='trusty',
|
||||
openstack='cloud:trusty-juno',
|
||||
source='cloud:trusty-updates/juno',
|
||||
git=True)
|
||||
deployment.run_tests()
|
@ -1,6 +1,8 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import amulet
|
||||
import os
|
||||
import yaml
|
||||
|
||||
from charmhelpers.contrib.openstack.amulet.deployment import (
|
||||
OpenStackAmuletDeployment
|
||||
@ -13,15 +15,16 @@ from charmhelpers.contrib.openstack.amulet.utils import (
|
||||
)
|
||||
|
||||
# Use DEBUG to turn on debug logging
|
||||
u = OpenStackAmuletUtils(ERROR)
|
||||
u = OpenStackAmuletUtils(DEBUG)
|
||||
|
||||
|
||||
class KeystoneBasicDeployment(OpenStackAmuletDeployment):
|
||||
"""Amulet tests on a basic keystone deployment."""
|
||||
|
||||
def __init__(self, series=None, openstack=None, source=None, stable=False):
|
||||
def __init__(self, series=None, openstack=None, source=None, git=False, stable=False):
|
||||
"""Deploy the entire test environment."""
|
||||
super(KeystoneBasicDeployment, self).__init__(series, openstack, source, stable)
|
||||
self.git = git
|
||||
self._add_services()
|
||||
self._add_relations()
|
||||
self._configure_services()
|
||||
@ -50,6 +53,24 @@ class KeystoneBasicDeployment(OpenStackAmuletDeployment):
|
||||
"""Configure all of the services."""
|
||||
keystone_config = {'admin-password': 'openstack',
|
||||
'admin-token': 'ubuntutesting'}
|
||||
if self.git:
|
||||
branch = 'stable/' + self._get_openstack_release_string()
|
||||
amulet_http_proxy = os.environ.get('AMULET_HTTP_PROXY')
|
||||
openstack_origin_git = {
|
||||
'repositories': [
|
||||
{'name': 'requirements',
|
||||
'repository': 'git://git.openstack.org/openstack/requirements',
|
||||
'branch': branch},
|
||||
{'name': 'keystone',
|
||||
'repository': 'git://git.openstack.org/openstack/keystone',
|
||||
'branch': branch},
|
||||
],
|
||||
'directory': '/mnt/openstack-git',
|
||||
'http_proxy': amulet_http_proxy,
|
||||
'https_proxy': amulet_http_proxy,
|
||||
}
|
||||
keystone_config['openstack-origin-git'] = yaml.dump(openstack_origin_git)
|
||||
|
||||
mysql_config = {'dataset-size': '50%'}
|
||||
cinder_config = {'block-device': 'None'}
|
||||
configs = {'keystone': keystone_config,
|
||||
|
@ -1,3 +1,4 @@
|
||||
import sys
|
||||
|
||||
sys.path.append('actions/')
|
||||
sys.path.append('hooks/')
|
||||
|
95
unit_tests/test_actions_git_reinstall.py
Normal file
95
unit_tests/test_actions_git_reinstall.py
Normal file
@ -0,0 +1,95 @@
|
||||
from mock import patch
|
||||
|
||||
with patch('charmhelpers.core.hookenv.config') as config:
|
||||
config.return_value = 'keystone'
|
||||
import keystone_utils as utils # noqa
|
||||
|
||||
with patch('keystone_utils.register_configs') as register_configs:
|
||||
import git_reinstall
|
||||
|
||||
from test_utils import (
|
||||
CharmTestCase
|
||||
)
|
||||
|
||||
TO_PATCH = [
|
||||
'config',
|
||||
]
|
||||
|
||||
|
||||
openstack_origin_git = \
|
||||
"""repositories:
|
||||
- {name: requirements,
|
||||
repository: 'git://git.openstack.org/openstack/requirements',
|
||||
branch: stable/juno}
|
||||
- {name: keystone,
|
||||
repository: 'git://git.openstack.org/openstack/keystone',
|
||||
branch: stable/juno}"""
|
||||
|
||||
|
||||
class TestKeystoneActions(CharmTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestKeystoneActions, self).setUp(git_reinstall, TO_PATCH)
|
||||
self.config.side_effect = self.test_config.get
|
||||
|
||||
@patch.object(git_reinstall, 'action_set')
|
||||
@patch.object(git_reinstall, 'action_fail')
|
||||
@patch.object(git_reinstall, 'git_install')
|
||||
@patch.object(git_reinstall, 'config_changed')
|
||||
def test_git_reinstall(self, config_changed, git_install, action_fail,
|
||||
action_set):
|
||||
self.test_config.set('openstack-origin-git', openstack_origin_git)
|
||||
|
||||
git_reinstall.git_reinstall()
|
||||
|
||||
git_install.assert_called_with(openstack_origin_git)
|
||||
self.assertTrue(git_install.called)
|
||||
self.assertTrue(config_changed.called)
|
||||
self.assertFalse(action_set.called)
|
||||
self.assertFalse(action_fail.called)
|
||||
|
||||
@patch.object(git_reinstall, 'action_set')
|
||||
@patch.object(git_reinstall, 'action_fail')
|
||||
@patch.object(git_reinstall, 'git_install')
|
||||
@patch.object(git_reinstall, 'config_changed')
|
||||
@patch('charmhelpers.contrib.openstack.utils.config')
|
||||
def test_git_reinstall_not_configured(self, _config, config_changed,
|
||||
git_install, action_fail,
|
||||
action_set):
|
||||
_config.return_value = None
|
||||
|
||||
git_reinstall.git_reinstall()
|
||||
|
||||
msg = 'openstack-origin-git is not configured'
|
||||
action_fail.assert_called_with(msg)
|
||||
self.assertFalse(git_install.called)
|
||||
self.assertFalse(action_set.called)
|
||||
|
||||
@patch.object(git_reinstall, 'action_set')
|
||||
@patch.object(git_reinstall, 'action_fail')
|
||||
@patch.object(git_reinstall, 'git_install')
|
||||
@patch.object(git_reinstall, 'config_changed')
|
||||
@patch('traceback.format_exc')
|
||||
@patch('charmhelpers.contrib.openstack.utils.config')
|
||||
def test_git_reinstall_exception(self, _config, format_exc,
|
||||
config_changed, git_install, action_fail,
|
||||
action_set):
|
||||
_config.return_value = openstack_origin_git
|
||||
e = OSError('something bad happened')
|
||||
git_install.side_effect = e
|
||||
traceback = (
|
||||
"Traceback (most recent call last):\n"
|
||||
" File \"actions/git_reinstall.py\", line 37, in git_reinstall\n"
|
||||
" git_install(config(\'openstack-origin-git\'))\n"
|
||||
" File \"/usr/lib/python2.7/dist-packages/mock.py\", line 964, in __call__\n" # noqa
|
||||
" return _mock_self._mock_call(*args, **kwargs)\n"
|
||||
" File \"/usr/lib/python2.7/dist-packages/mock.py\", line 1019, in _mock_call\n" # noqa
|
||||
" raise effect\n"
|
||||
"OSError: something bad happened\n")
|
||||
format_exc.return_value = traceback
|
||||
|
||||
git_reinstall.git_reinstall()
|
||||
|
||||
msg = 'git-reinstall resulted in an unexpected error'
|
||||
action_fail.assert_called_with(msg)
|
||||
action_set.assert_called_with({'traceback': traceback})
|
@ -2,6 +2,7 @@ from mock import call, patch, MagicMock
|
||||
import os
|
||||
import json
|
||||
import uuid
|
||||
import yaml
|
||||
|
||||
from test_utils import CharmTestCase
|
||||
|
||||
@ -67,6 +68,7 @@ TO_PATCH = [
|
||||
'get_iface_for_address',
|
||||
'get_netmask_for_address',
|
||||
'get_address_in_network',
|
||||
'git_install',
|
||||
]
|
||||
|
||||
|
||||
@ -77,17 +79,49 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
self.config.side_effect = self.test_config.get
|
||||
self.ssh_user = 'juju_keystone'
|
||||
|
||||
def test_install_hook(self):
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
def test_install_hook(self, git_requested):
|
||||
git_requested.return_value = False
|
||||
repo = 'cloud:precise-grizzly'
|
||||
self.test_config.set('openstack-origin', repo)
|
||||
hooks.install()
|
||||
self.assertTrue(self.execd_preinstall.called)
|
||||
self.configure_installation_source.assert_called_with(repo)
|
||||
self.assertTrue(self.apt_update.called)
|
||||
self.apt_install.assert_called_with(
|
||||
['haproxy', 'unison', 'python-keystoneclient',
|
||||
'uuid', 'python-mysqldb', 'openssl', 'apache2',
|
||||
'pwgen', 'python-six', 'keystone', 'python-psycopg2'], fatal=True)
|
||||
self.git_install.assert_called_with(None)
|
||||
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
def test_install_hook_git(self, git_requested):
|
||||
git_requested.return_value = True
|
||||
repo = 'cloud:trusty-juno'
|
||||
openstack_origin_git = {
|
||||
'repositories': [
|
||||
{'name': 'requirements',
|
||||
'repository': 'git://git.openstack.org/openstack/requirements', # noqa
|
||||
'branch': 'stable/juno'},
|
||||
{'name': 'keystone',
|
||||
'repository': 'git://git.openstack.org/openstack/keystone',
|
||||
'branch': 'stable/juno'}
|
||||
],
|
||||
'directory': '/mnt/openstack-git',
|
||||
}
|
||||
projects_yaml = yaml.dump(openstack_origin_git)
|
||||
self.test_config.set('openstack-origin', repo)
|
||||
self.test_config.set('openstack-origin-git', projects_yaml)
|
||||
hooks.install()
|
||||
self.assertTrue(self.execd_preinstall.called)
|
||||
self.configure_installation_source.assert_called_with(repo)
|
||||
self.assertTrue(self.apt_update.called)
|
||||
self.apt_install.assert_called_with(
|
||||
['haproxy', 'unison', 'python-setuptools', 'python-six', 'uuid',
|
||||
'python-mysqldb', 'python-pip', 'openssl', 'apache2', 'pwgen',
|
||||
'libxslt1-dev', 'python-psycopg2', 'zlib1g-dev', 'python-dev',
|
||||
'libxml2-dev'], fatal=True)
|
||||
self.git_install.assert_called_with(projects_yaml)
|
||||
|
||||
mod_ch_openstack_utils = 'charmhelpers.contrib.openstack.utils'
|
||||
|
||||
@ -271,6 +305,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
relation_id='identity-service:0',
|
||||
remote_unit='unit/0')
|
||||
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
@patch('keystone_utils.log')
|
||||
@patch('keystone_utils.ensure_ssl_cert_master')
|
||||
@patch.object(hooks, 'ensure_pki_dir_permissions')
|
||||
@ -305,7 +340,8 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
mock_ensure_ssl_dir,
|
||||
mock_ensure_pki_dir_permissions,
|
||||
mock_ensure_ssl_cert_master,
|
||||
mock_log):
|
||||
mock_log, git_requested):
|
||||
git_requested.return_value = False
|
||||
mock_is_pki_enabled.return_value = True
|
||||
mock_is_ssl_cert_master.return_value = True
|
||||
mock_is_db_initialised.return_value = True
|
||||
@ -334,6 +370,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
remote_unit='unit/0')
|
||||
admin_relation_changed.assert_called_with('identity-service:0')
|
||||
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
@patch('keystone_utils.log')
|
||||
@patch('keystone_utils.ensure_ssl_cert_master')
|
||||
@patch.object(hooks, 'update_all_identity_relation_units')
|
||||
@ -361,7 +398,8 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
mock_ensure_pki_permissions,
|
||||
mock_update_all_id_rel_units,
|
||||
mock_ensure_ssl_cert_master,
|
||||
mock_log):
|
||||
mock_log, git_requested):
|
||||
git_requested.return_value = False
|
||||
mock_is_pki_enabled.return_value = True
|
||||
mock_is_ssl_cert_master.return_value = True
|
||||
mock_peer_units.return_value = []
|
||||
@ -381,6 +419,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
self.assertFalse(self.ensure_initial_admin.called)
|
||||
self.assertFalse(identity_changed.called)
|
||||
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
@patch('keystone_utils.log')
|
||||
@patch('keystone_utils.ensure_ssl_cert_master')
|
||||
@patch.object(hooks, 'ensure_pki_dir_permissions')
|
||||
@ -414,7 +453,8 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
mock_ensure_ssl_dir,
|
||||
mock_ensure_pki_permissions,
|
||||
mock_ensure_ssl_cert_master,
|
||||
mock_log):
|
||||
mock_log, git_requested):
|
||||
git_requested.return_value = False
|
||||
mock_is_pki_enabled.return_value = True
|
||||
mock_is_ssl_cert_master.return_value = True
|
||||
mock_is_db_ready.return_value = True
|
||||
@ -445,6 +485,66 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
remote_unit='unit/0')
|
||||
admin_relation_changed.assert_called_with('identity-service:0')
|
||||
|
||||
@patch.object(hooks, 'git_install_requested')
|
||||
@patch.object(hooks, 'config_value_changed')
|
||||
@patch('keystone_utils.log')
|
||||
@patch('keystone_utils.ensure_ssl_cert_master')
|
||||
@patch.object(hooks, 'ensure_ssl_dir')
|
||||
@patch.object(hooks, 'is_pki_enabled')
|
||||
@patch.object(hooks, 'send_ssl_sync_request')
|
||||
@patch.object(hooks, 'is_db_initialised')
|
||||
@patch.object(hooks, 'is_db_ready')
|
||||
@patch.object(hooks, 'peer_units')
|
||||
@patch.object(hooks, 'ensure_permissions')
|
||||
@patch.object(hooks, 'admin_relation_changed')
|
||||
@patch.object(hooks, 'cluster_joined')
|
||||
@patch.object(unison, 'ensure_user')
|
||||
@patch.object(unison, 'get_homedir')
|
||||
@patch.object(hooks, 'CONFIGS')
|
||||
@patch.object(hooks, 'identity_changed')
|
||||
@patch.object(hooks, 'configure_https')
|
||||
def test_config_changed_git_updated(self, configure_https,
|
||||
identity_changed,
|
||||
configs, get_homedir, ensure_user,
|
||||
cluster_joined, admin_relation_changed,
|
||||
ensure_permissions, mock_peer_units,
|
||||
mock_is_db_ready,
|
||||
mock_is_db_initialised,
|
||||
mock_send_ssl_sync_request,
|
||||
mock_is_pki_enabled,
|
||||
mock_ensure_ssl_dir,
|
||||
mock_ensure_ssl_cert_master,
|
||||
mock_log, config_val_changed,
|
||||
git_requested):
|
||||
git_requested.return_value = True
|
||||
mock_ensure_ssl_cert_master.return_value = False
|
||||
mock_is_pki_enabled.return_value = False
|
||||
self.openstack_upgrade_available.return_value = False
|
||||
self.is_elected_leader.return_value = True
|
||||
mock_peer_units.return_value = []
|
||||
self.relation_ids.return_value = ['identity-service:0']
|
||||
self.related_units.return_value = ['unit/0']
|
||||
|
||||
repo = 'cloud:trusty-juno'
|
||||
openstack_origin_git = {
|
||||
'repositories': [
|
||||
{'name': 'requirements',
|
||||
'repository': 'git://git.openstack.org/openstack/requirements', # noqa
|
||||
'branch': 'stable/juno'},
|
||||
{'name': 'keystone',
|
||||
'repository': 'git://git.openstack.org/openstack/keystone',
|
||||
'branch': 'stable/juno'}
|
||||
],
|
||||
'directory': '/mnt/openstack-git',
|
||||
}
|
||||
projects_yaml = yaml.dump(openstack_origin_git)
|
||||
self.test_config.set('openstack-origin', repo)
|
||||
self.test_config.set('openstack-origin-git', projects_yaml)
|
||||
hooks.config_changed()
|
||||
self.git_install.assert_called_with(projects_yaml)
|
||||
self.assertFalse(self.openstack_upgrade_available.called)
|
||||
self.assertFalse(self.do_openstack_upgrade.called)
|
||||
|
||||
@patch.object(hooks, 'is_db_initialised')
|
||||
@patch.object(hooks, 'is_db_ready')
|
||||
@patch('keystone_utils.log')
|
||||
@ -689,6 +789,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
cmd = ['a2dissite', 'openstack_https_frontend']
|
||||
self.check_call.assert_called_with(cmd)
|
||||
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
@patch.object(hooks, 'is_db_ready')
|
||||
@patch.object(hooks, 'is_db_initialised')
|
||||
@patch('keystone_utils.log')
|
||||
@ -706,7 +807,8 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
mock_relation_ids,
|
||||
mock_log,
|
||||
mock_is_db_ready,
|
||||
mock_is_db_initialised):
|
||||
mock_is_db_initialised,
|
||||
git_requested):
|
||||
mock_is_db_initialised.return_value = True
|
||||
mock_is_db_ready.return_value = True
|
||||
mock_is_elected_leader.return_value = False
|
||||
@ -718,6 +820,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
|
||||
self.is_elected_leader.return_value = True
|
||||
self.filter_installed_packages.return_value = []
|
||||
git_requested.return_value = False
|
||||
hooks.upgrade_charm()
|
||||
self.assertTrue(self.apt_install.called)
|
||||
ssh_authorized_peers.assert_called_with(
|
||||
@ -728,6 +831,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
'Firing identity_changed hook for all related services.')
|
||||
self.assertTrue(self.ensure_initial_admin.called)
|
||||
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
@patch('keystone_utils.log')
|
||||
@patch('keystone_utils.relation_ids')
|
||||
@patch('keystone_utils.ensure_ssl_cert_master')
|
||||
@ -737,7 +841,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
mock_update_hash_from_path,
|
||||
mock_ensure_ssl_cert_master,
|
||||
mock_relation_ids,
|
||||
mock_log):
|
||||
mock_log, git_requested):
|
||||
mock_relation_ids.return_value = []
|
||||
mock_ensure_ssl_cert_master.return_value = False
|
||||
# Ensure always returns diff
|
||||
@ -746,6 +850,7 @@ class KeystoneRelationTests(CharmTestCase):
|
||||
|
||||
self.is_elected_leader.return_value = False
|
||||
self.filter_installed_packages.return_value = []
|
||||
git_requested.return_value = False
|
||||
hooks.upgrade_charm()
|
||||
self.assertTrue(self.apt_install.called)
|
||||
ssh_authorized_peers.assert_called_with(
|
||||
|
@ -53,6 +53,15 @@ TO_PATCH = [
|
||||
'resolve_address',
|
||||
]
|
||||
|
||||
openstack_origin_git = \
|
||||
"""repositories:
|
||||
- {name: requirements,
|
||||
repository: 'git://git.openstack.org/openstack/requirements',
|
||||
branch: stable/juno}
|
||||
- {name: keystone,
|
||||
repository: 'git://git.openstack.org/openstack/keystone',
|
||||
branch: stable/juno}"""
|
||||
|
||||
|
||||
class TestKeystoneUtils(CharmTestCase):
|
||||
|
||||
@ -108,9 +117,20 @@ class TestKeystoneUtils(CharmTestCase):
|
||||
result = utils.determine_ports()
|
||||
self.assertEquals(result, ['80', '81'])
|
||||
|
||||
def test_determine_packages(self):
|
||||
@patch('charmhelpers.contrib.openstack.utils.config')
|
||||
def test_determine_packages(self, _config):
|
||||
_config.return_value = None
|
||||
result = utils.determine_packages()
|
||||
ex = utils.BASE_PACKAGES + ['keystone', 'haproxy', 'apache2']
|
||||
ex = utils.BASE_PACKAGES + ['keystone', 'python-keystoneclient']
|
||||
self.assertEquals(set(ex), set(result))
|
||||
|
||||
@patch('charmhelpers.contrib.openstack.utils.config')
|
||||
def test_determine_packages_git(self, _config):
|
||||
_config.return_value = openstack_origin_git
|
||||
result = utils.determine_packages()
|
||||
ex = utils.BASE_PACKAGES + ['keystone'] + utils.BASE_GIT_PACKAGES
|
||||
for p in utils.GIT_PACKAGE_BLACKLIST:
|
||||
ex.remove(p)
|
||||
self.assertEquals(set(ex), set(result))
|
||||
|
||||
@patch.object(hooks, 'CONFIGS')
|
||||
@ -593,3 +613,77 @@ class TestKeystoneUtils(CharmTestCase):
|
||||
self.is_elected_leader.return_value = True
|
||||
self.assertFalse(utils.ensure_ssl_cert_master())
|
||||
self.assertFalse(self.relation_set.called)
|
||||
|
||||
@patch.object(utils, 'git_install_requested')
|
||||
@patch.object(utils, 'git_clone_and_install')
|
||||
@patch.object(utils, 'git_post_install')
|
||||
@patch.object(utils, 'git_pre_install')
|
||||
def test_git_install(self, git_pre, git_post, git_clone_and_install,
|
||||
git_requested):
|
||||
projects_yaml = openstack_origin_git
|
||||
git_requested.return_value = True
|
||||
utils.git_install(projects_yaml)
|
||||
self.assertTrue(git_pre.called)
|
||||
git_clone_and_install.assert_called_with(openstack_origin_git,
|
||||
core_project='keystone')
|
||||
self.assertTrue(git_post.called)
|
||||
|
||||
@patch.object(utils, 'mkdir')
|
||||
@patch.object(utils, 'write_file')
|
||||
@patch.object(utils, 'add_user_to_group')
|
||||
@patch.object(utils, 'add_group')
|
||||
@patch.object(utils, 'adduser')
|
||||
def test_git_pre_install(self, adduser, add_group, add_user_to_group,
|
||||
write_file, mkdir):
|
||||
utils.git_pre_install()
|
||||
adduser.assert_called_with('keystone', shell='/bin/bash',
|
||||
system_user=True)
|
||||
add_group.assert_called_with('keystone', system_group=True)
|
||||
add_user_to_group.assert_called_with('keystone', 'keystone')
|
||||
expected = [
|
||||
call('/var/lib/keystone', owner='keystone',
|
||||
group='keystone', perms=0700, force=False),
|
||||
call('/var/lib/keystone/cache', owner='keystone',
|
||||
group='keystone', perms=0700, force=False),
|
||||
call('/var/log/keystone', owner='keystone',
|
||||
group='keystone', perms=0700, force=False),
|
||||
]
|
||||
self.assertEquals(mkdir.call_args_list, expected)
|
||||
write_file.assert_called_with('/var/log/keystone/keystone.log',
|
||||
'', owner='keystone', group='keystone',
|
||||
perms=0600)
|
||||
|
||||
@patch.object(utils, 'git_src_dir')
|
||||
@patch.object(utils, 'service_restart')
|
||||
@patch.object(utils, 'render')
|
||||
@patch('os.path.join')
|
||||
@patch('os.path.exists')
|
||||
@patch('shutil.copytree')
|
||||
@patch('shutil.rmtree')
|
||||
def test_git_post_install(self, rmtree, copytree, exists, join, render,
|
||||
service_restart, git_src_dir):
|
||||
projects_yaml = openstack_origin_git
|
||||
join.return_value = 'joined-string'
|
||||
utils.git_post_install(projects_yaml)
|
||||
expected = [
|
||||
call('joined-string', '/etc/keystone'),
|
||||
]
|
||||
copytree.assert_has_calls(expected)
|
||||
keystone_context = {
|
||||
'service_description': 'Keystone API server',
|
||||
'service_name': 'Keystone',
|
||||
'user_name': 'keystone',
|
||||
'start_dir': '/var/lib/keystone',
|
||||
'process_name': 'keystone',
|
||||
'executable_name': '/usr/local/bin/keystone-all',
|
||||
'config_files': ['/etc/keystone/keystone.conf'],
|
||||
'log_file': '/var/log/keystone/keystone.log',
|
||||
}
|
||||
expected = [
|
||||
call('git/logging.conf', '/etc/keystone/logging.conf', {},
|
||||
perms=0o644),
|
||||
call('git.upstart', '/etc/init/keystone.conf',
|
||||
keystone_context, perms=0o644, templates_dir='joined-string'),
|
||||
]
|
||||
self.assertEquals(render.call_args_list, expected)
|
||||
service_restart.assert_called_with('keystone')
|
||||
|
Loading…
Reference in New Issue
Block a user