Enable the Load Balancer v2 for the Ceilometer(Part Two)
In this change set, add the new methods to collect the new meters in the LBaaS v2[1]. list_listener: list all the listeners list_loadbalancer: list all the loadbalancers get_loadbalancer_stats : get the statistics of the specified loadbalancer. [1]https://wiki.openstack.org/wiki/Neutron/LBaaS/API_2.0 Co-Authored-By: Xia Linjuan <ljxiash@cn.ibm.com> DocImpact: new metrics are introduced Change-Id: I982f28917d1f8fd3d4352037f8832de9ef869942 Implements: blueprint lbaas-v2-enablement
This commit is contained in:
parent
95b2615d6e
commit
e7a3d62fc3
@ -52,6 +52,24 @@ class LBMembersDiscovery(_BaseServicesDiscovery):
|
||||
if i.get('status', None) != 'error']
|
||||
|
||||
|
||||
class LBListenersDiscovery(_BaseServicesDiscovery):
|
||||
def discover(self, manager, param=None):
|
||||
"""Discover load balancer listener resources to monitor."""
|
||||
|
||||
listeners = self.neutron_cli.list_listener()
|
||||
return [i for i in listeners
|
||||
if i.get('operating_status', None) != 'error']
|
||||
|
||||
|
||||
class LBLoadBalancersDiscovery(_BaseServicesDiscovery):
|
||||
def discover(self, manager, param=None):
|
||||
"""Discover load balancer resources to monitor."""
|
||||
|
||||
loadbalancers = self.neutron_cli.list_loadbalancer()
|
||||
return [i for i in loadbalancers
|
||||
if i.get('operating_status', None) != 'error']
|
||||
|
||||
|
||||
class LBHealthMonitorsDiscovery(_BaseServicesDiscovery):
|
||||
def discover(self, manager, param=None):
|
||||
"""Discover resources to monitor."""
|
||||
|
@ -233,6 +233,7 @@ class _LBStatsPollster(base.BaseServicesPollster):
|
||||
def __init__(self):
|
||||
super(_LBStatsPollster, self).__init__()
|
||||
self.client = neutron_client.Client()
|
||||
self.lb_version = cfg.CONF.service_types.neutron_lbaas_version
|
||||
|
||||
@staticmethod
|
||||
def make_sample_from_pool(pool, name, type, unit, volume,
|
||||
@ -263,22 +264,49 @@ class _LBStatsPollster(base.BaseServicesPollster):
|
||||
)
|
||||
return i_cache[pool_id]
|
||||
|
||||
def _populate_stats_cache_v2(self, loadbalancer_id, cache):
|
||||
i_cache = cache.setdefault("lbstats", {})
|
||||
if loadbalancer_id not in i_cache:
|
||||
stats = self.client.get_loadbalancer_stats(loadbalancer_id)
|
||||
i_cache[loadbalancer_id] = LBStatsData(
|
||||
active_connections=stats['active_connections'],
|
||||
total_connections=stats['total_connections'],
|
||||
bytes_in=stats['bytes_in'],
|
||||
bytes_out=stats['bytes_out'],
|
||||
)
|
||||
return i_cache[loadbalancer_id]
|
||||
|
||||
@property
|
||||
def default_discovery(self):
|
||||
return 'lb_pools'
|
||||
discovery_resource = 'lb_pools'
|
||||
if self.lb_version == 'v2':
|
||||
discovery_resource = 'lb_loadbalancers'
|
||||
return discovery_resource
|
||||
|
||||
@abc.abstractmethod
|
||||
def _get_sample(pool, c_data):
|
||||
"""Return one Sample."""
|
||||
|
||||
def get_samples(self, manager, cache, resources):
|
||||
if self.lb_version == 'v1':
|
||||
for pool in resources:
|
||||
try:
|
||||
c_data = self._populate_stats_cache(pool['id'], cache)
|
||||
yield self._get_sample(pool, c_data)
|
||||
except Exception as err:
|
||||
LOG.exception(_('Ignoring pool %(pool_id)s: %(error)s'),
|
||||
{'pool_id': pool['id'], 'error': err})
|
||||
except Exception:
|
||||
LOG.exception(_('Ignoring pool %(pool_id)s'),
|
||||
{'pool_id': pool['id']})
|
||||
elif self.lb_version == 'v2':
|
||||
for loadbalancer in resources:
|
||||
try:
|
||||
c_data = self._populate_stats_cache_v2(loadbalancer['id'],
|
||||
cache)
|
||||
yield self._get_sample(loadbalancer, c_data)
|
||||
except Exception:
|
||||
LOG.exception(
|
||||
_('Ignoring '
|
||||
'loadbalancer %(loadbalancer_id)s'),
|
||||
{'loadbalancer_id': loadbalancer['id']})
|
||||
|
||||
|
||||
class LBActiveConnectionsPollster(_LBStatsPollster):
|
||||
@ -352,3 +380,94 @@ def make_sample_from_pool(pool, name, type, unit, volume,
|
||||
timestamp=timeutils.utcnow().isoformat(),
|
||||
resource_metadata=resource_metadata,
|
||||
)
|
||||
|
||||
|
||||
class LBListenerPollster(BaseLBPollster):
|
||||
"""Pollster to capture Load Balancer Listener status samples."""
|
||||
|
||||
FIELDS = ['admin_state_up',
|
||||
'connection_limit',
|
||||
'description',
|
||||
'name',
|
||||
'default_pool_id',
|
||||
'protocol',
|
||||
'protocol_port',
|
||||
'operating_status',
|
||||
'loadbalancers'
|
||||
]
|
||||
|
||||
@property
|
||||
def default_discovery(self):
|
||||
return 'lb_listeners'
|
||||
|
||||
def get_samples(self, manager, cache, resources):
|
||||
resources = resources or []
|
||||
|
||||
for listener in resources:
|
||||
LOG.debug("Load Balancer Listener : %s" % listener)
|
||||
status = self.get_load_balancer_status_id(
|
||||
listener['operating_status'])
|
||||
if status == -1:
|
||||
# unknown status, skip this sample
|
||||
LOG.warning(_("Unknown status %(stat)s received on listener "
|
||||
"%(id)s, skipping sample")
|
||||
% {'stat': listener['operating_status'],
|
||||
'id': listener['id']})
|
||||
continue
|
||||
|
||||
yield sample.Sample(
|
||||
name='network.services.lb.listener',
|
||||
type=sample.TYPE_GAUGE,
|
||||
unit='listener',
|
||||
volume=status,
|
||||
user_id=None,
|
||||
project_id=listener['tenant_id'],
|
||||
resource_id=listener['id'],
|
||||
timestamp=timeutils.utcnow().isoformat(),
|
||||
resource_metadata=self.extract_metadata(listener)
|
||||
)
|
||||
|
||||
|
||||
class LBLoadBalancerPollster(BaseLBPollster):
|
||||
"""Pollster to capture Load Balancer status samples."""
|
||||
|
||||
FIELDS = ['admin_state_up',
|
||||
'description',
|
||||
'vip_address',
|
||||
'listeners',
|
||||
'name',
|
||||
'vip_subnet_id',
|
||||
'operating_status',
|
||||
]
|
||||
|
||||
@property
|
||||
def default_discovery(self):
|
||||
return 'lb_loadbalancers'
|
||||
|
||||
def get_samples(self, manager, cache, resources):
|
||||
resources = resources or []
|
||||
|
||||
for loadbalancer in resources:
|
||||
LOG.debug("Load Balancer: %s" % loadbalancer)
|
||||
status = self.get_load_balancer_status_id(
|
||||
loadbalancer['operating_status'])
|
||||
if status == -1:
|
||||
# unknown status, skip this sample
|
||||
LOG.warning(_("Unknown status %(stat)s received "
|
||||
"on Load Balancer "
|
||||
"%(id)s, skipping sample")
|
||||
% {'stat': loadbalancer['operating_status'],
|
||||
'id': loadbalancer['id']})
|
||||
continue
|
||||
|
||||
yield sample.Sample(
|
||||
name='network.services.lb.loadbalancer',
|
||||
type=sample.TYPE_GAUGE,
|
||||
unit='loadbalancer',
|
||||
volume=status,
|
||||
user_id=None,
|
||||
project_id=loadbalancer['tenant_id'],
|
||||
resource_id=loadbalancer['id'],
|
||||
timestamp=timeutils.utcnow().isoformat(),
|
||||
resource_metadata=self.extract_metadata(loadbalancer)
|
||||
)
|
||||
|
@ -385,3 +385,28 @@ class Client(object):
|
||||
break
|
||||
|
||||
return status_dict
|
||||
|
||||
def list_listener(self):
|
||||
"""This method is used to get the list of the listeners."""
|
||||
resp = self.client.list_listeners()
|
||||
resources = resp.get('listeners')
|
||||
for listener in resources:
|
||||
loadbalancer_id = listener.get('loadbalancers')[0].get('id')
|
||||
status = self._get_listener_status(loadbalancer_id)
|
||||
listener['operating_status'] = status[listener.get('id')]
|
||||
return resources
|
||||
|
||||
def list_loadbalancer(self):
|
||||
"""This method is used to get the list of the loadbalancers."""
|
||||
resp = self.client.list_loadbalancers()
|
||||
resources = resp.get('loadbalancers')
|
||||
return resources
|
||||
|
||||
def get_loadbalancer_stats(self, loadbalancer_id):
|
||||
"""This method is used to get the statistics of the loadbalancer.
|
||||
|
||||
:param loadbalancer_id: the ID of the specified loadbalancer
|
||||
"""
|
||||
resp = self.client.retrieve_loadbalancer_stats(loadbalancer_id)
|
||||
resource = resp.get('stats')
|
||||
return resource
|
||||
|
@ -474,7 +474,6 @@ class TestLBStatsPollster(_BaseTestLBPollster):
|
||||
def _check_get_samples(self, factory, sample_name, expected_volume,
|
||||
expected_type):
|
||||
pollster = factory()
|
||||
|
||||
cache = {}
|
||||
samples = list(pollster.get_samples(self.manager, cache,
|
||||
self.fake_get_pools()))
|
||||
|
305
ceilometer/tests/unit/network/services/test_lbaas_v2.py
Normal file
305
ceilometer/tests/unit/network/services/test_lbaas_v2.py
Normal file
@ -0,0 +1,305 @@
|
||||
#
|
||||
#
|
||||
# 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 oslo_config import cfg
|
||||
from oslo_context import context
|
||||
from oslotest import base
|
||||
from oslotest import mockpatch
|
||||
|
||||
from ceilometer.agent import manager
|
||||
from ceilometer.agent import plugin_base
|
||||
from ceilometer.network.services import discovery
|
||||
from ceilometer.network.services import lbaas
|
||||
|
||||
|
||||
class _BaseTestLBPollster(base.BaseTestCase):
|
||||
|
||||
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
||||
def setUp(self):
|
||||
super(_BaseTestLBPollster, self).setUp()
|
||||
self.addCleanup(mock.patch.stopall)
|
||||
self.context = context.get_admin_context()
|
||||
self.manager = manager.AgentManager()
|
||||
plugin_base._get_keystone = mock.Mock()
|
||||
catalog = (plugin_base._get_keystone.session.auth.get_access.
|
||||
return_value.service_catalog)
|
||||
catalog.get_endpoints = mock.MagicMock(
|
||||
return_value={'network': mock.ANY})
|
||||
|
||||
|
||||
class TestLBListenerPollster(_BaseTestLBPollster):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLBListenerPollster, self).setUp()
|
||||
self.pollster = lbaas.LBListenerPollster()
|
||||
self.pollster.lb_version = 'v2'
|
||||
fake_listeners = self.fake_list_listeners()
|
||||
self.useFixture(mockpatch.Patch('ceilometer.neutron_client.Client.'
|
||||
'list_listener',
|
||||
return_value=fake_listeners))
|
||||
|
||||
@staticmethod
|
||||
def fake_list_listeners():
|
||||
return [{'default_pool_id': None,
|
||||
'protocol': 'HTTP',
|
||||
'description': '',
|
||||
'loadbalancers': [
|
||||
{'id': 'a9729389-6147-41a3-ab22-a24aed8692b2'}],
|
||||
'id': '35cb8516-1173-4035-8dae-0dae3453f37f',
|
||||
'name': 'mylistener_online',
|
||||
'admin_state_up': True,
|
||||
'connection_limit': 100,
|
||||
'tenant_id': '3e4d8bec50a845fcb09e03a4375c691d',
|
||||
'protocol_port': 80,
|
||||
'operating_status': 'ONLINE'},
|
||||
{'default_pool_id': None,
|
||||
'protocol': 'HTTP',
|
||||
'description': '',
|
||||
'loadbalancers': [
|
||||
{'id': 'ce73ad36-437d-4c84-aee1-186027d3da9a'}],
|
||||
'id': 'cd6a6fee-e2fa-4e6c-b3c2-bfbe395752c1',
|
||||
'name': 'mylistener_offline',
|
||||
'admin_state_up': True,
|
||||
'connection_limit': 100,
|
||||
'tenant_id': '3e4d8bec50a845fcb09e03a4375c691d',
|
||||
'protocol_port': 80,
|
||||
'operating_status': 'OFFLINE'},
|
||||
{'default_pool_id': None,
|
||||
'protocol': 'HTTP',
|
||||
'description': '',
|
||||
'loadbalancers': [
|
||||
{'id': 'fe7rad36-437d-4c84-aee1-186027d3bdcd'}],
|
||||
'id': 'bbe3d818-bdcb-4e4b-b47f-5650dc8a9d7a',
|
||||
'name': 'mylistener_error',
|
||||
'admin_state_up': True,
|
||||
'connection_limit': 100,
|
||||
'tenant_id': '3e4d8bec50a845fcb09e03a4375c691d',
|
||||
'protocol_port': 80,
|
||||
'operating_status': 'ERROR'},
|
||||
{'default_pool_id': None,
|
||||
'protocol': 'HTTP',
|
||||
'description': '',
|
||||
'loadbalancers': [
|
||||
{'id': 'fe7rad36-437d-4c84-aee1-186027d3bdcd'}],
|
||||
'id': 'bbe3d818-bdcb-4e4b-b47f-5650dc8a9d7a',
|
||||
'name': 'mylistener_pending_create',
|
||||
'admin_state_up': True,
|
||||
'connection_limit': 100,
|
||||
'tenant_id': '3e4d8bec50a845fcb09e03a4375c691d',
|
||||
'protocol_port': 80,
|
||||
'operating_status': 'PENDING_CREATE'}
|
||||
]
|
||||
|
||||
def test_listener_get_samples(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_listeners()))
|
||||
self.assertEqual(3, len(samples))
|
||||
for field in self.pollster.FIELDS:
|
||||
self.assertEqual(self.fake_list_listeners()[0][field],
|
||||
samples[0].resource_metadata[field])
|
||||
|
||||
def test_listener_volume(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_listeners()))
|
||||
self.assertEqual(1, samples[0].volume)
|
||||
self.assertEqual(0, samples[1].volume)
|
||||
self.assertEqual(4, samples[2].volume)
|
||||
|
||||
def test_list_listener_meter_names(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_listeners()))
|
||||
self.assertEqual(set(['network.services.lb.listener']),
|
||||
set([s.name for s in samples]))
|
||||
|
||||
def test_listener_discovery(self):
|
||||
discovered_listeners = discovery.LBListenersDiscovery().discover(
|
||||
self.manager)
|
||||
self.assertEqual(4, len(discovered_listeners))
|
||||
for listener in self.fake_list_listeners():
|
||||
if listener['operating_status'] == 'pending_create':
|
||||
self.assertNotIn(listener, discovered_listeners)
|
||||
else:
|
||||
self.assertIn(listener, discovered_listeners)
|
||||
|
||||
|
||||
class TestLBLoadBalancerPollster(_BaseTestLBPollster):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLBLoadBalancerPollster, self).setUp()
|
||||
self.pollster = lbaas.LBLoadBalancerPollster()
|
||||
self.pollster.lb_version = 'v2'
|
||||
fake_loadbalancers = self.fake_list_loadbalancers()
|
||||
self.useFixture(mockpatch.Patch('ceilometer.neutron_client.Client.'
|
||||
'list_loadbalancer',
|
||||
return_value=fake_loadbalancers))
|
||||
|
||||
@staticmethod
|
||||
def fake_list_loadbalancers():
|
||||
return [{'operating_status': 'ONLINE',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
|
||||
'provisioning_status': 'ACTIVE',
|
||||
'listeners': [{'id': 'fe7rad36-437d-4c84-aee1-186027d3bdcd'}],
|
||||
'vip_address': '10.0.0.2',
|
||||
'vip_subnet_id': '013d3059-87a4-45a5-91e9-d721068ae0b2',
|
||||
'id': 'cd6a6fee-e2fa-4e6c-b3c2-bfbe395752c1',
|
||||
'name': 'loadbalancer_online'},
|
||||
{'operating_status': 'OFFLINE',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
|
||||
'provisioning_status': 'INACTIVE',
|
||||
'listeners': [{'id': 'bbe3d818-bdcb-4e4b-b47f-5650dc8a9d7a'}],
|
||||
'vip_address': '10.0.0.3',
|
||||
'vip_subnet_id': 'ce73ad36-437d-4c84-aee1-186027d3da9a',
|
||||
'id': 'bbe3d818-bdcb-4e4b-b47f-5650dc8a9d7a',
|
||||
'name': 'loadbalancer_offline'},
|
||||
{'operating_status': 'ERROR',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
|
||||
'provisioning_status': 'INACTIVE',
|
||||
'listeners': [{'id': 'bbe3d818-bdcb-4e4b-b47f-5650dc8a9d8b'}],
|
||||
'vip_address': '10.0.0.4',
|
||||
'vip_subnet_id': '213d3059-87a4-45a5-91e9-d721068df0b2',
|
||||
'id': 'cd6a6fee-e2fa-4e6c-b3c2-bfbe395752c1',
|
||||
'name': 'loadbalancer_error'},
|
||||
{'operating_status': 'PENDING_CREATE',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
|
||||
'provisioning_status': 'INACTIVE',
|
||||
'listeners': [{'id': 'fe7rad36-437d-4c84-aee1-186027d4ed7c'}],
|
||||
'vip_address': '10.0.0.5',
|
||||
'vip_subnet_id': '123d3059-87a4-45a5-91e9-d721068ae0c3',
|
||||
'id': 'cd6a6fee-e2fa-4e6c-b3c2-bfbe395763b2',
|
||||
'name': 'loadbalancer_pending_create'}
|
||||
]
|
||||
|
||||
def test_loadbalancer_get_samples(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_loadbalancers()))
|
||||
self.assertEqual(3, len(samples))
|
||||
for field in self.pollster.FIELDS:
|
||||
self.assertEqual(self.fake_list_loadbalancers()[0][field],
|
||||
samples[0].resource_metadata[field])
|
||||
|
||||
def test_loadbalancer_volume(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_loadbalancers()))
|
||||
self.assertEqual(1, samples[0].volume)
|
||||
self.assertEqual(0, samples[1].volume)
|
||||
self.assertEqual(4, samples[2].volume)
|
||||
|
||||
def test_list_loadbalancer_meter_names(self):
|
||||
samples = list(self.pollster.get_samples(
|
||||
self.manager, {},
|
||||
resources=self.fake_list_loadbalancers()))
|
||||
self.assertEqual(set(['network.services.lb.loadbalancer']),
|
||||
set([s.name for s in samples]))
|
||||
|
||||
def test_loadbalancer_discovery(self):
|
||||
discovered_loadbalancers = \
|
||||
discovery.LBLoadBalancersDiscovery().discover(self.manager)
|
||||
self.assertEqual(4, len(discovered_loadbalancers))
|
||||
for loadbalancer in self.fake_list_loadbalancers():
|
||||
if loadbalancer['operating_status'] == 'pending_create':
|
||||
self.assertNotIn(loadbalancer, discovered_loadbalancers)
|
||||
else:
|
||||
self.assertIn(loadbalancer, discovered_loadbalancers)
|
||||
|
||||
|
||||
class TestLBStatsPollster(_BaseTestLBPollster):
|
||||
|
||||
def setUp(self):
|
||||
super(TestLBStatsPollster, self).setUp()
|
||||
fake_balancer_stats = self.fake_balancer_stats()
|
||||
self.useFixture(mockpatch.Patch('ceilometer.neutron_client.Client.'
|
||||
'get_loadbalancer_stats',
|
||||
return_value=fake_balancer_stats))
|
||||
|
||||
fake_loadbalancers = self.fake_list_loadbalancers()
|
||||
self.useFixture(mockpatch.Patch('ceilometer.neutron_client.Client.'
|
||||
'list_loadbalancer',
|
||||
return_value=fake_loadbalancers))
|
||||
cfg.CONF.set_override('neutron_lbaas_version',
|
||||
'v2',
|
||||
group='service_types')
|
||||
|
||||
@staticmethod
|
||||
def fake_list_loadbalancers():
|
||||
return [{'operating_status': 'ONLINE',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
|
||||
'provisioning_status': 'ACTIVE',
|
||||
'listeners': [{'id': 'fe7rad36-437d-4c84-aee1-186027d3bdcd'}],
|
||||
'vip_address': '10.0.0.2',
|
||||
'vip_subnet_id': '013d3059-87a4-45a5-91e9-d721068ae0b2',
|
||||
'id': 'cd6a6fee-e2fa-4e6c-b3c2-bfbe395752c1',
|
||||
'name': 'loadbalancer_online'},
|
||||
]
|
||||
|
||||
@staticmethod
|
||||
def fake_balancer_stats():
|
||||
return {'active_connections': 2,
|
||||
'bytes_in': 1,
|
||||
'bytes_out': 3,
|
||||
'total_connections': 4}
|
||||
|
||||
@mock.patch('ceilometer.pipeline.setup_pipeline', mock.MagicMock())
|
||||
def _check_get_samples(self, factory, sample_name, expected_volume,
|
||||
expected_type):
|
||||
pollster = factory()
|
||||
|
||||
cache = {}
|
||||
samples = list(pollster.get_samples(self.manager, cache,
|
||||
self.fake_list_loadbalancers()))
|
||||
self.assertEqual(1, len(samples))
|
||||
self.assertIsNotNone(samples)
|
||||
self.assertIn('lbstats', cache)
|
||||
self.assertEqual(set([sample_name]), set([s.name for s in samples]))
|
||||
|
||||
match = [s for s in samples if s.name == sample_name]
|
||||
self.assertEqual(1, len(match), 'missing counter %s' % sample_name)
|
||||
self.assertEqual(expected_volume, match[0].volume)
|
||||
self.assertEqual(expected_type, match[0].type)
|
||||
|
||||
def test_lb_total_connections(self):
|
||||
self._check_get_samples(lbaas.LBTotalConnectionsPollster,
|
||||
'network.services.lb.total.connections',
|
||||
4, 'cumulative')
|
||||
|
||||
def test_lb_active_connections(self):
|
||||
self._check_get_samples(lbaas.LBActiveConnectionsPollster,
|
||||
'network.services.lb.active.connections',
|
||||
2, 'gauge')
|
||||
|
||||
def test_lb_incoming_bytes(self):
|
||||
self._check_get_samples(lbaas.LBBytesInPollster,
|
||||
'network.services.lb.incoming.bytes',
|
||||
1, 'gauge')
|
||||
|
||||
def test_lb_outgoing_bytes(self):
|
||||
self._check_get_samples(lbaas.LBBytesOutPollster,
|
||||
'network.services.lb.outgoing.bytes',
|
||||
3, 'gauge')
|
@ -197,6 +197,24 @@ class TestNeutronClientLBaaSV2(base.BaseTestCase):
|
||||
}
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
def fake_list_lbaas_listeners():
|
||||
return {
|
||||
'listeners': [{
|
||||
'default_pool_id': None,
|
||||
'protocol': 'HTTP',
|
||||
'description': '',
|
||||
'admin_state_up': True,
|
||||
'loadbalancers': [{
|
||||
'id': 'a9729389-6147-41a3-ab22-a24aed8692b2'
|
||||
}],
|
||||
'tenant_id': '3e4d8bec50a845fcb09e03a4375c691d',
|
||||
'connection_limit': 100,
|
||||
'protocol_port': 80,
|
||||
'id': '35cb8516-1173-4035-8dae-0dae3453f37f',
|
||||
'name': 'listener_one'
|
||||
}]}
|
||||
|
||||
@mock.patch.object(client.Client,
|
||||
'list_lbaas_pools')
|
||||
@mock.patch.object(client.Client,
|
||||
@ -300,3 +318,19 @@ class TestNeutronClientLBaaSV2(base.BaseTestCase):
|
||||
for key in result_status.keys():
|
||||
self.assertIn(key, expected_keys)
|
||||
self.assertEqual(excepted_status[key], result_status[key])
|
||||
|
||||
@mock.patch.object(client.Client,
|
||||
'list_listeners')
|
||||
@mock.patch.object(neutron_client.Client,
|
||||
'_retrieve_loadbalancer_status_tree')
|
||||
def test_list_listener(self, mock_status, mock_list_listeners):
|
||||
mock_list_listeners.return_value = (
|
||||
self.fake_list_lbaas_listeners())
|
||||
mock_status.return_value = (
|
||||
self.fake_retrieve_loadbalancer_status())
|
||||
listeners = self.nc.list_listener()
|
||||
expected_key = '35cb8516-1173-4035-8dae-0dae3453f37f'
|
||||
expected_status = 'ONLINE'
|
||||
self.assertEqual(1, len(listeners))
|
||||
self.assertEqual(expected_key, listeners[0]['id'])
|
||||
self.assertEqual(expected_status, listeners[0]['operating_status'])
|
||||
|
@ -64,6 +64,8 @@ ceilometer.discover =
|
||||
lb_pools = ceilometer.network.services.discovery:LBPoolsDiscovery
|
||||
lb_vips = ceilometer.network.services.discovery:LBVipsDiscovery
|
||||
lb_members = ceilometer.network.services.discovery:LBMembersDiscovery
|
||||
lb_listeners = ceilometer.network.services.discovery:LBListenersDiscovery
|
||||
lb_loadbalancers = ceilometer.network.services.discovery:LBLoadBalancersDiscovery
|
||||
lb_health_probes = ceilometer.network.services.discovery:LBHealthMonitorsDiscovery
|
||||
vpn_services = ceilometer.network.services.discovery:VPNServicesDiscovery
|
||||
ipsec_connections = ceilometer.network.services.discovery:IPSecConnectionsDiscovery
|
||||
@ -167,6 +169,8 @@ ceilometer.poll.central =
|
||||
network.services.lb.pool = ceilometer.network.services.lbaas:LBPoolPollster
|
||||
network.services.lb.vip = ceilometer.network.services.lbaas:LBVipPollster
|
||||
network.services.lb.member = ceilometer.network.services.lbaas:LBMemberPollster
|
||||
network.services.lb.listener = ceilometer.network.services.lbaas:LBListenerPollster
|
||||
network.services.lb.loadbalancer = ceilometer.network.services.lbaas:LBLoadBalancerPollster
|
||||
network.services.lb.health_monitor = ceilometer.network.services.lbaas:LBHealthMonitorPollster
|
||||
network.services.lb.total.connections = ceilometer.network.services.lbaas:LBTotalConnectionsPollster
|
||||
network.services.lb.active.connections = ceilometer.network.services.lbaas:LBActiveConnectionsPollster
|
||||
|
Loading…
Reference in New Issue
Block a user