Liberty changes
This commit is contained in:
parent
c536bc7a28
commit
364ac8e1a0
0
hooks/charmhelpers/contrib/mellanox/__init__.py
Normal file
0
hooks/charmhelpers/contrib/mellanox/__init__.py
Normal file
151
hooks/charmhelpers/contrib/mellanox/infiniband.py
Normal file
151
hooks/charmhelpers/contrib/mellanox/infiniband.py
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2014-2015 Canonical Limited.
|
||||||
|
#
|
||||||
|
# This file is part of charm-helpers.
|
||||||
|
#
|
||||||
|
# charm-helpers is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# charm-helpers is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
__author__ = "Jorge Niedbalski <jorge.niedbalski@canonical.com>"
|
||||||
|
|
||||||
|
from charmhelpers.fetch import (
|
||||||
|
apt_install,
|
||||||
|
apt_update,
|
||||||
|
)
|
||||||
|
|
||||||
|
from charmhelpers.core.hookenv import (
|
||||||
|
log,
|
||||||
|
INFO,
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
from netifaces import interfaces as network_interfaces
|
||||||
|
except ImportError:
|
||||||
|
apt_install('python-netifaces')
|
||||||
|
from netifaces import interfaces as network_interfaces
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
from charmhelpers.core.kernel import modprobe
|
||||||
|
|
||||||
|
REQUIRED_MODULES = (
|
||||||
|
"mlx4_ib",
|
||||||
|
"mlx4_en",
|
||||||
|
"mlx4_core",
|
||||||
|
"ib_ipath",
|
||||||
|
"ib_mthca",
|
||||||
|
"ib_srpt",
|
||||||
|
"ib_srp",
|
||||||
|
"ib_ucm",
|
||||||
|
"ib_isert",
|
||||||
|
"ib_iser",
|
||||||
|
"ib_ipoib",
|
||||||
|
"ib_cm",
|
||||||
|
"ib_uverbs"
|
||||||
|
"ib_umad",
|
||||||
|
"ib_sa",
|
||||||
|
"ib_mad",
|
||||||
|
"ib_core",
|
||||||
|
"ib_addr",
|
||||||
|
"rdma_ucm",
|
||||||
|
)
|
||||||
|
|
||||||
|
REQUIRED_PACKAGES = (
|
||||||
|
"ibutils",
|
||||||
|
"infiniband-diags",
|
||||||
|
"ibverbs-utils",
|
||||||
|
)
|
||||||
|
|
||||||
|
IPOIB_DRIVERS = (
|
||||||
|
"ib_ipoib",
|
||||||
|
)
|
||||||
|
|
||||||
|
ABI_VERSION_FILE = "/sys/class/infiniband_mad/abi_version"
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceInfo(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def install_packages():
|
||||||
|
apt_update()
|
||||||
|
apt_install(REQUIRED_PACKAGES, fatal=True)
|
||||||
|
|
||||||
|
|
||||||
|
def load_modules():
|
||||||
|
for module in REQUIRED_MODULES:
|
||||||
|
modprobe(module, persist=True)
|
||||||
|
|
||||||
|
|
||||||
|
def is_enabled():
|
||||||
|
"""Check if infiniband is loaded on the system"""
|
||||||
|
return os.path.exists(ABI_VERSION_FILE)
|
||||||
|
|
||||||
|
|
||||||
|
def stat():
|
||||||
|
"""Return full output of ibstat"""
|
||||||
|
return subprocess.check_output(["ibstat"])
|
||||||
|
|
||||||
|
|
||||||
|
def devices():
|
||||||
|
"""Returns a list of IB enabled devices"""
|
||||||
|
return subprocess.check_output(['ibstat', '-l']).splitlines()
|
||||||
|
|
||||||
|
|
||||||
|
def device_info(device):
|
||||||
|
"""Returns a DeviceInfo object with the current device settings"""
|
||||||
|
|
||||||
|
status = subprocess.check_output([
|
||||||
|
'ibstat', device, '-s']).splitlines()
|
||||||
|
|
||||||
|
regexes = {
|
||||||
|
"CA type: (.*)": "device_type",
|
||||||
|
"Number of ports: (.*)": "num_ports",
|
||||||
|
"Firmware version: (.*)": "fw_ver",
|
||||||
|
"Hardware version: (.*)": "hw_ver",
|
||||||
|
"Node GUID: (.*)": "node_guid",
|
||||||
|
"System image GUID: (.*)": "sys_guid",
|
||||||
|
}
|
||||||
|
|
||||||
|
device = DeviceInfo()
|
||||||
|
|
||||||
|
for line in status:
|
||||||
|
for expression, key in regexes.items():
|
||||||
|
matches = re.search(expression, line)
|
||||||
|
if matches:
|
||||||
|
setattr(device, key, matches.group(1))
|
||||||
|
|
||||||
|
return device
|
||||||
|
|
||||||
|
|
||||||
|
def ipoib_interfaces():
|
||||||
|
"""Return a list of IPOIB capable ethernet interfaces"""
|
||||||
|
interfaces = []
|
||||||
|
|
||||||
|
for interface in network_interfaces():
|
||||||
|
try:
|
||||||
|
driver = re.search('^driver: (.+)$', subprocess.check_output([
|
||||||
|
'ethtool', '-i',
|
||||||
|
interface]), re.M).group(1)
|
||||||
|
|
||||||
|
if driver in IPOIB_DRIVERS:
|
||||||
|
interfaces.append(interface)
|
||||||
|
except:
|
||||||
|
log("Skipping interface %s" % interface, level=INFO)
|
||||||
|
continue
|
||||||
|
|
||||||
|
return interfaces
|
71
hooks/charmhelpers/core/hugepage.py
Normal file
71
hooks/charmhelpers/core/hugepage.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2014-2015 Canonical Limited.
|
||||||
|
#
|
||||||
|
# This file is part of charm-helpers.
|
||||||
|
#
|
||||||
|
# charm-helpers is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# charm-helpers is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
from charmhelpers.core import fstab
|
||||||
|
from charmhelpers.core import sysctl
|
||||||
|
from charmhelpers.core.host import (
|
||||||
|
add_group,
|
||||||
|
add_user_to_group,
|
||||||
|
fstab_mount,
|
||||||
|
mkdir,
|
||||||
|
)
|
||||||
|
from charmhelpers.core.strutils import bytes_from_string
|
||||||
|
from subprocess import check_output
|
||||||
|
|
||||||
|
|
||||||
|
def hugepage_support(user, group='hugetlb', nr_hugepages=256,
|
||||||
|
max_map_count=65536, mnt_point='/run/hugepages/kvm',
|
||||||
|
pagesize='2MB', mount=True, set_shmmax=False):
|
||||||
|
"""Enable hugepages on system.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user (str) -- Username to allow access to hugepages to
|
||||||
|
group (str) -- Group name to own hugepages
|
||||||
|
nr_hugepages (int) -- Number of pages to reserve
|
||||||
|
max_map_count (int) -- Number of Virtual Memory Areas a process can own
|
||||||
|
mnt_point (str) -- Directory to mount hugepages on
|
||||||
|
pagesize (str) -- Size of hugepages
|
||||||
|
mount (bool) -- Whether to Mount hugepages
|
||||||
|
"""
|
||||||
|
group_info = add_group(group)
|
||||||
|
gid = group_info.gr_gid
|
||||||
|
add_user_to_group(user, group)
|
||||||
|
if max_map_count < 2 * nr_hugepages:
|
||||||
|
max_map_count = 2 * nr_hugepages
|
||||||
|
sysctl_settings = {
|
||||||
|
'vm.nr_hugepages': nr_hugepages,
|
||||||
|
'vm.max_map_count': max_map_count,
|
||||||
|
'vm.hugetlb_shm_group': gid,
|
||||||
|
}
|
||||||
|
if set_shmmax:
|
||||||
|
shmmax_current = int(check_output(['sysctl', '-n', 'kernel.shmmax']))
|
||||||
|
shmmax_minsize = bytes_from_string(pagesize) * nr_hugepages
|
||||||
|
if shmmax_minsize > shmmax_current:
|
||||||
|
sysctl_settings['kernel.shmmax'] = shmmax_minsize
|
||||||
|
sysctl.create(yaml.dump(sysctl_settings), '/etc/sysctl.d/10-hugepage.conf')
|
||||||
|
mkdir(mnt_point, owner='root', group='root', perms=0o755, force=False)
|
||||||
|
lfstab = fstab.Fstab()
|
||||||
|
fstab_entry = lfstab.get_entry_by_attr('mountpoint', mnt_point)
|
||||||
|
if fstab_entry:
|
||||||
|
lfstab.remove_entry(fstab_entry)
|
||||||
|
entry = lfstab.Entry('nodev', mnt_point, 'hugetlbfs',
|
||||||
|
'mode=1770,gid={},pagesize={}'.format(gid, pagesize), 0, 0)
|
||||||
|
lfstab.add_entry(entry)
|
||||||
|
if mount:
|
||||||
|
fstab_mount(mnt_point)
|
68
hooks/charmhelpers/core/kernel.py
Normal file
68
hooks/charmhelpers/core/kernel.py
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Copyright 2014-2015 Canonical Limited.
|
||||||
|
#
|
||||||
|
# This file is part of charm-helpers.
|
||||||
|
#
|
||||||
|
# charm-helpers is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Lesser General Public License version 3 as
|
||||||
|
# published by the Free Software Foundation.
|
||||||
|
#
|
||||||
|
# charm-helpers is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Lesser General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Lesser General Public License
|
||||||
|
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
__author__ = "Jorge Niedbalski <jorge.niedbalski@canonical.com>"
|
||||||
|
|
||||||
|
from charmhelpers.core.hookenv import (
|
||||||
|
log,
|
||||||
|
INFO
|
||||||
|
)
|
||||||
|
|
||||||
|
from subprocess import check_call, check_output
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
def modprobe(module, persist=True):
|
||||||
|
"""Load a kernel module and configure for auto-load on reboot."""
|
||||||
|
cmd = ['modprobe', module]
|
||||||
|
|
||||||
|
log('Loading kernel module %s' % module, level=INFO)
|
||||||
|
|
||||||
|
check_call(cmd)
|
||||||
|
if persist:
|
||||||
|
with open('/etc/modules', 'r+') as modules:
|
||||||
|
if module not in modules.read():
|
||||||
|
modules.write(module)
|
||||||
|
|
||||||
|
|
||||||
|
def rmmod(module, force=False):
|
||||||
|
"""Remove a module from the linux kernel"""
|
||||||
|
cmd = ['rmmod']
|
||||||
|
if force:
|
||||||
|
cmd.append('-f')
|
||||||
|
cmd.append(module)
|
||||||
|
log('Removing kernel module %s' % module, level=INFO)
|
||||||
|
return check_call(cmd)
|
||||||
|
|
||||||
|
|
||||||
|
def lsmod():
|
||||||
|
"""Shows what kernel modules are currently loaded"""
|
||||||
|
return check_output(['lsmod'],
|
||||||
|
universal_newlines=True)
|
||||||
|
|
||||||
|
|
||||||
|
def is_module_loaded(module):
|
||||||
|
"""Checks if a kernel module is already loaded"""
|
||||||
|
matches = re.findall('^%s[ ]+' % module, lsmod(), re.M)
|
||||||
|
return len(matches) > 0
|
||||||
|
|
||||||
|
|
||||||
|
def update_initramfs(version='all'):
|
||||||
|
"""Updates an initramfs image"""
|
||||||
|
return check_call(["update-initramfs", "-k", version, "-u"])
|
Loading…
x
Reference in New Issue
Block a user