Merge lp:~gnuoy/charm-helpers/hugepages into lp:charm-helpers

Proposed by Liam Young on 2015-08-17
Status: Merged
Merged at revision: 432
Proposed branch: lp:~gnuoy/charm-helpers/hugepages
Merge into: lp:charm-helpers
Prerequisite: lp:~gnuoy/charm-helpers/user-exists-fstab-mount
Diff against target: 153 lines (+144/-0)
2 files modified
charmhelpers/core/hugepage.py (+62/-0)
tests/core/test_hugepage.py (+82/-0)
To merge this branch: bzr merge lp:~gnuoy/charm-helpers/hugepages
Reviewer Review Type Date Requested Status
Chris Glass (community) 2015-08-17 Approve on 2015-08-19
Review via email: mp+268214@code.launchpad.net
To post a comment you must log in.
Chris Glass (tribaal) wrote :

Looks good generally, I have a concern inline I'd like you to at least look at (maybe not implement in this branch, though).

Chris Glass (tribaal) wrote :

It seems I overlooked a crucial piece of information in my previous comment.

All good - +1 :)

review: Approve
lp:~gnuoy/charm-helpers/hugepages updated on 2015-08-19
431. By Liam Young on 2015-08-19

Remove unnecessary shebang

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file 'charmhelpers/core/hugepage.py'
2--- charmhelpers/core/hugepage.py 1970-01-01 00:00:00 +0000
3+++ charmhelpers/core/hugepage.py 2015-08-19 09:41:08 +0000
4@@ -0,0 +1,62 @@
5+# -*- coding: utf-8 -*-
6+
7+# Copyright 2014-2015 Canonical Limited.
8+#
9+# This file is part of charm-helpers.
10+#
11+# charm-helpers is free software: you can redistribute it and/or modify
12+# it under the terms of the GNU Lesser General Public License version 3 as
13+# published by the Free Software Foundation.
14+#
15+# charm-helpers is distributed in the hope that it will be useful,
16+# but WITHOUT ANY WARRANTY; without even the implied warranty of
17+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18+# GNU Lesser General Public License for more details.
19+#
20+# You should have received a copy of the GNU Lesser General Public License
21+# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
22+
23+import yaml
24+from charmhelpers.core import fstab
25+from charmhelpers.core import sysctl
26+from charmhelpers.core.host import (
27+ add_group,
28+ add_user_to_group,
29+ fstab_mount,
30+ mkdir,
31+)
32+
33+
34+def hugepage_support(user, group='hugetlb', nr_hugepages=256,
35+ max_map_count=65536, mnt_point='/run/hugepages/kvm',
36+ pagesize='2MB', mount=True):
37+ """Enable hugepages on system.
38+
39+ Args:
40+ user (str) -- Username to allow access to hugepages to
41+ group (str) -- Group name to own hugepages
42+ nr_hugepages (int) -- Number of pages to reserve
43+ max_map_count (int) -- Number of Virtual Memory Areas a process can own
44+ mnt_point (str) -- Directory to mount hugepages on
45+ pagesize (str) -- Size of hugepages
46+ mount (bool) -- Whether to Mount hugepages
47+ """
48+ group_info = add_group(group)
49+ gid = group_info.gr_gid
50+ add_user_to_group(user, group)
51+ sysctl_settings = {
52+ 'vm.nr_hugepages': nr_hugepages,
53+ 'vm.max_map_count': max_map_count,
54+ 'vm.hugetlb_shm_group': gid,
55+ }
56+ sysctl.create(yaml.dump(sysctl_settings), '/etc/sysctl.d/10-hugepage.conf')
57+ mkdir(mnt_point, owner='root', group='root', perms=0o755, force=False)
58+ lfstab = fstab.Fstab()
59+ fstab_entry = lfstab.get_entry_by_attr('mountpoint', mnt_point)
60+ if fstab_entry:
61+ lfstab.remove_entry(fstab_entry)
62+ entry = lfstab.Entry('nodev', mnt_point, 'hugetlbfs',
63+ 'mode=1770,gid={},pagesize={}'.format(gid, pagesize), 0, 0)
64+ lfstab.add_entry(entry)
65+ if mount:
66+ fstab_mount(mnt_point)
67
68=== added file 'tests/core/test_hugepage.py'
69--- tests/core/test_hugepage.py 1970-01-01 00:00:00 +0000
70+++ tests/core/test_hugepage.py 2015-08-19 09:41:08 +0000
71@@ -0,0 +1,82 @@
72+from testtools import TestCase
73+from mock import patch
74+from charmhelpers.core import hugepage
75+
76+TO_PATCH = [
77+ 'fstab',
78+ 'add_group',
79+ 'add_user_to_group',
80+ 'sysctl',
81+ 'fstab_mount',
82+ 'mkdir',
83+]
84+
85+
86+class Group(object):
87+ def __init__(self):
88+ self.gr_gid = '1010'
89+
90+
91+class HugepageTests(TestCase):
92+
93+ def setUp(self):
94+ super(HugepageTests, self).setUp()
95+ for m in TO_PATCH:
96+ setattr(self, m, self._patch(m))
97+
98+ def _patch(self, method):
99+ _m = patch('charmhelpers.core.hugepage.' + method)
100+ mock = _m.start()
101+ self.addCleanup(_m.stop)
102+ return mock
103+
104+ def test_hugepage_support(self):
105+ self.add_group.return_value = Group()
106+ self.fstab.Fstab().get_entry_by_attr.return_value = 'old fstab entry'
107+ self.fstab.Fstab().Entry.return_value = 'new fstab entry'
108+ hugepage.hugepage_support('nova')
109+ sysctl_expect = ("{vm.hugetlb_shm_group: '1010', "
110+ "vm.max_map_count: 65536, vm.nr_hugepages: 256}\n")
111+ self.sysctl.create.assert_called_with(sysctl_expect,
112+ '/etc/sysctl.d/10-hugepage.conf')
113+ self.mkdir.assert_called_with('/run/hugepages/kvm', owner='root',
114+ group='root', perms=0o755, force=False)
115+ self.fstab.Fstab().remove_entry.assert_called_with('old fstab entry')
116+ self.fstab.Fstab().Entry.assert_called_with(
117+ 'nodev', '/run/hugepages/kvm', 'hugetlbfs',
118+ 'mode=1770,gid=1010,pagesize=2MB', 0, 0)
119+ self.fstab.Fstab().add_entry.assert_called_with('new fstab entry')
120+ self.fstab_mount.assert_called_with('/run/hugepages/kvm')
121+
122+ def test_hugepage_support_new_mnt(self):
123+ self.add_group.return_value = Group()
124+ self.fstab.Fstab().get_entry_by_attr.return_value = None
125+ self.fstab.Fstab().Entry.return_value = 'new fstab entry'
126+ hugepage.hugepage_support('nova')
127+ self.assertEqual(self.fstab.Fstab().remove_entry.call_args_list, [])
128+
129+ def test_hugepage_support_no_automount(self):
130+ self.add_group.return_value = Group()
131+ self.fstab.Fstab().get_entry_by_attr.return_value = None
132+ self.fstab.Fstab().Entry.return_value = 'new fstab entry'
133+ hugepage.hugepage_support('nova', mount=False)
134+ self.assertEqual(self.fstab_mount.call_args_list, [])
135+
136+ def test_hugepage_support_nodefaults(self):
137+ self.add_group.return_value = Group()
138+ self.fstab.Fstab().get_entry_by_attr.return_value = 'old fstab entry'
139+ self.fstab.Fstab().Entry.return_value = 'new fstab entry'
140+ hugepage.hugepage_support(
141+ 'nova', group='neutron', nr_hugepages=512, max_map_count=70000,
142+ mnt_point='/hugepages', pagesize='1GB', mount=False)
143+ sysctl_expect = ("{vm.hugetlb_shm_group: '1010', "
144+ "vm.max_map_count: 70000, vm.nr_hugepages: 512}\n")
145+ self.sysctl.create.assert_called_with(sysctl_expect,
146+ '/etc/sysctl.d/10-hugepage.conf')
147+ self.mkdir.assert_called_with('/hugepages', owner='root',
148+ group='root', perms=0o755, force=False)
149+ self.fstab.Fstab().remove_entry.assert_called_with('old fstab entry')
150+ self.fstab.Fstab().Entry.assert_called_with(
151+ 'nodev', '/hugepages', 'hugetlbfs',
152+ 'mode=1770,gid=1010,pagesize=1GB', 0, 0)
153+ self.fstab.Fstab().add_entry.assert_called_with('new fstab entry')

Subscribers

People subscribed via source and target branches