diff --git a/neat/globals/manager.py b/neat/globals/manager.py index 1fb12ea..d6ab569 100644 --- a/neat/globals/manager.py +++ b/neat/globals/manager.py @@ -92,9 +92,8 @@ ERRORS = { 'specified in the configuration file', 405: 'Method not allowed: the request is made with ' + 'a method other than the only supported PUT', - 422: 'Unprocessable entity: one or more VMs could not ' + - 'be found using the list of UUIDs specified in ' + - 'the vm_uuids parameter'} + 412: 'Precondition failed: some VMs possibly have been in ' + + 'migration when the request has been sent - retry'} @contract @@ -136,9 +135,13 @@ def validate_params(user, password, params): return False if 'reason' not in params or \ params['reason'] == 1 and 'vm_uuids' not in params or \ - params['reason'] == 0 and 'host' not in params: + params['reason'] == 0 and 'host' not in params or \ + 'time' not in params: raise_error(400) return False + if params['time'] + 5 < time.time(): + raise_error(412) + return False log.debug('Request parameters validated') return True @@ -176,6 +179,8 @@ def get_params(request): :rtype: dict(str: *) """ params = dict(request.forms) + if 'time' in params: + params['time'] = float(params['time']) if 'reason' in params: params['reason'] = int(params['reason']) if 'vm_uuids' in params: diff --git a/tests/globals/test_manager.py b/tests/globals/test_manager.py index 7614f65..843c861 100644 --- a/tests/globals/test_manager.py +++ b/tests/globals/test_manager.py @@ -18,6 +18,7 @@ from pyqcy import * import bottle from hashlib import sha1 from novaclient.v1_1 import client +import time import neat.globals.manager as manager import neat.common as common @@ -29,7 +30,7 @@ logging.disable(logging.CRITICAL) class GlobalManager(TestCase): def test_raise_error(self): - for error_code in [400, 401, 403, 405, 422]: + for error_code in [400, 401, 403, 405, 412]: try: manager.raise_error(error_code) except bottle.HTTPResponse as e: @@ -80,6 +81,7 @@ class GlobalManager(TestCase): sha1('test2').hexdigest(), {'username': sha1('test1').hexdigest(), 'password': sha1('test2').hexdigest(), + 'time': time.time(), 'reason': 1, 'vm_uuids': ['qwe', 'asd']}) @@ -88,27 +90,63 @@ class GlobalManager(TestCase): sha1('test2').hexdigest(), {'username': sha1('test1').hexdigest(), 'password': sha1('test2').hexdigest(), + 'time': time.time(), 'reason': 0, 'host': 'test'}) with MockTransaction: - expect(manager).raise_error(400).exactly(5).times() - manager.validate_params('test', 'test', {'username': 'test', - 'password': 'test'}) + expect(manager).raise_error(400).exactly(6).times() manager.validate_params('test', 'test', {'username': 'test', 'password': 'test', + 'time': time.time()}) + manager.validate_params('test', 'test', {'username': 'test', + 'password': 'test', + 'time': time.time(), 'reason': 1}) manager.validate_params('test', 'test', {'username': 'test', 'password': 'test', + 'time': time.time(), 'reason': 0}) manager.validate_params('test', 'test', {'username': 'test', 'password': 'test', + 'time': time.time(), 'reason': 1, 'host': 'test'}) manager.validate_params('test', 'test', {'username': 'test', 'password': 'test', + 'time': time.time(), 'reason': 0, 'vm_uuids': []}) + manager.validate_params('test', 'test', {'username': 'test', + 'password': 'test', + 'reason': 0, + 'vm_uuids': []}) + + with MockTransaction: + expect(manager).raise_error(412).exactly(2).times() + manager.validate_params('test', 'test', {'username': 'test', + 'password': 'test', + 'time': 1., + 'reason': 0, + 'host': 'test'}) + manager.validate_params('test', 'test', {'username': 'test', + 'password': 'test', + 'time': time.time() - 6, + 'reason': 0, + 'host': 'test'}) + assert manager.validate_params('test', 'test', + {'username': 'test', + 'password': 'test', + 'time': time.time(), + 'reason': 0, + 'host': 'test'}) + assert manager.validate_params('test', 'test', + {'username': 'test', + 'password': 'test', + 'time': time.time() - 4, + 'reason': 0, + 'host': 'test'}) + def test_start(self): with MockTransaction: