Adding LB functionality test coverage into: "_test_load_balancer_CRUD"

1) When no pool is associated with VIP, 503 status code is expected
   Note: HTTP listener should exist.
2) Traffic toward VIP should fail, if LB instance has beed deleted
Note: to save execution time, the above is tested for ipv4 only.

Change-Id: Ifc0dda5f810244251baa8823f1a7f519ea3c683c
This commit is contained in:
Arkady Shtempler 2020-09-30 15:40:13 +03:00
parent c50539cc07
commit c337b48c7e
1 changed files with 110 additions and 24 deletions

View File

@ -22,6 +22,7 @@ from oslo_serialization import jsonutils
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
@ -84,7 +85,7 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
cls.flavor = None
@decorators.idempotent_id('a5e2e120-4f7e-4c8b-8aac-cf09cb56711c')
def test_load_balancer_ipv4_CRUD(self):
def test_load_balancer_ipv4_CRUD_and_503_status_code(self):
self._test_load_balancer_CRUD(4)
@decorators.idempotent_id('86ffecc4-dce8-46f9-936e-8a4c6bcf3959')
@ -94,13 +95,20 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
self._test_load_balancer_CRUD(6)
def _test_load_balancer_CRUD(self, ip_version):
"""Tests load balancer create, read, update, delete
"""Tests Load Balancer create, read, update, delete
* Create a fully populated load balancer.
* Show load balancer details.
* Update the load balancer.
* Delete the load balancer.
* Create a fully populated Load Balancer
* Show Load Balancer details.
* Create FIP and associate with LB VIP Address
* Create an HTTP listener
* Update the Load Balancer
* Send HTTP request and validate 503 status code
* Delete the Load Balancer.
* Send HTTP request to ensure that no data is back
* as the LB has been already deleted.
"""
# Load Balancer create
lb_name = data_utils.rand_name("lb_member_lb1-CRUD")
lb_description = data_utils.arbitrary_string(size=255)
@ -146,28 +154,98 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
if lb_kwargs[const.VIP_SUBNET_ID]:
self.assertEqual(lb_kwargs[const.VIP_SUBNET_ID],
lb[const.VIP_SUBNET_ID])
if ip_version == 4:
# Create a router (needed for FIP creation)
router_name = data_utils.rand_name("lb_member_router")
result = self.lb_mem_routers_client.create_router(
name=router_name, admin_state_up=True,
external_gateway_info=dict(
network_id=CONF.network.public_network_id))
self.lb_member_router = result['router']
LOG.info('lb_member_router: {}'.format(self.lb_member_router))
self.addClassResourceCleanup(
waiters.wait_for_not_found,
self.lb_mem_routers_client.delete_router,
self.lb_mem_routers_client.show_router,
self.lb_member_router['id'])
# Load balancer update
new_name = data_utils.rand_name("lb_member_lb1-update")
new_description = data_utils.arbitrary_string(size=255,
base_text='new')
lb = self.mem_lb_client.update_loadbalancer(
lb[const.ID],
admin_state_up=True,
description=new_description,
name=new_name)
# Add VIP subnet to the router
self.lb_mem_routers_client.add_router_interface(
self.lb_member_router['id'],
subnet_id=self.lb_member_vip_subnet['id'])
self.addClassResourceCleanup(
waiters.wait_for_not_found,
self.lb_mem_routers_client.remove_router_interface,
self.lb_mem_routers_client.remove_router_interface,
self.lb_member_router['id'],
subnet_id=self.lb_member_vip_subnet['id'])
lb = waiters.wait_for_status(self.mem_lb_client.show_loadbalancer,
lb[const.ID], const.PROVISIONING_STATUS,
const.ACTIVE,
CONF.load_balancer.lb_build_interval,
CONF.load_balancer.lb_build_timeout)
# Create a Floating IP and associate with LB VIP
port_id = lb[const.VIP_PORT_ID]
result = self.lb_mem_float_ip_client.create_floatingip(
floating_network_id=CONF.network.public_network_id,
port_id=port_id)
floating_ip = result['floatingip']
LOG.info('lb_floating_ip: {}'.format(floating_ip))
self.addClassResourceCleanup(
waiters.wait_for_not_found,
self.lb_mem_float_ip_client.delete_floatingip,
self.lb_mem_float_ip_client.show_floatingip,
floatingip_id=floating_ip['id'])
self.lb_vip_address = floating_ip['floating_ip_address']
self.assertTrue(lb[const.ADMIN_STATE_UP])
self.assertEqual(new_description, lb[const.DESCRIPTION])
self.assertEqual(new_name, lb[const.NAME])
# Create a listener, this is MUST when we don't have a pool
# associated with LB, but do want to send some traffic.
# In case of HTTP it will respond with 503 Status code.
protocol_port = '80'
listener_name = data_utils.rand_name("lb_member_listener")
listener_kwargs = {
const.NAME: listener_name,
const.PROTOCOL: const.HTTP,
const.PROTOCOL_PORT: protocol_port,
const.LOADBALANCER_ID: lb['id'],
const.CONNECTION_LIMIT: 200,
}
listener = self.mem_listener_client.create_listener(
**listener_kwargs)
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)
listener_id = listener['id']
self.addCleanup(
self.mem_listener_client.cleanup_listener,
listener_id,
lb_client=self.mem_lb_client, lb_id=lb['id'])
# Load balancer delete
# Load Balancer update
new_name = data_utils.rand_name("lb_member_lb1-update")
new_description = data_utils.arbitrary_string(size=255,
base_text='new')
lb = self.mem_lb_client.update_loadbalancer(
lb[const.ID],
admin_state_up=True,
description=new_description,
name=new_name)
lb = waiters.wait_for_status(self.mem_lb_client.show_loadbalancer,
lb[const.ID],
const.PROVISIONING_STATUS,
const.ACTIVE,
CONF.load_balancer.lb_build_interval,
CONF.load_balancer.lb_build_timeout)
self.assertTrue(lb[const.ADMIN_STATE_UP])
self.assertEqual(new_description, lb[const.DESCRIPTION])
self.assertEqual(new_name, lb[const.NAME])
# Send HTTP traffic to validate 503 response status code
URL = 'http://{}:{}'.format(
floating_ip['floating_ip_address'], protocol_port)
self.validate_URL_response(URL, expected_status_code=503)
# Delete the Load Balancer
self.mem_lb_client.delete_loadbalancer(lb[const.ID], cascade=True)
waiters.wait_for_deleted_status_or_not_found(
@ -175,3 +253,11 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
const.PROVISIONING_STATUS,
CONF.load_balancer.check_interval,
CONF.load_balancer.check_timeout)
if ip_version == 4:
# Send HTTP traffic, Expected connection timeout
# as the LB has been deleted.
self.assertRaises(
exceptions.TimeoutException, self.make_request,
vip_address=floating_ip['floating_ip_address'],
protocol_port=protocol_port, request_timeout=10)