fog-kubevirt 1.0.1 → 1.0.2
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/kubevirt/compute/compute.rb +125 -37
- data/lib/fog/kubevirt/compute/models/networkattachmentdef.rb +25 -0
- data/lib/fog/kubevirt/compute/models/networkattachmentdefs.rb +59 -0
- data/lib/fog/kubevirt/compute/models/pvc.rb +59 -0
- data/lib/fog/kubevirt/compute/models/pvcs.rb +76 -0
- data/lib/fog/kubevirt/compute/models/server.rb +42 -0
- data/lib/fog/kubevirt/compute/models/servers.rb +32 -0
- data/lib/fog/kubevirt/compute/models/service.rb +36 -0
- data/lib/fog/kubevirt/compute/models/services.rb +83 -0
- data/lib/fog/kubevirt/compute/models/vm.rb +6 -60
- data/lib/fog/kubevirt/compute/models/vm_base.rb +75 -0
- data/lib/fog/kubevirt/compute/models/vm_data.rb +164 -0
- data/lib/fog/kubevirt/compute/models/vms.rb +59 -19
- data/lib/fog/kubevirt/compute/models/volume.rb +73 -0
- data/lib/fog/kubevirt/compute/models/volumes.rb +61 -0
- data/lib/fog/kubevirt/compute/requests/create_networkattachmentdef.rb +37 -0
- data/lib/fog/kubevirt/compute/requests/create_service.rb +18 -0
- data/lib/fog/kubevirt/compute/requests/create_vm.rb +2 -0
- data/lib/fog/kubevirt/compute/requests/create_volume.rb +19 -0
- data/lib/fog/kubevirt/compute/requests/delete_networkattachmentdef.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/delete_pvc.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/delete_service.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/delete_volume.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/get_networkattachmentdef.rb +19 -0
- data/lib/fog/kubevirt/compute/requests/get_pvc.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/get_server.rb +32 -0
- data/lib/fog/kubevirt/compute/requests/get_service.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/get_vm.rb +1 -1
- data/lib/fog/kubevirt/compute/requests/get_vminstance.rb +4 -4
- data/lib/fog/kubevirt/compute/requests/get_volume.rb +16 -0
- data/lib/fog/kubevirt/compute/requests/list_networkattachmentdefs.rb +21 -0
- data/lib/fog/kubevirt/compute/requests/list_pvcs.rb +22 -0
- data/lib/fog/kubevirt/compute/requests/list_servers.rb +25 -0
- data/lib/fog/kubevirt/compute/requests/list_services.rb +22 -0
- data/lib/fog/kubevirt/compute/requests/list_vms.rb +4 -4
- data/lib/fog/kubevirt/compute/requests/list_volumes.rb +22 -0
- data/lib/fog/kubevirt/version.rb +1 -1
- data/spec/compute_v1alpha2_spec.rb +30 -0
- 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 +53 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/volumes_v1alpha2_spec.rb +45 -0
- metadata +87 -10
@@ -32,8 +32,22 @@ module Fog
|
|
32
32
|
# :vm_name [String] - name of a vm
|
33
33
|
# :cpus [String] - number of cpus
|
34
34
|
# :memory_size [String] - amount of memory
|
35
|
-
# :image [String] - name of a
|
35
|
+
# :image [String] - name of a container disk
|
36
36
|
# :pvc [String] - name of a persistent volume claim
|
37
|
+
# :cloudinit [Hash] - number of items needed to configure cloud-init
|
38
|
+
# :networks[Array] - networks to which the vm should be connected, i.e:
|
39
|
+
# [ { :name => 'default', :pod => {} } ,
|
40
|
+
# { :name => 'ovs-red', :multus => { :networkName => 'red'} }
|
41
|
+
# ]
|
42
|
+
#
|
43
|
+
# :interfaces[Array] - network interfaces for the vm, correlated to
|
44
|
+
# :networks section by network's name, i.e.:
|
45
|
+
# [ { :name => 'default', :bridge => {} },
|
46
|
+
# { :name => 'red', # correlated to networks[networkName]
|
47
|
+
# :bridge => {},
|
48
|
+
# :bootOrder => 1, # 1 to boot from network interface
|
49
|
+
# :macAddress => '12:34:56:AB:CD:EF' }
|
50
|
+
# ]
|
37
51
|
#
|
38
52
|
# One of :image or :pvc needs to be provided.
|
39
53
|
#
|
@@ -45,31 +59,27 @@ module Fog
|
|
45
59
|
memory_size = args.fetch(:memory_size)
|
46
60
|
image = args.fetch(:image, nil)
|
47
61
|
pvc = args.fetch(:pvc, nil)
|
62
|
+
init = args.fetch(:cloudinit, {})
|
63
|
+
networks = args.fetch(:networks, nil)
|
64
|
+
interfaces = args.fetch(:interfaces, nil)
|
48
65
|
|
49
66
|
if image.nil? && pvc.nil?
|
50
67
|
raise ::Fog::Kubevirt::Errors::ValidationError
|
51
68
|
end
|
52
|
-
|
53
|
-
volume = {}
|
54
69
|
|
70
|
+
volumes = []
|
71
|
+
volume_name = vm_name.gsub(/[._]+/,'-') + "-disk-01"
|
55
72
|
if !image.nil?
|
56
|
-
|
57
|
-
:name => vm_name,
|
58
|
-
:registryDisk => {
|
59
|
-
:image => image
|
60
|
-
}
|
61
|
-
}
|
73
|
+
volumes.push(:name => volume_name, :containerDisk => {:image => image})
|
62
74
|
else
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
}
|
75
|
+
volumes.push(:name => volume_name, :persistentVolumeClaim => {:claimName => pvc})
|
76
|
+
end
|
77
|
+
|
78
|
+
unless init.empty?
|
79
|
+
volumes.push(:cloudInitNoCloud => init, :name => "cloudinitvolume")
|
69
80
|
end
|
70
81
|
|
71
82
|
vm = {
|
72
|
-
:apiVersion => service.class::KUBEVIRT_VERSION_LABEL,
|
73
83
|
:kind => "VirtualMachine",
|
74
84
|
:metadata => {
|
75
85
|
:labels => {
|
@@ -94,8 +104,7 @@ module Fog
|
|
94
104
|
{:disk => {
|
95
105
|
:bus => "virtio"
|
96
106
|
},
|
97
|
-
:name =>
|
98
|
-
:volumeName => vm_name
|
107
|
+
:name => volume_name,
|
99
108
|
}
|
100
109
|
]
|
101
110
|
},
|
@@ -109,7 +118,7 @@ module Fog
|
|
109
118
|
}
|
110
119
|
},
|
111
120
|
:terminationGracePeriodSeconds => 0,
|
112
|
-
:volumes =>
|
121
|
+
:volumes => volumes
|
113
122
|
}
|
114
123
|
}
|
115
124
|
}
|
@@ -129,6 +138,37 @@ module Fog
|
|
129
138
|
}
|
130
139
|
) unless cpus.nil?
|
131
140
|
|
141
|
+
vm[:spec][:template][:spec][:domain][:devices][:disks].push(
|
142
|
+
:disk => {
|
143
|
+
:bus => "virtio"
|
144
|
+
},
|
145
|
+
:name => "cloudinitvolume",
|
146
|
+
) unless init.empty?
|
147
|
+
|
148
|
+
vm = deep_merge!(vm,
|
149
|
+
:spec => {
|
150
|
+
:template => {
|
151
|
+
:spec => {
|
152
|
+
:networks => networks
|
153
|
+
}
|
154
|
+
}
|
155
|
+
}
|
156
|
+
) unless networks.nil?
|
157
|
+
|
158
|
+
vm = deep_merge!(vm,
|
159
|
+
:spec => {
|
160
|
+
:template => {
|
161
|
+
:spec => {
|
162
|
+
:domain => {
|
163
|
+
:devices => {
|
164
|
+
:interfaces => interfaces
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
}
|
170
|
+
) unless interfaces.nil?
|
171
|
+
|
132
172
|
service.create_vm(vm)
|
133
173
|
end
|
134
174
|
end
|
@@ -2,7 +2,80 @@ module Fog
|
|
2
2
|
module Kubevirt
|
3
3
|
class Compute
|
4
4
|
class Volume < Fog::Model
|
5
|
+
identity :name
|
5
6
|
|
7
|
+
attribute :resource_version, :aliases => 'metadata_resource_version'
|
8
|
+
attribute :uid, :aliases => 'metadata_uid'
|
9
|
+
attribute :annotations, :aliases => 'metadata_annotations'
|
10
|
+
attribute :labels, :aliases => 'metadata_labels'
|
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'
|
22
|
+
|
23
|
+
def self.parse(object)
|
24
|
+
metadata = object[:metadata]
|
25
|
+
spec = object[:spec]
|
26
|
+
status = object[:status]
|
27
|
+
type = detect_type(spec)
|
28
|
+
|
29
|
+
{
|
30
|
+
:name => metadata[:name],
|
31
|
+
:resource_version => metadata[:resourceVersion],
|
32
|
+
:uid => metadata[:uid],
|
33
|
+
:annotations => metadata[:annotations],
|
34
|
+
:labels => metadata[:labels],
|
35
|
+
:access_modes => spec[:accessModes],
|
36
|
+
:mount_options => spec[:mountOptions],
|
37
|
+
:reclaim_policy => spec[:persistentVolumeReclaimPolicy],
|
38
|
+
:storage_class => spec[:storageClassName],
|
39
|
+
:capacity => spec.dig(:capacity, :storage),
|
40
|
+
:claim_ref => spec[:claimRef],
|
41
|
+
:type => type,
|
42
|
+
:config => spec[type&.to_sym],
|
43
|
+
:phase => status[:phase],
|
44
|
+
:reason => status[:reason],
|
45
|
+
:message => status[:message]
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.detect_type(spec)
|
50
|
+
type = ''
|
51
|
+
type = 'awsElasticBlockStore' if spec.keys.include?(:awsElasticBlockStore)
|
52
|
+
type = 'azureDisk' if spec.keys.include?(:azureDisk)
|
53
|
+
type = 'azureFile' if spec.keys.include?(:azureFile)
|
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
|
78
|
+
end
|
6
79
|
end
|
7
80
|
end
|
8
81
|
end
|
@@ -5,7 +5,68 @@ module Fog
|
|
5
5
|
module Kubevirt
|
6
6
|
class Compute
|
7
7
|
class Volumes < Fog::Collection
|
8
|
+
attr_reader :kind, :resource_version
|
9
|
+
|
8
10
|
model Fog::Kubevirt::Compute::Volume
|
11
|
+
|
12
|
+
def all(filters = {})
|
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
|
67
|
+
|
68
|
+
service.delete_volume(name) unless volume.nil?
|
69
|
+
end
|
9
70
|
end
|
10
71
|
end
|
11
72
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Fog
|
2
|
+
module Kubevirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
include Shared
|
6
|
+
|
7
|
+
# creates netwrork attachment definition object
|
8
|
+
# @param net_att[Hash] contains the following elements:
|
9
|
+
# metadata[Hash]: the net-attachment-def metadata:
|
10
|
+
# name[String]: the netwrork attachment definition definition
|
11
|
+
# spec[Hash]: the specification of the attachment, contains:config
|
12
|
+
# config[string]: the configuration of the attachment, i.e.
|
13
|
+
# '{ :cniVersion => "0.3.1", :type => "ovs", :bridge => "red" }'
|
14
|
+
# Example of net_att:
|
15
|
+
# metadata: {
|
16
|
+
# name: "ovs-red"},
|
17
|
+
# spec: {
|
18
|
+
# config: '{ cni_version: "0.3.1", type: "ovs", bridge: "red" }'
|
19
|
+
# }
|
20
|
+
def create_networkattachmentdef(net_att)
|
21
|
+
if net_att.dig(:metadata, :namespace).nil?
|
22
|
+
net_att = deep_merge!(net_att, metadata: { namespace: @namespace })
|
23
|
+
end
|
24
|
+
kube_net_client.create_network_attachment_definition(net_att)
|
25
|
+
rescue ::Fog::Kubevirt::Errors::ClientError => err
|
26
|
+
log.warn(err)
|
27
|
+
raise ::Fog::Kubevirt::Errors::AlreadyExistsError
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Mock
|
32
|
+
def create_networkattachmentdef(_net_att_def)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Fog
|
2
|
+
module Kubevirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def create_service(srv)
|
6
|
+
kube_client.create_service(srv)
|
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_service(srv); end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Fog
|
2
|
+
module Kubevirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def create_volume(volume)
|
6
|
+
kube_client.create_persistent_volume(volume)
|
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_volume(volume)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Fog
|
2
|
+
module Kubevirt
|
3
|
+
class Compute
|
4
|
+
class Real
|
5
|
+
def delete_networkattachmentdef(name, namespace)
|
6
|
+
kube_net_client.delete_network_attachment_definition(name, namespace)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Mock
|
11
|
+
def delete_networkattachmentdef(_name, _namespace)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'recursive_open_struct'
|
2
|
+
|
3
|
+
module Fog
|
4
|
+
module Kubevirt
|
5
|
+
class Compute
|
6
|
+
class Real
|
7
|
+
def get_networkattachmentdef(name)
|
8
|
+
net_attach_def = kube_net_client.get_network_attachment_definition(name, @namespace)
|
9
|
+
Networkattachmentdef.parse object_to_hash(net_attach_def)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Mock
|
14
|
+
def get_networkattachmentdef(name)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|