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 NodeListener ownershipCandidate;
32 private EntityOwnershipCandidateRegistration candidateRegistration = null;
33 private EntityOwnershipListenerRegistration ownershipListenerRegistration = null;
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;
44 public void registerRoleCandidate(NodeListener electionCandidate) {
45 LOG.debug("Registering role candidate type: {} , name: {}", entityType, entityName);
46 this.ownershipCandidate = electionCandidate;
48 if (candidateRegistration != null) {
49 unregisterRoleCandidate();
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);
60 public void unregisterRoleCandidate() {
61 LOG.debug("Unregistering role candidate");
62 candidateRegistration.close();
63 candidateRegistration = null;
64 ownershipListenerRegistration.close();
65 ownershipListenerRegistration = null;
69 public void onRoleChanged(RoleChangeDTO roleChangeDTO) {
70 LOG.debug("Role was changed {}", roleChangeDTO);
71 ownershipCandidate.onRoleChanged(roleChangeDTO);
75 public void ownershipChanged(EntityOwnershipChange ownershipChange) {
76 LOG.debug("Ownership has changed {}", ownershipChange);
77 ownershipCandidate.onRoleChanged(new RoleChangeDTO(ownershipChange.wasOwner(), ownershipChange.isOwner(), ownershipChange.hasOwner()));