foreman_kubevirt 0.5.4 → 0.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: 047c3c576cffc11ac38028063e77ae28ee2c745a8d52cb15e850302d8e8ae7b9
4
- data.tar.gz: e6702a70f3f11f02308fe60fee93e249651130da0b5be3d2c6a0aed738a0937a
3
+ metadata.gz: 783060e275700cf232b4068e0aa0ca75b4f790805fa30b95f19148f15e9ca5a5
4
+ data.tar.gz: ec15a1ba2ce6c55f570e489b25ab8fb4d68d7ac26ee9714707dc3483d2b03abb
5
5
  SHA512:
6
- metadata.gz: 26662b78b48492daccf15104cdb60007dfefca4b54dc3220236a5c1352ba34d5bc0e73427ae766964d62cd793116dde28e9435ada4f766da926a3e32448027f8
7
- data.tar.gz: 3ea4e5596fc47f99c3c6da252a6222c85881b277d067a5b45a429bd1e03f1618b16431cdcc00662f7a75f7f2e110b731ad9bbca253be42577d1de7ab102e4e4b
6
+ metadata.gz: 9070f9c4676ebc0aa275a486a831da1bcdde007fdbf318866a554c50c5ce81219a93ba2e9f3a68116658ca8e7c235ef9e5df382b8d3cbdd6169673087f3a7ca5
7
+ data.tar.gz: 2f7e8c104bb2695c3be90bc8b9d8a44b68c352f4922cd78343efbf428bf6de6055f617faeb22a12609ffaebd4c8ea3e19af698428642d995091514d0e3700b53
@@ -180,23 +180,27 @@ module ForemanKubevirt
180
180
  logger.debug("creating VM with the following options: #{options.inspect}")
181
181
 
182
182
  # Add clound init user data
183
- user_data = { "userData" => options[:user_data] } if options[:user_data].present?
183
+ user_data = options[:user_data]
184
184
 
185
185
  begin
186
186
  volumes, volume_templates = create_volumes_for_vm(options)
187
187
  interfaces, networks = create_network_devices_for_vm(options, volumes)
188
+ userdata_secret = create_userdata_secret(user_data, options[:name]) if user_data.present?
188
189
  client.vms.create(:vm_name => options[:name],
189
190
  :cpus => options[:cpu_cores].to_i,
190
191
  :memory_size => convert_memory(options[:memory] + "b", :mi).to_s,
191
192
  :memory_unit => "Mi",
192
193
  :volumes => volumes,
193
194
  :volume_templates => volume_templates,
194
- :cloudinit => user_data,
195
+ :cloudinit => userdata_secret_ref(userdata_secret),
195
196
  :networks => networks,
196
197
  :interfaces => interfaces)
197
- client.servers.get(options[:name])
198
+ vm = client.servers.get(options[:name])
199
+ update_userdata_secret_owner(userdata_secret, options[:name], vm.uid) if userdata_secret.present?
200
+ vm
198
201
  rescue Exception => e
199
202
  delete_pvcs(volumes) if volumes
203
+ delete_userdata_secret(userdata_secret) if userdata_secret.present?
200
204
  raise e
201
205
  end
202
206
  end
@@ -530,6 +534,35 @@ module ForemanKubevirt
530
534
  [interfaces, networks]
531
535
  end
532
536
 
537
+ def create_userdata_secret(user_data, vm_name)
538
+ client.secrets.create(:name => "#{vm_name}-userdata", :namespace => namespace, :data => { "userData" => Base64.encode64(user_data) })
539
+ end
540
+
541
+ # Update the owner reference of the userdata secret to the VM
542
+ # This is needed to ensure that the secret is deleted when the VM is deleted
543
+ def update_userdata_secret_owner(secret, vm_name, vm_uid)
544
+ secret.metadata['ownerReferences'] = [{
545
+ apiVersion: "kubevirt.io/v1",
546
+ kind: "VirtualMachine",
547
+ name: vm_name,
548
+ uid: vm_uid
549
+ }]
550
+ secret.save
551
+ end
552
+
553
+ def delete_userdata_secret(secret)
554
+ secret.destroy
555
+ end
556
+
557
+ def userdata_secret_ref(userdata_secret)
558
+ return nil if userdata_secret.nil?
559
+ {
560
+ 'secretRef': {
561
+ name: userdata_secret.name,
562
+ }
563
+ }
564
+ end
565
+
533
566
  def convert_memory(memory, unit)
534
567
  ::Fog::Kubevirt::Utils::UnitConverter.convert(memory, unit).to_i
535
568
  end
@@ -1,3 +1,3 @@
1
1
  module ForemanKubevirt
2
- VERSION = '0.5.4'.freeze
2
+ VERSION = '0.6.0'.freeze
3
3
  end
@@ -16,16 +16,27 @@ class ForemanKubevirtTest < ActiveSupport::TestCase
16
16
  pvcs.stubs(:delete)
17
17
  servers = stub
18
18
  servers.stubs(:get)
19
+ secrets = stub
19
20
  storageclasses = stub
20
21
  storageclasses.stubs(:all).returns([{ 'name': 'local' }])
21
22
  client = stub
22
23
  client.stubs(:vms).returns(vms)
23
24
  client.stubs(:pvcs).returns(pvcs)
24
25
  client.stubs(:servers).returns(servers)
26
+ client.stubs(:secrets).returns(secrets)
25
27
  client.stubs(:storageclasses).returns(storageclasses)
26
28
  client
27
29
  end
28
30
 
