def heal_reservations(self, failed_resources, interval_begin, interval_end): """Heal reservations which suffer from resource failures. :param failed_resources: failed resources :param interval_begin: start date of the period to heal. :param interval_end: end date of the period to heal. :return: a dictionary of {reservation id: flags to update} e.g. {'de27786d-bd96-46bb-8363-19c13b2c6657': {'missing_resources': True}} """ reservation_flags = collections.defaultdict(dict) host_ids = [h['id'] for h in failed_resources] reservations = db_utils.get_reservations_by_host_ids( host_ids, interval_begin, interval_end) for reservation in reservations: if reservation['resource_type'] != plugin.RESOURCE_TYPE: continue if self._heal_reservation(reservation, host_ids): if reservation['status'] == status.reservation.ACTIVE: reservation_flags[reservation['id']].update( {'resources_changed': True}) else: reservation_flags[reservation['id']].update( {'missing_resources': True}) return reservation_flags
def heal_reservations(self, failed_resources, interval_begin, interval_end): """Heal reservations which suffer from resource failures. :param: failed_resources: failed resources :param: interval_begin: start date of the period to heal. :param: interval_end: end date of the period to heal. :return: a dictionary of {reservation id: flags to update} e.g. {'de27786d-bd96-46bb-8363-19c13b2c6657': {'missing_resources': True}} """ reservation_flags = {} host_ids = [h['id'] for h in failed_resources] reservations = db_utils.get_reservations_by_host_ids(host_ids, interval_begin, interval_end) for reservation in reservations: if reservation['resource_type'] != plugin.RESOURCE_TYPE: continue for allocation in [alloc for alloc in reservation['computehost_allocations'] if alloc['compute_host_id'] in host_ids]: if self._reallocate(allocation): if reservation['status'] == status.reservation.ACTIVE: if reservation['id'] not in reservation_flags: reservation_flags[reservation['id']] = {} reservation_flags[reservation['id']].update( {'resources_changed': True}) else: if reservation['id'] not in reservation_flags: reservation_flags[reservation['id']] = {} reservation_flags[reservation['id']].update( {'missing_resources': True}) return reservation_flags