Merge "drop kwapi pollster"
This commit is contained in:
commit
ffdb2977e3
@ -1,123 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# 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.
|
||||
|
||||
from keystoneauth1 import exceptions
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log
|
||||
import requests
|
||||
import six
|
||||
|
||||
from ceilometer.agent import plugin_base
|
||||
from ceilometer import keystone_client
|
||||
from ceilometer import sample
|
||||
|
||||
|
||||
LOG = log.getLogger(__name__)
|
||||
|
||||
SERVICE_OPTS = [
|
||||
cfg.StrOpt('kwapi',
|
||||
default='energy',
|
||||
help='Kwapi service type.'),
|
||||
]
|
||||
|
||||
|
||||
class KwapiClient(object):
|
||||
"""Kwapi API client."""
|
||||
|
||||
def __init__(self, conf, url, token=None):
|
||||
"""Initializes client."""
|
||||
self.conf = conf
|
||||
self.url = url
|
||||
self.token = token
|
||||
|
||||
def iter_probes(self):
|
||||
"""Returns a list of dicts describing all probes."""
|
||||
probes_url = self.url + '/probes/'
|
||||
headers = {}
|
||||
if self.token is not None:
|
||||
headers = {'X-Auth-Token': self.token}
|
||||
timeout = self.conf.http_timeout
|
||||
request = requests.get(probes_url, headers=headers, timeout=timeout)
|
||||
message = request.json()
|
||||
probes = message['probes']
|
||||
for key, value in six.iteritems(probes):
|
||||
probe_dict = value
|
||||
probe_dict['id'] = key
|
||||
yield probe_dict
|
||||
|
||||
|
||||
class _Base(plugin_base.PollsterBase):
|
||||
"""Base class for the Kwapi pollster, derived from PollsterBase."""
|
||||
|
||||
@property
|
||||
def default_discovery(self):
|
||||
return 'endpoint:%s' % self.conf.service_types.kwapi
|
||||
|
||||
def get_kwapi_client(self, ksclient, endpoint):
|
||||
"""Returns a KwapiClient configured with the proper url and token."""
|
||||
return KwapiClient(self.conf, endpoint,
|
||||
keystone_client.get_auth_token(ksclient))
|
||||
|
||||
CACHE_KEY_PROBE = 'kwapi.probes'
|
||||
|
||||
def _iter_probes(self, ksclient, cache, endpoint):
|
||||
"""Iterate over all probes."""
|
||||
key = '%s-%s' % (endpoint, self.CACHE_KEY_PROBE)
|
||||
if key not in cache:
|
||||
cache[key] = self._get_probes(ksclient, endpoint)
|
||||
return iter(cache[key])
|
||||
|
||||
def _get_probes(self, ksclient, endpoint):
|
||||
try:
|
||||
client = self.get_kwapi_client(ksclient, endpoint)
|
||||
except exceptions.EndpointNotFound:
|
||||
LOG.debug("Kwapi endpoint not found")
|
||||
return []
|
||||
return list(client.iter_probes())
|
||||
|
||||
|
||||
class EnergyPollster(_Base):
|
||||
"""Measures energy consumption."""
|
||||
def get_samples(self, manager, cache, resources):
|
||||
"""Returns all samples."""
|
||||
for endpoint in resources:
|
||||
for probe in self._iter_probes(manager.keystone, cache, endpoint):
|
||||
yield sample.Sample(
|
||||
name='energy',
|
||||
type=sample.TYPE_CUMULATIVE,
|
||||
unit='kWh',
|
||||
volume=probe['kwh'],
|
||||
user_id=None,
|
||||
project_id=None,
|
||||
resource_id=probe['id'],
|
||||
resource_metadata={}
|
||||
)
|
||||
|
||||
|
||||
class PowerPollster(_Base):
|
||||
"""Measures power consumption."""
|
||||
def get_samples(self, manager, cache, resources):
|
||||
"""Returns all samples."""
|
||||
for endpoint in resources:
|
||||
for probe in self._iter_probes(manager.keystone, cache, endpoint):
|
||||
yield sample.Sample(
|
||||
name='power',
|
||||
type=sample.TYPE_GAUGE,
|
||||
unit='W',
|
||||
volume=probe['w'],
|
||||
user_id=None,
|
||||
project_id=None,
|
||||
resource_id=probe['id'],
|
||||
resource_metadata={}
|
||||
)
|
@ -31,7 +31,6 @@ import ceilometer.dispatcher
|
||||
import ceilometer.dispatcher.file
|
||||
import ceilometer.dispatcher.gnocchi_opts
|
||||
import ceilometer.dispatcher.http
|
||||
import ceilometer.energy.kwapi
|
||||
import ceilometer.event.converter
|
||||
import ceilometer.exchange_control
|
||||
import ceilometer.hardware.discovery
|
||||
@ -114,8 +113,7 @@ def list_opts():
|
||||
('publisher_notifier', ceilometer.publisher.messaging.NOTIFIER_OPTS),
|
||||
('rgw_admin_credentials', ceilometer.objectstore.rgw.CREDENTIAL_OPTS),
|
||||
('service_types',
|
||||
itertools.chain(ceilometer.energy.kwapi.SERVICE_OPTS,
|
||||
ceilometer.image.discovery.SERVICE_OPTS,
|
||||
itertools.chain(ceilometer.image.discovery.SERVICE_OPTS,
|
||||
ceilometer.neutron_client.SERVICE_OPTS,
|
||||
ceilometer.nova_client.SERVICE_OPTS,
|
||||
ceilometer.objectstore.rgw.SERVICE_OPTS,
|
||||
|
@ -1,137 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# 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.
|
||||
|
||||
from keystoneauth1 import exceptions
|
||||
import mock
|
||||
from oslo_config import fixture as fixture_config
|
||||
from oslotest import base
|
||||
from oslotest import mockpatch
|
||||
import six
|
||||
|
||||
from ceilometer.agent import manager
|
||||
from ceilometer.energy import kwapi
|
||||
|
||||
|
||||
PROBE_DICT = {
|
||||
"probes": {
|
||||
"A": {
|
||||
"timestamp": 1357730232.68754,
|
||||
"w": 107.3,
|
||||
"kwh": 0.001058255421506034
|
||||
},
|
||||
"B": {
|
||||
"timestamp": 1357730232.048158,
|
||||
"w": 15.0,
|
||||
"kwh": 0.029019045026169896
|
||||
},
|
||||
"C": {
|
||||
"timestamp": 1357730232.223375,
|
||||
"w": 95.0,
|
||||
"kwh": 0.17361822634312918
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ENDPOINT = 'end://point'
|
||||
|
||||
|
||||
class TestManager(manager.AgentManager):
|
||||
|
||||
def __init__(self, worker_id, conf):
|
||||
super(TestManager, self).__init__(worker_id, conf)
|
||||
self._keystone = mock.Mock()
|
||||
|
||||
|
||||
class _BaseTestCase(base.BaseTestCase):
|
||||
|
||||
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
||||
def setUp(self):
|
||||
super(_BaseTestCase, self).setUp()
|
||||
self.CONF = self.useFixture(fixture_config.Config()).conf
|
||||
self.manager = TestManager(0, self.CONF)
|
||||
|
||||
|
||||
class TestKwapi(_BaseTestCase):
|
||||
|
||||
@staticmethod
|
||||
def fake_get_kwapi_client(ksclient, endpoint):
|
||||
raise exceptions.EndpointNotFound("fake keystone exception")
|
||||
|
||||
def test_endpoint_not_exist(self):
|
||||
with mockpatch.PatchObject(kwapi._Base, 'get_kwapi_client',
|
||||
side_effect=self.fake_get_kwapi_client):
|
||||
pollster = kwapi.EnergyPollster(self.CONF)
|
||||
samples = list(pollster.get_samples(self.manager, {},
|
||||
[ENDPOINT]))
|
||||
|
||||
self.assertEqual(0, len(samples))
|
||||
|
||||
|
||||
class TestEnergyPollster(_BaseTestCase):
|
||||
pollster_cls = kwapi.EnergyPollster
|
||||
unit = 'kwh'
|
||||
|
||||
def setUp(self):
|
||||
super(TestEnergyPollster, self).setUp()
|
||||
self.useFixture(mockpatch.PatchObject(
|
||||
kwapi._Base, '_iter_probes', side_effect=self.fake_iter_probes))
|
||||
|
||||
@staticmethod
|
||||
def fake_iter_probes(ksclient, cache, endpoint):
|
||||
probes = PROBE_DICT['probes']
|
||||
for key, value in six.iteritems(probes):
|
||||
probe_dict = value
|
||||
probe_dict['id'] = key
|
||||
yield probe_dict
|
||||
|
||||
def test_default_discovery(self):
|
||||
pollster = kwapi.EnergyPollster(self.CONF)
|
||||
self.assertEqual('endpoint:energy', pollster.default_discovery)
|
||||
|
||||
def test_sample(self):
|
||||
cache = {}
|
||||
samples = list(self.pollster_cls(self.CONF).get_samples(
|
||||
self.manager, cache, [ENDPOINT]))
|
||||
self.assertEqual(len(PROBE_DICT['probes']), len(samples))
|
||||
samples_by_name = dict((s.resource_id, s) for s in samples)
|
||||
for name, probe in PROBE_DICT['probes'].items():
|
||||
sample = samples_by_name[name]
|
||||
self.assertEqual(probe[self.unit], sample.volume)
|
||||
|
||||
|
||||
class TestPowerPollster(TestEnergyPollster):
|
||||
pollster_cls = kwapi.PowerPollster
|
||||
unit = 'w'
|
||||
|
||||
|
||||
class TestEnergyPollsterCache(_BaseTestCase):
|
||||
pollster_cls = kwapi.EnergyPollster
|
||||
|
||||
def test_get_samples_cached(self):
|
||||
probe = {'id': 'A'}
|
||||
probe.update(PROBE_DICT['probes']['A'])
|
||||
cache = {
|
||||
'%s-%s' % (ENDPOINT, self.pollster_cls.CACHE_KEY_PROBE): [probe],
|
||||
}
|
||||
self.manager._keystone = mock.Mock()
|
||||
pollster = self.pollster_cls(self.CONF)
|
||||
with mock.patch.object(pollster, '_get_probes') as do_not_call:
|
||||
do_not_call.side_effect = AssertionError('should not be called')
|
||||
samples = list(pollster.get_samples(self.manager, cache,
|
||||
[ENDPOINT]))
|
||||
self.assertEqual(1, len(samples))
|
||||
|
||||
|
||||
class TestPowerPollsterCache(TestEnergyPollsterCache):
|
||||
pollster_cls = kwapi.PowerPollster
|
4
releasenotes/notes/drop-kwapi-b687bc476186d01b.yaml
Normal file
4
releasenotes/notes/drop-kwapi-b687bc476186d01b.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
---
|
||||
deprecations:
|
||||
- |
|
||||
Previously deprecated kwapi meters are not removed.
|
@ -154,8 +154,6 @@ ceilometer.poll.central =
|
||||
storage.objects = ceilometer.objectstore.swift:ObjectsPollster
|
||||
storage.objects.size = ceilometer.objectstore.swift:ObjectsSizePollster
|
||||
storage.objects.containers = ceilometer.objectstore.swift:ObjectsContainersPollster
|
||||
energy = ceilometer.energy.kwapi:EnergyPollster
|
||||
power = ceilometer.energy.kwapi:PowerPollster
|
||||
switch.port = ceilometer.network.statistics.port:PortPollster
|
||||
switch.port.receive.packets = ceilometer.network.statistics.port:PortPollsterReceivePackets
|
||||
switch.port.transmit.packets = ceilometer.network.statistics.port:PortPollsterTransmitPackets
|
||||
|
Loading…
x
Reference in New Issue
Block a user