rbovirt 0.0.38 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c42e5b1c5f43a076a769257cc35bbff0d1a7dc48
4
- data.tar.gz: 068e70e837abc2f7606218df4ff6bd4d39b3c57e
3
+ metadata.gz: 37364775867c2c85d2ce024df84520d268709c11
4
+ data.tar.gz: cfc11b0e00842a67a37aaf00402313af04f13564
5
5
  SHA512:
6
- metadata.gz: 639c692ca2f804a5a16da355099d25f4c3d089ed28923132ca112d51f8bf5eb3711b27e1499843754f1995c6dffe5f820cfc94b38e16d0dee5494378d3c88051
7
- data.tar.gz: 5634a599a70eb748f8e31a88bafb5979413ef39e51228a41d35e0814f634f9043fd15ddff999eaae7f3f6f6e0962ea0eaeee8ccf335df1a54de6372b17354dba
6
+ metadata.gz: fd9cd881cc6a1da9e596830af2d73af02bd21ef48abd6f29fd0da7428e9297bfdb1d10fe33424f671198ce6a9badd5dbb9c885e504897f70b19050700f067224
7
+ data.tar.gz: 2d347cf659fe0f17ede50ed5f99efe143dff113f03f4e0d1484a08b3f65cee14b8da7bc643eabd60444d1a83592366ef138ece1c7245b5d9b54aa4796c1f0e74
data/CHANGES.rdoc CHANGED
@@ -6,6 +6,22 @@ _rbovirt_ project.
6
6
  Note that this list of changes was added with the 0.0.30 release,
7
7
  previous releases aren't described here.
8
8
 
9
+ == 0.1.0 / 2015-05-07
10
+
11
+ New features:
12
+
13
+ * Updated the Ruby required version to 1.9.3.
14
+ * Updated the _rest_client_ required version to 1.7.0.
15
+ * Added +wipe_after_delete+ flag for volumes.
16
+ * Added +comment+ attribute to VMs.
17
+ * Added +clone+ attribute to VMs in order to support creation of full
18
+ clones.
19
+ * Added +ha_priority+ attribute to VMs.
20
+ * Added support for the top level +disks+ collection (also known as
21
+ floating disks).
22
+ * Added +alias+ attribute to volumes.
23
+ * Added support for affinity groups.
24
+
9
25
  == 0.0.32 / 2015-01-14
10
26
 
11
27
  New features:
@@ -0,0 +1,16 @@
1
+ module OVIRT
2
+ class Client
3
+ def diskprofile(dp_id)
4
+ dp = http_get("/diskprofiles/%s" % dp_id)
5
+ OVIRT::DiskProfile::new(self, dp.root)
6
+ end
7
+
8
+ def diskprofiles(opts={})
9
+ path = "/diskprofiles"
10
+ path += search_url(opts) unless filtered_api
11
+ http_get(path).xpath('/disk_profiles/disk_profile').collect do |dp|
12
+ OVIRT::DiskProfile::new(self,dp)
13
+ end.compact
14
+ end
15
+ end
16
+ end
data/lib/client/vm_api.rb CHANGED
@@ -6,11 +6,7 @@ module OVIRT
6
6
  end
7
7
 
8
8
  def vms(opts={})
9
- if opts[:without_details]
10
- headers = {:accept => "application/xml"}
11
- else
12
- headers = {:accept => "application/xml; detail=disks; detail=nics; detail=hosts"}
13
- end
9
+ headers = {:accept => "application/xml; detail=disks; detail=nics; detail=hosts"}
14
10
  path = "/vms"
15
11
  path += search_url(opts) unless filtered_api
16
12
  http_get(path, headers).xpath('/vms/vm').collect do |vm|
@@ -23,7 +19,9 @@ module OVIRT
23
19
 
24
20
  if opts[:user_data] and not opts[:user_data].empty?
25
21
  if api_version?('3') and cluster_major_ver >= 3
26
- if cluster_minor_ver >= 1
22
+ if cluster_minor_ver >= 3
23
+ opts[:user_data_method] = :payload_v3_3
24
+ elsif cluster_minor_ver >= 1
27
25
  opts[:user_data_method] = :payload
28
26
  elsif floppy_hook?
29
27
  opts[:user_data_method] = :custom_property
@@ -0,0 +1,16 @@
1
+ module OVIRT
2
+ class DiskProfile < BaseObject
3
+ def initialize(client, xml)
4
+ super(client, xml[:id], xml[:href], (xml/'name').first.text)
5
+ parse_xml_attributes!(xml)
6
+ self
7
+ end
8
+
9
+ private
10
+ def parse_xml_attributes!(xml)
11
+ @disk_profile = ((xml/'disk_profile').first[:id] rescue nil)
12
+ @name = ((xml/'name').first.text rescue nil)
13
+ @storage_domain = ((xml/'storagedomains').first[:id] rescue nil)
14
+ end
15
+ end
16
+ end
@@ -1,6 +1,6 @@
1
1
  module OVIRT
2
2
  class Template < BaseObject
3
- attr_reader :description, :status, :cluster, :creation_time, :os, :storage, :display, :profile, :memory, :version
3
+ attr_reader :description, :comment, :status, :cluster, :creation_time, :os, :storage, :display, :profile, :memory, :version
4
4
 
