fog-kubevirt 1.5.1 → 1.6.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/kubevirt/compute/compute.rb +20 -16
- data/lib/fog/kubevirt/compute/models/vm_action.rb +10 -12
- data/lib/fog/kubevirt/compute/models/vm_base.rb +5 -2
- data/lib/fog/kubevirt/compute/models/vm_parser.rb +10 -0
- data/lib/fog/kubevirt/compute/models/vminstance.rb +2 -2
- data/lib/fog/kubevirt/compute/models/vms.rb +18 -14
- data/lib/fog/kubevirt/compute/requests/get_vm.rb +3 -0
- data/lib/fog/kubevirt/compute/requests/get_vminstance.rb +1 -1
- data/lib/fog/kubevirt/version.rb +1 -1
- data/spec/fixtures/kubevirt/vm/vm_create_datavolumetemplate.yml +418 -0
- data/spec/unit/create_vm_spec.rb +49 -1
- data/spec/unit/shared_context.rb +14 -4
- data/spec/unit/vm_action_spec.rb +42 -0
- data/spec/unit/vm_parse_spec.rb +20 -1
- metadata +12 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 05054c8ba7bc9a64d2b38ec7c3398a78a0dc11f2038aa3dbf9ee5e660bf64a54
|
|
4
|
+
data.tar.gz: e60d61a4c4c55d7ef18730e91f9213decd1f38f49d8c2c2e2b903e40961f92c3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8e35bfa0b014cc826d34750ad19273eaf2b60b3b53150183c96e07b98cafdc7a3f62f5d737150fd25c32c9aea2c03ff0aa2482b971bf436ed5e07dbf8dd7ec21
|
|
7
|
+
data.tar.gz: 0247444af17097323b1894c0b1e15883263c4c35e4be36d189f41334491cc664d48591f1489ff752a24454ffb7eeac7af4587ad8c23ccf88ea37eb1a470be2a1
|
|
@@ -139,12 +139,12 @@ module Fog
|
|
|
139
139
|
KUBEVIRT_GROUP = 'kubevirt.io'.freeze
|
|
140
140
|
|
|
141
141
|
#
|
|
142
|
-
# The API group of the Kubernetes network
|
|
142
|
+
# The API group of the Kubernetes network extension:
|
|
143
143
|
#
|
|
144
144
|
NETWORK_GROUP = 'k8s.cni.cncf.io'.freeze
|
|
145
145
|
|
|
146
146
|
#
|
|
147
|
-
# The API group of the Kubernetes
|
|
147
|
+
# The API group of the Kubernetes storage extension:
|
|
148
148
|
#
|
|
149
149
|
STORAGE_GROUP = 'storage.k8s.io'.freeze
|
|
150
150
|
|
|
@@ -455,24 +455,28 @@ module Fog
|
|
|
455
455
|
# @param options [Hash] a hash with connection options
|
|
456
456
|
#
|
|
457
457
|
def obtain_ssl_options(options)
|
|
458
|
-
verify_ssl = options
|
|
458
|
+
verify_ssl = options.fetch(:kubevirt_verify_ssl, true)
|
|
459
459
|
if verify_ssl == true
|
|
460
|
-
ca = options[:kubevirt_ca_cert] || ""
|
|
461
|
-
ca = IO.read(ca) if File.file?(ca)
|
|
462
|
-
certs = ca.split(/(?=-----BEGIN)/).reject(&:empty?).collect do |pem|
|
|
463
|
-
OpenSSL::X509::Certificate.new(pem)
|
|
464
|
-
end
|
|
465
|
-
|
|
466
|
-
cert_store = OpenSSL::X509::Store.new
|
|
467
|
-
certs.each do |cert|
|
|
468
|
-
raise ::Fog::Kubevirt::Errors::ValidationError, "Certificate has been expired" if cert_expired?(cert)
|
|
469
|
-
cert_store.add_cert(cert)
|
|
470
|
-
end
|
|
471
|
-
|
|
472
460
|
ssl_options = {
|
|
473
461
|
:verify_ssl => OpenSSL::SSL::VERIFY_PEER,
|
|
474
|
-
:cert_store => cert_store
|
|
475
462
|
}
|
|
463
|
+
|
|
464
|
+
ca = options[:kubevirt_ca_cert] || ""
|
|
465
|
+
unless ca == ""
|
|
466
|
+
ca = IO.read(ca) if File.file?(ca)
|
|
467
|
+
certs = ca.split(/(?=-----BEGIN)/).reject(&:empty?).collect do |pem|
|
|
468
|
+
OpenSSL::X509::Certificate.new(pem)
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
cert_store = OpenSSL::X509::Store.new
|
|
472
|
+
certs.each do |cert|
|
|
473
|
+
raise ::Fog::Kubevirt::Errors::ValidationError, "Certificate has been expired" if cert_expired?(cert)
|
|
474
|
+
cert_store.add_cert(cert)
|
|
475
|
+
end
|
|
476
|
+
ssl_options[:cert_store] = cert_store
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
ssl_options
|
|
476
480
|
elsif verify_ssl == false || verify_ssl.to_s.empty?
|
|
477
481
|
ssl_options = {
|
|
478
482
|
:verify_ssl => OpenSSL::SSL::VERIFY_NONE
|
|
@@ -2,25 +2,23 @@ module Fog
|
|
|
2
2
|
module Kubevirt
|
|
3
3
|
class Compute
|
|
4
4
|
module VmAction
|
|
5
|
+
# Handles both legacy (spec.running) and modern (spec.runStrategy) formats
|
|
6
|
+
|
|
5
7
|
def start(options = {})
|
|
6
|
-
# Change the `running` attribute to `true` so that the virtual machine controller will take it and
|
|
7
|
-
# create the virtual machine instance.
|
|
8
8
|
vm = service.get_raw_vm(name)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
)
|
|
9
|
+
|
|
10
|
+
spec = vm.dig(:spec, :running).nil? ? { runStrategy: "Always" } : { running: true }
|
|
11
|
+
vm = deep_merge!(vm, :spec => spec)
|
|
12
|
+
|
|
14
13
|
service.update_vm(vm)
|
|
15
14
|
end
|
|
16
15
|
|
|
17
16
|
def stop(options = {})
|
|
18
17
|
vm = service.get_raw_vm(name)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
)
|
|
18
|
+
|
|
19
|
+
spec = vm.dig(:spec, :running).nil? ? { runStrategy: "Halted" } : { running: false }
|
|
20
|
+
vm = deep_merge!(vm, :spec => spec)
|
|
21
|
+
|
|
24
22
|
service.update_vm(vm)
|
|
25
23
|
end
|
|
26
24
|
end
|
|
@@ -19,6 +19,7 @@ module Fog
|
|
|
19
19
|
attribute :memory, :aliases => 'spec_memory'
|
|
20
20
|
attribute :disks, :aliases => 'spec_disks'
|
|
21
21
|
attribute :volumes, :aliases => 'spec_volumes'
|
|
22
|
+
attribute :volume_templates, :aliases => 'spec_volume_templates'
|
|
22
23
|
attribute :status, :aliases => 'spec_running'
|
|
23
24
|
attribute :interfaces, :aliases => 'spec_interfaces'
|
|
24
25
|
attribute :networks, :aliases => 'spec_networks'
|
|
@@ -32,9 +33,10 @@ module Fog
|
|
|
32
33
|
owner = metadata[:ownerReferences]
|
|
33
34
|
annotations = metadata[:annotations]
|
|
34
35
|
cpu = domain[:cpu]
|
|
35
|
-
mem = domain.dig(:resources, :requests, :memory)
|
|
36
|
+
mem = domain.dig(:resources, :requests, :memory) || domain.dig(:memory, :guest)
|
|
36
37
|
disks = parse_disks(domain[:devices][:disks])
|
|
37
38
|
networks = parse_networks(spec[:networks])
|
|
39
|
+
volume_templates = object[:spec][:dataVolumeTemplates]
|
|
38
40
|
vm = {
|
|
39
41
|
:namespace => metadata[:namespace],
|
|
40
42
|
:name => metadata[:name],
|
|
@@ -43,7 +45,7 @@ module Fog
|
|
|
43
45
|
:labels => metadata[:labels],
|
|
44
46
|
:disks => disks,
|
|
45
47
|
:volumes => parse_volumes(spec[:volumes], disks),
|
|
46
|
-
:status => object
|
|
48
|
+
:status => parse_status(object, :printableStatus),
|
|
47
49
|
:interfaces => parse_interfaces(domain[:devices][:interfaces], object[:status].nil? ? [] : object[:status][:interfaces], networks),
|
|
48
50
|
:networks => networks,
|
|
49
51
|
:machine_type => domain.dig(:machine, :type)
|
|
@@ -52,6 +54,7 @@ module Fog
|
|
|
52
54
|
vm[:annotations] = annotations unless annotations.nil?
|
|
53
55
|
vm[:cpu_cores] = cpu[:cores] unless cpu.nil?
|
|
54
56
|
vm[:memory] = mem unless mem.nil?
|
|
57
|
+
vm[:volume_templates] = volume_templates unless volume_templates.nil?
|
|
55
58
|
|
|
56
59
|
vm
|
|
57
60
|
end
|
|
@@ -147,6 +147,16 @@ module Fog
|
|
|
147
147
|
|
|
148
148
|
volumes
|
|
149
149
|
end
|
|
150
|
+
|
|
151
|
+
#
|
|
152
|
+
# Returns the status of the vm
|
|
153
|
+
#
|
|
154
|
+
# @param object [Hash] A hash with raw object data.
|
|
155
|
+
# @param status_key [Symbol] The key of the status to parse, :printableStatus or :phase
|
|
156
|
+
#
|
|
157
|
+
def parse_status(object, status_key)
|
|
158
|
+
object.dig(:status, status_key)&.downcase
|
|
159
|
+
end
|
|
150
160
|
end
|
|
151
161
|
end
|
|
152
162
|
end
|
|
@@ -38,14 +38,14 @@ module Fog
|
|
|
38
38
|
:owner_name => metadata.dig(:ownerReferences, 0, :name),
|
|
39
39
|
:owner_uid => metadata.dig(:ownerReferences, 0, :uid),
|
|
40
40
|
:cpu_cores => domain.dig(:cpu, :cores),
|
|
41
|
-
:memory => domain
|
|
41
|
+
:memory => domain.dig(:resources, :requests, :memory) || domain.dig(:memory, :guest),
|
|
42
42
|
:disks => disks,
|
|
43
43
|
:volumes => parse_volumes(spec[:volumes], disks),
|
|
44
44
|
:interfaces => parse_interfaces(domain[:devices][:interfaces], status[:interfaces], networks),
|
|
45
45
|
:networks => networks,
|
|
46
46
|
:ip_address => status.dig(:interfaces, 0, :ipAddress),
|
|
47
47
|
:node_name => status[:nodeName],
|
|
48
|
-
:status =>
|
|
48
|
+
:status => parse_status(object, :phase)
|
|
49
49
|
}
|
|
50
50
|
end
|
|
51
51
|
end
|
|
@@ -70,6 +70,8 @@ module Fog
|
|
|
70
70
|
#
|
|
71
71
|
# @param [Array] :volumes the volumes (Fog::Kubevirt::Compute::Volume) to be used by the VM
|
|
72
72
|
#
|
|
73
|
+
# @param [Array] :volume_templates the dataVolumeTemplates to be used by the VM
|
|
74
|
+
#
|
|
73
75
|
# @param [Hash] attributes containing details about vm about to be
|
|
74
76
|
# created.
|
|
75
77
|
def create(args = {})
|
|
@@ -81,6 +83,7 @@ module Fog
|
|
|
81
83
|
networks = args.fetch(:networks, nil)
|
|
82
84
|
interfaces = args.fetch(:interfaces, nil)
|
|
83
85
|
vm_volumes = args.fetch(:volumes, nil)
|
|
86
|
+
volume_templates = args.fetch(:volume_templates, nil)
|
|
84
87
|
|
|
85
88
|
if vm_volumes.nil? || vm_volumes.empty?
|
|
86
89
|
raise ::Fog::Kubevirt::Errors::ValidationError
|
|
@@ -177,6 +180,13 @@ module Fog
|
|
|
177
180
|
}
|
|
178
181
|
}
|
|
179
182
|
) unless interfaces.nil?
|
|
183
|
+
|
|
184
|
+
vm = deep_merge!(vm,
|
|
185
|
+
:spec => {
|
|
186
|
+
:dataVolumeTemplates => volume_templates
|
|
187
|
+
}
|
|
188
|
+
) unless volume_templates.nil? || volume_templates.empty?
|
|
189
|
+
|
|
180
190
|
service.create_vm(vm)
|
|
181
191
|
end
|
|
182
192
|
|
|
@@ -190,27 +200,21 @@ module Fog
|
|
|
190
200
|
}
|
|
191
201
|
disk[:bootOrder] = v.boot_order if v.boot_order
|
|
192
202
|
|
|
203
|
+
volume_config = v.config
|
|
193
204
|
if v.type == 'containerDisk'
|
|
194
|
-
|
|
195
|
-
if v.config.nil?
|
|
196
|
-
volumes.push(:name => volume_name, :containerDisk => {:image => v.info})
|
|
197
|
-
else
|
|
198
|
-
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
|
199
|
-
end
|
|
205
|
+
volume_config ||= {:image => v.info}
|
|
200
206
|
disk[:disk][:bus] = v.bus || "virtio"
|
|
201
207
|
elsif v.type == 'persistentVolumeClaim'
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
|
207
|
-
end
|
|
208
|
+
volume_config ||= {:claimName => v.info}
|
|
209
|
+
disk[:disk][:bus] = v.bus || "virtio"
|
|
210
|
+
elsif v.type == 'dataVolume'
|
|
211
|
+
volume_config ||= {:name => v.info}
|
|
208
212
|
disk[:disk][:bus] = v.bus || "virtio"
|
|
209
213
|
else
|
|
210
|
-
# convert type into symbol and pass :config as volume content
|
|
211
|
-
volumes.push(:name => volume_name, v.type.to_sym => v.config)
|
|
212
214
|
disk[:disk][:bus] = v.bus if v.bus
|
|
213
215
|
end
|
|
216
|
+
# convert type into symbol and pass :config as volume content
|
|
217
|
+
volumes.push(:name => volume_name, v.type.to_sym => volume_config)
|
|
214
218
|
disks.push(disk)
|
|
215
219
|
end
|
|
216
220
|
|
data/lib/fog/kubevirt/version.rb
CHANGED
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
---
|
|
2
|
+
http_interactions:
|
|
3
|
+
- request:
|
|
4
|
+
method: get
|
|
5
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io
|
|
6
|
+
body:
|
|
7
|
+
encoding: US-ASCII
|
|
8
|
+
string: ''
|
|
9
|
+
headers:
|
|
10
|
+
Accept:
|
|
11
|
+
- "*/*"
|
|
12
|
+
User-Agent:
|
|
13
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
14
|
+
Authorization:
|
|
15
|
+
- Bearer <TOKEN>
|
|
16
|
+
Accept-Encoding:
|
|
17
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
18
|
+
response:
|
|
19
|
+
status:
|
|
20
|
+
code: 200
|
|
21
|
+
message: OK
|
|
22
|
+
headers:
|
|
23
|
+
Audit-Id:
|
|
24
|
+
- 92782b30-1123-4271-a4ca-a508c96491cd
|
|
25
|
+
Cache-Control:
|
|
26
|
+
- no-cache, private
|
|
27
|
+
Content-Type:
|
|
28
|
+
- application/json
|
|
29
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
30
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
31
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
32
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
33
|
+
Date:
|
|
34
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
35
|
+
Content-Length:
|
|
36
|
+
- '250'
|
|
37
|
+
body:
|
|
38
|
+
encoding: UTF-8
|
|
39
|
+
string: '{"kind":"APIGroup","apiVersion":"v1","name":"kubevirt.io","versions":[{"groupVersion":"kubevirt.io/v1","version":"v1"},{"groupVersion":"kubevirt.io/v1alpha3","version":"v1alpha3"}],"preferredVersion":{"groupVersion":"kubevirt.io/v1","version":"v1"}}
|
|
40
|
+
|
|
41
|
+
'
|
|
42
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
43
|
+
- request:
|
|
44
|
+
method: get
|
|
45
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io
|
|
46
|
+
body:
|
|
47
|
+
encoding: US-ASCII
|
|
48
|
+
string: ''
|
|
49
|
+
headers:
|
|
50
|
+
Accept:
|
|
51
|
+
- "*/*"
|
|
52
|
+
User-Agent:
|
|
53
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
54
|
+
Authorization:
|
|
55
|
+
- Bearer <TOKEN>
|
|
56
|
+
Accept-Encoding:
|
|
57
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
58
|
+
response:
|
|
59
|
+
status:
|
|
60
|
+
code: 200
|
|
61
|
+
message: OK
|
|
62
|
+
headers:
|
|
63
|
+
Audit-Id:
|
|
64
|
+
- 025db81c-d747-4ce1-b33d-0576fed4d10f
|
|
65
|
+
Cache-Control:
|
|
66
|
+
- no-cache, private
|
|
67
|
+
Content-Type:
|
|
68
|
+
- application/json
|
|
69
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
70
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
71
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
72
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
73
|
+
Date:
|
|
74
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
75
|
+
Content-Length:
|
|
76
|
+
- '250'
|
|
77
|
+
body:
|
|
78
|
+
encoding: UTF-8
|
|
79
|
+
string: '{"kind":"APIGroup","apiVersion":"v1","name":"kubevirt.io","versions":[{"groupVersion":"kubevirt.io/v1","version":"v1"},{"groupVersion":"kubevirt.io/v1alpha3","version":"v1alpha3"}],"preferredVersion":{"groupVersion":"kubevirt.io/v1","version":"v1"}}
|
|
80
|
+
|
|
81
|
+
'
|
|
82
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
83
|
+
- request:
|
|
84
|
+
method: get
|
|
85
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io/v1
|
|
86
|
+
body:
|
|
87
|
+
encoding: US-ASCII
|
|
88
|
+
string: ''
|
|
89
|
+
headers:
|
|
90
|
+
Accept:
|
|
91
|
+
- "*/*"
|
|
92
|
+
User-Agent:
|
|
93
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
94
|
+
Authorization:
|
|
95
|
+
- Bearer <TOKEN>
|
|
96
|
+
Accept-Encoding:
|
|
97
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
98
|
+
response:
|
|
99
|
+
status:
|
|
100
|
+
code: 200
|
|
101
|
+
message: OK
|
|
102
|
+
headers:
|
|
103
|
+
Audit-Id:
|
|
104
|
+
- 46df2db5-deb6-4144-831a-679190e944d8
|
|
105
|
+
Cache-Control:
|
|
106
|
+
- no-cache, private
|
|
107
|
+
Content-Type:
|
|
108
|
+
- application/json
|
|
109
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
110
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
111
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
112
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
113
|
+
Date:
|
|
114
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
115
|
+
Transfer-Encoding:
|
|
116
|
+
- chunked
|
|
117
|
+
body:
|
|
118
|
+
encoding: UTF-8
|
|
119
|
+
string: '{"kind":"APIResourceList","apiVersion":"v1","groupVersion":"kubevirt.io/v1","resources":[{"name":"virtualmachineinstances","singularName":"virtualmachineinstance","namespaced":true,"kind":"VirtualMachineInstance","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["vmi","vmis"],"categories":["all"],"storageVersionHash":"1DClFQM6+os="},{"name":"kubevirts","singularName":"kubevirt","namespaced":true,"kind":"KubeVirt","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["kv","kvs"],"categories":["all"],"storageVersionHash":"+s0w/mxiw14="},{"name":"kubevirts/status","singularName":"","namespaced":true,"kind":"KubeVirt","verbs":["get","patch","update"]},{"name":"virtualmachineinstancemigrations","singularName":"virtualmachineinstancemigration","namespaced":true,"kind":"VirtualMachineInstanceMigration","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["vmim","vmims"],"categories":["all"],"storageVersionHash":"ByphcRAtdtg="},{"name":"virtualmachineinstancemigrations/status","singularName":"","namespaced":true,"kind":"VirtualMachineInstanceMigration","verbs":["get","patch","update"]},{"name":"virtualmachineinstancepresets","singularName":"virtualmachineinstancepreset","namespaced":true,"kind":"VirtualMachineInstancePreset","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["vmipreset","vmipresets"],"categories":["all"],"storageVersionHash":"oZZyVoiG8GU="},{"name":"virtualmachineinstancereplicasets","singularName":"virtualmachineinstancereplicaset","namespaced":true,"kind":"VirtualMachineInstanceReplicaSet","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["vmirs","vmirss"],"categories":["all"],"storageVersionHash":"VyiLSe/5A2Q="},{"name":"virtualmachineinstancereplicasets/status","singularName":"","namespaced":true,"kind":"VirtualMachineInstanceReplicaSet","verbs":["get","patch","update"]},{"name":"virtualmachineinstancereplicasets/scale","singularName":"","namespaced":true,"group":"autoscaling","version":"v1","kind":"Scale","verbs":["get","patch","update"]},{"name":"virtualmachines","singularName":"virtualmachine","namespaced":true,"kind":"VirtualMachine","verbs":["delete","deletecollection","get","list","patch","create","update","watch"],"shortNames":["vm","vms"],"categories":["all"],"storageVersionHash":"v2rohjOGqcY="},{"name":"virtualmachines/status","singularName":"","namespaced":true,"kind":"VirtualMachine","verbs":["get","patch","update"]}]}
|
|
120
|
+
|
|
121
|
+
'
|
|
122
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
123
|
+
- request:
|
|
124
|
+
method: post
|
|
125
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io/v1/namespaces/default/virtualmachines
|
|
126
|
+
body:
|
|
127
|
+
encoding: UTF-8
|
|
128
|
+
string: '{"kind":"VirtualMachine","metadata":{"labels":{"kubevirt.io/vm":"test3"},"name":"test3","namespace":"default"},"spec":{"running":false,"template":{"metadata":{"creationTimestamp":null,"labels":{"kubevirt.io/vm":"test3"}},"spec":{"domain":{"devices":{"disks":[{"name":"test3-disk-00","disk":{"bus":"virtio"}}]},"machine":{"type":""},"resources":{"requests":{"memory":"64M"}},"cpu":{"cores":1}},"terminationGracePeriodSeconds":0,"volumes":[{"name":"test3-disk-00","dataVolume":{"name":"rootdisk"}}]}},"dataVolumeTemplates":[{"kind":"DataVolume","metadata":{"name":"rootdisk"},"spec":{"sourceRef":{"kind":"DataSource","name":"centos-stream9-amd64","namespace":"openshift-virtualization-os-images"},"storage":{"resources":{"requests":{"storage":"30Gi"}}}}}]},"apiVersion":"kubevirt.io/v1"}'
|
|
129
|
+
headers:
|
|
130
|
+
Accept:
|
|
131
|
+
- "*/*"
|
|
132
|
+
User-Agent:
|
|
133
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
134
|
+
Content-Type:
|
|
135
|
+
- application/json
|
|
136
|
+
Authorization:
|
|
137
|
+
- Bearer <TOKEN>
|
|
138
|
+
Content-Length:
|
|
139
|
+
- '785'
|
|
140
|
+
Accept-Encoding:
|
|
141
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
142
|
+
response:
|
|
143
|
+
status:
|
|
144
|
+
code: 201
|
|
145
|
+
message: Created
|
|
146
|
+
headers:
|
|
147
|
+
Audit-Id:
|
|
148
|
+
- 87303386-0af4-4481-b3b8-4630a49b32e5
|
|
149
|
+
Cache-Control:
|
|
150
|
+
- no-cache, private
|
|
151
|
+
Content-Type:
|
|
152
|
+
- application/json
|
|
153
|
+
Warning:
|
|
154
|
+
- 299 - "spec.running is deprecated, please use spec.runStrategy instead."
|
|
155
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
156
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
157
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
158
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
159
|
+
Date:
|
|
160
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
161
|
+
Content-Length:
|
|
162
|
+
- '1708'
|
|
163
|
+
body:
|
|
164
|
+
encoding: UTF-8
|
|
165
|
+
string: '{"apiVersion":"kubevirt.io/v1","kind":"VirtualMachine","metadata":{"creationTimestamp":"2026-02-02T08:31:44Z","generation":1,"labels":{"kubevirt.io/vm":"test3"},"managedFields":[{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:dataVolumeTemplates":{},"f:running":{},"f:template":{".":{},"f:metadata":{".":{},"f:creationTimestamp":{},"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:domain":{".":{},"f:cpu":{".":{},"f:cores":{}},"f:devices":{".":{},"f:disks":{}},"f:machine":{".":{},"f:type":{}},"f:resources":{".":{},"f:requests":{".":{},"f:memory":{}}}},"f:terminationGracePeriodSeconds":{},"f:volumes":{}}}}},"manager":"rest-client","operation":"Update","time":"2026-02-02T08:31:44Z"}],"name":"test3","namespace":"default","resourceVersion":"9963","uid":"dc782b0e-605d-414f-a4ea-d25aee5f8057"},"spec":{"dataVolumeTemplates":[{"kind":"DataVolume","metadata":{"creationTimestamp":null,"name":"rootdisk"},"spec":{"sourceRef":{"kind":"DataSource","name":"centos-stream9-amd64","namespace":"openshift-virtualization-os-images"},"storage":{"resources":{"requests":{"storage":"30Gi"}}}}}],"running":false,"template":{"metadata":{"creationTimestamp":null,"labels":{"kubevirt.io/vm":"test3"}},"spec":{"architecture":"amd64","domain":{"cpu":{"cores":1},"devices":{"disks":[{"disk":{"bus":"virtio"},"name":"test3-disk-00"}]},"firmware":{"serial":"7721835a-5fc9-4b1e-ae9d-df7967ef4eac","uuid":"b296e036-6471-48dd-9a39-f504d1bee63d"},"machine":{"type":"q35"},"resources":{"requests":{"memory":"64M"}}},"terminationGracePeriodSeconds":0,"volumes":[{"dataVolume":{"name":"rootdisk"},"name":"test3-disk-00"}]}}}}
|
|
166
|
+
|
|
167
|
+
'
|
|
168
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
169
|
+
- request:
|
|
170
|
+
method: get
|
|
171
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io
|
|
172
|
+
body:
|
|
173
|
+
encoding: US-ASCII
|
|
174
|
+
string: ''
|
|
175
|
+
headers:
|
|
176
|
+
Accept:
|
|
177
|
+
- "*/*"
|
|
178
|
+
User-Agent:
|
|
179
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
180
|
+
Authorization:
|
|
181
|
+
- Bearer <TOKEN>
|
|
182
|
+
Accept-Encoding:
|
|
183
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
184
|
+
response:
|
|
185
|
+
status:
|
|
186
|
+
code: 200
|
|
187
|
+
message: OK
|
|
188
|
+
headers:
|
|
189
|
+
Audit-Id:
|
|
190
|
+
- 7402a48c-74ae-45e3-a1f1-f51f9fdfbb4c
|
|
191
|
+
Cache-Control:
|
|
192
|
+
- no-cache, private
|
|
193
|
+
Content-Type:
|
|
194
|
+
- application/json
|
|
195
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
196
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
197
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
198
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
199
|
+
Date:
|
|
200
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
201
|
+
Content-Length:
|
|
202
|
+
- '250'
|
|
203
|
+
body:
|
|
204
|
+
encoding: UTF-8
|
|
205
|
+
string: '{"kind":"APIGroup","apiVersion":"v1","name":"kubevirt.io","versions":[{"groupVersion":"kubevirt.io/v1","version":"v1"},{"groupVersion":"kubevirt.io/v1alpha3","version":"v1alpha3"}],"preferredVersion":{"groupVersion":"kubevirt.io/v1","version":"v1"}}
|
|
206
|
+
|
|
207
|
+
'
|
|
208
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
209
|
+
- request:
|
|
210
|
+
method: get
|
|
211
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io/v1/namespaces/default/virtualmachines/test3
|
|
212
|
+
body:
|
|
213
|
+
encoding: US-ASCII
|
|
214
|
+
string: ''
|
|
215
|
+
headers:
|
|
216
|
+
Accept:
|
|
217
|
+
- "*/*"
|
|
218
|
+
User-Agent:
|
|
219
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
220
|
+
Authorization:
|
|
221
|
+
- Bearer <TOKEN>
|
|
222
|
+
Accept-Encoding:
|
|
223
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
224
|
+
response:
|
|
225
|
+
status:
|
|
226
|
+
code: 200
|
|
227
|
+
message: OK
|
|
228
|
+
headers:
|
|
229
|
+
Audit-Id:
|
|
230
|
+
- 61cd0820-0e3d-4ddf-8c4d-789573603e86
|
|
231
|
+
Cache-Control:
|
|
232
|
+
- no-cache, private
|
|
233
|
+
Content-Type:
|
|
234
|
+
- application/json
|
|
235
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
236
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
237
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
238
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
239
|
+
Date:
|
|
240
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
241
|
+
Transfer-Encoding:
|
|
242
|
+
- chunked
|
|
243
|
+
body:
|
|
244
|
+
encoding: UTF-8
|
|
245
|
+
string: '{"apiVersion":"kubevirt.io/v1","kind":"VirtualMachine","metadata":{"creationTimestamp":"2026-02-02T08:31:44Z","generation":1,"labels":{"kubevirt.io/vm":"test3"},"managedFields":[{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:dataVolumeTemplates":{},"f:running":{},"f:template":{".":{},"f:metadata":{".":{},"f:creationTimestamp":{},"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:domain":{".":{},"f:cpu":{".":{},"f:cores":{}},"f:devices":{".":{},"f:disks":{}},"f:machine":{".":{},"f:type":{}},"f:resources":{".":{},"f:requests":{".":{},"f:memory":{}}}},"f:terminationGracePeriodSeconds":{},"f:volumes":{}}}}},"manager":"rest-client","operation":"Update","time":"2026-02-02T08:31:44Z"},{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:status":{".":{},"f:printableStatus":{},"f:volumeSnapshotStatuses":{}}},"manager":"virt-controller","operation":"Update","subresource":"status","time":"2026-02-02T08:31:44Z"}],"name":"test3","namespace":"default","resourceVersion":"9964","uid":"dc782b0e-605d-414f-a4ea-d25aee5f8057"},"spec":{"dataVolumeTemplates":[{"kind":"DataVolume","metadata":{"creationTimestamp":null,"name":"rootdisk"},"spec":{"sourceRef":{"kind":"DataSource","name":"centos-stream9-amd64","namespace":"openshift-virtualization-os-images"},"storage":{"resources":{"requests":{"storage":"30Gi"}}}}}],"running":false,"template":{"metadata":{"creationTimestamp":null,"labels":{"kubevirt.io/vm":"test3"}},"spec":{"architecture":"amd64","domain":{"cpu":{"cores":1},"devices":{"disks":[{"disk":{"bus":"virtio"},"name":"test3-disk-00"}]},"firmware":{"serial":"7721835a-5fc9-4b1e-ae9d-df7967ef4eac","uuid":"b296e036-6471-48dd-9a39-f504d1bee63d"},"machine":{"type":"q35"},"resources":{"requests":{"memory":"64M"}}},"terminationGracePeriodSeconds":0,"volumes":[{"dataVolume":{"name":"rootdisk"},"name":"test3-disk-00"}]}}},"status":{"printableStatus":"Stopped","volumeSnapshotStatuses":[{"enabled":false,"name":"test3-disk-00","reason":"PVC
|
|
246
|
+
not found"}]}}
|
|
247
|
+
|
|
248
|
+
'
|
|
249
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
250
|
+
- request:
|
|
251
|
+
method: get
|
|
252
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io
|
|
253
|
+
body:
|
|
254
|
+
encoding: US-ASCII
|
|
255
|
+
string: ''
|
|
256
|
+
headers:
|
|
257
|
+
Accept:
|
|
258
|
+
- "*/*"
|
|
259
|
+
User-Agent:
|
|
260
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
261
|
+
Authorization:
|
|
262
|
+
- Bearer <TOKEN>
|
|
263
|
+
Accept-Encoding:
|
|
264
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
265
|
+
response:
|
|
266
|
+
status:
|
|
267
|
+
code: 200
|
|
268
|
+
message: OK
|
|
269
|
+
headers:
|
|
270
|
+
Audit-Id:
|
|
271
|
+
- 7a9f9add-2e31-4293-a288-4dfe4dea26c6
|
|
272
|
+
Cache-Control:
|
|
273
|
+
- no-cache, private
|
|
274
|
+
Content-Type:
|
|
275
|
+
- application/json
|
|
276
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
277
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
278
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
279
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
280
|
+
Date:
|
|
281
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
282
|
+
Content-Length:
|
|
283
|
+
- '250'
|
|
284
|
+
body:
|
|
285
|
+
encoding: UTF-8
|
|
286
|
+
string: '{"kind":"APIGroup","apiVersion":"v1","name":"kubevirt.io","versions":[{"groupVersion":"kubevirt.io/v1","version":"v1"},{"groupVersion":"kubevirt.io/v1alpha3","version":"v1alpha3"}],"preferredVersion":{"groupVersion":"kubevirt.io/v1","version":"v1"}}
|
|
287
|
+
|
|
288
|
+
'
|
|
289
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
290
|
+
- request:
|
|
291
|
+
method: get
|
|
292
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io/v1/namespaces/default/virtualmachines/test3
|
|
293
|
+
body:
|
|
294
|
+
encoding: US-ASCII
|
|
295
|
+
string: ''
|
|
296
|
+
headers:
|
|
297
|
+
Accept:
|
|
298
|
+
- "*/*"
|
|
299
|
+
User-Agent:
|
|
300
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
301
|
+
Authorization:
|
|
302
|
+
- Bearer <TOKEN>
|
|
303
|
+
Accept-Encoding:
|
|
304
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
305
|
+
response:
|
|
306
|
+
status:
|
|
307
|
+
code: 200
|
|
308
|
+
message: OK
|
|
309
|
+
headers:
|
|
310
|
+
Audit-Id:
|
|
311
|
+
- 3b4bea18-cdfd-4219-9e0b-79fbd49d18eb
|
|
312
|
+
Cache-Control:
|
|
313
|
+
- no-cache, private
|
|
314
|
+
Content-Type:
|
|
315
|
+
- application/json
|
|
316
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
317
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
318
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
319
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
320
|
+
Date:
|
|
321
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
322
|
+
Transfer-Encoding:
|
|
323
|
+
- chunked
|
|
324
|
+
body:
|
|
325
|
+
encoding: UTF-8
|
|
326
|
+
string: '{"apiVersion":"kubevirt.io/v1","kind":"VirtualMachine","metadata":{"annotations":{"kubevirt.io/latest-observed-api-version":"v1","kubevirt.io/storage-observed-api-version":"v1"},"creationTimestamp":"2026-02-02T08:31:44Z","generation":1,"labels":{"kubevirt.io/vm":"test3"},"managedFields":[{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:dataVolumeTemplates":{},"f:running":{},"f:template":{".":{},"f:metadata":{".":{},"f:creationTimestamp":{},"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:domain":{".":{},"f:cpu":{".":{},"f:cores":{}},"f:devices":{".":{},"f:disks":{}},"f:machine":{".":{},"f:type":{}},"f:resources":{".":{},"f:requests":{".":{},"f:memory":{}}}},"f:terminationGracePeriodSeconds":{},"f:volumes":{}}}}},"manager":"rest-client","operation":"Update","time":"2026-02-02T08:31:44Z"},{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:kubevirt.io/latest-observed-api-version":{},"f:kubevirt.io/storage-observed-api-version":{}}}},"manager":"virt-controller","operation":"Update","time":"2026-02-02T08:31:44Z"},{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:status":{".":{},"f:printableStatus":{},"f:volumeSnapshotStatuses":{}}},"manager":"virt-controller","operation":"Update","subresource":"status","time":"2026-02-02T08:31:44Z"}],"name":"test3","namespace":"default","resourceVersion":"9965","uid":"dc782b0e-605d-414f-a4ea-d25aee5f8057"},"spec":{"dataVolumeTemplates":[{"kind":"DataVolume","metadata":{"creationTimestamp":null,"name":"rootdisk"},"spec":{"sourceRef":{"kind":"DataSource","name":"centos-stream9-amd64","namespace":"openshift-virtualization-os-images"},"storage":{"resources":{"requests":{"storage":"30Gi"}}}}}],"running":false,"template":{"metadata":{"creationTimestamp":null,"labels":{"kubevirt.io/vm":"test3"}},"spec":{"architecture":"amd64","domain":{"cpu":{"cores":1},"devices":{"disks":[{"disk":{"bus":"virtio"},"name":"test3-disk-00"}]},"firmware":{"serial":"7721835a-5fc9-4b1e-ae9d-df7967ef4eac","uuid":"b296e036-6471-48dd-9a39-f504d1bee63d"},"machine":{"type":"q35"},"resources":{"requests":{"memory":"64M"}}},"terminationGracePeriodSeconds":0,"volumes":[{"dataVolume":{"name":"rootdisk"},"name":"test3-disk-00"}]}}},"status":{"printableStatus":"Stopped","volumeSnapshotStatuses":[{"enabled":false,"name":"test3-disk-00","reason":"PVC
|
|
327
|
+
not found"}]}}
|
|
328
|
+
|
|
329
|
+
'
|
|
330
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
331
|
+
- request:
|
|
332
|
+
method: get
|
|
333
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io
|
|
334
|
+
body:
|
|
335
|
+
encoding: US-ASCII
|
|
336
|
+
string: ''
|
|
337
|
+
headers:
|
|
338
|
+
Accept:
|
|
339
|
+
- "*/*"
|
|
340
|
+
User-Agent:
|
|
341
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
342
|
+
Authorization:
|
|
343
|
+
- Bearer <TOKEN>
|
|
344
|
+
Accept-Encoding:
|
|
345
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
346
|
+
response:
|
|
347
|
+
status:
|
|
348
|
+
code: 200
|
|
349
|
+
message: OK
|
|
350
|
+
headers:
|
|
351
|
+
Audit-Id:
|
|
352
|
+
- 043362c5-ff14-456f-a1b4-4396073ffee2
|
|
353
|
+
Cache-Control:
|
|
354
|
+
- no-cache, private
|
|
355
|
+
Content-Type:
|
|
356
|
+
- application/json
|
|
357
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
358
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
359
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
360
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
361
|
+
Date:
|
|
362
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
363
|
+
Content-Length:
|
|
364
|
+
- '250'
|
|
365
|
+
body:
|
|
366
|
+
encoding: UTF-8
|
|
367
|
+
string: '{"kind":"APIGroup","apiVersion":"v1","name":"kubevirt.io","versions":[{"groupVersion":"kubevirt.io/v1","version":"v1"},{"groupVersion":"kubevirt.io/v1alpha3","version":"v1alpha3"}],"preferredVersion":{"groupVersion":"kubevirt.io/v1","version":"v1"}}
|
|
368
|
+
|
|
369
|
+
'
|
|
370
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
371
|
+
- request:
|
|
372
|
+
method: delete
|
|
373
|
+
uri: https://10.8.254.82:8443/apis/kubevirt.io/v1/namespaces/default/virtualmachines/test3
|
|
374
|
+
body:
|
|
375
|
+
encoding: US-ASCII
|
|
376
|
+
string: ''
|
|
377
|
+
headers:
|
|
378
|
+
Accept:
|
|
379
|
+
- "*/*"
|
|
380
|
+
User-Agent:
|
|
381
|
+
- rest-client/2.1.0 (linux x86_64) ruby/3.4.8p72
|
|
382
|
+
Content-Type:
|
|
383
|
+
- application/json
|
|
384
|
+
Authorization:
|
|
385
|
+
- Bearer <TOKEN>
|
|
386
|
+
Accept-Encoding:
|
|
387
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
|
388
|
+
response:
|
|
389
|
+
status:
|
|
390
|
+
code: 200
|
|
391
|
+
message: OK
|
|
392
|
+
headers:
|
|
393
|
+
Audit-Id:
|
|
394
|
+
- 8c74f2dc-f98a-4961-973d-37b9d5d703c9
|
|
395
|
+
Cache-Control:
|
|
396
|
+
- no-cache, private
|
|
397
|
+
Content-Type:
|
|
398
|
+
- application/json
|
|
399
|
+
X-Kubernetes-Pf-Flowschema-Uid:
|
|
400
|
+
- 694c729e-11ba-48fc-833c-d1fc30a1e9db
|
|
401
|
+
X-Kubernetes-Pf-Prioritylevel-Uid:
|
|
402
|
+
- 8b7ce27e-8445-48bf-9268-33606f3bc365
|
|
403
|
+
Date:
|
|
404
|
+
- Mon, 02 Feb 2026 08:31:44 GMT
|
|
405
|
+
Transfer-Encoding:
|
|
406
|
+
- chunked
|
|
407
|
+
body:
|
|
408
|
+
encoding: UTF-8
|
|
409
|
+
string: '{"apiVersion":"kubevirt.io/v1","kind":"VirtualMachine","metadata":{"annotations":{"kubevirt.io/latest-observed-api-version":"v1","kubevirt.io/storage-observed-api-version":"v1"},"creationTimestamp":"2026-02-02T08:31:44Z","deletionGracePeriodSeconds":0,"deletionTimestamp":"2026-02-02T08:31:44Z","finalizers":["kubevirt.io/virtualMachineControllerFinalize"],"generation":2,"labels":{"kubevirt.io/vm":"test3"},"managedFields":[{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:dataVolumeTemplates":{},"f:running":{},"f:template":{".":{},"f:metadata":{".":{},"f:creationTimestamp":{},"f:labels":{".":{},"f:kubevirt.io/vm":{}}},"f:spec":{".":{},"f:domain":{".":{},"f:cpu":{".":{},"f:cores":{}},"f:devices":{".":{},"f:disks":{}},"f:machine":{".":{},"f:type":{}},"f:resources":{".":{},"f:requests":{".":{},"f:memory":{}}}},"f:terminationGracePeriodSeconds":{},"f:volumes":{}}}}},"manager":"rest-client","operation":"Update","time":"2026-02-02T08:31:44Z"},{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:metadata":{"f:annotations":{".":{},"f:kubevirt.io/latest-observed-api-version":{},"f:kubevirt.io/storage-observed-api-version":{}},"f:finalizers":{".":{},"v:\"kubevirt.io/virtualMachineControllerFinalize\"":{}}}},"manager":"virt-controller","operation":"Update","time":"2026-02-02T08:31:44Z"},{"apiVersion":"kubevirt.io/v1","fieldsType":"FieldsV1","fieldsV1":{"f:status":{".":{},"f:conditions":{},"f:printableStatus":{},"f:volumeSnapshotStatuses":{}}},"manager":"virt-controller","operation":"Update","subresource":"status","time":"2026-02-02T08:31:44Z"}],"name":"test3","namespace":"default","resourceVersion":"9968","uid":"dc782b0e-605d-414f-a4ea-d25aee5f8057"},"spec":{"dataVolumeTemplates":[{"kind":"DataVolume","metadata":{"creationTimestamp":null,"name":"rootdisk"},"spec":{"sourceRef":{"kind":"DataSource","name":"centos-stream9-amd64","namespace":"openshift-virtualization-os-images"},"storage":{"resources":{"requests":{"storage":"30Gi"}}}}}],"running":false,"template":{"metadata":{"creationTimestamp":null,"labels":{"kubevirt.io/vm":"test3"}},"spec":{"architecture":"amd64","domain":{"cpu":{"cores":1},"devices":{"disks":[{"disk":{"bus":"virtio"},"name":"test3-disk-00"}]},"firmware":{"serial":"7721835a-5fc9-4b1e-ae9d-df7967ef4eac","uuid":"b296e036-6471-48dd-9a39-f504d1bee63d"},"machine":{"type":"q35"},"resources":{"requests":{"memory":"64M"}}},"terminationGracePeriodSeconds":0,"volumes":[{"dataVolume":{"name":"rootdisk"},"name":"test3-disk-00"}]}}},"status":{"conditions":[{"lastProbeTime":"2026-02-02T08:31:44Z","lastTransitionTime":"2026-02-02T08:31:44Z","message":"VMI
|
|
410
|
+
does not exist","reason":"VMINotExists","status":"False","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2026-02-02T08:31:44Z","message":"Error
|
|
411
|
+
encountered while creating DataVolumes: unable to create DataVolume manifest:
|
|
412
|
+
the server could not find the requested resource (get datasources.cdi.kubevirt.io
|
|
413
|
+
centos-stream9-amd64)","reason":"FailedCreate","status":"True","type":"Failure"}],"printableStatus":"Stopped","volumeSnapshotStatuses":[{"enabled":false,"name":"test3-disk-00","reason":"PVC
|
|
414
|
+
not found"}]}}
|
|
415
|
+
|
|
416
|
+
'
|
|
417
|
+
recorded_at: Mon, 02 Feb 2026 08:31:44 GMT
|
|
418
|
+
recorded_with: VCR 6.4.0
|
data/spec/unit/create_vm_spec.rb
CHANGED
|
@@ -128,4 +128,52 @@ describe Fog::Compute do
|
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
end
|
|
131
|
-
|
|
131
|
+
|
|
132
|
+
it 'creates vm using a datavolumetemplate' do
|
|
133
|
+
VCR.use_cassette("vm_create_datavolumetemplate") do
|
|
134
|
+
begin
|
|
135
|
+
vm_name = 'test3'
|
|
136
|
+
cpus = 1
|
|
137
|
+
memory_size = '64'
|
|
138
|
+
memory_unit = 'M'
|
|
139
|
+
|
|
140
|
+
volume_template = {
|
|
141
|
+
:kind=>"DataVolume",
|
|
142
|
+
:metadata=>{:name=>"rootdisk"},
|
|
143
|
+
:spec=>{
|
|
144
|
+
:sourceRef=>{:kind=>"DataSource", :name=>"centos-stream9-amd64", :namespace=>"openshift-virtualization-os-images"},
|
|
145
|
+
:storage=>{:resources=>{:requests=>{:storage=>"30Gi"}}}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
volume = Fog::Kubevirt::Compute::Volume.new
|
|
150
|
+
volume.type = 'dataVolume'
|
|
151
|
+
volume.info = 'rootdisk'
|
|
152
|
+
|
|
153
|
+
@service.vms.create(vm_name: vm_name, cpus: cpus, memory_size: memory_size, memory_unit: memory_unit, volumes: [volume], volume_templates: [volume_template])
|
|
154
|
+
|
|
155
|
+
vm = @service.vms.get(vm_name)
|
|
156
|
+
|
|
157
|
+
# test vm volumes
|
|
158
|
+
volumes = @service.volumes.all vm_name
|
|
159
|
+
assert_equal(volumes.count, 1)
|
|
160
|
+
|
|
161
|
+
# verify volume values
|
|
162
|
+
volume = volumes.first
|
|
163
|
+
refute_nil(volume)
|
|
164
|
+
assert_equal(volume.name, 'test3-disk-00')
|
|
165
|
+
assert_equal(volume.type, 'dataVolume')
|
|
166
|
+
|
|
167
|
+
# verify template values
|
|
168
|
+
template = vm.volume_templates&.first
|
|
169
|
+
refute_nil(template)
|
|
170
|
+
assert_equal(template[:kind], 'DataVolume')
|
|
171
|
+
assert_equal(template[:spec][:sourceRef][:kind], 'DataSource')
|
|
172
|
+
assert_equal(template[:spec][:sourceRef][:name], 'centos-stream9-amd64')
|
|
173
|
+
assert_equal(template[:spec][:sourceRef][:namespace], 'openshift-virtualization-os-images')
|
|
174
|
+
ensure
|
|
175
|
+
@service.vms.delete(vm_name) if vm
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
end
|
data/spec/unit/shared_context.rb
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
require 'vcr'
|
|
2
2
|
|
|
3
|
+
FAKE_HOST = "10.8.254.82"
|
|
4
|
+
FAKE_PORT = "8443"
|
|
5
|
+
|
|
3
6
|
class KubevirtVCR
|
|
4
7
|
attr_reader :service,
|
|
5
8
|
:host,
|
|
@@ -13,8 +16,8 @@ class KubevirtVCR
|
|
|
13
16
|
use_recorded = !ENV.key?('KUBE_HOST') || ENV['USE_VCR'] == 'true'
|
|
14
17
|
if use_recorded
|
|
15
18
|
Fog.interval = 0
|
|
16
|
-
@host =
|
|
17
|
-
@port =
|
|
19
|
+
@host = FAKE_HOST
|
|
20
|
+
@port = FAKE_PORT
|
|
18
21
|
else
|
|
19
22
|
@host = ENV['KUBE_HOST']
|
|
20
23
|
@port = ENV['KUBE_PORT']
|
|
@@ -31,6 +34,12 @@ class KubevirtVCR
|
|
|
31
34
|
else
|
|
32
35
|
config.cassette_library_dir = "spec/debug"
|
|
33
36
|
config.default_cassette_options = {:record => :all}
|
|
37
|
+
|
|
38
|
+
config.filter_sensitive_data('Bearer <TOKEN>') do |interaction|
|
|
39
|
+
interaction.request.headers['Authorization']&.first
|
|
40
|
+
end
|
|
41
|
+
config.filter_sensitive_data(FAKE_HOST) { @host }
|
|
42
|
+
config.filter_sensitive_data(FAKE_PORT) { @port }
|
|
34
43
|
end
|
|
35
44
|
end
|
|
36
45
|
|
|
@@ -44,10 +53,11 @@ class KubevirtVCR
|
|
|
44
53
|
connection_params = {
|
|
45
54
|
kubevirt_hostname: @host,
|
|
46
55
|
kubevirt_port: @port,
|
|
47
|
-
kubevirt_token: @token
|
|
56
|
+
kubevirt_token: @token,
|
|
57
|
+
kubevirt_verify_ssl: false,
|
|
48
58
|
}
|
|
49
59
|
|
|
50
60
|
@service = @service_class.new(connection_params)
|
|
51
61
|
end
|
|
52
62
|
end
|
|
53
|
-
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require_relative './spec_helper'
|
|
2
|
+
|
|
3
|
+
describe 'VmAction' do
|
|
4
|
+
before { Fog.mock! }
|
|
5
|
+
after { Fog.unmock!}
|
|
6
|
+
|
|
7
|
+
describe '#start and #stop' do
|
|
8
|
+
it 'changes running state for legacy VM' do
|
|
9
|
+
service = Fog::Kubevirt::Compute.new
|
|
10
|
+
|
|
11
|
+
vm_state = service.get_raw_vm('test')
|
|
12
|
+
service.define_singleton_method(:get_raw_vm) { |n| vm_state }
|
|
13
|
+
service.define_singleton_method(:update_vm) { |v| vm_state.replace(v) }
|
|
14
|
+
|
|
15
|
+
vm = service.vms.get('test')
|
|
16
|
+
|
|
17
|
+
vm.start
|
|
18
|
+
assert_equal true, vm_state[:spec][:running]
|
|
19
|
+
|
|
20
|
+
vm.stop
|
|
21
|
+
assert_equal false, vm_state[:spec][:running]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'changes runStrategy state' do
|
|
25
|
+
service = Fog::Kubevirt::Compute.new
|
|
26
|
+
|
|
27
|
+
vm_state = service.get_raw_vm('test')
|
|
28
|
+
vm_state[:spec].delete(:running)
|
|
29
|
+
vm_state[:spec][:runStrategy] = 'Halted'
|
|
30
|
+
service.define_singleton_method(:get_raw_vm) { |n| vm_state }
|
|
31
|
+
service.define_singleton_method(:update_vm) { |v| vm_state.replace(v) }
|
|
32
|
+
|
|
33
|
+
vm = service.vms.get('test')
|
|
34
|
+
|
|
35
|
+
vm.start
|
|
36
|
+
assert_equal 'Always', vm_state[:spec][:runStrategy]
|
|
37
|
+
|
|
38
|
+
vm.stop
|
|
39
|
+
assert_equal 'Halted', vm_state[:spec][:runStrategy]
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
data/spec/unit/vm_parse_spec.rb
CHANGED
|
@@ -42,4 +42,23 @@ describe Fog::Kubevirt::Compute do
|
|
|
42
42
|
assert_equal(vm[:interfaces][1].cni_provider, "multus")
|
|
43
43
|
Fog.unmock!
|
|
44
44
|
end
|
|
45
|
-
|
|
45
|
+
|
|
46
|
+
it 'parses vm status' do
|
|
47
|
+
Fog.mock!
|
|
48
|
+
mock = Fog::Kubevirt::Compute.new
|
|
49
|
+
vm = mock.get_vm('test')
|
|
50
|
+
|
|
51
|
+
assert_equal(vm[:status], "running")
|
|
52
|
+
Fog.unmock!
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it 'parses vmi status' do
|
|
56
|
+
Fog.mock!
|
|
57
|
+
mock = Fog::Kubevirt::Compute.new
|
|
58
|
+
vmi = mock.get_vminstance('test')
|
|
59
|
+
|
|
60
|
+
# phase value is used for the status in vminstance.rb, not printableStatus
|
|
61
|
+
assert_equal(vmi[:status], "running")
|
|
62
|
+
Fog.unmock!
|
|
63
|
+
end
|
|
64
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: fog-kubevirt
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Piotr Kliczewski
|
|
@@ -14,6 +14,8 @@ authors:
|
|
|
14
14
|
- yifatmakias
|
|
15
15
|
- Beni Cherniavsky-Paskin
|
|
16
16
|
- Leos Stejskal
|
|
17
|
+
- Arvind Jangir
|
|
18
|
+
- Evgeni Golov
|
|
17
19
|
- Wesley Beary
|
|
18
20
|
bindir: bin
|
|
19
21
|
cert_chain: []
|
|
@@ -81,14 +83,14 @@ dependencies:
|
|
|
81
83
|
requirements:
|
|
82
84
|
- - "~>"
|
|
83
85
|
- !ruby/object:Gem::Version
|
|
84
|
-
version: '
|
|
86
|
+
version: '6.0'
|
|
85
87
|
type: :development
|
|
86
88
|
prerelease: false
|
|
87
89
|
version_requirements: !ruby/object:Gem::Requirement
|
|
88
90
|
requirements:
|
|
89
91
|
- - "~>"
|
|
90
92
|
- !ruby/object:Gem::Version
|
|
91
|
-
version: '
|
|
93
|
+
version: '6.0'
|
|
92
94
|
- !ruby/object:Gem::Dependency
|
|
93
95
|
name: webmock
|
|
94
96
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -148,7 +150,9 @@ email:
|
|
|
148
150
|
- shiramaximov@gmail.com
|
|
149
151
|
- ymakias@redhat.com
|
|
150
152
|
- cben@redhat.com
|
|
151
|
-
-
|
|
153
|
+
- github@stejskalleos.cz
|
|
154
|
+
- ajangir@ajangir-thinkpadt14gen5.punetw6.csb
|
|
155
|
+
- evgeni@golov.de
|
|
152
156
|
- geemus@gmail.com
|
|
153
157
|
executables: []
|
|
154
158
|
extensions: []
|
|
@@ -233,6 +237,7 @@ files:
|
|
|
233
237
|
- spec/fixtures/kubevirt/server/server_ops.yml
|
|
234
238
|
- spec/fixtures/kubevirt/service/services_crud.yml
|
|
235
239
|
- spec/fixtures/kubevirt/storageclass/storageclasses_crud.yml
|
|
240
|
+
- spec/fixtures/kubevirt/vm/vm_create_datavolumetemplate.yml
|
|
236
241
|
- spec/fixtures/kubevirt/vm/vm_create_multi.yml
|
|
237
242
|
- spec/fixtures/kubevirt/vm/vm_create_single.yml
|
|
238
243
|
- spec/integration/mac_vmi_spec.rb
|
|
@@ -250,6 +255,7 @@ files:
|
|
|
250
255
|
- spec/unit/spec_helper.rb
|
|
251
256
|
- spec/unit/storage_classes_v1_spec.rb
|
|
252
257
|
- spec/unit/unit_converter_spec.rb
|
|
258
|
+
- spec/unit/vm_action_spec.rb
|
|
253
259
|
- spec/unit/vm_parse_spec.rb
|
|
254
260
|
homepage: https://github.com/fog/fog-kubevirt
|
|
255
261
|
licenses:
|
|
@@ -280,6 +286,7 @@ test_files:
|
|
|
280
286
|
- spec/fixtures/kubevirt/server/server_ops.yml
|
|
281
287
|
- spec/fixtures/kubevirt/service/services_crud.yml
|
|
282
288
|
- spec/fixtures/kubevirt/storageclass/storageclasses_crud.yml
|
|
289
|
+
- spec/fixtures/kubevirt/vm/vm_create_datavolumetemplate.yml
|
|
283
290
|
- spec/fixtures/kubevirt/vm/vm_create_multi.yml
|
|
284
291
|
- spec/fixtures/kubevirt/vm/vm_create_single.yml
|
|
285
292
|
- spec/integration/mac_vmi_spec.rb
|
|
@@ -297,4 +304,5 @@ test_files:
|
|
|
297
304
|
- spec/unit/spec_helper.rb
|
|
298
305
|
- spec/unit/storage_classes_v1_spec.rb
|
|
299
306
|
- spec/unit/unit_converter_spec.rb
|
|
307
|
+
- spec/unit/vm_action_spec.rb
|
|
300
308
|
- spec/unit/vm_parse_spec.rb
|