def _matching_fips(self, network_id, fip_addresses, amount, start_date, end_date): filter_array = [] start_date_with_margin = start_date - datetime.timedelta( minutes=CONF.cleaning_time) end_date_with_margin = end_date + datetime.timedelta( minutes=CONF.cleaning_time) fip_query = ["==", "$floating_network_id", network_id] filter_array = plugins_utils.convert_requirements(fip_query) fip_ids = [] not_allocated_fip_ids = [] allocated_fip_ids = [] for fip in db_api.reservable_fip_get_all_by_queries(filter_array): if not db_api.fip_allocation_get_all_by_values( floatingip_id=fip['id']): if fip['floating_ip_address'] in fip_addresses: fip_ids.append(fip['id']) else: not_allocated_fip_ids.append(fip['id']) elif db_utils.get_free_periods( fip['id'], start_date_with_margin, end_date_with_margin, end_date_with_margin - start_date_with_margin, resource_type='floatingip' ) == [ (start_date_with_margin, end_date_with_margin), ]: if fip['floating_ip_address'] in fip_addresses: fip_ids.append(fip['id']) else: allocated_fip_ids.append(fip['id']) if len(fip_ids) != len(fip_addresses): raise manager_ex.NotEnoughFloatingIPAvailable() fip_ids += not_allocated_fip_ids if len(fip_ids) >= amount: return fip_ids[:amount] fip_ids += allocated_fip_ids if len(fip_ids) >= amount: return fip_ids[:amount] raise manager_ex.NotEnoughFloatingIPAvailable()
def _matching_hosts(self, hypervisor_properties, resource_properties, count_range, start_date, end_date): """Return the matching hosts (preferably not allocated) """ count_range = count_range.split('-') min_host = count_range[0] max_host = count_range[1] allocated_host_ids = [] not_allocated_host_ids = [] filter_array = [] start_date_with_margin = start_date - datetime.timedelta( minutes=CONF.cleaning_time) end_date_with_margin = end_date + datetime.timedelta( minutes=CONF.cleaning_time) # TODO(frossigneux) support "or" operator if hypervisor_properties: filter_array = plugins_utils.convert_requirements( hypervisor_properties) if resource_properties: filter_array += plugins_utils.convert_requirements( resource_properties) for host in db_api.reservable_host_get_all_by_queries(filter_array): if not db_api.host_allocation_get_all_by_values( compute_host_id=host['id']): not_allocated_host_ids.append(host['id']) elif db_utils.get_free_periods( host['id'], start_date_with_margin, end_date_with_margin, end_date_with_margin - start_date_with_margin ) == [ (start_date_with_margin, end_date_with_margin), ]: allocated_host_ids.append(host['id']) if len(not_allocated_host_ids) >= int(min_host): return not_allocated_host_ids[:int(max_host)] all_host_ids = allocated_host_ids + not_allocated_host_ids if len(all_host_ids) >= int(min_host): return all_host_ids[:int(max_host)] else: return []