5
5
  def initialize(client, xml)
6
6
  super(client, xml[:id], xml[:href], (xml/'name').first.text)
@@ -13,6 +13,7 @@ module OVIRT
13
13
  template_ {
14
14
  name_ opts[:name] || "t-#{Time.now.to_i}"
15
15
  description opts[:description] || ''
16
+ comment opts[:comment] || ''
16
17
  vm(:id => opts[:vm])
17
18
  }
18
19
  end
@@ -30,14 +31,15 @@ module OVIRT
30
31
  private
31
32
  def parse_xml_attributes!(xml)
32
33
  @description = ((xml/'description').first.text rescue '')
34
+ @comment = ((xml/'comment').first.text rescue '')
33
35
  @version = TemplateVersion.new((xml/'version').first)
34
36
  @status = ((xml/'status').first.text rescue 'unknown')
35
37
  @memory = (xml/'memory').first.text
36
38
  @profile = (xml/'type').first.text
37
39
  @cluster = Link::new(@client, (xml/'cluster').first[:id], (xml/'cluster').first[:href])
38
40
  @display = {
39
- :type => ((xml/'display/type').first.text rescue ''),
40
- :monitors => ((xml/'display/monitors').first.text rescue 0)
41
+ :type => (xml/'display/type').first.text,
42
+ :monitors => (xml/'display/monitors').first.text
41
43
  }
42
44
  @cores = ((xml/'cpu/topology').first[:cores].to_i * (xml/'cpu/topology').first[:sockets].to_i rescue nil)
43
45
  @storage = ((xml/'disks/disk/size').first.text rescue nil)
@@ -8,7 +8,7 @@ module OVIRT
8
8
  def parse_xml_attributes(xml)
9
9
  @base_template = (xml/"base_template").first[:id]
10
10
  @version_number = (xml/"version_number").first.text
11
- @version_name = ((xml/"version_name").first.text rescue nil)
11
+ @version_name = (xml/"version_name").first.text
12
12
  end
13
13
  end
14
- end
14
+ end
data/lib/ovirt/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module OVIRT
2
- VERSION = "0.0.38"
2
+ VERSION = "0.1.0"
3
3
  end
data/lib/ovirt/vm.rb CHANGED
@@ -4,8 +4,8 @@ module OVIRT
4
4
  FILEINJECT_PATH = "user-data.txt"
5
5
 
6
6
  class VM < BaseObject
7
- attr_reader :description, :status, :memory, :profile, :display, :host, :cluster, :template
8
- attr_reader :storage, :cores, :creation_time, :os, :ips, :vnc, :quota
7
+ attr_reader :description, :comment, :status, :memory, :profile, :display, :host, :cluster, :template
8
+ attr_reader :storage, :cores, :creation_time, :os, :ha, :ha_priority, :ips, :vnc, :quota, :clone
9
9
  attr_accessor :interfaces, :volumes
10
10
 
11
11
  def initialize(client, xml)
@@ -50,6 +50,9 @@ module OVIRT
50
50
  builder = Nokogiri::XML::Builder.new do
51
51
  vm{
52
52
  name_ opts[:name] || "i-#{Time.now.to_i}"
53
+ if opts[:comment]
54
+ comment_ opts[:comment]
55
+ end
53
56
  if opts[:template] && !opts[:template].empty?
54
57
  template_ :id => (opts[:template])
55
58
  elsif opts[:template_name] && !opts[:template_name].empty?
@@ -76,24 +79,26 @@ module OVIRT
76
79
  end
77
80
  # os element must not be sent when template is present (RHBZ 1104235)
78
81
  if opts[:template].nil? || opts[:template].empty?
79
- os_opts = opts[:os] ? opts[:os].dup : {}
80
- os_opts[:type] ||= opts[:os_type] || 'unassigned'
81
- os_opts[:boot] ||= [opts.fetch(:boot_dev1, 'network'), opts.fetch(:boot_dev2, 'hd')]
82
- os_opts[:kernel] ||= opts[:os_kernel]
83
- os_opts[:initrd] ||= opts[:os_initrd]
84
- os_opts[:cmdline] ||= opts[:os_cmdline]
85
- if opts[:first_boot_dev]
86
- os_opts[:boot] = os_opts[:boot].sort_by.with_index do |device, index|
87
- device == opts[:first_boot_dev] ? -1 : index
82
+ os({:type => opts[:os_type] || 'unassigned' }){
83
+ if(opts[:first_boot_dev] && opts[:first_boot_dev] == 'network')
84
+ boot(:dev=> opts[:boot_dev1] || 'network')
85
+ boot(:dev=> opts[:boot_dev2] || 'hd')
86
+ else
87
+ boot(:dev=> opts[:boot_dev2] || 'hd')
88
+ boot(:dev=> opts[:boot_dev1] || 'network')
88
89
  end
89
- end
90
- os(:type => os_opts[:type]) do
91
- os_opts[:boot].each { |device| boot(:dev => device) }
92
- kernel os_opts[:kernel]
93
- initrd os_opts[:initrd]
94
- cmdline os_opts[:cmdline]
95
- end
90
+ kernel (opts[:os_kernel])
91
+ initrd (opts[:os_initrd])
92
+ cmdline (opts[:os_cmdline])
93
+ }
94
+ end
95
+ if !opts[:ha].nil? || !opts[:ha_priority].nil?
96
+ high_availability_{
97
+ enabled_(opts[:ha]) unless opts[:ha].nil?
98
+ priority_(opts[:ha_priority]) unless opts[:ha_priority].nil?
99
+ }
96
100
  end
101
+ disks_ { clone_(opts[:clone]) } if opts[:clone]
97
102
  display_{
98
103
  type_(opts[:display][:type])
99
104
  } if opts[:display]
@@ -108,6 +113,16 @@ module OVIRT
108
113
  file(:name => "#{opts[:fileinject_path] || OVIRT::FILEINJECT_PATH}") { content(Base64::decode64(opts[:user_data])) }
109
114
  }
