foreman_kubevirt 0.1.4 → 0.1.5
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/app/controllers/foreman_kubevirt/concerns/api/compute_resources_controller_extensions.rb +0 -8
- data/app/models/foreman_kubevirt/compute_attribute_extensions.rb +8 -0
- data/app/models/foreman_kubevirt/kubevirt.rb +63 -14
- data/app/validators/volume_validator.rb +9 -0
- data/app/views/compute_resources/form/_kubevirt.html.erb +3 -1
- data/app/views/compute_resources_vms/form/kubevirt/_volume.html.erb +5 -2
- data/lib/foreman_kubevirt/engine.rb +2 -0
- data/lib/foreman_kubevirt/version.rb +1 -1
- data/test/unit/foreman_kubevirt_test.rb +14 -1
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fee0a645f764e86b484cfc3655738b44336a596da85c135e381ec0ae8cf856fd
|
4
|
+
data.tar.gz: b109ec03942dd9cad8832f63e276fede175d6f7899c40cd6aacac578e956fee8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0d4ad6baf08d620d48c3b35e687bdcb61d967ea09bd4eabdd92316f29b57ceba1afa482df5417ec86d5f4218e0ce9e2dcce00800f59bf5ca57ec2aeeb1645bba
|
7
|
+
data.tar.gz: 4353bd71b0ad05b9584882ceebdc8f76667e47a025ba09d0a1d5642818bbf1b10d4325ae86c79e41a752fc7ac89c3bc538d7d97225254951df065e3ca7c95092
|
data/app/controllers/foreman_kubevirt/concerns/api/compute_resources_controller_extensions.rb
CHANGED
@@ -2,7 +2,6 @@ module ForemanKubevirt
|
|
2
2
|
module Concerns
|
3
3
|
module Api
|
4
4
|
module ComputeResourcesControllerExtensions
|
5
|
-
module ApiPieExtensions
|
6
5
|
extend ::Apipie::DSL::Concern
|
7
6
|
update_api(:create, :update) do
|
8
7
|
param :compute_resource, Hash do
|
@@ -14,13 +13,6 @@ module ForemanKubevirt
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
end
|
17
|
-
end
|
18
|
-
|
19
|
-
extend ActiveSupport::Concern
|
20
|
-
|
21
|
-
included do
|
22
|
-
include ApiPieExtensions
|
23
|
-
end
|
24
16
|
end
|
25
17
|
end
|
26
18
|
end
|
@@ -6,7 +6,7 @@ module ForemanKubevirt
|
|
6
6
|
alias_attribute :token, :password
|
7
7
|
alias_attribute :namespace, :user
|
8
8
|
validates :hostname, :api_port, :namespace, :token, :presence => true
|
9
|
-
|
9
|
+
after_validation :validate_connectivity unless Rails.env.test?
|
10
10
|
|
11
11
|
def ca_cert
|
12
12
|
attrs[:ca_cert]
|
@@ -52,13 +52,33 @@ module ForemanKubevirt
|
|
52
52
|
ComputeResource.model_name
|
53
53
|
end
|
54
54
|
|
55
|
-
def test_connection(
|
56
|
-
|
55
|
+
def test_connection(options = {})
|
56
|
+
super
|
57
|
+
validate_connectivity(options)
|
58
|
+
end
|
59
|
+
|
60
|
+
def caching_enabled
|
61
|
+
false
|
62
|
+
end
|
63
|
+
|
64
|
+
def validate_connectivity(options = {})
|
65
|
+
return unless connection_properties_valid?
|
66
|
+
return false if errors.any?
|
57
67
|
client&.valid? && client&.virt_supported?
|
58
68
|
rescue StandardError => e
|
59
|
-
|
69
|
+
if e.message =~ /401/
|
70
|
+
errors[:base] << _('The compute resource could not be authenticated')
|
71
|
+
else
|
72
|
+
errors[:base] << e.message
|
73
|
+
end
|
60
74
|
end
|
61
75
|
|
76
|
+
def connection_properties_valid?
|
77
|
+
errors[:hostname].empty? && errors[:token].empty? && errors[:namespace].empty? && errors[:api_port].empty?
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
|
62
82
|
def networks
|
63
83
|
client.networkattachmentdefs.all
|
64
84
|
rescue StandardError => e
|
@@ -86,11 +106,13 @@ module ForemanKubevirt
|
|
86
106
|
storage_classes.map { |sc| OpenStruct.new(id: sc.name, description: "#{sc.name} (#{sc.provisioner})") }
|
87
107
|
end
|
88
108
|
|
89
|
-
def new_volume(attr = {})
|
90
|
-
return unless new_volume_errors.empty?
|
91
109
|
|
92
|
-
|
93
|
-
|
110
|
+
def new_volume(attrs = {})
|
111
|
+
return unless new_volume_errors.empty?
|
112
|
+
capacity = attrs.delete(:capacity)
|
113
|
+
args = {capacity: capacity}.merge(attrs)
|
114
|
+
vol = Fog::Kubevirt::Compute::Volume.new(args)
|
115
|
+
vol.boot_order = 1 if args[:bootable] == "on" || args[:bootable] == "true"
|
94
116
|
vol
|
95
117
|
end
|
96
118
|
|
@@ -140,12 +162,12 @@ module ForemanKubevirt
|
|
140
162
|
options = vm_instance_defaults.merge(args.to_hash.deep_symbolize_keys)
|
141
163
|
logger.debug("creating VM with the following options: #{options.inspect}")
|
142
164
|
|
143
|
-
volumes = create_volumes_for_vm(options)
|
144
|
-
interfaces, networks = create_network_devices_for_vm(options, volumes)
|
145
165
|
# Add clound init user data
|
146
166
|
user_data = { "userData" => options[:user_data] } if options[:user_data].present?
|
147
167
|
|
148
168
|
begin
|
169
|
+
volumes = create_volumes_for_vm(options)
|
170
|
+
interfaces, networks = create_network_devices_for_vm(options, volumes)
|
149
171
|
client.vms.create(:vm_name => options[:name],
|
150
172
|
:cpus => options[:cpu_cores].to_i,
|
151
173
|
:memory_size => convert_memory(options[:memory] + "b", :mi).to_s,
|
@@ -155,8 +177,8 @@ module ForemanKubevirt
|
|
155
177
|
:networks => networks,
|
156
178
|
:interfaces => interfaces)
|
157
179
|
client.servers.get(options[:name])
|
158
|
-
rescue
|
159
|
-
delete_pvcs(volumes)
|
180
|
+
rescue Exception => e
|
181
|
+
delete_pvcs(volumes) if volumes
|
160
182
|
raise e
|
161
183
|
end
|
162
184
|
end
|
@@ -272,6 +294,29 @@ module ForemanKubevirt
|
|
272
294
|
convert_memory(memory, :b)
|
273
295
|
end
|
274
296
|
|
297
|
+
def plain_kubevirt_protocol
|
298
|
+
"plain.kubevirt.io".freeze
|
299
|
+
end
|
300
|
+
|
301
|
+
def token_protocol(token)
|
302
|
+
"base64url.bearer.authorization.k8s.io.#{token}"
|
303
|
+
end
|
304
|
+
|
305
|
+
def console(uuid)
|
306
|
+
vm = find_vm_by_uuid(uuid)
|
307
|
+
vnc_details = client.vminstances.get_vnc_console_details(vm.name, namespace)
|
308
|
+
token = Base64.encode64(vnc_details[:token]).delete!("\n").delete("==")
|
309
|
+
{
|
310
|
+
:host => vnc_details[:host],
|
311
|
+
:port => vnc_details[:port],
|
312
|
+
:path => vnc_details[:path],
|
313
|
+
:token_protocol => token_protocol(token),
|
314
|
+
:plain_protocol => plain_kubevirt_protocol,
|
315
|
+
:type => 'vnc',
|
316
|
+
:encrypt => true
|
317
|
+
}
|
318
|
+
end
|
319
|
+
|
275
320
|
protected
|
276
321
|
|
277
322
|
def client
|
@@ -333,7 +378,11 @@ module ForemanKubevirt
|
|
333
378
|
end
|
334
379
|
|
335
380
|
def validate_volume_capacity(volumes_attributes)
|
336
|
-
volumes_attributes.each
|
381
|
+
volumes_attributes.each do |_, vol|
|
382
|
+
if vol[:capacity].to_s.empty? || /\A\d+G?\Z/.match(vol[:capacity].to_s).nil?
|
383
|
+
raise Foreman::Exception.new(N_("Volume size #{vol[:capacity]} is not valid"))
|
384
|
+
end
|
385
|
+
end
|
337
386
|
end
|
338
387
|
|
339
388
|
def validate_only_single_bootable_volume(volumes_attributes)
|
@@ -422,8 +471,8 @@ module ForemanKubevirt
|
|
422
471
|
def create_network_devices_for_vm(options, volumes)
|
423
472
|
interfaces = []
|
424
473
|
networks = []
|
425
|
-
|
426
474
|
options[:interfaces_attributes].values.each do |iface|
|
475
|
+
raise ::Foreman::Exception.new N_('cni_provider or network are missing') unless (iface.key?(:cni_provider) && iface.key?(:network))
|
427
476
|
if iface[:cni_provider] == 'pod'
|
428
477
|
nic, net = create_pod_network_element
|
429
478
|
else
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class VolumeValidator < ActiveModel::EachValidator
|
2
|
+
def validate_each(record, attribute, value)
|
3
|
+
value[:volumes_attributes].each do |_, attrs|
|
4
|
+
if attrs["capacity"].to_s.empty? || /\A\d+G?\Z/.match(attrs["capacity"].to_s).nil?
|
5
|
+
record.errors.add(attribute, _("Volume size #{attrs["capacity"]} is not valid"))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
end
|
@@ -5,7 +5,9 @@
|
|
5
5
|
:keep_value => true, :unset => unset_password?,
|
6
6
|
:help_block => _("e.g. eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9..."),
|
7
7
|
:help_inline => documentation_button('/foreman_kubevirt/0.x/index.html#4.1SettingComputeResourceTokenandX509CAvalues',
|
8
|
-
|
8
|
+
:root_url => 'https://theforeman.org/plugins'),
|
9
|
+
:id => "compute_resource_password"
|
10
|
+
%>
|
9
11
|
|
10
12
|
<%= textarea_f f, :ca_cert, :label => _("X509 Certification Authorities"),
|
11
13
|
:placeholder => _("Optionally provide a CA, or a correctly ordered CA chain or a path to a file. If left blank - insecure.") %>
|
@@ -1,6 +1,10 @@
|
|
1
1
|
<% if f.object.type.nil? || f.object.type == 'persistentVolumeClaim' %>
|
2
|
+
<% if @set %>
|
3
|
+
<% @set.errors[:vm_attrs].each do | error| %>
|
4
|
+
<%= alert :class => 'alert-danger', :header => '', :text => error %>
|
5
|
+
<% end %>
|
6
|
+
<% end %>
|
2
7
|
<% storage_classes = compute_resource.storage_classes %>
|
3
|
-
|
4
8
|
<%= select_f f, :storage_class,
|
5
9
|
compute_resource.storage_classes_for_select,
|
6
10
|
:id,
|
@@ -10,7 +14,6 @@
|
|
10
14
|
:label_size => "col-md-2",
|
11
15
|
:disabled => !new_vm,
|
12
16
|
:class => "col-md-2" %>
|
13
|
-
|
14
17
|
<%= text_f f,:capacity, :label => _('Size (GB)'), :label_size => "col-md-2", :disabled => !new_vm, :class => "col-md-2 pvc-size" %>
|
15
18
|
|
16
19
|
<% bootable = f.object.boot_order.nil? ? false : f.object.bootable %>
|
@@ -62,6 +62,8 @@ module ForemanKubevirt
|
|
62
62
|
require "fog/kubevirt/compute/models/networkattachmentdef"
|
63
63
|
require File.expand_path("../../app/models/concerns/fog_extensions/kubevirt/network", __dir__)
|
64
64
|
Fog::Kubevirt::Compute::Networkattachmentdef.send(:include, ::FogExtensions::Kubevirt::Network)
|
65
|
+
ComputeAttribute.send :include, ForemanKubevirt::ComputeAttributeExtensions
|
66
|
+
|
65
67
|
rescue StandardError => e
|
66
68
|
Rails.logger.warn "Foreman-Kubevirt: skipping engine hook (#{e})"
|
67
69
|
end
|
@@ -126,9 +126,22 @@ class ForemanKubevirtTest < ActiveSupport::TestCase
|
|
126
126
|
exception = assert_raise(Foreman::Exception) do
|
127
127
|
compute_resource.create_vm(vm_args)
|
128
128
|
end
|
129
|
-
assert_match(/
|
129
|
+
assert_match(/Volume size is not valid/, exception.message)
|
130
130
|
end
|
131
131
|
|
132
|
+
|
133
|
+
test "should fail when creating a VM with not valid capacity" do
|
134
|
+
vm_args = NETWORK_BASED_VM_ARGS.deep_dup
|
135
|
+
vm_args["volumes_attributes"]["0"]["capacity"] = "TG"
|
136
|
+
Fog.mock!
|
137
|
+
compute_resource = new_kubevirt_vcr
|
138
|
+
exception = assert_raise(Foreman::Exception) do
|
139
|
+
compute_resource.create_vm(vm_args)
|
140
|
+
end
|
141
|
+
assert_match(/Volume size TG is not valid/, exception.message)
|
142
|
+
end
|
143
|
+
|
144
|
+
|
132
145
|
test "should fail when creating a VM with two bootable PVCs" do
|
133
146
|
vm_args = NETWORK_BASED_VM_ARGS.deep_dup
|
134
147
|
vm_args["volumes_attributes"]["0"]["bootable"] = "true"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_kubevirt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Moti Asayag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 1.3.2
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 1.3.2
|
55
55
|
description: Provision and manage Kubevirt Virtual Machines from Foreman.
|
56
56
|
email:
|
57
57
|
- masayag@redhat.com
|
@@ -70,7 +70,9 @@ files:
|
|
70
70
|
- app/models/concerns/fog_extensions/kubevirt/server.rb
|
71
71
|
- app/models/concerns/fog_extensions/kubevirt/vmnic.rb
|
72
72
|
- app/models/concerns/fog_extensions/kubevirt/volume.rb
|
73
|
+
- app/models/foreman_kubevirt/compute_attribute_extensions.rb
|
73
74
|
- app/models/foreman_kubevirt/kubevirt.rb
|
75
|
+
- app/validators/volume_validator.rb
|
74
76
|
- app/views/api/v2/compute_resources/kubevirt.json.rabl
|
75
77
|
- app/views/compute_resources/form/_kubevirt.html.erb
|
76
78
|
- app/views/compute_resources/show/_kubevirt.html.erb
|