X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Ftools%2Fnetconf-testtool%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftest%2Ftool%2FMdsalOperationProvider.java;h=c1b89739315ada97a411c3edad2b18c295951fc7;hb=aafa2fb9d206df54b7088f449f6e3cfc7bcae50d;hp=fd5c68946953740224500ec75278b7aa2fcf70f0;hpb=2295d50e7212d80a9bc752f655fa66790ad45022;p=netconf.git diff --git a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java index fd5c689469..c1b8973931 100644 --- a/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java +++ b/netconf/tools/netconf-testtool/src/main/java/org/opendaylight/netconf/test/tool/MdsalOperationProvider.java @@ -5,31 +5,24 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.netconf.test.tool; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collections; import java.util.EnumMap; +import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; -import org.opendaylight.controller.config.util.capability.Capability; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.broker.impl.SerializedDOMDataBroker; -import org.opendaylight.controller.md.sal.dom.store.impl.InMemoryDOMDataStoreFactory; -import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.opendaylight.controller.sal.core.spi.data.DOMStore; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMDataBroker; +import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; +import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker; +import org.opendaylight.mdsal.dom.spi.store.DOMStore; +import org.opendaylight.mdsal.dom.store.inmemory.InMemoryDOMDataStoreFactory; +import org.opendaylight.netconf.api.capability.Capability; import org.opendaylight.netconf.api.monitoring.CapabilityListener; -import org.opendaylight.netconf.impl.SessionIdProvider; -import org.opendaylight.netconf.mapping.api.NetconfOperation; -import org.opendaylight.netconf.mapping.api.NetconfOperationService; -import org.opendaylight.netconf.mapping.api.NetconfOperationServiceFactory; import org.opendaylight.netconf.mdsal.connector.CurrentSchemaContext; import org.opendaylight.netconf.mdsal.connector.TransactionProvider; import org.opendaylight.netconf.mdsal.connector.ops.Commit; @@ -39,41 +32,47 @@ import org.opendaylight.netconf.mdsal.connector.ops.Lock; import org.opendaylight.netconf.mdsal.connector.ops.Unlock; import org.opendaylight.netconf.mdsal.connector.ops.get.Get; import org.opendaylight.netconf.mdsal.connector.ops.get.GetConfig; +import org.opendaylight.netconf.server.api.SessionIdProvider; +import org.opendaylight.netconf.server.api.operations.NetconfOperation; +import org.opendaylight.netconf.server.api.operations.NetconfOperationService; +import org.opendaylight.netconf.server.api.operations.NetconfOperationServiceFactory; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.Yang; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.Schemas; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.netconf.state.schemas.Schema; +import org.opendaylight.yangtools.concepts.AbstractListenerRegistration; import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.util.concurrent.SpecialExecutors; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; +import org.opendaylight.yangtools.yang.data.api.schema.SystemMapNode; +import org.opendaylight.yangtools.yang.data.api.schema.builder.CollectionNodeBuilder; import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; +import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; +import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; import org.opendaylight.yangtools.yang.model.repo.api.YangTextSchemaSource; import org.opendaylight.yangtools.yang.model.repo.spi.SchemaSourceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; class MdsalOperationProvider implements NetconfOperationServiceFactory { - - private static final Logger LOG = LoggerFactory - .getLogger(MdsalOperationProvider.class); + private static final Logger LOG = LoggerFactory.getLogger(MdsalOperationProvider.class); private final Set caps; - private final SchemaContext schemaContext; + private final EffectiveModelContext schemaContext; private final SchemaSourceProvider sourceProvider; MdsalOperationProvider(final SessionIdProvider idProvider, final Set caps, - final SchemaContext schemaContext, + final EffectiveModelContext schemaContext, final SchemaSourceProvider sourceProvider) { this.caps = caps; this.schemaContext = schemaContext; @@ -86,137 +85,121 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { } @Override - public AutoCloseable registerCapabilityListener( - final CapabilityListener listener) { - listener.onCapabilitiesChanged(caps, Collections.emptySet()); - return () -> { - }; + public Registration registerCapabilityListener(final CapabilityListener listener) { + listener.onCapabilitiesChanged(caps, Set.of()); + return () -> { }; } @Override public NetconfOperationService createService(final String netconfSessionIdForReporting) { - return new MdsalOperationService(Long.parseLong(netconfSessionIdForReporting), schemaContext, - caps, sourceProvider); + return new MdsalOperationService(Long.parseLong(netconfSessionIdForReporting), schemaContext, caps, + sourceProvider); } static class MdsalOperationService implements NetconfOperationService { - private final long currentSessionId; - private final SchemaContext schemaContext; + private final String currentSessionId; + private final EffectiveModelContext schemaContext; private final Set caps; - private final SchemaService schemaService; + private final DOMSchemaService schemaService; private final DOMDataBroker dataBroker; private final SchemaSourceProvider sourceProvider; - MdsalOperationService(final long currentSessionId, - final SchemaContext schemaContext, + MdsalOperationService(final long currentSessionId, final EffectiveModelContext schemaContext, final Set caps, final SchemaSourceProvider sourceProvider) { - this.currentSessionId = currentSessionId; + this.currentSessionId = String.valueOf(currentSessionId); this.schemaContext = schemaContext; this.caps = caps; this.sourceProvider = sourceProvider; - this.schemaService = createSchemaService(); + schemaService = createSchemaService(); - this.dataBroker = createDataStore(schemaService, currentSessionId); + dataBroker = createDataStore(schemaService, currentSessionId); } @Override public Set getNetconfOperations() { - TransactionProvider transactionProvider = new TransactionProvider( - dataBroker, String.valueOf(currentSessionId)); - CurrentSchemaContext currentSchemaContext = new CurrentSchemaContext(schemaService, sourceProvider); - ContainerNode netconf = createNetconfState(); - YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().node(NetconfState.QNAME) - .build(); - - final DOMDataWriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - tx.put(LogicalDatastoreType.OPERATIONAL, yangInstanceIdentifier, netconf); + final DOMDataTreeWriteTransaction tx = dataBroker.newWriteOnlyTransaction(); + tx.put(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.of(NetconfState.QNAME), netconf); try { - tx.submit().checkedGet(); + tx.commit().get(); LOG.debug("Netconf state updated successfully"); - } catch (TransactionCommitFailedException e) { + } catch (InterruptedException | ExecutionException e) { LOG.warn("Unable to update netconf state", e); } - final Get get = new Get(String.valueOf(currentSessionId), currentSchemaContext, transactionProvider); - final EditConfig editConfig = new EditConfig(String.valueOf(currentSessionId), currentSchemaContext, - transactionProvider); - final GetConfig getConfig = new GetConfig(String.valueOf(currentSessionId), currentSchemaContext, - transactionProvider); - final Commit commit = new Commit(String.valueOf(currentSessionId), transactionProvider); - final Lock lock = new Lock(String.valueOf(currentSessionId)); - final Unlock unLock = new Unlock(String.valueOf(currentSessionId)); - final DiscardChanges discardChanges = new DiscardChanges( - String.valueOf(currentSessionId), transactionProvider); + TransactionProvider transactionProvider = new TransactionProvider(dataBroker, currentSessionId); + CurrentSchemaContext currentSchemaContext = CurrentSchemaContext.create(schemaService, sourceProvider); - return Sets.newHashSet(get, getConfig, - editConfig, commit, lock, unLock, discardChanges); + final Get get = new Get(currentSessionId, currentSchemaContext, transactionProvider); + final EditConfig editConfig = new EditConfig(currentSessionId, currentSchemaContext, transactionProvider); + final GetConfig getConfig = new GetConfig(currentSessionId, currentSchemaContext, transactionProvider); + final Commit commit = new Commit(currentSessionId, transactionProvider); + final Lock lock = new Lock(currentSessionId); + final Unlock unLock = new Unlock(currentSessionId); + final DiscardChanges discardChanges = new DiscardChanges(currentSessionId, transactionProvider); + + return Set.of(get, getConfig, editConfig, commit, lock, unLock, discardChanges); } @Override public void close() { + // No-op } private ContainerNode createNetconfState() { - DummyMonitoringService monitor = new DummyMonitoringService( - caps); - + final DummyMonitoringService monitor = new DummyMonitoringService(caps); final QName identifier = QName.create(Schema.QNAME, "identifier"); final QName version = QName.create(Schema.QNAME, "version"); final QName format = QName.create(Schema.QNAME, "format"); final QName location = QName.create(Schema.QNAME, "location"); final QName namespace = QName.create(Schema.QNAME, "namespace"); - CollectionNodeBuilder schemaMapEntryNodeMapNodeCollectionNodeBuilder = Builders - .mapBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(Schema.QNAME)); - LeafSetEntryNode locationLeafSetEntryNode = Builders.leafSetEntryBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeWithValue(location, "NETCONF")).withValue("NETCONF").build(); - - Map keyValues = Maps.newHashMap(); - for (final Schema schema : monitor.getSchemas().getSchema()) { + CollectionNodeBuilder schemaMapEntryNodeMapNodeCollectionNodeBuilder = + Builders.mapBuilder().withNodeIdentifier(new NodeIdentifier(Schema.QNAME)); + LeafSetNode locationLeafSet = Builders.leafSetBuilder() + .withNodeIdentifier(new NodeIdentifier(location)) + .withChild(Builders.leafSetEntryBuilder() + .withNodeIdentifier(new NodeWithValue<>(location, "NETCONF")) + .withValue("NETCONF") + .build()) + .build(); + + Map keyValues = new HashMap<>(); + for (final Schema schema : monitor.getSchemas().nonnullSchema().values()) { keyValues.put(identifier, schema.getIdentifier()); keyValues.put(version, schema.getVersion()); keyValues.put(format, Yang.QNAME); - MapEntryNode schemaMapEntryNode = Builders.mapEntryBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeIdentifierWithPredicates(Schema.QNAME, keyValues)) - .withChild(Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier( - identifier)).withValue(schema.getIdentifier()).build()) - .withChild(Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier( - version)).withValue(schema.getVersion()).build()) - .withChild(Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier( - format)).withValue(Yang.QNAME).build()) - .withChild(Builders.leafBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier( - namespace)).withValue(schema.getNamespace().getValue()).build()) - .withChild((DataContainerChild) Builders.leafSetBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeIdentifier(location)) - .withChild(locationLeafSetEntryNode).build()) - .build(); - - schemaMapEntryNodeMapNodeCollectionNodeBuilder.withChild(schemaMapEntryNode); + schemaMapEntryNodeMapNodeCollectionNodeBuilder.withChild(Builders.mapEntryBuilder() + .withNodeIdentifier(NodeIdentifierWithPredicates.of(Schema.QNAME, keyValues)) + .withChild(ImmutableNodes.leafNode(identifier, schema.getIdentifier())) + .withChild(ImmutableNodes.leafNode(version, schema.getVersion())) + .withChild(ImmutableNodes.leafNode(format, Yang.QNAME)) + .withChild(ImmutableNodes.leafNode(namespace, schema.getNamespace().getValue())) + .withChild(locationLeafSet) + .build()); } - DataContainerChild schemaList = schemaMapEntryNodeMapNodeCollectionNodeBuilder.build(); - - ContainerNode schemasContainer = Builders.containerBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeIdentifier(Schemas.QNAME)).withChild(schemaList).build(); - return Builders.containerBuilder().withNodeIdentifier( - new YangInstanceIdentifier.NodeIdentifier(NetconfState.QNAME)).withChild(schemasContainer).build(); + return Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(NetconfState.QNAME)) + .withChild(Builders.containerBuilder() + .withNodeIdentifier(new NodeIdentifier(Schemas.QNAME)) + .withChild(schemaMapEntryNodeMapNodeCollectionNodeBuilder.build()) + .build()) + .build(); } - private static DOMDataBroker createDataStore(final SchemaService schemaService, final long sessionId) { + private static DOMDataBroker createDataStore(final DOMSchemaService schemaService, final long sessionId) { LOG.debug("Session {}: Creating data stores for simulated device", sessionId); - final DOMStore operStore = InMemoryDOMDataStoreFactory - .create("DOM-OPER", schemaService); - final DOMStore configStore = InMemoryDOMDataStoreFactory - .create("DOM-CFG", schemaService); + final DOMStore operStore = InMemoryDOMDataStoreFactory.create("DOM-OPER", schemaService); + final DOMStore configStore = InMemoryDOMDataStoreFactory.create("DOM-CFG", schemaService); - ExecutorService listenableFutureExecutor = SpecialExecutors.newBlockingBoundedCachedThreadPool( - 16, 16, "CommitFutures", MdsalOperationProvider.class); + ExecutorService listenableFutureExecutor = SpecialExecutors.newBlockingBoundedCachedThreadPool(16, 16, + "CommitFutures", MdsalOperationProvider.class); final EnumMap datastores = new EnumMap<>(LogicalDatastoreType.class); datastores.put(LogicalDatastoreType.CONFIGURATION, configStore); @@ -225,46 +208,25 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { return new SerializedDOMDataBroker(datastores, MoreExecutors.listeningDecorator(listenableFutureExecutor)); } - private SchemaService createSchemaService() { - return new SchemaService() { - - @Override - public void addModule(final Module module) { - } - + private DOMSchemaService createSchemaService() { + return new DOMSchemaService() { @Override - public void removeModule(final Module module) { - - } - - @Override - public SchemaContext getSessionContext() { + public EffectiveModelContext getGlobalContext() { return schemaContext; } @Override - public SchemaContext getGlobalContext() { - return schemaContext; - } - - @Override - public ListenerRegistration registerSchemaContextListener( - final SchemaContextListener listener) { - listener.onGlobalContextUpdated(getGlobalContext()); - return new ListenerRegistration() { - @Override - public void close() { - - } - + public ListenerRegistration registerSchemaContextListener( + final EffectiveModelContextListener listener) { + listener.onModelContextUpdated(getGlobalContext()); + return new AbstractListenerRegistration<>(listener) { @Override - public SchemaContextListener getInstance() { - return listener; + protected void removeRegistration() { + // No-op } }; } }; } } - }