rbovirt 0.0.38 → 0.1.0

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 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