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=aaf7db911f4ca16e011395cc58609892b8e80ef6;hpb=243a7afbd100cfefc2fbca223912c561c049620b;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 aaf7db911f..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 @@ -12,9 +12,9 @@ import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.List; 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.DOMDataBroker; import org.opendaylight.mdsal.dom.api.DOMMountPointService; import org.opendaylight.mdsal.dom.api.DOMNotification; import org.opendaylight.mdsal.dom.api.DOMRpcService; @@ -22,8 +22,18 @@ 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; @@ -35,17 +45,23 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice private final RemoteDeviceId id; private final NetconfDeviceSalProvider salProvider; 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 @@ -58,13 +74,14 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice final NetconfSessionPreferences netconfSessionPreferences, final DOMRpcService deviceRpc, final DOMActionService deviceAction) { - final DOMDataBroker domBroker = + final NetconfDeviceDataBroker netconfDeviceDataBroker = new NetconfDeviceDataBroker(id, schemaContext, deviceRpc, netconfSessionPreferences); - + registerLockListener(netconfDeviceDataBroker); final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService(); salProvider.getMountInstance() - .onTopologyDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService, deviceAction); + .onTopologyDeviceConnected(schemaContext, netconfDeviceDataBroker, deviceRpc, notificationService, + deviceAction); salProvider.getTopologyDatastoreAdapter() .updateDeviceData(true, netconfSessionPreferences.getNetconfDeviceCapabilities()); } @@ -80,12 +97,14 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice 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 @@ -94,6 +113,7 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice closeGracefully(reg); } closeGracefully(salProvider); + closeLockChangeListener(); } @SuppressWarnings("checkstyle:IllegalCatch") @@ -107,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); + + } }