]> git.proxmox.com Git - pve-ha-manager.git/blobdiff - src/PVE/HA/Resources/PVEVM.pm
Split up resources and move them to own sub folder
[pve-ha-manager.git] / src / PVE / HA / Resources / PVEVM.pm
diff --git a/src/PVE/HA/Resources/PVEVM.pm b/src/PVE/HA/Resources/PVEVM.pm
new file mode 100644 (file)
index 0000000..03b894b
--- /dev/null
@@ -0,0 +1,109 @@
+package PVE::HA::Resources::PVEVM;
+
+use strict;
+use warnings;
+
+use PVE::QemuServer;
+use PVE::API2::Qemu;
+
+use base qw(PVE::HA::Resources);
+
+sub type {
+    return 'vm';
+}
+
+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 },
+    };
+}
+
+sub config_file {
+    my ($class, $vmid, $nodename) = @_;
+
+    return PVE::QemuServer::config_file($vmid, $nodename);
+}
+
+sub exists {
+    my ($class, $vmid, $noerr) = @_;
+
+    my $vmlist = PVE::Cluster::get_vmlist();
+
+    if(!defined($vmlist->{ids}->{$vmid})) {
+       die "resource 'vm:$vmid' does not exists in cluster\n" if !$noerr;
+       return undef;
+    } else {
+       return 1;
+    }
+}
+
+sub start {
+    my ($class, $haenv, $id) = @_;
+
+    my $nodename = $haenv->nodename();
+
+    my $params = {
+       node => $nodename,
+       vmid => $id
+    };
+
+    my $upid = PVE::API2::Qemu->vm_start($params);
+    $haenv->upid_wait($upid);
+}
+
+sub shutdown {
+    my ($class, $haenv, $id) = @_;
+
+    my $nodename = $haenv->nodename();
+    my $shutdown_timeout = 60; # fixme: make this configurable
+
+    my $params = {
+       node => $nodename,
+       vmid => $id,
+       timeout => $shutdown_timeout,
+       forceStop => 1,
+    };
+
+    my $upid = PVE::API2::Qemu->vm_shutdown($params);
+    $haenv->upid_wait($upid);
+}
+
+
+sub migrate {
+    my ($class, $haenv, $id, $target, $online) = @_;
+
+    my $nodename = $haenv->nodename();
+
+    my $params = {
+       node => $nodename,
+       vmid => $id,
+       target => $target,
+       online => $online,
+    };
+
+    # explicitly shutdown if $online isn't true (relocate)
+    if (!$online && $class->check_running($id)) {
+       $class->shutdown($haenv, $id);
+    }
+
+    my $upid = PVE::API2::Qemu->migrate_vm($params);
+    $haenv->upid_wait($upid);
+}
+
+sub check_running {
+    my ($class, $vmid) = @_;
+
+    return PVE::QemuServer::check_running($vmid, 1);
+}
+
+1;