110
115
  } if(opts[:user_data_method] && opts[:user_data_method] == :payload)
116
+ payloads {
117
+ payload(:type => 'floppy') {
118
+ files {
119
+ file {
120
+ name_ "#{opts[:fileinject_path] || OVIRT::FILEINJECT_PATH}"
121
+ content Base64::decode64(opts[:user_data])
122
+ }
123
+ }
124
+ }
125
+ } if(opts[:user_data_method] && opts[:user_data_method] == :payload_v3_3)
111
126
  }
112
127
  end
113
128
  Nokogiri::XML(builder.to_xml).root.to_s
@@ -121,6 +136,7 @@ module OVIRT
121
136
  gateway = opts[:gateway]
122
137
  domain = opts[:domain]
123
138
  nicname = opts[:nicname]
139
+ user = opts[:user] || 'root'
124
140
  password = opts[:password]
125
141
  ssh_authorized_keys = opts[:ssh_authorized_keys]
126
142
  fileslist = opts[:files]
@@ -163,7 +179,7 @@ module OVIRT
163
179
  unless password.nil?
164
180
  users {
165
181
  user {
166
- user_name 'root'
182
+ user_name user
167
183
  password password
168
184
  }
169
185
  }
@@ -171,13 +187,13 @@ module OVIRT
171
187
  unless ssh_authorized_keys.nil?
172
188
  authorized_keys {
173
189
  authorized_key {
174
- user { user_name 'root' }
190
+ user { user_name user }
175
191
  ssh_authorized_keys.each do |sshkey|
176
192
  key sshkey
177
193
  end
178
194
  }
179
195
  }
