Source code for octavia_tempest_plugin.tests.api.v2.test_pool

# Copyright 2018 GoDaddy
#
#    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 testtools
import time
from uuid import UUID

from dateutil import parser
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
from tempest.lib import exceptions

from octavia_tempest_plugin.common import constants as const
from octavia_tempest_plugin.tests import test_base
from octavia_tempest_plugin.tests import waiters

CONF = config.CONF


[docs] class PoolAPITest(test_base.LoadBalancerBaseTest): """Test the pool object API."""
[docs] @classmethod def resource_setup(cls): """Setup resources needed by the tests.""" super(PoolAPITest, cls).resource_setup() lb_name = data_utils.rand_name("lb_member_lb1_pool") lb_kwargs = {const.PROVIDER: CONF.load_balancer.provider, const.NAME: lb_name} cls._setup_lb_network_kwargs(lb_kwargs) lb = cls.mem_lb_client.create_loadbalancer(**lb_kwargs) cls.lb_id = lb[const.ID] cls.addClassResourceCleanup( cls.mem_lb_client.cleanup_loadbalancer, cls.lb_id, cascade=True) waiters.wait_for_status(cls.mem_lb_client.show_loadbalancer, cls.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.lb_build_interval, CONF.load_balancer.lb_build_timeout)
# Pool with Least Connections algorithm
[docs] @decorators.idempotent_id('29f1a69d-6a0d-4a85-b178-f50f5b4bdfbc') def test_HTTP_LC_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTP, protocol_port=10, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('5086402a-2339-4238-bddb-d30508e6cc53') def test_HTTP_LC_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTP, pool_protocol=const.HTTP, protocol_port=11, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('eb84fabc-68e6-44f7-955d-4919f045cd08') def test_HTTPS_LC_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTPS, protocol_port=12, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('664fc4d3-70d9-41c5-b3f8-c006726062ae') def test_HTTPS_LC_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTPS, pool_protocol=const.HTTPS, protocol_port=13, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('08e35f78-a85d-48d2-8ac3-14c5e68b64f7') def test_PROXY_LC_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.PROXY, protocol_port=14, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('044f460b-47ec-4e97-96be-c7ab812bfa16') def test_PROXY_LC_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.PROXY, protocol_port=15, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('8f552da6-38f8-44b8-b69b-072cc1e232a6') def test_TCP_LC_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.TCP, protocol_port=16, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('728b974f-ff59-479b-ada5-de280bbaaf02') def test_TCP_LC_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.TCP, protocol_port=17, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('0cb032d9-e092-476e-9aaf-463eea58fc16') def test_UDP_LC_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.UDP, protocol_port=18, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('9bf3bb05-ee36-47f3-b669-78f06a94035d') def test_UDP_LC_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.UDP, pool_protocol=const.UDP, protocol_port=19, algorithm=const.LB_ALGORITHM_LEAST_CONNECTIONS)
# Pool with Round Robin algorithm
[docs] @decorators.idempotent_id('7587fe48-87ba-4538-9f03-190911f100ff') def test_HTTP_RR_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTP, protocol_port=20, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('c9c0df79-f07e-428c-ae57-b9d4078eec79') def test_HTTP_RR_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTP, pool_protocol=const.HTTP, protocol_port=21, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('cc940a8b-b21c-46f5-9976-d2c8dd73b626') def test_HTTPS_RR_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTPS, protocol_port=22, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('10df2793-63b2-42a3-a5d0-9241a9d700a3') def test_HTTPS_RR_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTPS, pool_protocol=const.HTTPS, protocol_port=23, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('4d6c124e-73ea-4b32-bd1c-3ff7be2c4e55') def test_PROXY_RR_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.PROXY, protocol_port=24, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('60406086-b0a9-4f55-8f64-df161981443c') def test_PROXY_RR_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.PROXY, protocol_port=25, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('41a5f22e-80e8-4d85-bfd6-2726846ed2ce') def test_TCP_RR_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.TCP, protocol_port=26, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('b76432ae-1aa2-4048-b326-1cbda28415ac') def test_TCP_RR_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.TCP, protocol_port=27, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('c09be35d-8a8b-4abd-8752-2cb4d7d7fab2') def test_UDP_RR_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.UDP, protocol_port=28, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('4fb59ed9-5c44-437e-a5f9-bb01b9ba6a72') def test_UDP_RR_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.UDP, pool_protocol=const.UDP, protocol_port=29, algorithm=const.LB_ALGORITHM_ROUND_ROBIN)
# Pool with Source IP algorithm
[docs] @decorators.idempotent_id('a8b1b41c-5c3c-4c17-a2d4-b7c344520e3d') def test_HTTP_SI_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTP, protocol_port=30, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('0136341c-4622-4f65-a59d-b9983331d627') def test_HTTP_SI_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTP, pool_protocol=const.HTTP, protocol_port=31, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('d69c5e0b-43b5-4afe-a94a-1a4f93e44a93') def test_HTTPS_SI_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTPS, protocol_port=32, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('04cc43f2-9eab-4552-b8c1-cea9e1325696') def test_HTTPS_SI_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTPS, pool_protocol=const.HTTPS, protocol_port=33, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('cc42779d-71f8-4a7c-8217-02127be344ce') def test_PROXY_SI_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.PROXY, protocol_port=34, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('c845d8d3-30d7-42c3-8943-9a4582c62e2d') def test_PROXY_SI_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.PROXY, protocol_port=35, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('869b4208-5821-44f5-acf6-4f087c4dd79c') def test_TCP_SI_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.TCP, protocol_port=36, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('4b0be593-b2e4-4704-a347-c36dae76aaad') def test_TCP_SI_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.TCP, protocol_port=37, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('47af95cb-685a-48de-9d17-66108cdfd3fa') def test_UDP_SI_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.UDP, protocol_port=38, algorithm=const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('0115ab0c-e8fd-434a-9448-7fba55a8f27d') def test_UDP_SI_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.UDP, pool_protocol=const.UDP, protocol_port=39, algorithm=const.LB_ALGORITHM_SOURCE_IP)
# Pool with Source IP Port algorithm
[docs] @decorators.idempotent_id('265ba978-a528-429c-9ef7-c36373ee2225') def test_HTTP_SIP_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTP, protocol_port=40, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('a07e2ff0-90f3-43d3-a7ec-5ca93b7f29bf') def test_HTTP_SIP_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTP, pool_protocol=const.HTTP, protocol_port=41, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('7da08af5-e225-46df-b0b4-a5f1834a5377') def test_HTTPS_SIP_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.HTTPS, protocol_port=42, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('3d52a82e-e488-445a-8599-87e9bb7153eb') def test_HTTPS_SIP_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.HTTPS, pool_protocol=const.HTTPS, protocol_port=43, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('ad4cb862-fa37-4874-99c1-511cdcd86f91') def test_PROXY_SIP_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.PROXY, protocol_port=44, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('bcf76f26-e801-4ab4-b338-b210457d592e') def test_PROXY_SIP_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.PROXY, protocol_port=45, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('42382080-7fd5-46d7-afd7-d47c880f0397') def test_TCP_SIP_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.TCP, protocol_port=46, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('53687dd3-e076-4e93-b917-93c76a160444') def test_TCP_SIP_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.TCP, pool_protocol=const.TCP, protocol_port=47, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('02d40127-d46e-4aba-8428-96f6deff3554') def test_UDP_SIP_pool_standalone_create(self): self._test_pool_create(listener_protocol=None, pool_protocol=const.UDP, protocol_port=48, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('5f1acd3e-305d-40d5-81e9-fe6250411d49') def test_UDP_SIP_pool_with_listener_create(self): self._test_pool_create(listener_protocol=const.UDP, pool_protocol=const.UDP, protocol_port=49, algorithm=const.LB_ALGORITHM_SOURCE_IP_PORT)
# Test with session persistence
[docs] @decorators.idempotent_id('882263e6-d50f-47b4-9083-f76c2b92eef0') def test_HTTP_RR_source_IP_pool_with_listener_create(self): self._test_pool_create( listener_protocol=const.HTTP, pool_protocol=const.HTTP, protocol_port=52, algorithm=const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
[docs] @decorators.idempotent_id('1d5eed30-86bf-4bf4-87d0-22adee3defa1') def test_UDP_RR_source_ip_pool_with_listener_create(self): self._test_pool_create( listener_protocol=const.UDP, pool_protocol=const.UDP, protocol_port=53, algorithm=const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
def _test_pool_create(self, listener_protocol, pool_protocol, protocol_port, algorithm, session_persistence=None): """Tests pool create and basic show APIs. * Tests that users without the loadbalancer member role cannot create pools. * Create a fully populated pool. * Show pool details. * Validate the show reflects the requested values. """ if (algorithm == const.LB_ALGORITHM_SOURCE_IP_PORT and not self.mem_listener_client.is_version_supported( self.api_version, '2.13')): raise testtools.TestCase.skipException( 'Skipping this test as load balancing algorithm ' 'SOURCE_IP_PORT requires API version 2.13 or newer.') if listener_protocol is not None: listener_name = data_utils.rand_name("lb_member_listener1_pool") listener_kwargs = { const.NAME: listener_name, const.PROTOCOL: listener_protocol, const.PROTOCOL_PORT: protocol_port, const.LOADBALANCER_ID: self.lb_id, } listener = self.mem_listener_client.create_listener( **listener_kwargs) self.addClassResourceCleanup( self.mem_listener_client.cleanup_listener, listener[const.ID], lb_client=self.mem_lb_client, lb_id=self.lb_id) waiters.wait_for_status(self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool_name = data_utils.rand_name("lb_member_pool1-create") pool_description = data_utils.arbitrary_string(size=255) pool_sp_cookie_name = 'my_cookie' pool_kwargs = { const.NAME: pool_name, const.DESCRIPTION: pool_description, const.ADMIN_STATE_UP: True, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, } if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): pool_tags = ["Hello", "World"] pool_kwargs.update({ const.TAGS: pool_tags }) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE, const.COOKIE_NAME: pool_sp_cookie_name } elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE } elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_SOURCE_IP } if listener_protocol is not None: pool_kwargs[const.LISTENER_ID] = listener[const.ID] else: pool_kwargs[const.LOADBALANCER_ID] = self.lb_id # Test that a user without the loadbalancer role cannot # create a pool. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if expected_allowed: self.check_create_RBAC_enforcement( 'PoolClient', 'create_pool', expected_allowed, status_method=self.mem_lb_client.show_loadbalancer, obj_id=self.lb_id, **pool_kwargs) # This is a special case as the reference driver does not support # SOURCE-IP-PORT. Since it runs with not_implemented_is_error, we must # handle this test case special. try: pool = self.mem_pool_client.create_pool(**pool_kwargs) except exceptions.NotImplemented as e: if algorithm != const.LB_ALGORITHM_SOURCE_IP_PORT: raise message = ("The configured provider driver '{driver}' " "does not support a feature required for this " "test.".format(driver=CONF.load_balancer.provider)) if hasattr(e, 'resp_body'): message = e.resp_body.get('faultstring', message) raise testtools.TestCase.skipException(message) self.addCleanup( self.mem_pool_client.cleanup_pool, pool[const.ID], lb_client=self.mem_lb_client, lb_id=self.lb_id) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) if (listener_protocol is not None and not CONF.load_balancer.test_with_noop): pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.OPERATING_STATUS, const.ONLINE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) else: self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS]) self.assertEqual(pool_name, pool[const.NAME]) self.assertEqual(pool_description, pool[const.DESCRIPTION]) self.assertTrue(pool[const.ADMIN_STATE_UP]) parser.parse(pool[const.CREATED_AT]) parser.parse(pool[const.UPDATED_AT]) UUID(pool[const.ID]) # Operating status for a pool without members will be: if (listener_protocol is not None and not CONF.load_balancer.test_with_noop): # ONLINE if it is attached to a listener and is a live test self.assertEqual(const.ONLINE, pool[const.OPERATING_STATUS]) else: # OFFLINE if it is just on the LB directly or is in noop mode self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS]) self.assertEqual(pool_protocol, pool[const.PROTOCOL]) self.assertEqual(1, len(pool[const.LOADBALANCERS])) self.assertEqual(self.lb_id, pool[const.LOADBALANCERS][0][const.ID]) if listener_protocol is not None: self.assertEqual(1, len(pool[const.LISTENERS])) self.assertEqual(listener[const.ID], pool[const.LISTENERS][0][const.ID]) else: self.assertEmpty(pool[const.LISTENERS]) self.assertEqual(algorithm, pool[const.LB_ALGORITHM]) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_APP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertEqual(pool_sp_cookie_name, pool[const.SESSION_PERSISTENCE][ const.COOKIE_NAME]) elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_HTTP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_SOURCE_IP, pool[const.SESSION_PERSISTENCE][const.TYPE]) if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): self.assertCountEqual(pool_kwargs[const.TAGS], pool[const.TAGS])
[docs] @decorators.idempotent_id('4b4c8021-f4dd-4826-b825-7e3dc0beaba4') def test_HTTP_LC_pool_list(self): self._test_pool_list(const.HTTP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('6959a32e-fb34-4f3e-be68-8880c6450016') def test_HTTP_RR_pool_list(self): self._test_pool_list(const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('b2cb9879-c1b3-491a-bd20-773bc57625b0') def test_HTTP_SI_pool_list(self): self._test_pool_list(const.HTTP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('871b5a7f-c8f3-4d05-9533-f9498e2465fa') def test_HTTP_SIP_pool_list(self): self._test_pool_list(const.HTTP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('8ace3b65-7183-4b55-837d-3e7f438ea079') def test_HTTPS_LC_pool_list(self): self._test_pool_list(const.HTTPS, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('7e01fa71-34fd-42e6-9db8-4b2a57cda38d') def test_HTTPS_RR_pool_list(self): self._test_pool_list(const.HTTPS, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('25d4b0d2-ab46-40ad-afec-1b0afa88a559') def test_HTTPS_SI_pool_list(self): self._test_pool_list(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('250e6bf6-5017-47c9-ae12-1e64515d3bfd') def test_HTTPS_SIP_pool_list(self): self._test_pool_list(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('f3f3565e-a6b3-4541-9fb3-d9900231771b') def test_PROXY_LC_pool_list(self): self._test_pool_list(const.PROXY, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('fb267dae-b4e3-4858-a85e-72ecb1d91eff') def test_PROXY_RR_pool_list(self): self._test_pool_list(const.PROXY, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('42a3e3e3-ad71-418e-a262-628a213a7b03') def test_PROXY_SI_pool_list(self): self._test_pool_list(const.PROXY, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('69d3f811-6ce8-403e-bae9-745d51cb268a') def test_PROXY_SIP_pool_list(self): self._test_pool_list(const.PROXY, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('f3a74c0c-3083-44a5-9938-a245176babcd') def test_TCP_LC_pool_list(self): self._test_pool_list(const.TCP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('1a0b616f-ee77-4ac1-bb5f-300c2a10a7f2') def test_TCP_RR_pool_list(self): self._test_pool_list(const.TCP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('ec0fda75-f2d7-4fa6-ba91-c5eb9a7e9874') def test_TCP_SI_pool_list(self): self._test_pool_list(const.TCP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('8ca217d0-705f-4a7a-87c2-752bb1ee88f1') def test_TCP_SIP_pool_list(self): self._test_pool_list(const.TCP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('ed26899d-a590-46fc-bf70-27c5a9c59cbf') def test_UDP_LC_pool_list(self): self._test_pool_list(const.UDP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('6fb6a6e3-ff65-4f2c-8876-2997d3903cfe') def test_UDP_RR_pool_list(self): self._test_pool_list(const.UDP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('0bb02800-d7c9-4916-a532-ac1ac7b945d0') def test_UDP_SI_pool_list(self): self._test_pool_list(const.UDP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('bdc7df5f-ffdb-48c8-823e-a3b5d76868a0') def test_UDP_SIP_pool_list(self): self._test_pool_list(const.UDP, const.LB_ALGORITHM_SOURCE_IP_PORT)
def _test_pool_list(self, pool_protocol, algorithm): """Tests pool list API and field filtering. * Create three pools. * Validates that other accounts cannot list the pools. * List the pools using the default sort order. * List the pools using descending sort order. * List the pools using ascending sort order. * List the pools returning one field at a time. * List the pools returning two fields. * List the pools filtering to one of the three. * List the pools filtered, one field, and sorted. """ # IDs of pools created in the test test_ids = [] if (algorithm == const.LB_ALGORITHM_SOURCE_IP_PORT and not self.mem_listener_client.is_version_supported( self.api_version, '2.13')): raise testtools.TestCase.skipException( 'Skipping this test as load balancing algorithm ' 'SOURCE_IP_PORT requires API version 2.13 or newer.') lb_id = self.lb_id waiters.wait_for_status(self.mem_lb_client.show_loadbalancer, lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.lb_build_interval, CONF.load_balancer.lb_build_timeout) pool1_name = data_utils.rand_name("lb_member_pool2-list") pool1_desc = 'B' pool1_kwargs = { const.NAME: pool1_name, const.DESCRIPTION: pool1_desc, const.ADMIN_STATE_UP: True, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: lb_id, } if self.mem_pool_client.is_version_supported( self.api_version, '2.5'): pool1_tags = ["English", "Mathematics", "Marketing", "Creativity"] pool1_kwargs.update({const.TAGS: pool1_tags}) # This is a special case as the reference driver does not support # SOURCE-IP-PORT. Since it runs with not_implemented_is_error, we must # handle this test case special. try: pool1 = self.mem_pool_client.create_pool(**pool1_kwargs) except exceptions.NotImplemented as e: if algorithm != const.LB_ALGORITHM_SOURCE_IP_PORT: raise message = ("The configured provider driver '{driver}' " "does not support a feature required for this " "test.".format(driver=CONF.load_balancer.provider)) if hasattr(e, 'resp_body'): message = e.resp_body.get('faultstring', message) raise testtools.TestCase.skipException(message) self.addCleanup( self.mem_pool_client.cleanup_pool, pool1[const.ID], lb_client=self.mem_lb_client, lb_id=lb_id) pool1 = waiters.wait_for_status( self.mem_pool_client.show_pool, pool1[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) waiters.wait_for_status(self.mem_lb_client.show_loadbalancer, lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) test_ids.append(pool1[const.ID]) # Time resolution for created_at is only to the second, and we need to # ensure that each object has a distinct creation time. Delaying one # second is both a simple and a reliable way to accomplish this. time.sleep(1) pool2_name = data_utils.rand_name("lb_member_pool1-list") pool2_desc = 'A' pool2_kwargs = { const.NAME: pool2_name, const.DESCRIPTION: pool2_desc, const.ADMIN_STATE_UP: True, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: lb_id, } if self.mem_pool_client.is_version_supported( self.api_version, '2.5'): pool2_tags = ["English", "Spanish", "Soft_skills", "Creativity"] pool2_kwargs.update({const.TAGS: pool2_tags}) pool2 = self.mem_pool_client.create_pool( **pool2_kwargs) self.addCleanup( self.mem_pool_client.cleanup_pool, pool2[const.ID], lb_client=self.mem_lb_client, lb_id=lb_id) pool2 = waiters.wait_for_status( self.mem_pool_client.show_pool, pool2[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) waiters.wait_for_status(self.mem_lb_client.show_loadbalancer, lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) test_ids.append(pool2[const.ID]) # Time resolution for created_at is only to the second, and we need to # ensure that each object has a distinct creation time. Delaying one # second is both a simple and a reliable way to accomplish this. time.sleep(1) pool3_name = data_utils.rand_name("lb_member_pool3-list") pool3_desc = 'C' pool3_kwargs = { const.NAME: pool3_name, const.DESCRIPTION: pool3_desc, const.ADMIN_STATE_UP: False, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: lb_id, } if self.mem_pool_client.is_version_supported( self.api_version, '2.5'): pool3_tags = ["English", "Project_management", "Communication", "Creativity"] pool3_kwargs.update({const.TAGS: pool3_tags}) pool3 = self.mem_pool_client.create_pool( **pool3_kwargs) self.addCleanup( self.mem_pool_client.cleanup_pool, pool3[const.ID], lb_client=self.mem_lb_client, lb_id=lb_id) pool3 = waiters.wait_for_status( self.mem_pool_client.show_pool, pool3[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) waiters.wait_for_status(self.mem_lb_client.show_loadbalancer, lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) test_ids.append(pool3[const.ID]) # Test that a different users cannot see the lb_member pools. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_primary', 'os_roles_lb_member2'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_primary', 'os_roles_lb_member2', 'os_roles_lb_observer', 'os_roles_lb_global_observer'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_roles_lb_observer', 'os_roles_lb_member2'] if expected_allowed: self.check_list_RBAC_enforcement_count( 'PoolClient', 'list_pools', expected_allowed, 0, query_params='loadbalancer_id={lb_id}'.format(lb_id=lb_id)) # Test credentials that should see these pools can see them. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_system_reader', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_system_reader', 'os_roles_lb_admin', 'os_roles_lb_member', 'os_roles_lb_global_observer'] if expected_allowed: self.check_list_IDs_RBAC_enforcement( 'PoolClient', 'list_pools', expected_allowed, test_ids, query_params='loadbalancer_id={lb_id}'.format(lb_id=lb_id)) # Test that users without the lb member role cannot list pools. # Note: non-owners can still call this API, they will just get the list # of pools for their project (zero). The above tests # are intended to cover the cross project use case. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_primary', 'os_roles_lb_admin', 'os_roles_lb_member', 'os_roles_lb_member2'] # Note: os_admin is here because it evaluaties to "project_admin" # in oslo_policy and since keystone considers "project_admin" # a superscope of "project_reader". This means it can read # objects in the "admin" credential's project. if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_primary', 'os_roles_lb_admin', 'os_system_reader', 'os_roles_lb_observer', 'os_roles_lb_global_observer', 'os_roles_lb_member', 'os_roles_lb_member2'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_system_reader', 'os_roles_lb_admin', 'os_roles_lb_observer', 'os_roles_lb_global_observer', 'os_roles_lb_member', 'os_roles_lb_member2'] if expected_allowed: self.check_list_RBAC_enforcement( 'PoolClient', 'list_pools', expected_allowed, query_params='loadbalancer_id={lb_id}'.format(lb_id=lb_id)) # Check the default sort order, created_at pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}'.format(lb_id=lb_id)) self.assertEqual(pool1[const.DESCRIPTION], pools[0][const.DESCRIPTION]) self.assertEqual(pool2[const.DESCRIPTION], pools[1][const.DESCRIPTION]) self.assertEqual(pool3[const.DESCRIPTION], pools[2][const.DESCRIPTION]) # Test sort descending by description pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{sort}={descr}:{desc}' .format(lb_id=lb_id, sort=const.SORT, descr=const.DESCRIPTION, desc=const.DESC)) self.assertEqual(pool1[const.DESCRIPTION], pools[1][const.DESCRIPTION]) self.assertEqual(pool2[const.DESCRIPTION], pools[2][const.DESCRIPTION]) self.assertEqual(pool3[const.DESCRIPTION], pools[0][const.DESCRIPTION]) # Test sort ascending by description pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{sort}={descr}:{asc}' .format(lb_id=lb_id, sort=const.SORT, descr=const.DESCRIPTION, asc=const.ASC)) self.assertEqual(pool1[const.DESCRIPTION], pools[1][const.DESCRIPTION]) self.assertEqual(pool2[const.DESCRIPTION], pools[0][const.DESCRIPTION]) self.assertEqual(pool3[const.DESCRIPTION], pools[2][const.DESCRIPTION]) # Test fields for field in const.SHOW_POOL_RESPONSE_FIELDS: pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{fields}={field}' .format(lb_id=lb_id, fields=const.FIELDS, field=field)) self.assertEqual(1, len(pools[0])) self.assertEqual(pool1[field], pools[0][field]) self.assertEqual(pool2[field], pools[1][field]) self.assertEqual(pool3[field], pools[2][field]) # Test multiple fields at the same time pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{fields}={admin}&' '{fields}={created}'.format( lb_id=lb_id, fields=const.FIELDS, admin=const.ADMIN_STATE_UP, created=const.CREATED_AT)) self.assertEqual(2, len(pools[0])) self.assertTrue(pools[0][const.ADMIN_STATE_UP]) parser.parse(pools[0][const.CREATED_AT]) self.assertTrue(pools[1][const.ADMIN_STATE_UP]) parser.parse(pools[1][const.CREATED_AT]) self.assertFalse(pools[2][const.ADMIN_STATE_UP]) parser.parse(pools[2][const.CREATED_AT]) # Test filtering pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{desc}={lb_desc}'.format( lb_id=lb_id, desc=const.DESCRIPTION, lb_desc=pool2[const.DESCRIPTION])) self.assertEqual(1, len(pools)) self.assertEqual(pool2[const.DESCRIPTION], pools[0][const.DESCRIPTION]) # Test combined params pools = self.mem_pool_client.list_pools( query_params='loadbalancer_id={lb_id}&{admin}={true}&' '{fields}={descr}&{fields}={id}&' '{sort}={descr}:{desc}'.format( lb_id=lb_id, admin=const.ADMIN_STATE_UP, true=const.ADMIN_STATE_UP_TRUE, fields=const.FIELDS, descr=const.DESCRIPTION, id=const.ID, sort=const.SORT, desc=const.DESC)) # Should get two pools self.assertEqual(2, len(pools)) # pools should have two fields self.assertEqual(2, len(pools[0])) # Should be in descending order self.assertEqual(pool2[const.DESCRIPTION], pools[1][const.DESCRIPTION]) self.assertEqual(pool1[const.DESCRIPTION], pools[0][const.DESCRIPTION]) # Creating a list of 3 pools, each one contains different tags if self.mem_pool_client.is_version_supported( self.api_version, '2.5'): list_of_pools = [pool1, pool2, pool3] test_list = [] for pool in list_of_pools: # If tags "English" and "Creativity" are in the pool's tags # and "Spanish" is not, add the pool to the list if "English" in pool[const.TAGS] and "Creativity" in ( pool[const.TAGS]) and "Spanish" not in ( pool[const.TAGS]): test_list.append(pool[const.NAME]) # Tests if only the first and the third ones have those tags self.assertEqual( test_list, [pool1[const.NAME], pool3[const.NAME]]) # Tests that filtering by an empty tag will return an empty list self.assertTrue(not any(["" in pool[const.TAGS] for pool in list_of_pools]))
[docs] @decorators.idempotent_id('416c72c6-ef63-4e70-b27e-3ed95b93c02d') def test_HTTP_LC_pool_show(self): self._test_pool_show(const.HTTP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('82568809-bdb9-444b-9790-128d0c328d72') def test_HTTPS_LC_pool_show(self): self._test_pool_show(const.HTTPS, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('93e4bc67-ce12-43fb-a50d-97de47c3a63f') def test_PROXY_LC_pool_show(self): self._test_pool_show(const.PROXY, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('ee910c1e-1704-4b41-99c1-0c1f904e577d') def test_TCP_LC_pool_show(self): self._test_pool_show(const.TCP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('5f4339f6-0387-44f4-a5f9-e385d44b5ee2') def test_UDP_LC_pool_show(self): self._test_pool_show(const.UDP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('b7932438-1aea-4175-a50c-984fee1c0cad') def test_HTTP_RR_pool_show(self): self._test_pool_show(const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('a1bffe2f-ce20-4d79-a168-bc930de5edcb') def test_HTTPS_RR_pool_show(self): self._test_pool_show(const.HTTPS, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('4cf9fa5c-d8e0-4253-8b79-2eb59e066772') def test_PROXY_RR_pool_show(self): self._test_pool_show(const.PROXY, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('e6e91bb3-76b3-4ff8-ad60-d20ac1e64381') def test_TCP_RR_pool_show(self): self._test_pool_show(const.TCP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('7c4a1c90-7fc2-42ee-ad78-d7c75b5a56d2') def test_UDP_RR_pool_show(self): self._test_pool_show(const.UDP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('af1c1b10-a6ac-4f28-82ba-2c0770903a5c') def test_HTTP_SI_pool_show(self): self._test_pool_show(const.HTTP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('64434a6d-222e-4056-bcc0-335ebe4f03ee') def test_HTTPS_SI_pool_show(self): self._test_pool_show(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('adbb7f3b-7a37-4a8e-a2b4-c3f827dad0ba') def test_PROXY_SI_pool_show(self): self._test_pool_show(const.PROXY, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('55f62d1a-33b0-4263-84af-672a30ee52bd') def test_TCP_SI_pool_show(self): self._test_pool_show(const.TCP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('5b961eee-183d-435c-bdf5-b83ca68c4944') def test_UDP_SI_pool_show(self): self._test_pool_show(const.UDP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('59964666-3dfe-4bad-81e0-bc5a4809c10c') def test_HTTP_SIP_pool_show(self): self._test_pool_show(const.HTTP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('9f8f855c-cd09-4a74-b5f2-c5c13b59422e') def test_HTTPS_SIP_pool_show(self): self._test_pool_show(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('1194bd18-20bc-43e7-b588-9f78a72e0021') def test_PROXY_SIP_pool_show(self): self._test_pool_show(const.PROXY, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('6003cbe8-73a5-416a-9be0-7aa5699dc157') def test_TCP_SIP_pool_show(self): self._test_pool_show(const.TCP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('1400529e-3a0c-4bac-b6ed-669fdd723956') def test_UDP_SIP_pool_show(self): self._test_pool_show(const.UDP, const.LB_ALGORITHM_SOURCE_IP_PORT)
# Test with session persistence
[docs] @decorators.idempotent_id('373f1c80-e51e-4260-b8d8-f6aeb512f81c') def test_HTTP_RR_source_IP_pool_show(self): self._test_pool_show( const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
[docs] @decorators.idempotent_id('bd732c36-bdaa-4591-bf4e-28268874d22c') def test_UDP_RR_source_IP_pool_show(self): self._test_pool_show( const.UDP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
def _test_pool_show(self, pool_protocol, algorithm, session_persistence=None): """Tests pool show API. * Create a fully populated pool. * Show pool details. * Validate the show reflects the requested values. * Validates that other accounts cannot see the pool. """ if (algorithm == const.LB_ALGORITHM_SOURCE_IP_PORT and not self.mem_listener_client.is_version_supported( self.api_version, '2.13')): raise testtools.TestCase.skipException( 'Skipping this test as load balancing algorithm ' 'SOURCE_IP_PORT requires API version 2.13 or newer.') pool_name = data_utils.rand_name("lb_member_pool1-show") pool_description = data_utils.arbitrary_string(size=255) pool_sp_cookie_name = 'my_cookie' pool_kwargs = { const.NAME: pool_name, const.DESCRIPTION: pool_description, const.ADMIN_STATE_UP: True, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: self.lb_id, } if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE, const.COOKIE_NAME: pool_sp_cookie_name } elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE } elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_SOURCE_IP } # This is a special case as the reference driver does not support # SOURCE-IP-PORT. Since it runs with not_implemented_is_error, we must # handle this test case special. try: pool = self.mem_pool_client.create_pool(**pool_kwargs) except exceptions.NotImplemented as e: if algorithm != const.LB_ALGORITHM_SOURCE_IP_PORT: raise message = ("The configured provider driver '{driver}' " "does not support a feature required for this " "test.".format(driver=CONF.load_balancer.provider)) if hasattr(e, 'resp_body'): message = e.resp_body.get('faultstring', message) raise testtools.TestCase.skipException(message) self.addCleanup( self.mem_pool_client.cleanup_pool, pool[const.ID], lb_client=self.mem_lb_client, lb_id=self.lb_id) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) self.assertEqual(pool_name, pool[const.NAME]) self.assertEqual(pool_description, pool[const.DESCRIPTION]) self.assertTrue(pool[const.ADMIN_STATE_UP]) parser.parse(pool[const.CREATED_AT]) parser.parse(pool[const.UPDATED_AT]) UUID(pool[const.ID]) # Operating status for pools will always be offline without members self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS]) self.assertEqual(pool_protocol, pool[const.PROTOCOL]) self.assertEqual(1, len(pool[const.LOADBALANCERS])) self.assertEqual(self.lb_id, pool[const.LOADBALANCERS][0][const.ID]) self.assertEmpty(pool[const.LISTENERS]) self.assertEqual(algorithm, pool[const.LB_ALGORITHM]) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_APP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertEqual(pool_sp_cookie_name, pool[const.SESSION_PERSISTENCE][ const.COOKIE_NAME]) elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_HTTP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_SOURCE_IP, pool[const.SESSION_PERSISTENCE][const.TYPE]) # Test that the appropriate users can see or not see the pool # based on the API RBAC. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_system_reader', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_system_reader', 'os_roles_lb_admin', 'os_roles_lb_global_observer', 'os_roles_lb_member'] if expected_allowed: self.check_show_RBAC_enforcement( 'PoolClient', 'show_pool', expected_allowed, pool[const.ID])
[docs] @decorators.idempotent_id('d73755fe-ba3a-4248-9543-8e167a5aa7f4') def test_HTTP_LC_pool_update(self): self._test_pool_update(const.HTTP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('ca641999-7817-4f8f-a58b-2ccd7a5dca97') def test_HTTPS_LC_pool_update(self): self._test_pool_update(const.HTTPS, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('67a2cbab-f4fc-41c8-93e8-97ddba39c1ab') def test_PROXY_LC_pool_update(self): self._test_pool_update(const.PROXY, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('c9f1ed23-f6d4-4d44-9d22-bdc1fbe5854d') def test_TCP_LC_pool_update(self): self._test_pool_update(const.TCP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('8e6b8802-c4a7-43eb-a4e8-9f6bf7899a7d') def test_UDP_LC_pool_update(self): self._test_pool_update(const.UDP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('7bd0a6bf-57b4-46a6-83ef-f9991896658a') def test_HTTP_RR_pool_update(self): self._test_pool_update(const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('ac097c2e-4f79-4714-8de4-517598d37919') def test_HTTPS_RR_pool_update(self): self._test_pool_update(const.HTTPS, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('4392bc21-c18e-4e25-bb7e-2c9e3777d784') def test_PROXY_RR_pool_update(self): self._test_pool_update(const.PROXY, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('f6a5970d-2f27-419b-a0ee-7a420ee7b396') def test_TCP_RR_pool_update(self): self._test_pool_update(const.TCP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('a1cded67-9fd6-4155-8761-ce165d518b47') def test_UDP_RR_pool_update(self): self._test_pool_update(const.UDP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('42a742d2-ef9c-47fd-8585-5588bb867431') def test_HTTP_SI_pool_update(self): self._test_pool_update(const.HTTP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('3b4e6462-4e0c-4c05-bc30-d6f86f67bb60') def test_HTTPS_SI_pool_update(self): self._test_pool_update(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('d2cb7a0a-8268-46bc-a519-08474c42c4ca') def test_PROXY_SI_pool_update(self): self._test_pool_update(const.PROXY, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('84e63663-0bf7-45bc-a4d9-b3bbd664fd8c') def test_TCP_SI_pool_update(self): self._test_pool_update(const.TCP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('cdb230b9-996a-4933-a7a2-a7b09465c18c') def test_UDP_SI_pool_update(self): self._test_pool_update(const.UDP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('7c770af5-782e-453c-bd2e-41ec90b37907') def test_HTTP_SIP_pool_update(self): self._test_pool_update(const.HTTP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('72cee49d-36d5-4b54-8883-8fe7be9fd0f0') def test_HTTPS_SIP_pool_update(self): self._test_pool_update(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('f269293c-b6fa-4fe2-82a6-57fc8ef89260') def test_PROXY_SIP_pool_update(self): self._test_pool_update(const.PROXY, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('f5445a86-247f-4075-8b71-e4e5415d0bed') def test_TCP_SIP_pool_update(self): self._test_pool_update(const.TCP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('d9e1aeee-21c3-4b0f-9685-834768597607') def test_UDP_SIP_pool_update(self): self._test_pool_update(const.UDP, const.LB_ALGORITHM_SOURCE_IP_PORT)
# Test with session persistence
[docs] @decorators.idempotent_id('2e7bbf67-ed32-4a3c-b5ae-1aff8b07bacc') def test_HTTP_RR_source_IP_pool_update(self): self._test_pool_update( const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
[docs] @decorators.idempotent_id('28b90650-a612-4b10-981f-d3dd6a366e4f') def test_UDP_RR_source_IP_pool_update(self): self._test_pool_update( const.UDP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
def _test_pool_update(self, pool_protocol, algorithm, session_persistence=None): """Tests pool update and show APIs. * Create a fully populated pool. * Show pool details. * Validate the show reflects the initial values. * Validates that other accounts cannot update the pool. * Update the pool details. * Show pool details. * Validate the show reflects the updated values. """ if (algorithm == const.LB_ALGORITHM_SOURCE_IP_PORT and not self.mem_listener_client.is_version_supported( self.api_version, '2.13')): raise testtools.TestCase.skipException( 'Skipping this test as load balancing algorithm ' 'SOURCE_IP_PORT requires API version 2.13 or newer.') pool_name = data_utils.rand_name("lb_member_pool1-update") pool_description = data_utils.arbitrary_string(size=255) pool_sp_cookie_name = 'my_cookie' pool_kwargs = { const.NAME: pool_name, const.DESCRIPTION: pool_description, const.ADMIN_STATE_UP: False, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: self.lb_id, } if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): pool_tags = ["Hello", "World"] pool_kwargs.update({ const.TAGS: pool_tags }) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE, const.COOKIE_NAME: pool_sp_cookie_name } elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE } elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_SOURCE_IP } # This is a special case as the reference driver does not support # SOURCE-IP-PORT. Since it runs with not_implemented_is_error, we must # handle this test case special. try: pool = self.mem_pool_client.create_pool(**pool_kwargs) except exceptions.NotImplemented as e: if algorithm != const.LB_ALGORITHM_SOURCE_IP_PORT: raise message = ("The configured provider driver '{driver}' " "does not support a feature required for this " "test.".format(driver=CONF.load_balancer.provider)) if hasattr(e, 'resp_body'): message = e.resp_body.get('faultstring', message) raise testtools.TestCase.skipException(message) self.addCleanup( self.mem_pool_client.cleanup_pool, pool[const.ID], lb_client=self.mem_lb_client, lb_id=self.lb_id) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) self.assertEqual(pool_name, pool[const.NAME]) self.assertEqual(pool_description, pool[const.DESCRIPTION]) self.assertFalse(pool[const.ADMIN_STATE_UP]) parser.parse(pool[const.CREATED_AT]) parser.parse(pool[const.UPDATED_AT]) UUID(pool[const.ID]) # Operating status for pools will always be offline without members self.assertEqual(const.OFFLINE, pool[const.OPERATING_STATUS]) self.assertEqual(pool_protocol, pool[const.PROTOCOL]) self.assertEqual(1, len(pool[const.LOADBALANCERS])) self.assertEqual(self.lb_id, pool[const.LOADBALANCERS][0][const.ID]) self.assertEmpty(pool[const.LISTENERS]) self.assertEqual(algorithm, pool[const.LB_ALGORITHM]) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_APP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertEqual(pool_sp_cookie_name, pool[const.SESSION_PERSISTENCE][ const.COOKIE_NAME]) elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_HTTP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_SOURCE_IP, pool[const.SESSION_PERSISTENCE][const.TYPE]) # Test that a user, without the loadbalancer member role, cannot # update this pool. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if expected_allowed: self.check_update_RBAC_enforcement( 'PoolClient', 'update_pool', expected_allowed, None, None, pool[const.ID], admin_state_up=True) # Assert we didn't go into PENDING_* pool_check = self.mem_pool_client.show_pool( pool[const.ID]) self.assertEqual(const.ACTIVE, pool_check[const.PROVISIONING_STATUS]) self.assertFalse(pool_check[const.ADMIN_STATE_UP]) if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): self.assertCountEqual(pool_kwargs[const.TAGS], pool[const.TAGS]) new_name = data_utils.rand_name("lb_member_pool1-UPDATED") new_description = data_utils.arbitrary_string(size=255, base_text='new') # We have to set it to the same protocol as not all # drivers support more than one pool algorithm pool_update_kwargs = { const.NAME: new_name, const.DESCRIPTION: new_description, const.ADMIN_STATE_UP: True, const.LB_ALGORITHM: algorithm, } if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): new_tags = ["Hola", "Mundo"] pool_update_kwargs.update({ const.TAGS: new_tags }) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: pool_update_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE } elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: pool_update_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE, const.COOKIE_NAME: pool_sp_cookie_name } elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: # Some protocols only support source IP session persistence # so set this to the same. pool_update_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_SOURCE_IP } pool = self.mem_pool_client.update_pool( pool[const.ID], **pool_update_kwargs) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) self.assertEqual(new_name, pool[const.NAME]) self.assertEqual(new_description, pool[const.DESCRIPTION]) self.assertTrue(pool[const.ADMIN_STATE_UP]) self.assertEqual(algorithm, pool[const.LB_ALGORITHM]) if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_HTTP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertIsNone( pool[const.SESSION_PERSISTENCE].get(const.COOKIE_NAME)) elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_APP_COOKIE, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertEqual(pool_sp_cookie_name, pool[const.SESSION_PERSISTENCE][ const.COOKIE_NAME]) elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: self.assertIsNotNone(pool.get(const.SESSION_PERSISTENCE)) self.assertEqual(const.SESSION_PERSISTENCE_SOURCE_IP, pool[const.SESSION_PERSISTENCE][const.TYPE]) self.assertIsNone( pool[const.SESSION_PERSISTENCE].get(const.COOKIE_NAME)) if self.mem_lb_client.is_version_supported(self.api_version, '2.5'): self.assertCountEqual(pool_update_kwargs[const.TAGS], pool[const.TAGS]) # Also test removing a Session Persistence if session_persistence is not None: pool_update_kwargs = { const.SESSION_PERSISTENCE: None, } pool = self.mem_pool_client.update_pool( pool[const.ID], **pool_update_kwargs) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) pool = waiters.wait_for_status( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) if session_persistence is not None: self.assertIsNone(pool.get(const.SESSION_PERSISTENCE))
[docs] @decorators.idempotent_id('008088c8-696e-47ba-bc18-75827fe5956b') def test_HTTP_LC_pool_delete(self): self._test_pool_delete(const.HTTP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('c4b2dad0-378f-4f85-a1f3-597de609b0f3') def test_HTTPS_LC_pool_delete(self): self._test_pool_delete(const.HTTPS, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('d906c63e-6090-422c-9627-e5a971e1665c') def test_PROXY_LC_pool_delete(self): self._test_pool_delete(const.PROXY, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('3bfd2d96-813b-48af-86e0-97361873a68a') def test_TCP_LC_pool_delete(self): self._test_pool_delete(const.TCP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('ea58bede-1934-480b-86fc-665b872fc946') def test_UDP_LC_pool_delete(self): self._test_pool_delete(const.UDP, const.LB_ALGORITHM_LEAST_CONNECTIONS)
[docs] @decorators.idempotent_id('35ed3800-7a4a-47a6-9b94-c1033fff1112') def test_HTTP_RR_pool_delete(self): self._test_pool_delete(const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('c305126b-3ead-4ea8-a886-77d355c0d4a2') def test_HTTPS_RR_pool_delete(self): self._test_pool_delete(const.HTTPS, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('729be91c-82c5-4b4e-9feb-08a1c786488b') def test_PROXY_RR_pool_delete(self): self._test_pool_delete(const.PROXY, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('a455dea2-19ce-435c-90ae-e143fe84245e') def test_TCP_RR_pool_delete(self): self._test_pool_delete(const.TCP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('63559694-6b38-4bad-9f10-3675131b28c0') def test_UDP_RR_pool_delete(self): self._test_pool_delete(const.UDP, const.LB_ALGORITHM_ROUND_ROBIN)
[docs] @decorators.idempotent_id('06bec76b-8fbf-4be8-9350-92590ac48606') def test_HTTP_SI_pool_delete(self): self._test_pool_delete(const.HTTP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('4b21149e-64f8-4e5f-8f71-020abbd0d0eb') def test_HTTPS_SI_pool_delete(self): self._test_pool_delete(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('277fba8f-d72b-47f0-9723-5e013f53fb7a') def test_PROXY_SI_pool_delete(self): self._test_pool_delete(const.PROXY, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('8411295f-aec0-40ab-a25d-a4677c711d98') def test_TCP_SI_pool_delete(self): self._test_pool_delete(const.TCP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('33322f21-12cc-4f2e-b406-0c11b05a1c6e') def test_UDP_SI_pool_delete(self): self._test_pool_delete(const.UDP, const.LB_ALGORITHM_SOURCE_IP)
[docs] @decorators.idempotent_id('9b40351e-1140-4b98-974c-46bd1a19763d') def test_HTTP_SIP_pool_delete(self): self._test_pool_delete(const.HTTP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('391a4ed7-be97-4231-8198-5c2802bc6e30') def test_HTTPS_SIP_pool_delete(self): self._test_pool_delete(const.HTTPS, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('1f6b6b9c-96c6-420b-bc51-8568c081a1ee') def test_PROXY_SIP_pool_delete(self): self._test_pool_delete(const.PROXY, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('fe54f133-865a-4613-9cf0-0469c780f53e') def test_TCP_SIP_pool_delete(self): self._test_pool_delete(const.TCP, const.LB_ALGORITHM_SOURCE_IP_PORT)
[docs] @decorators.idempotent_id('7cac0520-c7ea-49cb-8b38-0e309af2ea53') def test_UDP_SIP_pool_delete(self): self._test_pool_delete(const.UDP, const.LB_ALGORITHM_SOURCE_IP_PORT)
# Test with session persistence
[docs] @decorators.idempotent_id('07528fe6-12a6-4fca-8819-9980e9d3db84') def test_HTTP_RR_source_IP_pool_delete(self): self._test_pool_delete( const.HTTP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
[docs] @decorators.idempotent_id('cc69c0d0-9191-4faf-a154-e33df880f44e') def test_UDP_RR_source_IP_pool_delete(self): self._test_pool_delete( const.UDP, const.LB_ALGORITHM_ROUND_ROBIN, session_persistence=const.SESSION_PERSISTENCE_SOURCE_IP)
def _test_pool_delete(self, pool_protocol, algorithm, session_persistence=None): """Tests pool create and delete APIs. * Creates a pool. * Validates that other accounts cannot delete the pool * Deletes the pool. * Validates the pool is in the DELETED state. """ if (algorithm == const.LB_ALGORITHM_SOURCE_IP_PORT and not self.mem_listener_client.is_version_supported( self.api_version, '2.13')): raise testtools.TestCase.skipException( 'Skipping this test as load balancing algorithm ' 'SOURCE_IP_PORT requires API version 2.13 or newer.') pool_name = data_utils.rand_name("lb_member_pool1-delete") pool_sp_cookie_name = 'my_cookie' pool_kwargs = { const.NAME: pool_name, const.PROTOCOL: pool_protocol, const.LB_ALGORITHM: algorithm, const.LOADBALANCER_ID: self.lb_id, } if session_persistence == const.SESSION_PERSISTENCE_APP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE, const.COOKIE_NAME: pool_sp_cookie_name } elif session_persistence == const.SESSION_PERSISTENCE_HTTP_COOKIE: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE } elif session_persistence == const.SESSION_PERSISTENCE_SOURCE_IP: pool_kwargs[const.SESSION_PERSISTENCE] = { const.TYPE: const.SESSION_PERSISTENCE_SOURCE_IP } # This is a special case as the reference driver does not support # SOURCE-IP-PORT. Since it runs with not_implemented_is_error, we must # handle this test case special. try: pool = self.mem_pool_client.create_pool(**pool_kwargs) except exceptions.NotImplemented as e: if algorithm != const.LB_ALGORITHM_SOURCE_IP_PORT: raise message = ("The configured provider driver '{driver}' " "does not support a feature required for this " "test.".format(driver=CONF.load_balancer.provider)) if hasattr(e, 'resp_body'): message = e.resp_body.get('faultstring', message) raise testtools.TestCase.skipException(message) self.addCleanup( self.mem_pool_client.cleanup_pool, pool[const.ID], lb_client=self.mem_lb_client, lb_id=self.lb_id) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.build_interval, CONF.load_balancer.build_timeout) # Test that a user without the loadbalancer role cannot delete this # pool. expected_allowed = [] if CONF.load_balancer.RBAC_test_type == const.OWNERADMIN: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.KEYSTONE_DEFAULT_ROLES: expected_allowed = ['os_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if CONF.load_balancer.RBAC_test_type == const.ADVANCED: expected_allowed = ['os_system_admin', 'os_roles_lb_admin', 'os_roles_lb_member'] if expected_allowed: self.check_delete_RBAC_enforcement( 'PoolClient', 'delete_pool', expected_allowed, None, None, pool[const.ID]) self.mem_pool_client.delete_pool(pool[const.ID]) waiters.wait_for_deleted_status_or_not_found( self.mem_pool_client.show_pool, pool[const.ID], const.PROVISIONING_STATUS, CONF.load_balancer.check_interval, CONF.load_balancer.check_timeout) waiters.wait_for_status( self.mem_lb_client.show_loadbalancer, self.lb_id, const.PROVISIONING_STATUS, const.ACTIVE, CONF.load_balancer.check_interval, CONF.load_balancer.check_timeout)