354 lines
15 KiB
Python
354 lines
15 KiB
Python
#
|
|
# Copyright 2012 eNovance <licensing@enovance.com>
|
|
# Copyright 2012 Red Hat, Inc
|
|
# Copyright 2014 Cisco Systems, Inc
|
|
#
|
|
# 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 mock
|
|
|
|
from ceilometer.compute.pollsters import disk
|
|
from ceilometer.compute.virt import inspector as virt_inspector
|
|
from ceilometer.polling import manager
|
|
from ceilometer.tests.unit.compute.pollsters import base
|
|
|
|
|
|
class TestBaseDiskIO(base.TestPollsterBase):
|
|
|
|
TYPE = 'cumulative'
|
|
|
|
def setUp(self):
|
|
super(TestBaseDiskIO, self).setUp()
|
|
self.instance = self._get_fake_instances()
|
|
|
|
@staticmethod
|
|
def _get_fake_instances():
|
|
instances = []
|
|
for i in [1, 2]:
|
|
instance = mock.MagicMock()
|
|
instance.name = 'instance-%s' % i
|
|
setattr(instance, 'OS-EXT-SRV-ATTR:instance_name',
|
|
instance.name)
|
|
instance.id = i
|
|
instance.flavor = {'name': 'm1.small', 'id': 2, 'vcpus': 1,
|
|
'ram': 512, 'disk': 20, 'ephemeral': 0}
|
|
instance.status = 'active'
|
|
instances.append(instance)
|
|
return instances
|
|
|
|
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
|
def _check_get_samples(self, factory, name, expected_count=2):
|
|
pollster = factory(self.CONF)
|
|
|
|
mgr = manager.AgentManager(0, self.CONF)
|
|
cache = {}
|
|
samples = list(pollster.get_samples(mgr, cache, self.instance))
|
|
self.assertIsNotEmpty(samples)
|
|
cache_key = pollster.inspector_method
|
|
self.assertIn(cache_key, cache)
|
|
for instance in self.instance:
|
|
self.assertIn(instance.id, cache[cache_key])
|
|
self.assertEqual(set([name]), set([s.name for s in samples]))
|
|
|
|
match = [s for s in samples if s.name == name]
|
|
self.assertEqual(len(match), expected_count,
|
|
'missing counter %s' % name)
|
|
return match
|
|
|
|
def _check_aggregate_samples(self, factory, name,
|
|
expected_volume,
|
|
expected_device=None):
|
|
match = self._check_get_samples(factory, name)
|
|
self.assertEqual(expected_volume, match[0].volume)
|
|
self.assertEqual(self.TYPE, match[0].type)
|
|
if expected_device is not None:
|
|
self.assertEqual(set(expected_device),
|
|
set(match[0].resource_metadata.get('device')))
|
|
instances = [i.id for i in self.instance]
|
|
for m in match:
|
|
self.assertIn(m.resource_id, instances)
|
|
|
|
def _check_per_device_samples(self, factory, name,
|
|
expected_volume,
|
|
expected_device=None):
|
|
match = self._check_get_samples(factory, name, expected_count=4)
|
|
match_dict = {}
|
|
for m in match:
|
|
match_dict[m.resource_id] = m
|
|
for instance in self.instance:
|
|
key = "%s-%s" % (instance.id, expected_device)
|
|
self.assertEqual(expected_volume,
|
|
match_dict[key].volume)
|
|
self.assertEqual(self.TYPE, match_dict[key].type)
|
|
|
|
self.assertEqual(key, match_dict[key].resource_id)
|
|
|
|
|
|
class TestDiskPollsters(TestBaseDiskIO):
|
|
|
|
DISKS = [
|
|
virt_inspector.DiskStats(device='vda1',
|
|
read_bytes=1, read_requests=2,
|
|
write_bytes=3, write_requests=4,
|
|
errors=-1,
|
|
rd_total_times=100,
|
|
wr_total_times=200,),
|
|
virt_inspector.DiskStats(device='vda2',
|
|
read_bytes=2, read_requests=3,
|
|
write_bytes=5, write_requests=7,
|
|
errors=-1,
|
|
rd_total_times=300,
|
|
wr_total_times=400,),
|
|
]
|
|
|
|
def setUp(self):
|
|
super(TestDiskPollsters, self).setUp()
|
|
self.inspector.inspect_disks = mock.Mock(return_value=self.DISKS)
|
|
|
|
def test_disk_read_requests(self):
|
|
self._check_aggregate_samples(disk.ReadRequestsPollster,
|
|
'disk.read.requests', 5,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_disk_read_bytes(self):
|
|
self._check_aggregate_samples(disk.ReadBytesPollster,
|
|
'disk.read.bytes', 3,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_disk_write_requests(self):
|
|
self._check_aggregate_samples(disk.WriteRequestsPollster,
|
|
'disk.write.requests', 11,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_disk_write_bytes(self):
|
|
self._check_aggregate_samples(disk.WriteBytesPollster,
|
|
'disk.write.bytes', 8,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_per_disk_read_requests(self):
|
|
self._check_per_device_samples(disk.PerDeviceReadRequestsPollster,
|
|
'disk.device.read.requests', 2,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceReadRequestsPollster,
|
|
'disk.device.read.requests', 3,
|
|
'vda2')
|
|
|
|
def test_per_disk_write_requests(self):
|
|
self._check_per_device_samples(disk.PerDeviceWriteRequestsPollster,
|
|
'disk.device.write.requests', 4,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceWriteRequestsPollster,
|
|
'disk.device.write.requests', 7,
|
|
'vda2')
|
|
|
|
def test_per_disk_read_bytes(self):
|
|
self._check_per_device_samples(disk.PerDeviceReadBytesPollster,
|
|
'disk.device.read.bytes', 1,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceReadBytesPollster,
|
|
'disk.device.read.bytes', 2,
|
|
'vda2')
|
|
|
|
def test_per_disk_write_bytes(self):
|
|
self._check_per_device_samples(disk.PerDeviceWriteBytesPollster,
|
|
'disk.device.write.bytes', 3,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceWriteBytesPollster,
|
|
'disk.device.write.bytes', 5,
|
|
'vda2')
|
|
|
|
def test_per_device_read_latency(self):
|
|
self._check_per_device_samples(
|
|
disk.PerDeviceDiskReadLatencyPollster,
|
|
'disk.device.read.latency', 100, 'vda1')
|
|
|
|
self._check_per_device_samples(
|
|
disk.PerDeviceDiskReadLatencyPollster,
|
|
'disk.device.read.latency', 300, 'vda2')
|
|
|
|
def test_per_device_write_latency(self):
|
|
self._check_per_device_samples(
|
|
disk.PerDeviceDiskWriteLatencyPollster,
|
|
'disk.device.write.latency', 200, 'vda1')
|
|
|
|
self._check_per_device_samples(
|
|
disk.PerDeviceDiskWriteLatencyPollster,
|
|
'disk.device.write.latency', 400, 'vda2')
|
|
|
|
|
|
class TestDiskRatePollsters(TestBaseDiskIO):
|
|
|
|
DISKS = [
|
|
virt_inspector.DiskRateStats("disk1", 1024, 300, 5120, 700),
|
|
virt_inspector.DiskRateStats("disk2", 2048, 400, 6144, 800)
|
|
]
|
|
TYPE = 'gauge'
|
|
|
|
def setUp(self):
|
|
super(TestDiskRatePollsters, self).setUp()
|
|
self.inspector.inspect_disk_rates = mock.Mock(return_value=self.DISKS)
|
|
|
|
def test_disk_read_bytes_rate(self):
|
|
self._check_aggregate_samples(disk.ReadBytesRatePollster,
|
|
'disk.read.bytes.rate', 3072,
|
|
expected_device=['disk1', 'disk2'])
|
|
|
|
def test_disk_read_requests_rate(self):
|
|
self._check_aggregate_samples(disk.ReadRequestsRatePollster,
|
|
'disk.read.requests.rate', 700,
|
|
expected_device=['disk1', 'disk2'])
|
|
|
|
def test_disk_write_bytes_rate(self):
|
|
self._check_aggregate_samples(disk.WriteBytesRatePollster,
|
|
'disk.write.bytes.rate', 11264,
|
|
expected_device=['disk1', 'disk2'])
|
|
|
|
def test_disk_write_requests_rate(self):
|
|
self._check_aggregate_samples(disk.WriteRequestsRatePollster,
|
|
'disk.write.requests.rate', 1500,
|
|
expected_device=['disk1', 'disk2'])
|
|
|
|
def test_per_disk_read_bytes_rate(self):
|
|
self._check_per_device_samples(disk.PerDeviceReadBytesRatePollster,
|
|
'disk.device.read.bytes.rate',
|
|
1024, 'disk1')
|
|
self._check_per_device_samples(disk.PerDeviceReadBytesRatePollster,
|
|
'disk.device.read.bytes.rate',
|
|
2048, 'disk2')
|
|
|
|
def test_per_disk_read_requests_rate(self):
|
|
self._check_per_device_samples(disk.PerDeviceReadRequestsRatePollster,
|
|
'disk.device.read.requests.rate',
|
|
300, 'disk1')
|
|
self._check_per_device_samples(disk.PerDeviceReadRequestsRatePollster,
|
|
'disk.device.read.requests.rate',
|
|
400, 'disk2')
|
|
|
|
def test_per_disk_write_bytes_rate(self):
|
|
self._check_per_device_samples(disk.PerDeviceWriteBytesRatePollster,
|
|
'disk.device.write.bytes.rate',
|
|
5120, 'disk1')
|
|
self._check_per_device_samples(disk.PerDeviceWriteBytesRatePollster,
|
|
'disk.device.write.bytes.rate', 6144,
|
|
'disk2')
|
|
|
|
def test_per_disk_write_requests_rate(self):
|
|
self._check_per_device_samples(disk.PerDeviceWriteRequestsRatePollster,
|
|
'disk.device.write.requests.rate', 700,
|
|
'disk1')
|
|
self._check_per_device_samples(disk.PerDeviceWriteRequestsRatePollster,
|
|
'disk.device.write.requests.rate', 800,
|
|
'disk2')
|
|
|
|
|
|
class TestDiskLatencyPollsters(TestBaseDiskIO):
|
|
|
|
DISKS = [
|
|
virt_inspector.DiskLatencyStats("disk1", 1),
|
|
virt_inspector.DiskLatencyStats("disk2", 2)
|
|
]
|
|
TYPE = 'gauge'
|
|
|
|
def setUp(self):
|
|
super(TestDiskLatencyPollsters, self).setUp()
|
|
self.inspector.inspect_disk_latency = mock.Mock(
|
|
return_value=self.DISKS)
|
|
|
|
def test_disk_latency(self):
|
|
self._check_aggregate_samples(disk.DiskLatencyPollster,
|
|
'disk.latency', 3)
|
|
|
|
def test_per_device_latency(self):
|
|
self._check_per_device_samples(disk.PerDeviceDiskLatencyPollster,
|
|
'disk.device.latency', 1, 'disk1')
|
|
|
|
self._check_per_device_samples(disk.PerDeviceDiskLatencyPollster,
|
|
'disk.device.latency', 2, 'disk2')
|
|
|
|
|
|
class TestDiskIOPSPollsters(TestBaseDiskIO):
|
|
|
|
DISKS = [
|
|
virt_inspector.DiskIOPSStats("disk1", 10),
|
|
virt_inspector.DiskIOPSStats("disk2", 20),
|
|
]
|
|
TYPE = 'gauge'
|
|
|
|
def setUp(self):
|
|
super(TestDiskIOPSPollsters, self).setUp()
|
|
self.inspector.inspect_disk_iops = mock.Mock(return_value=self.DISKS)
|
|
|
|
def test_disk_iops(self):
|
|
self._check_aggregate_samples(disk.DiskIOPSPollster,
|
|
'disk.iops', 30)
|
|
|
|
def test_per_device_iops(self):
|
|
self._check_per_device_samples(disk.PerDeviceDiskIOPSPollster,
|
|
'disk.device.iops', 10, 'disk1')
|
|
|
|
self._check_per_device_samples(disk.PerDeviceDiskIOPSPollster,
|
|
'disk.device.iops', 20, 'disk2')
|
|
|
|
|
|
class TestDiskInfoPollsters(TestBaseDiskIO):
|
|
|
|
DISKS = [
|
|
virt_inspector.DiskInfo(device="vda1", capacity=3,
|
|
allocation=2, physical=1),
|
|
virt_inspector.DiskInfo(device="vda2", capacity=4,
|
|
allocation=3, physical=2),
|
|
]
|
|
TYPE = 'gauge'
|
|
|
|
def setUp(self):
|
|
super(TestDiskInfoPollsters, self).setUp()
|
|
self.inspector.inspect_disk_info = mock.Mock(return_value=self.DISKS)
|
|
|
|
def test_disk_capacity(self):
|
|
self._check_aggregate_samples(disk.CapacityPollster,
|
|
'disk.capacity', 7,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_disk_allocation(self):
|
|
self._check_aggregate_samples(disk.AllocationPollster,
|
|
'disk.allocation', 5,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_disk_physical(self):
|
|
self._check_aggregate_samples(disk.PhysicalPollster,
|
|
'disk.usage', 3,
|
|
expected_device=['vda1', 'vda2'])
|
|
|
|
def test_per_disk_capacity(self):
|
|
self._check_per_device_samples(disk.PerDeviceCapacityPollster,
|
|
'disk.device.capacity', 3,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceCapacityPollster,
|
|
'disk.device.capacity', 4,
|
|
'vda2')
|
|
|
|
def test_per_disk_allocation(self):
|
|
self._check_per_device_samples(disk.PerDeviceAllocationPollster,
|
|
'disk.device.allocation', 2,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDeviceAllocationPollster,
|
|
'disk.device.allocation', 3,
|
|
'vda2')
|
|
|
|
def test_per_disk_physical(self):
|
|
self._check_per_device_samples(disk.PerDevicePhysicalPollster,
|
|
'disk.device.usage', 1,
|
|
'vda1')
|
|
self._check_per_device_samples(disk.PerDevicePhysicalPollster,
|
|
'disk.device.usage', 2,
|
|
'vda2')
|