X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceSalProvider.java;h=6b96e25fae479770f21d22ccc973d5683e51164c;hb=469a10465ebe09a9199c9316917e13dfd525e11c;hp=01af84c9acf72057ec02b4b9123525f81cf00cd7;hpb=bee5972562efede5581a4655b439023837aa261c;p=controller.git diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalProvider.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalProvider.java index 01af84c9ac..6b96e25fae 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalProvider.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalProvider.java @@ -7,58 +7,59 @@ */ package org.opendaylight.controller.sal.connect.netconf.sal; +import com.google.common.base.Preconditions; import java.util.Collection; import java.util.Collections; - -import java.util.concurrent.ExecutorService; +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.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.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.controller.sal.core.api.Broker; import org.opendaylight.controller.sal.core.api.Provider; -import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; -import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; -import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.concepts.ObjectRegistration; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Preconditions; - final class NetconfDeviceSalProvider implements AutoCloseable, Provider, BindingAwareProvider { private static final Logger logger = LoggerFactory.getLogger(NetconfDeviceSalProvider.class); private final RemoteDeviceId id; - private final ExecutorService executor; - private volatile MountProvisionInstance mountInstance; - private volatile NetconfDeviceDatastoreAdapter datastoreAdapter; + private MountInstance mountInstance; + + private volatile NetconfDeviceTopologyAdapter topologyDatastoreAdapter; - public NetconfDeviceSalProvider(final RemoteDeviceId deviceId, final ExecutorService executor) { + public NetconfDeviceSalProvider(final RemoteDeviceId deviceId) { this.id = deviceId; - this.executor = executor; } - public MountProvisionInstance getMountInstance() { + public MountInstance getMountInstance() { Preconditions.checkState(mountInstance != null, - "%s: Sal provider was not initialized by sal. Cannot publish notification", id); + "%s: Mount instance was not initialized by sal. Cannot get mount instance", id); return mountInstance; } - public NetconfDeviceDatastoreAdapter getDatastoreAdapter() { - Preconditions.checkState(datastoreAdapter != null, - "%s: Sal provider %s was not initialized by sal. Cannot publish notification", id); - return datastoreAdapter; + public NetconfDeviceTopologyAdapter getTopologyDatastoreAdapter() { + Preconditions.checkState(topologyDatastoreAdapter != null, + "%s: Sal provider %s was not initialized by sal. Cannot get topology datastore adapter", id); + return topologyDatastoreAdapter; } @Override public void onSessionInitiated(final Broker.ProviderSession session) { - final MountProvisionService mountService = session.getService(MountProvisionService.class); + logger.debug("{}: (BI)Session with sal established {}", id, session); + + final DOMMountPointService mountService = session.getService(DOMMountPointService.class); if (mountService != null) { - mountInstance = mountService.createOrGetMountPoint(id.getPath()); + mountInstance = new MountInstance(mountService, id); } - - logger.debug("{}: (BI)Session with sal established {}", id, session); } @Override @@ -67,31 +68,80 @@ final class NetconfDeviceSalProvider implements AutoCloseable, Provider, Binding } @Override - public Collection getImplementations() { - return Collections.emptySet(); + public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) { + logger.debug("{}: Session with sal established {}", id, session); + + final DataBroker dataBroker = session.getSALService(DataBroker.class); + + topologyDatastoreAdapter = new NetconfDeviceTopologyAdapter(id, dataBroker); } - @Override - public Collection getFunctionality() { - return Collections.emptySet(); + public void close() throws Exception { + mountInstance.close(); + topologyDatastoreAdapter.close(); + topologyDatastoreAdapter = null; } - @Override - public void onSessionInitiated(final BindingAwareBroker.ProviderContext session) { - final DataProviderService dataBroker = session.getSALService(DataProviderService.class); - datastoreAdapter = new NetconfDeviceDatastoreAdapter(id, dataBroker, executor); + static final class MountInstance implements AutoCloseable { - logger.debug("{}: Session with sal established {}", id, session); - } + private DOMMountPointService mountService; + private final RemoteDeviceId id; + private NetconfDeviceNotificationService notificationService; - @Override - public void onSessionInitialized(final BindingAwareBroker.ConsumerContext session) { - } + private ObjectRegistration topologyRegistration; - public void close() throws Exception { - mountInstance = null; - datastoreAdapter.close(); - datastoreAdapter = null; + MountInstance(final DOMMountPointService mountService, final RemoteDeviceId id) { + this.mountService = Preconditions.checkNotNull(mountService); + this.id = Preconditions.checkNotNull(id); + } + + synchronized void onTopologyDeviceConnected(final SchemaContext initialCtx, + final DOMDataBroker broker, final DOMRpcService rpc, + final NetconfDeviceNotificationService notificationService) { + + Preconditions.checkNotNull(mountService, "Closed"); + Preconditions.checkState(topologyRegistration == null, "Already initialized"); + + 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; + + topologyRegistration = mountBuilder.register(); + logger.debug("{}: TOPOLOGY Mountpoint exposed into MD-SAL {}", id, topologyRegistration); + + } + + synchronized void onTopologyDeviceDisconnected() { + if(topologyRegistration == null) { + logger.trace("{}: Not removing TOPOLOGY mountpoint from MD-SAL, mountpoint was not registered yet", id); + return; + } + + try { + topologyRegistration.close(); + } catch (final Exception e) { + // Only log and ignore + logger.warn("Unable to unregister mount instance for {}. Ignoring exception", id.getTopologyPath(), e); + } finally { + logger.debug("{}: TOPOLOGY Mountpoint removed from MD-SAL {}", id, topologyRegistration); + topologyRegistration = null; + } + } + + @Override + synchronized public void close() throws Exception { + onTopologyDeviceDisconnected(); + mountService = null; + } + + public synchronized void publish(final DOMNotification domNotification) { + Preconditions.checkNotNull(notificationService, "Device not set up yet, cannot handle notification {}", domNotification); + notificationService.publishNotification(domNotification); + } } }