Improve error reporting for the octavia plugin

Previous to this patch the detailed errors returned by the Octavia API
were being masked by default error handling.  This patch passes the API
fault strings through to the Octavia OSC plugin error output.

Closes-Bug: #1709771
Story: 1709771
Task: 5002
Change-Id: Iee662cf431f6d91583815495ea94a3fbf06be8f8
This commit is contained in:
Michael Johnson 2017-08-11 21:11:39 -07:00
parent 0c5fd6c567
commit fe83a76f93
2 changed files with 363 additions and 52 deletions

View File

@ -18,6 +18,28 @@ from osc_lib.api import api
from octaviaclient.api import constants as const from octaviaclient.api import constants as const
def correct_return_codes(func):
_status_dict = {400: 'Bad Request', 401: 'Unauthorized',
403: 'Forbidden', 404: 'Not found',
409: 'Conflict', 413: 'Over Limit',
501: 'Not Implemented'}
def wrapper(*args, **kwargs):
try:
response = func(*args, **kwargs)
except Exception as e:
if not hasattr(e, 'response'):
raise
raise OctaviaClientException(
code=e.response.status_code,
message=e.response.json().get(
'faultstring',
_status_dict.get(e.response.status_code, 'Unknown Error')),
request_id=e.request_id)
return response
return wrapper
class APIv2(api.BaseAPI): class APIv2(api.BaseAPI):
"""Load Balancer v2 API""" """Load Balancer v2 API"""
@ -30,7 +52,7 @@ class APIv2(api.BaseAPI):
def _build_url(self): def _build_url(self):
if not self.endpoint.endswith(self._endpoint_suffix): if not self.endpoint.endswith(self._endpoint_suffix):
self.endpoint = self.endpoint + self._endpoint_suffix self.endpoint += self._endpoint_suffix
def load_balancer_list(self, **params): def load_balancer_list(self, **params):
"""List all load balancers """List all load balancers
@ -41,9 +63,9 @@ class APIv2(api.BaseAPI):
List of load balancers List of load balancers
""" """
url = const.BASE_LOADBALANCER_URL url = const.BASE_LOADBALANCER_URL
load_balancer_list = self.list(url, **params) response = self.list(url, **params)
return load_balancer_list return response
def load_balancer_show(self, lb_id): def load_balancer_show(self, lb_id):
"""Show a load balancer """Show a load balancer
@ -53,11 +75,11 @@ class APIv2(api.BaseAPI):
:return: :return:
A dict of the specified load balancer's settings A dict of the specified load balancer's settings
""" """
load_balancer = self.find(path=const.BASE_LOADBALANCER_URL, response = self.find(path=const.BASE_LOADBALANCER_URL, value=lb_id)
value=lb_id)
return load_balancer return response
@correct_return_codes
def load_balancer_create(self, **params): def load_balancer_create(self, **params):
"""Create a load balancer """Create a load balancer
@ -67,10 +89,11 @@ class APIv2(api.BaseAPI):
A dict of the created load balancer's settings A dict of the created load balancer's settings
""" """
url = const.BASE_LOADBALANCER_URL url = const.BASE_LOADBALANCER_URL
load_balancer = self.create(url, **params) response = self.create(url, **params)
return load_balancer return response
@correct_return_codes
def load_balancer_delete(self, lb_id, **params): def load_balancer_delete(self, lb_id, **params):
"""Delete a load balancer """Delete a load balancer
@ -86,6 +109,7 @@ class APIv2(api.BaseAPI):
return response return response
@correct_return_codes
def load_balancer_set(self, lb_id, **params): def load_balancer_set(self, lb_id, **params):
"""Update a load balancer's settings """Update a load balancer's settings
@ -110,9 +134,9 @@ class APIv2(api.BaseAPI):
List of listeners List of listeners
""" """
url = const.BASE_LISTENER_URL url = const.BASE_LISTENER_URL
listener_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return listener_list return response
def listener_show(self, listener_id): def listener_show(self, listener_id):
"""Show a listener """Show a listener
@ -121,10 +145,11 @@ class APIv2(api.BaseAPI):
:return: :return:
A dict of the specified listener's settings A dict of the specified listener's settings
""" """
listener = self.find(path=const.BASE_LISTENER_URL, value=listener_id) response = self.find(path=const.BASE_LISTENER_URL, value=listener_id)
return listener return response
@correct_return_codes
def listener_create(self, **kwargs): def listener_create(self, **kwargs):
"""Create a listener """Create a listener
@ -134,10 +159,11 @@ class APIv2(api.BaseAPI):
A dict of the created listener's settings A dict of the created listener's settings
""" """
url = const.BASE_LISTENER_URL url = const.BASE_LISTENER_URL
listener = self.create(url, **kwargs) response = self.create(url, **kwargs)
return listener return response
@correct_return_codes
def listener_delete(self, listener_id): def listener_delete(self, listener_id):
"""Delete a listener """Delete a listener
@ -151,6 +177,7 @@ class APIv2(api.BaseAPI):
return response return response
@correct_return_codes
def listener_set(self, listener_id, **kwargs): def listener_set(self, listener_id, **kwargs):
"""Update a listener's settings """Update a listener's settings
@ -175,10 +202,11 @@ class APIv2(api.BaseAPI):
List of pools List of pools
""" """
url = const.BASE_POOL_URL url = const.BASE_POOL_URL
pool_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return pool_list return response
@correct_return_codes
def pool_create(self, **kwargs): def pool_create(self, **kwargs):
"""Create a pool """Create a pool
@ -188,10 +216,11 @@ class APIv2(api.BaseAPI):
A dict of the created pool's settings A dict of the created pool's settings
""" """
url = const.BASE_POOL_URL url = const.BASE_POOL_URL
pool = self.create(url, **kwargs) response = self.create(url, **kwargs)
return pool return response
@correct_return_codes
def pool_delete(self, pool_id): def pool_delete(self, pool_id):
"""Delete a pool """Delete a pool
@ -201,9 +230,9 @@ class APIv2(api.BaseAPI):
Response Code from the API Response Code from the API
""" """
url = const.BASE_SINGLE_POOL_URL.format(pool_id=pool_id) url = const.BASE_SINGLE_POOL_URL.format(pool_id=pool_id)
deleted_pool = self.delete(url) response = self.delete(url)
return deleted_pool return response
def pool_show(self, pool_id): def pool_show(self, pool_id):
"""Show a pool's settings """Show a pool's settings
@ -213,10 +242,11 @@ class APIv2(api.BaseAPI):
:return: :return:
Dict of the specified pool's settings Dict of the specified pool's settings
""" """
pool = self.find(path=const.BASE_POOL_URL, value=pool_id) response = self.find(path=const.BASE_POOL_URL, value=pool_id)
return pool return response
@correct_return_codes
def pool_set(self, pool_id, **kwargs): def pool_set(self, pool_id, **kwargs):
"""Update a pool's settings """Update a pool's settings
@ -228,9 +258,9 @@ class APIv2(api.BaseAPI):
Response Code from the API Response Code from the API
""" """
url = const.BASE_SINGLE_POOL_URL.format(pool_id=pool_id) url = const.BASE_SINGLE_POOL_URL.format(pool_id=pool_id)
pool = self.create(url, method='PUT', **kwargs) response = self.create(url, method='PUT', **kwargs)
return pool return response
def member_list(self, pool_id, **kwargs): def member_list(self, pool_id, **kwargs):
"""Lists the member from a given pool id """Lists the member from a given pool id
@ -243,9 +273,9 @@ class APIv2(api.BaseAPI):
Response list members Response list members
""" """
url = const.BASE_MEMBER_URL.format(pool_id=pool_id) url = const.BASE_MEMBER_URL.format(pool_id=pool_id)
members_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return members_list return response
def member_show(self, pool_id, member_id): def member_show(self, pool_id, member_id):
"""Showing a member details of a pool """Showing a member details of a pool
@ -260,10 +290,11 @@ class APIv2(api.BaseAPI):
Response of member Response of member
""" """
url = const.BASE_MEMBER_URL.format(pool_id=pool_id) url = const.BASE_MEMBER_URL.format(pool_id=pool_id)
member = self.find(path=url, value=member_id) response = self.find(path=url, value=member_id)
return member return response
@correct_return_codes
def member_create(self, pool_id, **kwargs): def member_create(self, pool_id, **kwargs):
"""Creating a member for the given pool id """Creating a member for the given pool id
@ -275,10 +306,11 @@ class APIv2(api.BaseAPI):
A member details on successful creation A member details on successful creation
""" """
url = const.BASE_MEMBER_URL.format(pool_id=pool_id) url = const.BASE_MEMBER_URL.format(pool_id=pool_id)
member = self.create(url, **kwargs) response = self.create(url, **kwargs)
return member return response
@correct_return_codes
def member_delete(self, pool_id, member_id): def member_delete(self, pool_id, member_id):
"""Removing a member from a pool and mark that member as deleted """Removing a member from a pool and mark that member as deleted
@ -295,6 +327,7 @@ class APIv2(api.BaseAPI):
return response return response
@correct_return_codes
def member_set(self, pool_id, member_id, **kwargs): def member_set(self, pool_id, member_id, **kwargs):
"""Updating a member settings """Updating a member settings
@ -309,7 +342,6 @@ class APIv2(api.BaseAPI):
""" """
url = const.BASE_SINGLE_MEMBER_URL.format(pool_id=pool_id, url = const.BASE_SINGLE_MEMBER_URL.format(pool_id=pool_id,
member_id=member_id) member_id=member_id)
response = self.create(url, method='PUT', **kwargs) response = self.create(url, method='PUT', **kwargs)
return response return response
@ -323,10 +355,11 @@ class APIv2(api.BaseAPI):
List of l7policies List of l7policies
""" """
url = const.BASE_L7POLICY_URL url = const.BASE_L7POLICY_URL
policy_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return policy_list return response
@correct_return_codes
def l7policy_create(self, **kwargs): def l7policy_create(self, **kwargs):
"""Create a l7policy """Create a l7policy
@ -336,10 +369,11 @@ class APIv2(api.BaseAPI):
A dict of the created l7policy's settings A dict of the created l7policy's settings
""" """
url = const.BASE_L7POLICY_URL url = const.BASE_L7POLICY_URL
policy = self.create(url, **kwargs) response = self.create(url, **kwargs)
return policy return response
@correct_return_codes
def l7policy_delete(self, l7policy_id): def l7policy_delete(self, l7policy_id):
"""Delete a l7policy """Delete a l7policy
@ -361,10 +395,11 @@ class APIv2(api.BaseAPI):
:return: :return:
Dict of the specified l7policy's settings Dict of the specified l7policy's settings
""" """
l7policy = self.find(path=const.BASE_L7POLICY_URL, value=l7policy_id) response = self.find(path=const.BASE_L7POLICY_URL, value=l7policy_id)
return l7policy return response
@correct_return_codes
def l7policy_set(self, l7policy_id, **kwargs): def l7policy_set(self, l7policy_id, **kwargs):
"""Update a l7policy's settings """Update a l7policy's settings
@ -376,7 +411,6 @@ class APIv2(api.BaseAPI):
Response Code from the API Response Code from the API
""" """
url = const.BASE_SINGLE_L7POLICY_URL.format(policy_uuid=l7policy_id) url = const.BASE_SINGLE_L7POLICY_URL.format(policy_uuid=l7policy_id)
response = self.create(url, method='PUT', **kwargs) response = self.create(url, method='PUT', **kwargs)
return response return response
@ -390,10 +424,11 @@ class APIv2(api.BaseAPI):
List of l7policies List of l7policies
""" """
url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id) url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id)
rule_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return rule_list return response
@correct_return_codes
def l7rule_create(self, l7policy_id, **kwargs): def l7rule_create(self, l7policy_id, **kwargs):
"""Create a l7rule """Create a l7rule
@ -405,10 +440,11 @@ class APIv2(api.BaseAPI):
A dict of the created l7rule's settings A dict of the created l7rule's settings
""" """
url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id) url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id)
rule = self.create(url, **kwargs) response = self.create(url, **kwargs)
return rule return response
@correct_return_codes
def l7rule_delete(self, l7rule_id, l7policy_id): def l7rule_delete(self, l7rule_id, l7policy_id):
"""Delete a l7rule """Delete a l7rule
@ -436,11 +472,11 @@ class APIv2(api.BaseAPI):
Dict of the specified l7rule's settings Dict of the specified l7rule's settings
""" """
url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id) url = const.BASE_L7RULE_URL.format(policy_uuid=l7policy_id)
response = self.find(path=url, value=l7rule_id)
rule = self.find(path=url, value=l7rule_id) return response
return rule
@correct_return_codes
def l7rule_set(self, l7rule_id, l7policy_id, **kwargs): def l7rule_set(self, l7rule_id, l7policy_id, **kwargs):
"""Update a l7rule's settings """Update a l7rule's settings
@ -468,10 +504,11 @@ class APIv2(api.BaseAPI):
A dict containing a list of health monitors A dict containing a list of health monitors
""" """
url = const.BASE_HEALTH_MONITOR_URL url = const.BASE_HEALTH_MONITOR_URL
policy_list = self.list(url, **kwargs) response = self.list(url, **kwargs)
return policy_list return response
@correct_return_codes
def health_monitor_create(self, **kwargs): def health_monitor_create(self, **kwargs):
"""Create a health monitor """Create a health monitor
@ -481,10 +518,11 @@ class APIv2(api.BaseAPI):
A dict of the created health monitor's settings A dict of the created health monitor's settings
""" """
url = const.BASE_HEALTH_MONITOR_URL url = const.BASE_HEALTH_MONITOR_URL
health_monitor = self.create(url, **kwargs) response = self.create(url, **kwargs)
return health_monitor return response
@correct_return_codes
def health_monitor_delete(self, health_monitor_id): def health_monitor_delete(self, health_monitor_id):
"""Delete a health_monitor """Delete a health_monitor
@ -508,10 +546,11 @@ class APIv2(api.BaseAPI):
Dict of the specified health monitor's settings Dict of the specified health monitor's settings
""" """
url = const.BASE_HEALTH_MONITOR_URL url = const.BASE_HEALTH_MONITOR_URL
health_monitor = self.find(path=url, value=health_monitor_id) response = self.find(path=url, value=health_monitor_id)
return health_monitor return response
@correct_return_codes
def health_monitor_set(self, health_monitor_id, **kwargs): def health_monitor_set(self, health_monitor_id, **kwargs):
"""Update a health monitor's settings """Update a health monitor's settings
@ -524,7 +563,20 @@ class APIv2(api.BaseAPI):
""" """
url = const.BASE_SINGLE_HEALTH_MONITOR_URL.format( url = const.BASE_SINGLE_HEALTH_MONITOR_URL.format(
uuid=health_monitor_id) uuid=health_monitor_id)
response = self.create(url, method='PUT', **kwargs) response = self.create(url, method='PUT', **kwargs)
return response return response
class OctaviaClientException(Exception):
"""The base exception class for all exceptions this library raises."""
def __init__(self, code, message=None, request_id=None):
self.code = code
self.message = message or self.__class__.message
self.request_id = request_id
def __str__(self):
return "%s (HTTP %s) (Request-ID: %s)" % (self.message,
self.code,
self.request_id)

