fog-kubevirt 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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,
|