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=2a817db7eca43ebfeef77ab7d57fd28f1c74ad7e;hpb=f0ad1f3333cad2f943635f94182a632d291f765d;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 2a817db7ec..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 @@ -7,19 +7,33 @@ */ package org.opendaylight.netconf.sal.connect.netconf.sal; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMNotification; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.core.api.Broker; +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.yangtools.yang.common.QName; +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; @@ -30,18 +44,24 @@ 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 final List salRegistrations = Lists.newArrayList(); + private ListenerRegistration listenerRegistration = null; - public NetconfDeviceSalFacade(final RemoteDeviceId id, final Broker domBroker, final BindingAwareBroker bindingBroker) { - this.id = id; - this.salProvider = new NetconfDeviceSalProvider(id); - registerToSal(domBroker, bindingBroker); + public NetconfDeviceSalFacade(final RemoteDeviceId id, final DOMMountPointService mountPointService, + final DataBroker dataBroker, final String topologyId) { + this(id, new NetconfDeviceSalProvider(id, mountPointService, dataBroker), dataBroker, topologyId); } - public void registerToSal(final Broker domRegistryDependency, final BindingAwareBroker bindingBroker) { - domRegistryDependency.registerProvider(salProvider); - bindingBroker.registerProvider(salProvider); + @VisibleForTesting + 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 @@ -51,31 +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().onDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService); - salProvider.getDatastoreAdapter().updateDeviceState(true, netconfSessionPreferences.getModuleBasedCaps()); - 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.getDatastoreAdapter().updateDeviceState(false, Collections.emptySet()); salProvider.getTopologyDatastoreAdapter().updateDeviceData(false, new NetconfDeviceCapabilities()); - salProvider.getMountInstance().onDeviceDisconnected(); salProvider.getMountInstance().onTopologyDeviceDisconnected(); + closeLockChangeListener(); } @Override public synchronized void onDeviceFailed(final Throwable throwable) { salProvider.getTopologyDatastoreAdapter().setDeviceAsFailed(throwable); - salProvider.getMountInstance().onDeviceDisconnected(); salProvider.getMountInstance().onTopologyDeviceDisconnected(); + closeLockChangeListener(); } @Override @@ -84,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 { @@ -96,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); + + } }