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
This commit is contained in:
Masahito Muroi 2017-09-15 16:12:43 -06:00
parent 65a4088b71
commit f412be7f20
2 changed files with 56 additions and 6 deletions

View File

@ -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']

View File

@ -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)