This was used by rgmanager which was superseeded in 2015 with our ha-manager for PVE 4.0
Signed-off-by: Thomas Lamprecht <t.lampre...@proxmox.com> --- bin/Makefile | 2 +- bin/ocf/Makefile | 14 -- bin/ocf/pvevm | 599 ------------------------------------------------------- 3 files changed, 1 insertion(+), 614 deletions(-) delete mode 100644 bin/ocf/Makefile delete mode 100755 bin/ocf/pvevm diff --git a/bin/Makefile b/bin/Makefile index f239a0e5..ad221d8e 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -6,7 +6,7 @@ include /usr/share/pve-doc-generator/pve-doc-generator.mk export PERLLIB=.. -SUBDIRS = init.d ocf test +SUBDIRS = init.d test SERVICES = pvestatd pveproxy pvedaemon spiceproxy CLITOOLS = vzdump pvesubscription pveceph pveam pvesr diff --git a/bin/ocf/Makefile b/bin/ocf/Makefile deleted file mode 100644 index 87ac5fa1..00000000 --- a/bin/ocf/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -include ../../defines.mk - -all: - -SCRIPTS = pvevm - -.PHONY: install -install: ${SCRIPTS} - install -d ${HARADIR} - install -m 0755 ${SCRIPTS} ${HARADIR} - -.PHONY: clean -clean: - rm -rf *~ diff --git a/bin/ocf/pvevm b/bin/ocf/pvevm deleted file mode 100755 index a47ce761..00000000 --- a/bin/ocf/pvevm +++ /dev/null @@ -1,599 +0,0 @@ -#!/usr/bin/perl -w - -# Resource Agent for managing PVE VMs (openvz and qemu-kvm) -# -# License: GNU Affero General Public License (AGPL3) -# Copyright (C) 2011 Proxmox Server Solutions GmbH - -use strict; -use File::Basename; -use File::Copy; -use PVE::Tools; -use PVE::ProcFSTools; -use PVE::Cluster; -use PVE::INotify; -use PVE::RPCEnvironment; -use PVE::OpenVZ; -use PVE::API2::OpenVZ; -use PVE::QemuConfig; -use PVE::QemuServer; -use PVE::API2::Qemu; - -use constant OCF_SUCCESS => 0; -use constant OCF_ERR_GENERIC => 1; -use constant OCF_ERR_ARGS => 2; -use constant OCF_ERR_UNIMPLEMENTED => 3; -use constant OCF_ERR_PERM => 4; -use constant OCF_ERR_INSTALLED => 5; -use constant OCF_ERR_CONFIGURED => 6; -use constant OCF_NOT_RUNNING => 7; -use constant OCF_RUNNING_MASTER => 8; -use constant OCF_FAILED_MASTER => 9; - -$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; - -my $ocf_ressource_type = 'pvevm'; - -my $prio_hash = { - err => 3, - note => 5, - info => 6, - debug => 7, -}; - -$SIG{__DIE__} = sub { - die @_ if $^S; # skip if inside eval - $! = OCF_ERR_GENERIC; - ocf_log('err', @_); - exit($!); -}; - -if ($> != 0) { - print STDERR "Cannot control VMs. as non-root user.\n"; - exit(OCF_ERR_PERM); -} - -PVE::INotify::inotify_init(); - -my $rpcenv = PVE::RPCEnvironment->init('ha'); - -$rpcenv->init_request(); -$rpcenv->set_language($ENV{LANG}); -$rpcenv->set_user('root@pam'); - -my $nodename = PVE::INotify::nodename(); - -my @ssh_opts = ('-o', 'BatchMode=yes'); -my @ssh_cmd = ('ssh', @ssh_opts); - -sub ocf_log { - my ($level, $msg) = @_; - - chomp $msg; - print "$level: $msg\n"; - - my $level_n = $prio_hash->{$level}; - $level_n = $prio_hash->{note} if !defined($level_n); - - my $cmd = ['clulog', '-m', $ocf_ressource_type, '-s', $level_n, $msg]; - - eval { PVE::Tools::run_command($cmd); }; # ignore errors -} - -sub get_timeout { - my $default_timeout = 60; - my $tout = $default_timeout; - - if ($ENV{OCF_RESKEY_RGMANAGER_meta_timeout}) { - $tout = $ENV{OCF_RESKEY_RGMANAGER_meta_timeout}; - } elsif ($ENV{OCF_RESKEY_CRM_meta_timeout}) { - $tout = $ENV{OCF_RESKEY_CRM_meta_timeout}; - } - - return $default_timeout if $tout <= 0; - - return $tout; -} - -sub check_running { - my ($status, $verbose) = @_; - - if ($status->{type} eq 'qemu') { - $status->{running} = PVE::QemuServer::check_running($status->{vmid}, 1); - } elsif ($status->{type} eq 'openvz') { - $status->{running} = PVE::OpenVZ::check_running($status->{vmid}); - } else { - die "got strange VM type '$status->{type}'\n"; - } -} - -sub validate_all { - my $status = {}; - - eval { - - my $vmid = $ENV{OCF_RESKEY_vmid}; - die "no VMID specified\n" if !defined($vmid); - die "got invalid VMID '$vmid'\n" if $vmid !~ m/^[1-9]\d*$/; - - my $vmlist; - for (my $i = 0; $i < 10; $i++) { - $vmlist = PVE::Cluster::get_vmlist(); - if (!$vmlist || !$vmlist->{ids}) { - warn "got empty cluster VM list - try again in 2 seconds\n"; - sleep(2); - PVE::Cluster::cfs_update(); - } else { - last; - } - } - - die "got empty cluster VM list\n" if !$vmlist || !$vmlist->{ids}; - - my $data = $vmlist->{ids}->{$vmid}; - die "VM $vmid does not exist\n" if !$data; - - $status->{vmid} = $vmid; - $status->{type} = $data->{type}; - $status->{node} = $data->{node}; - - if ($status->{type} eq 'qemu') { - $status->{name} = "VM $vmid"; - } else { - $status->{name} = "CT $vmid"; - } - - check_running($status); - }; - if (my $err = $@) { - ocf_log('err', $err); - exit(OCF_ERR_ARGS); - } - - return $status; -} - -sub upid_wait { - my ($upid) = @_; - - my $task = PVE::Tools::upid_decode($upid); - - sleep(1); - while (PVE::ProcFSTools::check_process_running($task->{pid}, $task->{pstart})) { - ocf_log('debug', "Task still active, waiting"); - sleep(1); - } -} - -sub copy_scripts { - my ($vmid, $oldconfig, $newconfig) = @_; - - my $oldcfgdir = dirname($oldconfig); - my $newcfgdir = dirname($newconfig); - - my $newfiles = []; - my $oldfiles = []; - eval { - foreach my $s (PVE::OpenVZ::SCRIPT_EXT) { - my $scriptfn = "${vmid}.$s"; - my $oldfn = "$oldcfgdir/$scriptfn"; - next if ! -f $oldfn; - my $dstfn = "$newcfgdir/$scriptfn"; - push @$oldfiles, $oldfn; - push @$newfiles, $dstfn; - copy($oldfn, $dstfn) || die "copy '$oldfn' to '$dstfn' failed - $!\n"; - } - }; - if (my $err = $@) { - foreach my $fn (@$newfiles) { - unlink($fn); - } - die $err; - } - - return ($newfiles, $oldfiles); -} - -my $cmd = shift || ''; -my $migratetarget = shift if $cmd eq 'migrate'; - -die "too many arguments\n" if scalar (@ARGV) != 0; - -if ($cmd eq 'start') { - my $status = validate_all(); - if ($status->{running}) { - ocf_log('info', "$status->{name} is already running"); - exit(OCF_SUCCESS); - } - - if ($status->{node} ne $nodename) { - ocf_log('info', "Move config for $status->{name} to local node"); - my ($oldconfig, $newconfig, $oldfiles, $newfiles); - if ($status->{type} eq 'qemu') { - $oldconfig = PVE::QemuConfig->config_file($status->{vmid}, $status->{node}); - $newconfig = PVE::QemuConfig->config_file($status->{vmid}, $nodename); - } else { - $oldconfig = PVE::OpenVZ::config_file($status->{vmid}, $status->{node}); - $newconfig = PVE::OpenVZ::config_file($status->{vmid}, $nodename); - - eval { ($newfiles, $oldfiles) = copy_scripts($status->{vmid}, $oldconfig, $newconfig); }; - if (my $err = $@) { - ocf_log('err', "unable to move config scripts: $err"); - exit(OCF_ERR_GENERIC); - } - } - if (!rename($oldconfig, $newconfig)) { - ocf_log('err', "unable to move config file from '$oldconfig' to '$newconfig' - $!"); - if ($newfiles) { - foreach my $fn (@$newfiles) { - unlink($fn); - } - } - exit(OCF_ERR_GENERIC); - } - if ($oldfiles) { - foreach my $fn (@$oldfiles) { - unlink($fn); - } - } - } - - my $upid; - - if ($status->{type} eq 'qemu') { - $upid = PVE::API2::Qemu->vm_start({node => $nodename, vmid => $status->{vmid}}); - } else { - $upid = PVE::API2::OpenVZ->vm_start({node => $nodename, vmid => $status->{vmid}}); - } - - upid_wait($upid); - - check_running($status); - - exit(OCF_ERR_GENERIC) if !$status->{running}; - - if (my $testprog = $ENV{OCF_RESKEY_status_program}) { - - my $timeout = get_timeout(); - - my $wait_func = sub { - while (system($testprog) != 0) { sleep(3); } - }; - - eval { PVE::Tools::run_with_timeout($timeout, $wait_func); }; - if (my $err = $@) { - ocf_log('err', "Start of $status->{name} has failed"); - ocf_log('err', "error while waiting for '$testprog' - $err"); - exit(OCF_ERR_GENERIC); - } - } - - exit(OCF_SUCCESS); - -} elsif($cmd eq 'stop') { - my $status = validate_all(); - - if (!$status->{running}) { - ocf_log('info', "$status->{name} is already stopped"); - exit(OCF_SUCCESS); - } - - my $timeout = get_timeout(); - - my $upid; - - my $param = { - node => $nodename, - vmid => $status->{vmid}, - timeout => $timeout, - forceStop => 1, - }; - - if ($status->{type} eq 'qemu') { - $upid = PVE::API2::Qemu->vm_shutdown($param); - } else { - $upid = PVE::API2::OpenVZ->vm_shutdown($param); - } - - upid_wait($upid); - - check_running($status); - - exit($status->{running} ? OCF_ERR_GENERIC : OCF_SUCCESS); - -} elsif($cmd eq 'recover' || $cmd eq 'restart' || $cmd eq 'reload') { - - exit(OCF_SUCCESS); - -} elsif($cmd eq 'status' || $cmd eq 'monitor') { - - my $status = validate_all(); - - if (!$status->{running}) { - ocf_log('debug', "$status->{name} is not running"); - exit(OCF_NOT_RUNNING); - } - - ocf_log('debug', "$status->{name} is running"); - - my $testprog = $ENV{OCF_RESKEY_status_program}; - my $checklevel = $ENV{OCF_CHECK_LEVEL}; - - if ($testprog && $checklevel && $checklevel >= 10) { - if (system($testprog) != 0) { - exit(OCF_NOT_RUNNING); - } - } - - exit(OCF_SUCCESS); - -} elsif($cmd eq 'migrate') { - my $status = validate_all(); - if (!$status->{running}) { - ocf_log('err', "$status->{name} is not running"); - exit(OCF_ERR_GENERIC); - } - - if (!$migratetarget) { - ocf_log('err', "No target specified"); - exit(OCF_ERR_ARGS); - - }; - - my $upid; - my $params = { - node => $nodename, - vmid => $status->{vmid}, - target => $migratetarget, - online => 1, - }; - - my $oldconfig; - if ($status->{type} eq 'qemu') { - $oldconfig = PVE::QemuConfig->config_file($status->{vmid}, $status->{node}); - $upid = PVE::API2::Qemu->migrate_vm($params); - } else { - $oldconfig = PVE::OpenVZ::config_file($status->{vmid}, $status->{node}); - $upid = PVE::API2::OpenVZ->migrate_vm($params); - } - - upid_wait($upid); - - # something went wrong if old config file is still there - if (-f $oldconfig) { - # check if VM is really dead. If still running, return non-critical error - # We use OCF error code 150 (same as vm.sh agent) - check_running($status); - - exit(150) if $status->{running}; - - exit(OCF_ERR_GENERIC); - } - - exit(OCF_SUCCESS); - -} elsif($cmd eq 'stop') { - my $status = validate_all(); - - if (!$status->{running}) { - ocf_log('info', "$status->{name} is already stopped"); - exit(OCF_SUCCESS); - } - - my $upid; - - if ($status->{type} eq 'qemu') { - $upid = PVE::API2::Qemu->vm_stop({node => $nodename, vmid => $status->{vmid}}); - } else { - $upid = PVE::API2::OpenVZ->vm_stop({node => $nodename, vmid => $status->{vmid}, fast => 1}); - } - - upid_wait($upid); - - die "implement me"; - -} elsif($cmd eq 'reconfig') { - # Reconfigure a running VM - my $status = validate_all(); - - # we do nothing here - -} elsif($cmd eq 'meta-data') { - while(<DATA>) { - print; - } -} elsif($cmd eq 'validate-all') { - my $status = validate_all(); -} else { - die "usage: $0 {start|stop|restart|status|reload|reconfig|meta-data|validate-all}\n"; -} - -exit(OCF_SUCCESS); - -__DATA__ -<?xml version="1.0"?> -<resource-agent version="rgmanager 2.0" name="pvevm"> - <version>1.0</version> - - <longdesc lang="en"> - Defines a PVE Virtual Machine - </longdesc> - <shortdesc lang="en"> - Defines a PVE Virtual Machine - </shortdesc> - - <parameters> - <parameter name="vmid" primary="1"> - <longdesc lang="en"> - This is the VMID of the virtual machine. - </longdesc> - <shortdesc lang="en"> - VMID - </shortdesc> - <content type="string"/> - </parameter> - - <parameter name="domain" reconfig="1"> - <longdesc lang="en"> - Failover domains define lists of cluster members - to try in the event that the host of the virtual machine - fails. - </longdesc> - <shortdesc lang="en"> - Cluster failover Domain - </shortdesc> - <content type="string"/> - </parameter> - - <parameter name="autostart" reconfig="1"> - <longdesc lang="en"> - If set to yes, this resource group will automatically be started - after the cluster forms a quorum. If set to no, this virtual - machine will start in the 'disabled' state after the cluster - forms a quorum. - </longdesc> - <shortdesc lang="en"> - Automatic start after quorum formation - </shortdesc> - <content type="boolean" default="1"/> - </parameter> - - <parameter name="exclusive" reconfig="1"> - <longdesc lang="en"> - If set, this resource group will only relocate to - nodes which have no other resource groups running in the - event of a failure. If no empty nodes are available, - this resource group will not be restarted after a failure. - Additionally, resource groups will not automatically - relocate to the node running this resource group. This - option can be overridden by manual start and/or relocate - operations. - </longdesc> - <shortdesc lang="en"> - Exclusive resource group - </shortdesc> - <content type="boolean" default="0"/> - </parameter> - - <parameter name="recovery" reconfig="1"> - <longdesc lang="en"> - This currently has three possible options: "restart" tries - to restart this virtual machine locally before - attempting to relocate (default); "relocate" does not bother - trying to restart the VM locally; "disable" disables - the VM if it fails. - </longdesc> - <shortdesc lang="en"> - Failure recovery policy - </shortdesc> - <content type="string"/> - </parameter> - - <parameter name="migrate"> - <longdesc lang="en"> - Migration type (live or pause, default = live). - </longdesc> - <shortdesc lang="en"> - Migration type (live or pause, default = live). - </shortdesc> - <content type="string" default="live"/> - </parameter> - - <parameter name="depend"> - <longdesc lang="en"> - Service dependency; will not start without the specified - service running. - </longdesc> - <shortdesc lang="en"> - Top-level service this depends on, in service:name format. - </shortdesc> - <content type="string"/> - </parameter> - - <parameter name="depend_mode"> - <longdesc lang="en"> - Service dependency mode. - hard - This service is stopped/started if its dependency - is stopped/started - soft - This service only depends on the other service for - initial startip. If the other service stops, this - service is not stopped. - </longdesc> - <shortdesc lang="en"> - Service dependency mode (soft or hard). - </shortdesc> - <content type="string" default="hard"/> - </parameter> - - <parameter name="max_restarts" reconfig="1"> - <longdesc lang="en"> - Maximum restarts for this service. - </longdesc> - <shortdesc lang="en"> - Maximum restarts for this service. - </shortdesc> - <content type="string" default="0"/> - </parameter> - - <parameter name="restart_expire_time" reconfig="1"> - <longdesc lang="en"> - Restart expiration time. A restart is forgotten - after this time. When combined with the max_restarts - option, this lets administrators specify a threshold - for when to fail over services. If max_restarts - is exceeded in this given expiration time, the service - is relocated instead of restarted again. - </longdesc> - <shortdesc lang="en"> - Restart expiration time; amount of time before a restart - is forgotten. - </shortdesc> - <content type="string" default="0"/> - </parameter> - - <parameter name="status_program" reconfig="1"> - <longdesc lang="en"> - Ordinarily, only the presence/health of a virtual machine - is checked. If specified, the status_program value is - executed during a depth 10 check. The intent of this - program is to ascertain the status of critical services - within a virtual machine. - </longdesc> - <shortdesc lang="en"> - Additional status check program - </shortdesc> - <content type="string" default=""/> - </parameter> - </parameters> - - <actions> - <action name="start" timeout="75"/> - <action name="stop" timeout="75"/> - - <action name="status" timeout="10" interval="30"/> - <action name="monitor" timeout="10" interval="30"/> - - <!-- depth 10 calls the status_program --> - <action name="status" depth="10" timeout="20" interval="60"/> - <action name="monitor" depth="10" timeout="20" interval="60"/> - - <!-- reconfigure - reconfigure with new OCF parameters. - NOT OCF COMPATIBLE AT ALL --> - <action name="reconfig" timeout="10"/> - - <action name="migrate" timeout="10m"/> - - <action name="meta-data" timeout="5"/> - <action name="validate-all" timeout="5"/> - - </actions> - - <special tag="rgmanager"> - <!-- Destroy_on_delete / init_on_add are currently only - supported for migratory resources (no children - and the 'migrate' action; see above. Do not try this - with normal services --> - <attributes maxinstances="1" destroy_on_delete="0" init_on_add="0"/> - </special> -</resource-agent> - -- 2.14.2 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel