2 * Copyright (c) 2016 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.singleton.impl;
11 import static org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils.DEFAULT_SCHEMA_REPOSITORY;
13 import akka.actor.ActorRef;
14 import akka.cluster.Cluster;
15 import akka.dispatch.OnComplete;
16 import akka.pattern.Patterns;
17 import akka.util.Timeout;
18 import com.google.common.base.Preconditions;
19 import com.google.common.util.concurrent.Futures;
20 import com.google.common.util.concurrent.ListenableFuture;
21 import javax.annotation.Nonnull;
22 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
23 import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
24 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
25 import org.opendaylight.netconf.topology.singleton.api.RemoteDeviceConnector;
26 import org.opendaylight.netconf.topology.singleton.impl.actors.NetconfNodeActor;
27 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologySetup;
28 import org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils;
29 import org.opendaylight.netconf.topology.singleton.messages.RefreshSetupMasterActorData;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33 import scala.concurrent.Future;
35 class NetconfTopologyContext implements ClusterSingletonService {
37 private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyContext.class);
39 private final ServiceGroupIdentifier serviceGroupIdent;
40 private final Timeout actorResponseWaitTime;
41 private NetconfTopologySetup netconfTopologyDeviceSetup;
42 private RemoteDeviceId remoteDeviceId;
43 private RemoteDeviceConnector remoteDeviceConnector;
44 private NetconfNodeManager netconfNodeManager;
45 private boolean finalClose = false;
46 private boolean closed = false;
47 private boolean isMaster;
49 private ActorRef masterActorRef;
51 NetconfTopologyContext(final NetconfTopologySetup netconfTopologyDeviceSetup,
52 final ServiceGroupIdentifier serviceGroupIdent,
53 final Timeout actorResponseWaitTime) {
54 this.netconfTopologyDeviceSetup = Preconditions.checkNotNull(netconfTopologyDeviceSetup);
55 this.serviceGroupIdent = serviceGroupIdent;
56 this.actorResponseWaitTime = actorResponseWaitTime;
58 remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(),
59 netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class));
61 remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId,
62 actorResponseWaitTime);
64 netconfNodeManager = createNodeDeviceManager();
68 public void instantiateServiceInstance() {
69 LOG.info("Master was selected: {}", remoteDeviceId.getHost().getIpAddress());
73 // master should not listen on netconf-node operational datastore
74 if (netconfNodeManager != null) {
75 netconfNodeManager.close();
76 netconfNodeManager = null;
80 final String masterAddress = Cluster.get(netconfTopologyDeviceSetup.getActorSystem()).selfAddress().toString();
81 masterActorRef = netconfTopologyDeviceSetup.getActorSystem().actorOf(NetconfNodeActor.props(
82 netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_REPOSITORY,
83 actorResponseWaitTime),
84 NetconfTopologyUtils.createMasterActorName(remoteDeviceId.getName(), masterAddress));
86 remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef);
91 // called when master is down/changed to slave
93 public ListenableFuture<Void> closeServiceInstance() {
96 // in case that master changes role to slave, new NodeDeviceManager must be created and listener registered
97 netconfNodeManager = createNodeDeviceManager();
99 stopDeviceConnectorAndActor();
101 return Futures.immediateCheckedFuture(null);
105 public ServiceGroupIdentifier getIdentifier() {
106 return serviceGroupIdent;
109 private NetconfNodeManager createNodeDeviceManager() {
110 final NetconfNodeManager ndm =
111 new NetconfNodeManager(netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY,
112 DEFAULT_SCHEMA_REPOSITORY, actorResponseWaitTime);
113 ndm.registerDataTreeChangeListener(netconfTopologyDeviceSetup.getTopologyId(),
114 netconfTopologyDeviceSetup.getNode().getKey());
119 void closeFinal() throws Exception {
122 if (netconfNodeManager != null) {
123 netconfNodeManager.close();
125 stopDeviceConnectorAndActor();
130 * If configuration data was changed
131 * @param setup new setup
133 void refresh(@Nonnull final NetconfTopologySetup setup) {
134 netconfTopologyDeviceSetup = Preconditions.checkNotNull(setup);
135 remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(),
136 netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class));
139 remoteDeviceConnector.stopRemoteDeviceConnection();
142 netconfNodeManager.refreshDevice(netconfTopologyDeviceSetup, remoteDeviceId);
144 remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime);
147 final Future<Object> future = Patterns.ask(masterActorRef, new RefreshSetupMasterActorData(
148 netconfTopologyDeviceSetup, remoteDeviceId), actorResponseWaitTime);
150 future.onComplete(new OnComplete<Object>() {
152 public void onComplete(final Throwable failure, final Object success) throws Throwable {
153 if (failure != null) {
154 LOG.error("Failed to refresh master actor data: {}", failure);
157 remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef);
159 }, netconfTopologyDeviceSetup.getActorSystem().dispatcher());
163 private synchronized void stopDeviceConnectorAndActor() {
167 if (remoteDeviceConnector != null) {
168 remoteDeviceConnector.stopRemoteDeviceConnection();
171 if (masterActorRef != null) {
172 netconfTopologyDeviceSetup.getActorSystem().stop(masterActorRef);
173 masterActorRef = null;