foreman_kubevirt 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -2
- data/app/assets/javascripts/foreman_kubevirt/kubevirt.js +14 -11
- data/app/models/concerns/fog_extensions/kubevirt/volume.rb +0 -12
- data/app/models/foreman_kubevirt/kubevirt.rb +23 -4
- data/app/views/compute_resources/form/_kubevirt.html.erb +2 -1
- data/app/views/compute_resources_vms/form/kubevirt/_network.html.erb +7 -2
- data/app/views/compute_resources_vms/form/kubevirt/_volume.html.erb +1 -1
- data/lib/foreman_kubevirt/version.rb +1 -1
- data/test/unit/foreman_kubevirt_test.rb +28 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb14b9910b51e87d3bd699260b39936ecf751d2e
|
4
|
+
data.tar.gz: a2ff30c7286f23678e50f1bcafc77b27abe47ab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 406d06d9e17c37437d133513d44e89e6c006b99510a96145895e6584080dcc7bd3ea2f7e25d024b12351bfece8d51e2b08e6253cf52e96f9c128bc4bc54d696f
|
7
|
+
data.tar.gz: d16ddc90d2ad8652a71e05840fdbe605bc9ed20dccf38242bc5d767e03c814d7ba748eece054f09dbb084e2b51624b94e9a1dc95e0d1d465d3ce8a1cad35f64d
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
The ```foreman_kubevirt ``` plugin enables managing of [KubeVirt](https://kubevirt.io) as a Compute Resource in Foreman.
|
5
5
|
|
6
6
|
* Website: [TheForeman.org](http://theforeman.org)
|
7
|
-
*
|
7
|
+
* Issues: [foreman Redmine](http://projects.theforeman.org/projects/kubevirt/issues/)
|
8
8
|
* Community and support: #theforeman for general support, #theforeman-dev for development chat in [Freenode](irc.freenode.net)
|
9
9
|
* Mailing lists:
|
10
10
|
* [foreman-users](https://groups.google.com/forum/?fromgroups#!forum/foreman-users)
|
@@ -19,7 +19,7 @@ Please see the Foreman manual for appropriate instructions:
|
|
19
19
|
|
20
20
|
|
21
21
|
### Building the plugin from source
|
22
|
-
# git clone https://github.com/
|
22
|
+
# git clone https://github.com/theforeman/foreman_kubevirt
|
23
23
|
# cd foreman_kubevirt
|
24
24
|
# gem build foreman_kubevirt.gemspec # the output will be gem named foreman_kubevirt-x.y.z.gem, where x.y.z should be replaced with the actual version
|
25
25
|
|
@@ -123,6 +123,10 @@ Or by retrieving from the secret of service account *my-account* under the *defa
|
|
123
123
|
# kubectl get secret $KUBE_SECRET -n default -o jsonpath='{.data.ca\.crt}' | base64 -d
|
124
124
|
```
|
125
125
|
|
126
|
+
## Documentation
|
127
|
+
|
128
|
+
See the [Foreman Kubevirt manuals](https://theforeman.org/plugins/foreman_kubevirt/) on the Foreman web site.
|
129
|
+
|
126
130
|
## Tests
|
127
131
|
|
128
132
|
Tests should be invoked from the *foreman* directory by:
|
@@ -11,21 +11,24 @@ bootableRadio = function (item) {
|
|
11
11
|
|
12
12
|
cniProviderSelected = function (item) {
|
13
13
|
const selected = $(item).val().toLowerCase();
|
14
|
-
|
15
|
-
changeNetworkElementVisibility(!podSelected);
|
16
|
-
}
|
14
|
+
const networks = $(item).parentsUntil('.fields').parent().find('#networks');
|
17
15
|
|
18
|
-
|
19
|
-
|
20
|
-
$('.kubevirt-network').parents('.form-group').css('display', '');
|
16
|
+
if (selected == "pod") {
|
17
|
+
disableDropdown(networks);
|
21
18
|
} else {
|
22
|
-
|
19
|
+
enableDropdown(networks);
|
23
20
|
}
|
24
21
|
}
|
25
22
|
|
26
|
-
function
|
27
|
-
|
28
|
-
|
23
|
+
function disableDropdown(item) {
|
24
|
+
item.hide();
|
25
|
+
item.attr('disabled', true);
|
26
|
+
$(item).closest('.removable-item').find('.kubevirt-network').prop('disabled', true);
|
29
27
|
}
|
30
28
|
|
31
|
-
|
29
|
+
function enableDropdown(item) {
|
30
|
+
$(item).closest('.removable-item').find('.kubevirt-network').prop('disabled', false);
|
31
|
+
item.attr('disabled', false);
|
32
|
+
item.find(':input').attr('disabled', false);
|
33
|
+
item.show();
|
34
|
+
}
|
@@ -2,18 +2,6 @@ module FogExtensions
|
|
2
2
|
module Kubevirt
|
3
3
|
module Volume
|
4
4
|
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
attr_writer :storage_class
|
7
|
-
attr_writer :capacity
|
8
|
-
|
9
|
-
def capacity
|
10
|
-
pvc.requests[:storage] unless pvc.nil?
|
11
|
-
end
|
12
|
-
|
13
|
-
def storage_class
|
14
|
-
pvc&.storage_class
|
15
|
-
end
|
16
|
-
|
17
5
|
def bootable
|
18
6
|
boot_order == 1
|
19
7
|
end
|
@@ -83,12 +83,14 @@ module ForemanKubevirt
|
|
83
83
|
def new_volume(attr = {})
|
84
84
|
return unless new_volume_errors.empty?
|
85
85
|
|
86
|
-
Fog::Kubevirt::Compute::Volume.new(attr)
|
86
|
+
vol = Fog::Kubevirt::Compute::Volume.new(attr)
|
87
|
+
vol.boot_order = 1 if attr[:bootable] == "on" || attr[:bootable] == "true"
|
88
|
+
vol
|
87
89
|
end
|
88
90
|
|
89
91
|
def new_volume_errors
|
90
92
|
errors = []
|
91
|
-
errors.push _('no
|
93
|
+
errors.push _('no Storage Classes available on provider') if storage_classes.empty?
|
92
94
|
errors
|
93
95
|
end
|
94
96
|
|
@@ -128,6 +130,12 @@ module ForemanKubevirt
|
|
128
130
|
# "capacity"=>"2"
|
129
131
|
# }
|
130
132
|
# }
|
133
|
+
|
134
|
+
def verify_booting_from_image_is_possible(volumes)
|
135
|
+
raise ::Foreman::Exception.new N_('It is not possible to set a bootable volume and image based provisioning.') if
|
136
|
+
volumes.any? { |_, v| v["bootable"] == "true" }
|
137
|
+
end
|
138
|
+
|
131
139
|
def create_vm(args = {})
|
132
140
|
options = vm_instance_defaults.merge(args.to_hash.deep_symbolize_keys)
|
133
141
|
logger.debug("creating VM with the following options: #{options.inspect}")
|
@@ -135,13 +143,14 @@ module ForemanKubevirt
|
|
135
143
|
|
136
144
|
image = args["image_id"]
|
137
145
|
volumes_attributes = args["volumes_attributes"]
|
138
|
-
raise
|
146
|
+
raise ::Foreman::Exception.new N_('VM should be created based on Persistent Volume Claim or Image') unless (volumes_attributes.present? || image)
|
139
147
|
|
140
148
|
# Add image as volume to the virtual machine
|
141
149
|
image_provision = args["provision_method"] == "image"
|
142
150
|
if image_provision
|
151
|
+
verify_booting_from_image_is_possible(volumes_attributes)
|
143
152
|
volume = Fog::Kubevirt::Compute::Volume.new
|
144
|
-
raise
|
153
|
+
raise ::Foreman::Exception.new N_('VM should be created based on an image') unless image
|
145
154
|
|
146
155
|
volume.info = image
|
147
156
|
volume.boot_order = 1
|
@@ -149,6 +158,7 @@ module ForemanKubevirt
|
|
149
158
|
volumes << volume
|
150
159
|
end
|
151
160
|
|
161
|
+
volumes_attributes.each { |_, v| raise ::Foreman::Exception.new N_('Capacity was not found') if v["capacity"].empty? }
|
152
162
|
volumes_attributes&.each_with_index do |(_, v), index|
|
153
163
|
# Add PVC as volumes to the virtual machine
|
154
164
|
pvc_name = options[:name].gsub(/[._]+/, '-') + "-claim-" + (index + 1).to_s
|
@@ -316,6 +326,15 @@ module ForemanKubevirt
|
|
316
326
|
vm_attrs
|
317
327
|
end
|
318
328
|
|
329
|
+
def new_vm(attr = {})
|
330
|
+
vm = super
|
331
|
+
interfaces = nested_attributes_for :interfaces, attr[:interfaces_attributes]
|
332
|
+
interfaces.map { |i| vm.interfaces << new_interface(i) }
|
333
|
+
volumes = nested_attributes_for :volumes, attr[:volumes_attributes]
|
334
|
+
volumes.map { |v| vm.volumes << new_volume(v) }
|
335
|
+
vm
|
336
|
+
end
|
337
|
+
|
319
338
|
def associated_host(vm)
|
320
339
|
associate_by("mac", vm.mac)
|
321
340
|
end
|
@@ -4,7 +4,8 @@
|
|
4
4
|
<%= password_f f, :password, :label => _("Token"), :required => true,
|
5
5
|
:keep_value => true, :unset => unset_password?,
|
6
6
|
:help_block => _("e.g. eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9..."),
|
7
|
-
:help_inline => documentation_button('
|
7
|
+
:help_inline => documentation_button('/foreman_kubevirt/0.x/index.html#4.1SettingComputeResourceTokenandX509CAvalues',
|
8
|
+
root_url: 'https://theforeman.org/plugins') %>
|
8
9
|
|
9
10
|
<%= textarea_f f, :ca_cert, :label => _("X509 Certification Authorities"),
|
10
11
|
:placeholder => _("Optionally provide a CA, or a correctly ordered CA chain or a path to a file. If left blank - insecure.") %>
|
@@ -5,11 +5,16 @@
|
|
5
5
|
:label_size => "col-md-3",
|
6
6
|
:onchange => "cniProviderSelected(this)" %>
|
7
7
|
|
8
|
-
|
8
|
+
<% pod = f.object.cni_provider == 'pod' %>
|
9
|
+
|
10
|
+
<div id='networks' class='<%= 'hide' if pod %>'>
|
11
|
+
<%= select_f f, :network,
|
12
|
+
compute_resource.networks,
|
9
13
|
:id,
|
10
14
|
:name,
|
11
15
|
{},
|
12
|
-
:disabled => !new_vm ||
|
16
|
+
:disabled => !new_vm || pod,
|
13
17
|
:class => "col-md-3 kubevirt-network",
|
14
18
|
:label => _('Network'),
|
15
19
|
:label_size => "col-md-3" %>
|
20
|
+
</div>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
|
16
16
|
<% bootable = f.object.boot_order.nil? ? false : f.object.bootable %>
|
17
17
|
<%= field(f, :bootable, :label => _('Bootable'), :label_size => "col-md-2") do
|
18
|
-
radio_button_f f, :bootable, {:disabled => !new_vm, :checked => bootable, :onclick => 'bootableRadio(this)',
|
18
|
+
radio_button_f f, :bootable, {:disabled => !new_vm, :value=> 'true', :checked => bootable, :onclick => 'bootableRadio(this)',
|
19
19
|
:text => _('Only one volume can be bootable')}
|
20
20
|
end %>
|
21
21
|
<% end %>
|
@@ -32,7 +32,7 @@ class ForemanKubevirtTest < ActiveSupport::TestCase
|
|
32
32
|
end
|
33
33
|
|
34
34
|
test "create_vm image based" do
|
35
|
-
vm_args = { "cpu_cores" => "1", "memory" => "1073741824", "start" => "1", "volumes_attributes" => { "1554649143334" => { "_delete" => "", "storage_class" => "local-storage", "capacity" => "1", "bootable" => "
|
35
|
+
vm_args = { "cpu_cores" => "1", "memory" => "1073741824", "start" => "1", "volumes_attributes" => { "1554649143334" => { "_delete" => "", "storage_class" => "local-storage", "capacity" => "1", "bootable" => "false" } }, "image_id" => "kubevirt/fedora-cloud-registry-disk-demo", "name" => "olive-kempter.example.com", "provision_method" => "image", "firmware_type" => :bios, "interfaces_attributes" => { "0" => { "cni_provider" => "multus", "network" => "ovs-foreman", "ip" => "192.168.111.184", "mac" => "a2:a4:a2:b2:a2:b6", "provision" => true } } }
|
36
36
|
Fog.mock!
|
37
37
|
compute_resource = new_kubevirt_vcr
|
38
38
|
server = compute_resource.create_vm(vm_args)
|
@@ -42,4 +42,31 @@ class ForemanKubevirtTest < ActiveSupport::TestCase
|
|
42
42
|
assert_equal 2, server.disks.count
|
43
43
|
assert_equal 1, server.interfaces.count
|
44
44
|
end
|
45
|
+
|
46
|
+
test "should fail when creating a VM with_bootable flag and image based" do
|
47
|
+
vm_args = { "cpu_cores" => "1", "memory" => "1073741824", "start" => "1", "volumes_attributes" => { "1554649143334" => { "_delete" => "", "storage_class" => "local-storage", "capacity" => "1", "bootable" => "true" } }, "image_id" => "kubevirt/fedora-cloud-registry-disk-demo", "name" => "olive-kempter.example.com", "provision_method" => "image", "firmware_type" => :bios, "interfaces_attributes" => { "0" => { "cni_provider" => "multus", "network" => "ovs-foreman", "ip" => "192.168.111.184", "mac" => "a2:a4:a2:b2:a2:b6", "provision" => true } } }
|
48
|
+
Fog.mock!
|
49
|
+
compute_resource = new_kubevirt_vcr
|
50
|
+
assert_raise(Foreman::Exception) do
|
51
|
+
compute_resource.create_vm(vm_args)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
test "should fail when creating a VM without an image or pvc " do
|
56
|
+
vm_args = { "cpu_cores" => "1", "memory" => "1073741824", "start" => "1", "volumes_attributes" => {}, "name" => "olive-kempter.example.com", "provision_method" => "image", "firmware_type" => :bios, "interfaces_attributes" => { "0" => { "cni_provider" => "multus", "network" => "ovs-foreman", "ip" => "192.168.111.184", "mac" => "a2:a4:a2:b2:a2:b6", "provision" => true } } }
|
57
|
+
Fog.mock!
|
58
|
+
compute_resource = new_kubevirt_vcr
|
59
|
+
assert_raise(Foreman::Exception) do
|
60
|
+
compute_resource.create_vm(vm_args)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
test "should fail when creating a VM with PVC and not providing a capacity" do
|
65
|
+
vm_args = { "cpu_cores" => "1", "memory" => "1073741824", "start" => "1", "volumes_attributes" => { "1554649143334" => { "_delete" => "", "storage_class" => "local-storage", "bootable" => "false" } }, "image_id" => "kubevirt/fedora-cloud-registry-disk-demo", "name" => "olive-kempter.example.com", "provision_method" => "image", "firmware_type" => :bios, "interfaces_attributes" => { "0" => { "cni_provider" => "multus", "network" => "ovs-foreman", "ip" => "192.168.111.184", "mac" => "a2:a4:a2:b2:a2:b6", "provision" => true } } }
|
66
|
+
Fog.mock!
|
67
|
+
compute_resource = new_kubevirt_vcr
|
68
|
+
assert_raise(Foreman::Exception) do
|
69
|
+
compute_resource.create_vm(vm_args)
|
70
|
+
end
|
71
|
+
end
|
45
72
|
end
|
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.1
|
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-04-
|
11
|
+
date: 2019-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -94,9 +94,9 @@ files:
|
|
94
94
|
- test/models/compute_resources/kubevirt_test.rb
|
95
95
|
- test/test_plugin_helper.rb
|
96
96
|
- test/unit/foreman_kubevirt_test.rb
|
97
|
-
homepage: https://github.com/
|
97
|
+
homepage: https://github.com/theforeman/foreman_kubevirt
|
98
98
|
licenses:
|
99
|
-
-
|
99
|
+
- GPLv3
|
100
100
|
metadata: {}
|
101
101
|
post_install_message:
|
102
102
|
rdoc_options: []
|