pygeoapi
pygeoapi copied to clipboard
OpenAPI endpoint gives validation error
Came out of investigation for a WFS3 GeoHealthCheck plugin.
Interesting, there is quite some OpenAPI Python stuff out there, like a Spec Validator: https://github.com/p1c2u/openapi-spec-validator
Very easy to run, but gives validation errors on the pygeoapi
master
demo WFS3 I try:
$ pip install openapi-spec-validator
$ python
>>> from openapi_spec_validator import validate_spec_url
>>> validate_spec_url('https://demo.pygeoapi.io/master/api?f=json')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/just/.pyenv/versions/geohealthcheck2.7/lib/python2.7/site-packages/openapi_spec_validator/shortcuts.py", line 16, in validate
return validator_callable(spec, spec_url=url)
File "/Users/just/.pyenv/versions/geohealthcheck2.7/lib/python2.7/site-packages/openapi_spec_validator/validators.py", line 48, in validate
raise err
openapi_spec_validator.exceptions.OpenAPIValidationError: {'content': {'application/json': {'example': {'inputs': [{'type': 'text/plain', 'id': 'name', 'value': 'hi there'}]}, 'schema': {'x-scope': ['https://demo.pygeoapi.io/master/api?f=json'], '$ref': 'https://raw.githubusercontent.com/opengeospatial/wps-rest-binding/master/core/openapi/schemas/execute.yaml'}}}, 'required': True, 'description': 'Mandatory execute request JSON'} is not valid under any of the given schemas
Failed validating 'oneOf' in schema['properties']['paths']['patternProperties']['^/']['properties']['post']['properties']['requestBody']:
{'oneOf': [{'$ref': '#/definitions/requestBody'},
{'$ref': '#/definitions/reference'}]}
On instance['paths']['/processes/hello-world/jobs']['post']['requestBody']:
{'content': {'application/json': {'example': {'inputs': [{'id': 'name',
'type': 'text/plain',
'value': 'hi there'}]},
'schema': {'$ref': 'https://raw.githubusercontent.com/opengeospatial/wps-rest-binding/master/core/openapi/schemas/execute.yaml',
'x-scope': ['https://demo.pygeoapi.io/master/api?f=json']}}},
'description': 'Mandatory execute request JSON',
'required': True}
Has to do with Processes
. If I leave out /processes/hello-world/jobs
, then validates ok:
/processes/hello-world/jobs:
get:
description: Hello World process
.
.
responses:
200:
description: successful operation
400:
description: Invalid id supplied
404:
description: not found
summary: Process Hello World process execution
tags:
- hello-world
Some other, not all, WFS3 endpoints validate ok like:
>>> validate_spec_url('https://www.ldproxy.nrw.de/kataster/api/?f=json')
>>> validate_spec_url('http://beta.fmi.fi/data/3/wfs/sofp/api.json')
Ok nailed it down to this line:
schema:
$ref: https://raw.githubusercontent.com/opengeospatial/wps-rest-binding/master/core/openapi/schemas/execute.yaml
Here my OpenAPI knowledge lacks... Anyone from @pvgenuchten @tomkralidis ?
Not sure. The OpenAPI document works in https://editor.swagger.io fine
Maybe the validator https://github.com/p1c2u/openapi-spec-validator is more strict?
At least it does not like the execute.yaml schema. Also to me it looks a bit "strange" (though may be lack of understanding):
- the
hello-world
Process metadata is defined here - it specifies specific inputs/outputs definitions like
name
of typetext/plain
(should bestring
?) - the generated
openapi.yaml
only refers to the generic OGC WPS REST definitionexecute.yaml
I think i.s.o. execute.yaml
the pygeoapi-generated OpenAPI-specific inputs/outputs for hello-world
need to be defined from the PROCESS_METADATA
similar how example
is used. (and those defs need to be validated against the OGC WPS REST spec).
Maybe the validator https://github.com/p1c2u/openapi-spec-validator is more strict?
Is there an authoritative validator? For me, if it works in Swagger, it's fine (at this point). Swagger editor/UI is indeed interpreting the execute.yaml
as expected.
it specifies specific inputs/outputs definitions like name of type text/plain (should be string?)
This is what we see currently in the 52 North implementation, and should also get clearer in a couple of weeks
it specifies specific inputs/outputs definitions like name of type text/plain (should be string?)
This is in the spirit of WPS 2.0 REST. This is sure to be distilled / clarified at the OGC API Hackathon
Maybe the validator https://github.com/p1c2u/openapi-spec-validator is more strict?
Is there an authoritative validator? For me, if it works in Swagger, it's fine (at this point). Swagger editor/UI is indeed interpreting the
execute.yaml
as expected.
I expect OGC would be authoritative at some point (for OGC OpenAPI specs). IMHO https://github.com/p1c2u/openapi-spec-validator merely does a JSON-schema validation, similar to XML XSD validation e.g. with lxml
which delegates even to different underlying parsers like libxml2
depending on the installation. So multiple validators may do. I tried others like:
https://apidevtools.org/swagger-parser/online/ which gave similar errors on execute.yaml
(unless I disabled following external $refs
:
There' many others, few online: https://openapi.tools/
it specifies specific inputs/outputs definitions like name of type text/plain (should be string?)
This is what we see currently in the 52 North implementation, and should also get clearer in a couple of weeks
Yes I am aware that the OGC WPS REST spec is derived from the 52North one.
it specifies specific inputs/outputs definitions like name of type text/plain (should be string?)
This is in the spirit of WPS 2.0 REST. This is sure to be distilled / clarified at the OGC API Hackathon
Still I think we should somehow specify the requestBody
compliant with execute.yaml
, not refer to it. There e.g. outputs
is required. And a user needs to know which inputs
needs to be specified, not just an example
. But again this whole domain is relatively new to me...
Also starts me thinking of a more modular approach to pygeoapi
: a small kernel implementation and for each OGC API a module. Both in software and configuration. e.g. An implementation may only want to use Processes
and not be bothered with Features
(or the other way around).
Also starts me thinking of a more modular approach to pygeoapi: a small kernel implementation and for each OGC API a module. Both in software and configuration. e.g. An implementation may only want to use Processes and not be bothered with Features (or the other way around).
Agree. I think the user configuration should be enough to set off what gets turned on (or not)?
Also starts me thinking of a more modular approach to pygeoapi: a small kernel implementation and for each OGC API a module. Both in software and configuration. e.g. An implementation may only want to use Processes and not be bothered with Features (or the other way around).
Agree. I think the user configuration should be enough to set off what gets turned on (or not)?
For now, yes, was thinking longer-term even in software distributions with only modules/formats needed, bit like MapServer and GDAL though in Python we can be more flexible (on-the-fly i.s.o. compiled-in, within Stetl and GHC we do something similar with Plugins), but we have currently much more basic issues to work on.
To get back to the requestBody schema and looking at execute.yaml
: I think the pygeoapi
-generated OpenAPI schema for the Hello-World Process should be, including the example, something like:
post:
description: Hello World process
parameters: []
requestBody:
content:
application/json:
example:
inputs:
- id: name
input:
dataType:
name: text/plain
value: hi there
schema:
type: object
required:
- outputs
properties:
inputs:
type: array
items:
type: object
properties:
id:
type: string
pattern: '^name$'
input:
type: object
properties:
value:
type: string
dataType:
type: object
required:
- name
properties:
name:
type: string
pattern: '^text/plain$'
minItems: 1
maxItems: 1
outputs:
type: array
items:
type: object
properties:
.
.
etc
This validates ok. This schema should then additionally comply with execute.yaml.
So apart from validation tools etc, I think this is what pygeoapi
should generate. Or am I completely missing something? I know WPS is very generic (in inputs/outputs), but looks like the pygeoapi
Processes
are specific in parameterization. How would a user otherwise know which inputs
and outputs
to specify?
@justb4 this should be fixed given #718. Can you test/validate?
Thanks for this @tomkralidis ! Tried a couple of instances of pygeoapi (latest
as now about 50 mins old from DockerHub) with the GeoHealthCheck Probe "OpenAPI Validator".
- https://apitestbed.geonovum.nl/ghc/resource/1 for https://apitestbed.geonovum.nl/pygeoapi - now passes! (failed before)
- https://apitestbed.geonovum.nl/ghc/resource/14 for https://demo.pygeoapi.io/cite - passes!
- https://demo.geohealthcheck.org/resource/165 for https://demo.pygeoapi.io/master - still fails but with looks very different error message - see below
- https://apitestbed.geonovum.nl/ghc/resource/15 for https://demo.pygeoapi.io/covid-19 - passes!
They all run the same Docker Image version but with very different configs. Will need more investigation, but a major step ahead! Only pygeoapi
and ldproxy
pass the GHC OAS3 API Validator (which is basically a JSON-schema checker).
Error - demo.pygeoapi.io/master
Quite verbose, maybe easier to read on https://demo.geohealthcheck.org/resource/165
"end_time": "2021-06-29T13:59:02Z",
"message": "{'type': 'object', 'title': 'domainSet', 'description': 'The domainSet describes the *direct positions* of the coverage, i.e., the locations for which values are available.', 'oneOf': [{'required': ['type', 'generalGrid'], 'properties': {'type': {'enum': ['DomainSetType']}, 'generalGrid': {'title': 'General Grid', 'description': 'A general n-D grid is defined through a sequence of axes, each of which can be of a particular axis type.', 'type': 'object', 'required': ['type'], 'additionalProperties': False, 'properties': {'type': {'enum': ['GeneralGridCoverageType']}, 'id': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'axis': {'type': 'array', 'items': {'type': 'object', 'oneOf': [{'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, {'title': 'Regular Axis', 'description': 'A Regular Axis is an axis where all direct coordinates are at a common distance from its immediate neighbors.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound', 'resolution', 'uomLabel'], 'additionalProperties': False, 'properties': {'type': {'enum': ['RegularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'string'}, 'upperBound': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'resolution': {'type': 'number'}}}, {'title': 'Irregular Axis', 'description': 'An irregular axis enumerates all possible direct position coordinates.', 'required': ['type', 'axisLabel', 'uomLabel', 'coordinate'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IrregularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'coordinate': {'type': 'array', 'items': {'type': 'string'}}}}]}}, 'displacement': {'title': 'Displacement', 'description': 'A Displacement is a warped axis nest where points on the grid all have their individual direct position coordinates. The sequenceRule element describes linearization order.', 'type': 'object', 'oneOf': [{'required': ['type', 'axisLabels', 'uomLabels', 'coordinates'], 'properties': {'type': {'enum': ['DisplacementAxisNestType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'axisLabels', 'uomLabels', 'coordinatesRef'], 'properties': {'type': {'enum': ['DisplacementAxisNestTypeRef']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}, 'model': {'title': 'Sensor model', 'description': 'A Transformation By Sensor Model is a transformation definition which is given by a SensorML 2.0 transformation specification.', 'type': 'object', 'required': ['type', 'sensorModelRef'], 'properties': {'type': {'enum': ['TransformationBySensorModelType']}, 'id': {'type': 'string'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'sensorModelRef': {'type': 'string', 'format': 'uri'}, 'sensorInstanceRef': {'type': 'string', 'format': 'uri'}}}, 'gridLimits': {'title': 'Grid limits', 'description': 'This is the boundary of the array underlying the grid, given by its diagonal corner points in integer _60_3D. The grid limits can be omitted in case all axes are of type index axis, because then it repeats the grid information in a redundant way. The purpose of the axisLabels attribute, which lists the axis labels of all axisExtent elements in proper sequence, is to enforce axis sequence also in XML systems which do not preserve document order.', 'type': 'object', 'required': ['type'], 'properties': {'indexAxis': {'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'type': 'object', 'required': ['type', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}}}}}}}, {'required': ['type', 'directMultiPoint'], 'properties': {'type': {'enum': ['DomainSetType']}, 'directMultiPoint': {'oneOf': [{'required': ['type', 'coordinates'], 'properties': {'type': {'enum': ['DirectMultiPointType']}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'coordinatesRef'], 'properties': {'type': {'enum': ['DirectMultiPointTypeRef']}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}}}, {'required': ['type', 'fileReference'], 'properties': {'type': {'enum': ['DomainSetRefType']}, 'id': {'type': 'string', 'format': 'uri'}, 'fileReference': {'type': 'string', 'format': 'uri'}}}]} is not valid under any of the given schemas\n\nFailed validating 'oneOf' in schema['properties']['paths']['patternProperties']['^/']['properties']['get']['properties']['responses']['patternProperties']['^([0-9X]{3})$']:\n {'oneOf': [{'$ref': '#/definitions/response'},\n {'$ref': '#/definitions/reference'}]}\n\nOn instance['paths']['/collections/gdps-temperature/coverage/domainset']['get']['responses']['200']:\n {'description': 'The domainSet describes the *direct positions* of the '\n 'coverage, i.e., the locations for which values are '\n 'available.',\n 'oneOf': [{'properties': {'generalGrid': {'additionalProperties': False,\n 'description': 'A general '\n 'n-D grid is '\n 'defined '\n 'through a '\n 'sequence of '\n 'axes, each '\n 'of which '\n 'can be of a '\n 'particular '\n 'axis type.',\n 'properties': {'axis': {'items': {'oneOf': [{'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'A '\n 'Regular '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'where '\n 'all '\n 'direct '\n 'coordinates '\n 'are '\n 'at '\n 'a '\n 'common '\n 'distance '\n 'from '\n 'its '\n 'immediate '\n 'neighbors.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'string'},\n 'resolution': {'type': 'number'},\n 'type': {'enum': ['RegularAxisType']},\n 'uomLabel': {'type': 'string'},\n 'upperBound': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound',\n 'resolution',\n 'uomLabel'],\n 'title': 'Regular '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'An '\n 'irregular '\n 'axis '\n 'enumerates '\n 'all '\n 'possible '\n 'direct '\n 'position '\n 'coordinates.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'coordinate': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'type': {'enum': ['IrregularAxisType']},\n 'uomLabel': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'uomLabel',\n 'coordinate'],\n 'title': 'Irregular '\n 'Axis'}],\n 'type': 'object'},\n 'type': 'array'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'displacement': {'description': 'A '\n 'Displacement '\n 'is '\n 'a '\n 'warped '\n 'axis '\n 'nest '\n 'where '\n 'points '\n 'on '\n 'the '\n 'grid '\n 'all '\n 'have '\n 'their '\n 'individual '\n 'direct '\n 'position '\n 'coordinates. '\n 'The '\n 'sequenceRule '\n 'element '\n 'describes '\n 'linearization '\n 'order.',\n 'oneOf': [{'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinates']},\n {'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestTypeRef']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinatesRef']}],\n 'title': 'Displacement',\n 'type': 'object'},\n 'gridLimits': {'description': 'This '\n 'is '\n 'the '\n 'boundary '\n 'of '\n 'the '\n 'array '\n 'underlying '\n 'the '\n 'grid, '\n 'given '\n 'by '\n 'its '\n 'diagonal '\n 'corner '\n 'points '\n 'in '\n 'integer '\n '_60_3D. '\n 'The '\n 'grid '\n 'limits '\n 'can '\n 'be '\n 'omitted '\n 'in '\n 'case '\n 'all '\n 'axes '\n 'are '\n 'of '\n 'type '\n 'index '\n 'axis, '\n 'because '\n 'then '\n 'it '\n 'repeats '\n 'the '\n 'grid '\n 'information '\n 'in '\n 'a '\n 'redundant '\n 'way. '\n 'The '\n 'purpose '\n 'of '\n 'the '\n 'axisLabels '\n 'attribute, '\n 'which '\n 'lists '\n 'the '\n 'axis '\n 'labels '\n 'of '\n 'all '\n 'axisExtent '\n 'elements '\n 'in '\n 'proper '\n 'sequence, '\n 'is '\n 'to '\n 'enforce '\n 'axis '\n 'sequence '\n 'also '\n 'in '\n 'XML '\n 'systems '\n 'which '\n 'do '\n 'not '\n 'preserve '\n 'document '\n 'order.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'indexAxis': {'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'}},\n 'required': ['type'],\n 'title': 'Grid '\n 'limits',\n 'type': 'object'},\n 'id': {'type': 'string'},\n 'model': {'description': 'A '\n 'Transformation '\n 'By '\n 'Sensor '\n 'Model '\n 'is '\n 'a '\n 'transformation '\n 'definition '\n 'which '\n 'is '\n 'given '\n 'by '\n 'a '\n 'SensorML '\n '2.0 '\n 'transformation '\n 'specification.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'sensorInstanceRef': {'format': 'uri',\n 'type': 'string'},\n 'sensorModelRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['TransformationBySensorModelType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'sensorModelRef'],\n 'title': 'Sensor '\n 'model',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['GeneralGridCoverageType']}},\n 'required': ['type'],\n 'title': 'General Grid',\n 'type': 'object'},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'generalGrid']},\n {'properties': {'directMultiPoint': {'oneOf': [{'properties': {'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'type': {'enum': ['DirectMultiPointType']}},\n 'required': ['type',\n 'coordinates']},\n {'properties': {'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DirectMultiPointTypeRef']}},\n 'required': ['type',\n 'coordinatesRef']}]},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'directMultiPoint']},\n {'properties': {'fileReference': {'format': 'uri',\n 'type': 'string'},\n 'id': {'format': 'uri', 'type': 'string'},\n 'type': {'enum': ['DomainSetRefType']}},\n 'required': ['type', 'fileReference']}],\n 'title': 'domainSet',\n 'type': 'object'}",
"probes": [
{
"checks": [
{
"message": "OpenAPI Sanity Check",
"response_time": "0.851342",
"success": true
},
{
"message": "{'type': 'object', 'title': 'domainSet', 'description': 'The domainSet describes the *direct positions* of the coverage, i.e., the locations for which values are available.', 'oneOf': [{'required': ['type', 'generalGrid'], 'properties': {'type': {'enum': ['DomainSetType']}, 'generalGrid': {'title': 'General Grid', 'description': 'A general n-D grid is defined through a sequence of axes, each of which can be of a particular axis type.', 'type': 'object', 'required': ['type'], 'additionalProperties': False, 'properties': {'type': {'enum': ['GeneralGridCoverageType']}, 'id': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'axis': {'type': 'array', 'items': {'type': 'object', 'oneOf': [{'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, {'title': 'Regular Axis', 'description': 'A Regular Axis is an axis where all direct coordinates are at a common distance from its immediate neighbors.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound', 'resolution', 'uomLabel'], 'additionalProperties': False, 'properties': {'type': {'enum': ['RegularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'string'}, 'upperBound': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'resolution': {'type': 'number'}}}, {'title': 'Irregular Axis', 'description': 'An irregular axis enumerates all possible direct position coordinates.', 'required': ['type', 'axisLabel', 'uomLabel', 'coordinate'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IrregularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'coordinate': {'type': 'array', 'items': {'type': 'string'}}}}]}}, 'displacement': {'title': 'Displacement', 'description': 'A Displacement is a warped axis nest where points on the grid all have their individual direct position coordinates. The sequenceRule element describes linearization order.', 'type': 'object', 'oneOf': [{'required': ['type', 'axisLabels', 'uomLabels', 'coordinates'], 'properties': {'type': {'enum': ['DisplacementAxisNestType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'axisLabels', 'uomLabels', 'coordinatesRef'], 'properties': {'type': {'enum': ['DisplacementAxisNestTypeRef']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}, 'model': {'title': 'Sensor model', 'description': 'A Transformation By Sensor Model is a transformation definition which is given by a SensorML 2.0 transformation specification.', 'type': 'object', 'required': ['type', 'sensorModelRef'], 'properties': {'type': {'enum': ['TransformationBySensorModelType']}, 'id': {'type': 'string'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'sensorModelRef': {'type': 'string', 'format': 'uri'}, 'sensorInstanceRef': {'type': 'string', 'format': 'uri'}}}, 'gridLimits': {'title': 'Grid limits', 'description': 'This is the boundary of the array underlying the grid, given by its diagonal corner points in integer _60_3D. The grid limits can be omitted in case all axes are of type index axis, because then it repeats the grid information in a redundant way. The purpose of the axisLabels attribute, which lists the axis labels of all axisExtent elements in proper sequence, is to enforce axis sequence also in XML systems which do not preserve document order.', 'type': 'object', 'required': ['type'], 'properties': {'indexAxis': {'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'type': 'object', 'required': ['type', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}}}}}}}, {'required': ['type', 'directMultiPoint'], 'properties': {'type': {'enum': ['DomainSetType']}, 'directMultiPoint': {'oneOf': [{'required': ['type', 'coordinates'], 'properties': {'type': {'enum': ['DirectMultiPointType']}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'coordinatesRef'], 'properties': {'type': {'enum': ['DirectMultiPointTypeRef']}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}}}, {'required': ['type', 'fileReference'], 'properties': {'type': {'enum': ['DomainSetRefType']}, 'id': {'type': 'string', 'format': 'uri'}, 'fileReference': {'type': 'string', 'format': 'uri'}}}]} is not valid under any of the given schemas\n\nFailed validating 'oneOf' in schema['properties']['paths']['patternProperties']['^/']['properties']['get']['properties']['responses']['patternProperties']['^([0-9X]{3})$']:\n {'oneOf': [{'$ref': '#/definitions/response'},\n {'$ref': '#/definitions/reference'}]}\n\nOn instance['paths']['/collections/gdps-temperature/coverage/domainset']['get']['responses']['200']:\n {'description': 'The domainSet describes the *direct positions* of the '\n 'coverage, i.e., the locations for which values are '\n 'available.',\n 'oneOf': [{'properties': {'generalGrid': {'additionalProperties': False,\n 'description': 'A general '\n 'n-D grid is '\n 'defined '\n 'through a '\n 'sequence of '\n 'axes, each '\n 'of which '\n 'can be of a '\n 'particular '\n 'axis type.',\n 'properties': {'axis': {'items': {'oneOf': [{'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'A '\n 'Regular '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'where '\n 'all '\n 'direct '\n 'coordinates '\n 'are '\n 'at '\n 'a '\n 'common '\n 'distance '\n 'from '\n 'its '\n 'immediate '\n 'neighbors.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'string'},\n 'resolution': {'type': 'number'},\n 'type': {'enum': ['RegularAxisType']},\n 'uomLabel': {'type': 'string'},\n 'upperBound': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound',\n 'resolution',\n 'uomLabel'],\n 'title': 'Regular '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'An '\n 'irregular '\n 'axis '\n 'enumerates '\n 'all '\n 'possible '\n 'direct '\n 'position '\n 'coordinates.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'coordinate': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'type': {'enum': ['IrregularAxisType']},\n 'uomLabel': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'uomLabel',\n 'coordinate'],\n 'title': 'Irregular '\n 'Axis'}],\n 'type': 'object'},\n 'type': 'array'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'displacement': {'description': 'A '\n 'Displacement '\n 'is '\n 'a '\n 'warped '\n 'axis '\n 'nest '\n 'where '\n 'points '\n 'on '\n 'the '\n 'grid '\n 'all '\n 'have '\n 'their '\n 'individual '\n 'direct '\n 'position '\n 'coordinates. '\n 'The '\n 'sequenceRule '\n 'element '\n 'describes '\n 'linearization '\n 'order.',\n 'oneOf': [{'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinates']},\n {'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestTypeRef']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinatesRef']}],\n 'title': 'Displacement',\n 'type': 'object'},\n 'gridLimits': {'description': 'This '\n 'is '\n 'the '\n 'boundary '\n 'of '\n 'the '\n 'array '\n 'underlying '\n 'the '\n 'grid, '\n 'given '\n 'by '\n 'its '\n 'diagonal '\n 'corner '\n 'points '\n 'in '\n 'integer '\n '_60_3D. '\n 'The '\n 'grid '\n 'limits '\n 'can '\n 'be '\n 'omitted '\n 'in '\n 'case '\n 'all '\n 'axes '\n 'are '\n 'of '\n 'type '\n 'index '\n 'axis, '\n 'because '\n 'then '\n 'it '\n 'repeats '\n 'the '\n 'grid '\n 'information '\n 'in '\n 'a '\n 'redundant '\n 'way. '\n 'The '\n 'purpose '\n 'of '\n 'the '\n 'axisLabels '\n 'attribute, '\n 'which '\n 'lists '\n 'the '\n 'axis '\n 'labels '\n 'of '\n 'all '\n 'axisExtent '\n 'elements '\n 'in '\n 'proper '\n 'sequence, '\n 'is '\n 'to '\n 'enforce '\n 'axis '\n 'sequence '\n 'also '\n 'in '\n 'XML '\n 'systems '\n 'which '\n 'do '\n 'not '\n 'preserve '\n 'document '\n 'order.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'indexAxis': {'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'}},\n 'required': ['type'],\n 'title': 'Grid '\n 'limits',\n 'type': 'object'},\n 'id': {'type': 'string'},\n 'model': {'description': 'A '\n 'Transformation '\n 'By '\n 'Sensor '\n 'Model '\n 'is '\n 'a '\n 'transformation '\n 'definition '\n 'which '\n 'is '\n 'given '\n 'by '\n 'a '\n 'SensorML '\n '2.0 '\n 'transformation '\n 'specification.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'sensorInstanceRef': {'format': 'uri',\n 'type': 'string'},\n 'sensorModelRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['TransformationBySensorModelType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'sensorModelRef'],\n 'title': 'Sensor '\n 'model',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['GeneralGridCoverageType']}},\n 'required': ['type'],\n 'title': 'General Grid',\n 'type': 'object'},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'generalGrid']},\n {'properties': {'directMultiPoint': {'oneOf': [{'properties': {'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'type': {'enum': ['DirectMultiPointType']}},\n 'required': ['type',\n 'coordinates']},\n {'properties': {'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DirectMultiPointTypeRef']}},\n 'required': ['type',\n 'coordinatesRef']}]},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'directMultiPoint']},\n {'properties': {'fileReference': {'format': 'uri',\n 'type': 'string'},\n 'id': {'format': 'uri', 'type': 'string'},\n 'type': {'enum': ['DomainSetRefType']}},\n 'required': ['type', 'fileReference']}],\n 'title': 'domainSet',\n 'type': 'object'}",
"response_time": "1.167665",
"success": false
},
{
"message": "{'title': 'rangeType', 'description': \"The rangeType element describes the structure and semantics of a coverage's range values, including (optionally) restrictions on the interpolation allowed on such values.\", 'type': 'object', 'oneOf': [{'required': ['type', 'field'], 'properties': {'type': {'enum': ['DataRecordType']}, 'field': {'type': 'array', 'items': {'title': 'quantity', 'description': 'quantiy', 'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['QuantityType']}, 'id': {'type': 'string', 'format': 'uri'}, 'name': {'type': 'string'}, 'definition': {'type': 'string', 'format': 'uri'}, 'uom': {'title': 'units of measure', 'description': 'units of measure', 'type': 'object', 'required': ['type', 'code'], 'properties': {'type': {'enum': ['UnitReference']}, 'id': {'type': 'string', 'format': 'uri'}, 'code': {'type': 'string'}}}, 'constraint': {'title': 'Constraint', 'description': 'Constraint', 'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['AllowedValues']}, 'id': {'type': 'string', 'format': 'uri'}, 'interval': {'type': 'array', 'items': {'type': 'string'}}}}}}}, 'interpolationRestriction': {'title': 'interpolationRestriction', 'description': 'Interpolation restriction', 'type': 'object', 'required': ['type'], 'properties': {'type': {'enum': ['InterpolationRestrictionType']}, 'id': {'type': 'string', 'format': 'uri'}, 'allowedInterpolation': {'type': 'array', 'items': {'type': 'string', 'format': 'uri'}}}}}}, {'required': ['type', 'fileReference'], 'properties': {'type': {'enum': ['RangeTypeRefType']}, 'id': {'type': 'string', 'format': 'uri'}, 'fileReference': {'type': 'string', 'format': 'uri'}}}]} is not valid under any of the given schemas\n\nFailed validating 'oneOf' in schema['properties']['paths']['patternProperties']['^/']['properties']['get']['properties']['responses']['patternProperties']['^([0-9X]{3})$']:\n {'oneOf': [{'$ref': '#/definitions/response'},\n {'$ref': '#/definitions/reference'}]}\n\nOn instance['paths']['/collections/gdps-temperature/coverage/rangetype']['get']['responses']['200']:\n {'description': 'The rangeType element describes the structure and '\n \"semantics of a coverage's range values, including \"\n '(optionally) restrictions on the interpolation '\n 'allowed on such values.',\n 'oneOf': [{'properties': {'field': {'items': {'description': 'quantiy',\n 'properties': {'constraint': {'description': 'Constraint',\n 'properties': {'id': {'format': 'uri',\n 'type': 'string'},\n 'interval': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': {'enum': ['AllowedValues']}},\n 'required': ['type'],\n 'title': 'Constraint',\n 'type': 'object'},\n 'definition': {'format': 'uri',\n 'type': 'string'},\n 'id': {'format': 'uri',\n 'type': 'string'},\n 'name': {'type': 'string'},\n 'type': {'enum': ['QuantityType']},\n 'uom': {'description': 'units '\n 'of '\n 'measure',\n 'properties': {'code': {'type': 'string'},\n 'id': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['UnitReference']}},\n 'required': ['type',\n 'code'],\n 'title': 'units '\n 'of '\n 'measure',\n 'type': 'object'}},\n 'required': ['type'],\n 'title': 'quantity',\n 'type': 'object'},\n 'type': 'array'},\n 'interpolationRestriction': {'description': 'Interpolation '\n 'restriction',\n 'properties': {'allowedInterpolation': {'items': {'format': 'uri',\n 'type': 'string'},\n 'type': 'array'},\n 'id': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['InterpolationRestrictionType']}},\n 'required': ['type'],\n 'title': 'interpolationRestriction',\n 'type': 'object'},\n 'type': {'enum': ['DataRecordType']}},\n 'required': ['type', 'field']},\n {'properties': {'fileReference': {'format': 'uri',\n 'type': 'string'},\n 'id': {'format': 'uri', 'type': 'string'},\n 'type': {'enum': ['RangeTypeRefType']}},\n 'required': ['type', 'fileReference']}],\n 'title': 'rangeType',\n 'type': 'object'}",
"response_time": "0.222368",
"success": false
},
{
"message": "OpenAPI Compliance Result:second must be in 0..59",
"response_time": "0.877420",
"success": false
}
],
"class": "GeoHealthCheck.plugins.probe.wfs3.WFS3OpenAPIValidator",
"message": "{'type': 'object', 'title': 'domainSet', 'description': 'The domainSet describes the *direct positions* of the coverage, i.e., the locations for which values are available.', 'oneOf': [{'required': ['type', 'generalGrid'], 'properties': {'type': {'enum': ['DomainSetType']}, 'generalGrid': {'title': 'General Grid', 'description': 'A general n-D grid is defined through a sequence of axes, each of which can be of a particular axis type.', 'type': 'object', 'required': ['type'], 'additionalProperties': False, 'properties': {'type': {'enum': ['GeneralGridCoverageType']}, 'id': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'axis': {'type': 'array', 'items': {'type': 'object', 'oneOf': [{'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, {'title': 'Regular Axis', 'description': 'A Regular Axis is an axis where all direct coordinates are at a common distance from its immediate neighbors.', 'required': ['type', 'axisLabel', 'lowerBound', 'upperBound', 'resolution', 'uomLabel'], 'additionalProperties': False, 'properties': {'type': {'enum': ['RegularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'string'}, 'upperBound': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'resolution': {'type': 'number'}}}, {'title': 'Irregular Axis', 'description': 'An irregular axis enumerates all possible direct position coordinates.', 'required': ['type', 'axisLabel', 'uomLabel', 'coordinate'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IrregularAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'uomLabel': {'type': 'string'}, 'coordinate': {'type': 'array', 'items': {'type': 'string'}}}}]}}, 'displacement': {'title': 'Displacement', 'description': 'A Displacement is a warped axis nest where points on the grid all have their individual direct position coordinates. The sequenceRule element describes linearization order.', 'type': 'object', 'oneOf': [{'required': ['type', 'axisLabels', 'uomLabels', 'coordinates'], 'properties': {'type': {'enum': ['DisplacementAxisNestType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'axisLabels', 'uomLabels', 'coordinatesRef'], 'properties': {'type': {'enum': ['DisplacementAxisNestTypeRef']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}, 'model': {'title': 'Sensor model', 'description': 'A Transformation By Sensor Model is a transformation definition which is given by a SensorML 2.0 transformation specification.', 'type': 'object', 'required': ['type', 'sensorModelRef'], 'properties': {'type': {'enum': ['TransformationBySensorModelType']}, 'id': {'type': 'string'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}, 'uomLabels': {'type': 'array', 'items': {'type': 'string'}}, 'sensorModelRef': {'type': 'string', 'format': 'uri'}, 'sensorInstanceRef': {'type': 'string', 'format': 'uri'}}}, 'gridLimits': {'title': 'Grid limits', 'description': 'This is the boundary of the array underlying the grid, given by its diagonal corner points in integer _60_3D. The grid limits can be omitted in case all axes are of type index axis, because then it repeats the grid information in a redundant way. The purpose of the axisLabels attribute, which lists the axis labels of all axisExtent elements in proper sequence, is to enforce axis sequence also in XML systems which do not preserve document order.', 'type': 'object', 'required': ['type'], 'properties': {'indexAxis': {'title': 'Index Axis', 'description': 'An Index Axis is an axis with only integer positions allowed.', 'type': 'object', 'required': ['type', 'lowerBound', 'upperBound'], 'additionalProperties': False, 'properties': {'type': {'enum': ['IndexAxisType']}, 'id': {'type': 'string'}, 'axisLabel': {'type': 'string'}, 'lowerBound': {'type': 'number'}, 'upperBound': {'type': 'number'}}}, 'srsName': {'type': 'string', 'format': 'uri'}, 'axisLabels': {'type': 'array', 'items': {'type': 'string'}}}}}}}}, {'required': ['type', 'directMultiPoint'], 'properties': {'type': {'enum': ['DomainSetType']}, 'directMultiPoint': {'oneOf': [{'required': ['type', 'coordinates'], 'properties': {'type': {'enum': ['DirectMultiPointType']}, 'coordinates': {'type': 'array', 'items': {'type': 'array', 'items': {'type': 'string'}}}}}, {'required': ['type', 'coordinatesRef'], 'properties': {'type': {'enum': ['DirectMultiPointTypeRef']}, 'coordinatesRef': {'type': 'string', 'format': 'uri'}}}]}}}, {'required': ['type', 'fileReference'], 'properties': {'type': {'enum': ['DomainSetRefType']}, 'id': {'type': 'string', 'format': 'uri'}, 'fileReference': {'type': 'string', 'format': 'uri'}}}]} is not valid under any of the given schemas\n\nFailed validating 'oneOf' in schema['properties']['paths']['patternProperties']['^/']['properties']['get']['properties']['responses']['patternProperties']['^([0-9X]{3})$']:\n {'oneOf': [{'$ref': '#/definitions/response'},\n {'$ref': '#/definitions/reference'}]}\n\nOn instance['paths']['/collections/gdps-temperature/coverage/domainset']['get']['responses']['200']:\n {'description': 'The domainSet describes the *direct positions* of the '\n 'coverage, i.e., the locations for which values are '\n 'available.',\n 'oneOf': [{'properties': {'generalGrid': {'additionalProperties': False,\n 'description': 'A general '\n 'n-D grid is '\n 'defined '\n 'through a '\n 'sequence of '\n 'axes, each '\n 'of which '\n 'can be of a '\n 'particular '\n 'axis type.',\n 'properties': {'axis': {'items': {'oneOf': [{'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'A '\n 'Regular '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'where '\n 'all '\n 'direct '\n 'coordinates '\n 'are '\n 'at '\n 'a '\n 'common '\n 'distance '\n 'from '\n 'its '\n 'immediate '\n 'neighbors.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'string'},\n 'resolution': {'type': 'number'},\n 'type': {'enum': ['RegularAxisType']},\n 'uomLabel': {'type': 'string'},\n 'upperBound': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'lowerBound',\n 'upperBound',\n 'resolution',\n 'uomLabel'],\n 'title': 'Regular '\n 'Axis'},\n {'additionalProperties': False,\n 'description': 'An '\n 'irregular '\n 'axis '\n 'enumerates '\n 'all '\n 'possible '\n 'direct '\n 'position '\n 'coordinates.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'coordinate': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'type': {'enum': ['IrregularAxisType']},\n 'uomLabel': {'type': 'string'}},\n 'required': ['type',\n 'axisLabel',\n 'uomLabel',\n 'coordinate'],\n 'title': 'Irregular '\n 'Axis'}],\n 'type': 'object'},\n 'type': 'array'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'displacement': {'description': 'A '\n 'Displacement '\n 'is '\n 'a '\n 'warped '\n 'axis '\n 'nest '\n 'where '\n 'points '\n 'on '\n 'the '\n 'grid '\n 'all '\n 'have '\n 'their '\n 'individual '\n 'direct '\n 'position '\n 'coordinates. '\n 'The '\n 'sequenceRule '\n 'element '\n 'describes '\n 'linearization '\n 'order.',\n 'oneOf': [{'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinates']},\n {'properties': {'axisLabel': {'type': 'string'},\n 'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'id': {'type': 'string'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DisplacementAxisNestTypeRef']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'axisLabels',\n 'uomLabels',\n 'coordinatesRef']}],\n 'title': 'Displacement',\n 'type': 'object'},\n 'gridLimits': {'description': 'This '\n 'is '\n 'the '\n 'boundary '\n 'of '\n 'the '\n 'array '\n 'underlying '\n 'the '\n 'grid, '\n 'given '\n 'by '\n 'its '\n 'diagonal '\n 'corner '\n 'points '\n 'in '\n 'integer '\n '_60_3D. '\n 'The '\n 'grid '\n 'limits '\n 'can '\n 'be '\n 'omitted '\n 'in '\n 'case '\n 'all '\n 'axes '\n 'are '\n 'of '\n 'type '\n 'index '\n 'axis, '\n 'because '\n 'then '\n 'it '\n 'repeats '\n 'the '\n 'grid '\n 'information '\n 'in '\n 'a '\n 'redundant '\n 'way. '\n 'The '\n 'purpose '\n 'of '\n 'the '\n 'axisLabels '\n 'attribute, '\n 'which '\n 'lists '\n 'the '\n 'axis '\n 'labels '\n 'of '\n 'all '\n 'axisExtent '\n 'elements '\n 'in '\n 'proper '\n 'sequence, '\n 'is '\n 'to '\n 'enforce '\n 'axis '\n 'sequence '\n 'also '\n 'in '\n 'XML '\n 'systems '\n 'which '\n 'do '\n 'not '\n 'preserve '\n 'document '\n 'order.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'indexAxis': {'additionalProperties': False,\n 'description': 'An '\n 'Index '\n 'Axis '\n 'is '\n 'an '\n 'axis '\n 'with '\n 'only '\n 'integer '\n 'positions '\n 'allowed.',\n 'properties': {'axisLabel': {'type': 'string'},\n 'id': {'type': 'string'},\n 'lowerBound': {'type': 'number'},\n 'type': {'enum': ['IndexAxisType']},\n 'upperBound': {'type': 'number'}},\n 'required': ['type',\n 'lowerBound',\n 'upperBound'],\n 'title': 'Index '\n 'Axis',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'}},\n 'required': ['type'],\n 'title': 'Grid '\n 'limits',\n 'type': 'object'},\n 'id': {'type': 'string'},\n 'model': {'description': 'A '\n 'Transformation '\n 'By '\n 'Sensor '\n 'Model '\n 'is '\n 'a '\n 'transformation '\n 'definition '\n 'which '\n 'is '\n 'given '\n 'by '\n 'a '\n 'SensorML '\n '2.0 '\n 'transformation '\n 'specification.',\n 'properties': {'axisLabels': {'items': {'type': 'string'},\n 'type': 'array'},\n 'id': {'type': 'string'},\n 'sensorInstanceRef': {'format': 'uri',\n 'type': 'string'},\n 'sensorModelRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['TransformationBySensorModelType']},\n 'uomLabels': {'items': {'type': 'string'},\n 'type': 'array'}},\n 'required': ['type',\n 'sensorModelRef'],\n 'title': 'Sensor '\n 'model',\n 'type': 'object'},\n 'srsName': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['GeneralGridCoverageType']}},\n 'required': ['type'],\n 'title': 'General Grid',\n 'type': 'object'},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'generalGrid']},\n {'properties': {'directMultiPoint': {'oneOf': [{'properties': {'coordinates': {'items': {'items': {'type': 'string'},\n 'type': 'array'},\n 'type': 'array'},\n 'type': {'enum': ['DirectMultiPointType']}},\n 'required': ['type',\n 'coordinates']},\n {'properties': {'coordinatesRef': {'format': 'uri',\n 'type': 'string'},\n 'type': {'enum': ['DirectMultiPointTypeRef']}},\n 'required': ['type',\n 'coordinatesRef']}]},\n 'type': {'enum': ['DomainSetType']}},\n 'required': ['type', 'directMultiPoint']},\n {'properties': {'fileReference': {'format': 'uri',\n 'type': 'string'},\n 'id': {'format': 'uri', 'type': 'string'},\n 'type': {'enum': ['DomainSetRefType']}},\n 'required': ['type', 'fileReference']}],\n 'title': 'domainSet',\n 'type': 'object'}",
"name": "OGC API Features (OAFeat) OpenAPI Validator",
"probe_id": 1574,
"response_time": "3.118951",
"success": false
},
As per RFC4, this Issue has been inactive for 90 days. In order to manage maintenance burden, it will be automatically closed in 7 days.
As per RFC4, this Issue has been closed due to there being no activity for more than 90 days.