#
# 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 neutronclient.v2_0 import client
from oslotest import base
from ceilometer import neutron_client
[docs]class TestNeutronClientLBaaSV2(base.BaseTestCase):
[docs] def setUp(self):
super(TestNeutronClientLBaaSV2, self).setUp()
self.nc = neutron_client.Client()
@staticmethod
[docs] def fake_list_lbaas_pools():
return {
'pools': [{
'lb_algorithm': 'ROUND_ROBIN',
'protocol': 'HTTP',
'description': 'simple pool',
'admin_state_up': True,
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
'healthmonitor_id': None,
'listeners': [{
'id': "35cb8516-1173-4035-8dae-0dae3453f37f"
}
],
'members': [{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbf858'}
],
'id': '4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5',
'name': 'pool1'
}]
}
@staticmethod
[docs] def fake_list_lbaas_members():
return {
'members': [{
'weight': 1,
'admin_state_up': True,
'subnet_id': '013d3059-87a4-45a5-91e9-d721068ae0b2',
'tenant_id': '1a3e005cf9ce40308c900bcb08e5320c',
'address': '10.0.0.8',
'protocol_port': 80,
'id': 'fcf23bde-8cf9-4616-883f-208cebcbf858'
}]
}
@staticmethod
[docs] def fake_list_lbaas_healthmonitors():
return {
'healthmonitors': [{
'admin_state_up': True,
'tenant_id': '6f3584d5754048a18e30685362b88411',
'delay': 1,
'expected_codes': '200,201,202',
'max_retries': 5,
'http_method': 'GET',
'timeout': 1,
'pools': [{
'id': '74aa2010-a59f-4d35-a436-60a6da882819'
}],
'url_path': '/index.html',
'type': 'HTTP',
'id': '0a9ac99d-0a09-4b18-8499-a0796850279a'
}]
}
@staticmethod
[docs] def fake_show_listener():
return {
'listener': {
'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': ''
}
}
@staticmethod
[docs] def fake_retrieve_loadbalancer_status():
return {
'statuses': {
'loadbalancer': {
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'listeners': [{
'id': '35cb8516-1173-4035-8dae-0dae3453f37f',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'pools': [{
'id': '4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'members': [{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbf858',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE'
}],
'healthmonitor': {
'id': '785131d2-8f7b-4fee-a7e7-3196e11b4518',
'provisioning_status': 'ACTIVE'
}
}]
}]
}
}
}
@staticmethod
[docs] def fake_retrieve_loadbalancer_status_complex():
return {
'statuses': {
'loadbalancer': {
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'listeners': [{
'id': '35cb8516-1173-4035-8dae-0dae3453f37f',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'pools': [{
'id': '4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'members': [{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbf858',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE'
},
{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbf969',
'operating_status': 'OFFLINE',
'provisioning_status': 'ACTIVE'
}],
'healthmonitor': {
'id': '785131d2-8f7b-4fee-a7e7-3196e11b4518',
'provisioning_status': 'ACTIVE'
}
},
{
'id': '4c0a0a5f-cf8f-44b7-b912-957daa8ce6f6',
'operating_status': 'OFFLINE',
'provisioning_status': 'ACTIVE',
'members': [{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbfa7a',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE'
}],
'healthmonitor': {
'id': '785131d2-8f7b-4fee-a7e7-3196e11b4629',
'provisioning_status': 'ACTIVE'
}
}]
},
{
'id': '35cb8516-1173-4035-8dae-0dae3453f48e',
'operating_status': 'OFFLINE',
'provisioning_status': 'ACTIVE',
'pools': [{
'id': '4c0a0a5f-cf8f-44b7-b912-957daa8ce7g7',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE',
'members': [{
'id': 'fcf23bde-8cf9-4616-883f-208cebcbfb8b',
'operating_status': 'ONLINE',
'provisioning_status': 'ACTIVE'
}],
'healthmonitor': {
'id': '785131d2-8f7b-4fee-a7e7-3196e11b473a',
'provisioning_status': 'ACTIVE'
}
}]
}]
}
}
}
@staticmethod
[docs] 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,
'show_listener')
@mock.patch.object(neutron_client.Client,
'_retrieve_loadbalancer_status_tree')
[docs] def test_list_pools_v2(self, mock_status, mock_show, mock_list):
mock_status.return_value = self.fake_retrieve_loadbalancer_status()
mock_show.return_value = self.fake_show_listener()
mock_list.return_value = self.fake_list_lbaas_pools()
pools = self.nc.list_pools_v2()
self.assertEqual(1, len(pools))
for pool in pools:
self.assertEqual('ONLINE', pool['status'])
self.assertEqual('ROUND_ROBIN', pool['lb_method'])
@mock.patch.object(client.Client,
'list_lbaas_pools')
@mock.patch.object(client.Client,
'list_lbaas_members')
@mock.patch.object(client.Client,
'show_listener')
@mock.patch.object(neutron_client.Client,
'_retrieve_loadbalancer_status_tree')
[docs] def test_list_members_v2(self, mock_status, mock_show, mock_list_members,
mock_list_pools):
mock_status.return_value = self.fake_retrieve_loadbalancer_status()
mock_show.return_value = self.fake_show_listener()
mock_list_pools.return_value = self.fake_list_lbaas_pools()
mock_list_members.return_value = self.fake_list_lbaas_members()
members = self.nc.list_members_v2()
self.assertEqual(1, len(members))
for member in members:
self.assertEqual('ONLINE', member['status'])
self.assertEqual('4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5',
member['pool_id'])
@mock.patch.object(client.Client,
'list_lbaas_healthmonitors')
[docs] def test_list_health_monitors_v2(self, mock_list_healthmonitors):
mock_list_healthmonitors.return_value = (
self.fake_list_lbaas_healthmonitors())
healthmonitors = self.nc.list_health_monitors_v2()
self.assertEqual(1, len(healthmonitors))
for healthmonitor in healthmonitors:
self.assertEqual(5, healthmonitor['max_retries'])
@mock.patch.object(neutron_client.Client,
'_retrieve_loadbalancer_status_tree')
[docs] def test_get_member_status(self, mock_status):
mock_status.return_value = (
self.fake_retrieve_loadbalancer_status_complex())
loadbalancer_id = '5b1b1b6e-cf8f-44b7-b912-957daa8ce5e5'
listener_id = '35cb8516-1173-4035-8dae-0dae3453f37f'
pool_id = '4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5'
parent_id = [listener_id, pool_id]
result_status = self.nc._get_member_status(loadbalancer_id,
parent_id)
expected_keys = ['fcf23bde-8cf9-4616-883f-208cebcbf858',
'fcf23bde-8cf9-4616-883f-208cebcbf969']
excepted_status = {
'fcf23bde-8cf9-4616-883f-208cebcbf858': 'ONLINE',
'fcf23bde-8cf9-4616-883f-208cebcbf969': 'OFFLINE'}
for key in result_status.keys():
self.assertIn(key, expected_keys)
self.assertEqual(excepted_status[key], result_status[key])
@mock.patch.object(neutron_client.Client,
'_retrieve_loadbalancer_status_tree')
[docs] def test_get_pool_status(self, mock_status):
mock_status.return_value = (
self.fake_retrieve_loadbalancer_status_complex())
loadbalancer_id = '5b1b1b6e-cf8f-44b7-b912-957daa8ce5e5'
parent_id = '35cb8516-1173-4035-8dae-0dae3453f37f'
result_status = self.nc._get_pool_status(loadbalancer_id,
parent_id)
expected_keys = ['4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5',
'4c0a0a5f-cf8f-44b7-b912-957daa8ce6f6']
excepted_status = {
'4c0a0a5f-cf8f-44b7-b912-957daa8ce5e5': 'ONLINE',
'4c0a0a5f-cf8f-44b7-b912-957daa8ce6f6': 'OFFLINE'}
for key in result_status.keys():
self.assertIn(key, expected_keys)
self.assertEqual(excepted_status[key], result_status[key])
@mock.patch.object(neutron_client.Client,
'_retrieve_loadbalancer_status_tree')
[docs] def test_get_listener_status(self, mock_status):
mock_status.return_value = (
self.fake_retrieve_loadbalancer_status_complex())
loadbalancer_id = '5b1b1b6e-cf8f-44b7-b912-957daa8ce5e5'
result_status = self.nc._get_listener_status(loadbalancer_id)
expected_keys = ['35cb8516-1173-4035-8dae-0dae3453f37f',
'35cb8516-1173-4035-8dae-0dae3453f48e']
excepted_status = {
'35cb8516-1173-4035-8dae-0dae3453f37f': 'ONLINE',
'35cb8516-1173-4035-8dae-0dae3453f48e': 'OFFLINE'}
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')
[docs] 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'])