Charmed-Kubernetes/nrpe/mod/charmhelpers/tests/contrib/storage/test_bcache.py

91 lines
3.2 KiB
Python

# Copyright 2017 Canonical Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import os
import shutil
import json
from mock import patch
from testtools import TestCase
from tempfile import mkdtemp
from charmhelpers.contrib.storage.linux import bcache
test_stats = {
'bypassed': '128G\n',
'cache_bypass_hits': '1132623\n',
'cache_bypass_misses': '0\n',
'cache_hit_ratio': '64\n',
'cache_hits': '12177090\n',
'cache_miss_collisions': '7091\n',
'cache_misses': '6717011\n',
'cache_readaheads': '0\n',
}
tmpdir = 'bcache-stats-test.'
cacheset = 'abcde'
cachedev = 'sdfoo'
class BcacheTestCase(TestCase):
def setUp(self):
super(BcacheTestCase, self).setUp()
self.sysfs = sysfs = mkdtemp(prefix=tmpdir)
self.addCleanup(shutil.rmtree, sysfs)
p = patch('charmhelpers.contrib.storage.linux.bcache.SYSFS', new=sysfs)
p.start()
self.addCleanup(p.stop)
self.cacheset = '{}/fs/bcache/{}'.format(sysfs, cacheset)
os.makedirs(self.cacheset)
self.devcache = '{}/block/{}/bcache'.format(sysfs, cachedev)
for n in ['register', 'register_quiet']:
with open('{}/fs/bcache/{}'.format(sysfs, n), 'w') as f:
f.write('foo')
for kind in self.cacheset, self.devcache:
for sub in bcache.stats_intervals:
intvaldir = '{}/{}'.format(kind, sub)
os.makedirs(intvaldir)
for fn, val in test_stats.items():
with open(os.path.join(intvaldir, fn), 'w') as f:
f.write(val)
def test_get_bcache_fs(self):
bcachedirs = bcache.get_bcache_fs()
assert len(bcachedirs) == 1
assert next(iter(bcachedirs)).cachepath.endswith('/fs/bcache/abcde')
@patch('charmhelpers.contrib.storage.linux.bcache.log', lambda *args, **kwargs: None)
@patch('charmhelpers.contrib.storage.linux.bcache.os.listdir')
def test_get_bcache_fs_nobcache(self, mock_listdir):
mock_listdir.side_effect = OSError(
'[Errno 2] No such file or directory:...')
bcachedirs = bcache.get_bcache_fs()
assert bcachedirs == []
def test_get_stats_global(self):
out = bcache.get_stats_action(
'global', 'hour')
out = json.loads(out)
assert len(out.keys()) == 1
k = next(iter(out.keys()))
assert k.endswith(cacheset)
assert out[k]['bypassed'] == '128G'
def test_get_stats_dev(self):
out = bcache.get_stats_action(
cachedev, 'hour')
out = json.loads(out)
assert len(out.keys()) == 1
k = next(iter(out.keys()))
assert k.endswith('sdfoo/bcache')
assert out[k]['cache_hit_ratio'] == '64'