Add tags API tests

This patch adds some API tests in the create, list and update methods
of the Octavia objects that support Tags.

Tags are supported on Octavia API version 2.5 or later.

Change-Id: Ib14852d57535508fecee2705e704954cfd078474
This commit is contained in:
oschwart 2020-06-16 18:23:53 +03:00
parent beb1cbaebb
commit 540bb3b4d0
20 changed files with 697 additions and 66 deletions

View File

@ -56,6 +56,7 @@ CONNECTION_LIMIT = 'connection_limit'
INSERT_HEADERS = 'insert_headers'
X_FORWARDED_FOR = 'X-Forwarded-For'
X_FORWARDED_PORT = 'X-Forwarded-Port'
TAGS = 'tags'
TIMEOUT_CLIENT_DATA = 'timeout_client_data'
TIMEOUT_MEMBER_CONNECT = 'timeout_member_connect'
TIMEOUT_MEMBER_DATA = 'timeout_member_data'

View File

@ -27,7 +27,7 @@ class HealthMonitorClient(base_client.BaseLBaaSClient):
resource_name = 'healthmonitor'
def create_healthmonitor(self, pool_id, type, delay, timeout, max_retries,
max_retries_down=Unset, name=Unset,
max_retries_down=Unset, name=Unset, tags=Unset,
http_method=Unset, url_path=Unset,
expected_codes=Unset, admin_state_up=Unset,
return_object_only=True):
@ -44,6 +44,7 @@ class HealthMonitorClient(base_client.BaseLBaaSClient):
changing the operating status of the member to
ERROR.
:param name: Human-readable name of the resource.
:param tags: Human-readable tags of the resource.
:param http_method: The HTTP method that the health monitor uses for
requests.
:param url_path: The HTTP URL path of the request sent by the monitor
@ -167,7 +168,7 @@ class HealthMonitorClient(base_client.BaseLBaaSClient):
def update_healthmonitor(self, healthmonitor_id, delay=Unset,
timeout=Unset, max_retries=Unset,
max_retries_down=Unset, name=Unset,
max_retries_down=Unset, name=Unset, tags=Unset,
http_method=Unset, url_path=Unset,
expected_codes=Unset, admin_state_up=Unset,
return_object_only=True):
@ -183,6 +184,7 @@ class HealthMonitorClient(base_client.BaseLBaaSClient):
changing the operating status of the member to
ERROR.
:param name: Human-readable name of the resource.
:param tags: Human-readable tags of the resource.
:param http_method: The HTTP method that the health monitor uses for
requests.
:param url_path: The HTTP URL path of the request sent by the monitor

View File

@ -27,7 +27,7 @@ class L7PolicyClient(base_client.BaseLBaaSClient):
resource_name = 'l7policy'
def create_l7policy(self, listener_id, action, name=Unset,
description=Unset, admin_state_up=Unset,
description=Unset, tags=Unset, admin_state_up=Unset,
position=Unset, redirect_pool_id=Unset,
redirect_url=Unset, return_object_only=True):
"""Create a l7policy.
@ -36,6 +36,7 @@ class L7PolicyClient(base_client.BaseLBaaSClient):
:param action: The l7policy action.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param position: The position of this policy on the listener.
@ -157,7 +158,7 @@ class L7PolicyClient(base_client.BaseLBaaSClient):
return_object_only=return_object_only)
def update_l7policy(self, l7policy_id, action=Unset, name=Unset,
description=Unset, admin_state_up=Unset,
description=Unset, tags=Unset, admin_state_up=Unset,
position=Unset, redirect_pool_id=Unset,
redirect_url=Unset, return_object_only=True):
"""Update a l7policy.
@ -166,6 +167,7 @@ class L7PolicyClient(base_client.BaseLBaaSClient):
:param action: The l7policy action.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param position: The position of this policy on the listener.

View File

@ -38,7 +38,7 @@ class L7RuleClient(base_client.BaseLBaaSClient):
object=self.list_root_tag
)
def create_l7rule(self, l7policy_id, type, value, compare_type,
def create_l7rule(self, l7policy_id, type, value, compare_type, tags=Unset,
admin_state_up=Unset, key=Unset, invert=Unset,
return_object_only=True):
"""Create a l7rule.
@ -47,6 +47,7 @@ class L7RuleClient(base_client.BaseLBaaSClient):
:param type: The L7 rule type.
:param value: The value to use for the comparison.
:param compare_type: The comparison type for the L7 rule.
:param tags: The tags of the L7 rule.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param key: The key to use for the comparison.
@ -171,8 +172,8 @@ class L7RuleClient(base_client.BaseLBaaSClient):
return_object_only=return_object_only)
def update_l7rule(self, l7rule_id, l7policy_id, type=Unset, value=Unset,
compare_type=Unset, admin_state_up=Unset, key=Unset,
invert=Unset, return_object_only=True):
compare_type=Unset, tags=Unset, admin_state_up=Unset,
key=Unset, invert=Unset, return_object_only=True):
"""Update a l7rule.
:param l7rule_id: The l7rule ID to update.
@ -180,6 +181,7 @@ class L7RuleClient(base_client.BaseLBaaSClient):
:param type: The L7 rule type.
:param value: The value to use for the comparison.
:param compare_type: The comparison type for the L7 rule.
:param tags: The tags of the L7 rule.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param key: The key to use for the comparison.

View File

@ -29,8 +29,9 @@ class ListenerClient(base_client.BaseLBaaSClient):
list_root_tag = 'listeners'
def create_listener(self, protocol, protocol_port, loadbalancer_id,
name=Unset, description=Unset, admin_state_up=Unset,
connection_limit=Unset, timeout_client_data=Unset,
name=Unset, description=Unset, tags=Unset,
admin_state_up=Unset, connection_limit=Unset,
timeout_client_data=Unset,
timeout_member_connect=Unset,
timeout_member_data=Unset, timeout_tcp_inspect=Unset,
insert_headers=Unset, default_pool_id=Unset,
@ -46,6 +47,7 @@ class ListenerClient(base_client.BaseLBaaSClient):
:param loadbalancer_id: The ID of the load balancer.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param connection_limit: The maximum number of connections permitted
@ -198,8 +200,8 @@ class ListenerClient(base_client.BaseLBaaSClient):
return_object_only=return_object_only)
def update_listener(self, listener_id, name=Unset, description=Unset,
admin_state_up=Unset, connection_limit=Unset,
timeout_client_data=Unset,
tags=Unset, admin_state_up=Unset,
connection_limit=Unset, timeout_client_data=Unset,
timeout_member_connect=Unset,
timeout_member_data=Unset, timeout_tcp_inspect=Unset,
insert_headers=Unset, default_pool_id=Unset,
@ -213,6 +215,7 @@ class ListenerClient(base_client.BaseLBaaSClient):
:param listener_id: The listener ID to update.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param connection_limit: The maximum number of connections permitted

View File

@ -39,7 +39,8 @@ class LoadbalancerClient(base_client.BaseLBaaSClient):
listeners=Unset, project_id=Unset, provider=Unset,
vip_address=Unset, vip_network_id=Unset,
vip_port_id=Unset, vip_qos_policy_id=Unset,
vip_subnet_id=Unset, return_object_only=True):
vip_subnet_id=Unset, return_object_only=True,
tags=Unset):
"""Create a loadbalancer.
:param name: Human-readable name of the resource.
@ -56,6 +57,7 @@ class LoadbalancerClient(base_client.BaseLBaaSClient):
:param vip_qos_policy_id: The ID of the QoS Policy which will apply to
the Virtual IP (VIP).
:param vip_subnet_id: The ID of the subnet for the Virtual IP (VIP).
:param tags: A human-readable tags of the resource.
:param return_object_only: If True, the response returns the object
inside the root tag. False returns the full
response from the API.
@ -170,13 +172,15 @@ class LoadbalancerClient(base_client.BaseLBaaSClient):
return_object_only=return_object_only)
def update_loadbalancer(self, lb_id, name=Unset, description=Unset,
admin_state_up=Unset, vip_qos_policy_id=Unset,
tags=Unset, admin_state_up=Unset,
vip_qos_policy_id=Unset,
return_object_only=True):
"""Update a loadbalancer.
:param lb_id: The loadbalancer ID to update.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param vip_qos_policy_id: The ID of the QoS Policy which will apply to

