Azure / autorest

OpenAPI (f.k.a Swagger) Specification code generator. Supports C#, PowerShell, Go, Java, Node.js, TypeScript, Python
MIT License
4.62k stars 739 forks source link

OAS3.0: imodeler1 failure for boolean additionalProperties #3439

Closed kevinoid closed 3 years ago

kevinoid commented 4 years ago

Autorest fails to generate code for an OpenAPI 3.0 document with a schema that uses a boolean value for additionalProperties. For example:

openapi: '3.0.3'
info:
  title: OpenApi 3 example with boolean additionalProperties
  version: '1.0.0'
components:
  schemas:
    ExampleObject:
      description: Schema which forbids additional properties
      type: object
      properties:
        prop1:
          type: string
      additionalProperties: false
paths:
  /example:
    get:
      operationId: getExample
      responses:
        default:
          description: Get example object
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/ExampleObject'

Running autorest --csharp --input-file=openapi.yaml with autorest@3.0.6187 produces:

AutoRest code generation utility [cli version: 3.0.6187; node: v10.16.3, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      '/home/kevin/.autorest/@microsoft.azure_autorest-core@3.0.5537/node_modules/@microsoft.azure/autorest-core/dist' (3.0.5537)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.82)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
FATAL: Error parsing swagger file. Error converting value True to type 'AutoRest.Modeler.Model.Schema'. Path 'components.schemas.ExampleObject.additionalProperties', line 1, position 584.
FATAL: AutoRest.Core.Logging.CodeGenerationException: Error parsing swagger file. Error converting value True to type 'AutoRest.Modeler.Model.Schema'. Path 'components.schemas.ExampleObject.additionalProperties', line 1, position 584.
   at AutoRest.Modeler.SwaggerParser.Parse(String swaggerDocument) in /opt/vsts/work/1/s/src/SwaggerParser.cs:line 52
   at AutoRest.Modeler.Program.<ProcessInternal>d__2.MoveNext() in /opt/vsts/work/1/s/src/Program.cs:line 58
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at NewPlugin.<Process>d__15.MoveNext()
/home/kevin/.autorest/@microsoft.azure_autorest-core@3.0.5537/node_modules/@microsoft.azure/autorest-core/dist/lib/pipeline/pipeline.js - FAILURE {}
Process() cancelled due to exception : Plugin imodeler1 reported failure. / Error: Plugin imodeler1 reported failure.
    at /home/kevin/.autorest/@microsoft.azure_autorest-core@3.0.5537/node_modules/@microsoft.azure/autorest-core/dist/lib/pipeline/plugins/external.js:26:19
  Error: Plugin imodeler1 reported failure.

Boolean values for additionalProperties work correctly in OpenAPI 2.0 documents.

Thanks, Kevin

P.S. Note that the explicit mention of boolean values was removed from additionalProperties in JSON Schema Core draft-handrews-json-schema-02 (referenced by Schema Object in the current OpenAPI 3.1 draft), but it is still supported since true is an alias for {} and false for {"not":{}}, as explained by Henry Andrews on the json-schema mailing list.

kevinoid commented 4 years ago

Originally reported for OpenAPI 2.0 in #2564, fixed in #2571.

cermakp commented 4 years ago

Hi, seems that you are running autores without parameter --v3. OpenApi v3 should be only supported in autores v3. Anyway if you use parameter --v3 you will run into the following issue #3497

daviwil commented 4 years ago

You also need to use an AutoRest extension that works with the v3 pipeline, @microsoft.azure/autorest.csharp@2.3.82 does not support it. Try adding this parameter --use:@autorest/csharp-v3@3.0.0-dev.20200512.1. Note that the new v3-supporting C# generator is under development and not fully released yet.

kevinoid commented 4 years ago

Try adding this parameter --use:@autorest/csharp-v3@3.0.0-dev.20200512.1.

Thanks @daviwil! Running autorest --use:@autorest/csharp-v3@3.0.0-dev.20200512.1 --input-file=openapi.yaml produces:

