X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceSalFacade.java;h=845378e5e95084bf0c62b8c30eb920ef006e0fab;hb=a0833fb27c69d919a4420c6ecbd11a3b2a1119cb;hp=a6ffe7aeb18823c68f64db619a5ac33bd427f828;hpb=e1bdc7d1eff9c117a0e3c4559f5e8a0595f53a3f;p=netconf.git diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalFacade.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalFacade.java index a6ffe7aeb1..845378e5e9 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalFacade.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalFacade.java @@ -9,16 +9,31 @@ package org.opendaylight.netconf.sal.connect.netconf.sal; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; +import java.util.ArrayList; import java.util.List; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; -import org.opendaylight.controller.md.sal.dom.api.DOMNotification; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMActionService; +import org.opendaylight.mdsal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.netconf.sal.connect.api.RemoteDeviceHandler; import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities; import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.NetconfNodeFieldsOptional; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.fields.optional.Topology; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.fields.optional.TopologyKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.fields.optional.topology.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.fields.optional.topology.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev190614.netconf.node.fields.optional.topology.node.DatastoreLock; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId; +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -29,18 +44,24 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice private final RemoteDeviceId id; private final NetconfDeviceSalProvider salProvider; - private final List salRegistrations = Lists.newArrayList(); + private final List salRegistrations = new ArrayList<>(); + private final DataBroker dataBroker; + private final String topologyId; + + private ListenerRegistration listenerRegistration = null; public NetconfDeviceSalFacade(final RemoteDeviceId id, final DOMMountPointService mountPointService, - final DataBroker dataBroker) { - this.id = id; - this.salProvider = new NetconfDeviceSalProvider(id, mountPointService, dataBroker); + final DataBroker dataBroker, final String topologyId) { + this(id, new NetconfDeviceSalProvider(id, mountPointService, dataBroker), dataBroker, topologyId); } @VisibleForTesting - NetconfDeviceSalFacade(final RemoteDeviceId id, final NetconfDeviceSalProvider salProvider) { + NetconfDeviceSalFacade(final RemoteDeviceId id, final NetconfDeviceSalProvider salProvider, + final DataBroker dataBroker, final String topologyId) { this.id = id; this.salProvider = salProvider; + this.dataBroker = dataBroker; + this.topologyId = topologyId; } @Override @@ -50,26 +71,40 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice @Override public synchronized void onDeviceConnected(final SchemaContext schemaContext, - final NetconfSessionPreferences netconfSessionPreferences, final DOMRpcService deviceRpc) { - - final DOMDataBroker domBroker = new NetconfDeviceDataBroker(id, schemaContext, deviceRpc, netconfSessionPreferences); + final NetconfSessionPreferences netconfSessionPreferences, + final DOMRpcService deviceRpc, final DOMActionService deviceAction) { + final NetconfDeviceDataBroker netconfDeviceDataBroker = + new NetconfDeviceDataBroker(id, schemaContext, deviceRpc, netconfSessionPreferences); + registerLockListener(netconfDeviceDataBroker); final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService(); - salProvider.getMountInstance().onTopologyDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService); - salProvider.getTopologyDatastoreAdapter().updateDeviceData(true, netconfSessionPreferences.getNetconfDeviceCapabilities()); + salProvider.getMountInstance() + .onTopologyDeviceConnected(schemaContext, netconfDeviceDataBroker, deviceRpc, notificationService, + deviceAction); + salProvider.getTopologyDatastoreAdapter() + .updateDeviceData(true, netconfSessionPreferences.getNetconfDeviceCapabilities()); + } + + @Override + public synchronized void onDeviceReconnected(final NetconfSessionPreferences netconfSessionPreferences, + final NetconfNode node) { + this.salProvider.getTopologyDatastoreAdapter().updateDeviceData(ConnectionStatus.Connecting, + netconfSessionPreferences.getNetconfDeviceCapabilities(), LogicalDatastoreType.CONFIGURATION, node); } @Override public synchronized void onDeviceDisconnected() { salProvider.getTopologyDatastoreAdapter().updateDeviceData(false, new NetconfDeviceCapabilities()); salProvider.getMountInstance().onTopologyDeviceDisconnected(); + closeLockChangeListener(); } @Override public synchronized void onDeviceFailed(final Throwable throwable) { salProvider.getTopologyDatastoreAdapter().setDeviceAsFailed(throwable); salProvider.getMountInstance().onTopologyDeviceDisconnected(); + closeLockChangeListener(); } @Override @@ -78,8 +113,10 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice closeGracefully(reg); } closeGracefully(salProvider); + closeLockChangeListener(); } + @SuppressWarnings("checkstyle:IllegalCatch") private void closeGracefully(final AutoCloseable resource) { if (resource != null) { try { @@ -90,4 +127,23 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice } } + private void closeLockChangeListener() { + if (listenerRegistration != null) { + listenerRegistration.close(); + } + } + + private void registerLockListener(final NetconfDeviceDataBroker netconfDeviceDataBroker) { + listenerRegistration = dataBroker.registerDataTreeChangeListener( + DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, createTopologyListPath()), + new LockChangeListener(netconfDeviceDataBroker)); + } + + private InstanceIdentifier createTopologyListPath() { + return InstanceIdentifier.create(NetconfNodeFieldsOptional.class) + .child(Topology.class, new TopologyKey(new TopologyId(topologyId))) + .child(Node.class, new NodeKey(new NodeId(id.getName()))) + .child(DatastoreLock.class); + + } }