91 lines
3.2 KiB
Python
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'
|