View File

@ -107,6 +107,8 @@ class TestLoadBalancerv2(utils.TestCase):
class TestLoadBalancer(TestLoadBalancerv2): class TestLoadBalancer(TestLoadBalancerv2):
_error_message = ("Validation failure: Test message.")
def test_list_load_balancer_no_options(self): def test_list_load_balancer_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -137,6 +139,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.load_balancer_create(json=SINGLE_LB_RESP) ret = self.api.load_balancer_create(json=SINGLE_LB_RESP)
self.assertEqual(SINGLE_LB_RESP, ret) self.assertEqual(SINGLE_LB_RESP, ret)
def test_create_load_balancer_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'loadbalancers',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.load_balancer_create,
json=SINGLE_LB_RESP)
def test_set_load_balancer(self): def test_set_load_balancer(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -147,6 +161,19 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.load_balancer_set(FAKE_LB, json=SINGLE_LB_UPDATE) ret = self.api.load_balancer_set(FAKE_LB, json=SINGLE_LB_UPDATE)
self.assertEqual(SINGLE_LB_UPDATE, ret) self.assertEqual(SINGLE_LB_UPDATE, ret)
def test_set_load_balancer_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'loadbalancers/' + FAKE_LB,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.load_balancer_set,
FAKE_LB,
json=SINGLE_LB_UPDATE)
def test_delete_load_balancer(self): def test_delete_load_balancer(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -156,6 +183,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.load_balancer_delete(FAKE_LB) ret = self.api.load_balancer_delete(FAKE_LB)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_load_balancer_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'loadbalancers/' + FAKE_LB,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.load_balancer_delete,
FAKE_LB)
def test_list_listeners_no_options(self): def test_list_listeners_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -186,6 +225,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.listener_create(json=SINGLE_LI_RESP) ret = self.api.listener_create(json=SINGLE_LI_RESP)
self.assertEqual(SINGLE_LI_RESP, ret) self.assertEqual(SINGLE_LI_RESP, ret)
def test_create_listener_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'listeners',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.listener_create,
json=SINGLE_LI_RESP)
def test_set_listeners(self): def test_set_listeners(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -196,6 +247,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.listener_set(FAKE_LI, json=SINGLE_LI_UPDATE) ret = self.api.listener_set(FAKE_LI, json=SINGLE_LI_UPDATE)
self.assertEqual(SINGLE_LI_UPDATE, ret) self.assertEqual(SINGLE_LI_UPDATE, ret)
def test_set_listeners_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'listeners/' + FAKE_LI,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.listener_set,
FAKE_LI, json=SINGLE_LI_UPDATE)
def test_delete_listener(self): def test_delete_listener(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -205,6 +268,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.listener_delete(FAKE_LI) ret = self.api.listener_delete(FAKE_LI)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_listener_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'listeners/' + FAKE_LI,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.listener_delete,
FAKE_LI)
def test_list_pool_no_options(self): def test_list_pool_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -235,6 +310,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.pool_create(json=SINGLE_PO_RESP) ret = self.api.pool_create(json=SINGLE_PO_RESP)
self.assertEqual(SINGLE_PO_RESP, ret) self.assertEqual(SINGLE_PO_RESP, ret)
def test_create_pool_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'pools',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.pool_create,
json=SINGLE_PO_RESP)
def test_set_pool(self): def test_set_pool(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -245,6 +332,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.pool_set(FAKE_PO, json=SINGLE_PO_UPDATE) ret = self.api.pool_set(FAKE_PO, json=SINGLE_PO_UPDATE)
self.assertEqual(SINGLE_PO_UPDATE, ret) self.assertEqual(SINGLE_PO_UPDATE, ret)
def test_set_pool_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'pools/' + FAKE_PO,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.pool_set,
FAKE_PO, json=SINGLE_PO_UPDATE)
def test_delete_pool(self): def test_delete_pool(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -254,6 +353,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.pool_delete(FAKE_PO) ret = self.api.pool_delete(FAKE_PO)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_pool_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'pools/' + FAKE_PO,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.pool_delete,
FAKE_PO)
def test_list_member_no_options(self): def test_list_member_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -284,6 +395,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.member_create(json=SINGLE_ME_RESP, pool_id=FAKE_PO) ret = self.api.member_create(json=SINGLE_ME_RESP, pool_id=FAKE_PO)
self.assertEqual(SINGLE_ME_RESP, ret) self.assertEqual(SINGLE_ME_RESP, ret)
def test_create_member_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'pools/' + FAKE_PO + '/members',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.member_create,
json=SINGLE_ME_RESP, pool_id=FAKE_PO)
def test_set_member(self): def test_set_member(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -295,6 +418,19 @@ class TestLoadBalancer(TestLoadBalancerv2):
json=SINGLE_ME_UPDATE) json=SINGLE_ME_UPDATE)
self.assertEqual(SINGLE_ME_UPDATE, ret) self.assertEqual(SINGLE_ME_UPDATE, ret)
def test_set_member_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'pools/' + FAKE_PO + '/members/' + FAKE_ME,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.member_set,
pool_id=FAKE_PO, member_id=FAKE_ME,
json=SINGLE_ME_UPDATE)
def test_delete_member(self): def test_delete_member(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -304,6 +440,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.member_delete(pool_id=FAKE_PO, member_id=FAKE_ME) ret = self.api.member_delete(pool_id=FAKE_PO, member_id=FAKE_ME)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_member_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'pools/' + FAKE_PO + '/members/' + FAKE_ME,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.member_delete,
pool_id=FAKE_PO, member_id=FAKE_ME)
def test_list_l7policy_no_options(self): def test_list_l7policy_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -334,6 +482,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.l7policy_create(json=SINGLE_L7PO_RESP) ret = self.api.l7policy_create(json=SINGLE_L7PO_RESP)
self.assertEqual(SINGLE_L7PO_RESP, ret) self.assertEqual(SINGLE_L7PO_RESP, ret)
def test_create_l7policy_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'l7policies',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7policy_create,
json=SINGLE_L7PO_RESP)
def test_set_l7policy(self): def test_set_l7policy(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -344,6 +504,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.l7policy_set(FAKE_L7PO, json=SINGLE_L7PO_UPDATE) ret = self.api.l7policy_set(FAKE_L7PO, json=SINGLE_L7PO_UPDATE)
self.assertEqual(SINGLE_L7PO_UPDATE, ret) self.assertEqual(SINGLE_L7PO_UPDATE, ret)
def test_set_l7policy_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'l7policies/' + FAKE_L7PO,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7policy_set,
FAKE_L7PO, json=SINGLE_L7PO_UPDATE)
def test_delete_l7policy(self): def test_delete_l7policy(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -353,6 +525,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.l7policy_delete(FAKE_L7PO) ret = self.api.l7policy_delete(FAKE_L7PO)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_l7policy_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'l7policies/' + FAKE_L7PO,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7policy_delete,
FAKE_L7PO)
def test_list_l7rule_no_options(self): def test_list_l7rule_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -383,6 +567,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.l7rule_create(FAKE_L7PO, json=SINGLE_L7RU_RESP) ret = self.api.l7rule_create(FAKE_L7PO, json=SINGLE_L7RU_RESP)
self.assertEqual(SINGLE_L7RU_RESP, ret) self.assertEqual(SINGLE_L7RU_RESP, ret)
def test_create_l7rule_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'l7policies/' + FAKE_L7PO + '/rules',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7rule_create,
FAKE_L7PO, json=SINGLE_L7RU_RESP)
def test_set_l7rule(self): def test_set_l7rule(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -397,6 +593,20 @@ class TestLoadBalancer(TestLoadBalancerv2):
) )
self.assertEqual(SINGLE_L7RU_UPDATE, ret) self.assertEqual(SINGLE_L7RU_UPDATE, ret)
def test_set_l7rule_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'l7policies/' + FAKE_L7PO + '/rules/' + FAKE_L7RU,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7rule_set,
l7rule_id=FAKE_L7RU,
l7policy_id=FAKE_L7PO,
json=SINGLE_L7RU_UPDATE)
def test_delete_l7rule(self): def test_delete_l7rule(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -409,6 +619,19 @@ class TestLoadBalancer(TestLoadBalancerv2):
) )
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_l7rule_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'l7policies/' + FAKE_L7PO + '/rules/' + FAKE_L7RU,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.l7rule_delete,
l7rule_id=FAKE_L7RU,
l7policy_id=FAKE_L7PO)
def test_list_health_monitor_no_options(self): def test_list_health_monitor_no_options(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'GET', 'GET',
@ -439,6 +662,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.health_monitor_create(json=SINGLE_HM_RESP) ret = self.api.health_monitor_create(json=SINGLE_HM_RESP)
self.assertEqual(SINGLE_HM_RESP, ret) self.assertEqual(SINGLE_HM_RESP, ret)
def test_create_health_monitor_error(self):
self.requests_mock.register_uri(
'POST',
FAKE_URL + 'healthmonitors',
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.health_monitor_create,
json=SINGLE_HM_RESP)
def test_set_health_monitor(self): def test_set_health_monitor(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'PUT', 'PUT',
@ -449,6 +684,18 @@ class TestLoadBalancer(TestLoadBalancerv2):
ret = self.api.health_monitor_set(FAKE_HM, json=SINGLE_HM_UPDATE) ret = self.api.health_monitor_set(FAKE_HM, json=SINGLE_HM_UPDATE)
self.assertEqual(SINGLE_HM_UPDATE, ret) self.assertEqual(SINGLE_HM_UPDATE, ret)
def test_set_health_monitor_error(self):
self.requests_mock.register_uri(
'PUT',
FAKE_URL + 'healthmonitors/' + FAKE_HM,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.health_monitor_set,
FAKE_HM, json=SINGLE_HM_UPDATE)
def test_delete_health_monitor(self): def test_delete_health_monitor(self):
self.requests_mock.register_uri( self.requests_mock.register_uri(
'DELETE', 'DELETE',
@ -457,3 +704,15 @@ class TestLoadBalancer(TestLoadBalancerv2):
) )
ret = self.api.health_monitor_delete(FAKE_HM) ret = self.api.health_monitor_delete(FAKE_HM)
self.assertEqual(200, ret.status_code) self.assertEqual(200, ret.status_code)
def test_delete_health_monitor_error(self):
self.requests_mock.register_uri(
'DELETE',
FAKE_URL + 'healthmonitors/' + FAKE_HM,
text='{"faultstring": "%s"}' % self._error_message,
status_code=400
)
self.assertRaisesRegex(lb.OctaviaClientException,
self._error_message,
self.api.health_monitor_delete,
FAKE_HM)