View File

@ -40,7 +40,8 @@ class MemberClient(base_client.BaseLBaaSClient):
)
def create_member(self, pool_id, address, protocol_port,
name=Unset, admin_state_up=Unset, weight=Unset,
name=Unset, tags=Unset, admin_state_up=Unset,
weight=Unset,
backup=Unset, subnet_id=Unset, monitor_address=Unset,
monitor_port=Unset, return_object_only=True):
"""Create a member.
@ -49,12 +50,15 @@ class MemberClient(base_client.BaseLBaaSClient):
:param address: The IP address of the resource.
:param protocol_port: The protocol port number for the resource.
:param name: Human-readable name of the resource.
:param tags: Human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param weight: The weight of a member determines the portion of
requests or connections it services compared to the
other members of the pool.
:param backup: Is the member a backup?
:param subnet_id: The subnet ID which the member service
is accessible from
:param monitor_address: An alternate IP address used for health
monitoring a backend member.
:param monitor_port: An alternate protocol port used for health
@ -178,7 +182,7 @@ class MemberClient(base_client.BaseLBaaSClient):
query_params=query_params,
return_object_only=return_object_only)
def update_member(self, member_id, pool_id, name=Unset,
def update_member(self, member_id, pool_id, name=Unset, tags=Unset,
admin_state_up=Unset, weight=Unset, backup=Unset,
monitor_address=Unset, monitor_port=Unset,
return_object_only=True):
@ -187,6 +191,7 @@ class MemberClient(base_client.BaseLBaaSClient):
:param member_id: The member ID to update.
:param pool_id: The ID of the pool where the member lives.
:param name: Human-readable name of the resource.
:param tags: Human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param weight: The weight of a member determines the portion of

View File

@ -28,6 +28,7 @@ class PoolClient(base_client.BaseLBaaSClient):
def create_pool(self, protocol, lb_algorithm, loadbalancer_id=Unset,
listener_id=Unset, name=Unset, description=Unset,
tags=Unset,
admin_state_up=Unset, session_persistence=Unset,
return_object_only=True):
"""Create a pool.
@ -38,6 +39,7 @@ class PoolClient(base_client.BaseLBaaSClient):
:param listener_id: The ID of the listener for the pool.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param session_persistence: A JSON object specifying the session
@ -156,7 +158,7 @@ class PoolClient(base_client.BaseLBaaSClient):
return_object_only=return_object_only)
def update_pool(self, pool_id, lb_algorithm=Unset, name=Unset,
description=Unset, admin_state_up=Unset,
description=Unset, tags=Unset, admin_state_up=Unset,
session_persistence=Unset, return_object_only=True):
"""Update a pool.
@ -164,6 +166,7 @@ class PoolClient(base_client.BaseLBaaSClient):
:param lb_algorithm: The load balancing algorithm for the pool.
:param name: Human-readable name of the resource.
:param description: A human-readable description for the resource.
:param tags: A human-readable tags of the resource.
:param admin_state_up: The administrative state of the resource, which
is up (true) or down (false).
:param session_persistence: A JSON object specifying the session

View File

@ -118,6 +118,15 @@ class AvailabilityZoneAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(self.availability_zone_profile_id,
availability_zone[const.AVAILABILITY_ZONE_PROFILE_ID])
# Test that availability_zones do not support tags
availability_zone_tags = ["Hello", "World"]
tags_availability_zone_kwargs = availability_zone_kwargs.copy()
tags_availability_zone_kwargs[const.TAGS] = availability_zone_tags
self.assertRaises(
TypeError,
self.lb_admin_availability_zone_client.create_availability_zone,
**tags_availability_zone_kwargs)
@decorators.idempotent_id('bba84c0c-2832-4c4c-90ff-d28acfe4ae36')
def test_availability_zone_list(self):
"""Tests availability zone list API and field filtering.

View File

