2 * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.netconf.topology.util;
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;
23 public class NodeRoleChangeStrategy implements RoleChangeStrategy, EntityOwnershipListener {
25 private static final Logger LOG = LoggerFactory.getLogger(NodeRoleChangeStrategy.class);
27 private final EntityOwnershipService entityOwnershipService;
28 private final String entityType;
29 private final String entityName;
30 private final Entity entity;
31 private NodeListener ownershipCandidate;
33 private EntityOwnershipCandidateRegistration candidateRegistration = null;
34 private EntityOwnershipListenerRegistration ownershipListenerRegistration = null;
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);
46 public void registerRoleCandidate(NodeListener electionCandidate) {
47 LOG.debug("Registering role candidate type: {} , name: {}", entityType, entityName);
48 this.ownershipCandidate = electionCandidate;
50 if (candidateRegistration != null) {
51 unregisterRoleCandidate();
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);
62 public void unregisterRoleCandidate() {
63 LOG.debug("Unregistering role candidate");
64 if (candidateRegistration != null) {
65 candidateRegistration.close();
66 candidateRegistration = null;
68 if (ownershipListenerRegistration != null) {
69 ownershipListenerRegistration.close();
70 ownershipListenerRegistration = null;
75 public boolean isCandidateRegistered() {
76 return entityOwnershipService.isCandidateRegistered(entity);
80 public void onRoleChanged(RoleChangeDTO roleChangeDTO) {
81 LOG.debug("Role was changed {}", roleChangeDTO);
82 ownershipCandidate.onRoleChanged(roleChangeDTO);
86 public void ownershipChanged(EntityOwnershipChange ownershipChange) {
87 LOG.debug("Ownership has changed {}", ownershipChange);
88 ownershipCandidate.onRoleChanged(new RoleChangeDTO(ownershipChange.wasOwner(), ownershipChange.isOwner(), ownershipChange.hasOwner()));