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:
parent
c50539cc07
commit
c337b48c7e
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue