fog-kubevirt 0.3.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -3
- data/lib/fog/bin/kubevirt.rb +2 -2
- data/lib/fog/kubevirt.rb +1 -4
- data/lib/fog/{compute/kubevirt.rb → kubevirt/compute/compute.rb} +35 -184
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/node.rb +3 -3
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/nodes.rb +4 -4
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/template.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/templates.rb +4 -4
- data/lib/fog/kubevirt/compute/models/vm.rb +71 -0
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/vminstance.rb +4 -13
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/models/vminstances.rb +4 -4
- data/lib/fog/kubevirt/compute/models/vms.rb +137 -0
- data/lib/fog/kubevirt/compute/models/volume.rb +9 -0
- data/lib/fog/kubevirt/compute/models/volumes.rb +12 -0
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/create_pvc.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/create_vm.rb +2 -3
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/create_vminstance.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/delete_vm.rb +3 -3
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/delete_vminstance.rb +5 -5
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/get_node.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/get_template.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/get_vm.rb +3 -3
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/get_vminstance.rb +6 -6
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/list_nodes.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/list_templates.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/list_vminstances.rb +2 -2
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/list_vms.rb +6 -6
- data/lib/fog/{compute/kubevirt → kubevirt/compute}/requests/update_vm.rb +2 -2
- data/lib/fog/kubevirt/version.rb +1 -1
- metadata +39 -133
- data/lib/fog/compute/kubevirt/models/networkattachmentdef.rb +0 -25
- data/lib/fog/compute/kubevirt/models/networkattachmentdefs.rb +0 -59
- data/lib/fog/compute/kubevirt/models/persistentvolume.rb +0 -82
- data/lib/fog/compute/kubevirt/models/persistentvolumes.rb +0 -73
- data/lib/fog/compute/kubevirt/models/pvc.rb +0 -59
- data/lib/fog/compute/kubevirt/models/pvcs.rb +0 -76
- data/lib/fog/compute/kubevirt/models/server.rb +0 -44
- data/lib/fog/compute/kubevirt/models/servers.rb +0 -32
- data/lib/fog/compute/kubevirt/models/service.rb +0 -36
- data/lib/fog/compute/kubevirt/models/services.rb +0 -83
- data/lib/fog/compute/kubevirt/models/storageclass.rb +0 -33
- data/lib/fog/compute/kubevirt/models/storageclasses.rb +0 -61
- data/lib/fog/compute/kubevirt/models/vm.rb +0 -17
- data/lib/fog/compute/kubevirt/models/vm_base.rb +0 -86
- data/lib/fog/compute/kubevirt/models/vm_data.rb +0 -162
- data/lib/fog/compute/kubevirt/models/vms.rb +0 -206
- data/lib/fog/compute/kubevirt/models/volume.rb +0 -57
- data/lib/fog/compute/kubevirt/models/volumes.rb +0 -18
- data/lib/fog/compute/kubevirt/requests/create_networkattachmentdef.rb +0 -37
- data/lib/fog/compute/kubevirt/requests/create_persistentvolume.rb +0 -19
- data/lib/fog/compute/kubevirt/requests/create_service.rb +0 -18
- data/lib/fog/compute/kubevirt/requests/create_storageclass.rb +0 -18
- data/lib/fog/compute/kubevirt/requests/delete_networkattachmentdef.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/delete_persistentvolume.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/delete_pvc.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/delete_service.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/delete_storageclass.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/get_networkattachmentdef.rb +0 -19
- data/lib/fog/compute/kubevirt/requests/get_persistentvolume.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/get_pvc.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/get_server.rb +0 -32
- data/lib/fog/compute/kubevirt/requests/get_service.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/get_storageclass.rb +0 -16
- data/lib/fog/compute/kubevirt/requests/list_networkattachmentdefs.rb +0 -21
- data/lib/fog/compute/kubevirt/requests/list_persistentvolumes.rb +0 -22
- data/lib/fog/compute/kubevirt/requests/list_pvcs.rb +0 -22
- data/lib/fog/compute/kubevirt/requests/list_servers.rb +0 -25
- data/lib/fog/compute/kubevirt/requests/list_services.rb +0 -22
- data/lib/fog/compute/kubevirt/requests/list_storageclasses.rb +0 -22
- data/lib/fog/compute/kubevirt/requests/list_volumes.rb +0 -30
- data/spec/compute_v1alpha2_spec.rb +0 -30
- data/spec/create_vm_spec.rb +0 -101
- data/spec/fixtures/kubevirt/networkattachmentdefinition/networkattachmentdefinitions_crud.yml +0 -320
- data/spec/fixtures/kubevirt/persistentvolume/persistent_volumes_crud.yml +0 -316
- data/spec/fixtures/kubevirt/pvc/pvcs_crud.yml +0 -362
- data/spec/fixtures/kubevirt/service/services_crud.yml +0 -316
- data/spec/fixtures/kubevirt/storageclass/storageclasses_crud.yml +0 -400
- data/spec/fixtures/kubevirt/vm/vm_create_multi.yml +0 -459
- data/spec/fixtures/kubevirt/vm/vm_create_single.yml +0 -362
- data/spec/network_attachment_definition_v1alpha2_spec.rb +0 -28
- data/spec/persistent_volumes_v1alpha2_spec.rb +0 -45
- data/spec/pvcs_v1alpha2_spec.rb +0 -59
- data/spec/shared_context.rb +0 -54
- data/spec/spec_helper.rb +0 -10
- data/spec/storage_classes_v1_spec.rb +0 -46
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'fog/core/collection'
|
2
|
-
require 'fog/compute/kubevirt/models/storageclass'
|
3
|
-
|
4
|
-
module Fog
|
5
|
-
module Compute
|
6
|
-
class Kubevirt
|
7
|
-
class Storageclasses < Fog::Collection
|
8
|
-
attr_reader :kind, :resource_version
|
9
|
-
|
10
|
-
model Fog::Compute::Kubevirt::Storageclass
|
11
|
-
|
12
|
-
def all(filters = {})
|
13
|
-
storageclasses = service.list_storageclasses(filters)
|
14
|
-
@kind = storageclasses.kind
|
15
|
-
@resource_version = storageclasses.resource_version
|
16
|
-
load storageclasses
|
17
|
-
end
|
18
|
-
|
19
|
-
def get(name)
|
20
|
-
new service.get_storageclass(name)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Creates a storage class using provided paramters:
|
24
|
-
# https://kubernetes.io/docs/concepts/storage/storage-classes
|
25
|
-
# :name [String] - name of a storage class
|
26
|
-
# :parameters [Object] - parameters for the provisioner that should create volumes of this storage class
|
27
|
-
# :mount_options [Arr] - mount options for the dynamically provisioned PersistentVolumes of this storage class.
|
28
|
-
# :provisioner [String] - the type of the provisioner
|
29
|
-
# :volume_binding_mode [String] - indicates how PersistentVolumeClaims should be provisioned and bound
|
30
|
-
# :reclaim_policy [String] - the reclaim policy of the created PVs (Defaults to Delete).
|
31
|
-
def create(args = {})
|
32
|
-
storageclass = {
|
33
|
-
:apiVersion => "storage.k8s.io/v1",
|
34
|
-
:kind => "StorageClass",
|
35
|
-
:metadata => {
|
36
|
-
:name => args[:name],
|
37
|
-
},
|
38
|
-
:parameters => args[:parameters],
|
39
|
-
:mount_options => args[:mount_options],
|
40
|
-
:provisioner => args[:provisioner],
|
41
|
-
:volume_binding_mode => args[:volume_binding_mode],
|
42
|
-
:reclaim_policy => args[:reclaim_policy]
|
43
|
-
}
|
44
|
-
|
45
|
-
service.create_storageclass(storageclass)
|
46
|
-
end
|
47
|
-
|
48
|
-
def delete(name)
|
49
|
-
begin
|
50
|
-
storageclass = get(name)
|
51
|
-
rescue ::Fog::Kubevirt::Errors::ClientError
|
52
|
-
# the storageclass doesn't exist
|
53
|
-
storageclass = nil
|
54
|
-
end
|
55
|
-
|
56
|
-
service.delete_storageclass(name) unless storageclass.nil?
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'fog/compute/kubevirt/models/vm_base'
|
2
|
-
|
3
|
-
module Fog
|
4
|
-
module Compute
|
5
|
-
class Kubevirt
|
6
|
-
class Vm < Fog::Model
|
7
|
-
include VmAction
|
8
|
-
extend VmBase
|
9
|
-
define_properties
|
10
|
-
|
11
|
-
def self.parse(object)
|
12
|
-
parse_object(object)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
require 'fog/compute/kubevirt/models/vm_data'
|
2
|
-
|
3
|
-
module Fog
|
4
|
-
module Compute
|
5
|
-
class Kubevirt
|
6
|
-
module VmBase
|
7
|
-
include VmData
|
8
|
-
|
9
|
-
def define_properties
|
10
|
-
identity :name
|
11
|
-
|
12
|
-
attribute :namespace, :aliases => 'metadata_namespace'
|
13
|
-
attribute :resource_version, :aliases => 'metadata_resource_version'
|
14
|
-
attribute :uid, :aliases => 'metadata_uid'
|
15
|
-
attribute :labels, :aliases => 'metadata_labels'
|
16
|
-
attribute :owner_reference, :aliases => 'metadata_owner_reference'
|
17
|
-
attribute :annotations, :aliases => 'metadata_annotations'
|
18
|
-
attribute :cpu_cores, :aliases => 'spec_cpu_cores'
|
19
|
-
attribute :memory, :aliases => 'spec_memory'
|
20
|
-
attribute :disks, :aliases => 'spec_disks'
|
21
|
-
attribute :volumes, :aliases => 'spec_volumes'
|
22
|
-
attribute :status, :aliases => 'spec_running'
|
23
|
-
attribute :interfaces, :aliases => 'spec_interfaces'
|
24
|
-
attribute :networks, :aliases => 'spec_networks'
|
25
|
-
attribute :machine_type, :aliases => 'spec_machine_type'
|
26
|
-
end
|
27
|
-
|
28
|
-
def parse_object(object)
|
29
|
-
metadata = object[:metadata]
|
30
|
-
spec = object[:spec][:template][:spec]
|
31
|
-
domain = spec[:domain]
|
32
|
-
owner = metadata[:ownerReferences]
|
33
|
-
annotations = metadata[:annotations]
|
34
|
-
cpu = domain[:cpu]
|
35
|
-
mem = domain.dig(:resources, :requests, :memory)
|
36
|
-
disks = parse_disks(domain[:devices][:disks])
|
37
|
-
vm = {
|
38
|
-
:namespace => metadata[:namespace],
|
39
|
-
:name => metadata[:name],
|
40
|
-
:resource_version => metadata[:resourceVersion],
|
41
|
-
:uid => metadata[:uid],
|
42
|
-
:labels => metadata[:labels],
|
43
|
-
:disks => disks,
|
44
|
-
:volumes => parse_volumes(spec[:volumes], disks),
|
45
|
-
:interfaces => parse_interfaces(domain[:devices][:interfaces]),
|
46
|
-
:networks => parse_networks(spec[:networks]),
|
47
|
-
:status => object[:spec][:running].to_s == "true" ? "running" : "stopped",
|
48
|
-
:machine_type => domain.dig(:machine, :type)
|
49
|
-
}
|
50
|
-
vm[:owner_reference] = owner unless owner.nil?
|
51
|
-
vm[:annotations] = annotations unless annotations.nil?
|
52
|
-
vm[:cpu_cores] = cpu[:cores] unless cpu.nil?
|
53
|
-
vm[:memory] = mem unless mem.nil?
|
54
|
-
|
55
|
-
vm
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
module VmAction
|
60
|
-
include Shared
|
61
|
-
|
62
|
-
def start(options = {})
|
63
|
-
# Change the `running` attribute to `true` so that the virtual machine controller will take it and
|
64
|
-
# create the virtual machine instance.
|
65
|
-
vm = service.get_raw_vm(name)
|
66
|
-
vm = deep_merge!(vm,
|
67
|
-
:spec => {
|
68
|
-
:running => true
|
69
|
-
}
|
70
|
-
)
|
71
|
-
service.update_vm(vm)
|
72
|
-
end
|
73
|
-
|
74
|
-
def stop(options = {})
|
75
|
-
vm = service.get_raw_vm(name)
|
76
|
-
vm = deep_merge!(vm,
|
77
|
-
:spec => {
|
78
|
-
:running => false
|
79
|
-
}
|
80
|
-
)
|
81
|
-
service.update_vm(vm)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
@@ -1,162 +0,0 @@
|
|
1
|
-
require 'fog/compute/kubevirt/models/volume'
|
2
|
-
|
3
|
-
module Fog
|
4
|
-
module Compute
|
5
|
-
class Kubevirt
|
6
|
-
module VmData
|
7
|
-
|
8
|
-
#
|
9
|
-
# Returns an array of parsed network interfaces
|
10
|
-
#
|
11
|
-
# @param object [Hash] A hash with raw interfaces data.
|
12
|
-
#
|
13
|
-
def parse_interfaces(object)
|
14
|
-
return {} if object.nil?
|
15
|
-
nics = []
|
16
|
-
object.each do |iface|
|
17
|
-
nic = VmNic.new
|
18
|
-
nic.name = iface[:name]
|
19
|
-
nic.mac_address = iface[:macAddress]
|
20
|
-
nic.type = 'bridge' if iface.keys.include?(:bridge)
|
21
|
-
nic.type = 'slirp' if iface.keys.include?(:slirp)
|
22
|
-
nics << nic
|
23
|
-
end
|
24
|
-
|
25
|
-
nics
|
26
|
-
end
|
27
|
-
|
28
|
-
#
|
29
|
-
# Returns an array of parsed networks
|
30
|
-
#
|
31
|
-
# @param object [Hash] A hash with raw networks data.
|
32
|
-
#
|
33
|
-
def parse_networks(object)
|
34
|
-
return {} if object.nil?
|
35
|
-
networks = []
|
36
|
-
object.each do |net|
|
37
|
-
network = VmNetwork.new
|
38
|
-
network.name = net[:name]
|
39
|
-
network.type = 'pod' if net.keys.include?(:pod)
|
40
|
-
network.type = 'multus' if net.keys.include?(:multus)
|
41
|
-
network.type = 'genie' if net.keys.include?(:genie)
|
42
|
-
networks << network
|
43
|
-
end
|
44
|
-
|
45
|
-
networks
|
46
|
-
end
|
47
|
-
|
48
|
-
#
|
49
|
-
# Returns an array of parsed disks
|
50
|
-
#
|
51
|
-
# @param object [Hash] A hash with raw disks data.
|
52
|
-
#
|
53
|
-
def parse_disks(object)
|
54
|
-
return {} if object.nil?
|
55
|
-
disks = []
|
56
|
-
object.each do |d|
|
57
|
-
disk = VmDisk.new
|
58
|
-
disk.name = d[:name]
|
59
|
-
disk.boot_order = d[:bootOrder]
|
60
|
-
|
61
|
-
if d.keys.include?(:cdrom)
|
62
|
-
disk.type = 'cdrom'
|
63
|
-
disk.bus = d.dig(:cdrom, :bus)
|
64
|
-
disk.readonly = d.dig(:cdrom, :readonly)
|
65
|
-
elsif d.keys.include?(:disk)
|
66
|
-
disk.type = 'disk'
|
67
|
-
disk.bus = d.dig(:disk, :bus)
|
68
|
-
disk.readonly = d.dig(:disk, :readonly)
|
69
|
-
elsif d.keys.include?(:floppy)
|
70
|
-
disk.type = 'floppy'
|
71
|
-
disk.readonly = d.dig(:floppy, :readonly)
|
72
|
-
elsif d.keys.include?(:lun)
|
73
|
-
disk.type = 'lun'
|
74
|
-
disk.readonly = d.dig(:lun, :readonly)
|
75
|
-
end
|
76
|
-
disks << disk
|
77
|
-
end
|
78
|
-
|
79
|
-
disks
|
80
|
-
end
|
81
|
-
|
82
|
-
#
|
83
|
-
# Returns an array of parsed volumes
|
84
|
-
#
|
85
|
-
# @param object [Hash] A hash with raw volumes data.
|
86
|
-
# @param disks [Array] the disks of the vm associated to the volumes
|
87
|
-
#
|
88
|
-
def parse_volumes(object, disks)
|
89
|
-
return {} if object.nil?
|
90
|
-
volumes = []
|
91
|
-
object.each do |v|
|
92
|
-
volume = Volume.new
|
93
|
-
volume.name = v[:name]
|
94
|
-
if v.keys.include?(:containerDisk)
|
95
|
-
volume.type = 'containerDisk'
|
96
|
-
volume.info = v.dig(:containerDisk, :image)
|
97
|
-
elsif v.keys.include?(:persistentVolumeClaim)
|
98
|
-
volume.type = 'persistentVolumeClaim'
|
99
|
-
volume.info = v.dig(:persistentVolumeClaim, :claimName)
|
100
|
-
elsif v.keys.include?(:emptyDisk)
|
101
|
-
volume.type = 'emptyDisk'
|
102
|
-
volume.info = v.dig(:emptyDisk, :capacity)
|
103
|
-
elsif v.keys.include?(:ephemeral)
|
104
|
-
volume.type = 'ephemeral'
|
105
|
-
volume.info = v.dig(:ephemeral, :persistentVolumeClaim, :claimName)
|
106
|
-
elsif v.keys.include?(:cloudInitNoCloud)
|
107
|
-
volume.type = 'cloudInitNoCloud'
|
108
|
-
volume.info = v.dig(:cloudInitNoCloud, :userDataBase64)
|
109
|
-
elsif v.keys.include?(:hostDisk)
|
110
|
-
volume.type = 'hostDisk'
|
111
|
-
volume.info = v.dig(:hostDisk, :path)
|
112
|
-
elsif v.keys.include?(:secret)
|
113
|
-
volume.type = 'secret'
|
114
|
-
volume.info = v.dig(:secret, :secretName)
|
115
|
-
elsif v.keys.include?(:dataVolume)
|
116
|
-
volume.type = 'dataVolume'
|
117
|
-
volume.info = v.dig(:dataVolume, :name)
|
118
|
-
elsif v.keys.include?(:serviceAccount)
|
119
|
-
volume.type = 'serviceAccount'
|
120
|
-
volume.info = v.dig(:serviceAccount, :serviceAccountName)
|
121
|
-
elsif v.keys.include?(:configMap)
|
122
|
-
volume.type = 'configMap'
|
123
|
-
volume.info = v.dig(:configMap, :name)
|
124
|
-
end
|
125
|
-
|
126
|
-
volume.config = v[volume.type.to_sym]
|
127
|
-
disk = disks.select { |d| d.name == volume.name }.first
|
128
|
-
volume.boot_order = disk.boot_order
|
129
|
-
volume.bus = disk.bus if disk.respond_to?(:bus)
|
130
|
-
|
131
|
-
volumes << volume
|
132
|
-
end
|
133
|
-
|
134
|
-
volumes
|
135
|
-
end
|
136
|
-
|
137
|
-
class VmNic
|
138
|
-
attr_accessor :name,
|
139
|
-
:mac_address,
|
140
|
-
:type, # values: bridge, slirp
|
141
|
-
:model,
|
142
|
-
:ports,
|
143
|
-
:boot_order
|
144
|
-
alias :mac :mac_address
|
145
|
-
end
|
146
|
-
|
147
|
-
class VmNetwork
|
148
|
-
attr_accessor :name,
|
149
|
-
:type # values: multus, pod, genie
|
150
|
-
end
|
151
|
-
|
152
|
-
class VmDisk
|
153
|
-
attr_accessor :name,
|
154
|
-
:boot_order,
|
155
|
-
:type, # values: cdrom, disk, floppy, lun
|
156
|
-
:bus,
|
157
|
-
:readonly
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
@@ -1,206 +0,0 @@
|
|
1
|
-
require 'fog/core/collection'
|
2
|
-
require 'fog/compute/kubevirt/models/vm'
|
3
|
-
|
4
|
-
module Fog
|
5
|
-
module Compute
|
6
|
-
class Kubevirt
|
7
|
-
class Vms < Fog::Collection
|
8
|
-
include Shared
|
9
|
-
|
10
|
-
attr_reader :kind, :resource_version
|
11
|
-
|
12
|
-
model Fog::Compute::Kubevirt::Vm
|
13
|
-
|
14
|
-
def all(filters = {})
|
15
|
-
begin
|
16
|
-
vms = service.list_vms(filters)
|
17
|
-
rescue ::Fog::Kubevirt::Errors::ClientError
|
18
|
-
# we assume that we get 404
|
19
|
-
vms = []
|
20
|
-
end
|
21
|
-
@kind = vms.kind
|
22
|
-
@resource_version = vms.resource_version
|
23
|
-
load vms
|
24
|
-
end
|
25
|
-
|
26
|
-
def get(name)
|
27
|
-
new service.get_vm(name)
|
28
|
-
end
|
29
|
-
|
30
|
-
def delete(name)
|
31
|
-
service.delete_vm(name, service.namespace)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Creates a virtual machine using provided paramters:
|
35
|
-
# :vm_name [String] - name of a vm
|
36
|
-
# :cpus [String] - number of cpus
|
37
|
-
# :memory_size [String] - amount of memory
|
38
|
-
# :image [String] - name of a container disk
|
39
|
-
# :pvc [String] - name of a persistent volume claim
|
40
|
-
# :cloudinit [Hash] - number of items needed to configure cloud-init
|
41
|
-
# :networks[Array] - networks to which the vm should be connected, i.e:
|
42
|
-
# [ { :name => 'default', :pod => {} } ,
|
43
|
-
# { :name => 'ovs-red', :multus => { :networkName => 'red'} }
|
44
|
-
# ]
|
45
|
-
#
|
46
|
-
# :interfaces[Array] - network interfaces for the vm, correlated to
|
47
|
-
# :networks section by network's name, i.e.:
|
48
|
-
# [ { :name => 'default', :bridge => {} },
|
49
|
-
# { :name => 'red', # correlated to networks[networkName]
|
50
|
-
# :bridge => {},
|
51
|
-
# :bootOrder => 1, # 1 to boot from network interface
|
52
|
-
# :macAddress => '12:34:56:AB:CD:EF' }
|
53
|
-
# ]
|
54
|
-
#
|
55
|
-
# @param [String] :image name of container disk.
|
56
|
-
#
|
57
|
-
# @param [Array] :volumes the volumes (Fog::Compute::Kubevirt::Volume) to be used by the VM
|
58
|
-
#
|
59
|
-
# @param [Hash] attributes containing details about vm about to be
|
60
|
-
# created.
|
61
|
-
def create(args = {})
|
62
|
-
vm_name = args.fetch(:vm_name)
|
63
|
-
cpus = args.fetch(:cpus, nil)
|
64
|
-
memory_size = args.fetch(:memory_size)
|
65
|
-
init = args.fetch(:cloudinit, {})
|
66
|
-
networks = args.fetch(:networks, nil)
|
67
|
-
interfaces = args.fetch(:interfaces, nil)
|
68
|
-
vm_volumes = args.fetch(:volumes, nil)
|
69
|
-
|
70
|
-
if vm_volumes.nil? || vm_volumes.empty?
|
71
|
-
raise ::Fog::Kubevirt::Errors::ValidationError
|
72
|
-
end
|
73
|
-
|
74
|
-
volumes, disks = add_vm_storage(vm_name, vm_volumes)
|
75
|
-
|
76
|
-
unless init.empty?
|
77
|
-
volumes.push(:cloudInitNoCloud => init, :name => "cloudinitvolume")
|
78
|
-
end
|
79
|
-
|
80
|
-
vm = {
|
81
|
-
:kind => "VirtualMachine",
|
82
|
-
:metadata => {
|
83
|
-
:labels => {
|
84
|
-
:"kubevirt.io/vm" => vm_name,
|
85
|
-
},
|
86
|
-
:name => vm_name,
|
87
|
-
:namespace => service.namespace,
|
88
|
-
},
|
89
|
-
:spec => {
|
90
|
-
:running => false,
|
91
|
-
:template => {
|
92
|
-
:metadata => {
|
93
|
-
:creationTimestamp => nil,
|
94
|
-
:labels => {
|
95
|
-
:"kubevirt.io/vm" => vm_name
|
96
|
-
}
|
97
|
-
},
|
98
|
-
:spec => {
|
99
|
-
:domain => {
|
100
|
-
:devices => {
|
101
|
-
:disks => disks
|
102
|
-
},
|
103
|
-
:machine => {
|
104
|
-
:type => ""
|
105
|
-
},
|
106
|
-
:resources => {
|
107
|
-
:requests => {
|
108
|
-
:memory => "#{memory_size}M"
|
109
|
-
}
|
110
|
-
}
|
111
|
-
},
|
112
|
-
:terminationGracePeriodSeconds => 0,
|
113
|
-
:volumes => volumes
|
114
|
-
}
|
115
|
-
}
|
116
|
-
}
|
117
|
-
}
|
118
|
-
|
119
|
-
vm = deep_merge!(vm,
|
120
|
-
:spec => {
|
121
|
-
:template => {
|
122
|
-
:spec => {
|
123
|
-
:domain => {
|
124
|
-
:cpu => {
|
125
|
-
:cores => cpus
|
126
|
-
}
|
127
|
-
}
|
128
|
-
}
|
129
|
-
}
|
130
|
-
}
|
131
|
-
) unless cpus.nil?
|
132
|
-
|
133
|
-
vm[:spec][:template][:spec][:domain][:devices][:disks].push(
|
134
|
-
:disk => {
|
135
|
-
:bus => "virtio"
|
136
|
-
},
|
137
|
-
:name => "cloudinitvolume",
|
138
|
-
) unless init.empty?
|
139
|
-
|
140
|
-
vm = deep_merge!(vm,
|
141
|
-
:spec => {
|
142
|
-
:template => {
|
143
|
-
:spec => {
|
144
|
-
:networks => networks
|
145
|
-
}
|
146
|
-
}
|
147
|
-
}
|
148
|
-
) unless networks.nil?
|
149
|
-
|
150
|
-
vm = deep_merge!(vm,
|
151
|
-
:spec => {
|
152
|
-
:template => {
|
153
|
-
:spec => {
|
154
|
-
:domain => {
|
155
|
-
:devices => {
|
156
|
-
:interfaces => interfaces
|
157
|
-
}
|
158
|
-
}
|
159
|
-
}
|
160
|
-
}
|
161
|
-
}
|
162
|
-
) unless interfaces.nil?
|
163
|
-
service.create_vm(vm)
|
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
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|