180
- end
196
+ end
181
197
  network_configuration {
182
198
  unless nicname.nil?
183
199
  nics {
@@ -206,7 +222,7 @@ module OVIRT
206
222
  }
207
223
  regenerate_ssh_keys 'true'
208
224
  files {
209
- unless extracmd.nil?
225
+ unless extracmd.nil?
210
226
  file {
211
227
  name_ 'ignored'
212
228
  content extracmd
@@ -235,6 +251,7 @@ module OVIRT
235
251
 
236
252
  def parse_xml_attributes!(xml)
237
253
  @description = ((xml/'description').first.text rescue '')
254
+ @comment = ((xml/'comment').first.text rescue '')
238
255
  @status = ((xml/'status').first.text rescue 'unknown')
239
256
  @memory = (xml/'memory').first.text
240
257
  @profile = (xml/'type').first.text
@@ -242,12 +259,12 @@ module OVIRT
242
259
  @host = Link::new(@client, (xml/'host').first[:id], (xml/'host').first[:href]) rescue nil
243
260
  @cluster = Link::new(@client, (xml/'cluster').first[:id], (xml/'cluster').first[:href])
244
261
  @display = {
245
- :type => ((xml/'display/type').first.text rescue ''),
262
+ :type => (xml/'display/type').first.text,
246
263
  :address => ((xml/'display/address').first.text rescue nil),
247
264
  :port => ((xml/'display/port').first.text rescue nil),
248
265
  :secure_port => ((xml/'display/secure_port').first.text rescue nil),
249
266
  :subject => ((xml/'display/certificate/subject').first.text rescue nil),
250
- :monitors => ((xml/'display/monitors').first.text rescue 0)
267
+ :monitors => (xml/'display/monitors').first.text
251
268
  }
252
269
  @cores = ((xml/'cpu/topology').first[:cores].to_i * (xml/'cpu/topology').first[:sockets].to_i rescue nil)
253
270
  @storage = ((xml/'disks/disk/size').first.text rescue nil)
@@ -261,6 +278,8 @@ module OVIRT
261
278
  :type => (xml/'os').first[:type],
262
279
  :boot => (xml/'os/boot').collect {|boot| boot[:dev] }
263
280
  }
281
+ @ha = ((xml/'high_availability/enabled').first.text rescue nil)
282
+ @ha_priority = ((xml/'high_availability/priority').first.text rescue nil)
264
283
  @quota = ((xml/'quota').first[:id] rescue nil)
265
284
 
266
285
  disks = xml/'disks/disk'
@@ -268,6 +287,8 @@ module OVIRT
268
287
 
269
288
  interfaces = xml/'nics/nic'
270
289
  @interfaces = interfaces.length > 0 ? interfaces.collect {|nic| OVIRT::Interface::new(@client, nic)} : nil
290
+
291
+ @clone = ((xml/'disks/clone').first.text rescue nil)
271
292
  end
272
293
 
273
294
  end
data/lib/ovirt/volume.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module OVIRT
2
2
 
3
3
  class Volume < BaseObject
4
- attr_reader :size, :disk_type, :bootable, :interface, :format, :sparse, :status, :storage_domain, :vm, :quota, :alias
4
+ attr_reader :size, :disk_type, :bootable, :interface, :format, :sparse, :status, :storage_domain, :vm, :quota, :alias, :disk_profile
5
5
 
6
6
  def initialize(client, xml)
7
7
  super(client, xml[:id], xml[:href], (xml/'name').first.text)
@@ -26,6 +26,9 @@ module OVIRT
26
26
  if opts[:bootable]
27
27
  bootable_(opts[:bootable])
28
28
  end
29
+ if opts[:disk_profile]
30
+ disk_profile_(:id => opts[:disk_profile])
31
+ end
29
32
  if opts[:interface]
30
33
  interface_(opts[:interface])
31
34
  end
@@ -41,6 +44,9 @@ module OVIRT
41
44
  if opts[:alias]
42
45
  alias_(opts[:alias])
43
46
  end
47
+ if opts[:wipe_after_delete]
48
+ wipe_after_delete(opts[:wipe_after_delete])
49
+ end
44
50
  }
45
51
  end
46
52
  Nokogiri::XML(builder.to_xml).root.to_s
@@ -55,9 +61,11 @@ module OVIRT
55
61
  @format = ((xml/'format').first.text rescue nil)
56
62
  @sparse = ((xml/'sparse').first.text rescue nil)
57
63
  @status = ((xml/'status/state').first.text rescue nil)
64
+ @disk_profile = Link::new(@client, (xml/'disk_profile').first[:id], (xml/'disk_profile').first[:href]) rescue nil
58
65
  @vm = Link::new(@client, (xml/'vm').first[:id], (xml/'vm').first[:href]) rescue nil
59
66
  @quota = ((xml/'quota').first[:id] rescue nil)
60
67
  @alias = ((xml/'alias').first.text rescue nil)
68
+ @wipe_after_delete = ((xml/'wipe_after_delete').first.text rescue nil)
61
69
  end
62
70
 
63
71
  end
data/lib/rbovirt.rb CHANGED
@@ -3,6 +3,7 @@ require "ovirt/cluster"
3
3
  require "ovirt/datacenter"
4
4
  require "ovirt/host"
5
5
  require "ovirt/storage_domain"
6
+ require "ovirt/disk_profile"
6
7
  require "ovirt/template"
7
8
  require "ovirt/template_version"
8
9
  require "ovirt/vm"
@@ -11,9 +12,7 @@ require "ovirt/interface"
11
12
  require "ovirt/network"
12
13
  require "ovirt/quota"
13
14
  require "ovirt/affinity_group"
14
- require "ovirt/instance_type"
15
15
  require "ovirt/version"
16
- require "ovirt/operating_system"
17
16
 
18
17
  require "client/vm_api"
19
18
  require "client/template_api"
@@ -24,12 +23,10 @@ require "client/storage_domain_api"
24
23
  require "client/quota_api"
25
24
  require "client/disk_api"
26
25
  require "client/affinity_group_api"
27
- require "client/instance_type_api"
28
- require "client/operating_system_api"
26
+ require "client/disk_profile_api"
29
27
 
30
28
  require "nokogiri"
31
29
  require "rest_client"
32
- require "restclient_ext/request"
33
30
  require "restclient_ext/resource"
34
31
 
35
32
  module OVIRT
@@ -48,7 +45,7 @@ module OVIRT
48
45
 
49
46
  class Client
50
47
 
51
- attr_reader :credentials, :api_entrypoint, :datacenter_id, :cluster_id, :filtered_api, :ca_cert_file, :ca_cert_store, :ca_no_verify, :persistent_auth, :jsessionid
48
+ attr_reader :credentials, :api_entrypoint, :datacenter_id, :cluster_id, :filtered_api, :ca_cert_file, :ca_cert_store, :ca_no_verify
52
49
 
53
50
  # Construct a new ovirt client class.
54
51
  # mandatory parameters
@@ -70,16 +67,14 @@ module OVIRT
70
67
  :cluster_id => backward_compatibility_cluster,
71
68
  :filtered_api => backward_compatibility_filtered}
72
69
  end
73
- @api_entrypoint = api_entrypoint
74
- @credentials = { :username => username, :password => password }
75
- @datacenter_id = options[:datacenter_id]
76
- @cluster_id = options[:cluster_id]
77
- @filtered_api = options[:filtered_api]
78
- @ca_cert_file = options[:ca_cert_file]
79
- @ca_cert_store = options[:ca_cert_store]
80
- @ca_no_verify = options[:ca_no_verify]
81
- @persistent_auth = options[:persistent_auth]
82
- @jsessionid = options[:jsessionid]
70
+ @api_entrypoint = api_entrypoint
71
+ @credentials = { :username => username, :password => password }
72
+ @datacenter_id = options[:datacenter_id]
73
+ @cluster_id = options[:cluster_id]
74
+ @filtered_api = options[:filtered_api]
75
+ @ca_cert_file = options[:ca_cert_file]
76
+ @ca_cert_store = options[:ca_cert_store]
77
+ @ca_no_verify = options[:ca_no_verify]
83
78
  end
84
79
 
85
80
  def api_version