@ -94,6 +94,17 @@ class AvailabilityZoneProfileAPITest(test_base.LoadBalancerBaseTest):
availability_zone_data_json,
availability_zone_profile[const.AVAILABILITY_ZONE_DATA])
# Testing that availability_zone_profiles do not support tags
availability_zone_profile_tags = ["Hello", "World"]
tags_availability_zone_profile_kwargs = (
availability_zone_profile_kwargs.copy())
tags_availability_zone_profile_kwargs[const.TAGS] = (
availability_zone_profile_tags)
az_profile_client = self.lb_admin_availability_zone_profile_client
self.assertRaises(TypeError,
az_profile_client.create_availability_zone_profile,
**tags_availability_zone_profile_kwargs)
@decorators.idempotent_id('ef7d1c45-e312-46ce-8dcb-f2fe26295658')
def test_availability_zone_profile_list(self):
"""Tests availability zone profile list API and field filtering.

View File

@ -105,6 +105,14 @@ class FlavorAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(self.flavor_profile_id,
flavor[const.FLAVOR_PROFILE_ID])
# Test that flavors do not support tags
flavor_tags = ["Hello", "World"]
tags_flavor_kwargs = flavor_kwargs.copy()
tags_flavor_kwargs[const.TAGS] = flavor_tags
self.assertRaises(TypeError,
self.lb_admin_flavor_client.create_flavor,
**tags_flavor_kwargs)
@decorators.idempotent_id('3ef040ee-fe7e-457b-a56f-8b152f7afa3b')
def test_flavor_list(self):
"""Tests flavor list API and field filtering.

View File

@ -80,6 +80,15 @@ class FlavorProfileAPITest(test_base.LoadBalancerBaseTest):
flavor_profile[const.PROVIDER_NAME])
self.assertEqual(flavor_data_json, flavor_profile[const.FLAVOR_DATA])
# Testing that flavor_profiles do not support tags
flavor_profile_tags = ["Hello", "World"]
tags_flavor_profile_kwargs = flavor_profile_kwargs.copy()
tags_flavor_profile_kwargs[const.TAGS] = flavor_profile_tags
self.assertRaises(
TypeError,
self.lb_admin_flavor_profile_client.create_flavor_profile,
**tags_flavor_profile_kwargs)
@decorators.idempotent_id('c4e17fdf-849a-4132-93ae-dfca21ce4444')
def test_flavor_profile_list(self):
"""Tests flavor profile list API and field filtering.

View File

@ -107,6 +107,13 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.ADMIN_STATE_UP: True,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
hw_tags = ["Hello", "World"]
hm_kwargs.update({
const.TAGS: hw_tags
})
# Test that a user without the loadbalancer role cannot
# create a healthmonitor
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -148,6 +155,10 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
for item in equal_items:
self.assertEqual(hm_kwargs[item], hm[item])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(hw_tags, hm[const.TAGS])
# Helper functions for test healthmonitor list
def _filter_hms_by_pool_id(self, hms, pool_ids):
return [hm for hm in hms
@ -250,6 +261,13 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.EXPECTED_CODES: '200-204',
const.ADMIN_STATE_UP: True,
}
if self.mem_healthmonitor_client.is_version_supported(
self.api_version, '2.5'):
hm1_tags = ["English", "Mathematics",
"Marketing", "Creativity"]
hm1_kwargs.update({const.TAGS: hm1_tags})
hm1 = self.mem_healthmonitor_client.create_healthmonitor(
**hm1_kwargs)
self.addCleanup(
@ -286,6 +304,13 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.EXPECTED_CODES: '200-204',
const.ADMIN_STATE_UP: True,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
hm2_tags = ["English", "Spanish",
"Soft_skills", "Creativity"]
hm2_kwargs.update({const.TAGS: hm2_tags})
hm2 = self.mem_healthmonitor_client.create_healthmonitor(
**hm2_kwargs)
self.addCleanup(
@ -322,6 +347,13 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.EXPECTED_CODES: '200-204',
const.ADMIN_STATE_UP: False,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
hm3_tags = ["English", "Project_management",
"Communication", "Creativity"]
hm3_kwargs.update({const.TAGS: hm3_tags})
hm3 = self.mem_healthmonitor_client.create_healthmonitor(
**hm3_kwargs)
self.addCleanup(
@ -455,6 +487,28 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(hm1[const.NAME],
hms[0][const.NAME])
# Creating a list of 3 healthmonitors, each one contains different tags
if self.mem_healthmonitor_client.is_version_supported(
self.api_version, '2.5'):
list_of_hms = [hm1, hm2, hm3]
test_list = []
for hm in list_of_hms:
# If tags "English" and "Creativity" are in the HM's tags
# and "Spanish" is not, add the HM to the list
if "English" in hm[const.TAGS] and "Creativity" in (
hm[const.TAGS]) and "Spanish" not in (
hm[const.TAGS]):
test_list.append(hm[const.NAME])
# Tests if only the first and the third ones have those tags
self.assertEqual(
test_list, [hm1[const.NAME], hm3[const.NAME]])
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in hm[const.TAGS]
for hm in list_of_hms]))
@decorators.idempotent_id('284e8d3b-7b2d-4697-9e41-580b3423c0b4')
def test_healthmonitor_show(self):
"""Tests healthmonitor show API.
@ -607,6 +661,13 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.ADMIN_STATE_UP: False,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
hw_tags = ["Hello", "World"]
hm_kwargs.update({
const.TAGS: hw_tags
})
hm = self.mem_healthmonitor_client.create_healthmonitor(**hm_kwargs)
self.addCleanup(
self.mem_healthmonitor_client.cleanup_healthmonitor,
@ -643,6 +704,10 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
for item in equal_items:
self.assertEqual(hm_kwargs[item], hm[item])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(hw_tags, hm[const.TAGS])
# Test that a user, without the loadbalancer member role, cannot
# use this command
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -685,6 +750,14 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.EXPECTED_CODES: '201,202',
const.ADMIN_STATE_UP: not hm_kwargs[const.ADMIN_STATE_UP],
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
hw_new_tags = ["Hola", "Mundo"]
hm_update_kwargs.update({
const.TAGS: hw_new_tags
})
hm = self.mem_healthmonitor_client.update_healthmonitor(
hm[const.ID], **hm_update_kwargs)
@ -712,6 +785,10 @@ class HealthMonitorAPITest(test_base.LoadBalancerBaseTest):
const.HTTP_METHOD, const.URL_PATH, const.EXPECTED_CODES,
const.ADMIN_STATE_UP]
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
for item in equal_items:
self.assertEqual(hm_update_kwargs[item], hm[item])

View File

