Instantiate inspector in compute manager

As suggested in the review of the original inspector patch
(I20700320dd7e3196507173c780ab598b479e4021), the inspector
lifecycle is now controlled by the compute manager as
opposed to the pollsters.

Change-Id: Ifdef5ab22e7fb224e273dae5dbff3fb4dab10031
This commit is contained in:
Eoghan Glynn 2012-12-11 15:27:51 +00:00
parent c6a093511c
commit 9c8a8e3caa
3 changed files with 42 additions and 53 deletions

View File

@ -16,9 +16,12 @@
# License for the specific language governing permissions and limitations
# under the License.
from stevedore import driver
from ceilometer import extension_manager
from ceilometer import nova_client
from ceilometer.compute.virt import inspector as virt_inspector
from ceilometer.openstack.common import cfg
from ceilometer.openstack.common import log
from ceilometer import publish
@ -28,6 +31,10 @@ OPTS = [
default=[],
help='list of compute agent pollsters to disable',
),
cfg.StrOpt('hypervisor_inspector',
default='libvirt',
help='Inspector to use for inspecting the hypervisor layer',
),
]
cfg.CONF.register_opts(OPTS)
@ -38,6 +45,18 @@ LOG = log.getLogger(__name__)
PLUGIN_NAMESPACE = 'ceilometer.poll.compute'
def get_hypervisor_inspector():
try:
namespace = 'ceilometer.compute.virt'
mgr = driver.DriverManager(namespace,
cfg.CONF.hypervisor_inspector,
invoke_on_load=True)
return mgr.driver
except ImportError as e:
LOG.error("Unable to load the hypervisor inspector: %s" % (e))
return virt_inspector.Inspector()
class AgentManager(object):
def __init__(self):
@ -45,6 +64,7 @@ class AgentManager(object):
namespace=PLUGIN_NAMESPACE,
disabled_names=cfg.CONF.disabled_compute_pollsters,
)
self._inspector = get_hypervisor_inspector()
return
@staticmethod
@ -79,3 +99,7 @@ class AgentManager(object):
for instance in nv.instance_get_all_by_host(cfg.CONF.host):
if getattr(instance, 'OS-EXT-STS:vm_state', None) != 'error':
self.poll_instance(context, instance)
@property
def inspector(self):
return self._inspector

View File

@ -21,26 +21,12 @@
import copy
import datetime
from stevedore import driver
from ceilometer import counter
from ceilometer.compute import plugin
from ceilometer.compute import instance as compute_instance
from ceilometer.compute.virt import inspector as virt_inspector
from ceilometer.openstack.common import cfg
from ceilometer.openstack.common import importutils
from ceilometer.openstack.common import log
from ceilometer.openstack.common import timeutils
OPTS = [
cfg.StrOpt('hypervisor_inspector',
help='Inspector to use for inspecting the hypervisor layer',
default='libvirt')
]
CONF = cfg.CONF
CONF.register_opts(OPTS)
LOG = log.getLogger(__name__)
@ -49,18 +35,6 @@ def _instance_name(instance):
return getattr(instance, 'OS-EXT-SRV-ATTR:instance_name', None)
def get_hypervisor_inspector():
try:
namespace = 'ceilometer.compute.virt'
mgr = driver.DriverManager(namespace,
CONF.hypervisor_inspector,
invoke_on_load=True)
return mgr.driver
except ImportError as e:
LOG.error("Unable to load the hypervisor inspector: %s" % (e))
return virt_inspector.Inspector()
def make_counter_from_instance(instance, name, type, volume):
return counter.Counter(
name=name,
@ -74,16 +48,7 @@ def make_counter_from_instance(instance, name, type, volume):
)
class HypervisorPollster(plugin.ComputePollster):
inspector = None
def __init__(self):
if not HypervisorPollster.inspector:
HypervisorPollster.inspector = get_hypervisor_inspector()
class InstancePollster(HypervisorPollster):
class InstancePollster(plugin.ComputePollster):
def get_counters(self, manager, instance):
yield make_counter_from_instance(instance,
@ -99,7 +64,7 @@ class InstancePollster(HypervisorPollster):
)
class DiskIOPollster(HypervisorPollster):
class DiskIOPollster(plugin.ComputePollster):
LOG = log.getLogger(__name__ + '.diskio')
@ -119,7 +84,7 @@ class DiskIOPollster(HypervisorPollster):
r_requests = 0
w_bytes = 0
w_requests = 0
for disk, info in self.inspector.inspect_disks(instance_name):
for disk, info in manager.inspector.inspect_disks(instance_name):
self.LOG.info(self.DISKIO_USAGE_MESSAGE,
instance, disk.device, info.read_requests,
info.read_bytes, info.write_requests,
@ -154,7 +119,7 @@ class DiskIOPollster(HypervisorPollster):
self.LOG.exception(err)
class CPUPollster(HypervisorPollster):
class CPUPollster(plugin.ComputePollster):
LOG = log.getLogger(__name__ + '.cpu')
@ -181,7 +146,7 @@ class CPUPollster(HypervisorPollster):
self.LOG.info('checking instance %s', instance.id)
instance_name = _instance_name(instance)
try:
cpu_info = self.inspector.inspect_cpus(instance_name)
cpu_info = manager.inspector.inspect_cpus(instance_name)
self.LOG.info("CPUTIME USAGE: %s %d",
instance.__dict__, cpu_info.time)
cpu_util = self.get_cpu_util(instance, cpu_info)
@ -208,7 +173,7 @@ class CPUPollster(HypervisorPollster):
self.LOG.exception(err)
class NetPollster(HypervisorPollster):
class NetPollster(plugin.ComputePollster):
LOG = log.getLogger(__name__ + '.net')
@ -236,7 +201,7 @@ class NetPollster(HypervisorPollster):
instance_name = _instance_name(instance)
self.LOG.info('checking instance %s', instance.id)
try:
for vnic, info in self.inspector.inspect_vnics(instance_name):
for vnic, info in manager.inspector.inspect_vnics(instance_name):
self.LOG.info(self.NET_USAGE_MESSAGE, instance_name,
vnic.name, info.rx_bytes, info.tx_bytes)
yield self.make_vnic_counter(instance,

View File

@ -35,17 +35,15 @@ class TestPollsterBase(test_base.TestCase):
def setUp(self):
super(TestPollsterBase, self).setUp()
self.manager = manager.AgentManager()
self.mox.StubOutWithMock(manager, 'get_hypervisor_inspector')
self.inspector = self.mox.CreateMock(virt_inspector.Inspector)
manager.get_hypervisor_inspector().AndReturn(self.inspector)
self.instance = mock.MagicMock()
self.instance.name = 'instance-00000001'
setattr(self.instance, 'OS-EXT-SRV-ATTR:instance_name',
self.instance.name)
self.instance.id = 1
self.instance.flavor = {'name': 'm1.small', 'id': 2}
self.mox.StubOutWithMock(pollsters, 'get_hypervisor_inspector')
self.inspector = self.mox.CreateMock(virt_inspector.Inspector)
pollsters.get_hypervisor_inspector().AndReturn(self.inspector)
pollsters.HypervisorPollster.inspector = None
class TestInstancePollster(TestPollsterBase):
@ -56,9 +54,9 @@ class TestInstancePollster(TestPollsterBase):
def test_get_counters(self):
self.mox.ReplayAll()
mgr = manager.AgentManager()
pollster = pollsters.InstancePollster()
counters = list(pollster.get_counters(self.manager,
self.instance))
counters = list(pollster.get_counters(mgr, self.instance))
self.assertEquals(len(counters), 2)
self.assertEqual(counters[0].name, 'instance')
self.assertEqual(counters[1].name, 'instance:m1.small')
@ -79,8 +77,9 @@ class TestDiskIOPollster(TestPollsterBase):
self.inspector.inspect_disks(self.instance.name).AndReturn(disks)
self.mox.ReplayAll()
mgr = manager.AgentManager()
pollster = pollsters.DiskIOPollster()
counters = list(pollster.get_counters(self.manager, self.instance))
counters = list(pollster.get_counters(mgr, self.instance))
assert counters
def _verify_disk_metering(name, expected_volume):
@ -124,8 +123,9 @@ class TestNetPollster(TestPollsterBase):
self.inspector.inspect_vnics(self.instance.name).AndReturn(vnics)
self.mox.ReplayAll()
mgr = manager.AgentManager()
pollster = pollsters.NetPollster()
counters = list(pollster.get_counters(self.manager, self.instance))
counters = list(pollster.get_counters(mgr, self.instance))
assert counters
def _verify_vnic_metering(name, ip, expected_volume):
@ -160,11 +160,11 @@ class TestCPUPollster(TestPollsterBase):
virt_inspector.CPUStats(time=2 * (10 ** 6), number=2))
self.mox.ReplayAll()
mgr = manager.AgentManager()
pollster = pollsters.CPUPollster()
def _verify_cpu_metering(zero, expected_time):
counters = list(pollster.get_counters(self.manager,
self.instance))
counters = list(pollster.get_counters(mgr, self.instance))
self.assertEquals(len(counters), 2)
assert counters[0].name == 'cpu_util'
assert (counters[0].volume == 0.0 if zero else