@@ -98,13 +93,9 @@ module OVIRT
98
93
  end
99
94
 
100
95
  private
101
-
102
96
  def search_url opts
103
- search = opts[:search] || ''
104
- search += " datacenter=\"%s\"" % current_datacenter.name
105
- search += " page #{opts[:page]}" if opts[:page]
106
- max = opts[:max] ? ";max=#{opts[:max]}" : ''
107
- "#{max}?search=#{CGI.escape(search)}"
97
+ search = opts[:search] || ("datacenter=%s" % current_datacenter.name)
98
+ "?search=%s" % CGI.escape(search)
108
99
  end
109
100
 
110
101
  def current_datacenter
@@ -117,7 +108,9 @@ module OVIRT
117
108
 
118
109
  def http_get(suburl, headers={})
119
110
  begin
120
- handle_success(rest_client(suburl).get(http_headers(headers)))
111
+ res = rest_client(suburl).get(http_headers(headers))
112
+ puts "#{res}\n" if ENV['RBOVIRT_LOG_RESPONSE']
113
+ Nokogiri::XML(res)
121
114
  rescue
122
115
  handle_fault $!
123
116
  end
@@ -125,7 +118,9 @@ module OVIRT
125
118
 
126
119
  def http_post(suburl, body, headers={})
127
120
  begin
128
- handle_success(rest_client(suburl).post(body, http_headers(headers)))
121
+ res = rest_client(suburl).post(body, http_headers(headers))
122
+ puts "#{res}\n" if ENV['RBOVIRT_LOG_RESPONSE']
123
+ Nokogiri::XML(res)
129
124
  rescue
130
125
  handle_fault $!
131
126
  end
@@ -133,7 +128,9 @@ module OVIRT
133
128
 
134
129
  def http_put(suburl, body, headers={})
135
130
  begin
136
- handle_success(rest_client(suburl).put(body, http_headers(headers)))
131
+ res = rest_client(suburl).put(body, http_headers(headers))
132
+ puts "#{res}\n" if ENV['RBOVIRT_LOG_RESPONSE']
133
+ Nokogiri::XML(res)
137
134
  rescue
138
135
  handle_fault $!
139
136
  end
@@ -142,8 +139,10 @@ module OVIRT
142
139
  def http_delete(suburl, body=nil, headers={})
143
140
  begin
144
141
  headers = body ? http_headers(headers) :
145
- {:accept => 'application/xml', :version => '3'}.merge(auth_header).merge(filter_header)
146
- handle_success(rest_client(suburl).delete_with_payload(body, headers))
142
+ {:accept => 'application/xml'}.merge(auth_header).merge(filter_header)
143
+ res = rest_client(suburl).delete_with_payload(body, headers)
144
+ puts "#{res}\n" if ENV['RBOVIRT_LOG_RESPONSE']
145
+ Nokogiri::XML(res)
147
146
  rescue
148
147
  handle_fault $!
149
148
  end
@@ -152,12 +151,7 @@ module OVIRT
152
151
  def auth_header
153
152
  # This is the method for strict_encode64:
154
153
  encoded_credentials = ["#{@credentials[:username]}:#{@credentials[:password]}"].pack("m0").gsub(/\n/,'')
155
- headers = { :authorization => "Basic " + encoded_credentials }
156
- if persistent_auth
157
- headers[:prefer] = 'persistent-auth'
158
- headers[:cookie] = "JSESSIONID=#{jsessionid}" if jsessionid
159
- end
160
- headers
154
+ { :authorization => "Basic " + encoded_credentials }
161
155
  end
162
156
 
163
157
  def rest_client(suburl)
@@ -192,16 +186,9 @@ module OVIRT
192
186
  filter_header.merge(auth_header).merge({
193
187
  :content_type => 'application/xml',
194
188
  :accept => 'application/xml',
195
- :version => '3',
196
189
  }).merge(headers)
197
190
  end
198
191
 
199
- def handle_success(response)
200
- puts "#{response}\n" if ENV['RBOVIRT_LOG_RESPONSE']
201
- @jsessionid ||= response.cookies['JSESSIONID']
202
- Nokogiri::XML(response)
203
- end
204
-
205
192
  def handle_fault(f)
206
193
  if f.is_a?(RestClient::BadRequest) || f.is_a?(RestClient::Conflict)
207
194
  fault = (Nokogiri::XML(f.http_body)/'//fault/detail')
data/rbovirt.gemspec CHANGED
@@ -21,11 +21,13 @@ Gem::Specification.new do |gem|
21
21
  gem.require_paths = ["lib"]
22
22
 
23
23
  gem.add_runtime_dependency('nokogiri')
24
- gem.add_runtime_dependency('rest-client')
24
+ gem.add_runtime_dependency('rest-client', '> 1.7.0')
25
25
  gem.add_development_dependency('shoulda')
26
26
  gem.add_development_dependency('rspec-rails', '~> 2.6')
27
27
  gem.add_development_dependency('rake')
28
28
 
29
+ gem.required_ruby_version = '>= 1.9.3'
30
+
29
31
  gem.rdoc_options << '--title' << gem.name << '--main' << 'README.rdoc' << '--line-numbers' << '--inline-source'
30
32
  gem.extra_rdoc_files = ['README.rdoc', 'CHANGES.rdoc']
