ghanshyam 86bd86d76f Fix vmware_nsx tempest plugin
Id518a6d87d0949737cd1c50cb6a83149b85e5f85 removes the
class variable from tempest - 'default_params_with_timeout_values'
This was kept in tempest only to be used for baremetal tests.

Each Temepst plugin should either have their own config options
for build timeout etc or use the default one.

Currently this commit makes use of timeout and other values from
config which are stable.

Change-Id: I8d010afe20db890636433a17193029a123a0a136
2017-01-18 18:57:33 +00:00

496 lines
22 KiB
Python

# Copyright 2013 OpenStack Foundation
# Copyright 2015 VMware Inc
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import six
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from tempest.api.network import base
from tempest import config
from tempest import test
from vmware_nsx_tempest.services import load_balancer_v1_client as LBV1C
from vmware_nsx_tempest.services import network_client_base as base_client
CONF = config.CONF
class LoadBalancerTestJSON(base.BaseNetworkTest):
"""
Tests the following operations in the Neutron API using the REST client
for
Neutron:
create vIP, and Pool
show vIP
list vIP
update vIP
delete vIP
update pool
delete pool
show pool
list pool
health monitoring operations
"""
@classmethod
def skip_checks(cls):
super(LoadBalancerTestJSON, cls).skip_checks()
if not test.is_extension_enabled('lbaas', 'network'):
msg = "lbaas extension not enabled."
raise cls.skipException(msg)
if not test.is_extension_enabled('nsxv-router-type', 'network'):
msg = "nsxv-router-type extension is not enabled"
raise cls.skipException(msg)
@classmethod
def resource_setup(cls):
super(LoadBalancerTestJSON, cls).resource_setup()
_params = base_client.default_params_with_timeout_values.copy()
for p in _params.keys():
if p in ['service', 'region', 'endpoint_type']:
_params.pop(p)
cls.lbv1_client = LBV1C.get_client(cls.manager)
cls.network = cls.create_network()
cls.name = cls.network['name']
cls.subnet = cls.create_subnet(cls.network)
cls.ext_net_id = CONF.network.public_network_id
cls.router = cls.create_router(data_utils.rand_name('router-'),
admin_state_up=True,
external_network_id=cls.ext_net_id,
router_type='exclusive')
cls.create_router_interface(cls.router['id'], cls.subnet['id'])
pool_name = data_utils.rand_name('pool-')
vip_name = data_utils.rand_name('vip-')
cls.pool = cls.lbv1_client.create_pool(
pool_name, "ROUND_ROBIN", "HTTP", cls.subnet['id'])['pool']
cls.vip = cls.lbv1_client.create_vip(cls.pool['id'],
subnet_id=cls.subnet['id'],
name=vip_name,
protocol="HTTP",
protocol_port=80)['vip']
cls.member = cls.lbv1_client.create_member(
80, cls.pool['id'], cls._ip_version)['member']
cls.member_address = ("10.0.9.47" if cls._ip_version == 4
else "2015::beef")
cls.health_monitor = cls.lbv1_client.create_health_monitor(
delay=4, max_retries=3, type="TCP", timeout=1)['health_monitor']
@classmethod
def resource_cleanup(cls):
"""
Cleanup the lb resources first and then call resource_cleanup
in BaseNetworkTest to cleanup other network resources. NSX-v
plugin requires the lb resources to be deleted before we can
delete subnet or remove interface from router.
"""
# Cleanup lb health monitors
if cls.health_monitor:
test_utils.call_and_ignore_notfound_exc(
cls.lbv1_client.delete_health_monitor,
cls.health_monitor['id'])
cls.health_monitor = None
# Cleanup members
if cls.member:
test_utils.call_and_ignore_notfound_exc(
cls.lbv1_client.delete_member, cls.member['id'])
cls.member = None
# Cleanup vips
if cls.vip:
test_utils.call_and_ignore_notfound_exc(
cls.lbv1_client.delete_vip, cls.vip['id'])
cls.vip = None
# Cleanup pool
if cls.pool:
test_utils.call_and_ignore_notfound_exc(
cls.lbv1_client.delete_pool, cls.pool['id'])
cls.pool = None
super(LoadBalancerTestJSON, cls).resource_cleanup()
def _check_list_with_filter(self, obj_name, attr_exceptions, **kwargs):
create_obj = getattr(self.lbv1_client, 'create_' + obj_name)
delete_obj = getattr(self.lbv1_client, 'delete_' + obj_name)
list_objs = getattr(self.lbv1_client, 'list_' + obj_name + 's')
body = create_obj(**kwargs)
obj = body[obj_name]
self.addCleanup(delete_obj, obj['id'])
for key, value in six.iteritems(obj):
# It is not relevant to filter by all arguments. That is why
# there is a list of attr to except
if key not in attr_exceptions:
body = list_objs(**{key: value})
objs = [v[key] for v in body[obj_name + 's']]
self.assertIn(value, objs)
@test.idempotent_id('1c959a37-feb3-4d58-b5fc-58ba653de065')
def test_list_vips(self):
# Verify the vIP exists in the list of all vIPs
body = self.lbv1_client.list_vips()
vips = body['vips']
self.assertIn(self.vip['id'], [v['id'] for v in vips])
@test.idempotent_id('687b7fd1-fd15-4ffd-8166-f376407a6081')
def test_list_vips_with_filter(self):
pool_name = data_utils.rand_name("pool-")
vip_name = data_utils.rand_name('vip-')
body = self.lbv1_client.create_pool(pool_name,
lb_method="ROUND_ROBIN",
protocol="HTTPS",
subnet_id=self.subnet['id'])
pool = body['pool']
self.addCleanup(self.lbv1_client.delete_pool, pool['id'])
attr_exceptions = ['status', 'session_persistence',
'status_description']
self._check_list_with_filter(
'vip', attr_exceptions, name=vip_name, protocol="HTTPS",
protocol_port=81, subnet_id=self.subnet['id'], pool_id=pool['id'],
description=data_utils.rand_name('description-'),
admin_state_up=False)
@test.idempotent_id('73dfc119-b64b-4e56-90d2-df61d7181098')
def test_create_update_delete_pool_vip(self):
# Creates a vip
pool_name = data_utils.rand_name("pool-")
vip_name = data_utils.rand_name('vip-')
address = self.subnet['allocation_pools'][0]['end']
body = self.lbv1_client.create_pool(
pool_name,
lb_method='ROUND_ROBIN',
protocol='HTTP',
subnet_id=self.subnet['id'])
pool = body['pool']
body = self.lbv1_client.create_vip(pool['id'],
name=vip_name,
protocol="HTTP",
protocol_port=80,
subnet_id=self.subnet['id'],
address=address)
vip = body['vip']
vip_id = vip['id']
# Confirm VIP's address correctness with a show
body = self.lbv1_client.show_vip(vip_id)
vip = body['vip']
self.assertEqual(address, vip['address'])
# Verification of vip update
new_name = "New_vip"
new_description = "New description"
persistence_type = "HTTP_COOKIE"
update_data = {"session_persistence": {
"type": persistence_type}}
body = self.lbv1_client.update_vip(vip_id,
name=new_name,
description=new_description,
connection_limit=10,
admin_state_up=False,
**update_data)
updated_vip = body['vip']
self.assertEqual(new_name, updated_vip['name'])
self.assertEqual(new_description, updated_vip['description'])
self.assertEqual(10, updated_vip['connection_limit'])
self.assertFalse(updated_vip['admin_state_up'])
self.assertEqual(persistence_type,
updated_vip['session_persistence']['type'])
self.lbv1_client.delete_vip(vip['id'])
self.lbv1_client.wait_for_resource_deletion('vip', vip['id'])
# Verification of pool update
new_name = "New_pool"
body = self.lbv1_client.update_pool(pool['id'],
name=new_name,
description="new_description",
lb_method='LEAST_CONNECTIONS')
updated_pool = body['pool']
self.assertEqual(new_name, updated_pool['name'])
self.assertEqual('new_description', updated_pool['description'])
self.assertEqual('LEAST_CONNECTIONS', updated_pool['lb_method'])
self.lbv1_client.delete_pool(pool['id'])
@test.idempotent_id('277a99ce-4b3e-451d-a18a-d26c0376d176')
def test_show_vip(self):
# Verifies the details of a vip
body = self.lbv1_client.show_vip(self.vip['id'])
vip = body['vip']
for key, value in six.iteritems(vip):
# 'status' should not be confirmed in api tests
if key != 'status':
self.assertEqual(self.vip[key], value)
@test.idempotent_id('432470dd-836b-4555-8388-af95a1c74d32')
def test_show_pool(self):
# Here we need to new pool without any dependence with vips
pool_name = data_utils.rand_name("pool-")
body = self.lbv1_client.create_pool(pool_name,
lb_method='ROUND_ROBIN',
protocol='HTTP',
subnet_id=self.subnet['id'])
pool = body['pool']
self.addCleanup(self.lbv1_client.delete_pool, pool['id'])
# Verifies the details of a pool
body = self.lbv1_client.show_pool(pool['id'])
shown_pool = body['pool']
for key, value in six.iteritems(pool):
# 'status' should not be confirmed in api tests
if key != 'status':
self.assertEqual(value, shown_pool[key])
@test.idempotent_id('c9951820-7b24-4e67-8c0c-41065ec66071')
def test_list_pools(self):
# Verify the pool exists in the list of all pools
body = self.lbv1_client.list_pools()
pools = body['pools']
self.assertIn(self.pool['id'], [p['id'] for p in pools])
@test.idempotent_id('55a1fb8e-e88e-4042-a46a-13a0282e4990')
def test_list_pools_with_filters(self):
attr_exceptions = ['status', 'vip_id', 'members', 'provider',
'status_description']
self._check_list_with_filter(
'pool', attr_exceptions, name=data_utils.rand_name("pool-"),
lb_method="ROUND_ROBIN", protocol="HTTPS",
subnet_id=self.subnet['id'],
description=data_utils.rand_name('description-'),
admin_state_up=False)
@test.idempotent_id('dd441433-de8f-4992-a721-0755dec737ff')
def test_list_members(self):
# Verify the member exists in the list of all members
body = self.lbv1_client.list_members()
members = body['members']
self.assertIn(self.member['id'], [m['id'] for m in members])
@test.idempotent_id('ccebe68a-f096-478d-b495-f17d5c0eac7b')
def test_list_members_with_filters(self):
attr_exceptions = ['status', 'status_description']
self._check_list_with_filter('member', attr_exceptions,
address=self.member_address,
protocol_port=80,
pool_id=self.pool['id'])
@test.idempotent_id('b4efe862-0439-4260-828c-cc09ff7e12a6')
def test_create_update_delete_member(self):
# Creates a member
body = self.lbv1_client.create_member(address=self.member_address,
protocol_port=80,
pool_id=self.pool['id'])
member = body['member']
# Verification of member update
body = self.lbv1_client.update_member(member['id'],
admin_state_up=False)
updated_member = body['member']
self.assertFalse(updated_member['admin_state_up'])
# Verification of member delete
self.lbv1_client.delete_member(member['id'])
@test.idempotent_id('4806ca47-b3a0-4280-9962-6631c6815e93')
def test_show_member(self):
# Verifies the details of a member
body = self.lbv1_client.show_member(self.member['id'])
member = body['member']
for key, value in six.iteritems(member):
# 'status' should not be confirmed in api tests
if key != 'status':
self.assertEqual(self.member[key], value)
@test.idempotent_id('65c4d817-d8d2-44df-9c15-86fc7b910044')
def test_list_health_monitors(self):
# Verify the health monitor exists in the list of all health monitors
body = self.lbv1_client.list_health_monitors()
health_monitors = body['health_monitors']
self.assertIn(self.health_monitor['id'],
[h['id'] for h in health_monitors])
@test.idempotent_id('a2c749a0-4eac-4acc-b729-6b469c3c616a')
def test_list_health_monitors_with_filters(self):
attr_exceptions = ['status', 'status_description', 'pools']
self._check_list_with_filter('health_monitor', attr_exceptions,
delay=5, max_retries=4, type="TCP",
timeout=2)
@test.idempotent_id('94f1e066-de6e-4cd8-b352-533d216956b7')
def test_create_update_delete_health_monitor(self):
# Creates a health_monitor
body = self.lbv1_client.create_health_monitor(delay=4,
max_retries=3,
type="TCP",
timeout=1)
health_monitor = body['health_monitor']
# Verification of health_monitor update
body = (self.lbv1_client.update_health_monitor
(health_monitor['id'],
admin_state_up=False))
updated_health_monitor = body['health_monitor']
self.assertFalse(updated_health_monitor['admin_state_up'])
# Verification of health_monitor delete
body = self.lbv1_client.delete_health_monitor(health_monitor['id'])
@test.idempotent_id('82943dcf-d424-43f0-890f-4b796f5043dc')
def test_create_health_monitor_http_type(self):
hm_type = "HTTP"
body = self.lbv1_client.create_health_monitor(delay=4,
max_retries=3,
type=hm_type,
timeout=1)
health_monitor = body['health_monitor']
self.addCleanup(self.lbv1_client.delete_health_monitor,
health_monitor['id'])
self.assertEqual(hm_type, health_monitor['type'])
@test.idempotent_id('b1279c46-822a-4406-bb16-6a6ce7bf4e4e')
def test_update_health_monitor_http_method(self):
body = self.lbv1_client.create_health_monitor(delay=4,
max_retries=3,
type="HTTP",
timeout=1)
health_monitor = body['health_monitor']
self.addCleanup(self.lbv1_client.delete_health_monitor,
health_monitor['id'])
body = (self.lbv1_client.update_health_monitor
(health_monitor['id'],
http_method="POST",
url_path="/home/user",
expected_codes="290"))
updated_health_monitor = body['health_monitor']
self.assertEqual("POST", updated_health_monitor['http_method'])
self.assertEqual("/home/user", updated_health_monitor['url_path'])
self.assertEqual("290", updated_health_monitor['expected_codes'])
@test.idempotent_id('7beabd44-0200-4cc4-b18d-5fb1f44cf36c')
def test_show_health_monitor(self):
# Verifies the details of a health_monitor
body = self.lbv1_client.show_health_monitor(self.health_monitor['id'])
health_monitor = body['health_monitor']
for key, value in six.iteritems(health_monitor):
# 'status' should not be confirmed in api tests
if key != 'status':
self.assertEqual(self.health_monitor[key], value)
@test.idempotent_id('5386d600-1372-4f99-b0f2-316401718ac4')
def test_associate_disassociate_health_monitor_with_pool(self):
# Verify that a health monitor can be associated with a pool
self.lbv1_client.associate_health_monitor_with_pool(
self.health_monitor['id'], self.pool['id'])
body = self.lbv1_client.show_health_monitor(
self.health_monitor['id'])
health_monitor = body['health_monitor']
body = self.lbv1_client.show_pool(self.pool['id'])
pool = body['pool']
self.assertIn(pool['id'],
[p['pool_id'] for p in health_monitor['pools']])
self.assertIn(health_monitor['id'], pool['health_monitors'])
# Verify that a health monitor can be disassociated from a pool
(self.lbv1_client.disassociate_health_monitor_with_pool
(self.health_monitor['id'], self.pool['id']))
body = self.lbv1_client.show_pool(self.pool['id'])
pool = body['pool']
body = self.lbv1_client.show_health_monitor(
self.health_monitor['id'])
health_monitor = body['health_monitor']
self.assertNotIn(health_monitor['id'], pool['health_monitors'])
self.assertNotIn(pool['id'],
[p['pool_id'] for p in health_monitor['pools']])
@test.idempotent_id('17a6b730-0780-46c9-bca0-cec67387e469')
def test_get_lb_pool_stats(self):
# Verify the details of pool stats
body = self.lbv1_client.list_lb_pool_stats(self.pool['id'])
stats = body['stats']
self.assertIn("bytes_in", stats)
self.assertIn("total_connections", stats)
self.assertIn("active_connections", stats)
self.assertIn("bytes_out", stats)
@test.idempotent_id('a113c740-6194-4622-a187-8343ad3e5208')
def test_update_list_of_health_monitors_associated_with_pool(self):
(self.lbv1_client.associate_health_monitor_with_pool
(self.health_monitor['id'], self.pool['id']))
self.lbv1_client.update_health_monitor(
self.health_monitor['id'], admin_state_up=False)
body = self.lbv1_client.show_pool(self.pool['id'])
health_monitors = body['pool']['health_monitors']
for health_monitor_id in health_monitors:
body = self.lbv1_client.show_health_monitor(health_monitor_id)
self.assertFalse(body['health_monitor']['admin_state_up'])
(self.lbv1_client.disassociate_health_monitor_with_pool
(self.health_monitor['id'], self.pool['id']))
@test.idempotent_id('a2843ec6-80d8-4617-b985-8c8565daac8d')
def test_update_admin_state_up_of_pool(self):
self.lbv1_client.update_pool(self.pool['id'],
admin_state_up=False)
body = self.lbv1_client.show_pool(self.pool['id'])
pool = body['pool']
self.assertFalse(pool['admin_state_up'])
@test.idempotent_id('fd45c684-b847-472f-a7e8-a3f70e8e08e0')
def test_show_vip_associated_with_pool(self):
body = self.lbv1_client.show_pool(self.pool['id'])
pool = body['pool']
body = self.lbv1_client.show_vip(pool['vip_id'])
vip = body['vip']
self.assertEqual(self.vip['name'], vip['name'])
self.assertEqual(self.vip['id'], vip['id'])
@test.idempotent_id('1ac0ca5f-7d6a-4ac4-b286-d68c92a98405')
def test_show_members_associated_with_pool(self):
body = self.lbv1_client.show_pool(self.pool['id'])
members = body['pool']['members']
for member_id in members:
body = self.lbv1_client.show_member(member_id)
self.assertIsNotNone(body['member']['status'])
self.assertEqual(member_id, body['member']['id'])
self.assertIsNotNone(body['member']['admin_state_up'])
@test.idempotent_id('4fa308fa-ac2b-4acf-87db-adfe2ee4739c')
def test_update_pool_related_to_member(self):
# Create new pool
pool_name = data_utils.rand_name("pool-")
body = self.lbv1_client.create_pool(
pool_name,
lb_method='ROUND_ROBIN',
protocol='HTTP',
subnet_id=self.subnet['id'])
new_pool = body['pool']
self.addCleanup(self.lbv1_client.delete_pool, new_pool['id'])
# Update member with new pool's id
body = self.lbv1_client.update_member(self.member['id'],
pool_id=new_pool['id'])
# Confirm with show that pool_id change
body = self.lbv1_client.show_member(self.member['id'])
member = body['member']
self.assertEqual(member['pool_id'], new_pool['id'])
# Update member with old pool id, this is needed for clean up
body = self.lbv1_client.update_member(self.member['id'],
pool_id=self.pool['id'])
@test.idempotent_id('0af2ff6b-a896-433d-8107-3c76262a9dfa')
def test_update_member_weight(self):
self.lbv1_client.update_member(self.member['id'],
weight=2)
body = self.lbv1_client.show_member(self.member['id'])
member = body['member']
self.assertEqual(2, member['weight'])
@decorators.skip_because(bug="1402007")
class LoadBalancerIpV6TestJSON(LoadBalancerTestJSON):
_ip_version = 6