[pve-devel] [RFC v2 3/3] Replacing hardcoded qemu commands with plugin calls
Thomas Lamprecht
t.lamprecht at proxmox.com
Wed Sep 2 12:08:08 CEST 2015
On 09/01/2015 02:01 PM, Thomas Lamprecht wrote:
> Now a service specific plugin gets loaded and the calls to commands
> like 'migrate' or 'stop' will be handled by the plugin.
>
> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
> ---
> src/PVE/HA/Env/PVE2.pm | 94 ++++++++++++++++++++++----------------------------
> 1 file changed, 41 insertions(+), 53 deletions(-)
>
> diff --git a/src/PVE/HA/Env/PVE2.pm b/src/PVE/HA/Env/PVE2.pm
> index 4193f49..35d877f 100644
> --- a/src/PVE/HA/Env/PVE2.pm
> +++ b/src/PVE/HA/Env/PVE2.pm
> @@ -16,8 +16,6 @@ use PVE::HA::Tools;
> use PVE::HA::Env;
> use PVE::HA::Config;
>
> -use PVE::QemuServer;
> -use PVE::API2::Qemu;
>
> my $lockdir = "/etc/pve/priv/lock";
>
> @@ -99,7 +97,7 @@ sub read_service_config {
> my $d = $res->{ids}->{$sid};
> my (undef, undef, $name) = PVE::HA::Tools::parse_sid($sid);
> $d->{state} = 'enabled' if !defined($d->{state});
> - if ($d->{type} eq 'vm') {
> + if (PVE::HA::Resources->lookup($d->{type})) {
> if (my $vmd = $vmlist->{ids}->{$name}) {
> if (!$vmd) {
> warn "no such VM '$name'\n";
> @@ -125,9 +123,9 @@ sub change_service_location {
>
> my (undef, $type, $name) = PVE::HA::Tools::parse_sid($sid);
>
> - if ($type eq 'vm') {
> - my $old = PVE::QemuServer::config_file($name, $current_node);
> - my $new = PVE::QemuServer::config_file($name, $new_node);
> + if(my $plugin = PVE::HA::Resources->lookup($type)) {
> + my $old = $plugin->config_file($name, $current_node);
> + my $new = $plugin->config_file($name, $current_node);
Got an error here use 'current_node' both times, v3 comes soon
> rename($old, $new) ||
> die "rename '$old' to '$new' failed - $!\n";
> } else {
> @@ -382,16 +380,17 @@ sub exec_resource_agent {
>
> my (undef, $service_type, $service_name) = PVE::HA::Tools::parse_sid($sid);
>
> - die "service type '$service_type'not implemented" if $service_type ne 'vm';
> + my $plugin = PVE::HA::Resources->lookup($service_type);
> + die "service type '$service_type' not implemented" if !$plugin;
> +
> + # fixme: return valid_exit code
> + die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
>
> my $vmid = $service_name;
>
> - my $running = PVE::QemuServer::check_running($vmid, 1);
> -
> - if ($cmd eq 'started') {
> + my $running = $plugin->check_running($vmid);
>
> - # fixme: return valid_exit code
> - die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
> + if ($cmd eq 'started') {
>
> # fixme: count failures
>
> @@ -399,10 +398,14 @@ sub exec_resource_agent {
>
> $self->log("info", "starting service $sid");
>
> - my $upid = PVE::API2::Qemu->vm_start({node => $nodename, vmid => $vmid});
> - $self->upid_wait($upid);
> + my $params = {
> + node => $nodename,
> + vmid => $vmid
> + };
> +
> + $plugin->start($self, $params);
>
> - $running = PVE::QemuServer::check_running($vmid, 1);
> + $running = $plugin->check_running($vmid);
>
> if ($running) {
> $self->log("info", "service status $sid started");
> @@ -414,26 +417,22 @@ sub exec_resource_agent {
>
> } elsif ($cmd eq 'request_stop' || $cmd eq 'stopped') {
>
> - # fixme: return valid_exit code
> - die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
> -
> return 0 if !$running;
>
> $self->log("info", "stopping service $sid");
>
> my $timeout = 60; # fixme: make this configurable
> -
> - my $param = {
> - node => $nodename,
> - vmid => $vmid,
> +
> + my $params = {
> + node => $nodename,
> + vmid => $vmid,
> timeout => $timeout,
> forceStop => 1,
> };
>
> - my $upid = PVE::API2::Qemu->vm_shutdown($param);
> - $self->upid_wait($upid);
> + $plugin->shutdown($self, $params);
>
> - $running = PVE::QemuServer::check_running($vmid, 1);
> + $running = $plugin->check_running($vmid);
>
> if (!$running) {
> $self->log("info", "service status $sid stopped");
> @@ -447,42 +446,31 @@ sub exec_resource_agent {
> my $target = $params[0];
> die "$cmd '$sid' failed - missing target\n" if !defined($target);
>
> - # fixme: return valid_exit code
> - die "service '$sid' not on this node" if $service_config->{node} ne $nodename;
> -
> if ($service_config->{node} eq $target) {
> # already there
> return 0;
> - }
> -
> - if (!$running) {
> - $self->change_service_location($sid, $nodename, $target);
> - $self->log("info", "service $sid moved to node '$target'");
> - return 0;
> - } else {
> - # we alwas do live migration if VM is online
> + }
>
> - my $params = {
> - node => $nodename,
> - vmid => $vmid,
> - target => $target,
> - online => 1,
> - };
> + # we always do (live) migration
> + my $params = {
> + node => $nodename,
> + vmid => $vmid,
> + target => $target,
> + online => 1,
> + };
>
> - my $oldconfig = PVE::QemuServer::config_file($vmid, $nodename);
> + my $oldconfig = $plugin->config_file($vmid, $nodename);
>
> - my $upid = PVE::API2::Qemu->migrate_vm($params);
> - $self->upid_wait($upid);
> + $plugin->migrate($self, $params);
>
> - # something went wrong if old config file is still there
> - if (-f $oldconfig) {
> - $self->log("err", "service $sid not moved (migration error)");
> - return 1;
> - }
> -
> - return 0;
> + # something went wrong if old config file is still there
> + if (-f $oldconfig) {
> + $self->log("err", "service $sid not moved (migration error)");
> + return 1;
> }
> -
> +
> + return 0;
> +
> }
>
> die "implement me (cmd '$cmd')";
More information about the pve-devel
mailing list