rbovirt 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/lib/ovirt/version.rb +1 -1
- data/lib/rbovirt.rb +42 -11
- data/lib/restclient_ext/request.rb +60 -0
- data/spec/endpoint.yml.example +1 -2
- data/spec/integration/api_spec.rb +26 -4
- data/spec/integration/vm_crud_spec.rb +12 -8
- data/spec/lib/endpoint.rb +1 -6
- data/spec/spec_helper.rb +15 -1
- data/spec/unit/client_spec.rb +21 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a1291d3d0e7c4fbe8f403ab0657c13024014f63
|
4
|
+
data.tar.gz: 8704c58159029cf09e51a7d13bbdab7f207d0ec7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 732405e0fa15988ec6d9770f394eabcbff7bc8b5c24bc35fb6acfed97f48df2e9d6134a8808e7a0ba376ad65ac9ecaef7c873355716de6ee059c4cd38bcd7878
|
7
|
+
data.tar.gz: 4f7c77886aa636cdfb0b57aa3d457286885645093863f56b1541325c5c8a9b26bf66ddac5f6241ac8adf4956eab762370264dcb2eb7d2afcd0ea0adba03fc3d7
|
data/.gitignore
CHANGED
data/lib/ovirt/version.rb
CHANGED
data/lib/rbovirt.rb
CHANGED
@@ -21,6 +21,7 @@ require "client/quota_api"
|
|
21
21
|
|
22
22
|
require "nokogiri"
|
23
23
|
require "rest_client"
|
24
|
+
require "restclient_ext/request"
|
24
25
|
|
25
26
|
module OVIRT
|
26
27
|
|
@@ -38,14 +39,35 @@ module OVIRT
|
|
38
39
|
|
39
40
|
class Client
|
40
41
|
|
41
|
-
attr_reader :credentials, :api_entrypoint, :datacenter_id, :cluster_id, :filtered_api
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
attr_reader :credentials, :api_entrypoint, :datacenter_id, :cluster_id, :filtered_api, :ca_cert_file, :ca_cert_store
|
43
|
+
|
44
|
+
# Construct a new ovirt client class.
|
45
|
+
# mandatory parameters
|
46
|
+
# username, password, api_entrypoint - for example 'me@internal', 'secret', 'https://example.com/api'
|
47
|
+
# optional parameters
|
48
|
+
# datacenter_id, cluster_id and filtered_api can be sent in this order for backward
|
49
|
+
# compatibility, or as a hash in the 4th parameter.
|
50
|
+
# datacenter_id - setting the datacenter at initialization will add a default scope to any subsequent call
|
51
|
+
# to the client to the specified datacenter.
|
52
|
+
# cluster_id - setting the cluster at initialization will add a default scope to any subsequent call
|
53
|
+
# to the client to the specified cluster.
|
54
|
+
# filtered_api - when set to false (default) will use ovirt administrator api, else it will use the user
|
55
|
+
# api mode.
|
56
|
+
#
|
57
|
+
def initialize(username, password, api_entrypoint, options={}, backward_compatibility_cluster=nil, backward_compatibility_filtered=nil )
|
58
|
+
if !options.is_a?(Hash)
|
59
|
+
# backward compatibility optional parameters
|
60
|
+
options = {:datacenter_id => options,
|
61
|
+
:cluster_id => backward_compatibility_cluster,
|
62
|
+
:filtered_api => backward_compatibility_filtered}
|
63
|
+
end
|
47
64
|
@api_entrypoint = api_entrypoint
|
48
|
-
@
|
65
|
+
@credentials = { :username => username, :password => password }
|
66
|
+
@datacenter_id = options[:datacenter_id]
|
67
|
+
@cluster_id = options[:cluster_id]
|
68
|
+
@filtered_api = options[:filtered_api]
|
69
|
+
@ca_cert_file = options[:ca_cert_file]
|
70
|
+
@ca_cert_store = options[:ca_cert_store]
|
49
71
|
end
|
50
72
|
|
51
73
|
def api_version
|
@@ -79,7 +101,7 @@ module OVIRT
|
|
79
101
|
|
80
102
|
def http_get(suburl, headers={})
|
81
103
|
begin
|
82
|
-
Nokogiri::XML(
|
104
|
+
Nokogiri::XML(rest_client(suburl).get(http_headers(headers)))
|
83
105
|
rescue
|
84
106
|
handle_fault $!
|
85
107
|
end
|
@@ -87,7 +109,7 @@ module OVIRT
|
|
87
109
|
|
88
110
|
def http_post(suburl, body, headers={})
|
89
111
|
begin
|
90
|
-
Nokogiri::XML(
|
112
|
+
Nokogiri::XML(rest_client(suburl).post(body, http_headers(headers)))
|
91
113
|
rescue
|
92
114
|
handle_fault $!
|
93
115
|
end
|
@@ -95,7 +117,7 @@ module OVIRT
|
|
95
117
|
|
96
118
|
def http_put(suburl, body, headers={})
|
97
119
|
begin
|
98
|
-
Nokogiri::XML(
|
120
|
+
Nokogiri::XML(rest_client(suburl).put(body, http_headers(headers)))
|
99
121
|
rescue
|
100
122
|
handle_fault $!
|
101
123
|
end
|
@@ -104,7 +126,7 @@ module OVIRT
|
|
104
126
|
def http_delete(suburl)
|
105
127
|
begin
|
106
128
|
headers = {:accept => 'application/xml'}.merge(auth_header).merge(filter_header)
|
107
|
-
Nokogiri::XML(
|
129
|
+
Nokogiri::XML(rest_client(suburl).delete(headers))
|
108
130
|
rescue
|
109
131
|
handle_fault $!
|
110
132
|
end
|
@@ -116,6 +138,15 @@ module OVIRT
|
|
116
138
|
{ :authorization => "Basic " + encoded_credentials }
|
117
139
|
end
|
118
140
|
|
141
|
+
def rest_client(suburl)
|
142
|
+
if (URI.parse(@api_entrypoint)).scheme == 'https'
|
143
|
+
verify_options = {:verify_ssl => OpenSSL::SSL::VERIFY_PEER}
|
144
|
+
verify_options[:ssl_cert_store] = ca_cert_store if ca_cert_store
|
145
|
+
verify_options[:ssl_ca_file] = ca_cert_file if ca_cert_file
|
146
|
+
end
|
147
|
+
RestClient::Resource.new(@api_entrypoint, verify_options)[suburl]
|
148
|
+
end
|
149
|
+
|
119
150
|
def filter_header
|
120
151
|
filtered_api ? { :filter => "true" } : {}
|
121
152
|
end
|
@@ -0,0 +1,60 @@
|
|
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
|
data/spec/endpoint.yml.example
CHANGED
@@ -38,11 +38,32 @@ shared_examples_for "API" do
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
describe OVIRT, "Https authentication" do
|
42
|
+
context 'authenticate using the server ca certificate' do
|
43
|
+
|
44
|
+
it "test_should_get_ca_certificate" do
|
45
|
+
user, password, url, datacenter = endpoint
|
46
|
+
::OVIRT::RSpec.ca_cert(url).class.should eql(String)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should_authenticate_with_ca_certificate" do
|
50
|
+
user, password, url, datacenter = endpoint
|
51
|
+
cert = ::OVIRT::RSpec.ca_cert(url)
|
52
|
+
store = OpenSSL::X509::Store.new().add_cert(
|
53
|
+
OpenSSL::X509::Certificate.new(cert))
|
54
|
+
|
55
|
+
client = ::OVIRT::Client.new(user, password, url, {:ca_cert_store => store})
|
56
|
+
client.api_version.class.should eql(String)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
41
61
|
describe OVIRT, "Admin API" do
|
42
62
|
|
43
63
|
before(:all) do
|
44
|
-
user, password, url = endpoint
|
45
|
-
|
64
|
+
user, password, url, datacenter = endpoint
|
65
|
+
opts = {:datacenter_id => datacenter, :ca_cert_file => "#{File.dirname(__FILE__)}/../ca_cert.pem"}
|
66
|
+
@client = ::OVIRT::Client.new(user, password, url, opts )
|
46
67
|
end
|
47
68
|
|
48
69
|
after(:all) do
|
@@ -61,8 +82,9 @@ end
|
|
61
82
|
describe OVIRT, "User API" do
|
62
83
|
|
63
84
|
before(:all) do
|
64
|
-
user, password, url = endpoint
|
65
|
-
|
85
|
+
user, password, url, datacenter = endpoint
|
86
|
+
opts = {:datacenter_id => datacenter, :ca_cert_file => "#{File.dirname(__FILE__)}/../ca_cert.pem", :filtered_api => support_user_level_api}
|
87
|
+
@client = ::OVIRT::Client.new(user, password, url, opts)
|
66
88
|
end
|
67
89
|
|
68
90
|
after(:all) do
|
@@ -3,12 +3,12 @@ require "#{File.dirname(__FILE__)}/../spec_helper"
|
|
3
3
|
shared_examples_for "Basic VM Life cycle" do
|
4
4
|
|
5
5
|
before(:all) do
|
6
|
-
@
|
7
|
-
@
|
6
|
+
@cluster = @client.clusters.last.id
|
7
|
+
@template_id = "00000000-0000-0000-0000-000000000000"
|
8
8
|
name = 'vm-'+Time.now.to_i.to_s
|
9
|
-
@vm = @client.create_vm(:name => name, :template => @
|
9
|
+
@vm = @client.create_vm(:name => name, :template => @template_id, :cluster => @cluster)
|
10
10
|
@client.add_volume(@vm.id)
|
11
|
-
@client.add_interface(@vm.id)
|
11
|
+
@client.add_interface(@vm.id, :network_name => 'rhevm')
|
12
12
|
while !@client.vm(@vm.id).ready? do
|
13
13
|
end
|
14
14
|
end
|
@@ -71,8 +71,9 @@ end
|
|
71
71
|
describe "Admin API VM Life cycle" do
|
72
72
|
|
73
73
|
before(:all) do
|
74
|
-
user, password, url = endpoint
|
75
|
-
|
74
|
+
user, password, url, datacenter = endpoint
|
75
|
+
opts = {:datacenter_id => datacenter, :ca_cert_file => "#{File.dirname(__FILE__)}/../ca_cert.pem"}
|
76
|
+
@client = ::OVIRT::Client.new(user, password, url, opts)
|
76
77
|
end
|
77
78
|
|
78
79
|
context 'admin basic vm and templates operations' do
|
@@ -83,8 +84,11 @@ end
|
|
83
84
|
describe "User API VM Life cycle" do
|
84
85
|
|
85
86
|
before(:all) do
|
86
|
-
user, password, url = endpoint
|
87
|
-
|
87
|
+
user, password, url, datacenter = endpoint
|
88
|
+
opts = {:datacenter_id => datacenter,
|
89
|
+
:ca_cert_file => "#{File.dirname(__FILE__)}/../ca_cert.pem",
|
90
|
+
:filtered_api => support_user_level_api}
|
91
|
+
@client = ::OVIRT::Client.new(user, password, url, opts)
|
88
92
|
end
|
89
93
|
|
90
94
|
context 'user basic vm and templates operations' do
|
data/spec/lib/endpoint.rb
CHANGED
@@ -3,12 +3,7 @@ module OVIRT::RSpec::Endpoint
|
|
3
3
|
def endpoint
|
4
4
|
file = File.expand_path("../endpoint.yml", File.dirname(__FILE__))
|
5
5
|
@endpoint ||= YAML.load(File.read(file))
|
6
|
-
user
|
7
|
-
password= @endpoint['password']
|
8
|
-
hostname = @endpoint['hostname']
|
9
|
-
port = @endpoint['port']
|
10
|
-
url = "http://#{hostname}:#{port}/api"
|
11
|
-
return user, password, url
|
6
|
+
return @endpoint['user'], @endpoint['password'], @endpoint['url'] , @endpoint['datacenter']
|
12
7
|
end
|
13
8
|
|
14
9
|
def support_user_level_api
|
data/spec/spec_helper.rb
CHANGED
@@ -2,7 +2,21 @@ require 'rspec'
|
|
2
2
|
require 'rspec/mocks'
|
3
3
|
require 'rbovirt'
|
4
4
|
|
5
|
-
module OVIRT::RSpec
|
5
|
+
module OVIRT::RSpec
|
6
|
+
|
7
|
+
# get ovirt ca certificate public key
|
8
|
+
# * url - ovirt server url
|
9
|
+
def self.ca_cert(url)
|
10
|
+
ca_url = URI.parse(url)
|
11
|
+
ca_url.path = "/ca.crt"
|
12
|
+
http = Net::HTTP.new(ca_url.host, ca_url.port)
|
13
|
+
http.use_ssl = (ca_url.scheme == 'https')
|
14
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
15
|
+
request = Net::HTTP::Get.new(ca_url.path)
|
16
|
+
http.request(request).body
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
6
20
|
|
7
21
|
require "#{File.dirname(__FILE__)}/lib/endpoint"
|
8
22
|
|
data/spec/unit/client_spec.rb
CHANGED
@@ -1,6 +1,27 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/../spec_helper"
|
2
2
|
|
3
3
|
describe OVIRT::Client do
|
4
|
+
context 'client initialization' do
|
5
|
+
it 'should accept no option' do
|
6
|
+
OVIRT::Client::new('mockuser','mockpass','http://example.com/api')
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should accept no datacenter_id in options' do
|
10
|
+
OVIRT::Client::new('mockuser','mockpass','http://example.com/api', :datacenter_id => '123123')
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should support backward compatibility' do
|
14
|
+
OVIRT::Client::new('mockuser','mockpass','http://example.com/api', '123123', '123123', false)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should support options hash in 4th parameter' do
|
18
|
+
OVIRT::Client::new('mockuser','mockpass','http://example.com/api',
|
19
|
+
{:datacenter_id => '123123',
|
20
|
+
:cluster_id => '123123',
|
21
|
+
:filtered_api => false,
|
22
|
+
:ca_cert_file => 'ca_cert.pem'})
|
23
|
+
end
|
24
|
+
end
|
4
25
|
|
5
26
|
context 'http comms' do
|
6
27
|
before(:each) do
|
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.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Amos Benari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- lib/ovirt/vm.rb
|
116
116
|
- lib/ovirt/volume.rb
|
117
117
|
- lib/rbovirt.rb
|
118
|
+
- lib/restclient_ext/request.rb
|
118
119
|
- rbovirt.gemspec
|
119
120
|
- spec/endpoint.yml.example
|
120
121
|
- spec/integration/api_spec.rb
|