Add a reservation parameter to the lease_update command
Implements: blueprint update-reserved-capacity Depends-On: Ia990e126607657c8811fe92f23f6c30cc9889946 Change-Id: I617a335a49c8be35da610a49dc3642efae81dd27
This commit is contained in:
parent
5cb6ad8c2a
commit
57e0e5bd5c
|
@ -114,3 +114,62 @@ class CreateLeaseTestCase(tests.TestCase):
|
||||||
self.assertRaises(exception.DuplicatedLeaseParameters,
|
self.assertRaises(exception.DuplicatedLeaseParameters,
|
||||||
self.cl.args2body,
|
self.cl.args2body,
|
||||||
args)
|
args)
|
||||||
|
|
||||||
|
|
||||||
|
class UpdateLeaseTestCase(tests.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(UpdateLeaseTestCase, self).setUp()
|
||||||
|
self.cl = leases.UpdateLease(shell.BlazarShell(), mock.Mock())
|
||||||
|
|
||||||
|
def test_args2body_time_params(self):
|
||||||
|
args = argparse.Namespace(
|
||||||
|
name=None,
|
||||||
|
prolong_for='1h',
|
||||||
|
reduce_by=None,
|
||||||
|
end_date=None,
|
||||||
|
defer_by=None,
|
||||||
|
advance_by=None,
|
||||||
|
start_date=None,
|
||||||
|
reservation=None
|
||||||
|
)
|
||||||
|
expected = {
|
||||||
|
'prolong_for': '1h',
|
||||||
|
}
|
||||||
|
|
||||||
|
self.assertDictEqual(self.cl.args2body(args), expected)
|
||||||
|
|
||||||
|
def test_args2body_reservation_params(self):
|
||||||
|
args = argparse.Namespace(
|
||||||
|
name=None,
|
||||||
|
prolong_for=None,
|
||||||
|
reduce_by=None,
|
||||||
|
end_date=None,
|
||||||
|
defer_by=None,
|
||||||
|
advance_by=None,
|
||||||
|
start_date=None,
|
||||||
|
reservation=[
|
||||||
|
'id=798379a6-194c-45dc-ba34-1b5171d5552f,'
|
||||||
|
'max=3,'
|
||||||
|
'hypervisor_properties='
|
||||||
|
'["and", [">=", "$vcpus", "4"], '
|
||||||
|
'[">=", "$memory_mb", "8192"]],'
|
||||||
|
'resource_properties='
|
||||||
|
'["==", "$extra_key", "extra_value"]'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
expected = {
|
||||||
|
'reservations': [
|
||||||
|
{
|
||||||
|
'id': '798379a6-194c-45dc-ba34-1b5171d5552f',
|
||||||
|
'max': 3,
|
||||||
|
'hypervisor_properties':
|
||||||
|
'["and", [">=", "$vcpus", "4"], '
|
||||||
|
'[">=", "$memory_mb", "8192"]]',
|
||||||
|
'resource_properties':
|
||||||
|
'["==", "$extra_key", "extra_value"]'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
self.assertDictEqual(self.cl.args2body(args), expected)
|
||||||
|
|
|
@ -38,7 +38,8 @@ class LeaseClientManager(base.BaseClientManager):
|
||||||
return self._get('/leases/%s' % lease_id, 'lease')
|
return self._get('/leases/%s' % lease_id, 'lease')
|
||||||
|
|
||||||
def update(self, lease_id, name=None, prolong_for=None, reduce_by=None,
|
def update(self, lease_id, name=None, prolong_for=None, reduce_by=None,
|
||||||
end_date=None, advance_by=None, defer_by=None, start_date=None):
|
end_date=None, advance_by=None, defer_by=None, start_date=None,
|
||||||
|
reservations=None):
|
||||||
"""Update attributes of the lease."""
|
"""Update attributes of the lease."""
|
||||||
values = {}
|
values = {}
|
||||||
if name:
|
if name:
|
||||||
|
@ -72,6 +73,9 @@ class LeaseClientManager(base.BaseClientManager):
|
||||||
lease_start_date_change,
|
lease_start_date_change,
|
||||||
defer_by is not None)
|
defer_by is not None)
|
||||||
|
|
||||||
|
if reservations:
|
||||||
|
values['reservations'] = reservations
|
||||||
|
|
||||||
if not values:
|
if not values:
|
||||||
return _('No values to update passed.')
|
return _('No values to update passed.')
|
||||||
return self._update('/leases/%s' % lease_id, values,
|
return self._update('/leases/%s' % lease_id, values,
|
||||||
|
|
|
@ -286,6 +286,14 @@ class UpdateLease(command.UpdateCommand):
|
||||||
help='New name for the lease',
|
help='New name for the lease',
|
||||||
default=None
|
default=None
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--reservation',
|
||||||
|
metavar="<key=value>",
|
||||||
|
action='append',
|
||||||
|
help='Reservation values to update. The reservation must be '
|
||||||
|
'selected with the id=<reservation-id> key-value pair.',
|
||||||
|
default=None)
|
||||||
|
|
||||||
#prolong-for and reduce_by are mutually exclusive
|
#prolong-for and reduce_by are mutually exclusive
|
||||||
group = parser.add_mutually_exclusive_group()
|
group = parser.add_mutually_exclusive_group()
|
||||||
group.add_argument(
|
group.add_argument(
|
||||||
|
@ -343,6 +351,44 @@ class UpdateLease(command.UpdateCommand):
|
||||||
params['advance_by'] = parsed_args.advance_by
|
params['advance_by'] = parsed_args.advance_by
|
||||||
if parsed_args.start_date:
|
if parsed_args.start_date:
|
||||||
params['start_date'] = parsed_args.start_date
|
params['start_date'] = parsed_args.start_date
|
||||||
|
if parsed_args.reservation:
|
||||||
|
keys = [
|
||||||
|
# General keys
|
||||||
|
'id',
|
||||||
|
# Keys for host reservation
|
||||||
|
'min', 'max', 'hypervisor_properties', 'resource_properties',
|
||||||
|
# Keys for instance reservation (update of instance reservation
|
||||||
|
# is NOT yet supported)
|
||||||
|
]
|
||||||
|
params['reservations'] = []
|
||||||
|
reservations = []
|
||||||
|
for res_str in parsed_args.reservation:
|
||||||
|
err_msg = ("Invalid reservation argument '%s'. "
|
||||||
|
"Reservation arguments must be of the form "
|
||||||
|
"--reservation <key=value>" % res_str)
|
||||||
|
res_info = {}
|
||||||
|
prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % '|'.join(keys))
|
||||||
|
|
||||||
|
def parse_params(params):
|
||||||
|
match = prog.search(params)
|
||||||
|
if match:
|
||||||
|
k, v = match.group(2, 3)
|
||||||
|
if strutils.is_int_like(v):
|
||||||
|
v = int(v)
|
||||||
|
res_info[k] = v
|
||||||
|
if match.group(1) is not None:
|
||||||
|
parse_params(match.group(1))
|
||||||
|
|
||||||
|
parse_params(res_str)
|
||||||
|
if res_info:
|
||||||
|
if 'id' not in res_info:
|
||||||
|
raise exception.IncorrectLease(
|
||||||
|
'The key-value pair id=<reservation_id> is '
|
||||||
|
'required for the --reservation argument')
|
||||||
|
reservations.append(res_info)
|
||||||
|
if not reservations:
|
||||||
|
raise exception.IncorrectLease(err_msg)
|
||||||
|
params['reservations'] = reservations
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue