X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsal-netconf-connector%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fconnect%2Fnetconf%2Fsal%2FNetconfDeviceSalFacade.java;h=490bcecbd955941409a71837f850ece00b47dd16;hp=f39c4d579212984ba0e3d4d254e49d8110e31d42;hb=469a10465ebe09a9199c9316917e13dfd525e11c;hpb=63ebb308c97fc06eafe813c347f9c8d7cde541eb diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalFacade.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalFacade.java index f39c4d5792..490bcecbd9 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalFacade.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/sal/NetconfDeviceSalFacade.java @@ -7,105 +7,74 @@ */ package org.opendaylight.controller.sal.connect.netconf.sal; -import com.google.common.collect.Maps; -import java.util.Collections; +import com.google.common.collect.Lists; import java.util.List; -import java.util.Map; - -import java.util.concurrent.ExecutorService; +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.connect.api.RemoteDeviceHandler; -import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionCapabilities; +import org.opendaylight.controller.sal.connect.netconf.listener.NetconfDeviceCapabilities; +import org.opendaylight.controller.sal.connect.netconf.listener.NetconfSessionPreferences; import org.opendaylight.controller.sal.connect.util.RemoteDeviceId; import org.opendaylight.controller.sal.core.api.Broker; -import org.opendaylight.controller.sal.core.api.RpcImplementation; -import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.CompositeNode; -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider; -import org.osgi.framework.BundleContext; +import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.Lists; +public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDeviceHandler { -public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDeviceHandler { - - private static final Logger logger= LoggerFactory.getLogger(NetconfDeviceTwoPhaseCommitTransaction.class); - private static final InstanceIdentifier ROOT_PATH = InstanceIdentifier.builder().toInstance(); + private static final Logger logger= LoggerFactory.getLogger(NetconfDeviceSalFacade.class); private final RemoteDeviceId id; private final NetconfDeviceSalProvider salProvider; + private final long defaultRequestTimeoutMillis; private final List salRegistrations = Lists.newArrayList(); - public NetconfDeviceSalFacade(final RemoteDeviceId id, final Broker domBroker, final BindingAwareBroker bindingBroker, final BundleContext bundleContext, final ExecutorService executor) { + public NetconfDeviceSalFacade(final RemoteDeviceId id, final Broker domBroker, final BindingAwareBroker bindingBroker, long defaultRequestTimeoutMillis) { this.id = id; - this.salProvider = new NetconfDeviceSalProvider(id, executor); - registerToSal(domBroker, bindingBroker, bundleContext); + this.salProvider = new NetconfDeviceSalProvider(id); + this.defaultRequestTimeoutMillis = defaultRequestTimeoutMillis; + registerToSal(domBroker, bindingBroker); } - public void registerToSal(final Broker domRegistryDependency, final BindingAwareBroker bindingBroker, final BundleContext bundleContext) { - domRegistryDependency.registerProvider(salProvider, bundleContext); - bindingBroker.registerProvider(salProvider, bundleContext); + public void registerToSal(final Broker domRegistryDependency, final BindingAwareBroker bindingBroker) { + domRegistryDependency.registerProvider(salProvider); + bindingBroker.registerProvider(salProvider); } @Override - public synchronized void onNotification(final CompositeNode domNotification) { + public synchronized void onNotification(final DOMNotification domNotification) { salProvider.getMountInstance().publish(domNotification); } @Override - public synchronized void onDeviceConnected(final SchemaContextProvider remoteSchemaContextProvider, - final NetconfSessionCapabilities netconfSessionPreferences, final RpcImplementation deviceRpc) { - salProvider.getMountInstance().setSchemaContext(remoteSchemaContextProvider.getSchemaContext()); - salProvider.getDatastoreAdapter().updateDeviceState(true, netconfSessionPreferences.getModuleBasedCaps()); - registerDataHandlersToSal(deviceRpc, netconfSessionPreferences); - registerRpcsToSal(deviceRpc); - } + public synchronized void onDeviceConnected(final SchemaContext schemaContext, + final NetconfSessionPreferences netconfSessionPreferences, final DOMRpcService deviceRpc) { - @Override - public void onDeviceDisconnected() { - salProvider.getDatastoreAdapter().updateDeviceState(false, Collections.emptySet()); - } + final DOMDataBroker domBroker = new NetconfDeviceDataBroker(id, schemaContext, deviceRpc, netconfSessionPreferences, defaultRequestTimeoutMillis); - private void registerRpcsToSal(final RpcImplementation deviceRpc) { - final MountProvisionInstance mountInstance = salProvider.getMountInstance(); + final NetconfDeviceNotificationService notificationService = new NetconfDeviceNotificationService(); - final Map failedRpcs = Maps.newHashMap(); - for (final RpcDefinition rpcDef : mountInstance.getSchemaContext().getOperations()) { - try { - salRegistrations.add(mountInstance.addRpcImplementation(rpcDef.getQName(), deviceRpc)); - logger.debug("{}: Rpc {} from netconf registered successfully", id, rpcDef.getQName()); - } catch (final Exception e) { - // Only debug per rpc, warn for all of them at the end to pollute log a little less (e.g. routed rpcs) - logger.debug("{}: Unable to register rpc {} from netconf device. This rpc will not be available", id, - rpcDef.getQName(), e); - failedRpcs.put(rpcDef.getQName(), e.getClass() + ":" + e.getMessage()); - } - } - - if (failedRpcs.isEmpty() == false) { - logger.warn("{}: Some rpcs from netconf device were not registered: {}", id, failedRpcs); - } + salProvider.getMountInstance().onTopologyDeviceConnected(schemaContext, domBroker, deviceRpc, notificationService); + salProvider.getTopologyDatastoreAdapter().updateDeviceData(true, netconfSessionPreferences.getNetconfDeviceCapabilities()); } - private void registerDataHandlersToSal(final RpcImplementation deviceRpc, - final NetconfSessionCapabilities netconfSessionPreferences) { - final NetconfDeviceDataReader dataReader = new NetconfDeviceDataReader(id, deviceRpc); - final NetconfDeviceCommitHandler commitHandler = new NetconfDeviceCommitHandler(id, deviceRpc, - netconfSessionPreferences.isRollbackSupported()); + @Override + public synchronized void onDeviceDisconnected() { + salProvider.getTopologyDatastoreAdapter().updateDeviceData(false, new NetconfDeviceCapabilities()); + salProvider.getMountInstance().onTopologyDeviceDisconnected(); + } - final MountProvisionInstance mountInstance = salProvider.getMountInstance(); - salRegistrations.add(mountInstance.registerConfigurationReader(ROOT_PATH, dataReader)); - salRegistrations.add(mountInstance.registerOperationalReader(ROOT_PATH, dataReader)); - salRegistrations.add(mountInstance.registerCommitHandler(ROOT_PATH, commitHandler)); + @Override + public synchronized void onDeviceFailed(final Throwable throwable) { + salProvider.getTopologyDatastoreAdapter().setDeviceAsFailed(throwable); + salProvider.getMountInstance().onTopologyDeviceDisconnected(); } @Override - public void close() { + public synchronized void close() { for (final AutoCloseable reg : Lists.reverse(salRegistrations)) { closeGracefully(reg); } @@ -121,4 +90,5 @@ public final class NetconfDeviceSalFacade implements AutoCloseable, RemoteDevice } } } + }