@ -134,6 +134,14 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.ADMIN_STATE_UP: True,
const.POSITION: 1,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
l7_policy_tags = ["Hello", "World"]
l7policy_kwargs.update({
const.TAGS: l7_policy_tags
})
if url:
l7policy_kwargs[const.ACTION] = const.REDIRECT_TO_URL
l7policy_kwargs[const.REDIRECT_URL] = url
@ -202,6 +210,10 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
self.assertIsNone(l7policy.pop(const.REDIRECT_URL, None))
self.assertIsNone(l7policy.pop(const.REDIRECT_POOL_ID, None))
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(l7_policy_tags, l7policy[const.TAGS])
@decorators.idempotent_id('42fa14ba-caf1-465e-ab36-27e7501f95ef')
def test_l7policy_list(self):
"""Tests l7policy list API and field filtering.
@ -248,6 +260,13 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.POSITION: 1,
const.ACTION: const.REJECT
}
if self.mem_l7policy_client.is_version_supported(
self.api_version, '2.5'):
l7policy1_tags = ["English", "Mathematics",
"Marketing", "Creativity"]
l7policy1_kwargs.update({const.TAGS: l7policy1_tags})
l7policy1 = self.mem_l7policy_client.create_l7policy(
**l7policy1_kwargs)
self.addCleanup(
@ -281,6 +300,13 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.ACTION: const.REDIRECT_TO_POOL,
const.REDIRECT_POOL_ID: self.pool_id
}
if self.mem_l7policy_client.is_version_supported(
self.api_version, '2.5'):
l7policy2_tags = ["English", "Spanish",
"Soft_skills", "Creativity"]
l7policy2_kwargs.update({const.TAGS: l7policy2_tags})
l7policy2 = self.mem_l7policy_client.create_l7policy(
**l7policy2_kwargs)
self.addCleanup(
@ -315,6 +341,13 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.ACTION: const.REDIRECT_TO_URL,
const.REDIRECT_URL: l7_redirect_url
}
if self.mem_l7policy_client.is_version_supported(
self.api_version, '2.5'):
l7policy3_tags = ["English", "Project_management",
"Communication", "Creativity"]
l7policy3_kwargs.update({const.TAGS: l7policy3_tags})
l7policy3 = self.mem_l7policy_client.create_l7policy(
**l7policy3_kwargs)
self.addCleanup(
@ -473,6 +506,28 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(l7policy1[const.DESCRIPTION],
l7policies[0][const.DESCRIPTION])
# Creating a list of 3 l7policies, each one contains different tags
if self.mem_l7policy_client.is_version_supported(
self.api_version, '2.5'):
list_of_l7policies = [l7policy1, l7policy2, l7policy3]
test_list = []
for l7policy in list_of_l7policies:
# If tags "English" and "Creativity" are in the l7policy's tags
# and "Spanish" is not, add the l7policy to the list
if "English" in l7policy[const.TAGS] and "Creativity" in (
l7policy[const.TAGS]) and "Spanish" not in (
l7policy[const.TAGS]):
test_list.append(l7policy[const.NAME])
# Tests if only the first and the third ones have those tags
self.assertEqual(
test_list, [l7policy1[const.NAME], l7policy3[const.NAME]])
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in l7policy[const.TAGS]
for l7policy in list_of_l7policies]))
@decorators.idempotent_id('baaa8104-a037-4976-b908-82a0b3e08129')
def test_l7policy_show(self):
"""Tests l7policy show API.
@ -630,6 +685,13 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.REDIRECT_URL: l7_redirect_url,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
l7_policy_tags = ["Hello", "World"]
l7policy_kwargs.update({
const.TAGS: l7_policy_tags
})
l7policy = self.mem_l7policy_client.create_l7policy(**l7policy_kwargs)
self.addClassResourceCleanup(
self.mem_l7policy_client.cleanup_l7policy,
@ -665,6 +727,10 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(l7_redirect_url, l7policy[const.REDIRECT_URL])
self.assertIsNone(l7policy.pop(const.REDIRECT_POOL_ID, None))
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(l7_policy_tags, l7policy[const.TAGS])
# Test that a user, without the load balancer member role, cannot
# use this command
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -706,6 +772,14 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
const.ACTION: const.REDIRECT_TO_POOL,
const.REDIRECT_POOL_ID: self.pool_id,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
l7_policy_new_tags = ["Hola", "Mundo"]
l7policy_update_kwargs.update({
const.TAGS: l7_policy_new_tags
})
l7policy = self.mem_l7policy_client.update_l7policy(
l7policy[const.ID], **l7policy_update_kwargs)
@ -745,6 +819,11 @@ class L7PolicyAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(self.pool_id, l7policy[const.REDIRECT_POOL_ID])
self.assertIsNone(l7policy.pop(const.REDIRECT_URL, None))
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(l7_policy_new_tags,
l7policy[const.TAGS])
@decorators.idempotent_id('7925eb4b-94b6-4c28-98c2-fd0b4f0976cc')
def test_l7policy_delete(self):
"""Tests l7policy create and delete APIs.

View File

@ -143,6 +143,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.INVERT: False,
}
if self.mem_l7policy_client.is_version_supported(
self.api_version, '2.5'):
l7_rule_tags = ["Hello", "World"]
l7rule_kwargs.update({
const.TAGS: l7_rule_tags
})
# Test that a user without the load balancer role cannot
# create a l7rule
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -193,6 +200,10 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
for item in equal_items:
self.assertEqual(l7rule_kwargs[item], l7rule[item])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(l7_rule_tags, l7rule[const.TAGS])
@decorators.idempotent_id('69095254-f106-4fb6-9f54-7a78cc14fb51')
def test_l7rule_list(self):
"""Tests l7rule list API and field filtering.
@ -232,6 +243,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.COMPARE_TYPE: const.EQUAL_TO,
const.KEY: 'mykey2-list',
}
if self.mem_lb_client.is_version_supported(
self.api_version, '2.5'):
l7rule1_tags = ["English", "Mathematics",
"Marketing", "Creativity"]
l7rule1_kwargs.update({const.TAGS: l7rule1_tags})
l7rule1 = self.mem_l7rule_client.create_l7rule(
**l7rule1_kwargs)
self.addCleanup(
@ -263,6 +281,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.COMPARE_TYPE: const.EQUAL_TO,
const.KEY: 'mykey1-list',
}
if self.mem_lb_client.is_version_supported(
self.api_version, '2.5'):
l7rule2_tags = ["English", "Spanish",
"Soft_skills", "Creativity"]
l7rule2_kwargs.update({const.TAGS: l7rule2_tags})
l7rule2 = self.mem_l7rule_client.create_l7rule(
**l7rule2_kwargs)
self.addCleanup(
@ -294,6 +319,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.COMPARE_TYPE: const.EQUAL_TO,
const.KEY: 'mykey3-list',
}
if self.mem_lb_client.is_version_supported(
self.api_version, '2.5'):
l7rule3_tags = ["English", "Project_management",
"Communication", "Creativity"]
l7rule3_kwargs.update({const.TAGS: l7rule3_tags})
l7rule3 = self.mem_l7rule_client.create_l7rule(
**l7rule3_kwargs)
self.addCleanup(
@ -414,6 +446,28 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(l7rule1[const.VALUE],
l7rules[0][const.VALUE])
# Creating a list of 3 l7rules, each one contains different tags
if self.mem_l7rule_client.is_version_supported(
self.api_version, '2.5'):
list_of_l7rules = [l7rule1, l7rule2, l7rule3]
test_list = []
for l7rule in list_of_l7rules:
# If tags "English" and "Creativity" are in the l7rule's tags
# and "Spanish" is not, add the l7rule to the list
if "English" in l7rule[const.TAGS] and "Creativity" in (
l7rule[const.TAGS]) and "Spanish" not in (
l7rule[const.TAGS]):
test_list.append(l7rule[const.VALUE])
# Tests if only the first and the third ones have those tags
self.assertEqual(
[l7rule1[const.VALUE], l7rule3[const.VALUE]], test_list)
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in l7rule[const.TAGS]
for l7rule in list_of_l7rules]))
@decorators.idempotent_id('b80b34c3-09fc-467b-8027-7350adb17070')
def test_l7rule_show(self):
"""Tests l7rule show API.
@ -526,6 +580,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.INVERT: False,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
l7_rule_tags = ["Hello", "World"]
l7rule_kwargs.update({
const.TAGS: l7_rule_tags
})
l7rule = self.mem_l7rule_client.create_l7rule(**l7rule_kwargs)
self.addClassResourceCleanup(
self.mem_l7rule_client.cleanup_l7rule,
@ -557,6 +618,10 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
equal_items = [const.ADMIN_STATE_UP, const.TYPE, const.VALUE,
const.COMPARE_TYPE, const.KEY, const.INVERT]
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
for item in equal_items:
self.assertEqual(l7rule_kwargs[item], l7rule[item])
@ -599,6 +664,13 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
const.KEY: 'mykey-UPDATED',
const.INVERT: True,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
l7rule_update_kwargs.update({
const.TAGS: ["Hola", "Mundo"]
})
l7rule = self.mem_l7rule_client.update_l7rule(
l7rule[const.ID], **l7rule_update_kwargs)
@ -624,6 +696,11 @@ class L7RuleAPITest(test_base.LoadBalancerBaseTest):
# Test changed items (which is all of them, for l7rules)
equal_items = [const.ADMIN_STATE_UP, const.TYPE, const.VALUE,
const.COMPARE_TYPE, const.KEY, const.INVERT]
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
for item in equal_items:
self.assertEqual(l7rule_update_kwargs[item], l7rule[item])

View File

@ -102,6 +102,13 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.TIMEOUT_TCP_INSPECT: 50,
})
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener_tags = [str(x) for x in range(100)]
listener_kwargs.update({
const.TAGS: listener_tags
})
# Test that a user without the load balancer role cannot
# create a listener
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -135,9 +142,21 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
CONF.load_balancer.build_interval,
CONF.load_balancer.build_timeout)
self.assertEqual(listener_name, listener[const.NAME])
self.assertEqual(listener_description, listener[const.DESCRIPTION])
self.assertTrue(listener[const.ADMIN_STATE_UP])
equal_items = [const.NAME, const.DESCRIPTION,
const.ADMIN_STATE_UP,
const.PROTOCOL, const.PROTOCOL_PORT,
const.CONNECTION_LIMIT]
if self.mem_listener_client.is_version_supported(
self.api_version, '2.1'):
equal_items.append(const.TIMEOUT_CLIENT_DATA)
equal_items.append(const.TIMEOUT_MEMBER_CONNECT)
equal_items.append(const.TIMEOUT_MEMBER_DATA)
equal_items.append(const.TIMEOUT_TCP_INSPECT)
for item in equal_items:
self.assertEqual(listener_kwargs[item], listener[item])
parser.parse(listener[const.CREATED_AT])
parser.parse(listener[const.UPDATED_AT])
UUID(listener[const.ID])
@ -146,20 +165,17 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(const.OFFLINE, listener[const.OPERATING_STATUS])
else:
self.assertEqual(const.ONLINE, listener[const.OPERATING_STATUS])
self.assertEqual(self.protocol, listener[const.PROTOCOL])
self.assertEqual(80, listener[const.PROTOCOL_PORT])
self.assertEqual(200, listener[const.CONNECTION_LIMIT])
insert_headers = listener[const.INSERT_HEADERS]
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_FOR]))
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_PORT]))
if self.mem_listener_client.is_version_supported(
self.api_version, '2.1'):
self.assertEqual(1000, listener[const.TIMEOUT_CLIENT_DATA])
self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_CONNECT])
self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_DATA])
self.assertEqual(50, listener[const.TIMEOUT_TCP_INSPECT])
self.api_version, '2.5'):
self.assertEqual(sorted(listener_tags),
sorted(listener[const.TAGS]))
@decorators.idempotent_id('cceac303-4db5-4d5a-9f6e-ff33780a5f29')
def test_listener_create_on_same_port(self):
@ -336,6 +352,12 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.PROTOCOL_PORT: 80,
const.LOADBALANCER_ID: lb_id,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener1_tags = ["English", "Mathematics",
"Marketing", "Creativity"]
listener1_kwargs.update({const.TAGS: listener1_tags})
listener1 = self.mem_listener_client.create_listener(
**listener1_kwargs)
self.addCleanup(
@ -368,6 +390,12 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.PROTOCOL_PORT: 81,
const.LOADBALANCER_ID: lb_id,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener2_tags = ["English", "Spanish",
"Soft_skills", "Creativity"]
listener2_kwargs.update({const.TAGS: listener2_tags})
listener2 = self.mem_listener_client.create_listener(
**listener2_kwargs)
self.addCleanup(
@ -400,6 +428,12 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.PROTOCOL_PORT: 82,
const.LOADBALANCER_ID: lb_id,
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener3_tags = ["English", "Project_management",
"Communication", "Creativity"]
listener3_kwargs.update({const.TAGS: listener3_tags})
listener3 = self.mem_listener_client.create_listener(
**listener3_kwargs)
self.addCleanup(
@ -542,6 +576,28 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(listener1[const.DESCRIPTION],
listeners[0][const.DESCRIPTION])
# Creating a list of 3 listeners, each one contains different tags
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
list_of_listeners = [listener1, listener2, listener3]
test_list = []
for listener in list_of_listeners:
# If tags "English" and "Creativity" are in the listener's tags
# and "Spanish" is not, add the listener to the list
if "English" in listener[const.TAGS] and "Creativity" in (
listener[const.TAGS]) and "Spanish" not in (
listener[const.TAGS]):
test_list.append(listener[const.NAME])
# Tests if only the first and the third ones have those tags
self.assertEqual(
test_list, [listener1[const.NAME], listener3[const.NAME]])
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in listener[const.TAGS]
for listener in list_of_listeners]))
@decorators.idempotent_id('6e299eae-6907-4dfc-89c2-e57709d25d3d')
def test_listener_show(self):
"""Tests listener show API.
@ -581,6 +637,13 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.TIMEOUT_TCP_INSPECT: 50,
})
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener_tags = ["hello", "world"]
listener_kwargs.update({
const.TAGS: listener_tags
})
listener = self.mem_listener_client.create_listener(**listener_kwargs)
self.addClassResourceCleanup(
self.mem_listener_client.cleanup_listener,
@ -605,10 +668,31 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.ONLINE,
CONF.load_balancer.build_interval,
CONF.load_balancer.build_timeout)
equal_items = [const.NAME, const.DESCRIPTION,
const.ADMIN_STATE_UP,
const.PROTOCOL, const.PROTOCOL_PORT,
const.CONNECTION_LIMIT]
if self.mem_listener_client.is_version_supported(
self.api_version, '2.1'):
equal_items.append(const.TIMEOUT_CLIENT_DATA)
equal_items.append(const.TIMEOUT_MEMBER_CONNECT)
equal_items.append(const.TIMEOUT_MEMBER_DATA)
equal_items.append(const.TIMEOUT_TCP_INSPECT)
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
for item in equal_items:
self.assertEqual(listener_kwargs[item], listener[item])
insert_headers = listener[const.INSERT_HEADERS]
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_FOR]))
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_PORT]))
self.assertEqual(listener_name, listener[const.NAME])
self.assertEqual(listener_description, listener[const.DESCRIPTION])
self.assertTrue(listener[const.ADMIN_STATE_UP])
parser.parse(listener[const.CREATED_AT])
parser.parse(listener[const.UPDATED_AT])
UUID(listener[const.ID])
@ -617,21 +701,6 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(const.OFFLINE, listener[const.OPERATING_STATUS])
else:
self.assertEqual(const.ONLINE, listener[const.OPERATING_STATUS])
self.assertEqual(self.protocol, listener[const.PROTOCOL])
self.assertEqual(81, listener[const.PROTOCOL_PORT])
self.assertEqual(200, listener[const.CONNECTION_LIMIT])
insert_headers = listener[const.INSERT_HEADERS]
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_FOR]))
self.assertTrue(
strutils.bool_from_string(insert_headers[const.X_FORWARDED_PORT]))
if self.mem_listener_client.is_version_supported(
self.api_version, '2.1'):
self.assertEqual(1000, listener[const.TIMEOUT_CLIENT_DATA])
self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_CONNECT])
self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_DATA])
self.assertEqual(50, listener[const.TIMEOUT_TCP_INSPECT])
# Test that a user with lb_admin role can see the listener
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -702,6 +771,13 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.TIMEOUT_TCP_INSPECT: 50,
})
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener_tags = ["Hello", "World"]
listener_kwargs.update({
const.TAGS: listener_tags
})
listener = self.mem_listener_client.create_listener(**listener_kwargs)
self.addClassResourceCleanup(
self.mem_listener_client.cleanup_listener,
@ -743,6 +819,10 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(1000, listener[const.TIMEOUT_MEMBER_DATA])
self.assertEqual(50, listener[const.TIMEOUT_TCP_INSPECT])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(listener_tags, listener[const.TAGS])
# Test that a user, without the load balancer member role, cannot
# use this command
if CONF.load_balancer.RBAC_test_type == const.ADVANCED:
@ -799,6 +879,13 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
const.TIMEOUT_TCP_INSPECT: 100,
})
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
listener_updated_tags = ["Hola", "Mundo"]
listener_update_kwargs.update({
const.TAGS: listener_updated_tags
})
listener = self.mem_listener_client.update_listener(
listener[const.ID], **listener_update_kwargs)
@ -842,6 +929,10 @@ class ListenerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(2000, listener[const.TIMEOUT_MEMBER_DATA])
self.assertEqual(100, listener[const.TIMEOUT_TCP_INSPECT])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(listener_updated_tags, listener[const.TAGS])
@decorators.idempotent_id('16f11c82-f069-4592-8954-81b35a98e3b7')
def test_listener_delete(self):
"""Tests listener create and delete APIs.

View File

@ -69,6 +69,13 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
# vip_qos_policy_id=lb_qos_policy_id)
const.NAME: lb_name}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
lb_tags = ["Hello", "World"]
lb_kwargs.update({
const.TAGS: lb_tags
})
self._setup_lb_network_kwargs(lb_kwargs, ip_version, use_fixed_ip=True)
# Test that a user without the load balancer role cannot
@ -139,6 +146,10 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
except Exception:
pass
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(lb_tags, lb[const.TAGS])
@decorators.idempotent_id('643ef031-c800-45f2-b229-3c8f8b37c829')
def test_load_balancer_delete(self):
"""Tests load balancer create and delete APIs.
@ -263,17 +274,29 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
lb_name = data_utils.rand_name("lb_member_lb2-list")
lb_description = data_utils.rand_name('B')
lb_admin_state_up = True
lb_provider = CONF.load_balancer.provider
lb_vip_network_id = self.lb_member_vip_net[const.ID]
lb = self.mem_lb_client.create_loadbalancer(
admin_state_up=True,
description=lb_description,
lb_kwargs = {
const.ADMIN_STATE_UP: lb_admin_state_up,
const.DESCRIPTION: lb_description,
# TODO(johnsom) Fix test to use a real flavor
# flavor=lb_flavor,
provider=CONF.load_balancer.provider,
name=lb_name,
const.PROVIDER: lb_provider,
const.NAME: lb_name,
# TODO(johnsom) Add QoS
# vip_qos_policy_id=lb_qos_policy_id)
vip_network_id=self.lb_member_vip_net[const.ID])
const.VIP_NETWORK_ID: lb_vip_network_id
}
if self.mem_lb_client.is_version_supported(self.api_version, '2.5'):
lb_tags = ["English", "Mathematics", "Marketing", "Creativity"]
lb_kwargs.update({const.TAGS: lb_tags})
lb = self.mem_lb_client.create_loadbalancer(
**lb_kwargs)
self.addCleanup(
self.mem_lb_client.cleanup_loadbalancer,
lb[const.ID])
@ -298,13 +321,25 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
lb_name = data_utils.rand_name("lb_member_lb1-list")
lb_description = data_utils.rand_name('A')
lb_admin_state_up = True
lb_provider = CONF.load_balancer.provider
lb_vip_network_id = self.lb_member_vip_net[const.ID]
lb_kwargs = {
const.ADMIN_STATE_UP: lb_admin_state_up,
const.DESCRIPTION: lb_description,
const.PROVIDER: lb_provider,
const.NAME: lb_name,
const.VIP_NETWORK_ID: lb_vip_network_id,
}
if self.mem_lb_client.is_version_supported(self.api_version, '2.5'):
lb_tags = ["English", "Spanish", "Soft_skills", "Creativity"]
lb_kwargs.update({const.TAGS: lb_tags})
lb = self.mem_lb_client.create_loadbalancer(
admin_state_up=True,
description=lb_description,
provider=CONF.load_balancer.provider,
name=lb_name,
vip_network_id=self.lb_member_vip_net[const.ID])
**lb_kwargs)
self.addCleanup(
self.mem_lb_client.cleanup_loadbalancer,
lb[const.ID])
@ -329,13 +364,26 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
lb_name = data_utils.rand_name("lb_member_lb3-list")
lb_description = data_utils.rand_name('C')
lb_admin_state_up = False
lb_provider = CONF.load_balancer.provider
lb_vip_network_id = self.lb_member_vip_net[const.ID]
lb_kwargs = {
const.ADMIN_STATE_UP: lb_admin_state_up,
const.DESCRIPTION: lb_description,
const.PROVIDER: lb_provider,
const.NAME: lb_name,
const.VIP_NETWORK_ID: lb_vip_network_id,
}
if self.mem_lb_client.is_version_supported(self.api_version, '2.5'):
lb_tags = ["English", "Project_management",
"Communication", "Creativity"]
lb_kwargs.update({const.TAGS: lb_tags})
lb = self.mem_lb_client.create_loadbalancer(
admin_state_up=False,
description=lb_description,
provider=CONF.load_balancer.provider,
name=lb_name,
vip_network_id=self.lb_member_vip_net[const.ID])
**lb_kwargs)
self.addCleanup(
self.mem_lb_client.cleanup_loadbalancer,
lb[const.ID])
@ -442,6 +490,28 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(lb2[const.DESCRIPTION], lbs[1][const.DESCRIPTION])
self.assertEqual(lb1[const.DESCRIPTION], lbs[0][const.DESCRIPTION])
# Creating a list of 3 LBs, each one contains different tags
if self.mem_lb_client.is_version_supported(
self.api_version, '2.5'):
list_of_lbs = [lb1, lb2, lb3]
test_list = []
for lb in list_of_lbs:
# If tags "English" and "Creativity" are in the LB's tags
# and "Spanish" is not, add the LB to the list
if "English" in lb[const.TAGS] and "Creativity" in (
lb[const.TAGS]) and "Spanish" not in (
lb[const.TAGS]):
test_list.append(lb[const.NAME])
# Tests if only the first and the third ones have those tags
self.assertEqual(
test_list, [lb1[const.NAME], lb3[const.NAME]])
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in lb[const.TAGS]
for lb in list_of_lbs]))
@decorators.idempotent_id('826ae612-8717-4c64-a8a7-cb9570a85870')
def test_load_balancer_show(self):
"""Tests load balancer show API.
@ -561,6 +631,13 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
# vip_qos_policy_id=lb_qos_policy_id)
const.NAME: lb_name}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
lb_tags = ["Hello", "World"]
lb_kwargs.update({
const.TAGS: lb_tags
})
self._setup_lb_network_kwargs(lb_kwargs, 4, use_fixed_ip=True)
lb = self.mem_lb_client.create_loadbalancer(**lb_kwargs)
@ -594,6 +671,10 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(lb_kwargs[const.VIP_SUBNET_ID],
lb[const.VIP_SUBNET_ID])
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
self.assertEqual(lb_tags, lb[const.TAGS])
new_name = data_utils.rand_name("lb_member_lb1-update")
new_description = data_utils.arbitrary_string(size=255,
base_text='new')
@ -624,13 +705,26 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(const.ACTIVE, lb_check[const.PROVISIONING_STATUS])
self.assertFalse(lb_check[const.ADMIN_STATE_UP])
lb = self.mem_lb_client.update_loadbalancer(
lb[const.ID],
admin_state_up=True,
description=new_description,
admin_state_up = True
lb_update_kwargs = {
# const.ID: lb[const.ID],
const.ADMIN_STATE_UP: admin_state_up,
const.DESCRIPTION: new_description,
# TODO(johnsom) Add QoS
# vip_qos_policy_id=lb_qos_policy_id)
name=new_name)
const.NAME: new_name
}
if self.mem_listener_client.is_version_supported(
self.api_version, '2.5'):
new_tags = ["Hola", "Mundo"]
lb_update_kwargs.update({
const.TAGS: new_tags
})
lb = self.mem_lb_client.update_loadbalancer(
lb[const.ID], **lb_update_kwargs)
lb = waiters.wait_for_status(self.mem_lb_client.show_loadbalancer,
lb[const.ID], const.PROVISIONING_STATUS,
@ -641,6 +735,7 @@ class LoadBalancerAPITest(test_base.LoadBalancerBaseTest):
self.assertTrue(lb[const.ADMIN_STATE_UP])
self.assertEqual(new_description, lb[const.DESCRIPTION])
self.assertEqual(new_name, lb[const.NAME])
self.assertEqual(new_tags, lb[const.TAGS])
# TODO(johnsom) Add QoS
# Attempt to clean up so that one full test run doesn't start 10+

View File

@ -153,6 +153,13 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
const.BACKUP: False,
})
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
member_tags = ["hello", "world"]
member_kwargs.update({
const.TAGS: member_tags
})
if self.lb_member_vip_subnet:
member_kwargs[const.SUBNET_ID] = self.lb_member_vip_subnet[
const.ID]
@ -197,6 +204,10 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
self.api_version, '2.1'):
equal_items.append(const.BACKUP)
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
if monitor:
equal_items += [const.MONITOR_ADDRESS, const.MONITOR_PORT]
if const.SUBNET_ID in member_kwargs:
@ -247,6 +258,13 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
const.ADDRESS: '192.0.2.1',
const.PROTOCOL_PORT: 101,
}
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
member1_tags = ["English", "Mathematics",
"Marketing", "Creativity"]
member1_kwargs.update({const.TAGS: member1_tags})
member1 = self.mem_member_client.create_member(
**member1_kwargs)
self.addCleanup(
@ -278,6 +296,13 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
const.ADDRESS: '192.0.2.1',
const.PROTOCOL_PORT: 100,
}
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
member2_tags = ["English", "Spanish",
"Soft_skills", "Creativity"]
member2_kwargs.update({const.TAGS: member2_tags})
member2 = self.mem_member_client.create_member(
**member2_kwargs)
self.addCleanup(
@ -309,6 +334,13 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
const.ADDRESS: '192.0.2.1',
const.PROTOCOL_PORT: 102,
}
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
member3_tags = ["English", "Project_management",
"Communication", "Creativity"]
member3_kwargs.update({const.TAGS: member3_tags})
member3 = self.mem_member_client.create_member(
**member3_kwargs)
self.addCleanup(
@ -433,6 +465,28 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(member1[const.PROTOCOL_PORT],
members[0][const.PROTOCOL_PORT])
# Creating a list of 3 members, each one contains different tags
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
list_of_members = [member1, member2, member3]
test_list = []
for member in list_of_members:
# If tags "English" and "Creativity" are in the member's tags
# and "Spanish" is not, add the member to the list
if "English" in member[const.TAGS] and "Creativity" in (
member[const.TAGS]) and "Spanish" not in (
member[const.TAGS]):
test_list.append(member[const.NAME])
# Tests if only the first and the third ones have those tags
self.assertEqual(
test_list, [member1[const.NAME], member3[const.NAME]])
# Tests that filtering by an empty tag will return an empty list
self.assertTrue(not any(["" in member[const.TAGS]
for member in list_of_members]))
@decorators.idempotent_id('7674ae04-7e92-44ef-9adf-40718d7ec705')
def test_member_show(self):
"""Tests member show API.
@ -563,6 +617,13 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
const.BACKUP: False,
})
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
member_tags = ["Hello", "World"]
member_kwargs.update({
const.TAGS: member_tags
})
if self.lb_member_vip_subnet:
member_kwargs[const.SUBNET_ID] = self.lb_member_vip_subnet[
const.ID]
@ -609,6 +670,10 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
self.api_version, '2.1'):
equal_items.append(const.BACKUP)
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
if monitor:
equal_items += [const.MONITOR_ADDRESS, const.MONITOR_PORT]
if const.SUBNET_ID in member_kwargs:
@ -672,6 +737,14 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
member_update_kwargs.update({
const.BACKUP: not member[const.BACKUP]
})
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
new_tags = ["Hola", "Mundo"]
member_update_kwargs.update({
const.TAGS: new_tags
})
if monitor:
member_update_kwargs[const.MONITOR_ADDRESS] = '192.0.2.3'
member_update_kwargs[const.MONITOR_PORT] = member[
@ -709,6 +782,10 @@ class MemberAPITest(test_base.LoadBalancerBaseTest):
self.api_version, '2.1'):
equal_items.append(const.BACKUP)
if self.mem_member_client.is_version_supported(
self.api_version, '2.5'):
equal_items.append(const.TAGS)
if monitor:
equal_items += [const.MONITOR_ADDRESS, const.MONITOR_PORT]
for item in equal_items:

