resync helpers
This commit is contained in:
parent
95afb40491
commit
e571d4a141
|
@ -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():
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue