def _allocations_to_remove(self, dates_before, dates_after, max_hosts, hypervisor_properties, resource_properties, allocs): allocs_to_remove = [] requested_host_ids = [host['id'] for host in self._filter_hosts_by_properties( hypervisor_properties, resource_properties)] for alloc in allocs: if alloc['compute_host_id'] not in requested_host_ids: allocs_to_remove.append(alloc) continue if (dates_before['start_date'] > dates_after['start_date'] or dates_before['end_date'] < dates_after['end_date']): reserved_periods = db_utils.get_reserved_periods( alloc['compute_host_id'], dates_after['start_date'], dates_after['end_date'], datetime.timedelta(seconds=1)) max_start = max(dates_before['start_date'], dates_after['start_date']) min_end = min(dates_before['end_date'], dates_after['end_date']) if not (len(reserved_periods) == 0 or (len(reserved_periods) == 1 and reserved_periods[0][0] == max_start and reserved_periods[0][1] == min_end)): allocs_to_remove.append(alloc) continue kept_hosts = len(allocs) - len(allocs_to_remove) if kept_hosts > max_hosts: allocs_to_remove.extend( [allocation for allocation in allocs if allocation not in allocs_to_remove ][:(kept_hosts - max_hosts)] ) return allocs_to_remove
def _allocations_to_remove(self, dates_before, dates_after, allocs, amount): """Find candidate floating IP allocations to remove.""" allocs_to_remove = [] for alloc in allocs: is_extension = ( dates_before['start_date'] > dates_after['start_date'] or dates_before['end_date'] < dates_after['end_date']) if is_extension: reserved_periods = db_utils.get_reserved_periods( alloc['floatingip_id'], dates_after['start_date'], dates_after['end_date'], datetime.timedelta(seconds=1), resource_type='floatingip') max_start = max(dates_before['start_date'], dates_after['start_date']) min_end = min(dates_before['end_date'], dates_after['end_date']) if not (len(reserved_periods) == 0 or (len(reserved_periods) == 1 and reserved_periods[0][0] == max_start and reserved_periods[0][1] == min_end)): allocs_to_remove.append(alloc) continue allocs_to_keep = [a for a in allocs if a not in allocs_to_remove] if len(allocs_to_keep) > amount: allocs_to_remove.extend( allocs_to_keep[:(len(allocs_to_keep) - amount)]) return allocs_to_remove