fog-kubevirt 1.0.2 → 1.1.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/kubevirt/compute/compute.rb +28 -6
- data/lib/fog/kubevirt/compute/models/persistentvolume.rb +82 -0
- data/lib/fog/kubevirt/compute/models/persistentvolumes.rb +73 -0
- data/lib/fog/kubevirt/compute/models/storageclass.rb +33 -0
- data/lib/fog/kubevirt/compute/models/storageclasses.rb +61 -0
- data/lib/fog/kubevirt/compute/models/vm_base.rb +13 -2
- data/lib/fog/kubevirt/compute/models/vm_data.rb +11 -13
- data/lib/fog/kubevirt/compute/models/vminstance.rb +11 -2
- data/lib/fog/kubevirt/compute/models/vms.rb +48 -19
- data/lib/fog/kubevirt/compute/models/volume.rb +44 -69
- data/lib/fog/kubevirt/compute/models/volumes.rb +3 -58
- data/lib/fog/kubevirt/compute/requests/{create_volume.rb → create_persistentvolume.rb} +2 -2
- data/lib/fog/kubevirt/compute/requests/create_storageclass.rb +18 -0
- data/lib/fog/kubevirt/compute/requests/{delete_volume.rb → delete_persistentvolume.rb} +2 -2
- data/lib/fog/kubevirt/compute/requests/{get_volume.rb → delete_storageclass.rb} +3 -3
- data/lib/fog/kubevirt/compute/requests/delete_vm.rb +1 -1
- data/lib/fog/kubevirt/compute/requests/delete_vminstance.rb +3 -3
- data/lib/fog/kubevirt/compute/requests/get_persistentvolume.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/get_storageclass.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/list_persistentvolumes.rb +22 -0
- data/lib/fog/kubevirt/compute/requests/list_storageclasses.rb +22 -0
- data/lib/fog/kubevirt/compute/requests/list_volumes.rb +14 -6
- data/lib/fog/kubevirt/version.rb +1 -1
- data/spec/create_vm_spec.rb +101 -0
- data/spec/fixtures/kubevirt/{volume/volumes_crud.yml → persistentvolume/persistent_volumes_crud.yml} +0 -0
- data/spec/fixtures/kubevirt/pvc/pvcs_crud.yml +122 -76
- data/spec/fixtures/kubevirt/storageclass/storageclasses_crud.yml +400 -0
- data/spec/fixtures/kubevirt/vm/vm_create_multi.yml +459 -0
- data/spec/fixtures/kubevirt/vm/vm_create_single.yml +362 -0
- data/spec/{volumes_v1alpha2_spec.rb → persistent_volumes_v1alpha2_spec.rb} +11 -11
- data/spec/pvcs_v1alpha2_spec.rb +7 -0
- data/spec/storage_classes_v1_spec.rb +46 -0
- metadata +28 -9
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'fog/kubevirt/compute/models/vm_data'
|
2
|
+
|
1
3
|
module Fog
|
2
4
|
module Kubevirt
|
3
5
|
class Compute
|
4
6
|
class Vminstance < Fog::Model
|
7
|
+
extend VmData
|
8
|
+
|
5
9
|
identity :name
|
6
10
|
|
7
11
|
attribute :namespace, :aliases => 'metadata_namespace'
|
@@ -14,6 +18,8 @@ module Fog
|
|
14
18
|
attribute :disks, :aliases => 'spec_disks'
|
15
19
|
attribute :volumes, :aliases => 'spec_volumes'
|
16
20
|
attribute :ip_address, :aliases => 'status_interfaces_ip'
|
21
|
+
attribute :interfaces, :aliases => 'spec_interfaces'
|
22
|
+
attribute :networks, :aliases => 'spec_networks'
|
17
23
|
attribute :node_name, :aliases => 'status_node_name'
|
18
24
|
attribute :status, :aliases => 'status_phase'
|
19
25
|
|
@@ -22,6 +28,7 @@ module Fog
|
|
22
28
|
status = object[:status]
|
23
29
|
spec = object[:spec]
|
24
30
|
domain = spec[:domain]
|
31
|
+
disks = parse_disks(domain[:devices][:disks])
|
25
32
|
{
|
26
33
|
:namespace => metadata[:namespace],
|
27
34
|
:name => metadata[:name],
|
@@ -31,8 +38,10 @@ module Fog
|
|
31
38
|
:owner_uid => metadata.dig(:ownerReferences, 0, :uid),
|
32
39
|
:cpu_cores => domain.dig(:cpu, :cores),
|
33
40
|
:memory => domain[:resources][:requests][:memory],
|
34
|
-
:disks =>
|
35
|
-
:volumes => spec[:volumes],
|
41
|
+
:disks => disks,
|
42
|
+
:volumes => parse_volumes(spec[:volumes], disks),
|
43
|
+
:interfaces => parse_interfaces(domain[:devices][:interfaces]),
|
44
|
+
:networks => parse_networks(spec[:networks]),
|
36
45
|
:ip_address => status.dig(:interfaces, 0, :ipAddress),
|
37
46
|
:node_name => status[:nodeName],
|
38
47
|
:status => status[:phase]
|
@@ -27,6 +27,9 @@ module Fog
|
|
27
27
|
new service.get_vm(name)
|
28
28
|
end
|
29
29
|
|
30
|
+
def delete(name)
|
31
|
+
service.delete_vm(name, service.namespace)
|
32
|
+
end
|
30
33
|
|
31
34
|
# Creates a virtual machine using provided paramters:
|
32
35
|
# :vm_name [String] - name of a vm
|
@@ -49,7 +52,9 @@ module Fog
|
|
49
52
|
# :macAddress => '12:34:56:AB:CD:EF' }
|
50
53
|
# ]
|
51
54
|
#
|
52
|
-
#
|
55
|
+
# @param [String] :image name of container disk.
|
56
|
+
#
|
57
|
+
# @param [Array] :volumes the volumes (Fog::Kubevirt::Compute::Volume) to be used by the VM
|
53
58
|
#
|
54
59
|
# @param [Hash] attributes containing details about vm about to be
|
55
60
|
# created.
|
@@ -57,23 +62,16 @@ module Fog
|
|
57
62
|
vm_name = args.fetch(:vm_name)
|
58
63
|
cpus = args.fetch(:cpus, nil)
|
59
64
|
memory_size = args.fetch(:memory_size)
|
60
|
-
image = args.fetch(:image, nil)
|
61
|
-
pvc = args.fetch(:pvc, nil)
|
62
65
|
init = args.fetch(:cloudinit, {})
|
63
66
|
networks = args.fetch(:networks, nil)
|
64
67
|
interfaces = args.fetch(:interfaces, nil)
|
68
|
+
vm_volumes = args.fetch(:volumes, nil)
|
65
69
|
|
66
|
-
if
|
70
|
+
if vm_volumes.nil? || vm_volumes.empty?
|
67
71
|
raise ::Fog::Kubevirt::Errors::ValidationError
|
68
72
|
end
|
69
73
|
|
70
|
-
volumes =
|
71
|
-
volume_name = vm_name.gsub(/[._]+/,'-') + "-disk-01"
|
72
|
-
if !image.nil?
|
73
|
-
volumes.push(:name => volume_name, :containerDisk => {:image => image})
|
74
|
-
else
|
75
|
-
volumes.push(:name => volume_name, :persistentVolumeClaim => {:claimName => pvc})
|
76
|
-
end
|
74
|
+
volumes, disks = add_vm_storage(vm_name, vm_volumes)
|
77
75
|
|
78
76
|
unless init.empty?
|
79
77
|
volumes.push(:cloudInitNoCloud => init, :name => "cloudinitvolume")
|
@@ -100,13 +98,7 @@ module Fog
|
|
100
98
|
:spec => {
|
101
99
|
:domain => {
|
102
100
|
:devices => {
|
103
|
-
:disks =>
|
104
|
-
{:disk => {
|
105
|
-
:bus => "virtio"
|
106
|
-
},
|
107
|
-
:name => volume_name,
|
108
|
-
}
|
109
|
-
]
|
101
|
+
:disks => disks
|
110
102
|
},
|
111
103
|
:machine => {
|
112
104
|
:type => ""
|
@@ -168,9 +160,46 @@ module Fog
|
|
168
160
|
}
|
169
161
|
}
|
170
162
|
) unless interfaces.nil?
|
171
|
-
|
172
163
|
service.create_vm(vm)
|
173
164
|
end
|
165
|
+
|
166
|
+
def add_vm_storage(vm_name, vm_volumes)
|
167
|
+
normalized_vm_name = vm_name.gsub(/[._]+/,'-')
|
168
|
+
volumes, disks = [], []
|
169
|
+
vm_volumes.each_with_index do |v, idx|
|
170
|
+
volume_name = v.name || normalized_vm_name + "-disk-0" + idx.to_s
|
171
|
+
disk = {
|
172
|
+
:name => volume_name,
|
173
|
+
:disk => {}
|
174
|
+
}
|
175
|
+
disk[:bootOrder] = v.boot_order if v.boot_order
|
176
|
+
|
177
|
+
if v.type == 'containerDisk'
|
178
|
+
# set image
|
179
|
+
if v.config.nil?
|
180
|
+
volumes.push(:name => volume_name, :containerDisk => {:image => v.info})
|
181
|
+
else
|
182
|
+
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
183
|
+
end
|
184
|
+
disk[:disk][:bus] = v.bus || "virtio"
|
185
|
+
elsif v.type == 'persistentVolumeClaim'
|
186
|
+
# set claim
|
187
|
+
if v.config.nil?
|
188
|
+
volumes.push(:name => volume_name, :persistentVolumeClaim => {:claimName => v.info})
|
189
|
+
else
|
190
|
+
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
191
|
+
end
|
192
|
+
disk[:disk][:bus] = v.bus || "virtio"
|
193
|
+
else
|
194
|
+
# convert type into symbol and pass :config as volume content
|
195
|
+
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
196
|
+
disk[:disk][:bus] = v.bus if v.bus
|
197
|
+
end
|
198
|
+
disks.push(disk)
|
199
|
+
end
|
200
|
+
|
201
|
+
return volumes, disks
|
202
|
+
end
|
174
203
|
end
|
175
204
|
end
|
176
205
|
end
|
@@ -1,80 +1,55 @@
|
|
1
|
+
require 'fog/kubevirt/compute/models/pvc'
|
2
|
+
|
1
3
|
module Fog
|
2
4
|
module Kubevirt
|
3
5
|
class Compute
|
6
|
+
# Volumes represents volumes exist on kubevirt for vms:
|
7
|
+
# If volume is attached to a VM by disk, it will contain the attachment properties
|
8
|
+
# Disk Attachment properties are: boot_order and bus (when avaiable).
|
9
|
+
# If the volume isn't attached to any VM, it will contain name, type and info.
|
10
|
+
# When the volume type is persistentVolumeClaim, it will contain also the claim entity
|
11
|
+
# In order to create a new volume, user have to create a Claim when wishes to use PVC
|
12
|
+
# by using the pvcs collection.
|
4
13
|
class Volume < Fog::Model
|
5
|
-
|
14
|
+
identity :name
|
6
15
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
attribute :access_modes, :aliases => 'spec_access_modes'
|
12
|
-
attribute :mount_options, :aliases => 'spec_mount_options'
|
13
|
-
attribute :reclaim_policy, :aliases => 'spec_reclaim_policy'
|
14
|
-
attribute :storage_class, :aliases => 'spec_storage_class'
|
15
|
-
attribute :capacity, :aliases => 'spec_capacity'
|
16
|
-
attribute :claim_ref, :aliases => 'spec_claim_ref'
|
17
|
-
attribute :type, :aliases => 'spec_type'
|
18
|
-
attribute :config, :aliases => 'spec_config'
|
19
|
-
attribute :phase, :aliases => 'status_phase'
|
20
|
-
attribute :reason, :aliases => 'status_reason'
|
21
|
-
attribute :message, :aliases => 'status_message'
|
16
|
+
# values: containerDisk, persistentVolumeClaim, emptyDisk,
|
17
|
+
# ephemeral, cloudInitNoCloud, hostDisk, secret,
|
18
|
+
# dataVolume, serviceAccount, configMap
|
19
|
+
attribute :type
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
type = detect_type(spec)
|
21
|
+
# specific piece of information per volume type
|
22
|
+
# for containerDisk - contains the image
|
23
|
+
# for persistentVolumeClaim - contains the claim name
|
24
|
+
attribute :info
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
26
|
+
# holds the pvc entity if its type is persistentVolumeClaim
|
27
|
+
attribute :pvc
|
28
|
+
|
29
|
+
# Hash that holds volume type specific configurations, used for adding volume for a vm
|
30
|
+
# The set of config properties may change from type to type, see documentation for the supported
|
31
|
+
# keys of each volume type:
|
32
|
+
# https://kubevirt.io/user-guide/docs/latest/creating-virtual-machines/disks-and-volumes.html#volumes
|
33
|
+
attribute :config
|
34
|
+
|
35
|
+
# Disk attachment properties, relevant when volumes are fetched via the vm:
|
36
|
+
|
37
|
+
# the order (integer) of the device during boot sequence
|
38
|
+
attribute :boot_order
|
39
|
+
|
40
|
+
# detemines how the disk will be presented to the guest OS if available, supported values are:
|
41
|
+
# virtio, sata or scsi. See https://kubevirt.io/api-reference/master/definitions.html#_v1_disktarget
|
42
|
+
attribute :bus
|
43
|
+
|
44
|
+
def persisted?
|
45
|
+
!name.nil?
|
46
|
+
end
|
48
47
|
|
49
|
-
def self.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
type = 'cephfs' if spec.keys.include?(:cephfs)
|
55
|
-
type = 'configMap' if spec.keys.include?(:configMap)
|
56
|
-
type = 'csi' if spec.keys.include?(:csi)
|
57
|
-
type = 'downwardAPI' if spec.keys.include?(:downwardAPI)
|
58
|
-
type = 'emptyDir' if spec.keys.include?(:emptyDir)
|
59
|
-
type = 'fc' if spec.keys.include?(:fc)
|
60
|
-
type = 'flexVolume' if spec.keys.include?(:flexVolume)
|
61
|
-
type = 'flocker' if spec.keys.include?(:flocker)
|
62
|
-
type = 'gcePersistentDisk' if spec.keys.include?(:gcePersistentDisk)
|
63
|
-
type = 'glusterfs' if spec.keys.include?(:glusterfs)
|
64
|
-
type = 'hostPath' if spec.keys.include?(:hostPath)
|
65
|
-
type = 'iscsi' if spec.keys.include?(:iscsi)
|
66
|
-
type = 'local' if spec.keys.include?(:local)
|
67
|
-
type = 'nfs' if spec.keys.include?(:nfs)
|
68
|
-
type = 'persistentVolumeClaim' if spec.keys.include?(:persistentVolumeClaim)
|
69
|
-
type = 'projected' if spec.keys.include?(:projected)
|
70
|
-
type = 'portworxVolume' if spec.keys.include?(:portworxVolume)
|
71
|
-
type = 'quobyte' if spec.keys.include?(:quobyte)
|
72
|
-
type = 'rbd' if spec.keys.include?(:rbd)
|
73
|
-
type = 'scaleIO' if spec.keys.include?(:scaleIO)
|
74
|
-
type = 'secret' if spec.keys.include?(:secret)
|
75
|
-
type = 'storageos' if spec.keys.include?(:storageos)
|
76
|
-
type = 'vsphereVolume' if spec.keys.include?(:vsphereVolume)
|
77
|
-
type
|
48
|
+
def self.parse(object, disk)
|
49
|
+
byebug
|
50
|
+
volume = parse_object(object)
|
51
|
+
volume[:boot_order] = object[:bootOrder]
|
52
|
+
volume
|
78
53
|
end
|
79
54
|
end
|
80
55
|
end
|
@@ -5,67 +5,12 @@ module Fog
|
|
5
5
|
module Kubevirt
|
6
6
|
class Compute
|
7
7
|
class Volumes < Fog::Collection
|
8
|
-
attr_reader :kind, :resource_version
|
9
|
-
|
10
8
|
model Fog::Kubevirt::Compute::Volume
|
11
9
|
|
12
|
-
|
13
|
-
volumes = service.list_volumes(filters)
|
14
|
-
@kind = volumes.kind
|
15
|
-
@resource_version = volumes.resource_version
|
16
|
-
load volumes
|
17
|
-
end
|
18
|
-
|
19
|
-
def get(name)
|
20
|
-
new service.get_volume(name)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Creates a volume using provided paramters:
|
24
|
-
# :name [String] - name of a volume
|
25
|
-
# :labels [Hash] - a hash of key,values representing the labels
|
26
|
-
# :storage_class [String] - the storage class name of the volume
|
27
|
-
# :capacity [String] - The capacity of the storage if applied
|
28
|
-
# :accessModes [Arr] - the access modes for the volume, values are specified here:
|
29
|
-
# https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
|
30
|
-
# :type [String] - the type of the storage
|
31
|
-
# :config [Hash] - storage specific configuration to be applied for the volume
|
32
|
-
# correlated to the args[:type]
|
33
|
-
# @param [Hash] attributes containing details about volume to be created.
|
34
|
-
def create(args = {})
|
35
|
-
name = args[:name]
|
36
|
-
labels = args[:labels]
|
37
|
-
|
38
|
-
volume = {
|
39
|
-
:apiVersion => "v1",
|
40
|
-
:kind => "PersistentVolume",
|
41
|
-
:metadata => {
|
42
|
-
:name => name
|
43
|
-
},
|
44
|
-
:spec => {
|
45
|
-
:storageClassName => args[:storage_class]
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
volume[:metadata][:labels] = labels if labels
|
50
|
-
volume[:spec][:capacity] = {
|
51
|
-
:storage => args[:capacity]
|
52
|
-
} if args[:capacity]
|
53
|
-
|
54
|
-
volume[:spec][:accessModes] = args[:access_modes] if args[:access_modes]
|
55
|
-
volume[:spec][args[:type].to_sym] = args[:config] if args[:type]
|
56
|
-
|
57
|
-
service.create_volume(volume)
|
58
|
-
end
|
59
|
-
|
60
|
-
def delete(name)
|
61
|
-
begin
|
62
|
-
volume = get(name)
|
63
|
-
rescue ::Fog::Kubevirt::Errors::ClientError
|
64
|
-
# the volume doesn't exist
|
65
|
-
volume = nil
|
66
|
-
end
|
10
|
+
attr_accessor :vm
|
67
11
|
|
68
|
-
|
12
|
+
def all(vm_name = nil)
|
13
|
+
service.list_volumes(vm_name)
|
69
14
|
end
|
70
15
|
end
|
71
16
|
end
|
@@ -2,7 +2,7 @@ module Fog
|
|
2
2
|
module Kubevirt
|
3
3
|
class Compute
|
4
4
|
class Real
|
5
|
-
def
|
5
|
+
def create_persistentvolume(volume)
|
6
6
|
kube_client.create_persistent_volume(volume)
|
7
7
|
rescue ::Fog::Kubevirt::Errors::ClientError => err
|
8
8
|
log.warn(err)
|
@@ -11,7 +11,7 @@ module Fog
|
|
11
11
|
end
|
12
12
|
|
13
13
|
class Mock
|
14
|
-
def
|
14
|
+
def create_persistentvolume(volume)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Kubevirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def create_storageclass(storageclass)
|
6
|
+
kube_storage_client.create_storage_class(storageclass)
|
7
|
+
rescue ::Fog::Kubevirt::Errors::ClientError => err
|
8
|
+
log.warn(err)
|
9
|
+
raise ::Fog::Kubevirt::Errors::AlreadyExistsError
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Mock
|
14
|
+
def create_storage_class(attrs); end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -2,13 +2,13 @@ module Fog
|
|
2
2
|
module Kubevirt
|
3
3
|
class Compute
|
4
4
|
class Real
|
5
|
-
def
|
5
|
+
def delete_persistentvolume(name)
|
6
6
|
kube_client.delete_persistent_volume(name)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
class Mock
|
11
|
-
def
|
11
|
+
def delete_persistentvolume(name)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -2,13 +2,13 @@ module Fog
|
|
2
2
|
module Kubevirt
|
3
3
|
class Compute
|
4
4
|
class Real
|
5
|
-
def
|
6
|
-
|
5
|
+
def delete_storageclass(name)
|
6
|
+
kube_storage_client.delete_storage_class(name)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
class Mock
|
11
|
-
def
|
11
|
+
def delete_storage_class(name)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -2,13 +2,13 @@ module Fog
|
|
2
2
|
module Kubevirt
|
3
3
|
class Compute
|
4
4
|
class Real
|
5
|
-
def delete_vminstance(name
|
6
|
-
kubevirt_client.delete_virtual_machine_instance(name, namespace)
|
5
|
+
def delete_vminstance(name)
|
6
|
+
kubevirt_client.delete_virtual_machine_instance(name, @namespace)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
class Mock
|
11
|
-
def delete_virtual_machine_instance(name
|
11
|
+
def delete_virtual_machine_instance(name)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|