fog-kubevirt 0.1.0 → 0.1.1
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/lib/fog/compute/kubevirt.rb +196 -15
- data/lib/fog/compute/kubevirt/models/livevm.rb +6 -1
- data/lib/fog/compute/kubevirt/models/livevms.rb +21 -1
- data/lib/fog/compute/kubevirt/models/node.rb +39 -0
- data/lib/fog/compute/kubevirt/models/nodes.rb +25 -0
- data/lib/fog/compute/kubevirt/models/offlinevm.rb +18 -3
- data/lib/fog/compute/kubevirt/models/offlinevms.rb +6 -1
- data/lib/fog/compute/kubevirt/models/template.rb +36 -22
- data/lib/fog/compute/kubevirt/models/templates.rb +6 -1
- data/lib/fog/compute/kubevirt/requests/create_offlinevm.rb +2 -1
- data/lib/fog/compute/kubevirt/requests/create_pvc.rb +1 -0
- data/lib/fog/compute/kubevirt/requests/create_vm.rb +1 -0
- data/lib/fog/compute/kubevirt/requests/delete_livevm.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/delete_offlinevm.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/get_livevm.rb +42 -23
- data/lib/fog/compute/kubevirt/requests/get_node.rb +112 -0
- data/lib/fog/compute/kubevirt/requests/get_offlinevm.rb +2 -1
- data/lib/fog/compute/kubevirt/requests/get_template.rb +2 -1
- data/lib/fog/compute/kubevirt/requests/list_livevms.rb +7 -2
- data/lib/fog/compute/kubevirt/requests/list_nodes.rb +19 -0
- data/lib/fog/compute/kubevirt/requests/list_offlinevms.rb +14 -10
- data/lib/fog/compute/kubevirt/requests/list_templates.rb +25 -20
- data/lib/fog/kubevirt/version.rb +1 -1
- metadata +8 -3
- data/lib/fog/compute/kubevirt/requests/destroy_vm.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 503961b1ff1942c2afe14fb611d555cbe7f3020d
|
4
|
+
data.tar.gz: 63e5dd9843c6d843394a830d2aa725cc6511b605
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 646e2fcf922326488c8e98885624f0315ab876b9c2beed165783b4bcaeae12f8ca8ed8bfb69c98de8cb4b6a0ed6d3397d2f6e80b57a816c30baf88998ff539ec
|
7
|
+
data.tar.gz: 572ac0f6197416be7f96a5c2d5054d5788ef337d809a1e84dca69ecba87ac82a4de35a49091320730622a42b363fc316d3756231a4f3789cb2fa62238ef3487e
|
data/lib/fog/compute/kubevirt.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'logger'
|
3
|
+
|
4
|
+
require "fog/core"
|
5
|
+
|
1
6
|
module Fog
|
2
7
|
module Compute
|
3
8
|
class Kubevirt < Fog::Service
|
4
9
|
requires :kubevirt_token
|
5
|
-
recognizes :kubevirt_hostname, :kubevirt_port
|
10
|
+
recognizes :kubevirt_hostname, :kubevirt_port, :kubevirt_namespace, :kubevirt_log
|
6
11
|
|
7
12
|
model_path 'fog/compute/kubevirt/models'
|
8
13
|
model :livevm
|
9
14
|
collection :livevms
|
15
|
+
model :node
|
16
|
+
collection :nodes
|
10
17
|
model :offlinevm
|
11
18
|
collection :offlinevms
|
12
19
|
model :template
|
@@ -19,16 +26,38 @@ module Fog
|
|
19
26
|
request :create_vm
|
20
27
|
request :create_offlinevm
|
21
28
|
request :create_pvc
|
22
|
-
request :
|
29
|
+
request :delete_livevm
|
30
|
+
request :delete_offlinevm
|
23
31
|
request :get_livevm
|
32
|
+
request :get_node
|
24
33
|
request :get_offlinevm
|
25
34
|
request :get_template
|
26
35
|
request :list_livevms
|
36
|
+
request :list_nodes
|
27
37
|
request :list_offlinevms
|
28
38
|
request :list_templates
|
29
39
|
request :update_offlinevm
|
30
40
|
|
31
41
|
module Shared
|
42
|
+
|
43
|
+
class EntityCollection < DelegateClass(Array)
|
44
|
+
attr_reader :kind, :resource_version, :uid, :type
|
45
|
+
|
46
|
+
def initialize(kind, resource_version, uid, type, entities)
|
47
|
+
@kind = kind
|
48
|
+
@resource_version = resource_version
|
49
|
+
@uid = uid
|
50
|
+
@type = type
|
51
|
+
super(entities)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# Label name which identifies operation system information
|
57
|
+
#
|
58
|
+
OS_LABEL = 'kubevirt.io/os'.freeze
|
59
|
+
OS_LABEL_SYMBOL = :'kubevirt.io/os'
|
60
|
+
|
32
61
|
# converts kubeclient objects into hash for fog to consume
|
33
62
|
def object_to_hash(object)
|
34
63
|
result = object
|
@@ -44,9 +73,31 @@ module Fog
|
|
44
73
|
|
45
74
|
result
|
46
75
|
end
|
76
|
+
|
77
|
+
# Copied from rails:
|
78
|
+
# File activesupport/lib/active_support/core_ext/hash/deep_merge.rb, line 21
|
79
|
+
# The method was changed to look like this in v4.0.0 of rails
|
80
|
+
def deep_merge!(source_hash, other_hash, &block)
|
81
|
+
other_hash.each_pair do |current_key, other_value|
|
82
|
+
this_value = source_hash[current_key]
|
83
|
+
|
84
|
+
source_hash[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
85
|
+
this_value = deep_merge!(this_value, other_value, &block)
|
86
|
+
else
|
87
|
+
if block_given? && key?(current_key)
|
88
|
+
block.call(current_key, this_value, other_value)
|
89
|
+
else
|
90
|
+
other_value
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
source_hash
|
96
|
+
end
|
47
97
|
end
|
48
98
|
|
49
99
|
class Real
|
100
|
+
require "ostruct"
|
50
101
|
include Shared
|
51
102
|
|
52
103
|
#
|
@@ -65,8 +116,11 @@ module Fog
|
|
65
116
|
require 'kubeclient'
|
66
117
|
|
67
118
|
@kubevirt_token = options[:kubevirt_token]
|
68
|
-
@host
|
69
|
-
@port
|
119
|
+
@host = options[:kubevirt_hostname]
|
120
|
+
@port = options[:kubevirt_port]
|
121
|
+
|
122
|
+
@log = options[:kubevirt_log]
|
123
|
+
@log ||= Logger.new(STDOUT)
|
70
124
|
|
71
125
|
@namespace = options[:kubevirt_namespace] || 'default'
|
72
126
|
|
@@ -84,26 +138,149 @@ module Fog
|
|
84
138
|
# Kubeclient needs different client objects for different API groups. We will keep in this hash the
|
85
139
|
# client objects, indexed by API path/version.
|
86
140
|
@clients = {}
|
141
|
+
end
|
87
142
|
|
88
|
-
|
143
|
+
def virt_supported?
|
144
|
+
virt_enabled = false
|
145
|
+
|
146
|
+
begin
|
147
|
+
virt_enabled = kubevirt_client.api["versions"].any? { |ver| ver["groupVersion"]&.start_with?(KUBEVIRT_GROUP) }
|
148
|
+
rescue => err
|
149
|
+
# we failed to communicate or to evaluate the version format
|
150
|
+
@log.warn("Failed to detect kubevirt on provider with error: #{err.message}")
|
151
|
+
end
|
89
152
|
|
90
|
-
|
91
|
-
@oc_client = openshift_client()
|
92
|
-
@kube_client = kube_client()
|
153
|
+
virt_enabled
|
93
154
|
end
|
94
155
|
|
95
|
-
|
156
|
+
def valid?
|
157
|
+
kube_client.api_valid?
|
158
|
+
end
|
96
159
|
|
97
|
-
|
98
|
-
|
160
|
+
class WatchWrapper
|
161
|
+
|
162
|
+
def initialize(watch, mapper)
|
163
|
+
@watch = watch
|
164
|
+
@mapper = mapper
|
165
|
+
end
|
166
|
+
|
167
|
+
def each
|
168
|
+
@watch.each do |notice|
|
169
|
+
yield @mapper.call(notice)
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def finish
|
174
|
+
@watch.finish
|
175
|
+
end
|
99
176
|
end
|
100
177
|
|
101
|
-
|
102
|
-
|
178
|
+
#
|
179
|
+
# Returns a watcher for nodes.
|
180
|
+
#
|
181
|
+
# @param opts [Hash] A hash with options for the watcher.
|
182
|
+
# @return [WatchWrapper] The watcher.
|
183
|
+
#
|
184
|
+
def watch_nodes(opts = {})
|
185
|
+
mapper = Proc.new do |notice|
|
186
|
+
node = OpenStruct.new(Node.parse(notice.object)) if notice.object.kind == 'Node'
|
187
|
+
node ||= OpenStruct.new
|
188
|
+
|
189
|
+
populate_notice_attributes(node, notice)
|
190
|
+
node
|
191
|
+
end
|
192
|
+
watch = kube_client.watch_nodes(opts)
|
193
|
+
|
194
|
+
WatchWrapper.new(watch, mapper)
|
103
195
|
end
|
104
196
|
|
105
|
-
|
106
|
-
|
197
|
+
#
|
198
|
+
# Returns a watcher for offline virtual machines.
|
199
|
+
#
|
200
|
+
# @param opts [Hash] A hash with options for the watcher.
|
201
|
+
# @return [WatchWrapper] The watcher.
|
202
|
+
#
|
203
|
+
def watch_offline_vms(opts = {})
|
204
|
+
mapper = Proc.new do |notice|
|
205
|
+
offlinevm = OpenStruct.new(Offlinevm.parse(notice.object)) if notice.object.kind == 'OfflineVirtualMachine'
|
206
|
+
offlinevm ||= OpenStruct.new
|
207
|
+
|
208
|
+
populate_notice_attributes(offlinevm, notice)
|
209
|
+
offlinevm
|
210
|
+
end
|
211
|
+
watch = kubevirt_client.watch_offline_virtual_machines(opts)
|
212
|
+
|
213
|
+
WatchWrapper.new(watch, mapper)
|
214
|
+
end
|
215
|
+
|
216
|
+
#
|
217
|
+
# Returns a watcher for live virtual machines.
|
218
|
+
#
|
219
|
+
# @param opts [Hash] A hash with options for the watcher.
|
220
|
+
# @return [WatchWrapper] The watcher.
|
221
|
+
#
|
222
|
+
def watch_live_vms(opts = {})
|
223
|
+
mapper = Proc.new do |notice|
|
224
|
+
livevm = OpenStruct.new(Livevm.parse(notice.object)) if notice.object.kind == 'VirtualMachine'
|
225
|
+
livevm ||= OpenStruct.new
|
226
|
+
|
227
|
+
populate_notice_attributes(livevm, notice)
|
228
|
+
livevm
|
229
|
+
end
|
230
|
+
watch = kubevirt_client.watch_virtual_machines(opts)
|
231
|
+
|
232
|
+
WatchWrapper.new(watch, mapper)
|
233
|
+
end
|
234
|
+
|
235
|
+
#
|
236
|
+
# Returns a watcher for templates.
|
237
|
+
#
|
238
|
+
# @param opts [Hash] A hash with options for the watcher.
|
239
|
+
# @return [WatchWrapper] The watcher.
|
240
|
+
#
|
241
|
+
def watch_templates(opts = {})
|
242
|
+
mapper = Proc.new do |notice|
|
243
|
+
template = OpenStruct.new(Template.parse(notice.object)) if notice.object.kind == 'Template'
|
244
|
+
template ||= OpenStruct.new
|
245
|
+
|
246
|
+
populate_notice_attributes(template, notice)
|
247
|
+
template
|
248
|
+
end
|
249
|
+
watch = openshift_client.watch_templates(opts)
|
250
|
+
|
251
|
+
WatchWrapper.new(watch, mapper)
|
252
|
+
end
|
253
|
+
|
254
|
+
#
|
255
|
+
# Calculates the URL of the SPICE proxy server.
|
256
|
+
#
|
257
|
+
# @return [String] The URL of the spice proxy server.
|
258
|
+
#
|
259
|
+
def spice_proxy_url
|
260
|
+
service = kube_client.get_service('spice-proxy', @namespace)
|
261
|
+
host = service.spec.externalIPs.first
|
262
|
+
port = service.spec.ports.first.port
|
263
|
+
url = URI::Generic.build(
|
264
|
+
:scheme => 'http',
|
265
|
+
:host => host,
|
266
|
+
:port => port,
|
267
|
+
)
|
268
|
+
url.to_s
|
269
|
+
end
|
270
|
+
|
271
|
+
private
|
272
|
+
|
273
|
+
|
274
|
+
#
|
275
|
+
# Populates required notice attributes
|
276
|
+
#
|
277
|
+
# @param object entity to populate
|
278
|
+
# @param notice the source of the data to populate from
|
279
|
+
def populate_notice_attributes(object, notice)
|
280
|
+
object.metadata = notice.object.metadata
|
281
|
+
object.type = notice.type
|
282
|
+
object.code = notice.object.code
|
283
|
+
object.kind = notice.object.kind
|
107
284
|
end
|
108
285
|
|
109
286
|
#
|
@@ -148,6 +325,10 @@ module Fog
|
|
148
325
|
def kubevirt_client
|
149
326
|
create_client('/apis/' + KUBEVIRT_GROUP, KUBEVIRT_VERSION)
|
150
327
|
end
|
328
|
+
|
329
|
+
def log
|
330
|
+
@log
|
331
|
+
end
|
151
332
|
end
|
152
333
|
|
153
334
|
class Mock
|
@@ -13,9 +13,12 @@ module Fog
|
|
13
13
|
attribute :memory, :aliases => 'spec_memory'
|
14
14
|
attribute :disks, :aliases => 'spec_disks'
|
15
15
|
attribute :volumes, :aliases => 'spec_volumes'
|
16
|
+
attribute :ip_address, :aliases => 'status_interfaces_ip'
|
17
|
+
attribute :node_name, :aliases => 'status_node_name'
|
16
18
|
|
17
19
|
def self.parse(object)
|
18
20
|
metadata = object[:metadata]
|
21
|
+
status = object[:status]
|
19
22
|
owner = metadata[:ownerReferences][0]
|
20
23
|
spec = object[:spec]
|
21
24
|
domain = spec[:domain]
|
@@ -29,7 +32,9 @@ module Fog
|
|
29
32
|
:cpu_cores => domain[:cpu][:cores],
|
30
33
|
:memory => domain[:resources][:requests][:memory],
|
31
34
|
:disks => domain[:devices][:disks],
|
32
|
-
:volumes => spec[:volumes]
|
35
|
+
:volumes => spec[:volumes],
|
36
|
+
:ip_address => status.dig(:interfaces, 0, :ipAddress),
|
37
|
+
:node_name => status[:nodeName]
|
33
38
|
}
|
34
39
|
end
|
35
40
|
end
|
@@ -5,15 +5,35 @@ module Fog
|
|
5
5
|
module Compute
|
6
6
|
class Kubevirt
|
7
7
|
class Livevms < Fog::Collection
|
8
|
+
attr_reader :kind, :resourceVersion
|
9
|
+
|
8
10
|
model Fog::Compute::Kubevirt::Livevm
|
9
11
|
|
10
12
|
def all(filters = {})
|
11
|
-
|
13
|
+
vms = service.list_livevms(filters)
|
14
|
+
kind = vms.kind
|
15
|
+
resourceVersion = vms.resourceVersion
|
16
|
+
load vms
|
12
17
|
end
|
13
18
|
|
14
19
|
def get(name)
|
15
20
|
new service.get_livevm(name)
|
16
21
|
end
|
22
|
+
|
23
|
+
def destroy(name, namespace)
|
24
|
+
begin
|
25
|
+
live_vm = get(name)
|
26
|
+
rescue KubeException
|
27
|
+
# the live virtual machine doesn't exist
|
28
|
+
live_vm = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
# delete offline vm
|
32
|
+
service.delete_offlinevm(name, namespace)
|
33
|
+
|
34
|
+
# delete live vm
|
35
|
+
service.delete_livevm(name, namespace) unless live_vm.nil?
|
36
|
+
end
|
17
37
|
end
|
18
38
|
end
|
19
39
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Node < Fog::Model
|
5
|
+
identity :name
|
6
|
+
|
7
|
+
attribute :namespace, :aliases => 'metadata_namespace'
|
8
|
+
attribute :resource_version, :aliases => 'metadata_resource_version'
|
9
|
+
attribute :uid, :aliases => 'metadata_uid'
|
10
|
+
attribute :os_image, :aliases => 'status_node_info_os_image'
|
11
|
+
attribute :operating_system, :aliases => 'status_node_info_operating_system'
|
12
|
+
attribute :kernel_version, :aliases => 'status_node_info_kernel_version'
|
13
|
+
attribute :hostname, :aliases => 'status_addresses_hostname'
|
14
|
+
attribute :ip_address, :aliases => 'status_addresses_ip'
|
15
|
+
|
16
|
+
def self.parse(object)
|
17
|
+
metadata = object[:metadata]
|
18
|
+
status = object[:status]
|
19
|
+
info = status[:nodeInfo]
|
20
|
+
|
21
|
+
addresses = status[:addresses]
|
22
|
+
hostname = addresses.detect { |address| address[:type] == 'Hostname' }[:address]
|
23
|
+
ip = addresses.detect { |address| address[:type] == 'InternalIP' }[:address]
|
24
|
+
{
|
25
|
+
:namespace => metadata[:namespace],
|
26
|
+
:name => metadata[:name],
|
27
|
+
:resource_version => metadata[:resourceVersion],
|
28
|
+
:uid => metadata[:uid],
|
29
|
+
:os_image => info[:osImage],
|
30
|
+
:operating_system => info[:operatingSystem],
|
31
|
+
:kernel_version => info[:kernelVersion],
|
32
|
+
:hostname => hostname,
|
33
|
+
:ip_address => ip
|
34
|
+
}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'fog/core/collection'
|
2
|
+
require 'fog/compute/kubevirt/models/node'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Compute
|
6
|
+
class Kubevirt
|
7
|
+
class Nodes < Fog::Collection
|
8
|
+
attr_reader :kind, :resourceVersion
|
9
|
+
|
10
|
+
model Fog::Compute::Kubevirt::Node
|
11
|
+
|
12
|
+
def all(filters = {})
|
13
|
+
nodes = service.list_nodes(filters)
|
14
|
+
kind = nodes.kind
|
15
|
+
resourceVersion = nodes.resourceVersion
|
16
|
+
load nodes
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(name)
|
20
|
+
new service.get_node(name)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -2,11 +2,16 @@ module Fog
|
|
2
2
|
module Compute
|
3
3
|
class Kubevirt
|
4
4
|
class Offlinevm < Fog::Model
|
5
|
+
include Shared
|
6
|
+
|
5
7
|
identity :name
|
6
8
|
|
7
9
|
attribute :namespace, :aliases => 'metadata_namespace'
|
8
10
|
attribute :resource_version, :aliases => 'metadata_resource_version'
|
9
11
|
attribute :uid, :aliases => 'metadata_uid'
|
12
|
+
attribute :labels, :aliases => 'metadata_labels'
|
13
|
+
attribute :owner_reference, :aliases => 'metadata_owner_reference'
|
14
|
+
attribute :annotations, :aliases => 'metadata_annotations'
|
10
15
|
attribute :cpu_cores, :aliases => 'spec_cpu_cores'
|
11
16
|
attribute :memory, :aliases => 'spec_memory'
|
12
17
|
attribute :disks, :aliases => 'spec_disks'
|
@@ -14,10 +19,10 @@ module Fog
|
|
14
19
|
|
15
20
|
|
16
21
|
def start(options = {})
|
17
|
-
# Change the `running` attribute to `true` so that the offline virtual machine controller will take it and
|
18
|
-
# the live virtual machine.
|
22
|
+
# Change the `running` attribute to `true` so that the offline virtual machine controller will take it and
|
23
|
+
# create the live virtual machine.
|
19
24
|
offline_vm = service.get_raw_offlinevm(name)
|
20
|
-
offline_vm =
|
25
|
+
offline_vm = deep_merge!(offline_vm,
|
21
26
|
:spec => {
|
22
27
|
:running => true
|
23
28
|
}
|
@@ -26,6 +31,13 @@ module Fog
|
|
26
31
|
end
|
27
32
|
|
28
33
|
def stop(options = {})
|
34
|
+
offline_vm = service.get_raw_offlinevm(name)
|
35
|
+
offline_vm = deep_merge!(offline_vm,
|
36
|
+
:spec => {
|
37
|
+
:running => false
|
38
|
+
}
|
39
|
+
)
|
40
|
+
service.update_offline_vm(offline_vm)
|
29
41
|
end
|
30
42
|
|
31
43
|
def self.parse(object)
|
@@ -37,6 +49,9 @@ module Fog
|
|
37
49
|
:name => metadata[:name],
|
38
50
|
:resource_version => metadata[:resourceVersion],
|
39
51
|
:uid => metadata[:uid],
|
52
|
+
:labels => metadata[:labels],
|
53
|
+
:annotations => metadata[:annotations],
|
54
|
+
:owner_reference => metadata[:ownerReferences],
|
40
55
|
:cpu_cores => domain[:cpu][:cores],
|
41
56
|
:memory => domain[:resources][:requests][:memory],
|
42
57
|
:disks => domain[:devices][:disks],
|
@@ -5,10 +5,15 @@ module Fog
|
|
5
5
|
module Compute
|
6
6
|
class Kubevirt
|
7
7
|
class Offlinevms < Fog::Collection
|
8
|
+
attr_reader :kind, :resourceVersion
|
9
|
+
|
8
10
|
model Fog::Compute::Kubevirt::Offlinevm
|
9
11
|
|
10
12
|
def all(filters = {})
|
11
|
-
|
13
|
+
ovms = service.list_offlinevms(filters)
|
14
|
+
kind = ovms.kind
|
15
|
+
resourceVersion = ovms.resourceVersion
|
16
|
+
load ovms
|
12
17
|
end
|
13
18
|
|
14
19
|
def get(name)
|
@@ -2,14 +2,16 @@ module Fog
|
|
2
2
|
module Compute
|
3
3
|
class Kubevirt
|
4
4
|
class Template < Fog::Model
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attribute :
|
9
|
-
attribute :
|
10
|
-
attribute :
|
11
|
-
attribute :
|
12
|
-
attribute :
|
5
|
+
include Shared
|
6
|
+
identity :name, :aliases => 'metadata_name'
|
7
|
+
|
8
|
+
attribute :namespace, :aliases => 'metadata_namespace'
|
9
|
+
attribute :description, :aliases => 'metadata_description'
|
10
|
+
attribute :tags, :aliases => 'metadata_tags'
|
11
|
+
attribute :labels, :aliases => 'metadata_labels'
|
12
|
+
attribute :resource_version, :aliases => 'metadata_resource_version'
|
13
|
+
attribute :uid, :aliases => 'metadata_uid'
|
14
|
+
attribute :annotations, :aliases => 'metadata_annotations'
|
13
15
|
attribute :objects
|
14
16
|
attribute :parameters
|
15
17
|
|
@@ -27,16 +29,17 @@ module Fog
|
|
27
29
|
metadata = object[:metadata]
|
28
30
|
annotations = metadata[:annotations]
|
29
31
|
{
|
30
|
-
namespace
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
32
|
+
:namespace => metadata[:namespace],
|
33
|
+
:annotations => metadata[:annotations],
|
34
|
+
:name => metadata[:name],
|
35
|
+
:labels => metadata[:labels],
|
36
|
+
:resource_version => metadata[:resourceVersion],
|
37
|
+
:uid => metadata[:uid],
|
38
|
+
:objects => object[:objects],
|
39
|
+
:parameters => object[:parameters],
|
40
|
+
:description => annotations && annotations[:description],
|
41
|
+
:tags => annotations && annotations[:tags]
|
42
|
+
}.compact
|
40
43
|
end
|
41
44
|
|
42
45
|
private
|
@@ -70,13 +73,24 @@ module Fog
|
|
70
73
|
#
|
71
74
|
def create_offline_vm(offline_vm, params, namespace)
|
72
75
|
offline_vm = param_substitution!(offline_vm, params)
|
73
|
-
|
74
|
-
offline_vm =
|
76
|
+
os_labels = labels || {}
|
77
|
+
offline_vm = deep_merge!(offline_vm,
|
78
|
+
:spec => {
|
79
|
+
:running => false
|
80
|
+
},
|
75
81
|
:metadata => {
|
76
82
|
:namespace => namespace
|
77
83
|
}
|
78
84
|
)
|
79
85
|
|
86
|
+
offline_vm = deep_merge!(offline_vm,
|
87
|
+
:metadata => {
|
88
|
+
:labels => {
|
89
|
+
OS_LABEL => os_labels[OS_LABEL_SYMBOL]
|
90
|
+
}
|
91
|
+
}
|
92
|
+
) if os_labels[OS_LABEL_SYMBOL]
|
93
|
+
|
80
94
|
# Send the request to create the offline virtual machine:
|
81
95
|
offline_vm = service.create_offlinevm(offline_vm)
|
82
96
|
end
|
@@ -92,7 +106,7 @@ module Fog
|
|
92
106
|
pvcs.each do |pvc|
|
93
107
|
pvc = param_substitution!(pvc, params)
|
94
108
|
|
95
|
-
pvc =
|
109
|
+
pvc = deep_merge!(pvc,
|
96
110
|
:metadata => {
|
97
111
|
:namespace => namespace
|
98
112
|
}
|
@@ -182,4 +196,4 @@ module Fog
|
|
182
196
|
end
|
183
197
|
end
|
184
198
|
end
|
185
|
-
end
|
199
|
+
end
|
@@ -5,10 +5,15 @@ module Fog
|
|
5
5
|
module Compute
|
6
6
|
class Kubevirt
|
7
7
|
class Templates < Fog::Collection
|
8
|
+
attr_reader :kind, :resourceVersion
|
9
|
+
|
8
10
|
model Fog::Compute::Kubevirt::Template
|
9
11
|
|
10
12
|
def all(filters = {})
|
11
|
-
|
13
|
+
temps = service.list_templates(filters)
|
14
|
+
kind = temps.kind
|
15
|
+
resourceVersion = temps.resourceVersion
|
16
|
+
load temps
|
12
17
|
end
|
13
18
|
|
14
19
|
def get(name)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Real
|
5
|
+
def delete_livevm(name, namespace)
|
6
|
+
kubevirt_client.delete_virtual_machine(name, namespace)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Mock
|
11
|
+
def delete_livevm(name, namespace = nil)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Real
|
5
|
+
def delete_offlinevm(name, namespace)
|
6
|
+
kubevirt_client.delete_offline_virtual_machine(name, namespace)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Mock
|
11
|
+
def delete_offlinevm(name)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -5,37 +5,56 @@ module Fog
|
|
5
5
|
class Kubevirt
|
6
6
|
class Real
|
7
7
|
def get_livevm(name)
|
8
|
-
|
8
|
+
# namespace is defined on the Real object
|
9
|
+
Livevm.parse object_to_hash( kubevirt_client.get_virtual_machine(name, @namespace) )
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
12
13
|
class Mock
|
13
14
|
def get_livevm(name)
|
14
|
-
vm = {:apiVersion=>"kubevirt.io/v1alpha1",
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
:
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
15
|
+
vm = { :apiVersion => "kubevirt.io/v1alpha1",
|
16
|
+
:kind => "VirtualMachine",
|
17
|
+
:metadata => { :clusterName => "",
|
18
|
+
:creationTimestamp => "2018-02-23T10:12:47Z",
|
19
|
+
:name => "demo",
|
20
|
+
:namespace => "default",
|
21
|
+
:ownerReferences => [{ :apiVersion => "kubevirt.io/v1alpha1",
|
22
|
+
:kind => "OfflineVirtualMachine",
|
23
|
+
:name => "demo",
|
24
|
+
:uid => "57e279c1-17ee-11e8-a9f9-525400a7f647"
|
25
|
+
}
|
26
|
+
],
|
27
|
+
:resourceVersion => "84873",
|
28
|
+
:selfLink => "/apis/kubevirt.io/v1alpha1/namespaces/default/virtualmachines/demo",
|
29
|
+
:uid => "1906421f-1882-11e8-b539-525400a7f647"
|
30
|
+
},
|
31
|
+
:spec => { :domain => { :cpu => { :cores => "4" },
|
32
|
+
:devices => { :disks => [{ :disk => { :dev => "vda" },
|
33
|
+
:name => "registrydisk",
|
34
|
+
:volumeName => "registryvolume"
|
35
|
+
},
|
36
|
+
{ :disk => { :dev => "vdb" },
|
37
|
+
:name => "cloudinitdisk",
|
38
|
+
:volumeName => "cloudinitvolume"
|
39
|
+
}
|
40
|
+
]
|
41
|
+
},
|
42
|
+
:machine => { :type => "q35" },
|
43
|
+
:resources => { :requests => { :memory => "512Mi" }}
|
44
|
+
},
|
45
|
+
:volumes => [ { :name => "registryvolume",
|
46
|
+
:registryDisk => { :image => "kubevirt/fedora-cloud-registry-disk-demo:latest" }
|
47
|
+
},
|
48
|
+
{ :cloudInitNoCloud => { :userDataBase64 => "I2Nsb3VkLWNvbmZpZwpwYXNzd29yZDogYXRvbWljCnNzaF9wd2F1dGg6IFRydWUKY2hwYXNzd2Q6IHsgZXhwaXJlOiBGYWxzZSB9Cg==" },
|
49
|
+
:name => "cloudinitvolume"
|
50
|
+
}
|
51
|
+
]
|
52
|
+
}
|
53
|
+
}
|
35
54
|
object = RecursiveOpenStruct.new(vm, recurse_over_arrays: true)
|
36
55
|
Livevm.parse object_to_hash(object)
|
37
56
|
end
|
38
57
|
end
|
39
58
|
end
|
40
59
|
end
|
41
|
-
end
|
60
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'recursive_open_struct'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Compute
|
5
|
+
class Kubevirt
|
6
|
+
class Real
|
7
|
+
def get_node(name)
|
8
|
+
Node.parse object_to_hash( kube_client.get_node(name) )
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
def get_livevm(name)
|
14
|
+
node = {:apiVersion => "v1",
|
15
|
+
:kind => "Node",
|
16
|
+
:metadata => {
|
17
|
+
:annotations => {
|
18
|
+
:volumes.kubernetes.io/controller-managed-attach-detach => "true"
|
19
|
+
},
|
20
|
+
:creationTimestamp => "2018-04-09T15:34:26Z",
|
21
|
+
:labels => {
|
22
|
+
:beta.kubernetes.io/arch => "amd64", :beta.kubernetes.io/os => "linux",
|
23
|
+
:kubernetes.io/hostname => "master", :node-role.kubernetes.io/master => "true",
|
24
|
+
:openshift-infra => "apiserver", :region => "infra", :zone => "default"
|
25
|
+
},
|
26
|
+
:name => "master",
|
27
|
+
:resourceVersion => "1514501",
|
28
|
+
:selfLink => "/api/v1/nodes/master",
|
29
|
+
:uid => "7c4102a6-3c0b-11e8-ad43-525400a36119"
|
30
|
+
},
|
31
|
+
:spec => {
|
32
|
+
:externalID => "master"
|
33
|
+
},
|
34
|
+
:status => {
|
35
|
+
:addresses => [
|
36
|
+
{:address => "192.168.200.2", :type => "InternalIP"},
|
37
|
+
{:address => "master", :type => "Hostname"}
|
38
|
+
],
|
39
|
+
:allocatable => {:cpu => "2", :memory => "2739328Ki", :pods => "20"},
|
40
|
+
:capacity => {:cpu => "2", :memory => "2841728Ki", :pods => "20"},
|
41
|
+
:conditions => [
|
42
|
+
{
|
43
|
+
:lastHeartbeatTime => "2018-04-20T09:37:45Z", :lastTransitionTime => "2018-04-09T15:34:26Z",
|
44
|
+
:message => "kubelet has sufficient disk space available", :reason => "KubeletHasSufficientDisk",
|
45
|
+
:status => "False", :type => "OutOfDisk"
|
46
|
+
},
|
47
|
+
{
|
48
|
+
:lastHeartbeatTime => "2018-04-20T09:37:45Z", :lastTransitionTime => "2018-04-09T15:34:26Z",
|
49
|
+
:message => "kubelet has sufficient memory available", :reason => "KubeletHasSufficientMemory",
|
50
|
+
:status => "False", :type => "MemoryPressure"
|
51
|
+
},
|
52
|
+
{
|
53
|
+
:lastHeartbeatTime => "2018-04-20T09:37:45Z", :lastTransitionTime => "2018-04-19T12:56:17Z",
|
54
|
+
:message => "kubelet has disk pressure", :reason => "KubeletHasDiskPressure",
|
55
|
+
:status => "True", :type => "DiskPressure"
|
56
|
+
},
|
57
|
+
{
|
58
|
+
:lastHeartbeatTime => "2018-04-20T09:37:45Z", :lastTransitionTime => "2018-04-20T07:08:18Z",
|
59
|
+
:message => "kubelet is posting ready status", :reason => "KubeletReady",
|
60
|
+
:status => "True", :type => "Ready"
|
61
|
+
}
|
62
|
+
],
|
63
|
+
:daemonEndpoints => {
|
64
|
+
:kubeletEndpoint => {
|
65
|
+
:Port => 10250
|
66
|
+
}
|
67
|
+
},
|
68
|
+
:images => [
|
69
|
+
{
|
70
|
+
:names => ["docker.io/openshift/openvswitch@sha256:2783e9bc552ea8c4ea725a9f88e353330243b010925c274561ba045974ce4000",
|
71
|
+
"docker.io/openshift/openvswitch:v3.9.0-alpha.4"], :sizeBytes => 1474465582
|
72
|
+
},
|
73
|
+
{
|
74
|
+
:names => ["docker.io/openshift/node@sha256:e092f1267535714070761844a62cdd38ce05e63a836ee55196953b8ac69527ba",
|
75
|
+
"docker.io/openshift/node:v3.9.0-alpha.4"], :sizeBytes => 1472685816
|
76
|
+
},
|
77
|
+
{
|
78
|
+
:names => ["docker.io/openshift/origin@sha256:4a3d8819499307c57dbb7d244b719c0e45068ca54727ef30b53a361cbe7d9430",
|
79
|
+
"docker.io/openshift/origin:v3.9.0-alpha.4"], :sizeBytes => 1257103966
|
80
|
+
},
|
81
|
+
{
|
82
|
+
:names => ["docker.io/ansibleplaybookbundle/apb-base@sha256:639d623b8185dd1471d38d2cc554efe7e2440a69d9a44cefa6b5565e8cc0d89c",
|
83
|
+
"docker.io/ansibleplaybookbundle/apb-base:latest"], :sizeBytes => 658504560
|
84
|
+
},
|
85
|
+
{
|
86
|
+
:names => ["registry.fedoraproject.org/latest/etcd@sha256:0656877d3888ca8b385bfc720fede845de185f0b5d29a0bbc7a2fb8c6fc8137a",
|
87
|
+
"registry.fedoraproject.org/latest/etcd:latest"], :sizeBytes => 308700638
|
88
|
+
},
|
89
|
+
{
|
90
|
+
:names => ["docker.io/fedora@sha256:7e2fc11763119c0cc0781400bb571bf2033c45469ebe286f1f090ba0dcffc32e",
|
91
|
+
"docker.io/fedora:26"], :sizeBytes => 231669643
|
92
|
+
},
|
93
|
+
{
|
94
|
+
:names => ["docker.io/openshift/origin-pod@sha256:ba180ba987ad1f07187c35e2369923b04fb8969a4344064feb38de508d65c385",
|
95
|
+
"docker.io/openshift/origin-pod:v3.9.0-alpha.4"], :sizeBytes => 228576414
|
96
|
+
}
|
97
|
+
],
|
98
|
+
:nodeInfo => {
|
99
|
+
:architecture => "amd64", :bootID => "c2c59d3a-79d4-4661-acff-daf685ae4edc", :containerRuntimeVersion => "docker://1.13.1",
|
100
|
+
:kernelVersion => "3.10.0-693.21.1.el7.x86_64", :kubeProxyVersion => "v1.9.1+a0ce1bc657", :kubeletVersion => "v1.9.1+a0ce1bc657",
|
101
|
+
:machineID => "52c01ad890e84b15a1be4be18bd64ecd", :operatingSystem => "linux", :osImage => "CentOS Linux 7 (Core)",
|
102
|
+
:systemUUID => "52C01AD8-90E8-4B15-A1BE-4BE18BD64ECD"
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
106
|
+
object = RecursiveOpenStruct.new(node, recurse_over_arrays: true)
|
107
|
+
Node.parse object_to_hash(object)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -7,11 +7,12 @@ module Fog
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_raw_offlinevm(name)
|
10
|
-
object_to_hash( kubevirt_client.get_offline_virtual_machine(name,
|
10
|
+
object_to_hash( kubevirt_client.get_offline_virtual_machine(name, @namespace) )
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
14
|
class Mock
|
15
|
+
# TODO provide implementation
|
15
16
|
def get_offlinevm(name)
|
16
17
|
end
|
17
18
|
|
@@ -3,11 +3,12 @@ module Fog
|
|
3
3
|
class Kubevirt
|
4
4
|
class Real
|
5
5
|
def get_template(name)
|
6
|
-
Template.parse object_to_hash(
|
6
|
+
Template.parse object_to_hash( openshift_client.get_template(name, @namespace) )
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
class Mock
|
11
|
+
# TODO provide implementation
|
11
12
|
def get_template(name)
|
12
13
|
end
|
13
14
|
end
|
@@ -3,14 +3,19 @@ module Fog
|
|
3
3
|
class Kubevirt
|
4
4
|
class Real
|
5
5
|
def list_livevms(_filters = {})
|
6
|
-
kubevirt_client.get_virtual_machines(namespace:
|
6
|
+
vms = kubevirt_client.get_virtual_machines(namespace: @namespace)
|
7
|
+
entities = vms.map do |kubevirt_obj|
|
8
|
+
Livevm.parse object_to_hash(kubevirt_obj)
|
9
|
+
end
|
10
|
+
EntityCollection.new(vms.kind, vms.resourceVersion, vms.metadata.uid, vms.metadata.type, entities)
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
10
14
|
class Mock
|
15
|
+
# TODO provide implementation
|
11
16
|
def list_livevms(_filters = {})
|
12
17
|
end
|
13
18
|
end
|
14
19
|
end
|
15
20
|
end
|
16
|
-
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Real
|
5
|
+
def list_nodes(_filters = {})
|
6
|
+
nodes = kube_client.get_nodes
|
7
|
+
entities = nodes.map { |kubevirt_obj| Node.parse object_to_hash(kubevirt_obj) }
|
8
|
+
EntityCollection.new(nodes.kind, nodes.resourceVersion, vms.metadata.uid, vms.metadata.type, entities)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class Mock
|
13
|
+
# TODO provide implementation
|
14
|
+
def list_nodes(_filters = {})
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,7 +5,11 @@ module Fog
|
|
5
5
|
class Kubevirt
|
6
6
|
class Real
|
7
7
|
def list_offlinevms(_filters = {})
|
8
|
-
kubevirt_client.get_offline_virtual_machines(namespace:
|
8
|
+
ovms = kubevirt_client.get_offline_virtual_machines(namespace: @namespace)
|
9
|
+
entities = ovms.map do |kubevirt_obj|
|
10
|
+
Offlinevm.parse object_to_hash(kubevirt_obj)
|
11
|
+
end
|
12
|
+
EntityCollection.new(ovms.kind, ovms.resourceVersion, ovms.metadata.uid, ovms.metadata.type, entities)
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
@@ -28,15 +32,15 @@ module Fog
|
|
28
32
|
devices: { disks: [{ disk: { dev: 'vda' },
|
29
33
|
name: 'registrydisk',
|
30
34
|
volumeName: 'registryvolume' },
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
35
|
+
{ disk: { dev: 'vdb' },
|
36
|
+
name: 'cloudinitdisk',
|
37
|
+
volumeName: 'cloudinitvolume' }] },
|
38
|
+
machine: { type: 'q35' },
|
39
|
+
resources: { requests: { memory: '512Mi' } } },
|
40
|
+
volumes: [{ name: 'registryvolume',
|
41
|
+
registryDisk: { image: 'kubevirt/fedora-cloud-registry-disk-demo:latest' } },
|
42
|
+
{ cloudInitNoCloud: { userDataBase64: 'I2Nsb3VkLWNvbmZpZwpwYXNzd29yZDogYXRvbWljCnNzaF9wd2F1dGg6IFRydWUKY2hwYXNzd2Q6IHsgZXhwaXJlOiBGYWxzZSB9Cg==' },
|
43
|
+
name: 'cloudinitvolume' }] }
|
40
44
|
}
|
41
45
|
} }]
|
42
46
|
object = RecursiveOpenStruct.new(offlinevms, recurse_over_arrays: true)
|
@@ -5,7 +5,11 @@ module Fog
|
|
5
5
|
class Kubevirt
|
6
6
|
class Real
|
7
7
|
def list_templates(_filters = {})
|
8
|
-
|
8
|
+
temps = openshift_client.get_templates(namespace: @namespace)
|
9
|
+
entities = temps.map do |kubevirt_obj|
|
10
|
+
Template.parse object_to_hash(kubevirt_obj)
|
11
|
+
end
|
12
|
+
EntityCollection.new(temps.kind, temps.resourceVersion, temps.metadata.uid, temps.metadata.type, entities)
|
9
13
|
end
|
10
14
|
end
|
11
15
|
|
@@ -19,25 +23,26 @@ module Fog
|
|
19
23
|
creationTimestamp: '2018-02-22T10:37:28Z',
|
20
24
|
labels: { :"miq.github.io/kubevirt-is-vm-template" => 'true',
|
21
25
|
:"miq.github.io/kubevirt-os" => 'rhel-7' },
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
26
|
+
annotations: { description: 'OCP kubevirt linux, template',
|
27
|
+
tags: 'kubevirt,ocp,template,linux' }
|
28
|
+
},
|
29
|
+
objects: [{ apiVersion: 'kubevirt.io/v1alpha1',
|
30
|
+
kind: 'OfflineVirtualMachine',
|
31
|
+
metadata: { name: '${NAME}' },
|
32
|
+
spec: { template: { spec: { domain:
|
33
|
+
{ cpu: { cores: '${CPU_CORES}' },
|
34
|
+
devices: { disks: [{ disk: { dev: 'vda' }, name: 'disk0', volumeName: 'disk0-pvc' }] },
|
35
|
+
machine: { type: 'q35' },
|
36
|
+
resources: { requests: { memory: '${MEMORY}' } } },
|
37
|
+
volumes: [{ name: 'disk0-pvc', persistentVolumeClaim: { claimName: 'linux-vm-pvc-${NAME}' } }] } } } },
|
38
|
+
{ apiVersion: 'v1',
|
39
|
+
kind: 'PersistentVolumeClaim',
|
40
|
+
metadata: { name: 'linux-vm-pvc-${NAME}' },
|
41
|
+
spec: { accessModes: ['ReadWriteOnce'],
|
42
|
+
resources: { requests: { storage: '10Gi' } } } }],
|
43
|
+
parameters: [{ name: 'NAME', description: 'Name for the new VM' },
|
44
|
+
{ name: 'MEMORY', description: 'Amount of memory', value: '4096Mi' },
|
45
|
+
{ name: 'CPU_CORES', description: 'Amount of cores', value: '4' }] }]
|
41
46
|
object = RecursiveOpenStruct.new(templates, recurse_over_arrays: true)
|
42
47
|
object.map { |kubevirt_obj| Template.parse object_to_hash(kubevirt_obj) }
|
43
48
|
end
|
data/lib/fog/kubevirt/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fog-kubevirt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Kliczewski
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2018-
|
14
|
+
date: 2018-05-24 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|
@@ -113,6 +113,8 @@ files:
|
|
113
113
|
- lib/fog/compute/kubevirt.rb
|
114
114
|
- lib/fog/compute/kubevirt/models/livevm.rb
|
115
115
|
- lib/fog/compute/kubevirt/models/livevms.rb
|
116
|
+
- lib/fog/compute/kubevirt/models/node.rb
|
117
|
+
- lib/fog/compute/kubevirt/models/nodes.rb
|
116
118
|
- lib/fog/compute/kubevirt/models/offlinevm.rb
|
117
119
|
- lib/fog/compute/kubevirt/models/offlinevms.rb
|
118
120
|
- lib/fog/compute/kubevirt/models/template.rb
|
@@ -122,11 +124,14 @@ files:
|
|
122
124
|
- lib/fog/compute/kubevirt/requests/create_offlinevm.rb
|
123
125
|
- lib/fog/compute/kubevirt/requests/create_pvc.rb
|
124
126
|
- lib/fog/compute/kubevirt/requests/create_vm.rb
|
125
|
-
- lib/fog/compute/kubevirt/requests/
|
127
|
+
- lib/fog/compute/kubevirt/requests/delete_livevm.rb
|
128
|
+
- lib/fog/compute/kubevirt/requests/delete_offlinevm.rb
|
126
129
|
- lib/fog/compute/kubevirt/requests/get_livevm.rb
|
130
|
+
- lib/fog/compute/kubevirt/requests/get_node.rb
|
127
131
|
- lib/fog/compute/kubevirt/requests/get_offlinevm.rb
|
128
132
|
- lib/fog/compute/kubevirt/requests/get_template.rb
|
129
133
|
- lib/fog/compute/kubevirt/requests/list_livevms.rb
|
134
|
+
- lib/fog/compute/kubevirt/requests/list_nodes.rb
|
130
135
|
- lib/fog/compute/kubevirt/requests/list_offlinevms.rb
|
131
136
|
- lib/fog/compute/kubevirt/requests/list_templates.rb
|
132
137
|
- lib/fog/compute/kubevirt/requests/update_offlinevm.rb
|