Remove wildcard imports
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / utils / clustering / EntityOwnerUtils.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.genius.utils.clustering;
9
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;
20
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 {
26         long time;
27         String entityName;
28         boolean isOwner;
29         boolean hasOwner;
30         public EntityEvent(long time, String entityName, boolean hasOwner, boolean isOwner) {
31             this.time = time;
32             this.entityName = entityName;
33             this.hasOwner = hasOwner;
34             this.isOwner = isOwner;
35         }
36         public long getTime() {
37             return time;
38         }
39         public String getEntityName() {
40             return entityName;
41         }
42         public boolean isOwner() {
43             return isOwner;
44         }
45         public boolean hasOwner() {
46             return hasOwner;
47         }
48     }
49     public static ArrayList<EntityEvent> getEventsHistory() {
50         return eventsHistory;
51     }
52
53     static {
54         createEntityOwnerCache();
55     }
56     private static void createEntityOwnerCache() {
57         if (CacheUtil.getCache(ENTITY_OWNER_CACHE) == null) {
58             CacheUtil.createCache(ENTITY_OWNER_CACHE);
59         }
60     }
61
62     private static String getEntity(String entityType, String entityName) {
63         return entityType;
64     }
65
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);
73         }
74     }
75
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);
80         boolean ret = false;
81         if (entityOwnerCache != null) {
82             if (entityOwnerCache.get(entity) != null) {
83                 ret = entityOwnerCache.get(entity);
84             }
85         } else {
86             LOG.error("entity owner cache null");
87         }
88         LOG.trace("get entity owner result {} for type {}" ,ret ,entity);
89         return ret;
90     }
91
92     /**
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
96      * @param entityType
97      * @param entityName
98      * @param listener also adds this listener for ownership events if provided
99      * @throws CandidateAlreadyRegisteredException
100      */
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(
108                 candidateEntity);
109         entityOwnershipService.registerListener(entityType,
110                 entityOwnershipListener);
111         if (listener != null) {
112             entityOwnershipService.registerListener(entityType, listener);
113         }
114         LOG.info("registered for entity ownership for type "+entityType);
115         //TODO track registrations for closing
116     }
117
118     private static Listener entityOwnershipListener = new Listener();
119     static class Listener implements EntityOwnershipListener {
120
121         @Override
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);
131             } else {
132                 LOG.info("entity ownership lost ownership for type "+entityType);
133                 updateEntityOwner(entityType, entityName, Boolean.FALSE);
134             }
135         }
136     }
137 }