# # Copyright 2012 Canonical Ltd. # # Authors: # James Page # Paul Collins # import os import subprocess import socket import sys import apt_pkg as apt import re import ceilometer_utils import ConfigParser def do_hooks(hooks): hook = os.path.basename(sys.argv[0]) try: hook_func = hooks[hook] except KeyError: juju_log('INFO', "This charm doesn't know how to handle '{}'.".format(hook)) else: hook_func() def install(*pkgs): cmd = [ 'apt-get', '-y', 'install' ] for pkg in pkgs: cmd.append(pkg) subprocess.check_call(cmd) CLOUD_ARCHIVE = \ """ # Ubuntu Cloud Archive deb http://ubuntu-cloud.archive.canonical.com/ubuntu {} main """ CLOUD_ARCHIVE_POCKETS = { 'precise-folsom': 'precise-updates/folsom', 'precise-folsom/updates': 'precise-updates/folsom', 'precise-folsom/proposed': 'precise-proposed/folsom', 'precise-grizzly': 'precise-updates/grizzly', 'precise-grizzly/updates': 'precise-updates/grizzly', 'precise-grizzly/proposed': 'precise-proposed/grizzly' } def configure_source(): source = str(config_get('openstack-origin')) if not source: return if source.startswith('ppa:'): cmd = [ 'add-apt-repository', source ] subprocess.check_call(cmd) if source.startswith('cloud:'): install('ubuntu-cloud-keyring') pocket = source.split(':')[1] with open('/etc/apt/sources.list.d/cloud-archive.list', 'w') as apt: apt.write(CLOUD_ARCHIVE.format(CLOUD_ARCHIVE_POCKETS[pocket])) if source.startswith('deb'): l = len(source.split('|')) if l == 2: (apt_line, key) = source.split('|') cmd = [ 'apt-key', 'adv', '--keyserver keyserver.ubuntu.com', '--recv-keys', key ] subprocess.check_call(cmd) elif l == 1: apt_line = source with open('/etc/apt/sources.list.d/ceilometer.list', 'w') as apt: apt.write(apt_line + "\n") cmd = [ 'apt-get', 'update' ] subprocess.check_call(cmd) def juju_log(severity, message): cmd = [ 'juju-log', '--log-level', severity, message ] subprocess.check_call(cmd) def config_get(attribute): cmd = [ 'config-get', attribute ] value = subprocess.check_output(cmd).strip() # IGNORE:E1103 if value == "": return None else: return value def _service_ctl(service, action): subprocess.check_call(['service', service, action]) def restart(*services): for service in services: _service_ctl(service, 'restart') def stop(*services): for service in services: _service_ctl(service, 'stop') def start(*services): for service in services: _service_ctl(service, 'start') def get_os_version(package=None): apt.init() cache = apt.Cache() pkg = cache[package or 'quantum-common'] if pkg.current_ver: return apt.upstream_version(pkg.current_ver.ver_str) else: return None def modify_config_file(nova_conf): config = ConfigParser.ConfigParser() config.read(nova_conf) juju_log("INFO", str(config.items("DEFAULT")))