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.genius.utils.clustering;
10 import java.util.ArrayList;
11 import java.util.concurrent.ConcurrentMap;
12 import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
13 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
14 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipChange;
15 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipListener;
16 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
17 import org.opendaylight.genius.utils.cache.CacheUtil;
18 import org.slf4j.Logger;
19 import org.slf4j.LoggerFactory;
21 public class EntityOwnerUtils {
22 public static final String ENTITY_OWNER_CACHE = "entity.owner.cache";
23 private static final Logger LOG = LoggerFactory.getLogger(EntityOwnerUtils.class);
24 static final ArrayList<EntityEvent> eventsHistory = new ArrayList<>();
25 public static class EntityEvent {
30 public EntityEvent(long time, String entityName, boolean hasOwner, boolean isOwner) {
32 this.entityName = entityName;
33 this.hasOwner = hasOwner;
34 this.isOwner = isOwner;
36 public long getTime() {
39 public String getEntityName() {
42 public boolean isOwner() {
45 public boolean hasOwner() {
49 public static ArrayList<EntityEvent> getEventsHistory() {
54 createEntityOwnerCache();
56 private static void createEntityOwnerCache() {
57 if (CacheUtil.getCache(ENTITY_OWNER_CACHE) == null) {
58 CacheUtil.createCache(ENTITY_OWNER_CACHE);
62 private static String getEntity(String entityType, String entityName) {
66 private static void updateEntityOwner(String entityType, String entityName, Boolean isOwner) {
67 ConcurrentMap<String, Boolean> entityOwnerCache =
68 (ConcurrentMap<String, Boolean>) CacheUtil.getCache(ENTITY_OWNER_CACHE);
69 String entity = getEntity(entityType, entityName);
70 if (entityOwnerCache != null) {
71 LOG.trace("updating entity owner "+isOwner+ " "+entity );
72 entityOwnerCache.put(entity, isOwner);
76 public static boolean amIEntityOwner(String entityType, String entityName) {
77 ConcurrentMap<String, Boolean> entityOwnerCache =
78 (ConcurrentMap<String, Boolean>) CacheUtil.getCache(ENTITY_OWNER_CACHE);
79 String entity = getEntity(entityType, entityName);
81 if (entityOwnerCache != null) {
82 if (entityOwnerCache.get(entity) != null) {
83 ret = entityOwnerCache.get(entity);
86 LOG.error("entity owner cache null");
88 LOG.trace("get entity owner result {} for type {}" ,ret ,entity);
93 * Registers the entityName for ownership for given entityType
94 * adds a local listener which takes care of updating the cached entity status
95 * @param entityOwnershipService
98 * @param listener also adds this listener for ownership events if provided
99 * @throws CandidateAlreadyRegisteredException
101 public static void registerEntityCandidateForOwnerShip (
102 EntityOwnershipService entityOwnershipService,
103 String entityType, String entityName, EntityOwnershipListener listener)
104 throws CandidateAlreadyRegisteredException {
105 LOG.info("registering for entity ownership for type "+entityType);
106 Entity candidateEntity = new Entity(entityType, entityName);
107 entityOwnershipService.registerCandidate(
109 entityOwnershipService.registerListener(entityType,
110 entityOwnershipListener);
111 if (listener != null) {
112 entityOwnershipService.registerListener(entityType, listener);
114 LOG.info("registered for entity ownership for type "+entityType);
115 //TODO track registrations for closing
118 private static Listener entityOwnershipListener = new Listener();
119 static class Listener implements EntityOwnershipListener {
122 public void ownershipChanged(EntityOwnershipChange ownershipChange) {
123 String entityType = ownershipChange.getEntity().getType();
124 String entityName = ownershipChange.getEntity().getId().toString();
125 LOG.info("entity ownership changed for "+entityType);
126 eventsHistory.add(new EntityEvent(System.currentTimeMillis(), entityName, ownershipChange.hasOwner() ,
127 ownershipChange.isOwner()));
128 if (ownershipChange.hasOwner() && ownershipChange.isOwner()) {
129 LOG.info("entity ownership change became owner for type "+entityType);
130 updateEntityOwner(entityType, entityName, Boolean.TRUE);
132 LOG.info("entity ownership lost ownership for type "+entityType);
133 updateEntityOwner(entityType, entityName, Boolean.FALSE);