Required parameters from multiple schemas
Hello,
I'm trying to enforce required parameters in both the 'check_single' and 'check_set' below. The required parameters work when passing when they match the 'check_single', but I haven't been successful in the require being enforced in the 'check_set'. The only difference between to the 2 is that 'check_set' allows consumers to send a list. This is being used in conjunction with Flask/Connexion in Python 3.6.
I've been through all the applicable examples and docs I can find, but I'm still stuck.
openapi: 3.0.0 info: version: 1.0.0 title: check create paths: /monitor/v1/submit: post: summary: "submit checks" operationId: "create_v1.publish_body_v1" requestBody: content: application/json: schema: $ref: '#/components/schemas/check' responses: '201': description: OK components: schemas: check: title: check request single anyOf: - $ref: '#/components/schemas/check_single' - $ref: '#/components/schemas/check_set' required: ["hostname", "team_name"] properties: hostname: type: string team_name: type: string check_definition: type: object required: ["command", "subscriptions", "interval", "publish", "handlers", "metadata"] properties: command: type: string subscriptions: type: array items: type: string interval: type: integer publish: type: boolean handlers: type: array items: type: string metadata: type: object required: ["name", "namespace", "labels"] properties: name: type: string namespace: type: string labels: type: object required: ["type", "environment", "application"] properties: type: type: string example: "Either dynamic or static" enum: - dynamic - static environment: type: string description: "Environment lab for IEM. This is the environment as know by IEM" application: type: string description: "Application name as IEM knows it" service_key: type: string description: "PD service key for incident handling" notification_channel: type: string description: "incident generation tool" remediation_action: type: string description: "remediation action" notifcation_enable: type: boolean description: "incident/notification generation enabled" check_single: title: check request single type: object check_set: title: set of checks type: array description: "check set" items: type: object
The use of `anyOf` means that the input would need to match one (or more) of the sub-schemas described in it.
The problem is that you have `anyOf` with two different types - `object` and `array`. The `required` and `properties` are at the same level of the `anyOf` - that means that they would only be applied `check_single` as its type is `object`. When you put type `array` alongside `required` or `properties`, the latter two would have no impact as they have no meaning with tpe `array`.
So what can you do to solve this?
Take the 'single' object definition and extract it to a model. For our purpose, let's call it `MyObject`.
So:
MyObject: type: object required: [...] properties: ...
And then you can define `check` as this:
check: anyOf: - $ref: '#/components/schemas/MyObject' - type: array items:
$ref: '#/components/schemas/MyObjectIn this case, you may want to use `oneOf` instead, because there will never be case where a compared input will have both.