foreman_kubevirt 0.1.0 → 0.1.1
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/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: []
|