Amartus / yang2swagger

Yang to swagger generator
Eclipse Public License 1.0
32 stars 21 forks source link

Does yang2swagger support the augment statement? #21

Closed jdillard closed 5 years ago

jdillard commented 5 years ago

I have some yang files that use the augment statement and yang2swagger seems to be overriding models, because I get a bunch of the following:

2019-04-08 21:12:16,644 [main] WARN  c.m.y.c.i.AbstractDataObjectBuilder - Overriding model null with node (urn:namespace:xml:yang:augmented-namespace)augmented-container

But then I get the following error due to m.getProperties() being null:

2019-04-08 21:12:16,649 [main] ERROR com.mrv.yangtools.codegen.main.Main - Error while generating Swagger
java.lang.NullPointerException: null
    at com.mrv.yangtools.codegen.impl.OptimizingDataObjectBuilder.lambda$verifyModel$21(OptimizingDataObjectBuilder.java:362)
    at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1631)
    at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127)
    at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543)
    at com.mrv.yangtools.codegen.impl.OptimizingDataObjectBuilder.verifyModel(OptimizingDataObjectBuilder.java:362)
    at com.mrv.yangtools.codegen.impl.OptimizingDataObjectBuilder.model(OptimizingDataObjectBuilder.java:343)
    at com.mrv.yangtools.codegen.impl.OptimizingDataObjectBuilder.build(OptimizingDataObjectBuilder.java:202)
    at com.mrv.yangtools.codegen.impl.AbstractDataObjectBuilder.addModel(AbstractDataObjectBuilder.java:299)
    at com.mrv.yangtools.codegen.impl.AbstractDataObjectBuilder.addModel(AbstractDataObjectBuilder.java:332)
    at com.mrv.yangtools.codegen.impl.OptimizingDataObjectBuilder.addModel(OptimizingDataObjectBuilder.java:396)
    at com.mrv.yangtools.codegen.SwaggerGenerator$ModuleGenerator.generate(SwaggerGenerator.java:394)
    at com.mrv.yangtools.codegen.SwaggerGenerator$ModuleGenerator.lambda$generate$1(SwaggerGenerator.java:393)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at com.mrv.yangtools.codegen.SwaggerGenerator$ModuleGenerator.generate(SwaggerGenerator.java:393)
    at com.mrv.yangtools.codegen.SwaggerGenerator$ModuleGenerator.lambda$generate$0(SwaggerGenerator.java:352)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at com.mrv.yangtools.codegen.SwaggerGenerator$ModuleGenerator.generate(SwaggerGenerator.java:352)
    at com.mrv.yangtools.codegen.SwaggerGenerator.lambda$generate$1(SwaggerGenerator.java:304)
    at java.base/java.lang.Iterable.forEach(Iterable.java:75)
    at com.mrv.yangtools.codegen.SwaggerGenerator.generate(SwaggerGenerator.java:304)
    at com.mrv.yangtools.codegen.SwaggerGenerator.generate(SwaggerGenerator.java:263)
    at com.mrv.yangtools.codegen.main.Main.generate(Main.java:90)
    at com.mrv.yangtools.codegen.main.Main.main(Main.java:62)

The augmented yang files are processed fine by pyang, so the syntax should be correct. Is it possible the augment statement isn't fully supported or am I doing something wrong?

bartoszm commented 5 years ago

Augment statements are supported. Thus what you observe is most likely a bug. Are you able to share yang you are using while observing this NPE? If not are you able to provide artificial example leading to that error?

jdillard commented 5 years ago

I am working on simplifying the YANG as much as possible so there is less to troubleshoot. It seems that error might be caused by augmenting an empty container, such as:

container turing-machine {
    description
      "State data and configuration of a Turing Machine.";
  }
augment "/tm:turing-machine" {
    description
      "State data for the second tape.";
    leaf head-position-2 {
      type tm:cell-index;
      config "false";
      description
        "Head position of the second tape.";
    }
    container tape-2 {
      config "false";
      description
        "Contents of the second tape.";
      uses tm:tape-cells;
    }
  }

I have been using these two yang files as a control, since they seem to work fine with yang2swagger. I just stripped out all the leafs/containers and the augment statements related to them for the above code sample.

When I add a leaf to the empty container in my yang I get a different error, so I am still troubleshooting there, but maybe that helps a little.

jdillard commented 5 years ago

Looks like it was some (bad) changes we made to support namespaces, but using the -use-namespaces flag @UltimateDogg added worked fine. Sorry for taking up your time!