31
33
  end
@@ -58,28 +58,6 @@ describe OVIRT, "Https authentication" do
58
58
  end
59
59
  end
60
60
 
61
- describe OVIRT, "Persistent authentication" do
62
- context 'use persistent authentication' do
63
-
64
- it "test_request_with_persistent_authentication" do
65
- user, password, url, datacenter = endpoint
66
- cert = ca_cert(url)
67
- store = OpenSSL::X509::Store.new().add_cert(
68
- OpenSSL::X509::Certificate.new(cert))
69
-
70
- client = ::OVIRT::Client.new(user, password, url, {:ca_cert_store => store, :persistent_auth => true})
71
- client.api_version.class.should eql(String)
72
- client.persistent_auth.should eql(true)
73
- client.jsessionid.should_not be_nil
74
-
75
- # When performing a new request the jsessionid should remain the same
76
- orig_jsession_id = client.jsessionid
77
- client.datacenters.class.should eql(Array)
78
- client.jsessionid.should eql(orig_jsession_id)
79
- end
80
- end
81
- end
82
-
83
61
  describe OVIRT, "Admin API" do
84
62
 
85
63
  before(:all) do
@@ -19,7 +19,7 @@ shared_examples_for "Basic VM Life cycle" do
19
19
 
20
20
  it "test_should_create_template" do
21
21
  template_name = "tmplt-"+Time.now.to_i.to_s
22
- template = @client.create_template(:vm => @vm.id, :name => template_name, :description => "test_template")
22
+ template = @client.create_template(:vm => @vm.id, :name => template_name, :description => "test_template", :comment => "test_template")
23
23
  template.class.to_s.should eql("OVIRT::Template")
24
24
  while !@client.vm(@vm.id).ready? do
25
25
  end
@@ -42,8 +42,6 @@ shared_examples_for "Basic VM Life cycle" do
42
42
  end
43
43
 
44
44
  it "test_should_start_with_cloudinit" do
45
- while @client.vm(@vm.id).status.strip != 'down' do
46
- end
47
45
  hostname = "host-"+Time.now.to_i.to_s
48
46
  user_data={ :hostname => hostname }
49
47
  @client.vm_start_with_cloudinit(@vm.id, user_data)
@@ -53,8 +51,6 @@ shared_examples_for "Basic VM Life cycle" do
53
51
  end
54
52
 
55
53
  it "test_should_set_vm_ticket" do
56
- while @client.vm(@vm.id).status.strip != 'down' do
57
- end
58
54
  @client.vm_action(@vm.id, :start)
59
55
  while !@client.vm(@vm.id).running? do
60
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbovirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.38
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Amos Benari
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-18 00:00:00.000000000 Z
11
+ date: 2015-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: rest-client
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - ">"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 1.7.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - ">"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 1.7.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: shoulda
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +80,8 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
- description: " A Ruby client for oVirt REST API\n"
83
+ description: |2
84
+ A Ruby client for oVirt REST API
84
85
  email:
85
86
  - abenari@redhat.com
86
87
  executables: []
@@ -100,9 +101,8 @@ files:
100
101
  - lib/client/cluster_api.rb
101
102
  - lib/client/datacenter_api.rb
102
103
  - lib/client/disk_api.rb
104
+ - lib/client/disk_profile_api.rb
103
105
  - lib/client/host_api.rb
104
- - lib/client/instance_type_api.rb
105
- - lib/client/operating_system_api.rb
106
106
  - lib/client/quota_api.rb
107
107
  - lib/client/storage_domain_api.rb
108
108
  - lib/client/template_api.rb
@@ -111,11 +111,10 @@ files:
111
111
  - lib/ovirt/base_object.rb
112
112
  - lib/ovirt/cluster.rb
113
113
  - lib/ovirt/datacenter.rb
114
+ - lib/ovirt/disk_profile.rb
114
115
  - lib/ovirt/host.rb
115
- - lib/ovirt/instance_type.rb
116
116
  - lib/ovirt/interface.rb
117
117
  - lib/ovirt/network.rb
118
- - lib/ovirt/operating_system.rb
119
118
  - lib/ovirt/quota.rb
120
119
  - lib/ovirt/storage_domain.rb
121
120
  - lib/ovirt/template.rb
@@ -124,17 +123,14 @@ files:
124
123
  - lib/ovirt/vm.rb
125
124
  - lib/ovirt/volume.rb
126
125
  - lib/rbovirt.rb
127
- - lib/restclient_ext/request.rb
128
126
  - lib/restclient_ext/resource.rb
129
127
  - rbovirt.gemspec
130
128
  - spec/endpoint.yml.example
131
129
  - spec/integration/api_spec.rb
132
- - spec/integration/instance_type_spec.rb
133
130
  - spec/integration/vm_crud_spec.rb
134
131
  - spec/spec_helper.rb
135
132
  - spec/unit/client_spec.rb
136
133
  - spec/unit/vm_spec.rb
137
- - spec/unit/volume_spec.rb
138
134
  homepage: http://github.com/abenari/rbovirt
139
135
  licenses:
140
136
  - MIT
@@ -153,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
153
149
  requirements:
154
150
  - - ">="
155
151
  - !ruby/object:Gem::Version
156
- version: '0'
152
+ version: 1.9.3
157
153
  required_rubygems_version: !ruby/object:Gem::Requirement
