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%2FNetconfDeviceSalProvider.java;h=7b578a35dcd980aa8c4cdba5991ad651dac9f306;hb=1d91e1bbe29d0da6ea427a5d0837064c8a3d5134;hp=278771a5ba880a97ec4e3c0eaaa2da7bdb841be4;hpb=f0821760fcf5054e0e0e8cfd3453e7cf10252757;p=netconf.git diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalProvider.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalProvider.java index 278771a5ba..7b578a35dc 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalProvider.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/sal/NetconfDeviceSalProvider.java @@ -8,60 +8,64 @@ package org.opendaylight.netconf.sal.connect.netconf.sal; import com.google.common.base.Preconditions; - -import java.util.Collection; -import java.util.Collections; - -import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -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.DOMNotificationService; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; -import org.opendaylight.controller.sal.core.api.Broker; -import org.opendaylight.controller.sal.core.api.Provider; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.Transaction; +import org.opendaylight.mdsal.binding.api.TransactionChain; +import org.opendaylight.mdsal.binding.api.TransactionChainListener; +import org.opendaylight.mdsal.dom.api.DOMActionService; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMMountPoint; +import org.opendaylight.mdsal.dom.api.DOMMountPointService; +import org.opendaylight.mdsal.dom.api.DOMNotification; +import org.opendaylight.mdsal.dom.api.DOMNotificationService; +import org.opendaylight.mdsal.dom.api.DOMRpcService; import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId; import org.opendaylight.yangtools.concepts.ObjectRegistration; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class NetconfDeviceSalProvider implements AutoCloseable, Provider, BindingAwareProvider { +public class NetconfDeviceSalProvider implements AutoCloseable { - private static final Logger logger = LoggerFactory.getLogger(NetconfDeviceSalProvider.class); + private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceSalProvider.class); private final RemoteDeviceId id; - private MountInstance mountInstance; + private final MountInstance mountInstance; + private final DataBroker dataBroker; private volatile NetconfDeviceTopologyAdapter topologyDatastoreAdapter; - private DataBroker dataBroker; - private BindingTransactionChain txChain; + private TransactionChain txChain; private final TransactionChainListener transactionChainListener = new TransactionChainListener() { @Override - public void onTransactionChainFailed(TransactionChain chain, AsyncTransaction transaction, Throwable cause) { - logger.error("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause); + public void onTransactionChainFailed(final TransactionChain chain, final Transaction transaction, + final Throwable cause) { + LOG.error("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause); chain.close(); resetTransactionChainForAdapaters(); throw new IllegalStateException(id + " TransactionChain(" + chain + ") not committed correctly", cause); } @Override - public void onTransactionChainSuccessful(TransactionChain chain) { - logger.trace("{}: TransactionChain({}) {} SUCCESSFUL", id, chain); + public void onTransactionChainSuccessful(final TransactionChain chain) { + LOG.trace("{}: TransactionChain({}) SUCCESSFUL", id, chain); } }; - public NetconfDeviceSalProvider(final RemoteDeviceId deviceId) { + public NetconfDeviceSalProvider(final RemoteDeviceId deviceId, final DOMMountPointService mountService) { + this(deviceId, mountService, null); + } + + public NetconfDeviceSalProvider(final RemoteDeviceId deviceId, final DOMMountPointService mountService, + final DataBroker dataBroker) { this.id = deviceId; + mountInstance = new MountInstance(mountService, id); + this.dataBroker = dataBroker; + if (dataBroker != null) { + txChain = Preconditions.checkNotNull(dataBroker).createTransactionChain(transactionChainListener); + topologyDatastoreAdapter = new NetconfDeviceTopologyAdapter(id, txChain); + } } public MountInstance getMountInstance() { @@ -76,83 +80,72 @@ public class NetconfDeviceSalProvider implements AutoCloseable, Provider, Bindin return topologyDatastoreAdapter; } - @Override - public void onSessionInitiated(final Broker.ProviderSession session) { - logger.debug("{}: (BI)Session with sal established {}", id, session); - - final DOMMountPointService mountService = session.getService(DOMMountPointService.class); - if (mountService != null) { - mountInstance = new MountInstance(mountService, id); - } - } - - @Override - public Collection getProviderFunctionality() { - return Collections.emptySet(); - } - - @Override - public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) { - logger.debug("{}: Session with sal established {}", id, session); - - this.dataBroker = session.getSALService(DataBroker.class); - txChain = Preconditions.checkNotNull(dataBroker).createTransactionChain(transactionChainListener); - - topologyDatastoreAdapter = new NetconfDeviceTopologyAdapter(id, txChain); - } - private void resetTransactionChainForAdapaters() { txChain = Preconditions.checkNotNull(dataBroker).createTransactionChain(transactionChainListener); topologyDatastoreAdapter.setTxChain(txChain); - logger.trace("{}: Resetting TransactionChain {}", id, txChain); + LOG.trace("{}: Resetting TransactionChain {}", id, txChain); } - public void close() throws Exception { + @Override + public void close() { mountInstance.close(); - topologyDatastoreAdapter.close(); + if (topologyDatastoreAdapter != null) { + topologyDatastoreAdapter.close(); + } topologyDatastoreAdapter = null; - txChain.close(); + if (txChain != null) { + txChain.close(); + } } - public static final class MountInstance implements AutoCloseable { + public static class MountInstance implements AutoCloseable { - private DOMMountPointService mountService; + private final DOMMountPointService mountService; private final RemoteDeviceId id; - private NetconfDeviceNotificationService notificationService; + private NetconfDeviceNotificationService notificationService; private ObjectRegistration topologyRegistration; - public MountInstance(final DOMMountPointService mountService, final RemoteDeviceId id) { + MountInstance(final DOMMountPointService mountService, final RemoteDeviceId id) { this.mountService = Preconditions.checkNotNull(mountService); this.id = Preconditions.checkNotNull(id); } - public synchronized void onTopologyDeviceConnected(final SchemaContext initialCtx, - final DOMDataBroker broker, final DOMRpcService rpc, - final NetconfDeviceNotificationService notificationService) { + public void onTopologyDeviceConnected(final SchemaContext initialCtx, + final DOMDataBroker broker, final DOMRpcService rpc, + final NetconfDeviceNotificationService newNotificationService) { + onTopologyDeviceConnected(initialCtx, broker, rpc, newNotificationService, null); + } + public synchronized void onTopologyDeviceConnected(final SchemaContext initialCtx, + final DOMDataBroker broker, final DOMRpcService rpc, + final NetconfDeviceNotificationService newNotificationService, final DOMActionService deviceAction) { Preconditions.checkNotNull(mountService, "Closed"); Preconditions.checkState(topologyRegistration == null, "Already initialized"); - final DOMMountPointService.DOMMountPointBuilder mountBuilder = mountService.createMountPoint(id.getTopologyPath()); + final DOMMountPointService.DOMMountPointBuilder mountBuilder = + mountService.createMountPoint(id.getTopologyPath()); mountBuilder.addInitialSchemaContext(initialCtx); mountBuilder.addService(DOMDataBroker.class, broker); mountBuilder.addService(DOMRpcService.class, rpc); - mountBuilder.addService(DOMNotificationService.class, notificationService); - this.notificationService = notificationService; + mountBuilder.addService(DOMNotificationService.class, newNotificationService); + if (deviceAction != null) { + mountBuilder.addService(DOMActionService.class, deviceAction); + } + this.notificationService = newNotificationService; topologyRegistration = mountBuilder.register(); - logger.debug("{}: TOPOLOGY Mountpoint exposed into MD-SAL {}", id, topologyRegistration); - + LOG.debug("{}: TOPOLOGY Mountpoint exposed into MD-SAL {}", id, topologyRegistration); } + @SuppressWarnings("checkstyle:IllegalCatch") public synchronized void onTopologyDeviceDisconnected() { - if(topologyRegistration == null) { - logger.trace("{}: Not removing TOPOLOGY mountpoint from MD-SAL, mountpoint was not registered yet", id); + if (topologyRegistration == null) { + LOG.trace("{}: Not removing TOPOLOGY mountpoint from MD-SAL, mountpoint was not registered yet", id); return; } @@ -160,21 +153,21 @@ public class NetconfDeviceSalProvider implements AutoCloseable, Provider, Bindin topologyRegistration.close(); } catch (final Exception e) { // Only log and ignore - logger.warn("Unable to unregister mount instance for {}. Ignoring exception", id.getTopologyPath(), e); + LOG.warn("Unable to unregister mount instance for {}. Ignoring exception", id.getTopologyPath(), e); } finally { - logger.debug("{}: TOPOLOGY Mountpoint removed from MD-SAL {}", id, topologyRegistration); + LOG.debug("{}: TOPOLOGY Mountpoint removed from MD-SAL {}", id, topologyRegistration); topologyRegistration = null; } } @Override - public synchronized void close() throws Exception { + public synchronized void close() { onTopologyDeviceDisconnected(); - mountService = null; } public synchronized void publish(final DOMNotification domNotification) { - Preconditions.checkNotNull(notificationService, "Device not set up yet, cannot handle notification {}", domNotification); + Preconditions.checkNotNull(notificationService, "Device not set up yet, cannot handle notification {}", + domNotification); notificationService.publishNotification(domNotification); } }