Skip to content

[OAS 3.0.0] yaml with multiple server urls generates code using first url only  #590

@hippoKnight

Description

@hippoKnight
Description

I wrote a yaml following OAS 3.0, its servers part looked like this:

...
#--- server ---#
servers:
  # server object
  - url: http://1.1.1.1:9200/
  - url: http://1.1.1.1:9201/v2
...

I used this yaml generating python code, and didn' t see the second url('http://1.1.1.1:9201/v2')

So, my question is: What is the desired result if the yaml contains multiple urls?

openapi-generator version

I installed openapi-generator using Homebrew yesterday.

OpenAPI declaration file content or url
#--- OpenAPI version ---#
openapi: '3.0.0'

#--- metadata about the api ---#
info:
  # title of the application
  title: '9'

  # description of the application
  description: '9'

  # terms of service for the API, must be a URL
  termsOfService: ''

  # contact information for the exposed API
  contact:
    name: 'myname'
    url: 'myurl'
    email: 'my@mail.com'

  # license information for the exposed API
  license:
    name: 'myname'
    url: 'myurl'

  # version of the OpenAPI document
  version: '1.0.1'

#--- additional external documentation ---#
externalDocs:
  description: '9'
  url: ''

#--- server ---#
servers:
  # server object
  - url: http://1.1.1.1:9200/
  - url: http://1.1.1.1:9201/v2
    # URL to the target host

    # map between a variable name and its value(used for substitution in the server's URL template)
    variables:
      basePath:
        enum:
          - ''
          - 'website/face/v2/'
          - 'business/api/'
        default: ''
        description: 'basePath'

      username:
        default: 'admin'
        description: 'username'

    description: 's'

#--- tags for specification with additional metadata ---#
tags:
  - name: 'website'
    description: 'API of website operations'

security:
  # only one of the security requirement objects need to be satisfied to authorize a request
  # mentioned names must in components-seuritySchemes
  -
    cookieAuth_sessionId: []
    cookieAuth_ytClusterId: []
    # lists the required security schemes to execute this operation
    # objects that contain multiple schemes require all satisfication

#--- reusable objects for the specification ---#
components:


  # Security scheme definitions (see Authentication)
  securitySchemes:
    # https://swagger.io/specification/#securitySchemeObject
    cookieAuth_sessionId:
      type: 'apiKey'
      in: 'cookie'
      name: 'session_id'

    cookieAuth_ytClusterId:
      type: 'apiKey'
      in: 'cookie'
      name: 'yt_cluster_id'

  # Reusable schemas (data models)
  schemas:
    # definition of input and output data types
    # can be objects, primitives, arrays
    # https://swagger.io/specification/#schemaObject

    sessionID:
      type: 'string'


    clusterID:
      type: 'string'

    # user login info: name & password
    LoginInfo:
      type: 'object'
      required:
        - name
        - password
      properties:
        name:
          type: 'string'
        password:
          type: 'string' # password should be a md5 format string

    LoginResponseInfo:
      type: 'object'
      required:
        - session_id
      properties:
        session_id:
          type: 'string'
        cluster_id:
          type: 'string'

    # response info for all API: rtn & message
    ResponseInfo:
      type: 'object'
      required:
        - rtn
        - message
      properties:
        rtn:
          type: 'integer'
          # format: 'int32'
        message:
          type: 'string'

    # repository info for creation: repository name and extra_meta
    repoCreationInfo:
      type: 'object'
      required:
        - name
      properties:
        name:
          type: 'string'
        extra_meta:
          type: 'object'
          additionalProperties: {}
          # or can be written as: additionalProperties: true

    # repository id info
    repoIdInfo:
      type: 'object'
      required:
        - id
      properties:
        id:
          type: 'string'


  # Reusable request bodies
  requestBodies:
    LoginBody:
      description: 'A JSON object containing the login and password'
      required: true
      content:
        'application/json':
          schema:
            $ref: '#/components/schemas/LoginInfo'
          # examples:
          #   LoginInfo_admin:
          #     $ref: '#/components/examples/LoginInfo_example'

    repoCreationBody:
      description: 'A JSON object containing the repository name and meta info'
      required: true
      content:
        'application/json':
          schema:
            $ref: '#/components/schemas/repoCreationInfo'

  # Reusable responses, such as 401 Unauthorized or 400 Bad Request
  responses:

    # default response model
    DefaultResponse:
      description: 'Error: rtn != 0'
      headers: ''
      content:
        'application/json':
          schema:
            $ref: '#/components/schemas/ResponseInfo'

    # successful login response model
    LoginResponse:
      description: 'Successful login: The session ID is returned in a cookie named `session_id` and you need to include this cookie in subsequent requests'
      headers:
        Set-cookie:
          schema:
            allOf:
              - $ref: '#/components/schemas/sessionID'
              - $ref: '#/components/schemas/clusterID'
            # type: 'string'
            # example: 'session_id=111@DEFAULT; yt_cluster_id=DEFAULT'
      content:
        'application/json':
          schema:
            anyOf:
              - $ref: '#/components/schemas/ResponseInfo'
              - $ref: '#/components/schemas/LoginResponseInfo'

    repoCreationResponse:
      description: 'Successful repo_creation'
      content:
        'application/json':
          schema:
            anyOf:
              - $ref: '#/components/schemas/ResponseInfo'
              - $ref: '#/components/schemas/repoIdInfo'



#--- available paths and operations for the API ---#
paths:

  # path for user login
  /login:
    post:
      tags:
        # - 'user'
        - 'business'
      summary: 'user login'
      description: 'user login with user name and password'
      operationId: 'userLogin'
      requestBody:
        $ref: '#/components/requestBodies/LoginBody'
      responses:
        '200':
          $ref: '#/components/responses/LoginResponse'
        'default':
          $ref: '#/components/responses/DefaultResponse'
      deprecated: false
      security: []  # no authorization for login operation
      externalDocs:
        description: 'API document for business user login'
        url: ''


  # path about repository operations
  /repository:

    summary: 'repository related operations'

    description: 'Operations: create/update/delete/query repository'


    # POST operation
    post:

      # tags for API documentation control
      tags:
        # - 'repository'
        - 'business'

      # short summary about what the operation does
      summary: 'create new repository'

      # verbose explanation of the operation behavior
      description: 'create new repository with certain repository name'

      # Additional external documentation for this operation
      externalDocs:
        description: 'API document for repository creation'
        url: ''

      # unique string to identify the operation
      operationId: 'repositoryCreation'

      # request body,only supported in HTTP
      requestBody:
        $ref: '#/components/requestBodies/repoCreationBody'

      # list of possible responses as they are returned from executing this operation
      responses:
        '200':
          $ref: '#/components/responses/repoCreationResponse'
        'default':
          $ref: '#/components/responses/DefaultResponse'
Command line used for generation

openapi-generator generate -i swagger.yaml -g python -o /tmp/test/python-3

Steps to reproduce

Running the command above is enough.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions