def sync_network_states(network_vlan_ranges): """Synchronize network_states table with current configured VLAN ranges.""" session = db.get_session() with session.begin(): # get existing allocations for all physical networks allocations = dict() states = (session.query(l2network_models_v2.NetworkState).all()) for state in states: if state.physical_network not in allocations: allocations[state.physical_network] = set() allocations[state.physical_network].add(state) # process vlan ranges for each configured physical network for physical_network, vlan_ranges in network_vlan_ranges.iteritems(): # determine current configured allocatable vlans for this # physical network vlan_ids = set() for vlan_range in vlan_ranges: vlan_ids |= set(xrange(vlan_range[0], vlan_range[1] + 1)) # remove from table unallocated vlans not currently allocatable if physical_network in allocations: for state in allocations[physical_network]: try: # see if vlan is allocatable vlan_ids.remove(state.vlan_id) except KeyError: # it's not allocatable, so check if its allocated if not state.allocated: # it's not, so remove it from table LOG.debug( _("Removing vlan %(vlan_id)s on " "physical network %(physical_network)s" " from pool"), { 'vlan_id': state.vlan_id, 'physical_network': physical_network }) session.delete(state) del allocations[physical_network] # add missing allocatable vlans to table for vlan_id in sorted(vlan_ids): state = l2network_models_v2.NetworkState( physical_network, vlan_id) session.add(state) # remove from table unallocated vlans for any unconfigured physical # networks for states in allocations.itervalues(): for state in states: if not state.allocated: LOG.debug( _("Removing vlan %(vlan_id)s on physical " "network %(physical_network)s" " from pool"), { 'vlan_id': state.vlan_id, 'physical_network': physical_network }) session.delete(state)
def reserve_specific_network(session, physical_network, vlan_id): with session.begin(subtransactions=True): try: state = (session.query(l2network_models_v2.NetworkState).filter_by( physical_network=physical_network, vlan_id=vlan_id).with_lockmode('update').one()) if state.allocated: if vlan_id == constants.FLAT_VLAN_ID: raise n_exc.FlatNetworkInUse( physical_network=physical_network) else: raise n_exc.VlanIdInUse(vlan_id=vlan_id, physical_network=physical_network) LOG.debug( _("Reserving specific vlan %(vlan_id)s on physical " "network %(physical_network)s from pool"), { 'vlan_id': vlan_id, 'physical_network': physical_network }) state.allocated = True except exc.NoResultFound: LOG.debug( _("Reserving specific vlan %(vlan_id)s on physical " "network %(physical_network)s outside pool"), { 'vlan_id': vlan_id, 'physical_network': physical_network }) state = l2network_models_v2.NetworkState(physical_network, vlan_id) state.allocated = True session.add(state)