31
+ def mock_userdata_secret(name: "test-userdata")
32
+ metadata = {}
33
+ secret = stub(name: name)
34
+ secret.stubs(:metadata).returns(metadata)
35
+ secret.stubs(:save)
36
+ secret.stubs(:destroy)
37
+ secret
38
+ end
39
+
29
40
  test "host_interfaces_attrs" do
30
41
  record = new_kubevirt_vcr
31
42
  host = ::FactoryBot.build(:host_kubevirt, :with_interfaces)
@@ -103,6 +114,89 @@ class ForemanKubevirtTest < ActiveSupport::TestCase
103
114
  end
104
115
  assert_match(/A bootable volume is required as a target for the image/, error.message)
105
116
  end
117
+
118
+ test "without user_data, cloudinit is nil" do
119
+ record = new_kubevirt_vcr
120
+ client = mocked_client
121
+ record.stubs(:client).returns(client)
122
+
123
+ client.vms.expects(:create).with do |args|
124
+ assert_nil args[:cloudinit]
125
+ end
126
+
127
+ record.create_vm({ :name => "test", :volumes_attributes => { 0 => { :capacity => "5" } }, :interfaces_attributes => { "0" => { "cni_provider" => "multus", "network" => "default/network" } } })
128
+ end
129
+
130
+ test "with user_data, creates secret and passes secretRef" do
131
+ record = new_kubevirt_vcr
132
+ client = mocked_client
133
+ record.stubs(:client).returns(client)
134
+
135
+ user_data = "#!/bin/bash\necho hello"
136
+ mock_secret = mock_userdata_secret(name: "test-userdata")
137
+
138
+ client.secrets.expects(:create).with do |args|
139
+ assert_equal "test-userdata", args[:name]
140
+ assert_equal record.namespace, args[:namespace]
141
+ assert_equal Base64.encode64(user_data), args[:data]["userData"]
142
+ end.returns(mock_secret)
143
+
144
+ client.vms.expects(:create).with do |args|
145
+ assert_equal({ secretRef: { name: "test-userdata" } }, args[:cloudinit])
146
+ end
147
+
148
+ vm = stub(uid: "vm-uid-123")
149
+ client.servers.stubs(:get).with("test").returns(vm)
150
+
151
+ record.create_vm({ :name => "test", :user_data => user_data, :volumes_attributes => { 0 => { :capacity => "5" } }, :interfaces_attributes => { "0" => { "cni_provider" => "multus", "network" => "default/network" } } })
152
+ end
153
+
154
+ test "with user_data, updates secret owner after VM creation" do
155
+ record = new_kubevirt_vcr
156
+ client = mocked_client
157
+ record.stubs(:client).returns(client)
158
+
159
+ user_data = "#!/bin/bash\necho hello"
160
+ metadata = {}
161
+ mock_secret = stub(name: "test-userdata")
162
+ mock_secret.stubs(:metadata).returns(metadata)
163
+ mock_secret.stubs(:save)
164
+ mock_secret.stubs(:destroy)
165
+
166
+ client.secrets.expects(:create).returns(mock_secret)
167
+
168
+ client.vms.expects(:create)
169
+ vm = stub(uid: "vm-uid-456")
170
+ client.servers.stubs(:get).with("test").returns(vm)
171
+
172
+ mock_secret.expects(:save).once
173
+
174
+ record.create_vm({ :name => "test", :user_data => user_data, :volumes_attributes => { 0 => { :capacity => "5" } }, :interfaces_attributes => { "0" => { "cni_provider" => "multus", "network" => "default/network" } } })
175
+
176
+ assert_equal 1, metadata["ownerReferences"].length
177
+ assert_equal "kubevirt.io/v1", metadata["ownerReferences"][0][:apiVersion]
178
+ assert_equal "VirtualMachine", metadata["ownerReferences"][0][:kind]
179
+ assert_equal "test", metadata["ownerReferences"][0][:name]
180
+ assert_equal "vm-uid-456", metadata["ownerReferences"][0][:uid]
181
+ end
182
+
183
+ test "with user_data, on exception destroys secret" do
184
+ record = new_kubevirt_vcr
185
+ client = mocked_client
186
+ record.stubs(:client).returns(client)
187
+
188
+ user_data = "#!/bin/bash\necho hello"
189
+ mock_secret = mock_userdata_secret(name: "test-userdata")
190
+
191
+ client.secrets.expects(:create).returns(mock_secret)
192
+ client.vms.expects(:create).raises(StandardError.new("vm create failed"))
193
+ mock_secret.expects(:destroy).once
194
+
195
+ error = assert_raises(StandardError) do
196
+ record.create_vm({ :name => "test", :user_data => user_data, :volumes_attributes => { 0 => { :capacity => "5" } }, :interfaces_attributes => { "0" => { "cni_provider" => "multus", "network" => "default/network" } } })
197
+ end
198
+ assert_equal "vm create failed", error.message
199
+ end
106
200
  end
107
201
 
108
202
  describe "create_network_element" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: foreman_kubevirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Moti Asayag
@@ -15,7 +15,7 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: 1.6.0
18
+ version: 1.7.0
19
19
  - - "<"
20
20
  - !ruby/object:Gem::Version
21
21
  version: '2'
@@ -25,7 +25,7 @@ dependencies:
25
25
  requirements:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
- version: 1.6.0
28
+ version: 1.7.0
29
29
  - - "<"
30
30
  - !ruby/object:Gem::Version
31
31
  version: '2'
@@ -150,7 +150,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
150
  - !ruby/object:Gem::Version
151
151
  version: '0'
152
152
  requirements: []
153
- rubygems_version: 4.0.3
153
+ rubygems_version: 4.0.6
154
154
  specification_version: 4
155
155
  summary: Provision and manage Kubevirt Virtual Machines from Foreman
156
156
  test_files: