2 * Copyright (c) 2017 Hewlett Packard Enterprise, Co. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.netvirt.policyservice;
11 import com.google.common.collect.ImmutableMap;
13 import java.math.BigInteger;
15 import java.util.concurrent.ConcurrentHashMap;
16 import java.util.concurrent.ExecutionException;
17 import java.util.concurrent.Future;
19 import javax.annotation.PostConstruct;
20 import javax.inject.Inject;
21 import javax.inject.Singleton;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
31 import org.opendaylight.yangtools.yang.common.RpcResult;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
36 * Manage allocation of policy ids and policy group ids.
40 public class PolicyIdManager {
41 private static final Logger LOG = LoggerFactory.getLogger(PolicyIdManager.class);
43 private final IdManagerService idManager;
44 private final Map<String,
45 Map<String, Long>> idCache = ImmutableMap.of(//
46 PolicyServiceConstants.POLICY_CLASSIFIER_POOL_NAME, new ConcurrentHashMap<String, Long>(),
47 PolicyServiceConstants.POLICY_GROUP_POOL_NAME, new ConcurrentHashMap<String, Long>());
50 public PolicyIdManager(final IdManagerService idManager) {
51 this.idManager = idManager;
60 public long getPolicyClassifierId(String policyClassifierName) {
61 return allocateId(policyClassifierName, PolicyServiceConstants.POLICY_CLASSIFIER_POOL_NAME);
64 public void releasePolicyClassifierId(String policyClassifierName) {
65 releaseId(policyClassifierName, PolicyServiceConstants.POLICY_CLASSIFIER_POOL_NAME);
68 public long getPolicyClassifierGroupId(String policyClassifierName, BigInteger remoteDpId) {
69 return allocateId(getPolicyClassifierGroupKey(policyClassifierName, remoteDpId),
70 PolicyServiceConstants.POLICY_GROUP_POOL_NAME);
73 public void releasePolicyClassifierGroupId(String policyClassifierName, BigInteger remoteDpId) {
74 releaseId(getPolicyClassifierGroupKey(policyClassifierName, remoteDpId),
75 PolicyServiceConstants.POLICY_GROUP_POOL_NAME);
78 public static String getPolicyClassifierGroupKey(String policyClassifier, BigInteger remoteDpId) {
79 return policyClassifier + '-' + remoteDpId;
82 private void createIdPools() {
83 createIdPool(PolicyServiceConstants.POLICY_CLASSIFIER_POOL_NAME,
84 PolicyServiceConstants.POLICY_CLASSIFIER_LOW_ID, PolicyServiceConstants.POLICY_CLASSIFIER_HIGH_ID);
85 createIdPool(PolicyServiceConstants.POLICY_GROUP_POOL_NAME, PolicyServiceConstants.POLICY_GROUP_LOW_ID,
86 PolicyServiceConstants.POLICY_GROUP_HIGH_ID);
89 private void createIdPool(String poolName, long lowId, long highId) {
90 CreateIdPoolInput createPoolInput = new CreateIdPoolInputBuilder().setPoolName(poolName).setLow(lowId)
91 .setHigh(highId).build();
94 Future<RpcResult<Void>> result = idManager.createIdPool(createPoolInput);
95 if ((result != null) && (result.get().isSuccessful())) {
96 LOG.info("Created IdPool for {}", poolName);
98 } catch (InterruptedException | ExecutionException e) {
99 LOG.error("Failed to create idPool for {}", poolName, e);
103 private long allocateId(String key, String poolName) {
104 Long id = idCache.get(poolName).get(key);
109 AllocateIdInput getIdInput = new AllocateIdInputBuilder().setPoolName(poolName).setIdKey(key).build();
111 Future<RpcResult<AllocateIdOutput>> result = idManager.allocateId(getIdInput);
112 RpcResult<AllocateIdOutput> rpcResult = result.get();
113 Long idValue = rpcResult.getResult().getIdValue();
114 if (idValue != null) {
115 idCache.get(poolName).putIfAbsent(key, idValue);
118 } catch (InterruptedException | ExecutionException e) {
119 LOG.warn("Exception thrown while allocating id for key {}", key);
122 return PolicyServiceConstants.INVALID_ID;
125 private void releaseId(String key, String poolName) {
126 idCache.get(poolName).remove(key);
127 ReleaseIdInput idInput = new ReleaseIdInputBuilder().setPoolName(poolName).setIdKey(key).build();
129 Future<RpcResult<Void>> result = idManager.releaseId(idInput);
130 RpcResult<Void> rpcResult = result.get();
131 if (!rpcResult.isSuccessful()) {
132 LOG.warn("RPC Call to release {} returned with Errors {}", key, rpcResult.getErrors());
134 } catch (InterruptedException | ExecutionException e) {
135 LOG.warn("Exception thrown while releasing id for key {}", key);