Search in sources :

Example 21 with IdPool

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);
    }
}
Also used : IdPool(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool)

Example 22 with 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 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;
}
Also used : IdPool(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool)

Example 23 with 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;
}
Also used : WriteTransaction(org.opendaylight.controller.md.sal.binding.api.WriteTransaction) IdPool(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool)

Example 24 with 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 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));
    }
}
Also used : AvailableIdsHolderBuilder(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.AvailableIdsHolderBuilder) ReleasedIdsHolderBuilder(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolderBuilder) OperationFailedException(org.opendaylight.yangtools.yang.common.OperationFailedException) IdPool(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool)

Example 25 with 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 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;
}
Also used : ReleasedIdsHolder(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder) AvailableIdsHolder(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.AvailableIdsHolder) DelayedIdEntry(org.opendaylight.genius.idmanager.ReleasedIdHolder.DelayedIdEntry) DelayedIdEntries(org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.released.ids.DelayedIdEntries)

Aggregations

IdPool (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool)23 IdPoolKey (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolKey)16 CreateIdPoolInput (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput)13 CreateIdPoolInputBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder)12 IdPoolBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolBuilder)10 DelayedIdEntries (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.released.ids.DelayedIdEntries)10 WriteTransaction (org.opendaylight.controller.md.sal.binding.api.WriteTransaction)9 IdPools (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdPools)9 AvailableIdsHolder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.AvailableIdsHolder)9 RpcResult (org.opendaylight.yangtools.yang.common.RpcResult)9 ExecutionException (java.util.concurrent.ExecutionException)8 ReleasedIdsHolder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder)8 Test (org.junit.Test)7 ReleasedIdsHolderBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolderBuilder)7 InstanceIdentifier (org.opendaylight.yangtools.yang.binding.InstanceIdentifier)7 AllocateIdInput (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput)6 AvailableIdsHolderBuilder (org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.AvailableIdsHolderBuilder)6 ArrayList (java.util.ArrayList)5 Collections (java.util.Collections)5 List (java.util.List)5