55bdb2e2dd071e548c387337b28dd2388e7c74f4
[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 NodeListener ownershipCandidate;
31
32     private EntityOwnershipCandidateRegistration candidateRegistration = null;
33     private EntityOwnershipListenerRegistration ownershipListenerRegistration = null;
34
35     public NodeRoleChangeStrategy(final EntityOwnershipService entityOwnershipService,
36                                   final String entityType,
37                                   final String entityName) {
38         this.entityOwnershipService = entityOwnershipService;
39         this.entityType = entityType + "/" + entityName;
40         this.entityName = entityName;
41     }
42
43     @Override
44     public void registerRoleCandidate(NodeListener electionCandidate) {
45         LOG.debug("Registering role candidate type: {} , name: {}", entityType, entityName);
46         this.ownershipCandidate = electionCandidate;
47         try {
48             if (candidateRegistration != null) {
49                 unregisterRoleCandidate();
50             }
51             candidateRegistration = entityOwnershipService.registerCandidate(new Entity(entityType, entityName));
52             ownershipListenerRegistration = entityOwnershipService.registerListener(entityType, this);
53         } catch (CandidateAlreadyRegisteredException e) {
54             LOG.error("Candidate already registered for election", e);
55             throw new IllegalStateException("Candidate already registered for election", e);
56         }
57     }
58
59     @Override
60     public void unregisterRoleCandidate() {
61         LOG.debug("Unregistering role candidate");
62         candidateRegistration.close();
63         candidateRegistration = null;
64         ownershipListenerRegistration.close();
65         ownershipListenerRegistration = null;
66     }
67
68     @Override
69     public void onRoleChanged(RoleChangeDTO roleChangeDTO) {
70         LOG.debug("Role was changed {}", roleChangeDTO);
71         ownershipCandidate.onRoleChanged(roleChangeDTO);
72     }
73
74     @Override
75     public void ownershipChanged(EntityOwnershipChange ownershipChange) {
76         LOG.debug("Ownership has changed {}", ownershipChange);
77         ownershipCandidate.onRoleChanged(new RoleChangeDTO(ownershipChange.wasOwner(), ownershipChange.isOwner(), ownershipChange.hasOwner()));
78     }
79 }