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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49c14aaea8d117a03c0f8c26bf55e23583ff34f13bcae2d057dcc156d9eca96d
4
- data.tar.gz: 5b2bdbde329ec9538ca28e9eba8170ae796b27c0f655bdad61c8a848146e2e64
3
+ metadata.gz: 05054c8ba7bc9a64d2b38ec7c3398a78a0dc11f2038aa3dbf9ee5e660bf64a54
4
+ data.tar.gz: e60d61a4c4c55d7ef18730e91f9213decd1f38f49d8c2c2e2b903e40961f92c3
5
5
  SHA512:
6
- metadata.gz: bf0a21dbb31e75f9de59c63a3db63dc67e366107b2250c76225ed56e22e63806b417bc2430ed9bd27121a3bacf5679ad381c86df01feb996be5aa882a927b107
7
- data.tar.gz: 963f4148b08ff03767982976affac102d2019eb215b5c10b08410899e130256a62a5b3dfd7ffee957140bfc647259506354428662d07f0886036d18b1f36174b
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 extention:
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 network extention:
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[:kubevirt_verify_ssl]
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
- vm = deep_merge!(vm,
10
- :spec => {
11
- :running => true
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
- vm = deep_merge!(vm,
20
- :spec => {
21
- :running => false
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[:spec][:running].to_s == "true" ? "running" : "stopped",
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[:resources][:requests][:memory],
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 => status[:phase]
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
- # set image
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
- # set claim
203
- if v.config.nil?
204
- volumes.push(:name => volume_name, :persistentVolumeClaim => {:claimName => v.info})
205
- else
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
 
@@ -122,6 +122,9 @@ module Fog
122
122
  ]
123
123
  }
124
124
  }
125
+ },
126
+ :status=>{
127
+ :printableStatus=>"Running",
125
128
  }
126
129
  }
127
130
  end
@@ -114,7 +114,7 @@ module Fog
114
114
  ],
115
115
  :migrationMethod=>"BlockMigration",
116
116
  :nodeName=>"node02",
117
- :phase=>"Running"
117
+ :phase=>"Running",
118
118
  }
119
119
  }
120
120
  Vminstance.parse object_to_hash(vm)
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Kubevirt
3
- VERSION = '1.5.1'
3
+ VERSION = '1.6.0'
4
4
  end
5
5
  end
@@ -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
@@ -128,4 +128,52 @@ describe Fog::Compute do
128
128
  end
129
129
  end
130
130
  end
131
- end
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
@@ -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 = "10.8.254.82"
17
- @port = "8443"
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
@@ -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
- end
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.5.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: '4.0'
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: '4.0'
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
- - lstejska@redhat.com
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