diff --git a/blazarclient/tests/v1/shell_commands/test_leases.py b/blazarclient/tests/v1/shell_commands/test_leases.py index 2ba7a06..a623445 100644 --- a/blazarclient/tests/v1/shell_commands/test_leases.py +++ b/blazarclient/tests/v1/shell_commands/test_leases.py @@ -32,6 +32,7 @@ class CreateLeaseTestCase(tests.TestCase): args = argparse.Namespace( start='2020-07-24 20:00', end='2020-08-09 22:30', + before_end='2020-08-09 21:30', events=[], name='lease-test', reservations=[], @@ -42,12 +43,14 @@ class CreateLeaseTestCase(tests.TestCase): '["and", [">=", "$vcpus", "2"], ' '[">=", "$memory_mb", "2048"]],' 'resource_properties=' - '["==", "$extra_key", "extra_value"]' + '["==", "$extra_key", "extra_value"],' + 'before_end=default' ] ) expected = { 'start': '2020-07-24 20:00', 'end': '2020-08-09 22:30', + 'before_end': '2020-08-09 21:30', 'events': [], 'name': 'lease-test', 'reservations': [ @@ -59,7 +62,8 @@ class CreateLeaseTestCase(tests.TestCase): '[">=", "$memory_mb", "2048"]]', 'resource_properties': '["==", "$extra_key", "extra_value"]', - 'resource_type': 'physical:host' + 'resource_type': 'physical:host', + 'before_end': 'default' } ] } @@ -69,6 +73,7 @@ class CreateLeaseTestCase(tests.TestCase): args = argparse.Namespace( start='2020-07-24 20:00', end='2020-08-09 22:30', + before_end='2020-08-09 21:30', events=[], name='lease-test', reservations=[], @@ -91,6 +96,7 @@ class CreateLeaseTestCase(tests.TestCase): args = argparse.Namespace( start='2020-07-24 20:00', end='2020-08-09 22:30', + before_end='2020-08-09 21:30', events=[], name='lease-test', reservations=[], diff --git a/blazarclient/v1/leases.py b/blazarclient/v1/leases.py index 458dc68..bae58a6 100644 --- a/blazarclient/v1/leases.py +++ b/blazarclient/v1/leases.py @@ -23,10 +23,11 @@ from blazarclient import utils class LeaseClientManager(base.BaseClientManager): """Manager for the lease connected requests.""" - def create(self, name, start, end, reservations, events): + def create(self, name, start, end, reservations, events, before_end=None): """Creates lease from values passed.""" values = {'name': name, 'start_date': start, 'end_date': end, - 'reservations': reservations, 'events': events} + 'reservations': reservations, 'events': events, + 'before_end_date': before_end} return self._create('/leases', values, 'lease') diff --git a/blazarclient/v1/shell_commands/leases.py b/blazarclient/v1/shell_commands/leases.py index 8aa2336..fe7346c 100644 --- a/blazarclient/v1/shell_commands/leases.py +++ b/blazarclient/v1/shell_commands/leases.py @@ -74,10 +74,17 @@ class CreateLease(command.CreateCommand): '(default: 24h later)', default=self.default_end ) + parser.add_argument( + '--before-end-date', + dest='before_end', + help='Time (YYYY-MM-DD HH:MM) UTC TZ for taking an action before ' + 'the end of the lease (default: depends on system default)', + default=None + ) parser.add_argument( '--physical-reservation', metavar="", + "resource_properties=str,before_end=str>", action='append', dest='physical_reservations', help='Create a reservation for physical compute hosts. ' @@ -86,7 +93,8 @@ class CreateLease(command.CreateCommand): 'min: minimum number of hosts to reserve. ' 'max: maximum number of hosts to reserve. ' 'hypervisor_properties: JSON string, see doc. ' - 'resource_properties: JSON string, see doc. ', + 'resource_properties: JSON string, see doc. ' + 'before_end: JSON string, see doc. ', default=[] ) parser.add_argument( @@ -129,6 +137,19 @@ class CreateLease(command.CreateCommand): raise exception.IncorrectLease if parsed_args.start > parsed_args.end: raise exception.IncorrectLease + + if parsed_args.before_end: + try: + parsed_args.before_end = datetime.datetime.strptime( + parsed_args.before_end, '%Y-%m-%d %H:%M') + except ValueError: + raise exception.IncorrectLease + if (parsed_args.before_end < parsed_args.start + or parsed_args.end < parsed_args.before_end): + raise exception.IncorrectLease + params['before_end'] = datetime.datetime.strftime( + parsed_args.before_end, '%Y-%m-%d %H:%M') + params['start'] = datetime.datetime.strftime(parsed_args.start, '%Y-%m-%d %H:%M') params['end'] = datetime.datetime.strftime(parsed_args.end, @@ -142,10 +163,11 @@ class CreateLease(command.CreateCommand): err_msg = ("Invalid physical-reservation argument '%s'. " "Reservation arguments must be of the " "form --physical-reservation " + "hypervisor_properties=str,resource_properties=str," + "before_end=str>" % phys_res_str) phys_res_info = {"min": "", "max": "", "hypervisor_properties": "", - "resource_properties": ""} + "resource_properties": "", "before_end": None} prog = re.compile('^(?:(.*),)?(%s)=(.*)$' % "|".join(phys_res_info.keys())) @@ -188,6 +210,8 @@ class CreateLease(command.CreateCommand): % phys_res_str) raise exception.IncorrectLease(err_msg) + if phys_res_info['before_end'] is None: + phys_res_info.pop('before_end') # NOTE(sbauza): The resource type should be conf-driven mapped with # blazar.conf file but that's potentially on another # host