use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool in project netvirt by opendaylight.
the class NatOverVxlanUtil method validateAndCreateVxlanVniPool.
public static void validateAndCreateVxlanVniPool(DataBroker broker, INeutronVpnManager neutronvpnManager, IdManagerService idManager, String poolName) {
/*
* 1. If a NatPool doesn't exist create it. 2. If a NatPool exists, but
* the range value is changed incorrectly (say some allocations exist in
* the old range), we should NOT honor the new range . Throw the WARN
* but continue running NAT Service with Old range. 3. If a NatPool
* exists, but the given range is wider than the earlier one, we should
* attempt to allocate with the new range again(TODO)
*/
long lowLimit = NatConstants.VNI_DEFAULT_LOW_VALUE;
long highLimit = NatConstants.VNI_DEFAULT_HIGH_VALUE;
String configureVniRange = neutronvpnManager.getOpenDaylightVniRangesConfig();
if (configureVniRange != null) {
String[] configureVniRangeSplit = configureVniRange.split(":");
lowLimit = Long.parseLong(configureVniRangeSplit[0]);
highLimit = Long.parseLong(configureVniRangeSplit[1]);
}
Optional<IdPool> existingIdPool = SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, LogicalDatastoreType.CONFIGURATION, getIdPoolInstance(poolName));
if (existingIdPool.isPresent()) {
IdPool odlVniIdPool = existingIdPool.get();
long currentStartLimit = odlVniIdPool.getAvailableIdsHolder().getStart();
long currentEndLimit = odlVniIdPool.getAvailableIdsHolder().getEnd();
if (lowLimit == currentStartLimit && highLimit == currentEndLimit) {
LOG.debug("validateAndCreateVxlanVniPool : OpenDaylight VXLAN VNI range pool already exists " + "with configured Range");
} else {
if (odlVniIdPool.getIdEntries() != null && odlVniIdPool.getIdEntries().size() != 0) {
LOG.warn("validateAndCreateVxlanVniPool : Some Allocation already exists with old Range. " + "Cannot modify existing limit of OpenDaylight VXLAN VNI range pool");
} else {
LOG.debug("validateAndCreateVxlanVniPool : No VNI's allocated from OpenDaylight VXLAN VNI range " + "pool. Delete and re-create pool with new configured Range {}-{}", lowLimit, highLimit);
deleteOpenDaylightVniRangesPool(idManager, poolName);
createOpenDaylightVniRangesPool(idManager, poolName, lowLimit, highLimit);
}
}
} else {
createOpenDaylightVniRangesPool(idManager, poolName, lowLimit, highLimit);
}
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool in project genius by opendaylight.
the class IdManager method createGlobalPool.
private IdPool createGlobalPool(WriteTransaction tx, String poolName, long low, long high, long blockSize) throws ReadFailedException {
IdPool idPool;
InstanceIdentifier<IdPool> idPoolInstanceIdentifier = idUtils.getIdPoolInstance(poolName);
Optional<IdPool> existingIdPool = singleTxDB.syncReadOptional(CONFIGURATION, idPoolInstanceIdentifier);
if (!existingIdPool.isPresent()) {
if (LOG.isDebugEnabled()) {
LOG.debug("Creating new global pool {}", poolName);
}
idPool = idUtils.createGlobalPool(poolName, low, high, blockSize);
tx.put(CONFIGURATION, idPoolInstanceIdentifier, idPool, true);
} else {
idPool = existingIdPool.get();
if (LOG.isDebugEnabled()) {
LOG.debug("GlobalPool exists {}", idPool);
}
}
return idPool;
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool in project genius by opendaylight.
the class IdManager method getOrCreateLocalIdPool.
private IdLocalPool getOrCreateLocalIdPool(String parentPoolName, String localPoolName) throws IdManagerException, ReadFailedException, OperationFailedException, TransactionCommitFailedException {
IdLocalPool localIdPool = localPool.get(parentPoolName);
if (localIdPool == null) {
idUtils.lock(lockManager, parentPoolName);
try {
// first, has created the localPool
if (localPool.get(parentPoolName) == null) {
WriteTransaction tx = broker.newWriteOnlyTransaction();
InstanceIdentifier<IdPool> parentIdPoolInstanceIdentifier = idUtils.getIdPoolInstance(parentPoolName);
IdPool parentIdPool = singleTxDB.syncRead(CONFIGURATION, parentIdPoolInstanceIdentifier);
// Return localIdPool
localIdPool = createLocalPool(tx, localPoolName, parentIdPool);
tx.submit().checkedGet();
} else {
localIdPool = localPool.get(parentPoolName);
}
} finally {
idUtils.unlock(lockManager, parentPoolName);
}
}
return localIdPool;
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool in project genius by opendaylight.
the class IdManager method getRangeOfIds.
private void getRangeOfIds(String parentPoolName, String localPoolName, long size, List<Long> newIdValuesList, IdLocalPool localIdPool, long newIdValue) throws ReadFailedException, IdManagerException {
InstanceIdentifier<IdPool> parentIdPoolInstanceIdentifier1 = idUtils.getIdPoolInstance(parentPoolName);
IdPool parentIdPool = singleTxDB.syncRead(CONFIGURATION, parentIdPoolInstanceIdentifier1);
long totalAvailableIdCount = localIdPool.getAvailableIds().getAvailableIdCount() + localIdPool.getReleasedIds().getAvailableIdCount();
AvailableIdsHolderBuilder availableParentIds = idUtils.getAvailableIdsHolderBuilder(parentIdPool);
ReleasedIdsHolderBuilder releasedParentIds = idUtils.getReleaseIdsHolderBuilder(parentIdPool);
totalAvailableIdCount = totalAvailableIdCount + releasedParentIds.getAvailableIdCount() + idUtils.getAvailableIdsCount(availableParentIds);
if (totalAvailableIdCount > size) {
while (size > 0) {
try {
newIdValue = getIdFromLocalPoolCache(localIdPool, parentPoolName);
} catch (OperationFailedException e) {
if (LOG.isDebugEnabled()) {
LOG.debug("Releasing IDs to pool {}", localPoolName);
}
// Releasing the IDs added in newIdValuesList since
// a null list would be returned now, as the
// requested size of list IDs exceeds the number of
// available IDs.
updateDelayedEntriesInLocalCache(newIdValuesList, parentPoolName, localIdPool);
}
newIdValuesList.add(newIdValue);
size--;
}
} else {
throw new IdManagerException(String.format("Ids exhausted for pool : %s", parentPoolName));
}
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool in project genius by opendaylight.
the class IdManager method updateLocalIdPoolCache.
public boolean updateLocalIdPoolCache(IdPool idPool, String parentPoolName) {
AvailableIdsHolder availableIdsHolder = idPool.getAvailableIdsHolder();
AvailableIdHolder availableIdHolder = new AvailableIdHolder(idUtils, availableIdsHolder.getStart(), availableIdsHolder.getEnd());
availableIdHolder.setCur(availableIdsHolder.getCursor());
ReleasedIdsHolder releasedIdsHolder = idPool.getReleasedIdsHolder();
ReleasedIdHolder releasedIdHolder = new ReleasedIdHolder(idUtils, releasedIdsHolder.getDelayedTimeSec());
releasedIdHolder.setAvailableIdCount(releasedIdsHolder.getAvailableIdCount());
List<DelayedIdEntries> delayedEntries = releasedIdsHolder.getDelayedIdEntries();
List<DelayedIdEntry> delayedIdEntryInCache = delayedEntries.stream().map(delayedIdEntry -> new DelayedIdEntry(delayedIdEntry.getId(), delayedIdEntry.getReadyTimeSec())).sorted(comparing(DelayedIdEntry::getReadyTimeSec)).collect(toCollection(ArrayList::new));
releasedIdHolder.replaceDelayedEntries(delayedIdEntryInCache);
IdLocalPool idLocalPool = new IdLocalPool(idUtils, idPool.getPoolName());
idLocalPool.setAvailableIds(availableIdHolder);
idLocalPool.setReleasedIds(releasedIdHolder);
localPool.put(parentPoolName, idLocalPool);
if (LOG.isDebugEnabled()) {
LOG.debug("Populating cache for {} with {}", idLocalPool.getPoolName(), idLocalPool);
}
return true;
}
Aggregations