webee 0.1 → 0.2
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.
- data/README.md +4 -0
- data/examples/basics.rb +102 -27
- data/examples/test.rb +20 -0
- data/examples/test2.rb +12 -0
- data/lib/webee.rb +492 -32
- data/test/test_appliance_manager.rb +7 -0
- metadata +15 -7
data/README.md
CHANGED
data/examples/basics.rb
CHANGED
@@ -4,46 +4,72 @@ require 'md5'
|
|
4
4
|
|
5
5
|
WeBee::Api.user = ENV['user'] || 'admin'
|
6
6
|
WeBee::Api.password = ENV['pass'] || 'xabiquo'
|
7
|
-
WeBee::Api.url = '
|
7
|
+
WeBee::Api.url = "http://#{ENV['host'] || 'abiquo'}/api"
|
8
|
+
|
9
|
+
#
|
10
|
+
# Add a license
|
11
|
+
#
|
12
|
+
license_file = ARGV[0]
|
13
|
+
if license_file.nil? or (not File.exist?(license_file))
|
14
|
+
$stderr.puts "Invalid license file"
|
15
|
+
exit 1
|
16
|
+
end
|
17
|
+
WeBee::Config.add_license File.read(license_file).strip.chomp
|
18
|
+
|
19
|
+
#
|
20
|
+
# Create a new datacenter
|
21
|
+
#
|
22
|
+
# This assumes the Remote Services are located in the same server
|
23
|
+
#
|
24
|
+
dc = WeBee::Datacenter.create :name => 'BCN'
|
25
|
+
|
26
|
+
#
|
27
|
+
# Advanced Datacenter Creation:
|
28
|
+
#
|
29
|
+
# If you want to add a Datacenter with remote services located in another host
|
30
|
+
# use this.
|
31
|
+
#
|
32
|
+
# remote_services= WeBee::RemoteService.create_for_host("10.60.1.24")
|
33
|
+
# WeBee::Datacenter.create :name => 'foo'
|
34
|
+
# :remote_services => remote_services
|
35
|
+
|
8
36
|
|
9
37
|
#
|
10
38
|
# List all datacenters available
|
11
39
|
#
|
12
40
|
WeBee::Datacenter.all.each do |dc|
|
13
|
-
|
41
|
+
# do something like printing dc.name
|
14
42
|
end
|
15
43
|
|
16
|
-
|
17
44
|
#
|
18
45
|
# Return the first datacenter whose name matches BCN (matched via Regexp)
|
19
46
|
#
|
20
47
|
dc = WeBee::Datacenter.find_by_name('BCN').first
|
21
|
-
puts dc.name
|
48
|
+
# puts dc.name
|
22
49
|
|
23
50
|
#
|
24
|
-
#
|
51
|
+
# Create an enterprise
|
25
52
|
#
|
26
|
-
|
27
|
-
puts r.name
|
28
|
-
end
|
53
|
+
ent = WeBee::Enterprise.create :name => 'QA'
|
29
54
|
|
30
55
|
#
|
31
56
|
# List all the enterprises
|
32
57
|
#
|
33
58
|
WeBee::Enterprise.all.each do |e|
|
34
|
-
|
59
|
+
# do something like printing e.name
|
35
60
|
end
|
36
61
|
|
37
62
|
#
|
38
63
|
# Find an enterprise named QA
|
39
64
|
#
|
40
|
-
qa_ent = WeBee::Enterprise.find_by_name('QA')
|
65
|
+
qa_ent = WeBee::Enterprise.find_by_name('QA').first
|
41
66
|
|
42
67
|
#
|
43
68
|
# List enterprise 'QA' users
|
44
69
|
#
|
45
70
|
qa_ent.users.each do |u|
|
46
|
-
|
71
|
+
# print user name
|
72
|
+
# puts u.name
|
47
73
|
end
|
48
74
|
|
49
75
|
|
@@ -60,35 +86,84 @@ user = qa_ent.create_user :name => 'Sergio Rubio',
|
|
60
86
|
:active => 'true' #optional
|
61
87
|
|
62
88
|
# delete the user
|
63
|
-
user.delete
|
89
|
+
# user.delete
|
64
90
|
|
65
91
|
#
|
66
|
-
#
|
67
|
-
# FIXME: not implemented in WeBee
|
92
|
+
# List WeBee::OVFPackage available in enterprise QA
|
68
93
|
#
|
69
|
-
|
94
|
+
qa_ent.ovf_packages.each do |pkg|
|
95
|
+
# print package info
|
96
|
+
# puts "#{pkg.product_name} (#{pkg.category_name})"
|
97
|
+
end
|
70
98
|
|
71
99
|
#
|
72
|
-
# List
|
100
|
+
# List Datacenter Racks
|
73
101
|
#
|
74
|
-
|
75
|
-
|
102
|
+
dc.racks.each do |r|
|
103
|
+
# print rack name
|
104
|
+
# puts r.name
|
76
105
|
end
|
77
106
|
|
78
107
|
#
|
79
108
|
# Create a new Rack
|
80
109
|
#
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
:vlan_per_vdc_expected => 6,
|
88
|
-
:nrsq => 80
|
110
|
+
rack = dc.add_rack :name => 'rack_1',
|
111
|
+
:ha_enabled => false,
|
112
|
+
:vlan_min_id => 100,
|
113
|
+
:vlan_max_id => 2048,
|
114
|
+
:vlan_per_vdc_expected => 6,
|
115
|
+
:nrsq => 80
|
89
116
|
|
90
117
|
#
|
118
|
+
# Hypervisor (Machine) stuff
|
119
|
+
#
|
120
|
+
machine = dc.discover_machine :ip => '10.60.1.24', :hypervisortype => 'kvm'
|
121
|
+
# Use the first virtual switch we find
|
122
|
+
machine.virtual_switch = machine.virtual_switches.first
|
123
|
+
# Enable the first datastore found
|
124
|
+
machine.datastores.first.enabled = true
|
125
|
+
# Add the hypervisor to the rack
|
126
|
+
rack.add_machine(machine)
|
91
127
|
# Delete the rack
|
92
128
|
# FIXME: Not supported in Abiquo right now
|
93
|
-
#
|
94
129
|
#rack.delete
|
130
|
+
|
131
|
+
#
|
132
|
+
# Create a Virtual Datacenter with default limits and network
|
133
|
+
#
|
134
|
+
qa = WeBee::Enterprise.find_by_name('QA').first
|
135
|
+
# We need to set limits for the enterprise to be able to use a datacenter
|
136
|
+
qa.set_limits_for_datacenter dc
|
137
|
+
#vdc = qa.create_vdc :name => 'kvm-vdc', :hypervisortype => 'KVM', :datacenter => dc
|
138
|
+
|
139
|
+
#
|
140
|
+
# Advanced VDC Creation
|
141
|
+
#
|
142
|
+
vdc = qa.create_vdc :datacenter => dc,
|
143
|
+
:name => 'kvm-vdc',
|
144
|
+
:hypervisortype => 'KVM',
|
145
|
+
:ramSoft => 19456,
|
146
|
+
:ramHard => 20480,
|
147
|
+
:cpuSoft => 18,
|
148
|
+
:cpuHard => 20,
|
149
|
+
:storageSoft => 28991029248,
|
150
|
+
:storageHard => 32212254720,
|
151
|
+
:publicIpsSoft => 2,
|
152
|
+
:publicIpsHard => 4,
|
153
|
+
:hdSoft => 27917287424,
|
154
|
+
:hdHard => 32212254720,
|
155
|
+
:vlanSoft => 5,
|
156
|
+
:vlanHard => 10
|
157
|
+
|
158
|
+
# Find VDC by name
|
159
|
+
vdc = WeBee::VDC.find_by_name 'kvm-vdc'
|
160
|
+
|
161
|
+
#
|
162
|
+
# List all VDCs for my Enterprise
|
163
|
+
WeBee::VDC.all
|
164
|
+
|
165
|
+
#
|
166
|
+
# List all VDCs from a specific Enterprise/Datacenter
|
167
|
+
# Needs Cloud operator privileges
|
168
|
+
#
|
169
|
+
WeBee::VDC.all :datacenter_id => WeBee::Datacenter.all.first.datacenter_id, :enterprise_id => 3
|
data/examples/test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
$: << '../lib'
|
2
|
+
require 'webee'
|
3
|
+
require 'md5'
|
4
|
+
require 'active_support'
|
5
|
+
|
6
|
+
WeBee::Api.user = ENV['user'] || 'admin'
|
7
|
+
WeBee::Api.password = ENV['pass'] || 'xabiquo'
|
8
|
+
WeBee::Api.url = 'http://10.60.1.24/api'
|
9
|
+
|
10
|
+
#rs = WeBee::RemoteService.create_for_host("10.60.1.24")
|
11
|
+
|
12
|
+
WeBee::Datacenter.create :name => 'BCN'
|
13
|
+
# :remote_services => rs
|
14
|
+
#
|
15
|
+
WeBee::Enterprise.create :name => 'QA'
|
16
|
+
|
17
|
+
WeBee::
|
18
|
+
|
19
|
+
|
20
|
+
|
data/examples/test2.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
$: << '../lib'
|
2
|
+
require 'webee'
|
3
|
+
require 'md5'
|
4
|
+
require 'active_support'
|
5
|
+
include WeBee
|
6
|
+
|
7
|
+
WeBee::Api.user = ENV['user'] || 'admin'
|
8
|
+
WeBee::Api.password = ENV['pass'] || 'xabiquo'
|
9
|
+
WeBee::Api.url = 'http://10.60.1.24/api'
|
10
|
+
|
11
|
+
require 'pp'
|
12
|
+
pp VDC.all :datacenter_id => 2, :enterprise_id => 3
|
data/lib/webee.rb
CHANGED
@@ -4,10 +4,32 @@ require 'sax-machine'
|
|
4
4
|
require 'nokogiri'
|
5
5
|
require 'active_support/core_ext/hash'
|
6
6
|
require 'uri'
|
7
|
+
require 'json'
|
8
|
+
require 'builder'
|
9
|
+
|
10
|
+
#
|
11
|
+
# Monkeypatch SAXMachine to keep the raw XMK
|
12
|
+
#
|
13
|
+
# Ugly but fun, isn't it? This may blow up at some point
|
14
|
+
#
|
15
|
+
module SAXMachine
|
16
|
+
|
17
|
+
alias_method :old_parse, :parse
|
18
|
+
|
19
|
+
def parse(xml, on_error = nil, on_warning = nil)
|
20
|
+
obj = old_parse(xml, on_error, on_warning)
|
21
|
+
obj.instance_variable_set :@raw, xml
|
22
|
+
obj.class.send :define_method, 'raw' do
|
23
|
+
@raw
|
24
|
+
end
|
25
|
+
obj
|
26
|
+
end
|
27
|
+
end
|
7
28
|
|
8
29
|
module WeBee
|
9
30
|
|
10
|
-
VERSION = '0.
|
31
|
+
VERSION = '0.2'
|
32
|
+
|
11
33
|
|
12
34
|
module RestResource
|
13
35
|
|
@@ -46,10 +68,16 @@ module WeBee
|
|
46
68
|
|
47
69
|
end
|
48
70
|
|
71
|
+
class Config
|
72
|
+
def self.add_license(hash)
|
73
|
+
RestClient.post Api.url + "/config/licenses" , "<license><code>#{hash}</code></license>", :content_type => :xml
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
49
77
|
|
50
78
|
class Api
|
51
79
|
class << self
|
52
|
-
attr_accessor :user, :password, :url, :port
|
80
|
+
attr_accessor :user, :password, :url, :port, :host
|
53
81
|
|
54
82
|
def url=(url)
|
55
83
|
@url = build_url(url)
|
@@ -59,6 +87,7 @@ module WeBee
|
|
59
87
|
def build_url(url)
|
60
88
|
port ||= 80
|
61
89
|
uri = URI.parse(url)
|
90
|
+
@host = uri.host
|
62
91
|
"http://#{user}:#{password}@#{uri.host}:#{uri.port}#{uri.path}"
|
63
92
|
end
|
64
93
|
end
|
@@ -120,25 +149,54 @@ module WeBee
|
|
120
149
|
|
121
150
|
element :id, :as => :datacenter_id
|
122
151
|
element :name
|
123
|
-
element :ramSoft
|
124
|
-
element :ramHard
|
125
|
-
element :cpuSoft
|
126
|
-
element :cpuHard
|
127
|
-
element :storageSoft
|
128
|
-
element :storageHard
|
129
|
-
element :repositorySoft
|
130
|
-
element :repositoryHard
|
131
|
-
element :
|
132
|
-
element :
|
133
|
-
element :hdSoft
|
134
|
-
element :hdHard
|
135
|
-
element :vlanSoft
|
136
|
-
element :vlanHard
|
152
|
+
element :ramSoft, :as => :ram_soft
|
153
|
+
element :ramHard, :as => :ram_hard
|
154
|
+
element :cpuSoft, :as => :cpu_soft
|
155
|
+
element :cpuHard, :as => :cpu_hard
|
156
|
+
element :storageSoft, :as => :storage_soft
|
157
|
+
element :storageHard, :as => :storage_hard
|
158
|
+
element :repositorySoft, :as => :repository_soft
|
159
|
+
element :repositoryHard, :as => :repository_hard
|
160
|
+
element :publicIpsSoft, :as => :public_ip_soft
|
161
|
+
element :publicIpsHard, :as => :public_ip_hard
|
162
|
+
element :hdSoft, :as => :hd_soft
|
163
|
+
element :hdHard, :as => :hd_hard
|
164
|
+
element :vlanSoft, :as => :vlan_soft
|
165
|
+
element :vlanHard, :as => :vlan_hard
|
137
166
|
element :location
|
138
167
|
|
139
168
|
def self.create(attributes)
|
140
|
-
|
141
|
-
|
169
|
+
if attributes[:remote_services].nil?
|
170
|
+
attributes[:remote_services] = WeBee::RemoteService.create_for_host(Api.host)
|
171
|
+
end
|
172
|
+
xm = Builder::XmlMarkup.new
|
173
|
+
xm.datacenter {
|
174
|
+
xm.name attributes[:name]
|
175
|
+
xm.location(attributes[:location] || 'California, USA')
|
176
|
+
xm.cpuSoft(attributes[:cpu_soft] || "0")
|
177
|
+
xm.cpuHard(attributes[:cpu_hard] || "0")
|
178
|
+
xm.vlanSoft(attributes[:vlan_soft] || "0")
|
179
|
+
xm.vlanHard(attributes[:vlan_hard] || "0")
|
180
|
+
xm.ramSoft(attributes[:ram_soft] || "0")
|
181
|
+
xm.ramHard(attributes[:ram_hard] || "0")
|
182
|
+
xm.repositorySoft(attributes[:repository_soft] || "0")
|
183
|
+
xm.repositoryHard(attributes[:repository_hard] || "0")
|
184
|
+
xm.publicIpsSoft(attributes[:public_ip_soft] || "0" )
|
185
|
+
xm.publicIpsHard(attributes[:public_ip_hard] || "0" )
|
186
|
+
xm.hdSoft(attributes[:hd_soft] || "0")
|
187
|
+
xm.hdHard(attributes[:hd_hard] || "0")
|
188
|
+
xm.storageSoft(attributes[:storage_soft] || "0")
|
189
|
+
xm.storageHard(attributes[:storage_hard] || "0")
|
190
|
+
xm.remoteServices {
|
191
|
+
attributes[:remote_services].each do |rs|
|
192
|
+
xm.remoteService {
|
193
|
+
xm.uri rs.uri
|
194
|
+
xm.type rs.rs_type
|
195
|
+
}
|
196
|
+
end
|
197
|
+
}
|
198
|
+
}
|
199
|
+
res = RestClient.post(Api.url + '/admin/datacenters', xm.target!, :content_type => :xml)
|
142
200
|
Datacenter.parse(res)
|
143
201
|
end
|
144
202
|
|
@@ -154,11 +212,83 @@ module WeBee
|
|
154
212
|
doc = Nokogiri.parse(RestClient.get(Api.url + "/admin/datacenters/#{@datacenter_id}/racks", :accept => :xml))
|
155
213
|
doc.search
|
156
214
|
doc.search('//rack').each do |node|
|
157
|
-
|
215
|
+
rack = Rack.parse(node.to_s)
|
216
|
+
rack.datacenter_id = @datacenter_id
|
217
|
+
items << rack
|
158
218
|
end
|
159
219
|
items
|
160
220
|
end
|
161
221
|
|
222
|
+
def add_rack(params)
|
223
|
+
Rack.create datacenter_id, params
|
224
|
+
end
|
225
|
+
|
226
|
+
def discover_machine(params)
|
227
|
+
p = {}
|
228
|
+
p[:ip] = params[:ip]
|
229
|
+
p[:hypervisortype] = params[:hypervisortype] || 'kvm'
|
230
|
+
p[:user] = params[:user] || 'user'
|
231
|
+
p[:password] = params[:secret] || 'secret'
|
232
|
+
p[:port] = params[:port] || '8889'
|
233
|
+
p[:virtual_switch] = params[:virtual_switch]
|
234
|
+
res = RestClient.get Api.url + "/admin/datacenters/#{datacenter_id}/action/discover", :params => p, :content_type => :xml
|
235
|
+
machine = Machine.parse res
|
236
|
+
end
|
237
|
+
|
238
|
+
end
|
239
|
+
|
240
|
+
class RemoteService
|
241
|
+
attr_reader :attributes
|
242
|
+
|
243
|
+
def initialize(attributes)
|
244
|
+
@attributes = attributes
|
245
|
+
end
|
246
|
+
|
247
|
+
def uri
|
248
|
+
@attributes[:uri]
|
249
|
+
end
|
250
|
+
|
251
|
+
def rs_type
|
252
|
+
@attributes[:rs_type]
|
253
|
+
end
|
254
|
+
|
255
|
+
def self.from_type(address, type, use_ssl = false)
|
256
|
+
rs_type_map = {
|
257
|
+
'STORAGE_SYSTEM_MONITOR' => 'ssm',
|
258
|
+
'VIRTUAL_FACTORY' => 'virtualfactory',
|
259
|
+
'VIRTUAL_SYSTEM_MONITOR' => 'vsm',
|
260
|
+
'NODE_COLLECTOR' => 'nodecollector',
|
261
|
+
'APPLIANCE_MANAGER' => 'am',
|
262
|
+
}
|
263
|
+
case type
|
264
|
+
when RemoteServiceType::BPM_SERVICE
|
265
|
+
RemoteService.new :uri => "tcp://#{address}:61616", :rs_type => type
|
266
|
+
when RemoteServiceType::DHCP_SERVICE
|
267
|
+
RemoteService.new :uri => "omapi://#{address}:7911", :rs_type => type
|
268
|
+
else
|
269
|
+
if use_ssl
|
270
|
+
RemoteService.new :uri => "https://#{address}:443", :rs_type => type
|
271
|
+
else
|
272
|
+
RemoteService.new :uri => "http://#{address}:80/#{rs_type_map[type]}", :rs_type => type
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
def self.create_for_host(address, use_ssl = false)
|
278
|
+
items = []
|
279
|
+
%w(
|
280
|
+
STORAGE_SYSTEM_MONITOR
|
281
|
+
VIRTUAL_FACTORY
|
282
|
+
VIRTUAL_SYSTEM_MONITOR
|
283
|
+
NODE_COLLECTOR
|
284
|
+
APPLIANCE_MANAGER
|
285
|
+
DHCP_SERVICE
|
286
|
+
BPM_SERVICE
|
287
|
+
).each do |t|
|
288
|
+
items << RemoteService.from_type(address, t, use_ssl)
|
289
|
+
end
|
290
|
+
items
|
291
|
+
end
|
162
292
|
end
|
163
293
|
|
164
294
|
class Rack
|
@@ -189,6 +319,268 @@ module WeBee
|
|
189
319
|
RestClient.delete(Api.url + "/admin/datacenters/#{datacenter_id}/racks/#{rack_id}", :content_type => :xml)
|
190
320
|
end
|
191
321
|
|
322
|
+
def add_machine(machine)
|
323
|
+
res = RestClient.post Api.url + "/admin/datacenters/#{datacenter_id}/racks/#{rack_id}/machines", machine.to_xml, :content_type => :xml
|
324
|
+
end
|
325
|
+
|
326
|
+
def machines
|
327
|
+
u = []
|
328
|
+
doc = Nokogiri.parse(RestClient.get(Api.url + "/admin/datacenters/#{datacenter_id}/racks/#{rack_id}/machines", :content_type => :xml))
|
329
|
+
doc.search('//machine').each do |node|
|
330
|
+
u << Machine.parse(node.to_s)
|
331
|
+
end
|
332
|
+
u
|
333
|
+
end
|
334
|
+
|
335
|
+
end
|
336
|
+
|
337
|
+
class Datastore
|
338
|
+
include SAXMachine
|
339
|
+
|
340
|
+
element :id, :as => :datastore_id
|
341
|
+
element :directory
|
342
|
+
element :rootPath, :as => :root_path
|
343
|
+
element :enabled
|
344
|
+
element :name
|
345
|
+
element :size
|
346
|
+
element :usedSize, :as => :used_size
|
347
|
+
|
348
|
+
def to_xml
|
349
|
+
xm = Builder::XmlMarkup.new
|
350
|
+
xm.datastore {
|
351
|
+
xm.name name
|
352
|
+
xm.directory directory
|
353
|
+
xm.rootPath root_path
|
354
|
+
xm.enabled enabled
|
355
|
+
xm.size size
|
356
|
+
xm.usedSize used_size
|
357
|
+
}
|
358
|
+
end
|
359
|
+
|
360
|
+
end
|
361
|
+
|
362
|
+
class Machine
|
363
|
+
include SAXMachine
|
364
|
+
|
365
|
+
attr_accessor :raw
|
366
|
+
attr_accessor :datacenter_id
|
367
|
+
|
368
|
+
element :id, :as => :machine_id
|
369
|
+
element :description
|
370
|
+
element :ip
|
371
|
+
element :ipService, :as => :ip_service
|
372
|
+
element :name
|
373
|
+
element :password
|
374
|
+
element :user
|
375
|
+
element :realCpu, :as => :real_cpu
|
376
|
+
element :realHd, :as => :real_hd
|
377
|
+
element :realRam, :as => :real_ram
|
378
|
+
element :state
|
379
|
+
element :type, :as => :hypervisortype
|
380
|
+
element :cpu
|
381
|
+
element :cpuRatio, :as => :cpu_ratio
|
382
|
+
element :cpuUsed, :as => :cpu_used
|
383
|
+
element :hd
|
384
|
+
element :hdUsed, :as => :hd_used
|
385
|
+
element :ram
|
386
|
+
element :ramUsed, :as => :ram_used
|
387
|
+
element :virtualSwitch, :as => :virtual_switch
|
388
|
+
elements :datastore, :as => :datastores, :class => Datastore
|
389
|
+
|
390
|
+
def virtual_switches
|
391
|
+
virtual_switch.split('/')
|
392
|
+
end
|
393
|
+
|
394
|
+
def to_xml
|
395
|
+
xm = Builder::XmlMarkup.new
|
396
|
+
xm.machine {
|
397
|
+
xm.name name
|
398
|
+
xm.description description
|
399
|
+
xm.ip ip
|
400
|
+
xm.ipService ip_service
|
401
|
+
xm.user user
|
402
|
+
xm.password password
|
403
|
+
xm.realCpu real_cpu
|
404
|
+
xm.realHd real_hd
|
405
|
+
xm.realRam real_ram
|
406
|
+
xm.state state
|
407
|
+
xm.type hypervisortype
|
408
|
+
xm.cpu cpu
|
409
|
+
xm.cpuRatio cpu_ratio
|
410
|
+
xm.cpuUsed cpu_used
|
411
|
+
xm.hd hd
|
412
|
+
xm.hdUsed hd_used
|
413
|
+
xm.ram ram
|
414
|
+
xm.ramUsed ram_used
|
415
|
+
xm.virtualSwitch virtual_switch
|
416
|
+
xm.datastores {
|
417
|
+
datastores.each do |ds|
|
418
|
+
xm.datastore {
|
419
|
+
xm.name ds.name
|
420
|
+
xm.directory ds.directory
|
421
|
+
xm.rootPath ds.root_path
|
422
|
+
xm.enabled ds.enabled
|
423
|
+
xm.size ds.size
|
424
|
+
xm.usedSize ds.used_size
|
425
|
+
}
|
426
|
+
end
|
427
|
+
}
|
428
|
+
}
|
429
|
+
xm.target!
|
430
|
+
end
|
431
|
+
|
432
|
+
end
|
433
|
+
|
434
|
+
class RemoteServiceType
|
435
|
+
VIRTUAL_FACTORY = 'VIRTUAL_FACTORY'
|
436
|
+
STORAGE_SYSTEM_MONITOR = 'STORAGE_SYSTEM_MONITOR'
|
437
|
+
VIRTUAL_SYSTEM_MONITOR = 'VIRTUAL_SYSTEM_MONITOR'
|
438
|
+
NODE_COLLECTOR = 'NODE_COLLECTOR'
|
439
|
+
APPLIANCE_MANAGER = 'APPLIANCE_MANAGER'
|
440
|
+
DHCP_SERVICE = 'DHCP_SERVICE'
|
441
|
+
BPM_SERVICE = 'BPM_SERVICE'
|
442
|
+
end
|
443
|
+
|
444
|
+
#
|
445
|
+
# A Virtual Datacenter Network
|
446
|
+
# FIXME: Unimplemented
|
447
|
+
#
|
448
|
+
class VDCNetwork
|
449
|
+
include SAXMachine
|
450
|
+
element :id, :as => :vdc_id
|
451
|
+
element :name
|
452
|
+
element :gateway
|
453
|
+
element :address
|
454
|
+
element :mask
|
455
|
+
element :defaultNetwork, :as => :default_network
|
456
|
+
|
457
|
+
def self.create(attributes)
|
458
|
+
xml = attributes.to_xml(:root => 'network')
|
459
|
+
VDCNetwork.parse(xml)
|
460
|
+
end
|
461
|
+
|
462
|
+
def to_xml
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
#
|
467
|
+
# A virtual datacenter
|
468
|
+
# FIXME: Unimplemented
|
469
|
+
class VDC
|
470
|
+
include SAXMachine
|
471
|
+
element :id, :as => :vdc_id
|
472
|
+
element :name
|
473
|
+
element :ramSoft, :as => :ram_soft
|
474
|
+
element :ramHard, :as => :ram_hard
|
475
|
+
element :cpuSoft, :as => :cpu_soft
|
476
|
+
element :cpuHard, :as => :cpu_hard
|
477
|
+
element :storageSoft, :as => :storage_soft
|
478
|
+
element :storageHard, :as => :storage_hard
|
479
|
+
element :publicIpsSoft, :as => :public_ip_soft
|
480
|
+
element :publicIpsHard, :as => :public_ip_hard
|
481
|
+
element :hdSoft, :as => :hd_soft
|
482
|
+
element :hdHard, :as => :hd_hard
|
483
|
+
element :vlanSoft, :as => :vlan_soft
|
484
|
+
element :vlanHard, :as => :vlan_hard
|
485
|
+
element :hypervisorType, :as => :hypervisortype
|
486
|
+
element :network, :class => VDCNetwork
|
487
|
+
|
488
|
+
def self.create(attributes)
|
489
|
+
datacenter = attributes[:datacenter].datacenter_id
|
490
|
+
enterprise = attributes[:enterprise].resource_id
|
491
|
+
if attributes[:network].nil?
|
492
|
+
net = VDCNetwork.new
|
493
|
+
net.name = 'defaultNetwork'
|
494
|
+
net.gateway = '192.168.1.1'
|
495
|
+
net.address = '192.168.1.0'
|
496
|
+
net.mask = '24'
|
497
|
+
net.default_network = true
|
498
|
+
attributes[:network] = net
|
499
|
+
end
|
500
|
+
xm = Builder::XmlMarkup.new
|
501
|
+
xm.virtualDatacenter {
|
502
|
+
xm.name attributes[:name]
|
503
|
+
xm.cpuSoft(attributes[:cpu_soft] || "0")
|
504
|
+
xm.cpuHard(attributes[:cpu_hard] || "0")
|
505
|
+
xm.vlanSoft(attributes[:vlan_soft] || "0")
|
506
|
+
xm.vlanHard(attributes[:vlan_hard] || "0")
|
507
|
+
xm.ramSoft(attributes[:ram_soft] || "0")
|
508
|
+
xm.ramHard(attributes[:ram_hard] || "0")
|
509
|
+
xm.publicIpsSoft(attributes[:public_ip_soft] || "0" )
|
510
|
+
xm.publicIpsHard(attributes[:public_ip_hard] || "0")
|
511
|
+
xm.hdSoft(attributes[:hd_soft] || "0")
|
512
|
+
xm.hdHard(attributes[:hd_hard] || "0" )
|
513
|
+
xm.storageSoft(attributes[:storage_soft] || "0")
|
514
|
+
xm.storageHard(attributes[:storage_hard] || "0")
|
515
|
+
xm.hypervisorType attributes[:hypervisortype]
|
516
|
+
xm.network {
|
517
|
+
xm.name(attributes[:network].name || 'defaultNetwork')
|
518
|
+
xm.gateway(attributes[:network].gateway || '192.168.1.1')
|
519
|
+
xm.address(attributes[:network].address || '192.168.1.0')
|
520
|
+
xm.mask(attributes[:network].mask || '24')
|
521
|
+
xm.defaultNetwork(attributes[:network].default_network || true)
|
522
|
+
}
|
523
|
+
}
|
524
|
+
res = RestClient.post(Api.url + "/cloud/virtualdatacenters/?datacenter=#{datacenter}&enterprise=#{enterprise}", xm.target!, :content_type => :xml)
|
525
|
+
VDC.parse(res)
|
526
|
+
end
|
527
|
+
|
528
|
+
def to_xml
|
529
|
+
xm = Builder::XmlMarkup.new
|
530
|
+
xm.virtualDatacenter {
|
531
|
+
xm.name name
|
532
|
+
xm.cpuSoft(cpu_soft || "0")
|
533
|
+
xm.cpuHard(cpu_hard || "0")
|
534
|
+
xm.vlanSoft(vlan_soft || "0")
|
535
|
+
xm.vlanHard(vlan_hard || "0")
|
536
|
+
xm.ramSoft(ram_soft || "0")
|
537
|
+
xm.ramHard(ram_hard || "0")
|
538
|
+
xm.repositorySoft(repository_soft || "0")
|
539
|
+
xm.repositoryHard(repository_hard || "0")
|
540
|
+
xm.publicIpsSoft(public_ip_soft || "0" )
|
541
|
+
xm.publicIpsHard(public_ip_hard || "0" )
|
542
|
+
xm.hdSoft(hd_soft || "0")
|
543
|
+
xm.hdHard(hd_hard || "0")
|
544
|
+
xm.storageSoft(storage_soft || "0")
|
545
|
+
xm.storageHard(storage_hard || "0")
|
546
|
+
xm.network {
|
547
|
+
xm.name(network.name || 'defaultNetwork')
|
548
|
+
xm.gateway(network.gateway || '192.168.1.1')
|
549
|
+
xm.address(network.address || '192.168.1.0')
|
550
|
+
xm.mask(network.mask || '24')
|
551
|
+
xm.defaultNetwork(netowork.default_network || true)
|
552
|
+
}
|
553
|
+
}
|
554
|
+
xm.target!
|
555
|
+
end
|
556
|
+
|
557
|
+
def self.all(params = {})
|
558
|
+
items = []
|
559
|
+
if params.empty?
|
560
|
+
doc = Nokogiri.parse(RestClient.get(Api.url + "/cloud/virtualdatacenters", :accept => :xml))
|
561
|
+
doc.search('//virtualDatacenter').each do |node|
|
562
|
+
items << VDC.parse(node.to_s)
|
563
|
+
end
|
564
|
+
else
|
565
|
+
extra = []
|
566
|
+
if params[:enterprise_id]
|
567
|
+
extra << "enterprise=#{params[:enterprise_id]}"
|
568
|
+
end
|
569
|
+
if params[:datacenter_id]
|
570
|
+
extra << "datacenter=#{params[:datacenter_id]}"
|
571
|
+
end
|
572
|
+
doc = Nokogiri.parse(RestClient.get(Api.url + "/cloud/virtualdatacenters?#{extra.join('&')}", :accept => :xml))
|
573
|
+
doc.search('//virtualDatacenter').each do |node|
|
574
|
+
items << VDC.parse(node.to_s)
|
575
|
+
end
|
576
|
+
end
|
577
|
+
items
|
578
|
+
end
|
579
|
+
|
580
|
+
def self.find_by_name(name, options = {})
|
581
|
+
VDC.all(options).find_all { |vdc| vdc.name =~ /#{name}/ }
|
582
|
+
end
|
583
|
+
|
192
584
|
end
|
193
585
|
|
194
586
|
class Enterprise
|
@@ -200,6 +592,22 @@ module WeBee
|
|
200
592
|
|
201
593
|
element :id, :as => :resource_id
|
202
594
|
element :name
|
595
|
+
element :ramSoft, :as => :ram_soft
|
596
|
+
element :ramHard, :as => :ram_hard
|
597
|
+
element :cpuSoft, :as => :cpu_soft
|
598
|
+
element :cpuHard, :as => :cpu_hard
|
599
|
+
element :storageSoft, :as => :storage_soft
|
600
|
+
element :storageHard, :as => :storage_hard
|
601
|
+
element :repositorySoft, :as => :repository_soft
|
602
|
+
element :repositoryHard, :as => :repository_hard
|
603
|
+
element :publicIpsSoft, :as => :public_ip_soft
|
604
|
+
element :publicIpsHard, :as => :public_ip_hard
|
605
|
+
element :hdSoft, :as => :hd_soft
|
606
|
+
element :hdHard, :as => :hd_hard
|
607
|
+
element :vlanSoft, :as => :vlan_soft
|
608
|
+
element :vlanHard, :as => :vlan_hard
|
609
|
+
element :isReservationRestricted, :as => :is_reservation_restricted
|
610
|
+
|
203
611
|
|
204
612
|
def delete
|
205
613
|
RestClient.delete(Api.url + "/admin/enterprises/#{resource_id}")
|
@@ -209,13 +617,30 @@ module WeBee
|
|
209
617
|
# may raise Exception if recuest is not successful
|
210
618
|
#
|
211
619
|
def self.create(attributes = {})
|
212
|
-
|
213
|
-
|
620
|
+
xm = Builder::XmlMarkup.new
|
621
|
+
xm.enterprise {
|
622
|
+
xm.name attributes[:name]
|
623
|
+
xm.cpuSoft(attributes[:cpu_soft] || "0")
|
624
|
+
xm.cpuHard(attributes[:cpu_hard] || "0")
|
625
|
+
xm.vlanSoft(attributes[:vlan_soft] || "0")
|
626
|
+
xm.vlanHard(attributes[:vlan_hard] || "0")
|
627
|
+
xm.ramSoft(attributes[:ram_soft] || "0")
|
628
|
+
xm.ramHard(attributes[:ram_hard] || "0")
|
629
|
+
xm.repositorySoft(attributes[:repository_soft] || "0")
|
630
|
+
xm.repositoryHard(attributes[:repository_hard] || "0")
|
631
|
+
xm.publicIpsSoft(attributes[:public_ip_soft] || "0" )
|
632
|
+
xm.publicIpsHard(attributes[:public_ip_hard] || "0" )
|
633
|
+
xm.hdSoft(attributes[:hd_soft] || "0")
|
634
|
+
xm.hdHard(attributes[:hd_hard] || "0")
|
635
|
+
xm.storageSoft(attributes[:storage_soft] || "0")
|
636
|
+
xm.storageHard(attributes[:storage_hard] || "0")
|
637
|
+
}
|
638
|
+
res = RestClient.post(Api.url + '/admin/enterprises', xm.target!, :content_type => :xml)
|
214
639
|
Enterprise.parse(res)
|
215
640
|
end
|
216
641
|
|
217
642
|
def self.find_by_name(name, options = {})
|
218
|
-
Enterprise.all(options).
|
643
|
+
Enterprise.all(options).find_all { |e| e.name =~ /#{name}/ }
|
219
644
|
end
|
220
645
|
|
221
646
|
def ovf_packages
|
@@ -231,9 +656,44 @@ module WeBee
|
|
231
656
|
col
|
232
657
|
end
|
233
658
|
|
234
|
-
def create_user(
|
235
|
-
|
236
|
-
User.create
|
659
|
+
def create_user(params)
|
660
|
+
params[:enterprise] = self
|
661
|
+
User.create params
|
662
|
+
end
|
663
|
+
|
664
|
+
def create_vdc(params)
|
665
|
+
params[:enterprise] = self
|
666
|
+
VDC.create(params)
|
667
|
+
end
|
668
|
+
|
669
|
+
def set_limits_for_datacenter(dc, params = {})
|
670
|
+
datacenter = dc.datacenter_id
|
671
|
+
xm = Builder::XmlMarkup.new
|
672
|
+
xm.limit {
|
673
|
+
xm.cpuSoft(params[:cpu_soft] || "0")
|
674
|
+
xm.cpuHard(params[:cpu_hard] || "0")
|
675
|
+
xm.vlanSoft(params[:vlan_soft] || "0")
|
676
|
+
xm.vlanHard(params[:vlan_hard] || "0")
|
677
|
+
xm.ramSoft(params[:ram_soft] || "0")
|
678
|
+
xm.ramHard(params[:ram_hard] || "0")
|
679
|
+
xm.repositorySoft(params[:repository_soft] || "0")
|
680
|
+
xm.repositoryHard(params[:repository_hard] || "0")
|
681
|
+
xm.publicIpsSoft(params[:public_ip_soft] || "0" )
|
682
|
+
xm.publicIpsHard(params[:public_ip_hard] || "0" )
|
683
|
+
xm.hdSoft(params[:hd_soft] || "0")
|
684
|
+
xm.hdHard(params[:hd_hard] || "0")
|
685
|
+
xm.storageSoft(params[:storage_soft] || "0")
|
686
|
+
xm.storageHard(params[:storage_hard] || "0")
|
687
|
+
}
|
688
|
+
res = RestClient.post(Api.url + "/admin/enterprises/#{resource_id}/limits?datacenter=#{datacenter}", xm.target!, :content_type => :xml)
|
689
|
+
end
|
690
|
+
|
691
|
+
def vdcs
|
692
|
+
VDC.all(:enterprise_id => resource_id)
|
693
|
+
end
|
694
|
+
|
695
|
+
def enterprise_id
|
696
|
+
resource_id
|
237
697
|
end
|
238
698
|
|
239
699
|
end
|
@@ -253,14 +713,14 @@ module WeBee
|
|
253
713
|
#
|
254
714
|
# May raise exception if request is not successful
|
255
715
|
#
|
256
|
-
def self.create(
|
257
|
-
if
|
258
|
-
role = "<link rel='role' href='#{
|
259
|
-
|
716
|
+
def self.create(params)
|
717
|
+
if params[:role]
|
718
|
+
role = "<link rel='role' href='#{params[:role]}'/>"
|
719
|
+
params.delete :role
|
260
720
|
end
|
261
|
-
eid =
|
262
|
-
|
263
|
-
xml =
|
721
|
+
eid = params[:enterprise].resource_id
|
722
|
+
params.delete :enterprise
|
723
|
+
xml = params.to_xml(:root => 'user')
|
264
724
|
xml = xml.gsub('</user>', "#{role}</user>")
|
265
725
|
res = RestClient.post(Api.url + "/admin/enterprises/#{eid}/users", xml, :content_type => :xml, :accept => :xml)
|
266
726
|
user = User.parse(res)
|
metadata
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: webee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 15
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: "0.
|
8
|
+
- 2
|
9
|
+
version: "0.2"
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Sergio Rubio
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-09-08 00:00:00 Z
|
18
18
|
dependencies:
|
19
19
|
- !ruby/object:Gem::Dependency
|
20
20
|
name: sax-machine
|
@@ -95,6 +95,9 @@ files:
|
|
95
95
|
- lib/webee/commands/user.rb
|
96
96
|
- test/helper.rb
|
97
97
|
- test/test_webee.rb
|
98
|
+
- examples/test.rb
|
99
|
+
- examples/test2.rb
|
100
|
+
- test/test_appliance_manager.rb
|
98
101
|
homepage: http://github.com/rubiojr/webee
|
99
102
|
licenses:
|
100
103
|
- MIT
|
@@ -124,9 +127,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
124
127
|
requirements: []
|
125
128
|
|
126
129
|
rubyforge_project:
|
127
|
-
rubygems_version: 1.
|
130
|
+
rubygems_version: 1.7.2
|
128
131
|
signing_key:
|
129
132
|
specification_version: 3
|
130
133
|
summary: Abiquo API Ruby Implementation
|
131
|
-
test_files:
|
132
|
-
|
134
|
+
test_files:
|
135
|
+
- examples/basics.rb
|
136
|
+
- examples/test.rb
|
137
|
+
- examples/test2.rb
|
138
|
+
- test/helper.rb
|
139
|
+
- test/test_appliance_manager.rb
|
140
|
+
- test/test_webee.rb
|