158
154
  requirements:
159
155
  - - ">="
@@ -161,16 +157,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
157
  version: '0'
162
158
  requirements: []
163
159
  rubyforge_project:
164
- rubygems_version: 2.5.1
160
+ rubygems_version: 2.2.2
165
161
  signing_key:
166
162
  specification_version: 4
167
163
  summary: A Ruby client for oVirt REST API
168
164
  test_files:
169
165
  - spec/endpoint.yml.example
170
166
  - spec/integration/api_spec.rb
171
- - spec/integration/instance_type_spec.rb
172
167
  - spec/integration/vm_crud_spec.rb
173
168
  - spec/spec_helper.rb
174
169
  - spec/unit/client_spec.rb
175
170
  - spec/unit/vm_spec.rb
176
- - spec/unit/volume_spec.rb
@@ -1,20 +0,0 @@
1
- module OVIRT
2
- class Client
3
- def instance_type(instance_type_id)
4
- begin
5
- instance_type = http_get("/instancetypes/%s" % instance_type_id)
6
- OVIRT::InstanceType::new(self, instance_type.root)
7
- rescue
8
- handle_fault $!
9
- end
10
- end
11
-
12
- def instance_types(opts={})
13
- search = opts[:search] ||""
14
- instance_types = http_get("/instancetypes?search=%s" % CGI.escape(search))
15
- instance_types.xpath('/instance_types/instance_type').collect do |it|
16
- OVIRT::InstanceType::new(self, it)
17
- end
18
- end
19
- end
20
- end
@@ -1,10 +0,0 @@
1
- module OVIRT
2
- class Client
3
- def operating_systems
4
- operating_systems = http_get('/operatingsystems')
5
- operating_systems.xpath('/operating_systems/operating_system').collect do |os|
6
- OVIRT::OperatingSystem::new(self, os)
7
- end
8
- end
9
- end
10
- end
@@ -1,73 +0,0 @@
1
- module OVIRT
2
- # Instance types are added to oVirt 3.5 and have been updated in oVirt 3.6
3
- class InstanceType < BaseObject
4
- # Common attributes to all oVirt version supported at this time
5
- attr_reader :name, :description, :memory, :cores, :os, :creation_time
6
- attr_reader :ha, :ha_priority, :display, :usb, :migration_downtime
7
-
8
- # oVirt 3.5 attributes
9
- attr_reader :type, :status, :cpu_shares, :boot_menu, :origin, :stateless
10
- attr_reader :delete_protected, :sso, :timezone
11
-
12
- # oVirt 3.6 attributes
13
- attr_reader :migration, :io_threads, :memory_guaranteed
14
-
15
- def initialize(client, xml)
16
- super(client, xml[:id], xml[:href], (xml/'name').first.text)
17
- parse_xml_attributes!(xml)
18
- self
19
- end
20
-
21
- private
22
- def parse_xml_attributes!(xml)
23
- # Common attributes
24
- @description = ((xml/'description').first.text rescue '')
25
- @memory = (xml/'memory').first.text
26
- @cores = ((xml/'cpu/topology').first[:cores].to_i * (xml/'cpu/topology').first[:sockets].to_i rescue nil)
27
- @os = {
28
- :type => (xml/'os').first[:type],
29
- :boot => (xml/'os/boot').collect {|boot| boot[:dev] }
30
- }
31
- @creation_time = (xml/'creation_time').text
32
- @ha = parse_bool((xml/'high_availability/enabled').first.text)
33
- @ha_priority = ((xml/'high_availability/priority').first.text rescue nil)
34
- @display = {
35
- :type => (xml/'display/type').first.text,
36
- :monitors => (xml/'display/monitors').first.text,
37
- :single_qxl_pci => parse_bool((xml/'display/single_qxl_pci').first.text),
38
- :smartcard_enabled => parse_bool((xml/'display/smartcard_enabled').first.text),
39
-
40
- }
41
- @usb = parse_bool((xml/'usb/enabled').first.text)
42
- @migration_downtime = ((xml/'migration_downtime').first.text)
43
-
44
- # oVirt 3.5 attributes
45
- @type = ((xml/'type').first.text rescue nil)
46
- @status = ((xml/'status').first.text rescue nil)
47
- @cpu_shares = (((xml/'cpu_shares').first.text) rescue nil)
48
- potential_bool = ((xml/'bios/boot_menu/enabled').first.text rescue nil)
49
- @boot_menu = potential_bool.nil? ? nil : parse_bool(potential_bool)
50
- @origin = ((xml/'origin').text rescue nil)
51
- potential_bool = ((xml/'stateless').first.text rescue nil)
52
- @stateless = potential_bool.nil? ? nil : parse_bool(potential_bool)
53
- potential_bool = ((xml/'delete_protected').first.text rescue nil)
54
- @delete_protected = potential_bool.nil? ? nil : parse_bool(potential_bool)
55
- #@sso = ((xml/'sso/methods').first.text rescue nil)
56
- @timezone = ((xml/'timezone').first.text rescue nil)
57
- potential_bool = ((xml/'display/allow_override').first.text rescue nil)
58
- @display[:allow_override] = potential_bool.nil? ? nil : parse_bool(potential_bool)
59
- potential_bool = ((xml/'display/file_transfer_enabled').first.text rescue nil)
60
- @display[:file_transfer_enabled] = potential_bool.nil? ? nil : parse_bool(potential_bool)
61
- potential_bool = ((xml/'display/copy_paste_enabled').first.text rescue nil)
62
- @display[:copy_paste_enabled] = potential_bool.nil? ? nil : parse_bool(potential_bool)
63
-
64
- # oVirt 3.6 attributes
65
- @migration = {
66
- :auto_converge => ((xml/'migration/auto_converge').first.text rescue nil),
67
- :compressed => ((xml/'migration/compressed').first.text rescue nil)
68
- }
69
- @io_threads = ((xml/'io/threads').first.text rescue nil)
70
- @memory_guaranteed = ((xml/'memory_policy/guaranteed').first.text rescue nil)
71
- end
72
- end
73
- end
@@ -1,11 +0,0 @@
1
- module OVIRT
2
- class OperatingSystem < BaseObject
3
- attr_reader :description
4
-
5
- def initialize(client, xml)
6
- super(client, xml[:id], xml[:href], (xml/'name').text)
7
- @description = (xml/'description').text
8
- self
9
- end
10
- end
11
- end
@@ -1,60 +0,0 @@
1
- # rest-client extension
2
- module RestClient
3
- # This class enhance the rest-client request by accepting a parameter for ca certificate store,
4
- # this file can be removed once https://github.com/rest-client/rest-client/pull/254
5
- # get merged upstream.
6
- #
7
- # :ssl_cert_store - an x509 certificate store.
8
- class Request
9
-
10
- def transmit uri, req, payload, & block
11
- setup_credentials req
12
-
13
- net = net_http_class.new(uri.host, uri.port)
14
- net.use_ssl = uri.is_a?(URI::HTTPS)
15
- if (@verify_ssl == false) || (@verify_ssl == OpenSSL::SSL::VERIFY_NONE)
16
- net.verify_mode = OpenSSL::SSL::VERIFY_NONE
17
- elsif @verify_ssl.is_a? Integer
18
- net.verify_mode = @verify_ssl
19
- net.verify_callback = lambda do |preverify_ok, ssl_context|
20
- if (!preverify_ok) || ssl_context.error != 0
21
- err_msg = "SSL Verification failed -- Preverify: #{preverify_ok}, Error: #{ssl_context.error_string} (#{ssl_context.error})"
22
- raise SSLCertificateNotVerified.new(err_msg)
23
- end
24
- true
25
- end
26
- end
27
- net.cert = @ssl_client_cert if @ssl_client_cert
28
- net.key = @ssl_client_key if @ssl_client_key
29
- net.ca_file = @ssl_ca_file if @ssl_ca_file
30
- net.cert_store = args[:ssl_cert_store] if args[:ssl_cert_store]
31
- net.read_timeout = @timeout if @timeout
32
- net.open_timeout = @open_timeout if @open_timeout
33
-
34
- # disable the timeout if the timeout value is -1
35
- net.read_timeout = nil if @timeout == -1
36
- net.out_timeout = nil if @open_timeout == -1
37
-
38
- RestClient.before_execution_procs.each do |before_proc|
39
- before_proc.call(req, args)
40
- end
41
-
42
- log_request
43
-
44
- net.start do |http|
45
- if @block_response
46
- http.request(req, payload ? payload.to_s : nil, & @block_response)
47
- else
48
- res = http.request(req, payload ? payload.to_s : nil) { |http_response| fetch_body(http_response) }
49
- log_response res
50
- process_result res, & block
51
- end
52
- end
53
- rescue EOFError
54
- raise RestClient::ServerBrokeConnection
55
- rescue Timeout::Error
56
- raise RestClient::RequestTimeout
57
- end
58
-
59
- end
60
- end
@@ -1,16 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
- describe "Basic Instance type life cycle" do
4
- before(:all) do
5
- setup_client
6
- end
7
-
8
- it "test_should_return_instance_types" do
9
- @client.instance_types
10
- end
11
-
12
- it "test_should_return_an_instance_type" do
13
- @instance_type = @client.instance_types.first
14
- @client.instance_type(@instance_type.id).id.should eql(@instance_type.id)
15
- end
16
- end
@@ -1,26 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/../spec_helper"
2
-
3
- describe OVIRT::Volume do
4
-
5
- xml = <<END_HEREDOC
6
- <disk href="/api/vms/76d29095-bc27-4cd0-8178-07e942aea549/nics/12345678-1234-1234-1234-123456789012" id="12345678-1234-1234-1234-123456789012">
7
- <name>disk1</name>
8
- <size>53687091200</size>
9
- <provisioned_size>53687091200</provisioned_size>
10
- <actual_size>143360</actual_size>
11
- <shareable>false</shareable>
12
- <propagate_errors>false</propagate_errors>
13
- <active>true</active>
14
- </disk>
15
- END_HEREDOC
16
- vol = OVIRT::Volume::new(nil, Nokogiri::XML(xml).xpath('/').first)
17
-
18
- it "volume's bootable should be nil, since it was not specified" do
19
- vol.bootable.should eql(nil)
20
- end
21
-
22
- it "volume's interface should be nil, since it was not specified" do
23
- vol.interface.should eql(nil)
24
- end
25
-
26
- end