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
diff --git a/octavia_tempest_plugin/common/constants.py b/octavia_tempest_plugin/common/constants.py
index 0424cc5..0e24283 100644
--- a/octavia_tempest_plugin/common/constants.py
+++ b/octavia_tempest_plugin/common/constants.py
@@ -56,6 +56,7 @@
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'
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/healthmonitor_client.py b/octavia_tempest_plugin/services/load_balancer/v2/healthmonitor_client.py
index 70dce4c..a7d2e6b 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/healthmonitor_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/healthmonitor_client.py
@@ -27,7 +27,7 @@
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 @@
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 @@
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 @@
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
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/l7policy_client.py b/octavia_tempest_plugin/services/load_balancer/v2/l7policy_client.py
index 674ec02..1feb72f 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/l7policy_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/l7policy_client.py
@@ -27,7 +27,7 @@
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 @@
: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 @@
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 @@
: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.
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/l7rule_client.py b/octavia_tempest_plugin/services/load_balancer/v2/l7rule_client.py
index 2ca1c71..be5434d 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/l7rule_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/l7rule_client.py
@@ -38,7 +38,7 @@
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 @@
: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 @@
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 @@
: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.
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/listener_client.py b/octavia_tempest_plugin/services/load_balancer/v2/listener_client.py
index 1cc17ff..eb7690a 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/listener_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/listener_client.py
@@ -29,8 +29,9 @@
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 @@
: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 @@
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 @@
: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
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/loadbalancer_client.py b/octavia_tempest_plugin/services/load_balancer/v2/loadbalancer_client.py
index 9a287cf..0fafbf2 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/loadbalancer_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/loadbalancer_client.py
@@ -39,7 +39,8 @@
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 @@
: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 @@
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
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/member_client.py b/octavia_tempest_plugin/services/load_balancer/v2/member_client.py
index 63e836a..0f0d639 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/member_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/member_client.py
@@ -40,7 +40,8 @@
)
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 @@
: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 @@
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 @@
: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
diff --git a/octavia_tempest_plugin/services/load_balancer/v2/pool_client.py b/octavia_tempest_plugin/services/load_balancer/v2/pool_client.py
index 46ec38d..58db1af 100644
--- a/octavia_tempest_plugin/services/load_balancer/v2/pool_client.py
+++ b/octavia_tempest_plugin/services/load_balancer/v2/pool_client.py
@@ -28,6 +28,7 @@
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 @@
: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 @@
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 @@
: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
diff --git a/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py b/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
index 023d5f5..e9671fd 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_availability_zone.py
@@ -118,6 +118,15 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py b/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
index 86ae066..1a5501a 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_availability_zone_profile.py
@@ -94,6 +94,17 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_flavor.py b/octavia_tempest_plugin/tests/api/v2/test_flavor.py
index be3ac76..4333121 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_flavor.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_flavor.py
@@ -105,6 +105,14 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_flavor_profile.py b/octavia_tempest_plugin/tests/api/v2/test_flavor_profile.py
index 3bd6e54..8f9c7d3 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_flavor_profile.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_flavor_profile.py
@@ -80,6 +80,15 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_healthmonitor.py b/octavia_tempest_plugin/tests/api/v2/test_healthmonitor.py
index 1feb9d9..8001899 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_healthmonitor.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_healthmonitor.py
@@ -107,6 +107,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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])
diff --git a/octavia_tempest_plugin/tests/api/v2/test_l7policy.py b/octavia_tempest_plugin/tests/api/v2/test_l7policy.py
index b1bccc2..b99706b 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_l7policy.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_l7policy.py
@@ -134,6 +134,14 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_l7rule.py b/octavia_tempest_plugin/tests/api/v2/test_l7rule.py
index aaad8a0..70eff54 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_l7rule.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_l7rule.py
@@ -143,6 +143,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
# 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])
diff --git a/octavia_tempest_plugin/tests/api/v2/test_listener.py b/octavia_tempest_plugin/tests/api/v2/test_listener.py
index 3a45656..81af3e3 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_listener.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_listener.py
@@ -102,6 +102,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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]
- self.assertEqual(listener_name, listener[const.NAME])
- self.assertEqual(listener_description, listener[const.DESCRIPTION])
- self.assertTrue(listener[const.ADMIN_STATE_UP])
+ 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]))
+
parser.parse(listener[const.CREATED_AT])
parser.parse(listener[const.UPDATED_AT])
UUID(listener[const.ID])
@@ -617,21 +701,6 @@
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 @@
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 @@
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 @@
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 @@
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.
diff --git a/octavia_tempest_plugin/tests/api/v2/test_load_balancer.py b/octavia_tempest_plugin/tests/api/v2/test_load_balancer.py
index b4dde1f..409630c 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_load_balancer.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_load_balancer.py
@@ -69,6 +69,13 @@
# 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
# 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 @@
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 @@
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 @@
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+
diff --git a/octavia_tempest_plugin/tests/api/v2/test_member.py b/octavia_tempest_plugin/tests/api/v2/test_member.py
index a279495..f4bd2a8 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_member.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_member.py
@@ -153,6 +153,13 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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:
diff --git a/octavia_tempest_plugin/tests/api/v2/test_pool.py b/octavia_tempest_plugin/tests/api/v2/test_pool.py
index fd3053d..36d1927 100644
--- a/octavia_tempest_plugin/tests/api/v2/test_pool.py
+++ b/octavia_tempest_plugin/tests/api/v2/test_pool.py
@@ -104,6 +104,13 @@
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 @@
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 @@
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 @@
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 @@
# 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 @@
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 @@
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 @@
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 @@
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 @@
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.
diff --git a/releasenotes/notes/add-tags-api-tests-1130aab82bb0f7f2.yaml b/releasenotes/notes/add-tags-api-tests-1130aab82bb0f7f2.yaml
new file mode 100644
index 0000000..513a63f
--- /dev/null
+++ b/releasenotes/notes/add-tags-api-tests-1130aab82bb0f7f2.yaml
@@ -0,0 +1,4 @@
+---
+features:
+ - |
+ API tests for tags were added.