[hopem] synced charm-helpers
This commit is contained in:
parent
4df2213174
commit
1a3c510aae
|
@ -22,4 +22,5 @@ def zap_disk(block_device):
|
||||||
|
|
||||||
:param block_device: str: Full path of block device to clean.
|
:param block_device: str: Full path of block device to clean.
|
||||||
'''
|
'''
|
||||||
check_call(['sgdisk', '--zap-all', block_device])
|
check_call(['sgdisk', '--zap-all', '--clear',
|
||||||
|
'--mbrtogpt', block_device])
|
||||||
|
|
|
@ -8,6 +8,7 @@ import os
|
||||||
import json
|
import json
|
||||||
import yaml
|
import yaml
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import sys
|
||||||
import UserDict
|
import UserDict
|
||||||
from subprocess import CalledProcessError
|
from subprocess import CalledProcessError
|
||||||
|
|
||||||
|
@ -149,6 +150,11 @@ def service_name():
|
||||||
return local_unit().split('/')[0]
|
return local_unit().split('/')[0]
|
||||||
|
|
||||||
|
|
||||||
|
def hook_name():
|
||||||
|
"""The name of the currently executing hook"""
|
||||||
|
return os.path.basename(sys.argv[0])
|
||||||
|
|
||||||
|
|
||||||
@cached
|
@cached
|
||||||
def config(scope=None):
|
def config(scope=None):
|
||||||
"""Juju charm configuration"""
|
"""Juju charm configuration"""
|
||||||
|
|
|
@ -194,7 +194,7 @@ def file_hash(path):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def restart_on_change(restart_map):
|
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
|
||||||
|
@ -219,8 +219,14 @@ def restart_on_change(restart_map):
|
||||||
for path in restart_map:
|
for path in restart_map:
|
||||||
if checksums[path] != file_hash(path):
|
if checksums[path] != file_hash(path):
|
||||||
restarts += restart_map[path]
|
restarts += restart_map[path]
|
||||||
for service_name in list(OrderedDict.fromkeys(restarts)):
|
services_list = list(OrderedDict.fromkeys(restarts))
|
||||||
service('restart', service_name)
|
if not stopstart:
|
||||||
|
for service_name in services_list:
|
||||||
|
service('restart', service_name)
|
||||||
|
else:
|
||||||
|
for action in ['stop', 'start']:
|
||||||
|
for service_name in services_list:
|
||||||
|
service(action, service_name)
|
||||||
return wrapped_f
|
return wrapped_f
|
||||||
return wrap
|
return wrap
|
||||||
|
|
||||||
|
@ -245,3 +251,47 @@ def pwgen(length=None):
|
||||||
random_chars = [
|
random_chars = [
|
||||||
random.choice(alphanumeric_chars) for _ in range(length)]
|
random.choice(alphanumeric_chars) for _ in range(length)]
|
||||||
return(''.join(random_chars))
|
return(''.join(random_chars))
|
||||||
|
|
||||||
|
|
||||||
|
def list_nics(nic_type):
|
||||||
|
'''Return a list of nics of given type(s)'''
|
||||||
|
if isinstance(nic_type, basestring):
|
||||||
|
int_types = [nic_type]
|
||||||
|
else:
|
||||||
|
int_types = nic_type
|
||||||
|
interfaces = []
|
||||||
|
for int_type in int_types:
|
||||||
|
cmd = ['ip', 'addr', 'show', 'label', int_type + '*']
|
||||||
|
ip_output = subprocess.check_output(cmd).split('\n')
|
||||||
|
ip_output = (line for line in ip_output if line)
|
||||||
|
for line in ip_output:
|
||||||
|
if line.split()[1].startswith(int_type):
|
||||||
|
interfaces.append(line.split()[1].replace(":", ""))
|
||||||
|
return interfaces
|
||||||
|
|
||||||
|
|
||||||
|
def set_nic_mtu(nic, mtu):
|
||||||
|
'''Set MTU on a network interface'''
|
||||||
|
cmd = ['ip', 'link', 'set', nic, 'mtu', mtu]
|
||||||
|
subprocess.check_call(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def get_nic_mtu(nic):
|
||||||
|
cmd = ['ip', 'addr', 'show', nic]
|
||||||
|
ip_output = subprocess.check_output(cmd).split('\n')
|
||||||
|
mtu = ""
|
||||||
|
for line in ip_output:
|
||||||
|
words = line.split()
|
||||||
|
if 'mtu' in words:
|
||||||
|
mtu = words[words.index("mtu") + 1]
|
||||||
|
return mtu
|
||||||
|
|
||||||
|
|
||||||
|
def get_nic_hwaddr(nic):
|
||||||
|
cmd = ['ip', '-o', '-0', 'addr', 'show', nic]
|
||||||
|
ip_output = subprocess.check_output(cmd)
|
||||||
|
hwaddr = ""
|
||||||
|
words = ip_output.split()
|
||||||
|
if 'link/ether' in words:
|
||||||
|
hwaddr = words[words.index('link/ether') + 1]
|
||||||
|
return hwaddr
|
||||||
|
|
|
@ -44,8 +44,16 @@ CLOUD_ARCHIVE_POCKETS = {
|
||||||
'precise-havana/updates': 'precise-updates/havana',
|
'precise-havana/updates': 'precise-updates/havana',
|
||||||
'precise-updates/havana': 'precise-updates/havana',
|
'precise-updates/havana': 'precise-updates/havana',
|
||||||
'havana/proposed': 'precise-proposed/havana',
|
'havana/proposed': 'precise-proposed/havana',
|
||||||
'precies-havana/proposed': 'precise-proposed/havana',
|
'precise-havana/proposed': 'precise-proposed/havana',
|
||||||
'precise-proposed/havana': 'precise-proposed/havana',
|
'precise-proposed/havana': 'precise-proposed/havana',
|
||||||
|
# Icehouse
|
||||||
|
'icehouse': 'precise-updates/icehouse',
|
||||||
|
'precise-icehouse': 'precise-updates/icehouse',
|
||||||
|
'precise-icehouse/updates': 'precise-updates/icehouse',
|
||||||
|
'precise-updates/icehouse': 'precise-updates/icehouse',
|
||||||
|
'icehouse/proposed': 'precise-proposed/icehouse',
|
||||||
|
'precise-icehouse/proposed': 'precise-proposed/icehouse',
|
||||||
|
'precise-proposed/icehouse': 'precise-proposed/icehouse',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,6 +97,29 @@ def apt_install(packages, options=None, fatal=False):
|
||||||
subprocess.call(cmd, env=env)
|
subprocess.call(cmd, env=env)
|
||||||
|
|
||||||
|
|
||||||
|
def apt_upgrade(options=None, fatal=False, dist=False):
|
||||||
|
"""Upgrade all packages"""
|
||||||
|
if options is None:
|
||||||
|
options = ['--option=Dpkg::Options::=--force-confold']
|
||||||
|
|
||||||
|
cmd = ['apt-get', '--assume-yes']
|
||||||
|
cmd.extend(options)
|
||||||
|
if dist:
|
||||||
|
cmd.append('dist-upgrade')
|
||||||
|
else:
|
||||||
|
cmd.append('upgrade')
|
||||||
|
log("Upgrading with options: {}".format(options))
|
||||||
|
|
||||||
|
env = os.environ.copy()
|
||||||
|
if 'DEBIAN_FRONTEND' not in env:
|
||||||
|
env['DEBIAN_FRONTEND'] = 'noninteractive'
|
||||||
|
|
||||||
|
if fatal:
|
||||||
|
subprocess.check_call(cmd, env=env)
|
||||||
|
else:
|
||||||
|
subprocess.call(cmd, env=env)
|
||||||
|
|
||||||
|
|
||||||
def apt_update(fatal=False):
|
def apt_update(fatal=False):
|
||||||
"""Update local apt cache"""
|
"""Update local apt cache"""
|
||||||
cmd = ['apt-get', 'update']
|
cmd = ['apt-get', 'update']
|
||||||
|
@ -127,8 +158,12 @@ def apt_hold(packages, fatal=False):
|
||||||
|
|
||||||
|
|
||||||
def add_source(source, key=None):
|
def add_source(source, key=None):
|
||||||
|
if source is None:
|
||||||
|
log('Source is not present. Skipping')
|
||||||
|
return
|
||||||
|
|
||||||
if (source.startswith('ppa:') or
|
if (source.startswith('ppa:') or
|
||||||
source.startswith('http:') or
|
source.startswith('http') or
|
||||||
source.startswith('deb ') or
|
source.startswith('deb ') or
|
||||||
source.startswith('cloud-archive:')):
|
source.startswith('cloud-archive:')):
|
||||||
subprocess.check_call(['add-apt-repository', '--yes', source])
|
subprocess.check_call(['add-apt-repository', '--yes', source])
|
||||||
|
@ -148,7 +183,9 @@ def add_source(source, key=None):
|
||||||
with open('/etc/apt/sources.list.d/proposed.list', 'w') as apt:
|
with open('/etc/apt/sources.list.d/proposed.list', 'w') as apt:
|
||||||
apt.write(PROPOSED_POCKET.format(release))
|
apt.write(PROPOSED_POCKET.format(release))
|
||||||
if key:
|
if key:
|
||||||
subprocess.check_call(['apt-key', 'import', key])
|
subprocess.check_call(['apt-key', 'adv', '--keyserver',
|
||||||
|
'keyserver.ubuntu.com', '--recv',
|
||||||
|
key])
|
||||||
|
|
||||||
|
|
||||||
class SourceConfigError(Exception):
|
class SourceConfigError(Exception):
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import os
|
import os
|
||||||
import urllib2
|
import urllib2
|
||||||
|
import urlparse
|
||||||
|
|
||||||
from charmhelpers.fetch import (
|
from charmhelpers.fetch import (
|
||||||
BaseFetchHandler,
|
BaseFetchHandler,
|
||||||
UnhandledSource
|
UnhandledSource
|
||||||
|
@ -24,6 +26,19 @@ class ArchiveUrlFetchHandler(BaseFetchHandler):
|
||||||
def download(self, source, dest):
|
def download(self, source, dest):
|
||||||
# propogate all exceptions
|
# propogate all exceptions
|
||||||
# URLError, OSError, etc
|
# URLError, OSError, etc
|
||||||
|
proto, netloc, path, params, query, fragment = urlparse.urlparse(source)
|
||||||
|
if proto in ('http', 'https'):
|
||||||
|
auth, barehost = urllib2.splituser(netloc)
|
||||||
|
if auth is not None:
|
||||||
|
source = urlparse.urlunparse((proto, barehost, path, params, query, fragment))
|
||||||
|
username, password = urllib2.splitpasswd(auth)
|
||||||
|
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
|
||||||
|
# Realm is set to None in add_password to force the username and password
|
||||||
|
# to be used whatever the realm
|
||||||
|
passman.add_password(None, source, username, password)
|
||||||
|
authhandler = urllib2.HTTPBasicAuthHandler(passman)
|
||||||
|
opener = urllib2.build_opener(authhandler)
|
||||||
|
urllib2.install_opener(opener)
|
||||||
response = urllib2.urlopen(source)
|
response = urllib2.urlopen(source)
|
||||||
try:
|
try:
|
||||||
with open(dest, 'w') as dest_file:
|
with open(dest, 'w') as dest_file:
|
||||||
|
|
Loading…
Reference in New Issue