2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. 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
8 package org.opendaylight.vpnservice.utils.clustering;
10 import com.google.common.base.Optional;
11 import com.google.common.collect.Lists;
12 import com.google.common.util.concurrent.Futures;
13 import com.google.common.util.concurrent.ListenableFuture;
14 import com.google.common.util.concurrent.SettableFuture;
15 import org.opendaylight.controller.md.sal.common.api.clustering.*;
16 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
17 import org.opendaylight.vpnservice.utils.SystemPropertyReader;
18 import org.opendaylight.vpnservice.utils.cache.CacheUtil;
19 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.concurrent.Callable;
26 import java.util.concurrent.ConcurrentMap;
28 public class EntityOwnerUtils {
29 public static final String ENTITY_OWNER_CACHE = "entity.owner.cache";
30 private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerUtils.class);
33 createEntityOwnerCache();
35 private static void createEntityOwnerCache() {
36 if (CacheUtil.getCache(ENTITY_OWNER_CACHE) == null) {
37 CacheUtil.createCache(ENTITY_OWNER_CACHE);
41 private static String getEntity(String entityType, String entityName) {
45 private static void updateEntityOwner(String entityType, String entityName, Boolean isOwner) {
46 ConcurrentMap<String, Boolean> entityOwnerCache =
47 (ConcurrentMap<String, Boolean>) CacheUtil.getCache(ENTITY_OWNER_CACHE);
48 String entity = getEntity(entityType, entityName);
49 if (entityOwnerCache != null) {
50 LOG.trace("updating entity owner "+isOwner+ " "+entity );
51 entityOwnerCache.put(entity, isOwner);
55 public static boolean amIEntityOwner(String entityType, String entityName) {
56 ConcurrentMap<String, Boolean> entityOwnerCache =
57 (ConcurrentMap<String, Boolean>) CacheUtil.getCache(ENTITY_OWNER_CACHE);
58 String entity = getEntity(entityType, entityName);
60 if (entityOwnerCache != null) {
61 if (entityOwnerCache.get(entity) != null) {
62 ret = entityOwnerCache.get(entity);
65 LOG.error("entity owner cache null");
67 LOG.trace("get entity owner result {} for type {}" ,ret ,entity);
72 * Registers the entityName for ownership for given entityType
73 * adds a local listener which takes care of updating the cached entity status
74 * @param entityOwnershipService
77 * @param listener also adds this listener for ownership events if provided
78 * @throws CandidateAlreadyRegisteredException
80 public static void registerEntityCandidateForOwnerShip (
81 EntityOwnershipService entityOwnershipService,
82 String entityType, String entityName, EntityOwnershipListener listener)
83 throws CandidateAlreadyRegisteredException {
84 LOG.info("registering for entity ownership for type "+entityType);
85 Entity candidateEntity = new Entity(entityType, entityName);
86 EntityOwnershipCandidateRegistration candidateRegistration = entityOwnershipService.registerCandidate(
88 EntityOwnershipListenerRegistration listenerRegistration = entityOwnershipService.registerListener(entityType,
89 entityOwnershipListener);
90 if (listener != null) {
91 entityOwnershipService.registerListener(entityType, listener);
93 LOG.info("registered for entity ownership for type "+entityType);
94 //TODO track registrations for closing
97 private static Listener entityOwnershipListener = new Listener();
98 static class Listener implements EntityOwnershipListener {
101 public void ownershipChanged(EntityOwnershipChange ownershipChange) {
102 String entityType = ownershipChange.getEntity().getType();
103 String entityName = ownershipChange.getEntity().getId().toString();
104 LOG.info("entity ownership changed for "+entityType);
105 if (ownershipChange.hasOwner() && ownershipChange.isOwner()) {
106 LOG.info("entity ownership change became owner for type "+entityType);
107 updateEntityOwner(entityType, entityName, Boolean.TRUE);
109 LOG.info("entity ownership lost ownership for type "+entityType);
110 updateEntityOwner(entityType, entityName, Boolean.FALSE);