RemoteDeviceDataBroker proxy
[netconf.git] / opendaylight / netconf / abstract-topology / src / main / java / org / opendaylight / netconf / topology / util / NodeRoleChangeStrategy.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.netconf.topology.util;
10
11 import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException;
12 import org.opendaylight.controller.md.sal.common.api.clustering.Entity;
13 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipCandidateRegistration;
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.EntityOwnershipListenerRegistration;
17 import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
18 import org.opendaylight.netconf.topology.RoleChangeStrategy;
19 import org.opendaylight.netconf.topology.NodeListener;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 public class NodeRoleChangeStrategy implements RoleChangeStrategy, EntityOwnershipListener {
24
25     private static final Logger LOG = LoggerFactory.getLogger(NodeRoleChangeStrategy.class);
26
27     private final EntityOwnershipService entityOwnershipService;
28     private final String entityType;
29     private final String entityName;
30     private final Entity entity;
31     private NodeListener ownershipCandidate;
32
33     private EntityOwnershipCandidateRegistration candidateRegistration = null;
34     private EntityOwnershipListenerRegistration ownershipListenerRegistration = null;
35
36     public NodeRoleChangeStrategy(final EntityOwnershipService entityOwnershipService,
37                                   final String entityType,
38                                   final String entityName) {
39         this.entityOwnershipService = entityOwnershipService;
40         this.entityType = entityType + "/" + entityName;
41         this.entityName = entityName;
42         this.entity = new Entity(this.entityType, entityName);
43     }
44
45     @Override
46     public void registerRoleCandidate(NodeListener electionCandidate) {
47         LOG.debug("Registering role candidate type: {} , name: {}", entityType, entityName);
48         this.ownershipCandidate = electionCandidate;
49         try {
50             if (candidateRegistration != null) {
51                 unregisterRoleCandidate();
52             }
53             candidateRegistration = entityOwnershipService.registerCandidate(entity);
54             ownershipListenerRegistration = entityOwnershipService.registerListener(entityType, this);
55         } catch (CandidateAlreadyRegisteredException e) {
56             LOG.error("Candidate already registered for election", e);
57             throw new IllegalStateException("Candidate already registered for election", e);
58         }
59     }
60
61     @Override
62     public void unregisterRoleCandidate() {
63         LOG.debug("Unregistering role candidate");
64         candidateRegistration.close();
65         candidateRegistration = null;
66         ownershipListenerRegistration.close();
67         ownershipListenerRegistration = null;
68     }
69
70     @Override
71     public boolean isCandidateRegistered() {
72         return entityOwnershipService.isCandidateRegistered(entity);
73     }
74
75     @Override
76     public void onRoleChanged(RoleChangeDTO roleChangeDTO) {
77         LOG.debug("Role was changed {}", roleChangeDTO);
78         ownershipCandidate.onRoleChanged(roleChangeDTO);
79     }
80
81     @Override
82     public void ownershipChanged(EntityOwnershipChange ownershipChange) {
83         LOG.debug("Ownership has changed {}", ownershipChange);
84         ownershipCandidate.onRoleChanged(new RoleChangeDTO(ownershipChange.wasOwner(), ownershipChange.isOwner(), ownershipChange.hasOwner()));
85     }
86 }