2013-04-22 14:58:53 +00:00
{
"_copyright" : "Copyright (C) 2012 - 2013, Digium, Inc." ,
"_author" : "David M. Lee, II <dlee@digium.com>" ,
"_svn_revision" : "$Revision$" ,
2015-05-21 18:05:08 +00:00
"apiVersion" : "1.7.0" ,
2013-04-22 14:58:53 +00:00
"swaggerVersion" : "1.1" ,
2014-09-20 23:41:55 +00:00
"basePath" : "http://localhost:8088/ari" ,
2013-04-22 14:58:53 +00:00
"resourcePath" : "/api-docs/asterisk.{format}" ,
"apis" : [
2015-07-08 21:39:35 +00:00
{
"path" : "/asterisk/config/dynamic/{configClass}/{objectType}/{id}" ,
"description" : "Asterisk dynamic configuration" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "Retrieve a dynamic configuration object." ,
"nickname" : "getObject" ,
"responseClass" : "List[ConfigTuple]" ,
"parameters" : [
{
"name" : "configClass" ,
"description" : "The configuration class containing dynamic configuration objects." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "objectType" ,
"description" : "The type of configuration object to retrieve." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "id" ,
"description" : "The unique identifier of the object to retrieve." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "{configClass|objectType|id} not found"
}
]
} ,
{
"httpMethod" : "PUT" ,
"summary" : "Create or update a dynamic configuration object." ,
"nickname" : "updateObject" ,
"responseClass" : "List[ConfigTuple]" ,
"parameters" : [
{
"name" : "configClass" ,
"description" : "The configuration class containing dynamic configuration objects." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "objectType" ,
"description" : "The type of configuration object to create or update." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "id" ,
"description" : "The unique identifier of the object to create or update." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "fields" ,
"description" : "The body object should have a value that is a list of ConfigTuples, which provide the fields to update. Ex. [ { \"attribute\": \"directmedia\", \"value\": \"false\" } ]" ,
"paramType" : "body" ,
"required" : false ,
"dataType" : "containers" ,
"allowMultiple" : false
}
] ,
"errorResponses" : [
{
"code" : 400 ,
"reason" : "Bad request body"
} ,
{
"code" : 403 ,
"reason" : "Could not create or update object"
} ,
{
"code" : 404 ,
"reason" : "{configClass|objectType} not found"
}
]
} ,
{
"httpMethod" : "DELETE" ,
"summary" : "Delete a dynamic configuration object." ,
"nickname" : "deleteObject" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "configClass" ,
"description" : "The configuration class containing dynamic configuration objects." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "objectType" ,
"description" : "The type of configuration object to delete." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "id" ,
"description" : "The unique identifier of the object to delete." ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 403 ,
"reason" : "Could not delete object"
} ,
{
"code" : 404 ,
"reason" : "{configClass|objectType|id} not found"
}
]
}
]
} ,
2013-04-22 14:58:53 +00:00
{
"path" : "/asterisk/info" ,
"description" : "Asterisk system information (similar to core show settings)" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "Gets Asterisk system information." ,
2013-11-07 21:10:31 +00:00
"nickname" : "getInfo" ,
2013-04-22 14:58:53 +00:00
"responseClass" : "AsteriskInfo" ,
"parameters" : [
{
"name" : "only" ,
"description" : "Filter information returned" ,
"paramType" : "query" ,
"required" : false ,
"allowMultiple" : true ,
"dataType" : "string" ,
"allowableValues" : {
"valueType" : "LIST" ,
"values" : [
2013-10-02 19:20:27 +00:00
"build" ,
"system" ,
"config" ,
"status"
2013-04-22 14:58:53 +00:00
]
}
}
]
}
]
2013-07-08 14:46:20 +00:00
} ,
2015-06-26 15:57:15 +00:00
{
"path" : "/asterisk/modules" ,
"description" : "Asterisk modules" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "List Asterisk modules." ,
"nickname" : "listModules" ,
"responseClass" : "List[Module]"
}
]
} ,
2015-07-13 15:54:51 +00:00
{
"path" : "/asterisk/modules/{moduleName}" ,
"description" : "Asterisk module" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "Get Asterisk module information." ,
"nickname" : "getModule" ,
"responseClass" : "Module" ,
"parameters" : [
{
"name" : "moduleName" ,
"description" : "Module's name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "Module could not be found in running modules."
} ,
{
"code" : 409 ,
"reason" : "Module information could not be retrieved."
}
]
2015-07-13 21:00:19 +00:00
} ,
{
"httpMethod" : "POST" ,
"summary" : "Load an Asterisk module." ,
"nickname" : "loadModule" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "moduleName" ,
"description" : "Module's name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 409 ,
"reason" : "Module could not be loaded."
}
]
2015-07-14 13:55:14 +00:00
} ,
{
"httpMethod" : "DELETE" ,
"summary" : "Unload an Asterisk module." ,
"nickname" : "unloadModule" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "moduleName" ,
"description" : "Module's name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "Module not found in running modules."
} ,
{
"code" : 409 ,
"reason" : "Module could not be unloaded."
}
]
2015-07-14 18:12:32 +00:00
} ,
{
"httpMethod" : "PUT" ,
"summary" : "Reload an Asterisk module." ,
"nickname" : "reloadModule" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "moduleName" ,
"description" : "Module's name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "Module not found in running modules."
} ,
{
"code" : 409 ,
"reason" : "Module could not be reloaded."
}
]
2015-07-13 15:54:51 +00:00
}
]
} ,
2015-08-07 19:20:29 +00:00
{
"path" : "/asterisk/logging" ,
"description" : "Asterisk log channels" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "Gets Asterisk log channel information." ,
"nickname" : "listLogChannels" ,
"responseClass" : "List[LogChannel]"
}
]
} ,
2015-08-06 20:18:04 +00:00
{
"path" : "/asterisk/logging/{logChannelName}" ,
"description" : "Asterisk log channel" ,
"operations" : [
2015-08-07 16:14:06 +00:00
{
"httpMethod" : "POST" ,
"summary" : "Adds a log channel." ,
"nickname" : "addLog" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "logChannelName" ,
"description" : "The log channel to add" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "configuration" ,
"description" : "levels of the log channel" ,
"paramType" : "query" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 400 ,
"reason" : "Bad request body"
} ,
{
"code" : 409 ,
"reason" : "Log channel could not be created."
}
]
} ,
2015-08-06 20:18:04 +00:00
{
"httpMethod" : "DELETE" ,
"summary" : "Deletes a log channel." ,
"nickname" : "deleteLog" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "logChannelName" ,
"description" : "Log channels name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "Log channel does not exist."
}
]
}
]
} ,
2015-07-29 19:17:09 +00:00
{
"path" : "/asterisk/logging/{logChannelName}/rotate" ,
"description" : "Asterisk log channel" ,
"operations" : [
{
"httpMethod" : "PUT" ,
"summary" : "Rotates a log channel." ,
"nickname" : "rotateLog" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "logChannelName" ,
"description" : "Log channel's name" ,
"paramType" : "path" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
] ,
"errorResponses" : [
{
"code" : 404 ,
"reason" : "Log channel does not exist."
}
]
}
]
} ,
2013-07-08 14:46:20 +00:00
{
"path" : "/asterisk/variable" ,
"description" : "Global variables" ,
"operations" : [
{
"httpMethod" : "GET" ,
"summary" : "Get the value of a global variable." ,
"nickname" : "getGlobalVar" ,
"responseClass" : "Variable" ,
"parameters" : [
{
"name" : "variable" ,
"description" : "The variable to get" ,
"paramType" : "query" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
}
2013-08-21 16:23:59 +00:00
] ,
"errorResponses" : [
{
"code" : 400 ,
"reason" : "Missing variable parameter."
}
2013-07-08 14:46:20 +00:00
]
} ,
{
"httpMethod" : "POST" ,
"summary" : "Set the value of a global variable." ,
"nickname" : "setGlobalVar" ,
"responseClass" : "void" ,
"parameters" : [
{
"name" : "variable" ,
"description" : "The variable to set" ,
"paramType" : "query" ,
"required" : true ,
"allowMultiple" : false ,
"dataType" : "string"
} ,
{
"name" : "value" ,
"description" : "The value to set the variable to" ,
"paramType" : "query" ,
"required" : false ,
"allowMultiple" : false ,
"dataType" : "string"
}
2013-08-21 16:23:59 +00:00
] ,
"errorResponses" : [
{
"code" : 400 ,
"reason" : "Missing variable parameter."
}
2013-07-08 14:46:20 +00:00
]
}
]
2013-04-22 14:58:53 +00:00
}
] ,
"models" : {
2013-08-02 14:46:21 +00:00
"BuildInfo" : {
"id" : "BuildInfo" ,
"description" : "Info about how Asterisk was built" ,
"properties" : {
"os" : {
"required" : true ,
"type" : "string" ,
"description" : "OS Asterisk was built on."
} ,
"kernel" : {
"required" : true ,
"type" : "string" ,
"description" : "Kernel version Asterisk was built on."
} ,
"options" : {
"required" : true ,
"type" : "string" ,
"description" : "Compile time options, or empty string if default."
} ,
"machine" : {
"required" : true ,
"type" : "string" ,
"description" : "Machine architecture (x86_64, i686, ppc, etc.)"
} ,
"date" : {
"required" : true ,
"type" : "string" ,
"description" : "Date and time when Asterisk was built."
} ,
"user" : {
"required" : true ,
"type" : "string" ,
"description" : "Username that build Asterisk"
}
}
} ,
"SystemInfo" : {
"id" : "SystemInfo" ,
"description" : "Info about Asterisk" ,
"properties" : {
"version" : {
"required" : true ,
"type" : "string" ,
"description" : "Asterisk version."
} ,
"entity_id" : {
"required" : true ,
"type" : "string" ,
"description" : ""
}
}
} ,
"SetId" : {
"id" : "SetId" ,
"description" : "Effective user/group id" ,
"properties" : {
"user" : {
"required" : true ,
"type" : "string" ,
"description" : "Effective user id."
} ,
"group" : {
"required" : true ,
"type" : "string" ,
"description" : "Effective group id."
}
}
} ,
"ConfigInfo" : {
"id" : "ConfigInfo" ,
"description" : "Info about Asterisk configuration" ,
"properties" : {
"name" : {
"required" : true ,
"type" : "string" ,
"description" : "Asterisk system name."
} ,
"default_language" : {
"required" : true ,
"type" : "string" ,
"description" : "Default language for media playback."
} ,
"max_channels" : {
"required" : false ,
"type" : "int" ,
"description" : "Maximum number of simultaneous channels."
} ,
"max_open_files" : {
"required" : false ,
"type" : "int" ,
"description" : "Maximum number of open file handles (files, sockets)."
} ,
"max_load" : {
"required" : false ,
"type" : "double" ,
"description" : "Maximum load avg on system."
} ,
"setid" : {
"required" : true ,
"type" : "SetId" ,
"description" : "Effective user/group id for running Asterisk."
}
}
} ,
"StatusInfo" : {
"id" : "StatusInfo" ,
"description" : "Info about Asterisk status" ,
"properties" : {
"startup_time" : {
"required" : true ,
"type" : "Date" ,
"description" : "Time when Asterisk was started."
} ,
"last_reload_time" : {
"required" : true ,
"type" : "Date" ,
"description" : "Time when Asterisk was last reloaded."
}
}
} ,
2013-04-22 14:58:53 +00:00
"AsteriskInfo" : {
"id" : "AsteriskInfo" ,
Update events to use Swagger 1.3 subtyping, and related aftermath
This patch started with the simple idea of changing the /events data
model to be more sane. The original model would send out events like:
{ "stasis_start": { "args": [], "channel": { ... } } }
The event discriminator was the field name instead of being a value in
the object, due to limitations in how Swagger 1.1 could model objects.
While technically sufficient in communicating event information, it was
really difficult to deal with in terms of client side JSON handling.
This patch takes advantage of a proposed extension[1] to Swagger which
allows type variance through the use of a discriminator field. This had
a domino effect that made this a surprisingly large patch.
[1]: https://groups.google.com/d/msg/wordnik-api/EC3rGajE0os/ey_5dBI_jWcJ
In changing the models, I also had to change the swagger_model.py
processor so it can handle the type discriminator and subtyping. I took
that a big step forward, and using that information to generate an
ari_model module, which can validate a JSON object against the Swagger
model.
The REST and WebSocket generators were changed to take advantage of the
validators. If compiled with AST_DEVMODE enabled, JSON objects that
don't match their corresponding models will not be sent out. For REST
API calls, a 500 Internal Server response is sent. For WebSockets, the
invalid JSON message is replaced with an error message.
Since this took over about half of the job of the existing JSON
generators, and the .to_json virtual function on messages took over the
other half, I reluctantly removed the generators.
The validators turned up all sorts of errors and inconsistencies in our
data models, and the code. These were cleaned up, with checks in the
code generator avoid some of the consistency problems in the future.
* The model for a channel snapshot was trimmed down to match the
information sent via AMI. Many of the field being sent were not
useful in the general case.
* The model for a bridge snapshot was updated to be more consistent
with the other ARI models.
Another impact of introducing subtyping was that the swagger-codegen
documentation generator was insufficient (at least until it catches up
with Swagger 1.2). I wanted it to be easier to generate docs for the API
anyways, so I ported the wiki pages to use the Asterisk Swagger
generator. In the process, I was able to clean up many of the model
links, which would occasionally give inconsistent results on the wiki. I
also added error responses to the wiki docs, making the wiki
documentation more complete.
Finally, since Stasis-HTTP will now be named Asterisk REST Interface
(ARI), any new functions and files I created carry the ari_ prefix. I
changed a few stasis_http references to ari where it was non-intrusive
and made sense.
(closes issue ASTERISK-21885)
Review: https://reviewboard.asterisk.org/r/2639/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@393529 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2013-07-03 16:32:41 +00:00
"description" : "Asterisk system information" ,
2013-08-02 14:46:21 +00:00
"properties" : {
"build" : {
"required" : false ,
"type" : "BuildInfo" ,
"description" : "Info about how Asterisk was built"
} ,
"system" : {
"required" : false ,
"type" : "SystemInfo" ,
"description" : "Info about the system running Asterisk"
} ,
"config" : {
"required" : false ,
"type" : "ConfigInfo" ,
"description" : "Info about Asterisk configuration"
} ,
"status" : {
"required" : false ,
"type" : "StatusInfo" ,
"description" : "Info about Asterisk status"
}
}
2013-07-08 14:46:20 +00:00
} ,
2015-06-26 15:57:15 +00:00
"Module" : {
"id" : "Module" ,
"description" : "Details of an Asterisk module" ,
"properties" : {
"name" : {
"type" : "string" ,
"description" : "The name of this module" ,
"required" : true
} ,
"description" : {
"type" : "string" ,
"description" : "The description of this module" ,
"required" : true
} ,
"use_count" : {
"type" : "int" ,
"description" : "The number of times this module is being used" ,
"required" : true
} ,
"status" : {
"type" : "string" ,
"description" : "The running status of this module" ,
"required" : true
} ,
"support_level" : {
"type" : "string" ,
"description" : "The support state of this module" ,
"required" : true
}
}
} ,
2015-07-29 19:17:09 +00:00
"LogChannel" : {
"id" : "LogChannel" ,
"description" : "Details of an Asterisk log channel" ,
"properties" : {
2015-08-06 20:18:04 +00:00
"channel" : {
2015-07-29 19:17:09 +00:00
"type" : "string" ,
"description" : "The log channel path" ,
"required" : true
} ,
"type" : {
"type" : "string" ,
"description" : "Types of logs for the log channel" ,
"required" : true
} ,
"status" : {
"type" : "string" ,
"description" : "Whether or not a log type is enabled" ,
"required" : true
} ,
"configuration" : {
2015-08-07 16:14:06 +00:00
"type" : "string" ,
2015-07-29 19:17:09 +00:00
"description" : "The various log levels" ,
"required" : true
}
}
} ,
2013-07-08 14:46:20 +00:00
"Variable" : {
"id" : "Variable" ,
2013-07-10 13:50:48 +00:00
"description" : "The value of a channel variable" ,
2013-07-08 14:46:20 +00:00
"properties" : {
2013-07-10 13:50:48 +00:00
"value" : {
2013-07-08 14:46:20 +00:00
"required" : true ,
"type" : "string" ,
"description" : "The value of the variable requested"
}
}
2015-07-08 21:39:35 +00:00
} ,
"ConfigTuple" : {
"id" : "ConfigTuple" ,
"description" : "A key/value pair that makes up part of a configuration object." ,
"properties" : {
"attribute" : {
"required" : true ,
"type" : "string" ,
"description" : "A configuration object attribute."
} ,
"value" : {
"required" : true ,
"type" : "string" ,
"description" : "The value for the attribute."
}
}
2013-04-22 14:58:53 +00:00
}
}
}