[gnuoy,r=coreycb] Sync charm-helpers.
This commit is contained in:
commit
fa28977689
@ -140,7 +140,8 @@ def _get_for_address(address, key):
|
|||||||
if address.version == 4 and netifaces.AF_INET in addresses:
|
if address.version == 4 and netifaces.AF_INET in addresses:
|
||||||
addr = addresses[netifaces.AF_INET][0]['addr']
|
addr = addresses[netifaces.AF_INET][0]['addr']
|
||||||
netmask = addresses[netifaces.AF_INET][0]['netmask']
|
netmask = addresses[netifaces.AF_INET][0]['netmask']
|
||||||
cidr = netaddr.IPNetwork("%s/%s" % (addr, netmask))
|
network = netaddr.IPNetwork("%s/%s" % (addr, netmask))
|
||||||
|
cidr = network.cidr
|
||||||
if address in cidr:
|
if address in cidr:
|
||||||
if key == 'iface':
|
if key == 'iface':
|
||||||
return iface
|
return iface
|
||||||
@ -149,11 +150,14 @@ def _get_for_address(address, key):
|
|||||||
if address.version == 6 and netifaces.AF_INET6 in addresses:
|
if address.version == 6 and netifaces.AF_INET6 in addresses:
|
||||||
for addr in addresses[netifaces.AF_INET6]:
|
for addr in addresses[netifaces.AF_INET6]:
|
||||||
if not addr['addr'].startswith('fe80'):
|
if not addr['addr'].startswith('fe80'):
|
||||||
cidr = netaddr.IPNetwork("%s/%s" % (addr['addr'],
|
network = netaddr.IPNetwork("%s/%s" % (addr['addr'],
|
||||||
addr['netmask']))
|
addr['netmask']))
|
||||||
|
cidr = network.cidr
|
||||||
if address in cidr:
|
if address in cidr:
|
||||||
if key == 'iface':
|
if key == 'iface':
|
||||||
return iface
|
return iface
|
||||||
|
elif key == 'netmask' and cidr:
|
||||||
|
return str(cidr).split('/')[1]
|
||||||
else:
|
else:
|
||||||
return addr[key]
|
return addr[key]
|
||||||
return None
|
return None
|
||||||
|
@ -214,6 +214,12 @@ class Config(dict):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
return (self._prev_dict or {})[key]
|
return (self._prev_dict or {})[key]
|
||||||
|
|
||||||
|
def keys(self):
|
||||||
|
prev_keys = []
|
||||||
|
if self._prev_dict is not None:
|
||||||
|
prev_keys = self._prev_dict.keys()
|
||||||
|
return list(set(prev_keys + dict.keys(self)))
|
||||||
|
|
||||||
def load_previous(self, path=None):
|
def load_previous(self, path=None):
|
||||||
"""Load previous copy of config from disk.
|
"""Load previous copy of config from disk.
|
||||||
|
|
||||||
|
@ -6,13 +6,13 @@
|
|||||||
# Matthew Wedgwood <matthew.wedgwood@canonical.com>
|
# Matthew Wedgwood <matthew.wedgwood@canonical.com>
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import re
|
||||||
import pwd
|
import pwd
|
||||||
import grp
|
import grp
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
import subprocess
|
import subprocess
|
||||||
import hashlib
|
import hashlib
|
||||||
import shutil
|
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
@ -317,7 +317,13 @@ def list_nics(nic_type):
|
|||||||
ip_output = (line for line in ip_output if line)
|
ip_output = (line for line in ip_output if line)
|
||||||
for line in ip_output:
|
for line in ip_output:
|
||||||
if line.split()[1].startswith(int_type):
|
if line.split()[1].startswith(int_type):
|
||||||
interfaces.append(line.split()[1].replace(":", ""))
|
matched = re.search('.*: (bond[0-9]+\.[0-9]+)@.*', line)
|
||||||
|
if matched:
|
||||||
|
interface = matched.groups()[0]
|
||||||
|
else:
|
||||||
|
interface = line.split()[1].replace(":", "")
|
||||||
|
interfaces.append(interface)
|
||||||
|
|
||||||
return interfaces
|
return interfaces
|
||||||
|
|
||||||
|
|
||||||
|
34
hooks/charmhelpers/core/sysctl.py
Normal file
34
hooks/charmhelpers/core/sysctl.py
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
__author__ = 'Jorge Niedbalski R. <jorge.niedbalski@canonical.com>'
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from subprocess import check_call
|
||||||
|
|
||||||
|
from charmhelpers.core.hookenv import (
|
||||||
|
log,
|
||||||
|
DEBUG,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def create(sysctl_dict, sysctl_file):
|
||||||
|
"""Creates a sysctl.conf file from a YAML associative array
|
||||||
|
|
||||||
|
:param sysctl_dict: a dict of sysctl options eg { 'kernel.max_pid': 1337 }
|
||||||
|
:type sysctl_dict: dict
|
||||||
|
:param sysctl_file: path to the sysctl file to be saved
|
||||||
|
:type sysctl_file: str or unicode
|
||||||
|
:returns: None
|
||||||
|
"""
|
||||||
|
sysctl_dict = yaml.load(sysctl_dict)
|
||||||
|
|
||||||
|
with open(sysctl_file, "w") as fd:
|
||||||
|
for key, value in sysctl_dict.items():
|
||||||
|
fd.write("{}={}\n".format(key, value))
|
||||||
|
|
||||||
|
log("Updating sysctl_file: %s values: %s" % (sysctl_file, sysctl_dict),
|
||||||
|
level=DEBUG)
|
||||||
|
|
||||||
|
check_call(["sysctl", "-p", sysctl_file])
|
@ -72,6 +72,7 @@ CLOUD_ARCHIVE_POCKETS = {
|
|||||||
FETCH_HANDLERS = (
|
FETCH_HANDLERS = (
|
||||||
'charmhelpers.fetch.archiveurl.ArchiveUrlFetchHandler',
|
'charmhelpers.fetch.archiveurl.ArchiveUrlFetchHandler',
|
||||||
'charmhelpers.fetch.bzrurl.BzrUrlFetchHandler',
|
'charmhelpers.fetch.bzrurl.BzrUrlFetchHandler',
|
||||||
|
'charmhelpers.fetch.giturl.GitUrlFetchHandler',
|
||||||
)
|
)
|
||||||
|
|
||||||
APT_NO_LOCK = 100 # The return code for "couldn't acquire lock" in APT.
|
APT_NO_LOCK = 100 # The return code for "couldn't acquire lock" in APT.
|
||||||
@ -218,6 +219,7 @@ def add_source(source, key=None):
|
|||||||
pocket for the release.
|
pocket for the release.
|
||||||
'cloud:' may be used to activate official cloud archive pockets,
|
'cloud:' may be used to activate official cloud archive pockets,
|
||||||
such as 'cloud:icehouse'
|
such as 'cloud:icehouse'
|
||||||
|
'distro' may be used as a noop
|
||||||
|
|
||||||
@param key: A key to be added to the system's APT keyring and used
|
@param key: A key to be added to the system's APT keyring and used
|
||||||
to verify the signatures on packages. Ideally, this should be an
|
to verify the signatures on packages. Ideally, this should be an
|
||||||
@ -251,6 +253,8 @@ def add_source(source, key=None):
|
|||||||
release = lsb_release()['DISTRIB_CODENAME']
|
release = lsb_release()['DISTRIB_CODENAME']
|
||||||
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))
|
||||||
|
elif source == 'distro':
|
||||||
|
pass
|
||||||
else:
|
else:
|
||||||
raise SourceConfigError("Unknown source: {!r}".format(source))
|
raise SourceConfigError("Unknown source: {!r}".format(source))
|
||||||
|
|
||||||
|
44
hooks/charmhelpers/fetch/giturl.py
Normal file
44
hooks/charmhelpers/fetch/giturl.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import os
|
||||||
|
from charmhelpers.fetch import (
|
||||||
|
BaseFetchHandler,
|
||||||
|
UnhandledSource
|
||||||
|
)
|
||||||
|
from charmhelpers.core.host import mkdir
|
||||||
|
|
||||||
|
try:
|
||||||
|
from git import Repo
|
||||||
|
except ImportError:
|
||||||
|
from charmhelpers.fetch import apt_install
|
||||||
|
apt_install("python-git")
|
||||||
|
from git import Repo
|
||||||
|
|
||||||
|
|
||||||
|
class GitUrlFetchHandler(BaseFetchHandler):
|
||||||
|
"""Handler for git branches via generic and github URLs"""
|
||||||
|
def can_handle(self, source):
|
||||||
|
url_parts = self.parse_url(source)
|
||||||
|
#TODO (mattyw) no support for ssh git@ yet
|
||||||
|
if url_parts.scheme not in ('http', 'https', 'git'):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
def clone(self, source, dest, branch):
|
||||||
|
if not self.can_handle(source):
|
||||||
|
raise UnhandledSource("Cannot handle {}".format(source))
|
||||||
|
|
||||||
|
repo = Repo.clone_from(source, dest)
|
||||||
|
repo.git.checkout(branch)
|
||||||
|
|
||||||
|
def install(self, source, branch="master"):
|
||||||
|
url_parts = self.parse_url(source)
|
||||||
|
branch_name = url_parts.path.strip("/").split("/")[-1]
|
||||||
|
dest_dir = os.path.join(os.environ.get('CHARM_DIR'), "fetched",
|
||||||
|
branch_name)
|
||||||
|
if not os.path.exists(dest_dir):
|
||||||
|
mkdir(dest_dir, perms=0755)
|
||||||
|
try:
|
||||||
|
self.clone(source, dest_dir, branch)
|
||||||
|
except OSError as e:
|
||||||
|
raise UnhandledSource(e.strerror)
|
||||||
|
return dest_dir
|
Loading…
Reference in New Issue
Block a user