AutoRest code generation utility [cli version: 3.0.6187; node: v10.20.1, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      '/home/kevin/.autorest/@autorest_core@3.0.6246/node_modules/@autorest/core/dist' (3.0.6246)
  Error: Unable to resolve package '@autorest/csharp-v3@3.0.0-dev.20200511.1'.

Presumably because @autorest/csharp-v3 isn't hosted on npmjs.com. autorest --use:@autorest/csharp-v3@https://github.com/Azure/autorest.csharp/releases/download/3.0.0-dev.20200512.9/autorest-csharp-v3-3.0.0-dev.20200512.9.tgz --input-file=openapi.yaml produces:

AutoRest code generation utility [cli version: 3.0.6187; node: v10.20.1, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      '/home/kevin/.autorest/@autorest_core@3.0.6246/node_modules/@autorest/core/dist' (3.0.6246)
   Loading AutoRest extension '@autorest/csharp-v3' (@autorest/csharp-v3@https://github.com/Azure/autorest.csharp/releases/download/3.0.0-dev.20200512.9/autorest-csharp-v3-3.0.0-dev.20200512.9.tgz->3.0.0-dev.20200512.9)
   Loading AutoRest extension '@autorest/modelerfour' (4.13.351->4.13.351)
FATAL: System.UriFormatException: Invalid URI: The format of the URI could not be determined.
   at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
   at System.Uri..ctor(String uriString)
   at AutoRest.CSharp.V3.AutoRest.Plugins.CSharpGen.Execute(IPluginCommunication autoRest) in D:\a\1\s\src\AutoRest.CSharp.V3\AutoRest\Plugins\CSharpGen.cs:line 114
   at AutoRest.CSharp.V3.AutoRest.Plugins.PluginProcessor.Start(IPluginCommunication autoRest) in D:\a\1\s\src\AutoRest.CSharp.V3\AutoRest\Plugins\PluginProcessor.cs:line 36
  Error: Plugin csharpgen reported failure.

Adding --v3 --csharp changes the error to:

AutoRest code generation utility [cli version: 3.0.6187; node: v10.20.1, max-memory: 8192 gb]
(C) 2018 Microsoft Corporation.
https://aka.ms/autorest
   Loading AutoRest core      '/home/kevin/.autorest/@autorest_core@3.0.6246/node_modules/@autorest/core/dist' (3.0.6246)
   Loading AutoRest extension '@autorest/csharp-v3' (@autorest/csharp-v3@https://github.com/Azure/autorest.csharp/releases/download/3.0.0-dev.20200512.9/autorest-csharp-v3-3.0.0-dev.20200512.9.tgz->3.0.0-dev.20200512.9)
   Loading AutoRest extension '@microsoft.azure/autorest.csharp' (~2.3.79->2.3.84)
   Loading AutoRest extension '@microsoft.azure/autorest.modeler' (2.3.55->2.3.55)
   Loading AutoRest extension '@autorest/modelerfour' (4.13.351->4.13.351)
  Error: Cannot resolve pipeline stage 'openapi-document/identity'.

Could you give me a few more hints about how to generate C# with v3?

kevinoid commented 4 years ago

Feel free to ignore my previous comment. I was able to successfully generate code using:

mkdir -p assets && autorest --use:@autorest/csharp-v3@https://github.com/Azure/autorest.csharp/releases/download/3.0.0-dev.20200512.9/autorest-csharp-v3-3.0.0-dev.20200512.9.tgz --input-file=openapi.yaml --output-folder="file://$PWD/output" --namespace=MyNamespace --shared-source-folder="file://$PWD/assets"

daviwil commented 4 years ago

I've been informed that the new C# generator probably won't work for general OpenAPI 3 spec generation at this point. The AutoRest team is focused primarily on getting AutoRest v3 generators working for Azure SDKs at this point before making them more broadly available.

Interesting that it worked for you though!

kevinoid commented 4 years ago

Good to know. Thanks again @daviwil!

FinHorsley commented 4 years ago

@daviwil Running the risk of being too picky here, but is the following part of the readme description still accurate; seems like this is more of an AzureSDK generator rather than a general purpose OpenAPI (now v3) generator?

The AutoRest tool generates client libraries for accessing RESTful web services. Input to AutoRest is a spec that describes the REST API using the OpenAPI Specification format.