X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fnetconf-topology-singleton%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftopology%2Fsingleton%2Fimpl%2FNetconfTopologyContext.java;h=4d101833efb93b2c9f1ea0436b8bafdd7ce046b9;hb=8e59d67f1b7580c2135cbcc229d4c377c8cc1b09;hp=0ac355d6dc0e4b53059e953b43d474cbd21b2ac4;hpb=afce5ad359932ef84f239e59888fe041ac7113c9;p=netconf.git diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java index 0ac355d6dc..4d101833ef 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/NetconfTopologyContext.java @@ -5,11 +5,8 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.topology.singleton.impl; -import static org.opendaylight.netconf.topology.singleton.impl.utils.NetconfTopologyUtils.DEFAULT_SCHEMA_REPOSITORY; - import akka.actor.ActorRef; import akka.cluster.Cluster; import akka.dispatch.OnComplete; @@ -19,8 +16,7 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.Nonnull; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; @@ -34,7 +30,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Future; -class NetconfTopologyContext implements ClusterSingletonService { +class NetconfTopologyContext implements ClusterSingletonService, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(NetconfTopologyContext.class); @@ -47,9 +43,9 @@ class NetconfTopologyContext implements ClusterSingletonService { private RemoteDeviceConnector remoteDeviceConnector; private NetconfNodeManager netconfNodeManager; private ActorRef masterActorRef; - private boolean finalClose = false; private final AtomicBoolean closed = new AtomicBoolean(false); - private boolean isMaster; + private final AtomicBoolean stopped = new AtomicBoolean(false); + private volatile boolean isMaster; NetconfTopologyContext(final NetconfTopologySetup netconfTopologyDeviceSetup, final ServiceGroupIdentifier serviceGroupIdent, @@ -60,10 +56,9 @@ class NetconfTopologyContext implements ClusterSingletonService { this.mountService = mountService; remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(), - netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class)); + netconfTopologyDeviceSetup.getNode().augmentation(NetconfNode.class)); - remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId, - actorResponseWaitTime, mountService); + remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId); netconfNodeManager = createNodeDeviceManager(); } @@ -80,15 +75,14 @@ class NetconfTopologyContext implements ClusterSingletonService { netconfNodeManager = null; } - if (!finalClose) { + if (!closed.get()) { final String masterAddress = Cluster.get(netconfTopologyDeviceSetup.getActorSystem()).selfAddress().toString(); masterActorRef = netconfTopologyDeviceSetup.getActorSystem().actorOf(NetconfNodeActor.props( - netconfTopologyDeviceSetup, remoteDeviceId, DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_REPOSITORY, - actorResponseWaitTime, mountService), + netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime, mountService), NetconfTopologyUtils.createMasterActorName(remoteDeviceId.getName(), masterAddress)); - remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef); + remoteDeviceConnector.startRemoteDeviceConnection(newMasterSalFacade()); } } @@ -97,13 +91,13 @@ class NetconfTopologyContext implements ClusterSingletonService { @Override public ListenableFuture closeServiceInstance() { - if (!finalClose) { + if (!closed.get()) { // in case that master changes role to slave, new NodeDeviceManager must be created and listener registered netconfNodeManager = createNodeDeviceManager(); } stopDeviceConnectorAndActor(); - return Futures.immediateCheckedFuture(null); + return Futures.immediateFuture(null); } @Override @@ -115,13 +109,16 @@ class NetconfTopologyContext implements ClusterSingletonService { final NetconfNodeManager ndm = new NetconfNodeManager(netconfTopologyDeviceSetup, remoteDeviceId, actorResponseWaitTime, mountService); ndm.registerDataTreeChangeListener(netconfTopologyDeviceSetup.getTopologyId(), - netconfTopologyDeviceSetup.getNode().getKey()); + netconfTopologyDeviceSetup.getNode().key()); return ndm; } - void closeFinal() throws Exception { - finalClose = true; + @Override + public void close() { + if (!closed.compareAndSet(false, true)) { + return; + } if (netconfNodeManager != null) { netconfNodeManager.close(); @@ -134,10 +131,10 @@ class NetconfTopologyContext implements ClusterSingletonService { * Refresh, if configuration data was changed. * @param setup new setup */ - void refresh(@Nonnull final NetconfTopologySetup setup) { + void refresh(final NetconfTopologySetup setup) { netconfTopologyDeviceSetup = Preconditions.checkNotNull(setup); remoteDeviceId = NetconfTopologyUtils.createRemoteDeviceId(netconfTopologyDeviceSetup.getNode().getNodeId(), - netconfTopologyDeviceSetup.getNode().getAugmentation(NetconfNode.class)); + netconfTopologyDeviceSetup.getNode().augmentation(NetconfNode.class)); if (isMaster) { remoteDeviceConnector.stopRemoteDeviceConnection(); @@ -145,8 +142,7 @@ class NetconfTopologyContext implements ClusterSingletonService { if (!isMaster) { netconfNodeManager.refreshDevice(netconfTopologyDeviceSetup, remoteDeviceId); } - remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId, - actorResponseWaitTime, mountService); + remoteDeviceConnector = new RemoteDeviceConnectorImpl(netconfTopologyDeviceSetup, remoteDeviceId); if (isMaster) { final Future future = Patterns.ask(masterActorRef, new RefreshSetupMasterActorData( @@ -154,19 +150,19 @@ class NetconfTopologyContext implements ClusterSingletonService { future.onComplete(new OnComplete() { @Override - public void onComplete(final Throwable failure, final Object success) throws Throwable { + public void onComplete(final Throwable failure, final Object success) { if (failure != null) { - LOG.error("Failed to refresh master actor data: {}", failure); + LOG.error("Failed to refresh master actor data", failure); return; } - remoteDeviceConnector.startRemoteDeviceConnection(masterActorRef); + remoteDeviceConnector.startRemoteDeviceConnection(newMasterSalFacade()); } }, netconfTopologyDeviceSetup.getActorSystem().dispatcher()); } } private void stopDeviceConnectorAndActor() { - if (!closed.compareAndSet(false, true)) { + if (!stopped.compareAndSet(false, true)) { return; } if (remoteDeviceConnector != null) { @@ -178,4 +174,9 @@ class NetconfTopologyContext implements ClusterSingletonService { masterActorRef = null; } } + + protected MasterSalFacade newMasterSalFacade() { + return new MasterSalFacade(remoteDeviceId, netconfTopologyDeviceSetup.getActorSystem(), masterActorRef, + actorResponseWaitTime, mountService, netconfTopologyDeviceSetup.getDataBroker()); + } }