Merge "Add a test for custom compute flavors for amphorae"
This commit is contained in:
commit
6392583464
@ -245,11 +245,17 @@ AMPHORA_PROVIDERS = ['amphora', 'amphorav2', 'octavia']
|
|||||||
|
|
||||||
# Flavor capabilities
|
# Flavor capabilities
|
||||||
LOADBALANCER_TOPOLOGY = 'loadbalancer_topology'
|
LOADBALANCER_TOPOLOGY = 'loadbalancer_topology'
|
||||||
|
COMPUTE_FLAVOR = 'compute_flavor'
|
||||||
|
|
||||||
# Availability zone capabilities
|
# Availability zone capabilities
|
||||||
COMPUTE_ZONE = 'compute_zone'
|
COMPUTE_ZONE = 'compute_zone'
|
||||||
MANAGEMENT_NETWORK = 'management_network'
|
MANAGEMENT_NETWORK = 'management_network'
|
||||||
|
|
||||||
|
# Compute flavors
|
||||||
|
RAM = 'ram'
|
||||||
|
VCPUS = 'vcpus'
|
||||||
|
DISK = 'disk'
|
||||||
|
|
||||||
# API valid fields
|
# API valid fields
|
||||||
SHOW_LOAD_BALANCER_RESPONSE_FIELDS = (
|
SHOW_LOAD_BALANCER_RESPONSE_FIELDS = (
|
||||||
ADMIN_STATE_UP, CREATED_AT, DESCRIPTION, FLAVOR_ID, ID, LISTENERS, NAME,
|
ADMIN_STATE_UP, CREATED_AT, DESCRIPTION, FLAVOR_ID, ID, LISTENERS, NAME,
|
||||||
|
@ -22,6 +22,7 @@ from oslo_serialization import jsonutils
|
|||||||
from tempest import config
|
from tempest import config
|
||||||
from tempest.lib.common.utils import data_utils
|
from tempest.lib.common.utils import data_utils
|
||||||
from tempest.lib import decorators
|
from tempest.lib import decorators
|
||||||
|
from tempest.lib import exceptions
|
||||||
|
|
||||||
from octavia_tempest_plugin.common import constants as const
|
from octavia_tempest_plugin.common import constants as const
|
||||||
from octavia_tempest_plugin.tests import test_base
|
from octavia_tempest_plugin.tests import test_base
|
||||||
@ -38,14 +39,17 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
"""Setup resources needed by the tests."""
|
"""Setup resources needed by the tests."""
|
||||||
super(LoadBalancerScenarioTest, cls).resource_setup()
|
super(LoadBalancerScenarioTest, cls).resource_setup()
|
||||||
|
|
||||||
|
cls.flavor_id = cls._flavor_create({
|
||||||
|
const.LOADBALANCER_TOPOLOGY:
|
||||||
|
CONF.load_balancer.loadbalancer_topology})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _flavor_create(cls, flavor_dict, skip_on_not_implemented=False):
|
||||||
if cls.lb_admin_flavor_profile_client.is_version_supported(
|
if cls.lb_admin_flavor_profile_client.is_version_supported(
|
||||||
cls.api_version, '2.6'):
|
cls.api_version, '2.6'):
|
||||||
|
|
||||||
# Create a shared flavor profile
|
# Create a shared flavor profile
|
||||||
flavor_profile_name = data_utils.rand_name("lb_scenario-setup")
|
flavor_profile_name = data_utils.rand_name("lb_scenario-setup")
|
||||||
flavor_data = {const.LOADBALANCER_TOPOLOGY:
|
flavor_data_json = jsonutils.dumps(flavor_dict)
|
||||||
CONF.load_balancer.loadbalancer_topology}
|
|
||||||
flavor_data_json = jsonutils.dumps(flavor_data)
|
|
||||||
|
|
||||||
flavor_profile_kwargs = {
|
flavor_profile_kwargs = {
|
||||||
const.NAME: flavor_profile_name,
|
const.NAME: flavor_profile_name,
|
||||||
@ -54,12 +58,12 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cls.flavor_profile = (
|
flavor_profile = (
|
||||||
cls.lb_admin_flavor_profile_client.create_flavor_profile(
|
cls.lb_admin_flavor_profile_client.create_flavor_profile(
|
||||||
**flavor_profile_kwargs))
|
**flavor_profile_kwargs))
|
||||||
cls.addClassResourceCleanup(
|
cls.addClassResourceCleanup(
|
||||||
cls.lb_admin_flavor_profile_client.cleanup_flavor_profile,
|
cls.lb_admin_flavor_profile_client.cleanup_flavor_profile,
|
||||||
cls.flavor_profile[const.ID])
|
flavor_profile[const.ID])
|
||||||
|
|
||||||
flavor_name = data_utils.rand_name("lb_scenario-setup")
|
flavor_name = data_utils.rand_name("lb_scenario-setup")
|
||||||
flavor_description = data_utils.arbitrary_string(size=255)
|
flavor_description = data_utils.arbitrary_string(size=255)
|
||||||
@ -68,20 +72,21 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
const.NAME: flavor_name,
|
const.NAME: flavor_name,
|
||||||
const.DESCRIPTION: flavor_description,
|
const.DESCRIPTION: flavor_description,
|
||||||
const.ENABLED: True,
|
const.ENABLED: True,
|
||||||
const.FLAVOR_PROFILE_ID: cls.flavor_profile[const.ID]}
|
const.FLAVOR_PROFILE_ID: flavor_profile[const.ID]}
|
||||||
|
|
||||||
cls.flavor = cls.lb_admin_flavor_client.create_flavor(
|
flavor = cls.lb_admin_flavor_client.create_flavor(
|
||||||
**flavor_kwargs)
|
**flavor_kwargs)
|
||||||
cls.addClassResourceCleanup(
|
cls.addClassResourceCleanup(
|
||||||
cls.lb_admin_flavor_client.cleanup_a_flavor,
|
cls.lb_admin_flavor_client.cleanup_a_flavor,
|
||||||
cls.flavor[const.ID])
|
flavor[const.ID])
|
||||||
cls.flavor_id = cls.flavor[const.ID]
|
return flavor[const.ID]
|
||||||
except testtools.TestCase.skipException:
|
except (testtools.TestCase.skipException,
|
||||||
LOG.debug("Provider driver %s doesn't support flavors.",
|
exceptions.NotImplemented):
|
||||||
CONF.load_balancer.provider)
|
msg = (f"Provider driver {CONF.load_balancer.provider} "
|
||||||
cls.flavor_profile = None
|
"doesn't support flavors.")
|
||||||
cls.flavor_id = None
|
LOG.debug(msg)
|
||||||
cls.flavor = None
|
if skip_on_not_implemented:
|
||||||
|
raise cls.skipException(msg)
|
||||||
|
|
||||||
@decorators.idempotent_id('a5e2e120-4f7e-4c8b-8aac-cf09cb56711c')
|
@decorators.idempotent_id('a5e2e120-4f7e-4c8b-8aac-cf09cb56711c')
|
||||||
def test_load_balancer_ipv4_CRUD(self):
|
def test_load_balancer_ipv4_CRUD(self):
|
||||||
@ -93,7 +98,20 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
def test_load_balancer_ipv6_CRUD(self):
|
def test_load_balancer_ipv6_CRUD(self):
|
||||||
self._test_load_balancer_CRUD(6)
|
self._test_load_balancer_CRUD(6)
|
||||||
|
|
||||||
def _test_load_balancer_CRUD(self, ip_version):
|
@decorators.idempotent_id('c9d8b6dd-ef29-40d8-b329-86d31857df3f')
|
||||||
|
def test_load_balancer_ipv4_CRUD_with_compute_flavor(self):
|
||||||
|
self._test_load_balancer_CRUD(4,
|
||||||
|
use_custom_compute_flavor=True)
|
||||||
|
|
||||||
|
@decorators.idempotent_id('2f1c2bdc-0df9-4c1e-be83-910fcd5af8f2')
|
||||||
|
@testtools.skipUnless(CONF.load_balancer.test_with_ipv6,
|
||||||
|
'IPv6 testing is disabled')
|
||||||
|
def test_load_balancer_ipv6_CRUD_with_compute_flavor(self):
|
||||||
|
self._test_load_balancer_CRUD(6,
|
||||||
|
use_custom_compute_flavor=True)
|
||||||
|
|
||||||
|
def _test_load_balancer_CRUD(self, ip_version,
|
||||||
|
use_custom_compute_flavor=False):
|
||||||
"""Tests load balancer create, read, update, delete
|
"""Tests load balancer create, read, update, delete
|
||||||
|
|
||||||
* Create a fully populated load balancer.
|
* Create a fully populated load balancer.
|
||||||
@ -101,6 +119,33 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
* Update the load balancer.
|
* Update the load balancer.
|
||||||
* Delete the load balancer.
|
* Delete the load balancer.
|
||||||
"""
|
"""
|
||||||
|
if use_custom_compute_flavor:
|
||||||
|
if not self.lb_admin_flavor_profile_client.is_version_supported(
|
||||||
|
self.api_version, '2.6'):
|
||||||
|
raise self.skipException(
|
||||||
|
'Flavors and flavor profiles are supported in '
|
||||||
|
'Octavia API version 2.6 or newer.')
|
||||||
|
|
||||||
|
compute_flavor_kwargs = {
|
||||||
|
const.NAME: data_utils.rand_name("lb_scenario_alt_amp_flavor"),
|
||||||
|
const.RAM: 2048,
|
||||||
|
const.VCPUS: 1,
|
||||||
|
const.DISK: 4,
|
||||||
|
}
|
||||||
|
|
||||||
|
compute_flavor = (
|
||||||
|
self.os_admin_compute_flavors_client.create_flavor(
|
||||||
|
**compute_flavor_kwargs)['flavor'])
|
||||||
|
self.addCleanup(
|
||||||
|
self.os_admin_compute_flavors_client.delete_flavor,
|
||||||
|
compute_flavor[const.ID])
|
||||||
|
|
||||||
|
flavor_id = self._flavor_create({
|
||||||
|
const.COMPUTE_FLAVOR: compute_flavor[const.ID]
|
||||||
|
}, skip_on_not_implemented=True)
|
||||||
|
else:
|
||||||
|
flavor_id = self.flavor_id
|
||||||
|
|
||||||
lb_name = data_utils.rand_name("lb_member_lb1-CRUD")
|
lb_name = data_utils.rand_name("lb_member_lb1-CRUD")
|
||||||
lb_description = data_utils.arbitrary_string(size=255)
|
lb_description = data_utils.arbitrary_string(size=255)
|
||||||
|
|
||||||
@ -110,8 +155,8 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
const.NAME: lb_name}
|
const.NAME: lb_name}
|
||||||
|
|
||||||
if self.lb_admin_flavor_profile_client.is_version_supported(
|
if self.lb_admin_flavor_profile_client.is_version_supported(
|
||||||
self.api_version, '2.6') and self.flavor_id:
|
self.api_version, '2.6') and flavor_id:
|
||||||
lb_kwargs[const.FLAVOR_ID] = self.flavor_id
|
lb_kwargs[const.FLAVOR_ID] = flavor_id
|
||||||
|
|
||||||
self._setup_lb_network_kwargs(lb_kwargs, ip_version)
|
self._setup_lb_network_kwargs(lb_kwargs, ip_version)
|
||||||
|
|
||||||
@ -147,6 +192,13 @@ class LoadBalancerScenarioTest(test_base.LoadBalancerBaseTest):
|
|||||||
self.assertEqual(lb_kwargs[const.VIP_SUBNET_ID],
|
self.assertEqual(lb_kwargs[const.VIP_SUBNET_ID],
|
||||||
lb[const.VIP_SUBNET_ID])
|
lb[const.VIP_SUBNET_ID])
|
||||||
|
|
||||||
|
if use_custom_compute_flavor:
|
||||||
|
amphorae = self.lb_admin_amphora_client.list_amphorae(
|
||||||
|
query_params=f'{const.LOADBALANCER_ID}={lb[const.ID]}')
|
||||||
|
amphora = amphorae[0]
|
||||||
|
self.assertEqual(compute_flavor[const.ID],
|
||||||
|
amphora[const.COMPUTE_FLAVOR])
|
||||||
|
|
||||||
# Load balancer update
|
# Load balancer update
|
||||||
new_name = data_utils.rand_name("lb_member_lb1-update")
|
new_name = data_utils.rand_name("lb_member_lb1-update")
|
||||||
new_description = data_utils.arbitrary_string(size=255,
|
new_description = data_utils.arbitrary_string(size=255,
|
||||||
|
@ -287,6 +287,7 @@ class LoadBalancerBaseTest(validators.ValidatorsMixin,
|
|||||||
lb_admin_prefix.AvailabilityZoneClient())
|
lb_admin_prefix.AvailabilityZoneClient())
|
||||||
cls.mem_availability_zone_client = (
|
cls.mem_availability_zone_client = (
|
||||||
cls.os_roles_lb_member.load_balancer_v2.AvailabilityZoneClient())
|
cls.os_roles_lb_member.load_balancer_v2.AvailabilityZoneClient())
|
||||||
|
cls.os_admin_compute_flavors_client = cls.os_admin.flavors_client
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def resource_setup(cls):
|
def resource_setup(cls):
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Add a load-balancer scenario test with a custom amphora compute flavor
|
||||||
|
(using Octavia flavor and flavor profile features).
|
Loading…
Reference in New Issue
Block a user