vmware-nsxlib/vmware_nsxlib/tests/unit/v3/test_load_balancer.py
Shawn Wang 093d510988
Add support for relax_scale_validation in LbService
Starting from NSX version 2.5.1, LBService will have a new property
'relax_scale_validation'. If this flag is set to true, scale
validation for vs, pool, pool member and rule will be relaxed for lbs

Checks are added to prevent including this flag in API calls on older
versions of NSX backend. feature_supported for this new flag is added
in NsxLib for MP. For Policy, ResourceDef and LBServiceDef are
responsible for the checks.

For MP, checks are added in _build_args() in load_balancer.py >
Service class so that the new flag is only passed when NSX meets
the version requirement.

For Policy, ResourceDef now has a new attribute nsx_version and two
new methods: _set_attr_if_supported() and _attr_supported().
get_obj_dict() will use them to check if a certain attr meets
version requirement, and only include it in body if true.

Change-Id: I4f9c3bfd7995bca85a51a6971fc9d784e574301a
2019-09-10 14:55:57 -07:00

564 lines
26 KiB
Python

# Copyright 2017 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 mock
from vmware_nsxlib.tests.unit.v3 import nsxlib_testcase
from vmware_nsxlib.tests.unit.v3 import test_constants as consts
from vmware_nsxlib.v3 import exceptions as nsxlib_exc
from vmware_nsxlib.v3 import load_balancer
app_profile_types = load_balancer.ApplicationProfileTypes
app_profiles = [app_profile_types.HTTP,
app_profile_types.FAST_TCP,
app_profile_types.FAST_UDP]
per_profile_types = load_balancer.PersistenceProfileTypes
per_profiles = [per_profile_types.COOKIE, per_profile_types.SOURCE_IP]
monitor_types = load_balancer.MonitorTypes
monitors = [monitor_types.HTTP, monitor_types.HTTPS, monitor_types.ICMP,
monitor_types.PASSIVE, monitor_types.TCP, monitor_types.UDP]
class TestApplicationProfile(nsxlib_testcase.NsxClientTestCase):
def test_create_application_profiles(self):
fake_profile = consts.FAKE_APPLICATION_PROFILE.copy()
for profile_type in app_profiles:
body = {
'display_name': fake_profile['display_name'],
'description': fake_profile['description'],
'resource_type': profile_type,
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.application_profile.create(
display_name=body['display_name'],
description=body['description'],
resource_type=body['resource_type'],
tags=consts.FAKE_TAGS)
create.assert_called_with('loadbalancer/application-profiles',
body)
def test_list_application_profiles(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.application_profile.list()
list_call.assert_called_with(
resource='loadbalancer/application-profiles')
def test_get_application_profile(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_profile = consts.FAKE_APPLICATION_PROFILE.copy()
self.nsxlib.load_balancer.application_profile.get(
fake_profile['id'])
get.assert_called_with(
'loadbalancer/application-profiles/%s' % fake_profile['id'])
def test_delete_application_profile(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_profile = consts.FAKE_APPLICATION_PROFILE.copy()
self.nsxlib.load_balancer.application_profile.delete(
fake_profile['id'])
delete.assert_called_with(
'loadbalancer/application-profiles/%s' % fake_profile['id'])
class TestPersistenceProfile(nsxlib_testcase.NsxClientTestCase):
def test_create_persistence_profiles(self):
fake_profile = consts.FAKE_PERSISTENCE_PROFILE.copy()
for profile_type in per_profiles:
body = {
'display_name': fake_profile['display_name'],
'description': fake_profile['description'],
'resource_type': profile_type,
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.persistence_profile.create(
body['display_name'], body['description'],
consts.FAKE_TAGS, body['resource_type'])
create.assert_called_with('loadbalancer/persistence-profiles',
body)
def test_list_persistence_profiles(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.persistence_profile.list()
list_call.assert_called_with(
resource='loadbalancer/persistence-profiles')
def test_get_persistence_profile(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_profile = consts.FAKE_APPLICATION_PROFILE.copy()
self.nsxlib.load_balancer.persistence_profile.get(
fake_profile['id'])
get.assert_called_with(
'loadbalancer/persistence-profiles/%s' % fake_profile['id'])
def test_delete_persistence_profile(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_profile = consts.FAKE_PERSISTENCE_PROFILE.copy()
self.nsxlib.load_balancer.persistence_profile.delete(
fake_profile['id'])
delete.assert_called_with(
'loadbalancer/persistence-profiles/%s' % fake_profile['id'])
class TestRule(nsxlib_testcase.NsxClientTestCase):
def test_create_rule(self):
fake_rule = consts.FAKE_RULE.copy()
body = {
'display_name': fake_rule['display_name'],
'description': fake_rule['description'],
'resource_type': fake_rule['resource_type'],
'phase': fake_rule['phase'],
'match_strategy': fake_rule['match_strategy'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.rule.create(**body)
create.assert_called_with('loadbalancer/rules', body)
def test_list_rules(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.rule.list()
list_call.assert_called_with(resource='loadbalancer/rules')
def test_get_rule(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_rule = consts.FAKE_RULE.copy()
self.nsxlib.load_balancer.rule.get(fake_rule['id'])
get.assert_called_with('loadbalancer/rules/%s' % fake_rule['id'])
def test_delete_rule(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_rule = consts.FAKE_RULE.copy()
self.nsxlib.load_balancer.rule.delete(fake_rule['id'])
delete.assert_called_with(
'loadbalancer/rules/%s' % fake_rule['id'])
class TestClientSslProfile(nsxlib_testcase.NsxClientTestCase):
def test_create_client_ssl_profiles(self):
fake_profile = consts.FAKE_CLIENT_SSL_PROFILE.copy()
body = {
'display_name': fake_profile['display_name'],
'description': fake_profile['description'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.client_ssl_profile.create(
body['display_name'], body['description'],
consts.FAKE_TAGS)
create.assert_called_with('loadbalancer/client-ssl-profiles', body)
def test_list_client_ssl_profiles(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.client_ssl_profile.list()
list_call.assert_called_with(
resource='loadbalancer/client-ssl-profiles')
def test_get_client_ssl_profile(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_profile = consts.FAKE_CLIENT_SSL_PROFILE.copy()
self.nsxlib.load_balancer.client_ssl_profile.get(
fake_profile['id'])
get.assert_called_with(
'loadbalancer/client-ssl-profiles/%s' % fake_profile['id'])
def test_delete_client_ssl_profile(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_profile = consts.FAKE_CLIENT_SSL_PROFILE.copy()
self.nsxlib.load_balancer.client_ssl_profile.delete(
fake_profile['id'])
delete.assert_called_with(
'loadbalancer/client-ssl-profiles/%s' % fake_profile['id'])
class TestServerSslProfile(nsxlib_testcase.NsxClientTestCase):
def test_create_server_client_ssl_profiles(self):
fake_profile = consts.FAKE_SERVER_SSL_PROFILE.copy()
body = {
'display_name': fake_profile['display_name'],
'description': fake_profile['description'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.server_ssl_profile.create(
body['display_name'], body['description'],
consts.FAKE_TAGS)
create.assert_called_with('loadbalancer/server-ssl-profiles', body)
def test_list_server_ssl_profiles(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.server_ssl_profile.list()
list_call.assert_called_with(
resource='loadbalancer/server-ssl-profiles')
def test_get_server_ssl_profile(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_profile = consts.FAKE_SERVER_SSL_PROFILE.copy()
self.nsxlib.load_balancer.server_ssl_profile.get(
fake_profile['id'])
get.assert_called_with(
'loadbalancer/server-ssl-profiles/%s' % fake_profile['id'])
def test_delete_server_ssl_profile(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_profile = consts.FAKE_SERVER_SSL_PROFILE.copy()
self.nsxlib.load_balancer.server_ssl_profile.delete(
fake_profile['id'])
delete.assert_called_with(
'loadbalancer/server-ssl-profiles/%s' % fake_profile['id'])
class TestMonitor(nsxlib_testcase.NsxClientTestCase):
def test_create_monitors(self):
fake_monitor = consts.FAKE_MONITOR.copy()
for monitor_type in monitors:
body = {
'display_name': fake_monitor['display_name'],
'description': fake_monitor['description'],
'resource_type': monitor_type,
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.monitor.create(
body['display_name'], body['description'],
consts.FAKE_TAGS, body['resource_type'])
create.assert_called_with('loadbalancer/monitors',
body)
def test_list_monitors(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.monitor.list()
list_call.assert_called_with(resource='loadbalancer/monitors')
def test_get_monitor(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_monitor = consts.FAKE_MONITOR.copy()
self.nsxlib.load_balancer.monitor.get(fake_monitor['id'])
get.assert_called_with(
'loadbalancer/monitors/%s' % fake_monitor['id'])
def test_delete_monitor(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_monitor = consts.FAKE_MONITOR.copy()
self.nsxlib.load_balancer.monitor.delete(fake_monitor['id'])
delete.assert_called_with(
'loadbalancer/monitors/%s' % fake_monitor['id'])
class TestPool(nsxlib_testcase.NsxClientTestCase):
def test_create_pool(self):
fake_pool = consts.FAKE_POOL.copy()
body = {
'display_name': fake_pool['display_name'],
'description': fake_pool['description'],
'algorithm': fake_pool['algorithm'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.pool.create(
body['display_name'], body['description'],
consts.FAKE_TAGS, algorithm=body['algorithm'])
create.assert_called_with('loadbalancer/pools',
body)
def test_list_pools(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.pool.list()
list_call.assert_called_with(resource='loadbalancer/pools')
def test_get_pool(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_profile = consts.FAKE_POOL.copy()
self.nsxlib.load_balancer.pool.get(fake_profile['id'])
get.assert_called_with(
'loadbalancer/pools/%s' % fake_profile['id'])
def test_delete_pool(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_profile = consts.FAKE_POOL.copy()
self.nsxlib.load_balancer.pool.delete(fake_profile['id'])
delete.assert_called_with(
'loadbalancer/pools/%s' % fake_profile['id'])
def test_remove_monitor_from_pool(self):
fake_pool = consts.FAKE_POOL.copy()
fake_pool['active_monitor_ids'] = [consts.FAKE_MONITOR_UUID]
body = {'display_name': fake_pool['display_name'],
'description': fake_pool['description'],
'id': fake_pool['id'],
'algorithm': fake_pool['algorithm'],
'active_monitor_ids': []}
with mock.patch.object(self.nsxlib.client, 'get',
return_value=fake_pool):
with mock.patch.object(self.nsxlib.client, 'update') as update:
self.nsxlib.load_balancer.pool.remove_monitor_from_pool(
fake_pool['id'], consts.FAKE_MONITOR_UUID)
resource = 'loadbalancer/pools/%s' % fake_pool['id']
update.assert_called_with(resource, body)
def test_remove_non_exist_monitor_from_pool(self):
fake_pool = consts.FAKE_POOL.copy()
fake_pool['active_monitor_ids'] = [consts.FAKE_MONITOR_UUID]
with mock.patch.object(self.nsxlib.client, 'get',
return_value=fake_pool):
self.assertRaises(
nsxlib_exc.ResourceNotFound,
self.nsxlib.load_balancer.pool.remove_monitor_from_pool,
fake_pool['id'],
'xxx-yyy')
def test_add_monitor_to_pool(self):
fake_pool = consts.FAKE_POOL.copy()
body = {'display_name': fake_pool['display_name'],
'description': fake_pool['description'],
'id': fake_pool['id'],
'algorithm': fake_pool['algorithm'],
'active_monitor_ids': [consts.FAKE_MONITOR_UUID]}
with mock.patch.object(self.nsxlib.client, 'get',
return_value=fake_pool):
with mock.patch.object(self.nsxlib.client, 'update') as update:
self.nsxlib.load_balancer.pool.add_monitor_to_pool(
fake_pool['id'], consts.FAKE_MONITOR_UUID)
resource = 'loadbalancer/pools/%s' % fake_pool['id']
update.assert_called_with(resource, body)
class TestVirtualServer(nsxlib_testcase.NsxClientTestCase):
def test_create_virtual_server(self):
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
body = {
'display_name': fake_virtual_server['display_name'],
'description': fake_virtual_server['description'],
'ip_protocol': fake_virtual_server['ip_protocol'],
'port': fake_virtual_server['port'],
'enabled': fake_virtual_server['enabled'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create:
self.nsxlib.load_balancer.virtual_server.create(
body['display_name'], body['description'],
consts.FAKE_TAGS, ip_protocol=body['ip_protocol'],
port=body['port'], enabled=body['enabled'])
create.assert_called_with('loadbalancer/virtual-servers',
body)
def test_list_virtual_servers(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.virtual_server.list()
list_call.assert_called_with(
resource='loadbalancer/virtual-servers')
def test_get_virtual_server(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
self.nsxlib.load_balancer.virtual_server.get(
fake_virtual_server['id'])
get.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'])
def test_delete_virtual_server(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
self.nsxlib.load_balancer.virtual_server.delete(
fake_virtual_server['id'])
delete.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'])
def test_add_rule(self):
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
body = {
'display_name': fake_virtual_server['display_name'],
'description': fake_virtual_server['description'],
'id': fake_virtual_server['id'],
'enabled': fake_virtual_server['enabled'],
'port': fake_virtual_server['port'],
'ip_protocol': fake_virtual_server['ip_protocol'],
'rule_ids': [consts.FAKE_RULE_UUID]
}
with mock.patch.object(self.nsxlib.client, 'get') as mock_get, \
mock.patch.object(self.nsxlib.client, 'update') as mock_update:
mock_get.return_value = fake_virtual_server
self.nsxlib.load_balancer.virtual_server.add_rule(
fake_virtual_server['id'], consts.FAKE_RULE_UUID)
mock_update.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'],
body)
def test_remove_rule(self):
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
fake_virtual_server['rule_ids'] = [consts.FAKE_RULE_UUID]
body = {
'display_name': fake_virtual_server['display_name'],
'description': fake_virtual_server['description'],
'id': fake_virtual_server['id'],
'enabled': fake_virtual_server['enabled'],
'port': fake_virtual_server['port'],
'ip_protocol': fake_virtual_server['ip_protocol'],
'rule_ids': []
}
with mock.patch.object(self.nsxlib.client, 'get') as mock_get, \
mock.patch.object(self.nsxlib.client, 'update') as mock_update:
mock_get.return_value = fake_virtual_server
self.nsxlib.load_balancer.virtual_server.remove_rule(
fake_virtual_server['id'], consts.FAKE_RULE_UUID)
mock_update.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'],
body)
def test_add_client_ssl_profile_binding(self):
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
body = {
'display_name': fake_virtual_server['display_name'],
'description': fake_virtual_server['description'],
'id': fake_virtual_server['id'],
'enabled': fake_virtual_server['enabled'],
'port': fake_virtual_server['port'],
'ip_protocol': fake_virtual_server['ip_protocol'],
'client_ssl_profile_binding': {
'ssl_profile_id': consts.FAKE_CLIENT_SSL_PROFILE_UUID,
'default_certificate_id': consts.FAKE_DEFAULT_CERTIFICATE_ID,
'client_auth': 'IGNORE',
'certificate_chain_depth': 3
}
}
with mock.patch.object(self.nsxlib.client, 'get') as mock_get, \
mock.patch.object(self.nsxlib.client, 'update') as mock_update:
mock_get.return_value = fake_virtual_server
vs_client = self.nsxlib.load_balancer.virtual_server
vs_client.add_client_ssl_profile_binding(
fake_virtual_server['id'],
consts.FAKE_CLIENT_SSL_PROFILE_UUID,
consts.FAKE_DEFAULT_CERTIFICATE_ID,
client_auth='IGNORE',
certificate_chain_depth=3,
xyz='xyz'
)
mock_update.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'],
body)
def test_add_server_ssl_profile_binding(self):
fake_virtual_server = consts.FAKE_VIRTUAL_SERVER.copy()
body = {
'display_name': fake_virtual_server['display_name'],
'description': fake_virtual_server['description'],
'id': fake_virtual_server['id'],
'enabled': fake_virtual_server['enabled'],
'port': fake_virtual_server['port'],
'ip_protocol': fake_virtual_server['ip_protocol'],
'server_ssl_profile_binding': {
'ssl_profile_id': consts.FAKE_SERVER_SSL_PROFILE_UUID,
'server_auth': 'IGNORE',
'certificate_chain_depth': 3
}
}
with mock.patch.object(self.nsxlib.client, 'get') as mock_get, \
mock.patch.object(self.nsxlib.client, 'update') as mock_update:
mock_get.return_value = fake_virtual_server
vs_client = self.nsxlib.load_balancer.virtual_server
vs_client.add_server_ssl_profile_binding(
fake_virtual_server['id'],
consts.FAKE_SERVER_SSL_PROFILE_UUID,
server_auth='IGNORE',
certificate_chain_depth=3,
xyz='xyz')
mock_update.assert_called_with(
'loadbalancer/virtual-servers/%s' % fake_virtual_server['id'],
body)
class TestService(nsxlib_testcase.NsxClientTestCase):
def test_create_service(self):
fake_service = consts.FAKE_SERVICE.copy()
body = {
'display_name': fake_service['display_name'],
'description': fake_service['description'],
'enabled': fake_service['enabled'],
'attachment': fake_service['attachment'],
'relax_scale_validation': fake_service['relax_scale_validation'],
'tags': consts.FAKE_TAGS
}
with mock.patch.object(self.nsxlib.client, 'create') as create, \
mock.patch.object(self.nsxlib, 'feature_supported') as support:
support.return_value = True
self.nsxlib.load_balancer.service.create(
body['display_name'], body['description'],
consts.FAKE_TAGS, enabled=body['enabled'],
attachment=body['attachment'],
relax_scale_validation=body['relax_scale_validation'])
create.assert_called_with('loadbalancer/services',
body)
def test_list_services(self):
with mock.patch.object(self.nsxlib.client, 'list') as list_call:
self.nsxlib.load_balancer.service.list()
list_call.assert_called_with(resource='loadbalancer/services')
def test_get_service(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.get(fake_service['id'])
get.assert_called_with(
'loadbalancer/services/%s' % fake_service['id'])
def test_get_stats(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.get_stats(fake_service['id'])
get.assert_called_with(
'loadbalancer/services/%s/statistics?source=realtime' %
fake_service['id'])
def test_get_status(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.get_status(fake_service['id'])
get.assert_called_with(
'loadbalancer/services/%s/status' % fake_service['id'])
def test_get_virtual_servers_status(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.get_virtual_servers_status(
fake_service['id'])
get.assert_called_with(
'loadbalancer/services/%s/virtual-servers/status' %
fake_service['id'])
def test_delete_service(self):
with mock.patch.object(self.nsxlib.client, 'delete') as delete:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.delete(fake_service['id'])
delete.assert_called_with(
'loadbalancer/services/%s' % fake_service['id'])
def test_get_usage(self):
with mock.patch.object(self.nsxlib.client, 'get') as get:
fake_service = consts.FAKE_SERVICE.copy()
self.nsxlib.load_balancer.service.get_usage(fake_service['id'])
get.assert_called_with(
'loadbalancer/services/%s/usage' % fake_service['id'])