From 16b507170859270906f4992b0b29b22f43886f2c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 9 Apr 2020 18:41:16 +0200 Subject: [PATCH] Do not issue duplicate warnings for lists missing keys We currently are issuing the config list warning for each instantiated site, which ends up flooding our logs, as BGPCEP takes advantage of our lenience -- leading to 3400+ warnings. Make sure we flag each original list only once, suppressing other instances of the violation. This presumably will provide enough guidance while keeping the noise to a sane amount (~200 warnings). JIRA: YANGTOOLS-1090 Change-Id: I2488ad7144c1827f7689d496669e4c97b62b0570 Signed-off-by: Robert Varga (cherry picked from commit 1fb451b2a874cf198195895be035478cd9aa1635) --- .../rfc7950/reactor/RFC7950Reactors.java | 2 ++ .../list/AbstractListStatementSupport.java | 27 ++++++++++++++----- .../stmt/list/ConfigListWarningNamespace.java | 19 +++++++++++++ 3 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ConfigListWarningNamespace.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java index a4c846197c..01f7094a74 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/reactor/RFC7950Reactors.java @@ -69,6 +69,7 @@ import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf.LeafStatementSup import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC6020Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.leaf_list.LeafListStatementRFC7950Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.length.LengthStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ConfigListWarningNamespace; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC6020Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list.ListStatementRFC7950Support; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.mandatory.MandatoryStatementSupport; @@ -248,6 +249,7 @@ public final class RFC7950Reactors { .addVersionSpecificSupport(VERSION_1_1, GroupingStatementRFC7950Support.getInstance()) .addVersionSpecificSupport(VERSION_1, ListStatementRFC6020Support.getInstance()) .addVersionSpecificSupport(VERSION_1_1, ListStatementRFC7950Support.getInstance()) + .addSupport(ConfigListWarningNamespace.BEHAVIOUR) .addSupport(UniqueStatementSupport.getInstance()) .addVersionSpecificSupport(VERSION_1_1, ActionStatementSupport.getInstance()) .addVersionSpecificSupport(VERSION_1, RpcStatementRFC6020Support.getInstance()) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListStatementSupport.java index 3a1ec68758..2b02e0fd0e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/AbstractListStatementSupport.java @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.list; +import static com.google.common.base.Verify.verify; + import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import java.util.ArrayList; @@ -14,6 +16,7 @@ import java.util.HashSet; import java.util.List; import java.util.Optional; import java.util.Set; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ElementCountConstraint; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -37,7 +40,6 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; -import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -75,7 +77,6 @@ abstract class AbstractListStatementSupport extends BaseQNameStatementSupport
  • ctx, final ListStatement declared, final ImmutableList> substatements) { - final StatementSourceReference ref = ctx.getStatementSourceReference(); final SchemaPath path = ctx.getSchemaPath().get(); final ListSchemaNode original = (ListSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective) .orElse(null); @@ -94,8 +95,9 @@ abstract class AbstractListStatementSupport extends BaseQNameStatementSupport
  • elementCountConstraint = @@ -127,6 +127,19 @@ abstract class AbstractListStatementSupport extends BaseQNameStatementSupport
  • ctx) { + final StmtContext warnCtx = ctx.getOriginalCtx().orElse(ctx); + final Boolean warned = warnCtx.getFromNamespace(ConfigListWarningNamespace.class, Boolean.TRUE); + // Hacky check if we have issued a warning for the original statement + if (warned == null) { + verify(warnCtx instanceof Mutable, "Unexpected context %s", warnCtx); + ((Mutable) warnCtx).addToNs(ConfigListWarningNamespace.class, Boolean.TRUE, Boolean.TRUE); + LOG.info("Configuration list {} does not define any keys in violation of RFC7950 section 7.8.2. While " + + "this is fine with OpenDaylight, it can cause interoperability issues with other systems " + + "[defined at {}]", ctx.getStatementArgument(), warnCtx.getStatementSourceReference()); + } + } + private static boolean isInstantied(final StmtContext ctx) { for (StmtContext parent = ctx.getParentContext(); parent != null; parent = parent.getParentContext()) { if (UNINSTANTIATED_DATATREE_STATEMENTS.contains(parent.getPublicDefinition())) { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ConfigListWarningNamespace.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ConfigListWarningNamespace.java new file mode 100644 index 0000000000..ed816e12ee --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/list/ConfigListWarningNamespace.java @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2020 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.yangtools.yang.parser.rfc7950.stmt.list; + +import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; +import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour; + +@Beta +public interface ConfigListWarningNamespace extends IdentifierNamespace { + NamespaceBehaviour BEHAVIOUR = + NamespaceBehaviour.statementLocal(ConfigListWarningNamespace.class); +} -- 2.36.6