fog-kubevirt 0.1.8 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/fog/compute/kubevirt.rb +64 -20
- data/lib/fog/compute/kubevirt/models/networkattachmentdef.rb +25 -0
- data/lib/fog/compute/kubevirt/models/networkattachmentdefs.rb +59 -0
- data/lib/fog/compute/kubevirt/models/pvc.rb +59 -0
- data/lib/fog/compute/kubevirt/models/pvcs.rb +76 -0
- data/lib/fog/compute/kubevirt/models/server.rb +3 -1
- data/lib/fog/compute/kubevirt/models/vm_data.rb +5 -4
- data/lib/fog/compute/kubevirt/models/vms.rb +44 -7
- data/lib/fog/compute/kubevirt/models/volume.rb +73 -0
- data/lib/fog/compute/kubevirt/models/volumes.rb +61 -0
- data/lib/fog/compute/kubevirt/requests/create_networkattachmentdef.rb +37 -0
- data/lib/fog/compute/kubevirt/requests/create_vm.rb +1 -0
- data/lib/fog/compute/kubevirt/requests/create_volume.rb +19 -0
- data/lib/fog/compute/kubevirt/requests/delete_networkattachmentdef.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/delete_pvc.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/delete_volume.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/get_networkattachmentdef.rb +19 -0
- data/lib/fog/compute/kubevirt/requests/get_pvc.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/get_vminstance.rb +4 -4
- data/lib/fog/compute/kubevirt/requests/get_volume.rb +16 -0
- data/lib/fog/compute/kubevirt/requests/list_networkattachmentdefs.rb +21 -0
- data/lib/fog/compute/kubevirt/requests/list_pvcs.rb +22 -0
- data/lib/fog/compute/kubevirt/requests/list_vms.rb +4 -4
- data/lib/fog/compute/kubevirt/requests/list_volumes.rb +22 -0
- data/lib/fog/kubevirt/version.rb +1 -1
- data/spec/compute_v1alpha2_spec.rb +1 -1
- data/spec/fixtures/kubevirt/networkattachmentdefinition/networkattachmentdefinitions_crud.yml +320 -0
- data/spec/fixtures/kubevirt/pvc/pvcs_crud.yml +316 -0
- data/spec/fixtures/kubevirt/service/services_crud.yml +316 -0
- data/spec/fixtures/kubevirt/volume/volumes_crud.yml +316 -0
- data/spec/network_attachment_definition_v1alpha2_spec.rb +28 -0
- data/spec/pvcs_v1alpha2_spec.rb +52 -0
- data/spec/shared_context.rb +2 -2
- data/spec/volumes_v1alpha2_spec.rb +45 -0
- metadata +33 -20
- data/spec/fixtures/kubevirt/service/v1alpha2/services_crud.yml +0 -172
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1de135b0b0723b41c540c9bc1247b67d1f8176ef
|
4
|
+
data.tar.gz: 8845f174d0923e0224e0683c710d0a5219608c7b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ea3d49cf4931797629028d01cea8332d78f57c90b130e8d362e0bd1002d19e539ceee45280f2a6d16c2da45fa11e40da14da12cdb31a9bc2da2af6038bd3560f
|
7
|
+
data.tar.gz: 06ad5911dc8b3c7f110f33992ee61e19403f4643b0d97607000dff270e20036ad6b2414f54b72a545f606c927d15c93237d25915aebcdf176fb5327c13549218
|
data/lib/fog/compute/kubevirt.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'delegate'
|
2
|
+
require 'json'
|
3
|
+
require 'rest-client'
|
2
4
|
|
3
5
|
require "fog/core"
|
4
6
|
|
@@ -12,10 +14,14 @@ module Fog
|
|
12
14
|
model_path 'fog/compute/kubevirt/models'
|
13
15
|
model :vminstance
|
14
16
|
collection :vminstances
|
17
|
+
model :networkattachmentdef
|
18
|
+
collection :networkattachmentdefs
|
15
19
|
model :node
|
16
20
|
collection :nodes
|
17
21
|
model :vm
|
18
22
|
collection :vms
|
23
|
+
model :pvc
|
24
|
+
collection :pvcs
|
19
25
|
model :server
|
20
26
|
collection :servers
|
21
27
|
model :service
|
@@ -26,23 +32,33 @@ module Fog
|
|
26
32
|
collection :volumes
|
27
33
|
|
28
34
|
request_path 'fog/compute/kubevirt/requests'
|
29
|
-
|
35
|
+
request :create_networkattachmentdef
|
30
36
|
request :create_vm
|
31
37
|
request :create_vminstance
|
32
38
|
request :create_pvc
|
33
39
|
request :create_service
|
40
|
+
request :create_volume
|
41
|
+
request :delete_networkattachmentdef
|
42
|
+
request :delete_pvc
|
34
43
|
request :delete_service
|
35
44
|
request :delete_vminstance
|
36
45
|
request :delete_vm
|
46
|
+
request :delete_volume
|
37
47
|
request :get_vminstance
|
48
|
+
request :get_networkattachmentdef
|
38
49
|
request :get_node
|
50
|
+
request :get_pvc
|
39
51
|
request :get_vm
|
52
|
+
request :get_volume
|
40
53
|
request :get_server
|
41
54
|
request :get_service
|
42
55
|
request :get_template
|
43
56
|
request :list_vminstances
|
44
57
|
request :list_nodes
|
58
|
+
request :list_networkattachmentdefs
|
45
59
|
request :list_vms
|
60
|
+
request :list_pvcs
|
61
|
+
request :list_volumes
|
46
62
|
request :list_servers
|
47
63
|
request :list_services
|
48
64
|
request :list_templates
|
@@ -61,8 +77,9 @@ module Fog
|
|
61
77
|
end
|
62
78
|
|
63
79
|
class ExceptionWrapper
|
64
|
-
def initialize(client)
|
80
|
+
def initialize(client, version)
|
65
81
|
@client = client
|
82
|
+
@version = version
|
66
83
|
end
|
67
84
|
|
68
85
|
def method_missing(symbol, *args)
|
@@ -82,6 +99,10 @@ module Fog
|
|
82
99
|
def respond_to_missing?(method_name, include_private = false)
|
83
100
|
@client.respond_to?(symbol, include_all) || super
|
84
101
|
end
|
102
|
+
|
103
|
+
def version
|
104
|
+
@version
|
105
|
+
end
|
85
106
|
end
|
86
107
|
|
87
108
|
#
|
@@ -133,17 +154,19 @@ module Fog
|
|
133
154
|
include Shared
|
134
155
|
|
135
156
|
#
|
136
|
-
# The API
|
157
|
+
# The API group of KubeVirt:
|
137
158
|
#
|
138
159
|
KUBEVIRT_GROUP = 'kubevirt.io'.freeze
|
139
|
-
KUBEVIRT_VERSION = 'v1alpha2'.freeze
|
140
|
-
KUBEVIRT_VERSION_LABEL = KUBEVIRT_GROUP + '/' + KUBEVIRT_VERSION
|
141
160
|
|
142
161
|
#
|
143
|
-
# The API
|
162
|
+
# The API group of the Kubernetes core:
|
144
163
|
#
|
145
164
|
CORE_GROUP = ''.freeze
|
146
|
-
|
165
|
+
|
166
|
+
#
|
167
|
+
# The API group of the Kubernetes network extention:
|
168
|
+
#
|
169
|
+
NETWORK_GROUP = 'k8s.cni.cncf.io'.freeze
|
147
170
|
|
148
171
|
def initialize(options={})
|
149
172
|
require 'kubeclient'
|
@@ -302,7 +325,6 @@ module Fog
|
|
302
325
|
|
303
326
|
private
|
304
327
|
|
305
|
-
|
306
328
|
#
|
307
329
|
# Populates required notice attributes
|
308
330
|
#
|
@@ -316,18 +338,12 @@ module Fog
|
|
316
338
|
end
|
317
339
|
|
318
340
|
#
|
319
|
-
# Lazily creates the a client for the given Kubernetes API path
|
341
|
+
# Lazily creates the a client for the given Kubernetes API path.
|
320
342
|
#
|
321
343
|
# @param path [String] The Kubernetes API path.
|
322
|
-
# @param version [String] The Kubernetes API version.
|
323
344
|
# @return [Kubeclient::Client] The client for the given path and version.
|
324
345
|
#
|
325
|
-
def create_client(path
|
326
|
-
# Return the client immediately if it has been created before:
|
327
|
-
key = path + '/' + version
|
328
|
-
client = @clients[key]
|
329
|
-
return client if client
|
330
|
-
|
346
|
+
def create_client(path)
|
331
347
|
# Create the client and save it:
|
332
348
|
url = URI::Generic.build(
|
333
349
|
:scheme => 'https',
|
@@ -335,28 +351,56 @@ module Fog
|
|
335
351
|
:port => @port,
|
336
352
|
:path => path
|
337
353
|
)
|
354
|
+
|
355
|
+
version = detect_version(url.to_s, @opts[:ssl_options])
|
356
|
+
key = path + '/' + version
|
357
|
+
client = @clients[key]
|
358
|
+
return client if client
|
359
|
+
|
338
360
|
client = Kubeclient::Client.new(
|
339
361
|
url.to_s,
|
340
362
|
version,
|
341
363
|
@opts
|
342
364
|
)
|
343
|
-
wrapped_client = ExceptionWrapper.new(client)
|
365
|
+
wrapped_client = ExceptionWrapper.new(client, version)
|
344
366
|
@clients[key] = wrapped_client
|
345
367
|
|
346
368
|
# Return the client:
|
347
369
|
wrapped_client
|
348
370
|
end
|
349
371
|
|
372
|
+
def detect_version(url, ssl_options)
|
373
|
+
options = {
|
374
|
+
ssl_ca_file: ssl_options[:ca_file],
|
375
|
+
ssl_cert_store: ssl_options[:cert_store],
|
376
|
+
verify_ssl: ssl_options[:verify_ssl],
|
377
|
+
ssl_client_cert: ssl_options[:client_cert],
|
378
|
+
ssl_client_key: ssl_options[:client_key],
|
379
|
+
}
|
380
|
+
|
381
|
+
response = ::JSON.parse(RestClient::Resource.new(url, options).get)
|
382
|
+
|
383
|
+
# version detected based on
|
384
|
+
# https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/aggregation.md#viewing-discovery-information
|
385
|
+
preferredVersion = response["preferredVersion"]
|
386
|
+
return preferredVersion["version"] if preferredVersion
|
387
|
+
response["versions"][0]
|
388
|
+
end
|
389
|
+
|
350
390
|
def openshift_client
|
351
|
-
create_client('/oapi'
|
391
|
+
create_client('/oapi')
|
352
392
|
end
|
353
393
|
|
354
394
|
def kube_client
|
355
|
-
create_client('/api'
|
395
|
+
create_client('/api')
|
356
396
|
end
|
357
397
|
|
358
398
|
def kubevirt_client
|
359
|
-
create_client('/apis/' + KUBEVIRT_GROUP
|
399
|
+
create_client('/apis/' + KUBEVIRT_GROUP)
|
400
|
+
end
|
401
|
+
|
402
|
+
def kube_net_client
|
403
|
+
create_client('/apis/' + NETWORK_GROUP)
|
360
404
|
end
|
361
405
|
|
362
406
|
def log
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Networkattachmentdef < 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 :config, :aliases => 'spec_config'
|
11
|
+
|
12
|
+
def self.parse(object)
|
13
|
+
metadata = object[:metadata]
|
14
|
+
{
|
15
|
+
:namespace => metadata[:namespace],
|
16
|
+
:name => metadata[:name],
|
17
|
+
:resource_version => metadata[:resourceVersion],
|
18
|
+
:uid => metadata[:uid],
|
19
|
+
:config => object[:spec][:config]
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'fog/core/collection'
|
2
|
+
require 'fog/compute/kubevirt/models/networkattachmentdef'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Compute
|
6
|
+
class Kubevirt
|
7
|
+
class Networkattachmentdefs < Fog::Collection
|
8
|
+
attr_reader :kind, :resource_version
|
9
|
+
|
10
|
+
model Fog::Compute::Kubevirt::Networkattachmentdef
|
11
|
+
|
12
|
+
def all(filters = {})
|
13
|
+
networkattachmentdefs = service.list_networkattachmentdefs(filters)
|
14
|
+
@kind = networkattachmentdefs.kind
|
15
|
+
@resource_version = networkattachmentdefs.resource_version
|
16
|
+
load networkattachmentdefs
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(name)
|
20
|
+
new service.get_networkattachmentdef(name)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates network attachment definition using provided parameters:
|
24
|
+
# name[String] - name of the network attachment
|
25
|
+
# config[String] - the configuration of the attachment, i.e.:
|
26
|
+
# '{ :cniVersion => "0.3.1", :type => "ovs", :bridge => "red" }'
|
27
|
+
#
|
28
|
+
# @param args[Hash] contains attachment definition
|
29
|
+
def create(args = {})
|
30
|
+
name = args[:name]
|
31
|
+
config = args[:config]
|
32
|
+
|
33
|
+
net_att_def = {
|
34
|
+
:metadata => {
|
35
|
+
:name => name,
|
36
|
+
:namespace => service.namespace
|
37
|
+
},
|
38
|
+
:spec => {
|
39
|
+
:config => config
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
service.create_networkattachmentdef(net_att_def)
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete(name)
|
47
|
+
begin
|
48
|
+
net_att_def = get(name)
|
49
|
+
rescue ::Fog::Kubevirt::Errors::ClientError
|
50
|
+
# the network attachment definition doesn't exist
|
51
|
+
net_att_def = nil
|
52
|
+
end
|
53
|
+
|
54
|
+
service.delete_networkattachmentdef(name, service.namespace) unless net_att_def.nil?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Kubevirt
|
4
|
+
class Pvc < Fog::Model
|
5
|
+
# Metadata
|
6
|
+
identity :name
|
7
|
+
attribute :resource_version, :aliases => 'metadata_resource_version'
|
8
|
+
attribute :uid, :aliases => 'metadata_uid'
|
9
|
+
attribute :namespace, :aliases => 'metadata_namespace'
|
10
|
+
|
11
|
+
# Spec
|
12
|
+
attribute :access_modes, :aliases => 'spec_access_modes'
|
13
|
+
attribute :storage_class, :aliases => 'spec_storage_class'
|
14
|
+
attribute :volume_mode, :aliases => 'spec_volume_mode'
|
15
|
+
attribute :volume_name, :aliases => 'spec_volume_name'
|
16
|
+
|
17
|
+
# Spec - selector
|
18
|
+
attribute :match_expressions, :aliases => 'spec_match_expressions'
|
19
|
+
attribute :match_labels, :aliases => 'spec_match_labels'
|
20
|
+
|
21
|
+
# Spec - resources
|
22
|
+
attribute :limits, :aliases => 'spec_limits'
|
23
|
+
attribute :requests, :aliases => 'spec_requests'
|
24
|
+
|
25
|
+
# Status
|
26
|
+
attribute :phase, :aliases => 'status_phase'
|
27
|
+
attribute :reason, :aliases => 'status_reason'
|
28
|
+
attribute :message, :aliases => 'status_message'
|
29
|
+
|
30
|
+
def self.parse(object)
|
31
|
+
metadata = object[:metadata]
|
32
|
+
spec = object[:spec]
|
33
|
+
status = object[:status]
|
34
|
+
|
35
|
+
{
|
36
|
+
:name => metadata[:name],
|
37
|
+
:resource_version => metadata[:resourceVersion],
|
38
|
+
:uid => metadata[:uid],
|
39
|
+
:namespace => metadata[:namespace],
|
40
|
+
|
41
|
+
:access_modes => spec[:accessModes],
|
42
|
+
:storage_class => spec[:storageClassName],
|
43
|
+
:volume_mode => spec[:volumeMode],
|
44
|
+
:volume_name => spec[:volumeName],
|
45
|
+
|
46
|
+
:match_expressions => spec.dig(:selector, :matchExpressions),
|
47
|
+
:match_labels => spec.dig(:selector, :matchLabels),
|
48
|
+
:limits => spec.dig(:resources, :limits),
|
49
|
+
:requests => spec.dig(:resources, :requests),
|
50
|
+
|
51
|
+
:phase => status[:phase],
|
52
|
+
:reason => status[:reason],
|
53
|
+
:message => status[:message]
|
54
|
+
}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'fog/core/collection'
|
2
|
+
require 'fog/compute/kubevirt/models/pvc'
|
3
|
+
|
4
|
+
module Fog
|
5
|
+
module Compute
|
6
|
+
class Kubevirt
|
7
|
+
class Pvcs < Fog::Collection
|
8
|
+
attr_reader :kind, :resource_version
|
9
|
+
|
10
|
+
model Fog::Compute::Kubevirt::Pvc
|
11
|
+
|
12
|
+
def all(filters = {})
|
13
|
+
pvcs = service.list_pvcs(filters)
|
14
|
+
@kind = pvcs.kind
|
15
|
+
@resource_version = pvcs.resource_version
|
16
|
+
load pvcs
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(name)
|
20
|
+
new service.get_pvc(name)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Creates a pvc using provided paramters:
|
24
|
+
# https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
|
25
|
+
# :name [String] - name of a pvc
|
26
|
+
# :namespace [String] - the namespace of the PVC, should be the same as POD's pvc
|
27
|
+
# :storage_class [String] - the storage class name of the pvc
|
28
|
+
# :volume_name [String] - The volume name to
|
29
|
+
# :volume_mode [String] - Filesystem or block device
|
30
|
+
# :accessModes [Arr] - the access modes for the volume, values are specified here:
|
31
|
+
# :requests [Hash] - the request for storage resource, i.e. { :storage => "20Gi" }
|
32
|
+
# :limits [Hash] - the maximum amount of storage to consume, i.e. { :storage => "20Gi" }
|
33
|
+
# :match_labels [Hash] - label query over volumes for binding
|
34
|
+
# :match_expressions [Hash] - list of label selector requirements
|
35
|
+
# @param [Hash] attributes containing details about pvc to be created.
|
36
|
+
def create(args = {})
|
37
|
+
name = args[:name]
|
38
|
+
|
39
|
+
pvc = {
|
40
|
+
:apiVersion => "v1",
|
41
|
+
:kind => "PersistentVolumeClaim",
|
42
|
+
:metadata => {
|
43
|
+
:name => name,
|
44
|
+
:namespace => args[:namespace]
|
45
|
+
},
|
46
|
+
:spec => {
|
47
|
+
:storageClassName => args[:storage_class],
|
48
|
+
:resources => {},
|
49
|
+
:selector => {},
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
pvc[:spec][:resources].merge!(:requests => args[:requests]) if args[:requests]
|
54
|
+
pvc[:spec][:resources].merge!(:limits => args[:limits]) if args[:limits]
|
55
|
+
pvc[:spec][:selector].merge!(:matchLabels => args[:match_labels]) if args[:match_labels]
|
56
|
+
pvc[:spec][:selector].merge!(:matchExpressions => args[:match_expressions]) if args[:match_expressions]
|
57
|
+
pvc[:spec][:accessModes] = args[:access_modes] if args[:access_modes]
|
58
|
+
pvc[:spec][:volumeMode] = args[:volume_mode] if args[:volume_mode]
|
59
|
+
pvc[:spec][:volumeName] = args[:volume_name] if args[:volume_name]
|
60
|
+
service.create_pvc(pvc)
|
61
|
+
end
|
62
|
+
|
63
|
+
def delete(name)
|
64
|
+
begin
|
65
|
+
pvc = get(name)
|
66
|
+
rescue ::Fog::Kubevirt::Errors::ClientError
|
67
|
+
# the pvc doesn't exist
|
68
|
+
pvc = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
service.delete_pvc(name) unless pvc.nil?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -19,8 +19,10 @@ module Fog
|
|
19
19
|
service.delete_vm(name, namespace)
|
20
20
|
end
|
21
21
|
|
22
|
+
# TODO: Once IP Addresses are reported to any networks, we should consider also
|
23
|
+
# the availabity of it (by extending the condition with !ip_address.empty?)
|
22
24
|
def ready?
|
23
|
-
running?(status) && running?(state)
|
25
|
+
running?(status) && running?(state)
|
24
26
|
end
|
25
27
|
|
26
28
|
def self.parse(object)
|
@@ -89,9 +89,9 @@ module Fog
|
|
89
89
|
object.each do |v|
|
90
90
|
volume = VmVolume.new
|
91
91
|
volume.name = v[:name]
|
92
|
-
if v.keys.include?(:
|
93
|
-
volume.type = '
|
94
|
-
volume.info = v.dig(:
|
92
|
+
if v.keys.include?(:containerDisk)
|
93
|
+
volume.type = 'containerDisk'
|
94
|
+
volume.info = v.dig(:containerDisk, :image)
|
95
95
|
elsif v.keys.include?(:persistentVolumeClaim)
|
96
96
|
volume.type = 'persistentVolumeClaim'
|
97
97
|
volume.info = v.dig(:persistentVolumeClaim, :claimName)
|
@@ -133,6 +133,7 @@ module Fog
|
|
133
133
|
:model,
|
134
134
|
:ports,
|
135
135
|
:boot_order
|
136
|
+
alias :mac :mac_address
|
136
137
|
end
|
137
138
|
|
138
139
|
class VmNetwork
|
@@ -151,7 +152,7 @@ module Fog
|
|
151
152
|
|
152
153
|
class VmVolume
|
153
154
|
attr_accessor :name,
|
154
|
-
# values:
|
155
|
+
# values: containerDisk, persistentVolumeClaim, emptyDisk,
|
155
156
|
# ephemeral, cloudInitNoCloud, hostDisk, secret,
|
156
157
|
# dataVolume, serviceAccount, configMap
|
157
158
|
:type,
|