[MDSAL-647] org.opendaylight.mdsal.binding.model.ietf.rfc8776 generated classes from typedef -> typedef -> enumeration Created: 30/Nov/20  Updated: 02/May/23  Resolved: 02/May/23

Status: Resolved
Project: mdsal
Component/s: Binding codegen
Affects Version/s: None
Fix Version/s: 8.0.0

Type: Bug Priority: Medium
Reporter: Emmanuelle Delfour Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: pt
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: Zip Archive sample.zip    

 Description   

In ietf-te-types yang model there is a type definition “te-common-status” which type is enumeration. This type definition is used to declare 2 another type definitions:

  typedef te-oper-status {
    type te-common-status;
    description
      "Defines a type representing the operational status of
       a TE resource.";
  }

  typedef te-admin-status {
    type te-common-status;
    description
      "Defines a type representing the administrative status of
       a TE resource.";
  }

The generated classes from te-oper-status (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev200610. TeOperStatus) and te-admin-status (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev200610. TeAdminStatus) are empty Class. Shouldn’t they be Enum instead ? I ask this question because when I try to serialize object using them I got the following exception

Exception in thread "main" java.lang.IllegalArgumentException
            at com.google.common.base.Preconditions.checkArgument(Preconditions.java:128)
            at org.opendaylight.mdsal.binding.dom.codec.impl.EnumerationCodec.loader(EnumerationCodec.java:38)
            at org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.getCodecLoader(ValueTypeCodec.java:87)
            at org.opendaylight.mdsal.binding.dom.codec.impl.ValueTypeCodec.getCodecFor(ValueTypeCodec.java:65)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getCodecForBindingClass(BindingCodecContext.java:448)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getCodec(BindingCodecContext.java:421)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getLeafNodesUsingReflection(BindingCodecContext.java:371)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.getLeafNodes(BindingCodecContext.java:356)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.<init>(DataObjectCodecContext.java:112)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.<init>(DataObjectCodecContext.java:104)
            at org.opendaylight.mdsal.binding.dom.codec.impl.ContainerNodeCodecContext.<init>(ContainerNodeCodecContext.java:20)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.createInstance(DataContainerCodecPrototype.java:261)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.loadInstance(DataContainerCodecPrototype.java:245)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataContainerCodecPrototype.get(DataContainerCodecPrototype.java:238)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectCodecContext.streamChild(DataObjectCodecContext.java:266)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingToNormalizedStreamWriter.enter(BindingToNormalizedStreamWriter.java:80)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingToNormalizedStreamWriter.startContainerNode(BindingToNormalizedStreamWriter.java:179)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev200806.networks.network.link.Te$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamContainer(DataObjectStreamer.java:90)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev200806.Link1$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.emitAugmentation(DataObjectStreamer.java:176)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamAugmentations(DataObjectStreamer.java:63)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.commonStreamList(DataObjectStreamer.java:153)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamMap(DataObjectStreamer.java:133)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.emitAugmentation(DataObjectStreamer.java:176)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamAugmentations(DataObjectStreamer.java:63)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.commonStreamList(DataObjectStreamer.java:153)
            at org.opendaylight.mdsal.binding.dom.codec.impl.DataObjectStreamer.streamMap(DataObjectStreamer.java:133)
            at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks$$$streamer.serialize(Unknown Source)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext$DataObjectSerializerProxy.serialize(BindingCodecContext.java:122)
            at org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext.toNormalizedNode(BindingCodecContext.java:506)
            at org.opendaylight.mdsal.binding.dom.codec.spi.ForwardingBindingDOMCodecServices.toNormalizedNode(ForwardingBindingDOMCodecServices.java:67)
            at org.test.Serialization.serialize(Serialization.java:136)
            at org.test.Serialization.main(Serialization.java:147)

I have attached to this mail a code sample to reproduce the problem.



 Comments   
Comment by Robert Varga [ 02/May/23 ]

So this is nominally a duplicate of MDSAL-503, I think. This particular failure was addressed https://git.opendaylight.org/gerrit/c/mdsal/+/94297 by us not generating the classes anymore.

This may seem counter-intuitive, but now TeCommonStatus serves both cases and its use in leaf types should result in run-time checks whether the enum satisties any restrictions on the used value.

Since the enumeration maps to a java.lang.Enum, which is implicitly final, the only way we could address the non-presence of TeOperState is to push the enumeration into an inner type and have TeCommonType become a TypeObject (instead of EnumTypeObject) holding a single value.

If that is a desired outcome, we can consider it in one of the major releases – please file a separate issue if that is the case.

Generated at Wed Feb 07 20:10:23 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.