Cisco Prime Infrastructure API
Prime Infrastructure API Documentation

Using Ruby

When using Ruby, there are many options for what client to use. The one demonstrated below uses the rest-client gem.

#!/usr/bin/env ruby

require 'rubygems'
require 'rest_client'
require 'json'

$base_uri = 'https://my_server/webacs/api/v4'
$user, $pass = 'user', 'password'
$clients ='/data/ClientDetails'

# wrap resource access
class PagedResource
	def initialize(url, extraQuery, user, password,ps)
		@resource = RestClient::Resource.new url, :user => user, :password => password, :verify_ssl => false
		@options = {:accept => 'application/json'};
		@extra = URI.encode(extraQuery);
		@pagesize=ps;
	end

	def getPage(start)
		query = URI.encode('?.full=true&.firstResult='+ start.to_s+ '&.maxResults=' +@pagesize.to_s) + '&'+@extra;
		puts "Query: " + query;
		res = @resource[query].get @options
		if (res.code != 200)
			raise "Bad response received:",res.to_str
			exit
		end
		last_res = JSON.parse(res)
		return last_res;
	end

	def getComplete()
		resList =[];
		start = Time.new
		partial = getPage(0);
		count = partial['queryResponse']['@count'].to_i;
		last = partial['queryResponse']['@last'].to_i;
		if (count == 0)
			puts ("Read 0 records")
			return resList;
		end
		rumble resList, partial

		while last<count-1 do
			partial = getPage(last+1);
			last = partial['queryResponse']['@last'].to_i;
			rumble resList, partial
		end
		finish = Time.new
		puts ("Read "+resList.length.to_s+" records")
		puts ('Took: '+(finish-start).to_i.round().to_s+' seconds')
		return resList;
	end

	private

	def rumble(resA,partial)
		partial['queryResponse']['entity'].each do | ent|
			dto = ent['@dtoType']
			resA.push(ent[dto])
		end
	end
end

clientRes = PagedResource.new $base_uri + $clients,"",$user, $pass, 1000;

clients = clientRes.getComplete();

puts(JSON.pretty_generate(clients[0]))