From 6afbeede4ef5aa40ee38d59e779fc0320d7d2fdd Mon Sep 17 00:00:00 2001 From: Shigeru Yasuda Date: Fri, 11 Sep 2015 20:41:04 +0900 Subject: [PATCH] Use vnode-name XML binding to save flow condition configuration. Change-Id: Ib69dbed05bfc7fee59601c06b63190d0b8cc339a Signed-off-by: Shigeru Yasuda --- .../util/flow/cond/FlowCondUtils.java | 12 ++++ .../util/flow/cond/VTNFlowCondition.java | 29 ++++------ .../internal/util/flow/cond/package-info.java | 4 ++ .../util/flow/cond/VTNFlowConditionTest.java | 55 +++---------------- 4 files changed, 34 insertions(+), 66 deletions(-) diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/FlowCondUtils.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/FlowCondUtils.java index 2f4273dd..92dd8d6a 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/FlowCondUtils.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/FlowCondUtils.java @@ -108,6 +108,18 @@ public final class FlowCondUtils { return MiscUtils.checkName(DESC_FLOW_COND, vname); } + /** + * Ensure the given vnode-name is not null. + * + * @param vname A {@link VnodeName} instance. + * @throws RpcException {@code vname} is {@code null}. + */ + public static void checkPresent(VnodeName vname) throws RpcException { + if (vname == null) { + throw MiscUtils.getNullArgumentException(DESC_FLOW_COND + " name"); + } + } + /** * Create the instance identifier for the flow condition specified by the * given name. diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowCondition.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowCondition.java index 362640a5..193cb9f7 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowCondition.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowCondition.java @@ -59,7 +59,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { * The name of the flow condition. */ @XmlElement(required = true) - private String name; + private VnodeName name; /** * A list of {@link VTNFlowMatch} instances sorted by match index. @@ -68,12 +68,6 @@ public final class VTNFlowCondition implements VTNIdentifiable { @XmlElement(name = "vtn-flow-match") private List matches; - /** - * A {@link VnodeName} instance that contains the name of this flow - * condition. - */ - private VnodeName nodeName; - /** * {@code MatchInitializer} initializes the list of {@link VTNFlowMatch} * instances. @@ -286,8 +280,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { */ public VTNFlowCondition(String nm, FlowCondition fcond) throws RpcException { - nodeName = FlowCondUtils.checkName(nm); - name = nm; + name = FlowCondUtils.checkName(nm); List list = (fcond == null) ? null : fcond.getMatches(); @@ -302,8 +295,8 @@ public final class VTNFlowCondition implements VTNIdentifiable { * @throws RpcException An error occurred. */ public VTNFlowCondition(VtnFlowCondConfig vfconf) throws RpcException { - nodeName = vfconf.getName(); - name = FlowCondUtils.checkName(nodeName); + name = vfconf.getName(); + FlowCondUtils.checkName(name); List list = vfconf.getVtnFlowMatch(); matches = new VtnFlowMatchConverter().initialize(list); @@ -325,7 +318,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { } } - return new FlowCondition(name, list); + return new FlowCondition(name.getValue(), list); } /** @@ -336,7 +329,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { */ public VtnFlowConditionBuilder toVtnFlowConditionBuilder() { VtnFlowConditionBuilder builder = new VtnFlowConditionBuilder(). - setName(nodeName); + setName(name); List list; if (matches != null && !matches.isEmpty()) { @@ -369,7 +362,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { */ public InstanceIdentifier getPath() { return InstanceIdentifier.builder(VtnFlowConditions.class). - child(VtnFlowCondition.class, new VtnFlowConditionKey(nodeName)). + child(VtnFlowCondition.class, new VtnFlowConditionKey(name)). build(); } @@ -379,7 +372,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { * @throws RpcException Verifycation failed. */ public void verify() throws RpcException { - nodeName = FlowCondUtils.checkName(name); + FlowCondUtils.checkPresent(name); matches = new MatchVerifier().initialize(matches); } @@ -419,7 +412,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { */ private void traceMatch(FlowMatchContext ctx, String msg) { if (LOG.isTraceEnabled()) { - LOG.trace("{}: {}: packet=[{}]", name, msg, + LOG.trace("{}: {}: packet=[{}]", name.getValue(), msg, ctx.getHeaderDescription()); } } @@ -434,7 +427,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { private void traceMatch(FlowMatchContext ctx, String msg, VTNFlowMatch vfmatch) { if (LOG.isTraceEnabled()) { - LOG.trace("{}: {}: match=[{}], packet=[{}]", name, msg, + LOG.trace("{}: {}: match=[{}], packet=[{}]", name.getValue(), msg, vfmatch.getConditionKey(), ctx.getHeaderDescription()); } } @@ -448,7 +441,7 @@ public final class VTNFlowCondition implements VTNIdentifiable { */ @Override public String getIdentifier() { - return name; + return name.getValue(); } // Object diff --git a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/package-info.java b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/package-info.java index 83ebc535..1664916c 100644 --- a/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/package-info.java +++ b/manager/implementation/src/main/java/org/opendaylight/vtn/manager/internal/util/flow/cond/package-info.java @@ -20,6 +20,7 @@ @XmlJavaTypeAdapter(value = LongAdapter.class, type = long.class), @XmlJavaTypeAdapter(value = DoubleAdapter.class, type = double.class), @XmlJavaTypeAdapter(value = DoubleAdapter.class, type = Double.class), + @XmlJavaTypeAdapter(value = VnodeNameAdapter.class, type = VnodeName.class), }) package org.opendaylight.vtn.manager.internal.util.flow.cond; @@ -31,3 +32,6 @@ import org.opendaylight.vtn.manager.util.xml.adapters.DoubleAdapter; import org.opendaylight.vtn.manager.util.xml.adapters.IntegerAdapter; import org.opendaylight.vtn.manager.util.xml.adapters.LongAdapter; import org.opendaylight.vtn.manager.util.xml.adapters.ShortAdapter; +import org.opendaylight.vtn.manager.util.xml.adapters.VnodeNameAdapter; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.vtn.types.rev150209.VnodeName; diff --git a/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowConditionTest.java b/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowConditionTest.java index 28603160..2e23b5e9 100644 --- a/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowConditionTest.java +++ b/manager/implementation/src/test/java/org/opendaylight/vtn/manager/internal/util/flow/cond/VTNFlowConditionTest.java @@ -35,6 +35,7 @@ import org.opendaylight.vtn.manager.internal.DataGenerator; import org.opendaylight.vtn.manager.internal.TestBase; import org.opendaylight.vtn.manager.internal.XmlDataType; import org.opendaylight.vtn.manager.internal.XmlNode; +import org.opendaylight.vtn.manager.internal.XmlValueType; import org.opendaylight.vtn.manager.internal.util.flow.match.EtherMatchParams; import org.opendaylight.vtn.manager.internal.util.flow.match.IcmpMatchParams; import org.opendaylight.vtn.manager.internal.util.flow.match.Inet4MatchParams; @@ -75,6 +76,8 @@ public class VTNFlowConditionTest extends TestBase { String[] p = XmlDataType.addPath( "vtn-flow-matches", XmlDataType.addPath(name, parent)); List dlist = new ArrayList<>(); + dlist.add(new XmlValueType("name", VnodeName.class). + add(name).prepend(parent)); dlist.addAll(VTNFlowMatchTest.getXmlDataTypes("vtn-flow-match", p)); return dlist; } @@ -388,60 +391,13 @@ public class VTNFlowConditionTest extends TestBase { assertEquals(msg, st.getDescription()); } - // Empty name - msg = "Flow condition name cannot be empty"; - etag = RpcErrorTag.BAD_ELEMENT; - xml = new XmlNode(XML_ROOT).add(new XmlNode("name")).toString(); - vfcond = unmarshal(um, xml, type); - try { - vfcond.verify(); - unexpected(); - } catch (RpcException e) { - assertEquals(etag, e.getErrorTag()); - Status st = e.getStatus(); - assertEquals(StatusCode.BADREQUEST, st.getCode()); - assertEquals(msg, st.getDescription()); - } - - // Invalid name - msg = "Flow condition name is invalid"; - String[] invalidNames = { - // Too long name. - "01234567890123456789012345678901", - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - - // Starts with an invalid character. - "_abc", - ";abc", - "/abc", - "%abc", - - // Invalid character. - "abcde-0123", - "abcde.0123", - "abcde:0123", - }; - for (String name: invalidNames) { - xml = new XmlNode(XML_ROOT). - add(new XmlNode("name", name)).toString(); - vfcond = unmarshal(um, xml, type); - try { - vfcond.verify(); - unexpected(); - } catch (RpcException e) { - assertEquals(etag, e.getErrorTag()); - Status st = e.getStatus(); - assertEquals(StatusCode.BADREQUEST, st.getCode()); - assertEquals(msg, st.getDescription()); - } - } - // Duplicate index. int badIndex = 31; XmlNode xn = new XmlNode(XML_ROOT).add(new XmlNode("name", "fcond")); XmlNode xmatches = new XmlNode("vtn-flow-matches"). add(new FlowMatchParams(badIndex).toXmlNode("vtn-flow-match")); msg = "Duplicate match index: " + badIndex; + etag = RpcErrorTag.BAD_ELEMENT; for (int i = 1; i <= badIndex + 20; i++) { FlowMatchParams fmp = new FlowMatchParams().setIndex(i); xmatches.add(fmp.toXmlNode("vtn-flow-match")); @@ -457,6 +413,9 @@ public class VTNFlowConditionTest extends TestBase { assertEquals(StatusCode.BADREQUEST, st.getCode()); assertEquals(msg, st.getDescription()); } + + // Ensure that broken values in XML can be detected. + jaxbErrorTest(um, type, getXmlDataTypes(XML_ROOT)); } /** -- 2.36.6