View File

@ -104,6 +104,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
const.PROTOCOL: self.protocol,
const.LB_ALGORITHM: self.lb_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 self.lb_feature_enabled.session_persistence_enabled:
pool_kwargs[const.SESSION_PERSISTENCE] = {
const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE,
@ -179,6 +186,8 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
self.assertEqual(pool_sp_cookie_name,
pool[const.SESSION_PERSISTENCE][
const.COOKIE_NAME])
if self.mem_lb_client.is_version_supported(self.api_version, '2.5'):
self.assertEqual(pool_tags, pool[const.TAGS])
@decorators.idempotent_id('6959a32e-fb34-4f3e-be68-8880c6450016')
def test_pool_list(self):
@ -222,6 +231,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
const.LB_ALGORITHM: self.lb_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})
if self.lb_feature_enabled.session_persistence_enabled:
pool1_kwargs[const.SESSION_PERSISTENCE] = {
const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE,
@ -260,6 +276,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
const.LB_ALGORITHM: self.lb_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})
if self.lb_feature_enabled.session_persistence_enabled:
pool2_kwargs[const.SESSION_PERSISTENCE] = {
const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE,
@ -298,6 +321,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
# No session persistence, just so there's one test for that
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(
@ -418,6 +448,28 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
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]))
@decorators.idempotent_id('b7932438-1aea-4175-a50c-984fee1c0cad')
def test_pool_show(self):
"""Tests pool show API.
@ -535,6 +587,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
const.LB_ALGORITHM: self.lb_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 self.lb_feature_enabled.session_persistence_enabled:
pool_kwargs[const.SESSION_PERSISTENCE] = {
const.TYPE: const.SESSION_PERSISTENCE_APP_COOKIE,
@ -610,6 +669,9 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
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.assertEqual(pool_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')
@ -619,6 +681,13 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
const.ADMIN_STATE_UP: True,
const.LB_ALGORITHM: self.lb_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 self.lb_feature_enabled.session_persistence_enabled:
pool_update_kwargs[const.SESSION_PERSISTENCE] = {
const.TYPE: const.SESSION_PERSISTENCE_HTTP_COOKIE,
@ -672,6 +741,9 @@ class PoolAPITest(test_base.LoadBalancerBaseTest):
if self.lb_feature_enabled.session_persistence_enabled:
self.assertIsNone(pool.get(const.SESSION_PERSISTENCE))
if self.mem_lb_client.is_version_supported(self.api_version, '2.5'):
self.assertEqual(new_tags, pool[const.TAGS])
@decorators.idempotent_id('35ed3800-7a4a-47a6-9b94-c1033fff1112')
def test_pool_delete(self):
"""Tests pool create and delete APIs.

View File

@ -0,0 +1,4 @@
---
features:
- |
API tests for tags were added.