From f412be7f206afd5a1d9f665dbdd19ecc257e706e Mon Sep 17 00:00:00 2001 From: Masahito Muroi Date: Fri, 15 Sep 2017 16:12:43 -0600 Subject: [PATCH] Add a validation to create lease API The create lease API doesn't check request body has required parameters or not. If a request doesn't have required parameters, the API returns 500 Internal Server. This patch adds a validation method to check whether a request body has required parameters, start_time, end_time and lease name. Change-Id: Ibde14d3821b858db962228bf90294efb821cc462 Closes-Bug: #1710809 --- blazar/manager/service.py | 12 ++++++- blazar/tests/manager/test_service.py | 50 +++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/blazar/manager/service.py b/blazar/manager/service.py index 4ac164e6..e1b984d9 100644 --- a/blazar/manager/service.py +++ b/blazar/manager/service.py @@ -164,9 +164,15 @@ class ManagerService(service_utils.RPCServer): except ValueError: raise exceptions.InvalidDate(date=date_string, date_format=date_format) - return date + def validate_params(self, values, required_params): + if isinstance(required_params, list): + required_params = set(required_params) + missing_attr = required_params - set(values.keys()) + if missing_attr: + raise exceptions.MissingParameter(param=', '.join(missing_attr)) + def get_lease(self, lease_id): return db_api.lease_get(lease_id) @@ -183,9 +189,13 @@ class ManagerService(service_utils.RPCServer): except KeyError: raise exceptions.MissingTrustId() + self.validate_params(lease_values, ['name', 'start_date', 'end_date']) + # Remove and keep event and reservation values events = lease_values.pop("events", []) reservations = lease_values.pop("reservations", []) + for res in reservations: + self.validate_params(res, ['resource_type']) # Create the lease without the reservations start_date = lease_values['start_date'] diff --git a/blazar/tests/manager/test_service.py b/blazar/tests/manager/test_service.py index ef2e601f..a99dc6aa 100644 --- a/blazar/tests/manager/test_service.py +++ b/blazar/tests/manager/test_service.py @@ -268,6 +268,7 @@ class ServiceTestCase(tests.TestCase): trust_id = 'exxee111qwwwwe' lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -291,6 +292,7 @@ class ServiceTestCase(tests.TestCase): trust_id = 'exxee111qwwwwe' lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -310,6 +312,7 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_validate_created_events(self): lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -353,6 +356,7 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_before_end_event_is_before_lease_start(self): lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -395,6 +399,7 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_before_end_event_before_start_without_lease_id(self): lease_values = { + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -418,6 +423,7 @@ class ServiceTestCase(tests.TestCase): start_date = '2026-11-13 13:13' lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -435,6 +441,7 @@ class ServiceTestCase(tests.TestCase): before_end_date = '2026-11-15 13:13' lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -451,6 +458,7 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_no_before_end_event(self): lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -489,6 +497,7 @@ class ServiceTestCase(tests.TestCase): before_end_date = '2026-11-14 10:13' lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'virtual:instance', @@ -530,7 +539,8 @@ class ServiceTestCase(tests.TestCase): self.assertEqual('UNDONE', event['status']) def test_create_lease_wrong_date(self): - lease_values = {'start_date': '2025-13-35 13:13', + lease_values = {'name': 'lease-name', + 'start_date': '2025-13-35 13:13', 'end_date': '2025-12-31 13:13', 'trust_id': 'exxee111qwwwwe'} @@ -539,16 +549,19 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_wrong_format_before_end_date(self): before_end_date = '2026-14 10:13' - lease_values = {'start_date': '2026-11-13 13:13', - 'end_date': '2026-11-14 13:13', - 'before_end_date': before_end_date, - 'trust_id': 'exxee111qwwwwe'} + lease_values = { + 'name': 'lease-name', + 'start_date': '2026-11-13 13:13', + 'end_date': '2026-11-14 13:13', + 'before_end_date': before_end_date, + 'trust_id': 'exxee111qwwwwe'} self.assertRaises( manager_ex.InvalidDate, self.manager.create_lease, lease_values) def test_create_lease_start_date_in_past(self): lease_values = { + 'name': 'lease-name', 'start_date': datetime.datetime.strftime( datetime.datetime.utcnow() - datetime.timedelta(days=1), @@ -562,6 +575,7 @@ class ServiceTestCase(tests.TestCase): def test_create_lease_unsupported_resource_type(self): lease_values = { 'id': self.lease_id, + 'name': 'lease-name', 'reservations': [{'id': '111', 'resource_id': '111', 'resource_type': 'unsupported:type', @@ -594,6 +608,32 @@ class ServiceTestCase(tests.TestCase): self.assertRaises(manager_ex.MissingTrustId, self.manager.create_lease, lease_values) + def test_create_lease_without_required_params(self): + name_missing_values = { + 'start_date': '2026-11-13 13:13', + 'end_date': '2026-12-13 13:13', + 'trust_id': 'trust1'} + start_missing_values = { + 'name': 'name', + 'end_date': '2026-12-13 13:13', + 'trust_id': 'trust1'} + end_missing_values = { + 'name': 'name', + 'start_date': '2026-11-13 13:13', + 'trust_id': 'trust1'} + resource_type_missing_value = { + 'name': 'name', + 'start_date': '2026-11-13 13:13', + 'end_date': '2026-12-13 13:13', + 'reservations': [{'min': 1, 'max': 3}], + 'trust_id': 'trust1' + } + + for value in [name_missing_values, start_missing_values, + end_missing_values, resource_type_missing_value]: + self.assertRaises(manager_ex.MissingParameter, + self.manager.create_lease, value) + def test_update_lease_completed_lease_rename(self): lease_values = {'name': 'renamed'} target = datetime.datetime(2015, 1, 1)