* 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 akka.actor.ActorRef;
import akka.actor.ActorSystem;
-import org.opendaylight.controller.md.sal.dom.api.DOMRpcService;
-import org.opendaylight.controller.sal.core.api.Broker;
+import akka.util.Timeout;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.opendaylight.mdsal.dom.api.DOMActionService;
+import org.opendaylight.mdsal.dom.api.DOMMountPointService;
+import org.opendaylight.mdsal.dom.api.DOMRpcService;
import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceNotificationService;
import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceSalProvider;
import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
-import org.opendaylight.netconf.topology.singleton.api.NetconfDOMTransaction;
-import org.opendaylight.netconf.topology.singleton.impl.tx.NetconfProxyDOMTransaction;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final RemoteDeviceId id;
private final NetconfDeviceSalProvider salProvider;
-
private final ActorSystem actorSystem;
+ private final Timeout actorResponseWaitTime;
+ private final AtomicBoolean registered = new AtomicBoolean(false);
public SlaveSalFacade(final RemoteDeviceId id,
- final Broker domBroker,
- final ActorSystem actorSystem) {
+ final ActorSystem actorSystem,
+ final Timeout actorResponseWaitTime,
+ final DOMMountPointService mountPointService) {
this.id = id;
- this.salProvider = new NetconfDeviceSalProvider(id);
+ this.salProvider = new NetconfDeviceSalProvider(id, mountPointService);
this.actorSystem = actorSystem;
-
- registerToSal(domBroker);
- }
-
- private void registerToSal(final Broker domRegistryDependency) {
- domRegistryDependency.registerProvider(salProvider);
-
+ this.actorResponseWaitTime = actorResponseWaitTime;
}
public void registerSlaveMountPoint(final SchemaContext remoteSchemaContext, final DOMRpcService deviceRpc,
- final ActorRef masterActorRef) {
- final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService();
+ final DOMActionService deviceAction, final ActorRef masterActorRef) {
+ if (!registered.compareAndSet(false, true)) {
+ return;
+ }
- final NetconfDOMTransaction proxyDOMTransactions =
- new NetconfProxyDOMTransaction(id, actorSystem, masterActorRef);
+ final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService();
- final NetconfDOMDataBroker netconfDeviceDataBroker =
- new NetconfDOMDataBroker(actorSystem, id, proxyDOMTransactions);
+ final ProxyDOMDataBroker netconfDeviceDataBroker =
+ new ProxyDOMDataBroker(id, masterActorRef, actorSystem.dispatcher(), actorResponseWaitTime);
salProvider.getMountInstance().onTopologyDeviceConnected(remoteSchemaContext, netconfDeviceDataBroker,
- deviceRpc, notificationService);
+ deviceRpc, notificationService, deviceAction);
LOG.info("{}: Slave mount point registered.", id);
}
- public void unregisterSlaveMountPoint() {
- salProvider.getMountInstance().onTopologyDeviceDisconnected();
- }
-
public void close() {
- unregisterSlaveMountPoint();
- try {
- salProvider.getMountInstance().close();
- } catch (Exception exception) {
- LOG.warn("{}: Exception in closing slave sal facade: {}", id, exception);
+ if (!registered.compareAndSet(true, false)) {
+ return;
}
- }
-
+ salProvider.getMountInstance().onTopologyDeviceDisconnected();
+ LOG.info("{}: Slave mount point unregistered.", id);
+ }
}