resync helpers

This commit is contained in:
James Page 2014-06-27 14:48:50 +01:00
parent 95afb40491
commit e571d4a141
6 changed files with 47 additions and 33 deletions

View File

@ -30,12 +30,12 @@ def get_address_in_network(network, fallback=None, fatal=False):
""" """
Get an IPv4 address within the network from the host. Get an IPv4 address within the network from the host.
Args: :param network (str): CIDR presentation format. For example,
network (str): CIDR presentation format. For example, '192.168.1.0/24'.
'192.168.1.0/24'. :param fallback (str): If no address is found, return fallback.
fallback (str): If no address is found, return fallback. :param fatal (boolean): If no address is found, fallback is not
fatal (boolean): If no address is found, fallback is not set and fatal is True then exit(1).
set and fatal is True then exit(1).
""" """
def not_found_error_out(): def not_found_error_out():

View File

@ -37,6 +37,7 @@ def zap_disk(block_device):
check_call(['dd', 'if=/dev/zero', 'of=%s' % (block_device), check_call(['dd', 'if=/dev/zero', 'of=%s' % (block_device),
'bs=512', 'count=100', 'seek=%s' % (gpt_end)]) 'bs=512', 'count=100', 'seek=%s' % (gpt_end)])
def is_device_mounted(device): def is_device_mounted(device):
'''Given a device path, return True if that device is mounted, and False '''Given a device path, return True if that device is mounted, and False
if it isn't. if it isn't.

View File

@ -48,9 +48,11 @@ class Fstab(file):
file.__init__(self, self._path, 'r+') file.__init__(self, self._path, 'r+')
def _hydrate_entry(self, line): def _hydrate_entry(self, line):
# NOTE: use split with no arguments to split on any
# whitespace including tabs
return Fstab.Entry(*filter( return Fstab.Entry(*filter(
lambda x: x not in ('', None), lambda x: x not in ('', None),
line.strip("\n").split(" "))) line.strip("\n").split()))
@property @property
def entries(self): def entries(self):

View File

@ -25,7 +25,7 @@ cache = {}
def cached(func): def cached(func):
"""Cache return values for multiple executions of func + args """Cache return values for multiple executions of func + args
For example: For example::
@cached @cached
def unit_get(attribute): def unit_get(attribute):
@ -445,18 +445,19 @@ class UnregisteredHookError(Exception):
class Hooks(object): class Hooks(object):
"""A convenient handler for hook functions. """A convenient handler for hook functions.
Example: Example::
hooks = Hooks() hooks = Hooks()
# register a hook, taking its name from the function name # register a hook, taking its name from the function name
@hooks.hook() @hooks.hook()
def install(): def install():
... pass # your code here
# register a hook, providing a custom hook name # register a hook, providing a custom hook name
@hooks.hook("config-changed") @hooks.hook("config-changed")
def config_changed(): def config_changed():
... pass # your code here
if __name__ == "__main__": if __name__ == "__main__":
# execute a hook based on the name the program is called by # execute a hook based on the name the program is called by

View File

@ -12,7 +12,6 @@ import random
import string import string
import subprocess import subprocess
import hashlib import hashlib
import apt_pkg
from collections import OrderedDict from collections import OrderedDict
@ -212,13 +211,13 @@ def file_hash(path):
def restart_on_change(restart_map, stopstart=False): def restart_on_change(restart_map, stopstart=False):
"""Restart services based on configuration files changing """Restart services based on configuration files changing
This function is used a decorator, for example This function is used a decorator, for example::
@restart_on_change({ @restart_on_change({
'/etc/ceph/ceph.conf': [ 'cinder-api', 'cinder-volume' ] '/etc/ceph/ceph.conf': [ 'cinder-api', 'cinder-volume' ]
}) })
def ceph_client_changed(): def ceph_client_changed():
... pass # your code here
In this example, the cinder-api and cinder-volume services In this example, the cinder-api and cinder-volume services
would be restarted if /etc/ceph/ceph.conf is changed by the would be restarted if /etc/ceph/ceph.conf is changed by the
@ -314,10 +313,13 @@ def get_nic_hwaddr(nic):
def cmp_pkgrevno(package, revno, pkgcache=None): def cmp_pkgrevno(package, revno, pkgcache=None):
'''Compare supplied revno with the revno of the installed package '''Compare supplied revno with the revno of the installed package
1 => Installed revno is greater than supplied arg
0 => Installed revno is the same as supplied arg * 1 => Installed revno is greater than supplied arg
-1 => Installed revno is less than supplied arg * 0 => Installed revno is the same as supplied arg
* -1 => Installed revno is less than supplied arg
''' '''
import apt_pkg
if not pkgcache: if not pkgcache:
apt_pkg.init() apt_pkg.init()
pkgcache = apt_pkg.Cache() pkgcache = apt_pkg.Cache()

View File

@ -13,7 +13,6 @@ from charmhelpers.core.hookenv import (
config, config,
log, log,
) )
import apt_pkg
import os import os
@ -117,6 +116,7 @@ class BaseFetchHandler(object):
def filter_installed_packages(packages): def filter_installed_packages(packages):
"""Returns a list of packages that require installation""" """Returns a list of packages that require installation"""
import apt_pkg
apt_pkg.init() apt_pkg.init()
# Tell apt to build an in-memory cache to prevent race conditions (if # Tell apt to build an in-memory cache to prevent race conditions (if
@ -235,31 +235,39 @@ def configure_sources(update=False,
sources_var='install_sources', sources_var='install_sources',
keys_var='install_keys'): keys_var='install_keys'):
""" """
Configure multiple sources from charm configuration Configure multiple sources from charm configuration.
The lists are encoded as yaml fragments in the configuration.
The frament needs to be included as a string.
Example config: Example config:
install_sources: install_sources: |
- "ppa:foo" - "ppa:foo"
- "http://example.com/repo precise main" - "http://example.com/repo precise main"
install_keys: install_keys: |
- null - null
- "a1b2c3d4" - "a1b2c3d4"
Note that 'null' (a.k.a. None) should not be quoted. Note that 'null' (a.k.a. None) should not be quoted.
""" """
sources = safe_load(config(sources_var)) sources = safe_load((config(sources_var) or '').strip()) or []
keys = config(keys_var) keys = safe_load((config(keys_var) or '').strip()) or None
if keys is not None:
keys = safe_load(keys) if isinstance(sources, basestring):
if isinstance(sources, basestring) and ( sources = [sources]
keys is None or isinstance(keys, basestring)):
add_source(sources, keys) if keys is None:
for source in sources:
add_source(source, None)
else: else:
if not len(sources) == len(keys): if isinstance(keys, basestring):
msg = 'Install sources and keys lists are different lengths' keys = [keys]
raise SourceConfigError(msg)
for src_num in range(len(sources)): if len(sources) != len(keys):
add_source(sources[src_num], keys[src_num]) raise SourceConfigError(
'Install sources and keys lists are different lengths')
for source, key in zip(sources, keys):
add_source(source, key)
if update: if update:
apt_update(fatal=True) apt_update(fatal=True)