From d9f3b7bd66f2a4937dc47a4b99ccb14ebc248d78 Mon Sep 17 00:00:00 2001 From: Yaroslav Lastivka Date: Wed, 2 Aug 2023 13:39:07 +0300 Subject: [PATCH] Enable usage of yanglib-mdsal-writer Added new feature 'odl-yanglib-mdsal-writer'. The 'mdsal-netconf-yang-library' module has been deleted, and the usage of 'odl-yanglib-mdsal-writer' has been replaced. JIRA: NETCONF-668 Change-Id: I79d5637f93391f93c1bea9e7da94f566abeb81e3 Signed-off-by: Yaroslav Lastivka Signed-off-by: Ruslan Kashapov --- artifacts/pom.xml | 7 + features/odl-netconf-mdsal/pom.xml | 6 +- features/odl-restconf-nb/pom.xml | 6 + features/odl-yanglib-mdsal-writer/pom.xml | 42 +++ .../src/main/feature/feature.xml | 14 + features/pom.xml | 1 + netconf/mdsal-netconf-yang-library/pom.xml | 64 ---- .../mdsal/yang/library/YangLibraryWriter.java | 254 ---------------- .../AbstractYangLibraryWriterTest.java | 74 ----- .../mdsal/yang/library/ModulesStateTest.java | 52 ---- .../mdsal/yang/library/YangLibraryTest.java | 82 ----- .../src/test/resources/ietf-yang-library.yang | 11 - .../src/test/resources/test-module.yang | 20 -- .../src/test/resources/test-submodule.yang | 9 - netconf/pom.xml | 1 - .../rfc8040/legacy/SchemaContextHandler.java | 285 ------------------ .../legacy/SchemaContextHandlerTest.java | 107 ------- .../monitoring/RestconfStateStreamsTest.java | 16 - 18 files changed, 74 insertions(+), 977 deletions(-) create mode 100644 features/odl-yanglib-mdsal-writer/pom.xml create mode 100644 features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml delete mode 100644 netconf/mdsal-netconf-yang-library/pom.xml delete mode 100644 netconf/mdsal-netconf-yang-library/src/main/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryWriter.java delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/AbstractYangLibraryWriterTest.java delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/ModulesStateTest.java delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryTest.java delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/resources/ietf-yang-library.yang delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/resources/test-module.yang delete mode 100644 netconf/mdsal-netconf-yang-library/src/test/resources/test-submodule.yang delete mode 100644 restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandler.java delete mode 100644 restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandlerTest.java diff --git a/artifacts/pom.xml b/artifacts/pom.xml index 502893a9f0..4bb60acbba 100644 --- a/artifacts/pom.xml +++ b/artifacts/pom.xml @@ -500,6 +500,13 @@ xml features + + ${project.groupId} + odl-yanglib-mdsal-writer + ${project.version} + xml + features + diff --git a/features/odl-netconf-mdsal/pom.xml b/features/odl-netconf-mdsal/pom.xml index 05feda33b8..628b926288 100644 --- a/features/odl-netconf-mdsal/pom.xml +++ b/features/odl-netconf-mdsal/pom.xml @@ -41,11 +41,13 @@ org.opendaylight.netconf - netconf-server-mdsal + odl-yanglib-mdsal-writer + xml + features org.opendaylight.netconf - mdsal-netconf-yang-library + netconf-server-mdsal org.opendaylight.netconf diff --git a/features/odl-restconf-nb/pom.xml b/features/odl-restconf-nb/pom.xml index 6c99fa6d2f..4f997a375d 100644 --- a/features/odl-restconf-nb/pom.xml +++ b/features/odl-restconf-nb/pom.xml @@ -45,6 +45,12 @@ xml features + + org.opendaylight.netconf + odl-yanglib-mdsal-writer + xml + features + org.opendaylight.netconf restconf-nb diff --git a/features/odl-yanglib-mdsal-writer/pom.xml b/features/odl-yanglib-mdsal-writer/pom.xml new file mode 100644 index 0000000000..337aaaf911 --- /dev/null +++ b/features/odl-yanglib-mdsal-writer/pom.xml @@ -0,0 +1,42 @@ + + + + 4.0.0 + + org.opendaylight.netconf + feature-parent + 7.0.0-SNAPSHOT + ../parent + + + odl-yanglib-mdsal-writer + feature + + + + org.opendaylight.mdsal.model + odl-mdsal-model-rfc8525 + xml + features + + + org.opendaylight.controller + odl-mdsal-broker + xml + features + + + org.opendaylight.netconf + yanglib-mdsal-writer + ${project.version} + + + diff --git a/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml b/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml new file mode 100644 index 0000000000..49a66f7f07 --- /dev/null +++ b/features/odl-yanglib-mdsal-writer/src/main/feature/feature.xml @@ -0,0 +1,14 @@ + + + + + odl-mdsal-model-rfc8525 + odl-mdsal-broker + + diff --git a/features/pom.xml b/features/pom.xml index fb3a04b379..1033d93aa2 100644 --- a/features/pom.xml +++ b/features/pom.xml @@ -69,5 +69,6 @@ odl-restconf odl-restconf-nb odl-yanglib + odl-yanglib-mdsal-writer diff --git a/netconf/mdsal-netconf-yang-library/pom.xml b/netconf/mdsal-netconf-yang-library/pom.xml deleted file mode 100644 index e43599cb14..0000000000 --- a/netconf/mdsal-netconf-yang-library/pom.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - 4.0.0 - - - org.opendaylight.netconf - netconf-parent - 7.0.0-SNAPSHOT - ../../parent - - - mdsal-netconf-yang-library - ${project.artifactId} - bundle - - - - com.google.guava - guava - - - org.opendaylight.mdsal - mdsal-dom-api - - - org.opendaylight.mdsal - mdsal-binding-api - - - org.opendaylight.mdsal.binding.model.ietf - rfc6991-ietf-inet-types - - - org.opendaylight.mdsal.binding.model.ietf - rfc8525 - - - org.osgi - org.osgi.service.component.annotations - - - com.guicedee.services - javax.inject - true - - - jakarta.annotation - jakarta.annotation-api - true - - - - org.opendaylight.yangtools - yang-test-util - - - diff --git a/netconf/mdsal-netconf-yang-library/src/main/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryWriter.java b/netconf/mdsal-netconf-yang-library/src/main/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryWriter.java deleted file mode 100644 index e30d407215..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/main/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryWriter.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.mdsal.yang.library; - -import static java.util.Objects.requireNonNull; - -import com.google.common.util.concurrent.FluentFuture; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.MoreExecutors; -import java.util.Collection; -import java.util.Set; -import java.util.concurrent.ExecutionException; -import java.util.stream.Collectors; -import javax.annotation.PreDestroy; -import javax.inject.Inject; -import javax.inject.Singleton; -import org.checkerframework.checker.lock.qual.GuardedBy; -import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.WriteTransaction; -import org.opendaylight.mdsal.common.api.CommitInfo; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.datastores.rev180214.Operational; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.LegacyRevisionUtils; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionUtils; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module.ConformanceType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.module.SubmoduleBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.DatastoreBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSetBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.SchemaBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier; -import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingMap; -import org.opendaylight.yangtools.yang.common.Revision; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.ModuleLike; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Listens for updates on global schema context, transforms context to ietf-yang-library/yang-library and writes this - * state to operational data store. - */ -@Singleton -@Component(immediate = true, service = {}) -public final class YangLibraryWriter implements EffectiveModelContextListener, AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(YangLibraryWriter.class); - private static final String MODULE_SET_NAME = "state-modules"; - private static final String SCHEMA_NAME = "state-schema"; - - private static final InstanceIdentifier YANG_LIBRARY_INSTANCE_IDENTIFIER = - InstanceIdentifier.create(YangLibrary.class); - @Deprecated - private static final InstanceIdentifier MODULES_STATE_INSTANCE_IDENTIFIER = - InstanceIdentifier.create(ModulesState.class); - - private final DataBroker dataBroker; - @GuardedBy("this") - private long moduleSetId; - @GuardedBy("this") - private Registration reg; - - @Inject - @Activate - public YangLibraryWriter(final @Reference DOMSchemaService schemaService, - final @Reference DataBroker dataBroker) { - this.dataBroker = requireNonNull(dataBroker); - reg = schemaService.registerSchemaContextListener(this); - } - - @Deactivate - @PreDestroy - @Override - public synchronized void close() throws InterruptedException, ExecutionException { - if (reg == null) { - // Already shut down - return; - } - - reg.close(); - reg = null; - - // FIXME: we should be using a transaction chain for this, but, really, this should be a dynamically-populated - // shard (i.e. no storage whatsoever)! - final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - tx.delete(LogicalDatastoreType.OPERATIONAL, YANG_LIBRARY_INSTANCE_IDENTIFIER); - tx.delete(LogicalDatastoreType.OPERATIONAL, MODULES_STATE_INSTANCE_IDENTIFIER); - - final FluentFuture future = tx.commit(); - future.addCallback(new FutureCallback() { - @Override - public void onSuccess(final CommitInfo info) { - LOG.debug("YANG library cleared successfully"); - } - - @Override - public void onFailure(final Throwable throwable) { - LOG.warn("Unable to clear YANG library", throwable); - } - }, MoreExecutors.directExecutor()); - - // We need to synchronize here, otherwise we'd end up trampling over ourselves - future.get(); - } - - @Override - public void onModelContextUpdated(final EffectiveModelContext context) { - final Module ietfYangLibraryModule = context.findModule(YangLibrary.QNAME.getModule()).orElse(null); - if (ietfYangLibraryModule != null) { - updateYangLibrary(context); - } else { - LOG.debug("ietf-yang-library not present in context, skipping update"); - } - } - - private synchronized void updateYangLibrary(final EffectiveModelContext context) { - if (reg == null) { - // Already shut down, do not do anything - return; - } - - final long currentSetId = moduleSetId++; - - final YangLibrary newYangLibrary = createYangLibraryFromContext(context.getModules(), currentSetId); - final ModulesState newModuleState = createModuleStateFromModules(context.getModules(), currentSetId); - LOG.debug("Trying to write new yang-library: {}", newYangLibrary); - LOG.debug("Trying to write new module-state: {}", newModuleState); - - final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); - tx.put(LogicalDatastoreType.OPERATIONAL, YANG_LIBRARY_INSTANCE_IDENTIFIER, newYangLibrary); - tx.put(LogicalDatastoreType.OPERATIONAL, MODULES_STATE_INSTANCE_IDENTIFIER, newModuleState); - tx.commit().addCallback(new FutureCallback() { - @Override - public void onSuccess(final CommitInfo result) { - LOG.debug("Yang library updated successfully"); - } - - @Override - public void onFailure(final Throwable throwable) { - LOG.warn("Failed to update yang library", throwable); - } - }, MoreExecutors.directExecutor()); - } - - private static YangLibrary createYangLibraryFromContext(final Collection modules, - final long moduleSetId) { - final var moduleMap = modules.stream() - .map(module -> { - final var submoduleMap = module.getSubmodules().stream() - .map(subModule -> new SubmoduleBuilder() - .setName(new YangIdentifier(subModule.getName())) - .setRevision(RevisionUtils.fromYangCommon(subModule.getQNameModule().getRevision()) - .getRevisionIdentifier()) - .build()) - .collect(BindingMap.toMap()); - - return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library - .rev190104.module.set.parameters.ModuleBuilder() - .setName(new YangIdentifier(module.getName() + "_" - // FIXME: 'orElse' seems to be wrong here - + module.getRevision().map(Revision::toString).orElse(null))) - .setRevision(RevisionUtils.fromYangCommon(module.getQNameModule().getRevision()) - .getRevisionIdentifier()) - .setNamespace(new Uri(module.getNamespace().toString())) - .setFeature(extractFeatures(module)) - // FIXME: inline this once it's disambiguated - .setSubmodule(submoduleMap) - .build(); - }) - .collect(BindingMap.toMap()); - - return new YangLibraryBuilder() - .setModuleSet(BindingMap.of(new ModuleSetBuilder() - .setName(MODULE_SET_NAME) - // FIXME: inline this once it's disambiguated - .setModule(moduleMap) - .build())) - .setSchema(BindingMap.of(new SchemaBuilder() - .setName(SCHEMA_NAME) - .setModuleSet(Set.of(MODULE_SET_NAME)) - .build())) - .setDatastore(BindingMap.of(new DatastoreBuilder() - .setName(Operational.VALUE) - .setSchema(SCHEMA_NAME) - .build())) - .setContentId(String.valueOf(moduleSetId)) - .build(); - } - - @Deprecated - private static ModulesState createModuleStateFromModules(final Collection modules, - final long moduleSetId) { - final var moduleMap = modules.stream() - .map(module -> { - final var submoduleMap = module.getSubmodules().stream() - .map(subModule -> new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library - .rev190104.module.list.module.SubmoduleBuilder() - .setName(new YangIdentifier(subModule.getName())) - .setRevision(LegacyRevisionUtils.fromYangCommon(subModule.getQNameModule() - .getRevision())) - .build()) - .collect(BindingMap.toMap()); - - return new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library - .rev190104.module.list.ModuleBuilder() - .setName(new YangIdentifier(module.getName())) - .setRevision(LegacyRevisionUtils.fromYangCommon(module.getQNameModule().getRevision())) - .setNamespace(new Uri(module.getNamespace().toString())) - // FIXME: Conformance type is always set to Implement value, but it should it really be like this? - .setConformanceType(ConformanceType.Implement) - // FIXME: inline this once it's disambiguated - .setSubmodule(submoduleMap) - .setFeature(extractFeatures(module)) - // FIXME: Add also deviations to module entries - .build(); - }) - .collect(BindingMap.toMap()); - - return new ModulesStateBuilder() - // FIXME: inline this once it's disambiguated - .setModule(moduleMap) - .setModuleSetId(String.valueOf(moduleSetId)) - .build(); - } - - private static Set extractFeatures(final ModuleLike module) { - final var namespace = module.getQNameModule(); - - return module.getFeatures().stream() - .map(FeatureDefinition::getQName) - // belt-and-suspenders: make sure the feature namespace matches - .filter(featureName -> namespace.equals(featureName.getModule())) - .map(featureName -> new YangIdentifier(featureName.getLocalName())) - .collect(Collectors.toUnmodifiableSet()); - } -} diff --git a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/AbstractYangLibraryWriterTest.java b/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/AbstractYangLibraryWriterTest.java deleted file mode 100644 index b3a4f66197..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/AbstractYangLibraryWriterTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.mdsal.yang.library; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.opendaylight.mdsal.binding.api.DataBroker; -import org.opendaylight.mdsal.binding.api.WriteTransaction; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.binding.DataObject; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; - -public abstract class AbstractYangLibraryWriterTest { - @Mock - private DOMSchemaService schemaService; - @Mock - private DataBroker dataBroker; - @Mock - private WriteTransaction writeTransaction; - - YangLibraryWriter writer; - - @Before - public void setUp() { - doReturn(writeTransaction).when(dataBroker).newWriteOnlyTransaction(); - doNothing().when(writeTransaction).put(eq(LogicalDatastoreType.OPERATIONAL), any(), any()); - doReturn(emptyFluentFuture()).when(writeTransaction).commit(); - // FIXME: use a mock for this - doReturn(new ListenerRegistration() { - @Override - public void close() { - - } - - @Override - public EffectiveModelContextListener getInstance() { - return null; - } - }).when(schemaService).registerSchemaContextListener(any()); - writer = new YangLibraryWriter(schemaService, dataBroker); - } - - @Test - public void testNoUpdate() { - writer.onModelContextUpdated(YangParserTestUtils.parseYangResources(YangLibraryTest.class, - "/test-module.yang", "/test-submodule.yang")); - verifyNoInteractions(dataBroker); - } - - final void assertOperationalUpdate(final InstanceIdentifier path, final T object) { - writer.onModelContextUpdated(YangParserTestUtils.parseYangResources(YangLibraryTest.class, - "/test-module.yang", "/test-submodule.yang", "/ietf-yang-library.yang")); - verify(writeTransaction).put(LogicalDatastoreType.OPERATIONAL, path, object); - verify(writeTransaction).commit(); - } -} diff --git a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/ModulesStateTest.java b/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/ModulesStateTest.java deleted file mode 100644 index 1bdf65b1c7..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/ModulesStateTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.mdsal.yang.library; - -import java.util.Set; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.LegacyRevisionUtils; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesStateBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.CommonLeafs.Revision; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.ModuleBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.SubmoduleBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingMap; - -@RunWith(MockitoJUnitRunner.StrictStubs.class) -public class ModulesStateTest extends AbstractYangLibraryWriterTest { - @Test - public void testUpdate() { - assertOperationalUpdate(InstanceIdentifier.create(ModulesState.class), new ModulesStateBuilder() - .setModuleSetId("0") - .setModule(BindingMap.of(new ModuleBuilder() - .setName(new YangIdentifier("test-module")) - .setNamespace(new Uri("test:namespace")) - .setRevision(new Revision(new RevisionIdentifier("2013-07-22"))) - .setSubmodule(BindingMap.of(new SubmoduleBuilder() - .setName(new YangIdentifier("test-submodule")) - .setRevision(LegacyRevisionUtils.emptyRevision()) - .build())) - .setConformanceType(Module.ConformanceType.Implement) - .setFeature(Set.of()) - .build(), new ModuleBuilder() - .setName(new YangIdentifier("ietf-yang-library")) - .setNamespace(new Uri("urn:ietf:params:xml:ns:yang:ietf-yang-library")) - .setRevision(new Revision(new RevisionIdentifier("2019-01-04"))) - .setConformanceType(Module.ConformanceType.Implement) - .setFeature(Set.of()) - .build())) - .build()); - } -} diff --git a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryTest.java b/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryTest.java deleted file mode 100644 index b73f488daf..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/java/org/opendaylight/netconf/mdsal/yang/library/YangLibraryTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2020 Pantheon Technologies s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.mdsal.yang.library; - -import com.google.common.collect.ImmutableMap; -import java.util.Set; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.junit.MockitoJUnitRunner; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.datastores.rev180214.Operational; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionIdentifier; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.RevisionUtils; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibraryBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.Module; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.ModuleBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.module.Submodule; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.set.parameters.module.SubmoduleBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.Datastore; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.DatastoreBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSet; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.ModuleSetBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.Schema; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.yang.library.parameters.SchemaBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.YangIdentifier; -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.util.BindingMap; - -@RunWith(MockitoJUnitRunner.StrictStubs.class) -public class YangLibraryTest extends AbstractYangLibraryWriterTest { - @Test - public void testUpdate() { - assertOperationalUpdate(InstanceIdentifier.create(YangLibrary.class), createTestModuleSet()); - } - - private static YangLibrary createTestModuleSet() { - Submodule sub = new SubmoduleBuilder() - .setName(new YangIdentifier("test-submodule")) - .setRevision(RevisionUtils.emptyRevision().getRevisionIdentifier()) - .build(); - - Module modules = new ModuleBuilder().setName(new YangIdentifier("test-module_2013-07-22")) - .setNamespace(new Uri("test:namespace")) - .setRevision(new RevisionIdentifier("2013-07-22")) - .setSubmodule(ImmutableMap.of(sub.key(), sub)) - .setFeature(Set.of()) - .build(); - - Module yangLibrary = new ModuleBuilder().setName(new YangIdentifier("ietf-yang-library_2019-01-04")) - .setNamespace(new Uri("urn:ietf:params:xml:ns:yang:ietf-yang-library")) - .setRevision(new RevisionIdentifier("2019-01-04")) - .setFeature(Set.of()) - .build(); - - ModuleSet modulesSet = new ModuleSetBuilder() - .setName("state-modules") - .setModule(ImmutableMap.of(modules.key(), modules, yangLibrary.key(), yangLibrary)) - .build(); - - - Schema schema = new SchemaBuilder().setName("state-schema") - .setModuleSet(Set.of(modulesSet.getName())) - .build(); - - Datastore datastore = new DatastoreBuilder().setName(Operational.VALUE) - .setSchema(schema.getName()) - .build(); - - return new YangLibraryBuilder() - .setModuleSet(BindingMap.of(modulesSet)) - .setSchema(BindingMap.of(schema)) - .setDatastore(BindingMap.of(datastore)) - .setContentId("0") - .build(); - } -} \ No newline at end of file diff --git a/netconf/mdsal-netconf-yang-library/src/test/resources/ietf-yang-library.yang b/netconf/mdsal-netconf-yang-library/src/test/resources/ietf-yang-library.yang deleted file mode 100644 index 6eae2f1c9d..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/resources/ietf-yang-library.yang +++ /dev/null @@ -1,11 +0,0 @@ -module ietf-yang-library { - yang-version 1.1; - namespace "urn:ietf:params:xml:ns:yang:ietf-yang-library"; - prefix yanglib; - - revision 2019-01-04 { - } - - container yang-library { - } -} diff --git a/netconf/mdsal-netconf-yang-library/src/test/resources/test-module.yang b/netconf/mdsal-netconf-yang-library/src/test/resources/test-module.yang deleted file mode 100644 index 11eec52a20..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/resources/test-module.yang +++ /dev/null @@ -1,20 +0,0 @@ -module test-module { - yang-version 1; - namespace "test:namespace"; - prefix "tt"; - - include test-submodule; - - description - "Types for testing"; - - revision "2013-07-22"; - - - container c { - leaf a { - type string; - } - } - -} diff --git a/netconf/mdsal-netconf-yang-library/src/test/resources/test-submodule.yang b/netconf/mdsal-netconf-yang-library/src/test/resources/test-submodule.yang deleted file mode 100644 index 372dafd2c5..0000000000 --- a/netconf/mdsal-netconf-yang-library/src/test/resources/test-submodule.yang +++ /dev/null @@ -1,9 +0,0 @@ -submodule test-submodule { - belongs-to "test-module" { - prefix "tt"; - } - - container cont { - - } -} \ No newline at end of file diff --git a/netconf/pom.xml b/netconf/pom.xml index 91130c4c04..63ad7ce3fb 100644 --- a/netconf/pom.xml +++ b/netconf/pom.xml @@ -30,7 +30,6 @@ netconf-config - mdsal-netconf-yang-library netconf-netty-util netconf-auth yanglib diff --git a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandler.java b/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandler.java deleted file mode 100644 index 2905dfdeea..0000000000 --- a/restconf/restconf-nb/src/main/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandler.java +++ /dev/null @@ -1,285 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.restconf.nb.rfc8040.legacy; - -import static java.util.Objects.requireNonNull; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Throwables; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.PreDestroy; -import javax.inject.Inject; -import javax.inject.Singleton; -import org.opendaylight.mdsal.common.api.LogicalDatastoreType; -import org.opendaylight.mdsal.common.api.TransactionCommitFailedException; -import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.ModulesState; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.YangLibrary; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module.ConformanceType; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Deviation; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Submodule; -import org.opendaylight.yangtools.concepts.Registration; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.Revision; -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.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -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.api.schema.builder.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.tree.api.ConflictingModificationAppliedException; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContextListener; -import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; -import org.opendaylight.yangtools.yang.model.api.ModuleLike; -import org.osgi.service.component.annotations.Activate; -import org.osgi.service.component.annotations.Component; -import org.osgi.service.component.annotations.Deactivate; -import org.osgi.service.component.annotations.Reference; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * A component which maintains the state of {@code ietf-yang-library} inside the datastore. - */ -// FIXME: this should be reconciled with the two other implementations we have. -@Singleton -@Component(service = { }) -public final class SchemaContextHandler implements EffectiveModelContextListener, AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(SchemaContextHandler.class); - - private static final NodeIdentifier MODULE_CONFORMANCE_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "conformance-type").intern()); - private static final NodeIdentifier MODULE_FEATURE_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "feature").intern()); - private static final NodeIdentifier MODULE_NAME_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "name").intern()); - private static final NodeIdentifier MODULE_NAMESPACE_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "namespace").intern()); - private static final NodeIdentifier MODULE_REVISION_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "revision").intern()); - private static final NodeIdentifier MODULE_SCHEMA_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "schema").intern()); - private static final NodeIdentifier MODULE_SET_ID_LEAF_NODEID = - NodeIdentifier.create(QName.create(YangLibrary.QNAME, "module-set-id").intern()); - - private final AtomicInteger moduleSetId = new AtomicInteger(); - private final DOMDataBroker domDataBroker; - private final Registration listenerRegistration; - - private volatile EffectiveModelContext schemaContext; - - @Inject - @Activate - public SchemaContextHandler(@Reference final DOMDataBroker domDataBroker, - @Reference final DOMSchemaService domSchemaService) { - this.domDataBroker = requireNonNull(domDataBroker); - listenerRegistration = domSchemaService.registerSchemaContextListener(this); - } - - @PreDestroy - @Deactivate - @Override - public void close() { - listenerRegistration.close(); - } - - @Override - public void onModelContextUpdated(final EffectiveModelContext context) { - schemaContext = requireNonNull(context); - - if (context.findModuleStatement(YangLibrary.QNAME.getModule()).isPresent()) { - putData(mapModulesByIetfYangLibraryYang(context, String.valueOf(moduleSetId.incrementAndGet()))); - } - } - - @VisibleForTesting - EffectiveModelContext get() { - return schemaContext; - } - - private void putData(final ContainerNode normNode) { - final DOMDataTreeWriteTransaction wTx = domDataBroker.newWriteOnlyTransaction(); - wTx.put(LogicalDatastoreType.OPERATIONAL, - YangInstanceIdentifier.of(NodeIdentifier.create(normNode.name().getNodeType())), normNode); - try { - wTx.commit().get(); - } catch (InterruptedException e) { - throw new RestconfDocumentedException("Problem occurred while putting data to DS.", e); - } catch (ExecutionException e) { - final TransactionCommitFailedException failure = Throwables.getCauseAs(e, - TransactionCommitFailedException.class); - if (failure.getCause() instanceof ConflictingModificationAppliedException) { - /* - * Ignore error when another cluster node is already putting the same data to DS. - * We expect that cluster is homogeneous and that node was going to write the same data - * (that means no retry is needed). Transaction chain reset must be invoked to be able - * to continue writing data with another transaction after failed transaction. - * This is workaround for bug https://bugs.opendaylight.org/show_bug.cgi?id=7728 - */ - LOG.warn("Ignoring that another cluster node is already putting the same data to DS.", e); - } else { - throw new RestconfDocumentedException("Problem occurred while putting data to DS.", failure); - } - } - } - - /** - * Map data from modules to {@link NormalizedNode}. - * - * @param context schema context - * @param moduleSetId module-set-id of actual set - * @return mapped data as {@link NormalizedNode} - */ - @VisibleForTesting - public static ContainerNode mapModulesByIetfYangLibraryYang(final EffectiveModelContext context, - final String moduleSetId) { - final var mapBuilder = Builders.mapBuilder() - .withNodeIdentifier(new NodeIdentifier(Module.QNAME)); - for (var module : context.getModules()) { - fillMapByModules(mapBuilder, Module.QNAME, false, module, context); - } - return Builders.containerBuilder() - .withNodeIdentifier(new NodeIdentifier(ModulesState.QNAME)) - .withChild(ImmutableNodes.leafNode(MODULE_SET_ID_LEAF_NODEID, moduleSetId)) - .withChild(mapBuilder.build()) - .build(); - } - - /** - * Map data by the specific module or submodule. - * - * @param mapBuilder ordered list builder for children - * @param mapQName QName corresponding to the list builder - * @param isSubmodule true if module is specified as submodule, false otherwise - * @param module specific module or submodule - * @param context schema context - */ - private static void fillMapByModules(final CollectionNodeBuilder mapBuilder, - final QName mapQName, final boolean isSubmodule, final ModuleLike module, - final EffectiveModelContext context) { - final var mapEntryBuilder = newCommonLeafsMapEntryBuilder(mapQName, module); - - mapEntryBuilder.withChild(ImmutableNodes.leafNode(MODULE_SCHEMA_NODEID, - "/modules/" + module.getName() + "/" - // FIXME: orElse(null) does not seem appropriate here - + module.getQNameModule().getRevision().map(Revision::toString).orElse(null))); - - if (!isSubmodule) { - mapEntryBuilder.withChild(ImmutableNodes.leafNode(MODULE_NAMESPACE_NODEID, - module.getNamespace().toString())); - - // features - not mandatory - if (module.getFeatures() != null && !module.getFeatures().isEmpty()) { - addFeatureLeafList(mapEntryBuilder, module.getFeatures()); - } - // deviations - not mandatory - final ConformanceType conformance; - if (module.getDeviations() != null && !module.getDeviations().isEmpty()) { - addDeviationList(module, mapEntryBuilder, context); - conformance = ConformanceType.Implement; - } else { - conformance = ConformanceType.Import; - } - mapEntryBuilder.withChild( - ImmutableNodes.leafNode(MODULE_CONFORMANCE_NODEID, conformance.getName())); - - // submodules - not mandatory - if (module.getSubmodules() != null && !module.getSubmodules().isEmpty()) { - addSubmodules(module, mapEntryBuilder, context); - } - } - mapBuilder.withChild(mapEntryBuilder.build()); - } - - /** - * Mapping submodules of specific module. - * - * @param module module with submodules - * @param mapEntryBuilder mapEntryBuilder of parent for mapping children - * @param context schema context - */ - private static void addSubmodules(final ModuleLike module, - final DataContainerNodeBuilder mapEntryBuilder, - final EffectiveModelContext context) { - final var mapBuilder = Builders.mapBuilder() - .withNodeIdentifier(new NodeIdentifier(Submodule.QNAME)); - - for (var submodule : module.getSubmodules()) { - fillMapByModules(mapBuilder, Submodule.QNAME, true, submodule, context); - } - mapEntryBuilder.withChild(mapBuilder.build()); - } - - /** - * Mapping deviations of specific module. - * - * @param module - * module with deviations - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param context - * schema context - */ - private static void addDeviationList(final ModuleLike module, - final DataContainerNodeBuilder mapEntryBuilder, - final EffectiveModelContext context) { - final var deviations = Builders.mapBuilder() - .withNodeIdentifier(new NodeIdentifier(Deviation.QNAME)); - for (var deviation : module.getDeviations()) { - final List ids = deviation.getTargetPath().getNodeIdentifiers(); - final QName lastComponent = ids.get(ids.size() - 1); - - deviations.withChild(newCommonLeafsMapEntryBuilder(Deviation.QNAME, - context.findModule(lastComponent.getModule()).orElseThrow()) - .build()); - } - mapEntryBuilder.withChild(deviations.build()); - } - - /** - * Mapping features of specific module. - * - * @param mapEntryBuilder mapEntryBuilder of parent for mapping children - * @param features features of specific module - */ - private static void addFeatureLeafList( - final DataContainerNodeBuilder mapEntryBuilder, - final Collection features) { - final var leafSetBuilder = Builders.leafSetBuilder() - .withNodeIdentifier(MODULE_FEATURE_NODEID); - for (var feature : features) { - leafSetBuilder.withChildValue(feature.getQName().getLocalName()); - } - mapEntryBuilder.withChild(leafSetBuilder.build()); - } - - private static DataContainerNodeBuilder newCommonLeafsMapEntryBuilder( - final QName qname, final ModuleLike module) { - final var name = module.getName(); - final var revision = module.getQNameModule().getRevision().map(Revision::toString).orElse(""); - return Builders.mapEntryBuilder() - .withNodeIdentifier(NodeIdentifierWithPredicates.of(qname, - Map.of(MODULE_NAME_NODEID.getNodeType(), name, MODULE_REVISION_NODEID.getNodeType(), revision))) - .withChild(ImmutableNodes.leafNode(MODULE_NAME_NODEID, name)) - .withChild(ImmutableNodes.leafNode(MODULE_REVISION_NODEID, revision)); - } -} diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandlerTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandlerTest.java deleted file mode 100644 index 48f12d9379..0000000000 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/legacy/SchemaContextHandlerTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * 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.restconf.nb.rfc8040.legacy; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.verify; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.opendaylight.mdsal.dom.api.DOMDataBroker; -import org.opendaylight.mdsal.dom.api.DOMSchemaService; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils; - -/** - * Tests for handling {@link SchemaContext}. - */ -@RunWith(MockitoJUnitRunner.StrictStubs.class) -public class SchemaContextHandlerTest { - private static EffectiveModelContext SCHEMA_CONTEXT; - - private SchemaContextHandler schemaContextHandler; - - @Mock - private DOMDataBroker mockDOMDataBroker; - @Mock - private DOMSchemaService mockDOMSchemaService; - @Mock - private ListenerRegistration mockListenerReg; - - @BeforeClass - public static void beforeClass() { - SCHEMA_CONTEXT = YangParserTestUtils.parseYangResourceDirectory("/modules"); - } - - @AfterClass - public static void afterClass() { - SCHEMA_CONTEXT = null; - } - - @Before - public void setup() throws Exception { - doReturn(mockListenerReg).when(mockDOMSchemaService).registerSchemaContextListener(any()); - - schemaContextHandler = new SchemaContextHandler(mockDOMDataBroker, mockDOMSchemaService); - verify(mockDOMSchemaService).registerSchemaContextListener(schemaContextHandler); - - schemaContextHandler.onModelContextUpdated(SCHEMA_CONTEXT); - } - - /** - * Testing init and close. - */ - @Test - public void testInitAndClose() { - schemaContextHandler.close(); - verify(mockListenerReg).close(); - } - - /** - * Test getting actual {@link SchemaContext}. - * - *

- * Get SchemaContext from SchemaContextHandler and compare it to actual - * SchemaContext. - */ - @Test - public void getSchemaContextTest() { - assertEquals("SchemaContextHandler should has reference to actual SchemaContext", - SCHEMA_CONTEXT, schemaContextHandler.get()); - } - - /** - * Test updating of {@link SchemaContext}. - * - *

- * Create new SchemaContext, set it to SchemaContextHandler and check if - * SchemaContextHandler reference to new SchemaContext instead of old one. - */ - @Test - public void onGlobalContextUpdateTest() { - // create new SchemaContext and update SchemaContextHandler - final EffectiveModelContext newSchemaContext = - YangParserTestUtils.parseYangResourceDirectory("/modules/modules-behind-mount-point"); - schemaContextHandler.onModelContextUpdated(newSchemaContext); - - assertNotEquals("SchemaContextHandler should not has reference to old SchemaContext", - SCHEMA_CONTEXT, schemaContextHandler.get()); - assertEquals("SchemaContextHandler should has reference to new SchemaContext", - newSchemaContext, schemaContextHandler.get()); - } -} diff --git a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/monitoring/RestconfStateStreamsTest.java b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/monitoring/RestconfStateStreamsTest.java index 16af6ea200..751d1f8a90 100644 --- a/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/monitoring/RestconfStateStreamsTest.java +++ b/restconf/restconf-nb/src/test/java/org/opendaylight/restconf/nb/rfc8040/monitoring/RestconfStateStreamsTest.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.Map; import org.junit.BeforeClass; import org.junit.Test; -import org.opendaylight.restconf.nb.rfc8040.legacy.SchemaContextHandler; import org.opendaylight.restconf.nb.rfc8040.utils.parser.ParserIdentifier; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.Module; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev190104.module.list.module.Deviation; @@ -52,21 +51,6 @@ public class RestconfStateStreamsTest { schemaContextMonitoring = YangParserTestUtils.parseYangResourceDirectory("/modules"); } - /** - * Test of writing modules into {@link RestconfModule#MODULE_LIST_SCHEMA_NODE} and checking if modules were - * correctly written. - */ - @Test - public void restconfMappingNodeTest() { - // write modules into list module in Restconf - final ContainerNode mods = SchemaContextHandler.mapModulesByIetfYangLibraryYang(schemaContext, "1"); - - // verify loaded modules - verifyLoadedModules(mods); - // verify deviations - verifyDeviations(mods); - } - @Test public void toStreamEntryNodeTest() throws Exception { final YangInstanceIdentifier path = ParserIdentifier.toInstanceIdentifier( -- 2.36.6