diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/resource_assigner.py b/SAS/ResourceAssignment/ResourceAssigner/lib/resource_assigner.py index 7349f0e12aa9b70ff43994d759cc25952ad45a2e..9f0a17c347b6d6c7e273e26d33e6a83435e00b80 100755 --- a/SAS/ResourceAssignment/ResourceAssigner/lib/resource_assigner.py +++ b/SAS/ResourceAssignment/ResourceAssigner/lib/resource_assigner.py @@ -45,8 +45,7 @@ from lofar.sas.resourceassignment.resourceassigner.config import DEFAULT_RA_NOTI from lofar.sas.resourceassignment.resourceassigner.config import DEFAULT_RA_NOTIFICATION_PREFIX from lofar.sas.resourceassignment.resourceassigner.resource_availability_checker import ResourceAvailabilityChecker -from lofar.sas.resourceassignment.resourceassigner.schedulers import DwellScheduler -from lofar.sas.resourceassignment.resourceassigner.schedulers import PriorityScheduler +from lofar.sas.resourceassignment.resourceassigner.schedulers import BasicScheduler, DwellScheduler, PriorityScheduler from lofar.mom.momqueryservice.momqueryrpc import MoMQueryRPC from lofar.mom.momqueryservice.config import DEFAULT_MOMQUERY_BUSNAME, DEFAULT_MOMQUERY_SERVICENAME @@ -279,36 +278,44 @@ class ResourceAssigner(object): :returns: True if successful, or False otherwise """ logger.info("Received good estimates, scheduling resources for task %i", spec.radb_id) - if spec.isTriggered(): - min_starttime, max_starttime, duration = spec.calculate_dwell_values(spec.starttime, spec.duration, - spec.min_starttime, spec.max_endtime) - scheduler = DwellScheduler(task_id=spec.radb_id, - specification_tree=specification_tree, - resource_estimator=self._get_resource_estimates, - resource_availability_checker=self.resource_availability_checker, - radbcreds=self.radb_creds, - min_starttime=min_starttime, - max_starttime=max_starttime, - duration=duration) - else: - scheduler = PriorityScheduler(task_id=spec.radb_id, - specification_tree=specification_tree, - resource_estimator=self._get_resource_estimates, - resource_availability_checker=self.resource_availability_checker, - radbcreds=self.radb_creds) - try: - result = scheduler.allocate_resources() + if spec.isTriggered(): + min_starttime, max_starttime, duration = spec.calculate_dwell_values(spec.starttime, spec.duration, + spec.min_starttime, spec.max_endtime) + scheduler = DwellScheduler(task_id=spec.radb_id, + specification_tree=specification_tree, + resource_estimator=self._get_resource_estimates, + resource_availability_checker=self.resource_availability_checker, + radbcreds=self.radb_creds, + min_starttime=min_starttime, + max_starttime=max_starttime, + duration=duration) + else: + scheduler = PriorityScheduler(task_id=spec.radb_id, + specification_tree=specification_tree, + resource_estimator=self._get_resource_estimates, + resource_availability_checker=self.resource_availability_checker, + radbcreds=self.radb_creds) except Exception as e: - logger.error('Error in calling scheduler.allocate_resources: %s', e) - result = False + logger.exception('Error in scheduler._schedule_resources: %s', e) + return False - if result: - logger.info('Resources successfully allocated task_id=%s' % spec.radb_id) - else: - logger.info('No resources allocated task_id=%s' % spec.radb_id) + try: + if not scheduler.allocate_resources(): + # try again with basic scheduler to end up with a situation with the 'normal' conflicting resources, which can then be evaluated by users + scheduler = BasicScheduler(task_id=spec.radb_id, + specification_tree=specification_tree, + resource_estimator=self._get_resource_estimates, + resource_availability_checker=self.resource_availability_checker, + radbcreds=self.radb_creds) + + return scheduler.allocate_resources() + except Exception as e: + logger.exception('Error in calling scheduler.allocate_resources: %s', e) + return False - return result + logger.info('Resources successfully allocated task_id=%s' % spec.radb_id) + return True def _cleanup_earlier_generated_data(self, otdb_id, spec): """