AS7 REST Management API
I am playing a bit with AS7 Management REST API and I want to display the full description of the server model from the Web browser.
Using the CLI, this is equivalent to
[standalone@localhost:9999 /] /:read-resource-description(recursive=true, operations=true)
{
"outcome" => "success",
"result" => {
"description" => "The root node of the server-level management model.",
"head-comment-allowed" => true,
"tail-comment-allowed" => true,
"attributes" => {
"namespaces" => {
"type" => OBJECT,
"value-type" => STRING,
"description" => "Map of namespaces used in the configuration XML document, where keys are namespace prefixes and values are schema URIs.",
"required" => false,
"head-comment-allowed" => false,
"tail-comment-allowed" => false,
"access-type" => "read-only",
"storage" => "configuration"
},
...
}
However, using the CLI is limiting for what I envision. The description that is returned is similar to JSON but it's not valid JSON. I want to interact with the descriptions using a programming language to iterate on resources, filter them out, etc.
The end game could be to generate a HTML documentation for each release of AS7 that could ship with the release and complement the existing documentation
To achieve this, I have first create a simple Sinatra application that queries a running AS7 server (in standalone mode) and display its resource description using the REST API.
The application is using Bundler to manage its dependencies through a Gemfile file:
source 'http://rubygems.org'
gem 'rake'
gem 'rack'
gem 'sinatra'
gem 'httparty'
gem 'json'
We use Rack to start the Web server hosting our little app with a config.ru file:
require "./application.rb"
run Sinatra::Application
The application itsel if a simple Sinatra application which calls the AS7 management REST API (with authentication) and proxies the JSON output.
require 'rubygems'
require 'bundler/setup'
Bundler.require
get '/resource-description' do
user = params['user']
password = params['password']
return [500, "missing user and password parameters"] unless user and password
url = 'http://127.0.0.1:9990/management/'
operation = {:operation => "read-resource-description",
:recursive => params["recursive"] || false,
:operations => params["operations"] || false,
:inherited => params["inherited"] || false
}
res = AS7.query url, user, password, operation.to_json
if res.code == 200
[res.code, {'Content-type' => 'application/json'}, res.body.to_s]
else
[res.code, res.headers, res.body.to_s]
end
end
class AS7
include HTTParty
def AS7.query(url, user, password, operation)
digest_auth user, password
post url , :body => operation, :headers => {"Content-type" => "application/json"}
end
end
In itself, that's not terribly interesting but if it is coupled with a JSON prettifier extension, it displays a nice interactive JSON tree in the browser.
To run the application:
$ bundle # to fetch the ruby gems
$ rackup config.ru
[2012-07-23 17:14:02] INFO WEBrick 1.3.1
[2012-07-23 17:14:02] INFO ruby 1.9.3 (2012-04-20) [x86_64-linux]
[2012-07-23 17:14:02] INFO WEBrick::HTTPServer#start: pid=11499 port=9292
The description is then available at http://localhost:9292/resource-description
- Mandatory parameters
user- the AS7 admin userpassword- the AS7 admin password
- Optional parameters
recursive- whether the description is recursive (defaults tofalse)operation- whether the description includes operation descriptions (defaults tofalse)inherited- whether the children description includes inherited elements (defaults tofalse)
For example, to get the most comprehensive description of the server, you can use this URL.
Next step is to transform the JSON into a HTML output with a nice format and JavaScript goodies (e.g. for automatic generation of a table of contents)