1
0
Fork 0

Bug fix/fix swagger datatype (#9045)

* remove http so https arangos will work

* verify that query parameters are proper swagger data types, fix offending documentation files

* return the actual type - not the list of available ones

* check formats

* there is no uint64 in swagger

* fresh swagger
This commit is contained in:
Wilfried Goesgens 2019-07-29 22:20:35 +02:00 committed by Simran
parent 7945e01037
commit b9020abc11
6 changed files with 419 additions and 182 deletions

View File

@ -20,7 +20,7 @@ Should be set to the value of the *x-arango-replication-lastscanned* header
or alternatively 0 on first try. This allows the rocksdb engine to break up or alternatively 0 on first try. This allows the rocksdb engine to break up
large transactions over multiple responses. large transactions over multiple responses.
@RESTQUERYPARAM{global,bool,optional} @RESTQUERYPARAM{global,boolean,optional}
Whether operations for all databases should be included. When set to *false* Whether operations for all databases should be included. When set to *false*
only the operations for the current database are included. The value *true* is only the operations for the current database are included. The value *true* is
only valid on the *_system* database. The default is *false*. only valid on the *_system* database. The default is *false*.

View File

@ -12,7 +12,7 @@ The name of the view.
The view properties. If specified, then *properties* should be a JSON object The view properties. If specified, then *properties* should be a JSON object
containing the following attributes: containing the following attributes:
@RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,int64}
Wait at least this many commits between removing unused files in the Wait at least this many commits between removing unused files in the
ArangoSearch data directory (default: 10, to disable use: 0). ArangoSearch data directory (default: 10, to disable use: 0).
For the case where the consolidation policies merge segments often (i.e. a lot For the case where the consolidation policies merge segments often (i.e. a lot
@ -29,7 +29,7 @@ _Background:_
However, the files for the released states/snapshots are left on disk, and However, the files for the released states/snapshots are left on disk, and
only removed by "cleanup" operation. only removed by "cleanup" operation.
@RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between committing view data store Wait at least this many milliseconds between committing view data store
changes and making documents visible to queries (default: 1000, to disable changes and making documents visible to queries (default: 1000, to disable
use: 0). use: 0).
@ -52,7 +52,7 @@ _Background:_
still continue to return a repeatable-read state. still continue to return a repeatable-read state.
@RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between applying 'consolidationPolicy' to Wait at least this many milliseconds between applying 'consolidationPolicy' to
consolidate view data store and possibly release space on the filesystem consolidate view data store and possibly release space on the filesystem
(default: 60000, to disable use: 0). (default: 60000, to disable use: 0).

View File

@ -13,7 +13,7 @@ The type of the view. must be equal to *"arangosearch"*
The view properties. If specified, then *properties* should be a JSON object The view properties. If specified, then *properties* should be a JSON object
containing the following attributes: containing the following attributes:
@RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,int64}
Wait at least this many commits between removing unused files in the Wait at least this many commits between removing unused files in the
ArangoSearch data directory (default: 10, to disable use: 0). ArangoSearch data directory (default: 10, to disable use: 0).
For the case where the consolidation policies merge segments often (i.e. a lot For the case where the consolidation policies merge segments often (i.e. a lot
@ -30,7 +30,7 @@ _Background:_
However, the files for the released states/snapshots are left on disk, and However, the files for the released states/snapshots are left on disk, and
only removed by "cleanup" operation. only removed by "cleanup" operation.
@RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between committing view data store Wait at least this many milliseconds between committing view data store
changes and making documents visible to queries (default: 1000, to disable changes and making documents visible to queries (default: 1000, to disable
use: 0). use: 0).
@ -53,7 +53,7 @@ _Background:_
still continue to return a repeatable-read state. still continue to return a repeatable-read state.
@RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between applying 'consolidationPolicy' to Wait at least this many milliseconds between applying 'consolidationPolicy' to
consolidate view data store and possibly release space on the filesystem consolidate view data store and possibly release space on the filesystem
(default: 60000, to disable use: 0). (default: 60000, to disable use: 0).

View File

@ -12,7 +12,7 @@ The name of the view.
The view properties. If specified, then *properties* should be a JSON object The view properties. If specified, then *properties* should be a JSON object
containing the following attributes: containing the following attributes:
@RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{cleanupIntervalStep,post_api_view_props,integer,optional,int64}
Wait at least this many commits between removing unused files in the Wait at least this many commits between removing unused files in the
ArangoSearch data directory (default: 10, to disable use: 0). ArangoSearch data directory (default: 10, to disable use: 0).
For the case where the consolidation policies merge segments often (i.e. a lot For the case where the consolidation policies merge segments often (i.e. a lot
@ -29,7 +29,7 @@ _Background:_
However, the files for the released states/snapshots are left on disk, and However, the files for the released states/snapshots are left on disk, and
only removed by "cleanup" operation. only removed by "cleanup" operation.
@RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{commitIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between committing view data store Wait at least this many milliseconds between committing view data store
changes and making documents visible to queries (default: 1000, to disable changes and making documents visible to queries (default: 1000, to disable
use: 0). use: 0).
@ -52,7 +52,7 @@ _Background:_
still continue to return a repeatable-read state. still continue to return a repeatable-read state.
@RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,uint64} @RESTSTRUCT{consolidationIntervalMsec,post_api_view_props,integer,optional,int64}
Wait at least this many milliseconds between applying 'consolidationPolicy' to Wait at least this many milliseconds between applying 'consolidationPolicy' to
consolidate view data store and possibly release space on the filesystem consolidate view data store and possibly release space on the filesystem
(default: 60000, to disable use: 0). (default: 60000, to disable use: 0).

File diff suppressed because one or more lines are too long

View File

@ -65,7 +65,34 @@ swagger = {
} }
}, },
"basePath": "/", "basePath": "/",
"definitions": {}, "definitions": {
"ARANGO_ERROR": {
"description": "An ArangoDB Error code",
"type": "integer"
},
"ArangoError": {
"description": "the arangodb error type",
"properties": {
"code": {
"description": "the HTTP Status code",
"type": "integer"
},
"error": {
"description": "boolean flag to indicate whether an error occurred (*true* in this case)",
"type": "boolean"
},
"errorMessage": {
"description": "a descriptive error message describing what happened, may contain additional information",
"type": "string"
},
"errorNum": {
"description": "the ARANGO_ERROR code",
"type": "integer"
}
}
}
},
"paths" : {} "paths" : {}
} }
@ -76,6 +103,7 @@ swagger = {
swaggerBaseTypes = [ swaggerBaseTypes = [
'object', 'object',
'array', 'array',
'number',
'integer', 'integer',
'long', 'long',
'float', 'float',
@ -89,6 +117,11 @@ swaggerBaseTypes = [
'password' 'password'
] ]
swaggerFormats = {
"number": ["", "float", "double"],
"integer": ["", "int32", "int64"]
}
################################################################################ ################################################################################
### @brief length of the swagger definition namespace ### @brief length of the swagger definition namespace
################################################################################ ################################################################################
@ -362,10 +395,10 @@ class StateMachine:
raise RuntimeError("Invalid target %s" % newState) raise RuntimeError("Invalid target %s" % newState)
else: else:
handler = newState handler = newState
except: except Exception as x:
print >> sys.stderr, "while parsing '" + self.fn + "'" print >> sys.stderr, "while parsing '" + self.fn + "'"
print >> sys.stderr, "trying to use handler '" + handler.__name__ + "'" print >> sys.stderr, "trying to use handler '" + handler.__name__ + "'"
raise raise x
################################################################################ ################################################################################
### @brief Regexen ### @brief Regexen
@ -506,9 +539,9 @@ def generic_handler_desc(cargo, r, message, op, para, name):
if op: if op:
try: try:
operation[op].append(para) operation[op].append(para)
except AttributeError: except AttributeError as x:
print >> sys.stderr, "trying to set '%s' on operations - failed. '%s'" % (op, para) print >> sys.stderr, "trying to set '%s' on operations - failed. '%s'" % (op, para)
raise raise x
return next, c return next, c
line = Typography(line) line = Typography(line)
@ -525,7 +558,7 @@ def start_docublock(cargo, r=Regexen()):
currentDocuBlock = last.split(' ')[1].rstrip() currentDocuBlock = last.split(' ')[1].rstrip()
except Exception as x: except Exception as x:
print >> sys.stderr, "failed to fetch docublock in '" + last + "': " + str(x) print >> sys.stderr, "failed to fetch docublock in '" + last + "': " + str(x)
raise raise x
return generic_handler(cargo, r, 'start_docublock') return generic_handler(cargo, r, 'start_docublock')
@ -715,7 +748,7 @@ def restbodyparam(cargo, r=Regexen()):
except Exception: except Exception:
print >> sys.stderr, "RESTBODYPARAM: 4 arguments required. You gave me: " + parameters(last) print >> sys.stderr, "RESTBODYPARAM: 4 arguments required. You gave me: " + parameters(last)
print >> sys.stderr, "In this docublock: " + currentDocuBlock print >> sys.stderr, "In this docublock: " + currentDocuBlock
raise raise Exception("Argument count error")
CheckReqOpt(required) CheckReqOpt(required)
if required == 'required': if required == 'required':
@ -784,6 +817,9 @@ def restbodyparam(cargo, r=Regexen()):
elif ptype == 'object': elif ptype == 'object':
swagger['definitions'][currentDocuBlock]['properties'][name]['additionalProperties'] = {} swagger['definitions'][currentDocuBlock]['properties'][name]['additionalProperties'] = {}
elif ptype != 'string': elif ptype != 'string':
if ptype in swaggerFormats and ptype2 not in swaggerFormats[ptype]:
print >> sys.stderr, "RESTSTRUCT: ptype2 (format)[" + ptype2 + "] not valid: " + parameters(last)
raise Exception("'%s' is not one of %s!" % (ptype2, str(swaggerFormats)))
swagger['definitions'][currentDocuBlock]['properties'][name]['format'] = ptype2 swagger['definitions'][currentDocuBlock]['properties'][name]['format'] = ptype2
@ -844,7 +880,7 @@ def reststruct(cargo, r=Regexen()):
(name, className, ptype, required, ptype2) = parameters(last).split(',') (name, className, ptype, required, ptype2) = parameters(last).split(',')
except Exception: except Exception:
print >> sys.stderr, "RESTSTRUCT: 5 arguments required (name, className, ptype, required, ptype2). You gave me: " + parameters(last) print >> sys.stderr, "RESTSTRUCT: 5 arguments required (name, className, ptype, required, ptype2). You gave me: " + parameters(last)
raise raise Exception("Argument count error")
CheckReqOpt(required) CheckReqOpt(required)
if required == 'required': if required == 'required':
@ -894,6 +930,9 @@ def reststruct(cargo, r=Regexen()):
'description') 'description')
elif ptype != 'string' and ptype != 'boolean': elif ptype != 'string' and ptype != 'boolean':
if ptype in swaggerFormats and ptype2 not in swaggerFormats[ptype]:
print >> sys.stderr, "RESTSTRUCT: ptype2 (format)[" + ptype2 + "] not valid: " + parameters(last)
raise Exception("'%s' is not one of %s!" % (ptype2, str(swaggerFormats)))
swagger['definitions'][className]['properties'][name]['format'] = ptype2 swagger['definitions'][className]['properties'][name]['format'] = ptype2
return generic_handler_desc(cargo, r, "restbodyparam", None, return generic_handler_desc(cargo, r, "restbodyparam", None,
@ -905,7 +944,7 @@ def reststruct(cargo, r=Regexen()):
################################################################################ ################################################################################
def restqueryparam(cargo, r=Regexen()): def restqueryparam(cargo, r=Regexen()):
global swagger, operation, httpPath, method global swagger, operation, httpPath, method, swaggerBaseTypes
(dummy, last) = cargo (dummy, last) = cargo
parametersList = parameters(last).split(',') parametersList = parameters(last).split(',')
@ -915,12 +954,17 @@ def restqueryparam(cargo, r=Regexen()):
required = True required = True
else: else:
required = False required = False
swaggerType = parametersList[1].lower()
if swaggerType not in swaggerBaseTypes:
print >> sys.stderr, "RESTQUERYPARAM is supposed to be a swagger type."
raise Exception("'%s' is not one of %s!" % (swaggerType, str(swaggerBaseTypes)))
para = { para = {
'name': parametersList[0], 'name': parametersList[0],
'in': 'query', 'in': 'query',
'description': '', 'description': '',
'type': parametersList[1].lower(), 'type': swaggerType,
'required': required 'required': required
} }
@ -1152,7 +1196,7 @@ def example_arangosh_run(cargo, r=Regexen()):
examplefile = open(fn) examplefile = open(fn)
except: except:
print >> sys.stderr, "Failed to open example file:\n '%s'" % fn print >> sys.stderr, "Failed to open example file:\n '%s'" % fn
raise raise Exception("failed to open example file:" + fn)
operation['x-examples'][currentExample] = '\n\n**Example:**\n ' + exampleHeader.strip('\n ') + '\n\n<pre>' operation['x-examples'][currentExample] = '\n\n**Example:**\n ' + exampleHeader.strip('\n ') + '\n\n<pre>'
for line in examplefile.readlines(): for line in examplefile.readlines():
@ -1275,7 +1319,7 @@ def getReference(name, source, verb):
except Exception: except Exception:
print >>sys.stderr, "No reference in: " print >>sys.stderr, "No reference in: "
print >>sys.stderr, name print >>sys.stderr, name
raise raise Exception("No reference in: " + name)
if not ref in swagger['definitions']: if not ref in swagger['definitions']:
fn = '' fn = ''
if verb: if verb:
@ -1419,7 +1463,7 @@ for name, filenames in sorted(files.items(), key=operator.itemgetter(0)):
getOneApi(infile, name + " - " + ', '.join(filenames), fn) getOneApi(infile, name + " - " + ', '.join(filenames), fn)
except Exception as x: except Exception as x:
print >> sys.stderr, "\nwhile parsing file: '%s' error: %s" % (thisfn, x) print >> sys.stderr, "\nwhile parsing file: '%s' error: %s" % (thisfn, x)
raise raise Exception("while parsing file '%s' error: %s" %(thisfn, x))
infile.close() infile.close()
currentDocuBlock = None currentDocuBlock = None
lastDocuBlock = None lastDocuBlock = None