-
Notifications
You must be signed in to change notification settings - Fork 72
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Proxmox extention for foreman_bootdisk
- Loading branch information
Showing
7 changed files
with
151 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
48 changes: 48 additions & 0 deletions
48
app/models/concerns/foreman_bootdisk/compute_resources/proxmox.rb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# frozen_string_literal: true | ||
|
||
module ForemanBootdisk | ||
module ComputeResources | ||
module Proxmox | ||
def capabilities | ||
super + [:bootdisk] | ||
end | ||
|
||
def iso_upload(iso, vm_uuid) | ||
server = find_vm_by_uuid(vm_uuid) | ||
server.ssh_options = { password: fog_credentials[:proxmox_password] } | ||
server.ssh_ip_address = server.node_id | ||
server.username = client.credentials[:current_user].split('@').first | ||
server.scp_upload(iso, '/var/lib/vz/template/iso/') | ||
server.reload | ||
storage = storages(server.node_id, 'iso')[0] | ||
storage.volumes.any? { |v| v.volid.include? File.basename(iso) } | ||
end | ||
|
||
def iso_attach(iso, vm_uuid) | ||
server = find_vm_by_uuid(vm_uuid) | ||
storage = storages(server.node_id, 'iso')[0] | ||
volume = storage.volumes.detect { |v| v.volid.include? File.basename(iso) } | ||
disks = server.disks.map { |disk| disk.split(":")[0] }.join(";") | ||
server.update({ ide2: "#{volume.volid},media=cdrom" }) | ||
server.update({ boot: "order=ide2;#{disks}" }) | ||
server.reboot | ||
end | ||
|
||
def iso_detach(vm_uuid) | ||
server = find_vm_by_uuid(vm_uuid) | ||
|
||
# get volid to delete iso after detaching from vm | ||
volid = server.volumes.get("ide2").volid | ||
server.update({ ide2: "none,media=cdrom" }) | ||
|
||
# cdrom will be ejected on next power off | ||
server.detach('ide2') | ||
|
||
# delete the iso file from proxmox server | ||
storage = storages(server.node_id, 'iso')[0] | ||
volume = storage.volumes.detect { |v| v.volid.include? volid } | ||
volume.destroy | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'test_plugin_helper' | ||
|
||
module ForemanBootdisk | ||
class ProxmoxTest < ActiveSupport::TestCase | ||
|
||
describe '#capabilities' do | ||
setup do | ||
skip unless ForemanBootdisk.with_proxmox? | ||
@cr = FactoryBot.build(:proxmox_cr) | ||
end | ||
|
||
test 'should include bootdisk' do | ||
assert_includes @cr.capabilities, :bootdisk | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'test_plugin_helper' | ||
|
||
module ForemanBootdisk | ||
class OrchestrationProxmoxComputeTest < ActiveSupport::TestCase | ||
setup do | ||
disable_orchestration | ||
skip unless ForemanBootdisk.with_proxmox? | ||
@proxmox_cr = FactoryBot.build(:proxmox_cr) | ||
@proxmox_host = FactoryBot.build(:host, :managed, | ||
compute_resource: @proxmox_cr, | ||
provision_method: 'bootdisk') | ||
end | ||
|
||
test 'provisioning a host with provision method bootdisk in proxmox should upload iso' do | ||
@proxmox_cr.expects(:iso_upload) | ||
@proxmox_host.send(:setIsoImage) | ||
end | ||
|
||
test 'provisioning a host with provision method bootdisk in proxmox should attach iso' do | ||
@proxmox_cr.expects(:iso_attach) | ||
@proxmox_host.send(:setAttachIsoImage) | ||
end | ||
|
||
test 'provisioning a host with provision method bootdisk in proxmox should detach iso' do | ||
@proxmox_cr.expects(:iso_detach) | ||
@proxmox_host.send(:setDetachIsoImage) | ||
end | ||
|
||
test 'provisioning a new proxmox host with provision method bootdisk should queue bootdisk tasks' do | ||
@proxmox_host.stubs(:compute?).returns(true) | ||
@proxmox_host.stubs(:build?).returns(true) | ||
@proxmox_host.send(:queue_bootdisk_compute) | ||
tasks = @proxmox_host.queue.all.map(&:name) | ||
assert_includes tasks, "Generating ISO image for #{@proxmox_host.name}" | ||
assert_includes tasks, "Upload ISO image to datastore for #{@proxmox_host.name}" | ||
assert_includes tasks, "Attach ISO image to CDROM drive for #{@proxmox_host.name}" | ||
assert_not_includes tasks, "Detach ISO image from CDROM drive for #{@proxmox_host.name}" | ||
end | ||
|
||
test 'rebuilding a proxmox host with provision method bootdisk should queue bootdisk tasks' do | ||
@proxmox_host.stubs(:compute?).returns(true) | ||
old = stub() | ||
old.stubs(:build?).returns(false) | ||
@proxmox_host.stubs(:old).returns(old) | ||
@proxmox_host.stubs(:build?).returns(true) | ||
@proxmox_host.send(:queue_bootdisk_compute) | ||
tasks = @proxmox_host.queue.all.map(&:name) | ||
assert_includes tasks, "Generating ISO image for #{@proxmox_host.name}" | ||
assert_includes tasks, "Upload ISO image to datastore for #{@proxmox_host.name}" | ||
assert_includes tasks, "Attach ISO image to CDROM drive for #{@proxmox_host.name}" | ||
assert_not_includes tasks, "Detach ISO image from CDROM drive for #{@proxmox_host.name}" | ||
end | ||
|
||
test 'the iso should be detached when the proxmox host leaves build mode' do | ||
@proxmox_host.stubs(:compute?).returns(true) | ||
old = stub() | ||
old.stubs(:build?).returns(true) | ||
@proxmox_host.stubs(:old).returns(old) | ||
@proxmox_host.stubs(:build?).returns(false) | ||
@proxmox_host.send(:queue_bootdisk_compute) | ||
tasks = @proxmox_host.queue.all.map(&:name) | ||
assert_not_includes tasks, "Generating ISO image for #{@proxmox_host.name}" | ||
assert_not_includes tasks, "Upload ISO image to datastore for #{@proxmox_host.name}" | ||
assert_not_includes tasks, "Attach ISO image to CDROM drive for #{@proxmox_host.name}" | ||
assert_includes tasks, "Detach ISO image from CDROM drive for #{@proxmox_host.name}" | ||
end | ||
end | ||
end |