fog-ovirt 1.0.1 → 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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +1 -1
- data/fog-ovirt.gemspec +1 -0
- data/lib/fog/ovirt/compute/v3.rb +1 -1
- data/lib/fog/ovirt/compute/v4.rb +163 -0
- data/lib/fog/ovirt/compute.rb +32 -11
- data/lib/fog/ovirt/requests/compute/v4/add_interface.rb +41 -0
- data/lib/fog/ovirt/requests/compute/v4/add_volume.rb +54 -0
- data/lib/fog/ovirt/requests/compute/v4/create_vm.rb +62 -0
- data/lib/fog/ovirt/requests/compute/v4/datacenters.rb +22 -0
- data/lib/fog/ovirt/requests/compute/v4/destroy_interface.rb +24 -0
- data/lib/fog/ovirt/requests/compute/v4/destroy_vm.rb +23 -0
- data/lib/fog/ovirt/requests/compute/v4/destroy_volume.rb +25 -0
- data/lib/fog/ovirt/requests/compute/v4/get_api_version.rb +18 -0
- data/lib/fog/ovirt/requests/compute/v4/get_cluster.rb +19 -0
- data/lib/fog/ovirt/requests/compute/v4/get_instance_type.rb +19 -0
- data/lib/fog/ovirt/requests/compute/v4/get_quota.rb +20 -0
- data/lib/fog/ovirt/requests/compute/v4/get_template.rb +19 -0
- data/lib/fog/ovirt/requests/compute/v4/get_virtual_machine.rb +19 -0
- data/lib/fog/ovirt/requests/compute/v4/list_clusters.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_instance_types.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_networks.rb +18 -0
- data/lib/fog/ovirt/requests/compute/v4/list_operating_systems.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_quotas.rb +22 -0
- data/lib/fog/ovirt/requests/compute/v4/list_template_interfaces.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_template_volumes.rb +27 -0
- data/lib/fog/ovirt/requests/compute/v4/list_templates.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_virtual_machines.rb +28 -0
- data/lib/fog/ovirt/requests/compute/v4/list_vm_interfaces.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/list_vm_volumes.rb +30 -0
- data/lib/fog/ovirt/requests/compute/v4/list_volumes.rb +21 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/affinitygroup.xml +8 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/affinitygroup_vms.xml +9 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/affinitygroups.xml +17 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/cluster.xml +27 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/clusters.xml +53 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/data_centers.xml +21 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/disks.xml +54 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/instance_type.xml +50 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/instance_types.xml +233 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/nics.xml +12 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/operating_systems.xml +10 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/quotas.xml +7 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/storage_domains.xml +34 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/template.xml +45 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/templates.xml +128 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/vm.xml +58 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/vms.xml +170 -0
- data/lib/fog/ovirt/requests/compute/v4/mock_files/volumes.xml +36 -0
- data/lib/fog/ovirt/requests/compute/v4/storage_domains.rb +27 -0
- data/lib/fog/ovirt/requests/compute/v4/update_interface.rb +35 -0
- data/lib/fog/ovirt/requests/compute/v4/update_volume.rb +36 -0
- data/lib/fog/ovirt/requests/compute/v4/vm_action.rb +26 -0
- data/lib/fog/ovirt/requests/compute/v4/vm_ticket.rb +19 -0
- data/lib/fog/ovirt/version.rb +1 -1
- data/tests/ovirt/requests/compute/{client_tests.rb → v3/client_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{create_vm_tests.rb → v3/create_vm_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{destroy_vm_tests.rb → v3/destroy_vm_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{list_datacenters_tests.rb → v3/list_datacenters_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{list_quotas_tests.rb → v3/list_quotas_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{list_storage_domains_tests.rb → v3/list_storage_domains_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{update_vm_tests.rb → v3/update_vm_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/{update_volume_tests.rb → v3/update_volume_tests.rb} +0 -0
- data/tests/ovirt/requests/compute/v4/client_tests.rb +31 -0
- data/tests/ovirt/requests/compute/v4/create_vm_tests.rb +17 -0
- data/tests/ovirt/requests/compute/v4/destroy_vm_tests.rb +16 -0
- data/tests/ovirt/requests/compute/v4/list_datacenters_tests.rb +11 -0
- data/tests/ovirt/requests/compute/v4/list_quotas_tests.rb +10 -0
- data/tests/ovirt/requests/compute/v4/list_storage_domains_tests.rb +11 -0
- data/tests/ovirt/requests/compute/v4/update_volume_tests.rb +17 -0
- metadata +96 -19
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: bd8e9f9e8c862d91460d0f89a404e63f1a9aa22d
|
|
4
|
+
data.tar.gz: 30b9ad6857bd86479b48ee066fa8a3c1939f9722
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '09bed3bc7ff912ab77167c48e69e2339b1d91c071ef5e410f87573ef9908e81cf53e6159bcd3b89484d22fdb969fc14b97ec83b713560ab7af14b8d268f8666f'
|
|
7
|
+
data.tar.gz: 3da84bbfa399997f07670f183dcb6ed8c6451078735eca74bddfe9a14a5d2bfe99095fbad6a0d4dfbc7f275c63b489ad7546f2a2e003d15c7afa44babc5294c9
|
data/.rubocop_todo.yml
CHANGED
data/fog-ovirt.gemspec
CHANGED
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
|
23
23
|
spec.add_dependency("fog-core", "~> 1.45")
|
|
24
24
|
spec.add_dependency("fog-json")
|
|
25
25
|
spec.add_dependency("fog-xml", "~> 0.1.1")
|
|
26
|
+
spec.add_dependency("ovirt-engine-sdk", ">= 4.1.3")
|
|
26
27
|
spec.add_dependency("rbovirt", "~> 0.1.5")
|
|
27
28
|
|
|
28
29
|
spec.add_development_dependency "bundler", "~> 1.10"
|
data/lib/fog/ovirt/compute/v3.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Fog
|
|
|
4
4
|
class V3 < Fog::Service
|
|
5
5
|
requires :ovirt_username, :ovirt_password
|
|
6
6
|
recognizes :ovirt_url, :ovirt_server, :ovirt_port, :ovirt_api_path, :ovirt_datacenter,
|
|
7
|
-
:ovirt_filtered_api,
|
|
7
|
+
:ovirt_filtered_api, :public_key, :api_version,
|
|
8
8
|
:ovirt_ca_cert_store, :ovirt_ca_cert_file, :ovirt_ca_no_verify
|
|
9
9
|
request_path "fog/ovirt/requests/compute/v3"
|
|
10
10
|
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4 < Fog::Service
|
|
5
|
+
requires :ovirt_username, :ovirt_password
|
|
6
|
+
recognizes :ovirt_url, :ovirt_server, :ovirt_port, :ovirt_api_path, :ovirt_datacenter,
|
|
7
|
+
:ca_file, :public_key, :api_version, :ovirt_ca_cert_store
|
|
8
|
+
request_path "fog/ovirt/requests/compute/v4"
|
|
9
|
+
|
|
10
|
+
request :vm_action
|
|
11
|
+
request :destroy_vm
|
|
12
|
+
request :create_vm
|
|
13
|
+
request :datacenters
|
|
14
|
+
request :storage_domains
|
|
15
|
+
request :list_virtual_machines
|
|
16
|
+
request :get_virtual_machine
|
|
17
|
+
request :list_templates
|
|
18
|
+
request :get_template
|
|
19
|
+
request :list_instance_types
|
|
20
|
+
request :get_instance_type
|
|
21
|
+
request :list_clusters
|
|
22
|
+
request :get_cluster
|
|
23
|
+
request :add_interface
|
|
24
|
+
request :destroy_interface
|
|
25
|
+
request :update_interface
|
|
26
|
+
request :list_vm_interfaces
|
|
27
|
+
request :list_template_interfaces
|
|
28
|
+
request :list_networks
|
|
29
|
+
request :vm_ticket
|
|
30
|
+
request :list_vm_volumes
|
|
31
|
+
request :list_template_volumes
|
|
32
|
+
request :list_volumes
|
|
33
|
+
request :add_volume
|
|
34
|
+
request :destroy_volume
|
|
35
|
+
request :update_volume
|
|
36
|
+
request :get_api_version
|
|
37
|
+
request :list_quotas
|
|
38
|
+
request :get_quota
|
|
39
|
+
request :list_operating_systems
|
|
40
|
+
|
|
41
|
+
module Shared
|
|
42
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
43
|
+
# converts an OVIRT object into an hash for fog to consume.
|
|
44
|
+
def ovirt_attrs(obj)
|
|
45
|
+
opts = {}
|
|
46
|
+
# TODO: stop using instance_variables, they will change
|
|
47
|
+
obj.instance_variables.each do |v|
|
|
48
|
+
key = v.to_s.delete("@").to_sym
|
|
49
|
+
value = obj.instance_variable_get(v)
|
|
50
|
+
|
|
51
|
+
if key == :network
|
|
52
|
+
opts[key] = client.follow_link(obj.vnic_profile).network.id
|
|
53
|
+
next
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if key == :provisioned_size
|
|
57
|
+
opts[:size] = value
|
|
58
|
+
next
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# ignore nil values
|
|
62
|
+
next if value.nil?
|
|
63
|
+
|
|
64
|
+
if key != :data_center && value.respond_to?(:href) && value.href && value.respond_to?(:id)
|
|
65
|
+
opts[key] = value.id
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
opts[key] ||= get_attr_value(value, opts)
|
|
69
|
+
end
|
|
70
|
+
opts
|
|
71
|
+
end
|
|
72
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
73
|
+
|
|
74
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
75
|
+
def get_attr_value(value, opts)
|
|
76
|
+
case value
|
|
77
|
+
when OvirtSDK4::TemplateVersion, Array, Hash, OvirtSDK4::List, OvirtSDK4::DataCenter
|
|
78
|
+
value
|
|
79
|
+
when OvirtSDK4::Mac
|
|
80
|
+
value.address
|
|
81
|
+
when OvirtSDK4::Cpu
|
|
82
|
+
opts[:cores] = value.topology.nil? ? nil : value.topology.cores
|
|
83
|
+
when OvirtSDK4::Display
|
|
84
|
+
subject = value.certificate.subject if value.certificate
|
|
85
|
+
{
|
|
86
|
+
:type => value.type,
|
|
87
|
+
:address => value.address,
|
|
88
|
+
:port => value.port,
|
|
89
|
+
:secure_port => value.secure_port,
|
|
90
|
+
:subject => subject,
|
|
91
|
+
:monitors => value.monitors
|
|
92
|
+
}
|
|
93
|
+
else
|
|
94
|
+
value.to_s.strip
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class Mock
|
|
101
|
+
include Shared
|
|
102
|
+
|
|
103
|
+
def initialize(_options = {})
|
|
104
|
+
require "ovirtsdk4"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
|
|
109
|
+
def client
|
|
110
|
+
return @client if defined?(@client)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# read mocks xml
|
|
114
|
+
def read_xml(file_name)
|
|
115
|
+
file_path = File.join(__dir__, "../requests", "compute/v4", "mock_files", file_name)
|
|
116
|
+
File.read(file_path)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
class Real
|
|
121
|
+
include Shared
|
|
122
|
+
|
|
123
|
+
# rubocop:disable Metrics/AbcSize
|
|
124
|
+
def initialize(options = {})
|
|
125
|
+
require "ovirtsdk4"
|
|
126
|
+
username = options[:ovirt_username]
|
|
127
|
+
password = options[:ovirt_password]
|
|
128
|
+
server = options[:ovirt_server]
|
|
129
|
+
port = options[:ovirt_port] || 8080
|
|
130
|
+
api_path = options[:ovirt_api_path] || "/api"
|
|
131
|
+
url = options[:ovirt_url] || "https://#{server}:#{port}#{api_path}"
|
|
132
|
+
|
|
133
|
+
connection_opts = {
|
|
134
|
+
:url => url,
|
|
135
|
+
:username => username,
|
|
136
|
+
:password => password
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@datacenter = options[:ovirt_datacenter]
|
|
140
|
+
connection_opts[:ca_file] = options[:ca_file]
|
|
141
|
+
connection_opts[:ca_certs] = [OpenSSL::X509::Certificate.new(options[:public_key])] if options[:public_key].present?
|
|
142
|
+
|
|
143
|
+
@client = ExceptionWrapper.new(OvirtSDK4::Connection.new(connection_opts))
|
|
144
|
+
end
|
|
145
|
+
# rubocop:enable Metrics/AbcSize
|
|
146
|
+
|
|
147
|
+
def api_version
|
|
148
|
+
api = client.system_service.get
|
|
149
|
+
api.product_info.version.full_version
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def datacenter
|
|
153
|
+
@datacenter ||= datacenters.first.id
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
private
|
|
157
|
+
|
|
158
|
+
attr_reader :client
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
data/lib/fog/ovirt/compute.rb
CHANGED
|
@@ -3,6 +3,9 @@ require "fog/ovirt/core"
|
|
|
3
3
|
module Fog
|
|
4
4
|
module Compute
|
|
5
5
|
class Ovirt < Fog::Service
|
|
6
|
+
recognizes :api_version, :ovirt_username, :ovirt_password, :ovirt_url,
|
|
7
|
+
:ovirt_datacenter, :ovirt_ca_cert_store, :public_key
|
|
8
|
+
|
|
6
9
|
model_path "fog/ovirt/models/compute"
|
|
7
10
|
model :server
|
|
8
11
|
collection :servers
|
|
@@ -31,13 +34,13 @@ module Fog
|
|
|
31
34
|
# rubocop:disable Style/MethodMissing
|
|
32
35
|
def method_missing(symbol, *args)
|
|
33
36
|
if block_given?
|
|
34
|
-
@client.
|
|
37
|
+
@client.__send__(symbol, *args) do |*block_args|
|
|
35
38
|
yield(*block_args)
|
|
36
39
|
end
|
|
37
40
|
else
|
|
38
|
-
@client.
|
|
41
|
+
@client.__send__(symbol, *args)
|
|
39
42
|
end
|
|
40
|
-
rescue
|
|
43
|
+
rescue StandardError => e
|
|
41
44
|
raise ::Fog::Ovirt::Errors::OvirtEngineError, e
|
|
42
45
|
end
|
|
43
46
|
|
|
@@ -48,15 +51,23 @@ module Fog
|
|
|
48
51
|
end
|
|
49
52
|
|
|
50
53
|
require "fog/ovirt/compute/v3"
|
|
54
|
+
require "fog/ovirt/compute/v4"
|
|
51
55
|
|
|
52
56
|
def self.new(options = {})
|
|
53
|
-
super()
|
|
54
|
-
|
|
57
|
+
super(options)
|
|
58
|
+
|
|
59
|
+
# rubocop:disable Style/ConditionalAssignment
|
|
60
|
+
if options[:api_version] == "v4"
|
|
61
|
+
@client = Fog::Compute::Ovirt::V4.new(options)
|
|
62
|
+
else
|
|
63
|
+
@client = Fog::Compute::Ovirt::V3.new(options)
|
|
64
|
+
end
|
|
65
|
+
# rubocop:enable Style/ConditionalAssignment
|
|
55
66
|
end
|
|
56
67
|
|
|
57
68
|
# rubocop:disable Style/MethodMissing
|
|
58
69
|
def method_missing(symbol, *args)
|
|
59
|
-
@client.
|
|
70
|
+
@client.__send__(symbol, *args)
|
|
60
71
|
end
|
|
61
72
|
|
|
62
73
|
def respond_to?(symbol, include_all = false)
|
|
@@ -66,13 +77,18 @@ module Fog
|
|
|
66
77
|
|
|
67
78
|
class Mock
|
|
68
79
|
def initialize(options = {})
|
|
69
|
-
|
|
70
|
-
|
|
80
|
+
if options[:api_version] == "v4"
|
|
81
|
+
Fog::Compute::Ovirt::V4::Mock.send(:include, Fog::Compute::Ovirt::Collections)
|
|
82
|
+
@client = Fog::Compute::Ovirt::V4::Mock.new(options)
|
|
83
|
+
else
|
|
84
|
+
Fog::Compute::Ovirt::V3::Mock.send(:include, Fog::Compute::Ovirt::Collections)
|
|
85
|
+
@client = Fog::Compute::Ovirt::V3::Mock.new(options)
|
|
86
|
+
end
|
|
71
87
|
end
|
|
72
88
|
|
|
73
89
|
# rubocop:disable Style/MethodMissing
|
|
74
90
|
def method_missing(symbol, *args)
|
|
75
|
-
@client.
|
|
91
|
+
@client.__send__(symbol, *args)
|
|
76
92
|
end
|
|
77
93
|
|
|
78
94
|
def respond_to?(symbol, include_all = false)
|
|
@@ -83,8 +99,13 @@ module Fog
|
|
|
83
99
|
|
|
84
100
|
class Real
|
|
85
101
|
def initialize(options = {})
|
|
86
|
-
|
|
87
|
-
|
|
102
|
+
if options[:api_version] == "v4"
|
|
103
|
+
Fog::Compute::Ovirt::V4::Real.send(:include, Fog::Compute::Ovirt::Collections)
|
|
104
|
+
@client = Fog::Compute::Ovirt::V4::Real.new(options)
|
|
105
|
+
else
|
|
106
|
+
Fog::Compute::Ovirt::V3::Real.send(:include, Fog::Compute::Ovirt::Collections)
|
|
107
|
+
@client = Fog::Compute::Ovirt::V3::Real.new(options)
|
|
108
|
+
end
|
|
88
109
|
end
|
|
89
110
|
|
|
90
111
|
# rubocop:disable Style/MethodMissing
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
# rubocop:disable Metrics/AbcSize
|
|
7
|
+
def add_interface(id, options = {})
|
|
8
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
9
|
+
vm = client.system_service.vms_service.vm_service(id)
|
|
10
|
+
nics_service = vm.nics_service
|
|
11
|
+
options = options.dup
|
|
12
|
+
|
|
13
|
+
if options[:network].present?
|
|
14
|
+
network = client.system_service.networks_service.network_service(options[:network]).get
|
|
15
|
+
|
|
16
|
+
profiles = client.follow_link(network.vnic_profiles)
|
|
17
|
+
|
|
18
|
+
profile = profiles.detect { |x| x.name == network.name }
|
|
19
|
+
|
|
20
|
+
profile ||= profiles.sort_by(&:name).first
|
|
21
|
+
|
|
22
|
+
options.delete(:network)
|
|
23
|
+
options[:vnic_profile] = { :id => profile.id }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
interface = OvirtSDK4::Nic.new(options)
|
|
27
|
+
nics_service.add(interface)
|
|
28
|
+
end
|
|
29
|
+
# rubocop:enable Metrics/AbcSize
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
class Mock
|
|
33
|
+
def add_interface(id, _options = {})
|
|
34
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
35
|
+
true
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
DISK_SIZE_TO_GB = 1024 * 1024 * 1024
|
|
7
|
+
|
|
8
|
+
def add_volume(id, options = {})
|
|
9
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
10
|
+
|
|
11
|
+
options = add_options_defaults(options)
|
|
12
|
+
|
|
13
|
+
disk_attachments_service = client.system_service.vms_service.vm_service(id).disk_attachments_service
|
|
14
|
+
disk = OvirtSDK4::DiskAttachment.new(options)
|
|
15
|
+
disk_attachments_service.add(disk)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
19
|
+
def add_options_defaults(options)
|
|
20
|
+
options = options.dup
|
|
21
|
+
search = options[:search] || format("datacenter=%<datacenter>s", :datacenter => datacenter)
|
|
22
|
+
options[:bootable] ||= "true"
|
|
23
|
+
options[:interface] ||= OvirtSDK4::DiskInterface::VIRTIO
|
|
24
|
+
options[:provisioned_size] = options[:size_gb].to_i * DISK_SIZE_TO_GB if options[:size_gb]
|
|
25
|
+
|
|
26
|
+
options[:storage_domain_id] = options[:storage_domain] || storagedomains(:role => "data", :search => search).first.id
|
|
27
|
+
# If no size is given, default to a volume size of 8GB
|
|
28
|
+
options[:provisioned_size] ||= 8 * DISK_SIZE_TO_GB
|
|
29
|
+
options[:type] ||= OvirtSDK4::DiskType::DATA
|
|
30
|
+
options[:format] ||= OvirtSDK4::DiskFormat::COW
|
|
31
|
+
options[:sparse] = true unless options[:sparse].present?
|
|
32
|
+
options[:quota] = options[:quota].present? ? client.system_service.data_centers_service.data_center_service(datacenter).quotas_service.quota_service(options[:quota]).get : nil
|
|
33
|
+
|
|
34
|
+
options[:disk] ||= {}
|
|
35
|
+
options[:disk][:storage_domains] ||= [client.system_service.storage_domains_service.storage_domain_service(options[:storage_domain_id]).get]
|
|
36
|
+
options[:disk][:provisioned_size] ||= options.delete(:provisioned_size)
|
|
37
|
+
options[:disk][:type] ||= options.delete(:type)
|
|
38
|
+
options[:disk][:format] ||= options.delete(:format)
|
|
39
|
+
options[:disk][:sparse] = options.delete(:sparse) unless options[:disk][:sparse].present?
|
|
40
|
+
options
|
|
41
|
+
end
|
|
42
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
class Mock
|
|
46
|
+
def add_volume(id, _options = {})
|
|
47
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
48
|
+
true
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def check_for_option(opts, name)
|
|
7
|
+
opts[name.to_sym] || opts[(name + "_name").to_sym]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
11
|
+
def process_vm_opts(opts)
|
|
12
|
+
return unless check_for_option(opts, "template") && check_for_option(opts, "storagedomain")
|
|
13
|
+
|
|
14
|
+
template_id = opts[:template] || client.system_service.templates_service.search(:name => opts[:template_name]).first.id
|
|
15
|
+
template_disks = client.system_service.templates_service.template_service(template_id).get.disk_attachments
|
|
16
|
+
storagedomain_id = opts[:storagedomain] || storagedomains.select { |s| s.name == opts[:storagedomain_name] }.first.id
|
|
17
|
+
|
|
18
|
+
# Make sure the 'clone' option is set if any of the disks defined by
|
|
19
|
+
# the template is stored on a different storage domain than requested
|
|
20
|
+
opts[:clone] = true unless opts[:clone] == true || template_disks.empty? || template_disks.all? { |d| d.storage_domain == storagedomain_id }
|
|
21
|
+
|
|
22
|
+
# Create disks map
|
|
23
|
+
opts[:disks] = template_disks.collect { |d| { :id => d.id, :storagedomain => storagedomain_id } }
|
|
24
|
+
end
|
|
25
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
26
|
+
|
|
27
|
+
# rubocop:disable Metrics/AbcSize
|
|
28
|
+
def create_vm(attrs)
|
|
29
|
+
attrs = attrs.dup
|
|
30
|
+
attrs[:cluster_name] ||= datacenter.clusters.first.name unless attrs[:cluster]
|
|
31
|
+
vms_service = client.system_service.vms_service
|
|
32
|
+
attrs[:cluster] = client.system_service.clusters_service.cluster_service(attrs[:cluster]).get
|
|
33
|
+
attrs[:instance_type] = attrs[:instance_type].present? ? client.system_service.instance_types_service.instance_type_service(attrs[:instance_type]).get : nil
|
|
34
|
+
|
|
35
|
+
attrs[:template] = if attrs[:template].present?
|
|
36
|
+
client.system_service.templates_service.template_service(attrs[:template]).get
|
|
37
|
+
else
|
|
38
|
+
client.system_service.get.special_objects.blank_template
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
attrs[:comment] ||= ""
|
|
42
|
+
attrs[:quota] = attrs[:quota].present? ? client.system_service.data_centers_service.data_center_service(datacenter).quotas_service.quota_service(attrs[:quota]).get : nil
|
|
43
|
+
|
|
44
|
+
# TODO: handle cloning from template
|
|
45
|
+
process_vm_opts(attrs)
|
|
46
|
+
|
|
47
|
+
new_vm = OvirtSDK4::Vm.new(attrs)
|
|
48
|
+
vms_service.add(new_vm)
|
|
49
|
+
end
|
|
50
|
+
# rubocop:enable Metrics/AbcSize
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
class Mock
|
|
54
|
+
def create_vm(_attrs)
|
|
55
|
+
xml = read_xml("vm.xml")
|
|
56
|
+
OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def datacenters(filter = {})
|
|
7
|
+
client.system_service.data_centers_service.list(filter).map { |ovirt_obj| ovirt_attrs ovirt_obj }
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class Mock
|
|
12
|
+
def datacenters(_filters = {})
|
|
13
|
+
xml = read_xml "data_centers.xml"
|
|
14
|
+
Nokogiri::XML(xml).xpath("/data_centers/data_center").map do |dc|
|
|
15
|
+
ovirt_attrs OvirtSDK4::Reader.read(dc.to_s)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def destroy_interface(id, options)
|
|
7
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
8
|
+
raise ArgumentError, "interface id is a required parameter for destroy-interface" unless options.key? :id
|
|
9
|
+
vm = client.system_service.vms_service.vm_service(id)
|
|
10
|
+
vm.nics_service.nic_service(options[:id]).remove
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Mock
|
|
15
|
+
def destroy_interface(id, options)
|
|
16
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
17
|
+
raise ArgumentError, "interface id is a required parameter for destroy-interface" unless options.key? :id
|
|
18
|
+
true
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def destroy_vm(options = {})
|
|
7
|
+
raise ArgumentError, "instance id is a required parameter" unless options.key? :id
|
|
8
|
+
|
|
9
|
+
client.system_service.vms_service.vm_service(options[:id]).remove
|
|
10
|
+
true
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class Mock
|
|
15
|
+
def destroy_vm(options = {})
|
|
16
|
+
raise ArgumentError, "instance id is a required parameter" unless options.key? :id
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def destroy_volume(id, options)
|
|
7
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
8
|
+
raise ArgumentError, "volume id is a required parameter for destroy-volume" unless options.key? :id
|
|
9
|
+
|
|
10
|
+
disks_service = client.system_service.disks_service
|
|
11
|
+
disks_service.disk_service(options[:id]).remove
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class Mock
|
|
16
|
+
def destroy_volume(id, options)
|
|
17
|
+
raise ArgumentError, "instance id is a required parameter" unless id
|
|
18
|
+
raise ArgumentError, "volume id is a required parameter for destroy-volume" unless options.key? :id
|
|
19
|
+
true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def get_cluster(id)
|
|
7
|
+
ovirt_attrs client.system_service.clusters_service.cluster_service(id).get
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class Mock
|
|
11
|
+
def get_cluster(_id)
|
|
12
|
+
xml = read_xml("cluster.xml")
|
|
13
|
+
ovirt_attrs OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def get_instance_type(id)
|
|
7
|
+
ovirt_attrs client.system_service.instance_types_service.instance_type_service(id).get
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class Mock
|
|
11
|
+
def get_instance_type(_id)
|
|
12
|
+
xml = read_xml "instance_type.xml"
|
|
13
|
+
ovirt_attrs OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def get_quota(id)
|
|
7
|
+
quota = client.system_service.data_centers_service.data_center_service(datacenter).quotas_service.quota_service(id).get
|
|
8
|
+
ovirt_attrs quota
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
class Mock
|
|
12
|
+
def get_quota(_id)
|
|
13
|
+
xml = read_xml("quota.xml")
|
|
14
|
+
ovirt_attrs OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def get_template(id)
|
|
7
|
+
ovirt_attrs client.system_service.templates_service.template_service(id).get
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class Mock
|
|
11
|
+
def get_template(_id)
|
|
12
|
+
xml = read_xml "template.xml"
|
|
13
|
+
ovirt_attrs OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Fog
|
|
2
|
+
module Compute
|
|
3
|
+
class Ovirt
|
|
4
|
+
class V4
|
|
5
|
+
class Real
|
|
6
|
+
def get_virtual_machine(id)
|
|
7
|
+
ovirt_attrs client.system_service.vms_service.vm_service(id).get
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
class Mock
|
|
11
|
+
def get_virtual_machine(_id)
|
|
12
|
+
xml = read_xml "vm.xml"
|
|
13
|
+
ovirt_attrs OvirtSDK4::Reader.read(Nokogiri::XML(xml).root.to_s)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|