This is a very limited resource representing both LXC and QEMU templates. Methods like start, stop and check_running do nothing or tell the LRM want he wants to hear.
While templates are a questionable HA resource they are already used as such (see bug 1160) and prohibiting that usage is a draw back for those users and has no real value for us. Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> --- src/PVE/HA/Config.pm | 2 +- src/PVE/HA/Env/PVE2.pm | 2 + src/PVE/HA/Resources/Makefile | 2 +- src/PVE/HA/Resources/PVETemplate.pm | 131 ++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 src/PVE/HA/Resources/PVETemplate.pm diff --git a/src/PVE/HA/Config.pm b/src/PVE/HA/Config.pm index 1802a7d..bb6d7e1 100644 --- a/src/PVE/HA/Config.pm +++ b/src/PVE/HA/Config.pm @@ -215,7 +215,7 @@ sub vm_is_ha_managed { my $conf = cfs_read_file($ha_resources_config); my $types = PVE::HA::Resources->lookup_types(); - foreach my $type ('vm', 'ct') { + foreach my $type ('vm', 'ct', 'template') { return 1 if &$service_check_ha_state($conf, "$type:$vmid", $has_state); } diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm index 6b8802e..cd9b4e1 100644 --- a/src/PVE/HA/Env/PVE2.pm +++ b/src/PVE/HA/Env/PVE2.pm @@ -19,9 +19,11 @@ use PVE::HA::FenceConfig; use PVE::HA::Resources; use PVE::HA::Resources::PVEVM; use PVE::HA::Resources::PVECT; +use PVE::HA::Resources::PVETemplate; PVE::HA::Resources::PVEVM->register(); PVE::HA::Resources::PVECT->register(); +PVE::HA::Resources::PVETemplate->register(); PVE::HA::Resources->init(); diff --git a/src/PVE/HA/Resources/Makefile b/src/PVE/HA/Resources/Makefile index ea840a7..9e53ca7 100644 --- a/src/PVE/HA/Resources/Makefile +++ b/src/PVE/HA/Resources/Makefile @@ -1,4 +1,4 @@ -SOURCES=PVEVM.pm PVECT.pm +SOURCES=PVEVM.pm PVECT.pm PVETemplate.pm .PHONY: install install: diff --git a/src/PVE/HA/Resources/PVETemplate.pm b/src/PVE/HA/Resources/PVETemplate.pm new file mode 100644 index 0000000..ecb31b0 --- /dev/null +++ b/src/PVE/HA/Resources/PVETemplate.pm @@ -0,0 +1,131 @@ +package PVE::HA::Resources::PVETemplate; + +use strict; +use warnings; + +use PVE::HA::Tools; + +use PVE::Cluster; + +use PVE::AbstractConfig; +use PVE::QemuConfig; +use PVE::LXC::Config; + +use base qw(PVE::HA::Resources); + +sub type { + return 'template'; +} + +sub verify_name { + my ($class, $name) = @_; + + die "invalid VMID\n" if $name !~ m/^[1-9][0-9]+$/; +} + +sub options { + return { + state => { optional => 1 }, + group => { optional => 1 }, + comment => { optional => 1 }, + max_restart => { optional => 1 }, + max_relocate => { optional => 1 }, + }; +} + +my $get_template_type = sub { + my ($vmid, $nodename) = @_; + + my $vmlist = PVE::Cluster::get_vmlist(); + + return $vmlist->{ids}->{$vmid}->{type}; +}; + +sub config_file { + my ($class, $vmid, $nodename) = @_; + + my $type = &$get_template_type($vmid, $nodename); + + if ($type eq 'qemu') { + return PVE::QemuConfig->config_file($vmid, $nodename); + } elsif ($type eq 'lxc') { + return PVE::LXC::Config->config_file($vmid, $nodename); + } else { + die "unknown template type '$type'!"; + } +} + +sub exists { + my ($class, $vmid, $noerr) = @_; + + my $vmlist = PVE::Cluster::get_vmlist(); + + if(!defined($vmlist->{ids}->{$vmid})) { + die "resource 'template:$vmid' does not exists in cluster\n" if !$noerr; + return undef; + } else { + return 1; + } +} + +sub start { + my ($class, $haenv, $id) = @_; + # do nothing, templates cannot start +} + +sub shutdown { + my ($class, $haenv, $id) = @_; + # do nothing, templates cannot start +} + +sub migrate { + my ($class, $haenv, $id, $target, $online) = @_; + + my $nodename = $haenv->nodename(); + + my $params = { + node => $nodename, + vmid => $id, + target => $target, + online => 0, # templates are never online. + }; + + my $oldconfig = $class->config_file($id, $nodename); + + my $upid; + + my $type = &$get_template_type($id, $nodename); + if ($type eq 'qemu') { + $upid = PVE::API2::Qemu->migrate_vm($params); + } elsif ($type eq 'lxc') { + $upid = PVE::API2::LXC->migrate_vm($params); + } else { + die "unknown template type '$type'!"; + } + + PVE::HA::Tools::upid_wait($upid, $haenv); + + # check if vm really moved + return !(-f $oldconfig); +} + +sub check_running { + my ($class, $haenv, $id) = @_; + + my $conf = $haenv->read_service_config(); + + # always tell the lrm what he wants to hear as template cannot be started + if ($conf->{"template:$id"}->{state} eq 'enabled') { + return 1; + } else { + return 0; + } +} + +sub remove_locks { + my ($self, $haenv, $id, $locks, $service_node) = @_; + + return undef; +} + +1; -- 2.1.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel