abiquo-api 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +8 -3
- data/lib/abiquo-api.rb +32 -24
- data/lib/abiquo-api/collection.rb +173 -0
- data/lib/abiquo-api/httpclient.rb +0 -27
- data/lib/abiquo-api/link.rb +8 -2
- data/lib/abiquo-api/model.rb +19 -4
- data/lib/abiquo-api/version.rb +2 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fcac0cebe8eca1e8436a1e201a4fbc5ec3d7e30c
|
4
|
+
data.tar.gz: d7d7b8036b8746c68e72c8d8d83e5e02a119845f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 772ad5ac86fb5cef5a94a6fb4d623da66dc83c5cf4b76e5e8fbbe2db2af1837ceabd83e917250ab8cc0b56f2d06a4bd8e5076d16fe1d367037b62d2256b06521
|
7
|
+
data.tar.gz: 8ec539f19258de9cf0bf4f9be60050956b27265680e46ba228a5793704547cfaaa0de7609d6c2abfd5c63381712216dc51a836b6027d40f5100a6d8446e874d7
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Or, if you want to force a specific API version:
|
|
27
27
|
```ruby
|
28
28
|
require 'abiquo-api'
|
29
29
|
|
30
|
-
|
30
|
+
abq = AbiquoAPI.new(:abiquo_api_url => 'https://10.60.13.40/api',
|
31
31
|
:abiquo_username => "admin",
|
32
32
|
:abiquo_password => "xabiquo",
|
33
33
|
:version => "2.9")
|
@@ -37,9 +37,10 @@ Then you can start browsing the API:
|
|
37
37
|
|
38
38
|
```ruby
|
39
39
|
l = AbiquoAPI::Link.new(:href => '/api/cloud/virtualdatacenters',
|
40
|
-
:type => 'application/vnd.abiquo.virtualdatacenters+json'
|
40
|
+
:type => 'application/vnd.abiquo.virtualdatacenters+json',
|
41
|
+
:client => abq)
|
41
42
|
|
42
|
-
|
43
|
+
l.get
|
43
44
|
```
|
44
45
|
|
45
46
|
## Client object
|
@@ -62,6 +63,10 @@ vapp = vdc.link(:virtualappliances).get.first
|
|
62
63
|
|
63
64
|
This is used to map Abiquo API objects.
|
64
65
|
|
66
|
+
## Generic list
|
67
|
+
|
68
|
+
This is used to iterate over paginated lists.
|
69
|
+
|
65
70
|
## Examples
|
66
71
|
|
67
72
|
### Browse the API
|
data/lib/abiquo-api.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
require 'abiquo-api/
|
2
|
-
require 'abiquo-api/
|
3
|
-
require 'abiquo-api/
|
4
|
-
require 'abiquo-api/
|
1
|
+
require 'abiquo-api/collection'
|
2
|
+
require 'abiquo-api/errors'
|
3
|
+
require 'abiquo-api/httpclient'
|
4
|
+
require 'abiquo-api/link'
|
5
|
+
require 'abiquo-api/model'
|
5
6
|
|
6
7
|
##
|
7
8
|
# Ruby Abiquo API client main class
|
@@ -27,11 +28,6 @@ class AbiquoAPI
|
|
27
28
|
#
|
28
29
|
attr_accessor :user
|
29
30
|
|
30
|
-
##
|
31
|
-
# The config properties for the UI.
|
32
|
-
#
|
33
|
-
attr_accessor :properties
|
34
|
-
|
35
31
|
##
|
36
32
|
# The Abiquo API version used by this client.
|
37
33
|
#
|
@@ -69,13 +65,6 @@ class AbiquoAPI
|
|
69
65
|
@enterprise = AbiquoAPIClient::Link.new(loginresp['links'].select {|l| l['rel'] == 'enterprise'}.first)
|
70
66
|
@user = AbiquoAPIClient::LinkModel.new(loginresp.merge({:client => self}))
|
71
67
|
|
72
|
-
@properties = @http_client.request(
|
73
|
-
:expects => [200],
|
74
|
-
:method => 'GET',
|
75
|
-
:path => "#{api_path}/config/properties",
|
76
|
-
:accept => 'application/vnd.abiquo.systemproperties+json'
|
77
|
-
)
|
78
|
-
|
79
68
|
if options.has_key? :version
|
80
69
|
@version = options[:version][0..2]
|
81
70
|
else
|
@@ -89,6 +78,18 @@ class AbiquoAPI
|
|
89
78
|
|
90
79
|
self
|
91
80
|
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Loads System properties
|
84
|
+
#
|
85
|
+
def properties
|
86
|
+
@http_client.request(
|
87
|
+
:expects => [200],
|
88
|
+
:method => 'GET',
|
89
|
+
:path => "#{api_path}/config/properties",
|
90
|
+
:accept => 'application/vnd.abiquo.systemproperties+json'
|
91
|
+
)
|
92
|
+
end
|
92
93
|
|
93
94
|
##
|
94
95
|
# Returns a new instance of the {AbiquoAPIClient::LinkModel} class.
|
@@ -100,6 +101,18 @@ class AbiquoAPI
|
|
100
101
|
AbiquoAPIClient::LinkModel.new(hash.merge({ :client => self}))
|
101
102
|
end
|
102
103
|
|
104
|
+
##
|
105
|
+
# Returns a new instance of the {AbiquoAPIClient::LinkCollection}
|
106
|
+
# class.
|
107
|
+
#
|
108
|
+
# Parameters:
|
109
|
+
# An instance of {AbiquoAPIClient::Link} pointing to the URL of
|
110
|
+
# the collection.
|
111
|
+
#
|
112
|
+
def list(link, options = {})
|
113
|
+
AbiquoAPI::LinkCollection.new(self.get(link, options), link.type, self)
|
114
|
+
end
|
115
|
+
|
103
116
|
##
|
104
117
|
# Executes an HTTP GET over the {AbiquoAPIClient::Link} passed as parameter.
|
105
118
|
#
|
@@ -131,15 +144,10 @@ class AbiquoAPI
|
|
131
144
|
|
132
145
|
resp = @http_client.request(req_hash)
|
133
146
|
|
134
|
-
if resp.
|
135
|
-
tmp_a = []
|
136
|
-
resp.each do |r|
|
137
|
-
tmp_r = AbiquoAPIClient::LinkModel.new(r.merge({:client => self}))
|
138
|
-
tmp_a << tmp_r
|
139
|
-
end
|
140
|
-
tmp_a
|
141
|
-
else
|
147
|
+
if resp['collection'].nil?
|
142
148
|
AbiquoAPIClient::LinkModel.new(resp.merge({ :client => self}))
|
149
|
+
else
|
150
|
+
resp
|
143
151
|
end
|
144
152
|
end
|
145
153
|
|
@@ -0,0 +1,173 @@
|
|
1
|
+
require 'formatador'
|
2
|
+
|
3
|
+
module AbiquoAPIClient
|
4
|
+
##
|
5
|
+
# Represents a collection of resources in the Abiquo API.
|
6
|
+
#
|
7
|
+
class LinkCollection
|
8
|
+
def initialize(parsed_response, type, client)
|
9
|
+
@size = parsed_response['totalSize'].nil? ? parsed_response['collection'].count : parsed_response['totalSize']
|
10
|
+
if type.include? ";"
|
11
|
+
@type = type.split(';').first
|
12
|
+
else
|
13
|
+
@type = type
|
14
|
+
end
|
15
|
+
|
16
|
+
unless parsed_response['links'].empty?
|
17
|
+
coluri = URI.parse(parsed_response['links'].first['href'])
|
18
|
+
@path = coluri.path
|
19
|
+
|
20
|
+
opts = coluri.query
|
21
|
+
unless opts.nil?
|
22
|
+
opt_hash = opts.split("&").map{|e| { e.split("=").first.to_sym => e.split("=").last }}.reduce({}) {|h,pairs| pairs.each {|k,v| h[k] ||= v}; h}
|
23
|
+
@page_size = opt_hash[:limit].to_i
|
24
|
+
|
25
|
+
st = opt_hash[:startwith].nil? ? 0 : opt_hash[:startwith].to_i
|
26
|
+
@current_page = (st / @page_size) + 1
|
27
|
+
end
|
28
|
+
|
29
|
+
@links = parsed_response['links']
|
30
|
+
end
|
31
|
+
|
32
|
+
@collection = parsed_response['collection'].map {|r| client.new_object(r)}
|
33
|
+
|
34
|
+
@client = client
|
35
|
+
end
|
36
|
+
|
37
|
+
##
|
38
|
+
# Returns the total size of the collection
|
39
|
+
#
|
40
|
+
def size
|
41
|
+
@size
|
42
|
+
end
|
43
|
+
alias count size
|
44
|
+
|
45
|
+
##
|
46
|
+
# Returns the first element in the collection
|
47
|
+
#
|
48
|
+
def first(count = nil)
|
49
|
+
if count.nil?
|
50
|
+
@collection.first
|
51
|
+
else
|
52
|
+
out = []
|
53
|
+
@collection.first(count).each do |item|
|
54
|
+
out << item
|
55
|
+
end
|
56
|
+
out
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
##
|
61
|
+
# Returns the last element in the collection
|
62
|
+
#
|
63
|
+
def last
|
64
|
+
out = nil
|
65
|
+
|
66
|
+
each {|i| out = i }
|
67
|
+
|
68
|
+
out
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Returns an array representing the collection
|
73
|
+
#
|
74
|
+
def to_a
|
75
|
+
out = []
|
76
|
+
|
77
|
+
each { |e| out << e }
|
78
|
+
|
79
|
+
out
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# Selects elements of the collections for which
|
84
|
+
# the supplied block evaluates to true
|
85
|
+
#
|
86
|
+
def select
|
87
|
+
out = []
|
88
|
+
|
89
|
+
each { |e| out << e if yield(e) }
|
90
|
+
|
91
|
+
out
|
92
|
+
end
|
93
|
+
|
94
|
+
##
|
95
|
+
# Returns an array resulting of applying the provided
|
96
|
+
# block to all of the elements of the collection
|
97
|
+
#
|
98
|
+
def map
|
99
|
+
out = []
|
100
|
+
|
101
|
+
each { |e| out << yield(e) }
|
102
|
+
|
103
|
+
out
|
104
|
+
end
|
105
|
+
alias collect map
|
106
|
+
|
107
|
+
##
|
108
|
+
# Iterates the collection
|
109
|
+
#
|
110
|
+
def each
|
111
|
+
if block_given?
|
112
|
+
unless @current_page == 1 or @current_page.nil?
|
113
|
+
next_page = retrieve('first')
|
114
|
+
@collection = next_page.nil? ? [] : next_page
|
115
|
+
end
|
116
|
+
|
117
|
+
loop do
|
118
|
+
@collection.each do |item|
|
119
|
+
yield item
|
120
|
+
end
|
121
|
+
|
122
|
+
break if @links.nil? or @links.select {|l| l['rel'].eql? "next" }.first.nil?
|
123
|
+
|
124
|
+
next_page = retrieve('next')
|
125
|
+
@collection = next_page.nil? ? [] : next_page
|
126
|
+
end
|
127
|
+
else
|
128
|
+
self.to_enum
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
##
|
133
|
+
# Pretty print the object.
|
134
|
+
#
|
135
|
+
def inspect
|
136
|
+
Thread.current[:formatador] ||= Formatador.new
|
137
|
+
data = "#{Thread.current[:formatador].indentation}<#{self.class.name}"
|
138
|
+
Thread.current[:formatador].indent do
|
139
|
+
unless self.instance_variables.empty?
|
140
|
+
vars = self.instance_variables.clone
|
141
|
+
vars.delete(:@client)
|
142
|
+
vars.delete(:@page)
|
143
|
+
data << " "
|
144
|
+
data << vars.map { |v| "#{v}=#{instance_variable_get(v.to_s).inspect}" }.join(", ")
|
145
|
+
end
|
146
|
+
end
|
147
|
+
data << " >"
|
148
|
+
data
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
|
153
|
+
def retrieve(rel)
|
154
|
+
return nil if @links.nil?
|
155
|
+
f = @links.select {|l| l['rel'].eql? rel }.first
|
156
|
+
return nil if f.nil?
|
157
|
+
|
158
|
+
q = URI.parse(f['href']).query.split('&').map {|it| it.split('=') }
|
159
|
+
opts = Hash[q.map{ |k, v| [k.to_sym, v] }]
|
160
|
+
|
161
|
+
l = AbiquoAPIClient::Link.new(:href => f['href'],
|
162
|
+
:type => @type)
|
163
|
+
resp = @client.get(l, opts)
|
164
|
+
|
165
|
+
st = opts[:startwith].nil? ? 0 : opts[:startwith].to_i
|
166
|
+
@current_page = (st / @page_size) + 1
|
167
|
+
|
168
|
+
@links = resp['links']
|
169
|
+
|
170
|
+
resp['collection'].map {|e| @client.new_object(e) }
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
@@ -76,33 +76,6 @@ module AbiquoAPIClient
|
|
76
76
|
rescue
|
77
77
|
response = response.body
|
78
78
|
end
|
79
|
-
|
80
|
-
# Handle pagination
|
81
|
-
if not response['links'].nil? and response['links'].select {|l| l['rel'].eql? "next" }.count > 0
|
82
|
-
items = []
|
83
|
-
items = items + response['collection'] if not response['collection'].nil?
|
84
|
-
|
85
|
-
loop do
|
86
|
-
next_url = response['links'].select {|l| l['rel'].eql? "next" }.first['href']
|
87
|
-
uri = URI.parse(next_url)
|
88
|
-
params[:path] = uri.path
|
89
|
-
params[:query] = uri.query
|
90
|
-
params[:headers] = headers
|
91
|
-
response = issue_request(params)
|
92
|
-
response = JSON.parse(response.body) unless response.body.empty?
|
93
|
-
items = items + response['collection'] if not response['collection'].nil?
|
94
|
-
|
95
|
-
break if response['links'].select {|l| l['rel'].eql? "next" }.count == 0
|
96
|
-
end
|
97
|
-
|
98
|
-
items
|
99
|
-
else
|
100
|
-
if not response['collection'].nil?
|
101
|
-
response['collection']
|
102
|
-
else
|
103
|
-
response.nil? ? nil : response
|
104
|
-
end
|
105
|
-
end
|
106
79
|
end
|
107
80
|
|
108
81
|
private
|
data/lib/abiquo-api/link.rb
CHANGED
@@ -45,13 +45,19 @@ module AbiquoAPIClient
|
|
45
45
|
|
46
46
|
##
|
47
47
|
# If the :client attribute is not nil, will retrieve
|
48
|
-
# the resource that this link represents,
|
48
|
+
# the resource or collection that this link represents,
|
49
|
+
# or nil otherwise
|
49
50
|
#
|
50
51
|
def get(options = {})
|
51
52
|
if @client.nil?
|
52
53
|
return nil
|
53
54
|
else
|
54
|
-
@client.get(self, options)
|
55
|
+
r = @client.get(self, options)
|
56
|
+
if r.is_a? Hash
|
57
|
+
AbiquoAPI::LinkCollection.new(r, self.type, @client)
|
58
|
+
else
|
59
|
+
r
|
60
|
+
end
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
data/lib/abiquo-api/model.rb
CHANGED
@@ -101,17 +101,32 @@ module AbiquoAPIClient
|
|
101
101
|
end
|
102
102
|
|
103
103
|
##
|
104
|
-
#
|
105
|
-
#
|
104
|
+
# Returns an array of {AbiquoAPI::Link} for the resource
|
105
|
+
#
|
106
|
+
def links
|
107
|
+
self.links.map {|l| l.values }.flatten
|
108
|
+
end
|
109
|
+
|
110
|
+
##
|
111
|
+
# Retrieves the link or links that hve the 'rel' attribute
|
112
|
+
# specified as parameter.
|
106
113
|
#
|
107
114
|
# Parameters:
|
108
115
|
# [link_rel] The 'rel' value to look for, symbolized.
|
109
116
|
#
|
110
|
-
# Returns the
|
117
|
+
# Returns the link the 'rel' attribute
|
111
118
|
# specified or nil if not found.
|
112
119
|
#
|
113
120
|
def link(link_rel)
|
114
|
-
self.links.select {|l| l[link_rel] }.
|
121
|
+
ls = self.links.select {|l| l[link_rel] }.map { |t| t.values }.flatten
|
122
|
+
case ls.count
|
123
|
+
when 1
|
124
|
+
ls.first
|
125
|
+
when 0
|
126
|
+
nil
|
127
|
+
else
|
128
|
+
ls
|
129
|
+
end
|
115
130
|
end
|
116
131
|
|
117
132
|
##
|
data/lib/abiquo-api/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module AbiquoAPIClient
|
2
|
-
VERSION = '0.0.
|
3
|
-
end
|
2
|
+
VERSION = '0.0.4'
|
3
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abiquo-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Cirauqui
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- README.md
|
83
83
|
- abiquo-api.gemspec
|
84
84
|
- lib/abiquo-api.rb
|
85
|
+
- lib/abiquo-api/collection.rb
|
85
86
|
- lib/abiquo-api/errors.rb
|
86
87
|
- lib/abiquo-api/httpclient.rb
|
87
88
|
- lib/abiquo-api/link.rb
|
@@ -111,3 +112,4 @@ signing_key:
|
|
111
112
|
specification_version: 4
|
112
113
|
summary: Simple Abiquo API client
|
113
114
|
test_files: []
|
115
|
+
has_rdoc:
|