mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-08-08 10:32:50 +00:00
improve ocf agent and openvz api
This commit is contained in:
parent
7d06188a04
commit
51ed1415cd
@ -254,7 +254,7 @@ __PACKAGE__->register_method({
|
|||||||
if ($param->{force}) {
|
if ($param->{force}) {
|
||||||
die "cant overwrite mounted container\n" if PVE::OpenVZ::check_mounted($conf, $vmid);
|
die "cant overwrite mounted container\n" if PVE::OpenVZ::check_mounted($conf, $vmid);
|
||||||
} else {
|
} else {
|
||||||
die "container $vmid already exists\n" if -f $basecfg_fn;
|
die "CT $vmid already exists\n" if -f $basecfg_fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
my $ostemplate = extract_param($param, 'ostemplate');
|
my $ostemplate = extract_param($param, 'ostemplate');
|
||||||
@ -925,10 +925,12 @@ __PACKAGE__->register_method({
|
|||||||
|
|
||||||
my $vmid = extract_param($param, 'vmid');
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
|
die "CT $vmid already running\n" if PVE::OpenVZ::check_running($vmid);
|
||||||
|
|
||||||
my $realcmd = sub {
|
my $realcmd = sub {
|
||||||
my $upid = shift;
|
my $upid = shift;
|
||||||
|
|
||||||
syslog('info', "starting container $vmid: $upid\n");
|
syslog('info', "starting CT $vmid: $upid\n");
|
||||||
|
|
||||||
my $cmd = ['vzctl', 'start', $vmid];
|
my $cmd = ['vzctl', 'start', $vmid];
|
||||||
|
|
||||||
@ -952,10 +954,64 @@ __PACKAGE__->register_method({
|
|||||||
properties => {
|
properties => {
|
||||||
node => get_standard_option('pve-node'),
|
node => get_standard_option('pve-node'),
|
||||||
vmid => get_standard_option('pve-vmid'),
|
vmid => get_standard_option('pve-vmid'),
|
||||||
fast => {
|
},
|
||||||
type => 'boolean',
|
},
|
||||||
description => "This is faster but can lead to unclean container shutdown.",
|
returns => {
|
||||||
|
type => 'string',
|
||||||
|
},
|
||||||
|
code => sub {
|
||||||
|
my ($param) = @_;
|
||||||
|
|
||||||
|
my $rpcenv = PVE::RPCEnvironment::get();
|
||||||
|
|
||||||
|
my $user = $rpcenv->get_user();
|
||||||
|
|
||||||
|
my $node = extract_param($param, 'node');
|
||||||
|
|
||||||
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
|
die "CT $vmid not running\n" if !PVE::OpenVZ::check_running($vmid);
|
||||||
|
|
||||||
|
my $realcmd = sub {
|
||||||
|
my $upid = shift;
|
||||||
|
|
||||||
|
syslog('info', "stoping CT $vmid: $upid\n");
|
||||||
|
|
||||||
|
my $cmd = ['vzctl', 'stop', $vmid, '--fast'];
|
||||||
|
run_command($cmd);
|
||||||
|
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
my $upid = $rpcenv->fork_worker('vzstop', $vmid, $user, $realcmd);
|
||||||
|
|
||||||
|
return $upid;
|
||||||
|
}});
|
||||||
|
|
||||||
|
__PACKAGE__->register_method({
|
||||||
|
name => 'vm_shutdown',
|
||||||
|
path => '{vmid}/status/shutdown',
|
||||||
|
method => 'POST',
|
||||||
|
protected => 1,
|
||||||
|
proxyto => 'node',
|
||||||
|
description => "Shutdown the container.",
|
||||||
|
parameters => {
|
||||||
|
additionalProperties => 0,
|
||||||
|
properties => {
|
||||||
|
node => get_standard_option('pve-node'),
|
||||||
|
vmid => get_standard_option('pve-vmid'),
|
||||||
|
timeout => {
|
||||||
|
description => "Wait maximal timeout seconds.",
|
||||||
|
type => 'integer',
|
||||||
|
minimum => 0,
|
||||||
optional => 1,
|
optional => 1,
|
||||||
|
default => 60,
|
||||||
|
},
|
||||||
|
forceStop => {
|
||||||
|
description => "Make sure the Container stops.",
|
||||||
|
type => 'boolean',
|
||||||
|
optional => 1,
|
||||||
|
default => 0,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -973,21 +1029,34 @@ __PACKAGE__->register_method({
|
|||||||
|
|
||||||
my $vmid = extract_param($param, 'vmid');
|
my $vmid = extract_param($param, 'vmid');
|
||||||
|
|
||||||
|
my $timeout = extract_param($param, 'timeout');
|
||||||
|
|
||||||
|
die "CT $vmid not running\n" if !PVE::OpenVZ::check_running($vmid);
|
||||||
|
|
||||||
my $realcmd = sub {
|
my $realcmd = sub {
|
||||||
my $upid = shift;
|
my $upid = shift;
|
||||||
|
|
||||||
syslog('info', "stoping container $vmid: $upid\n");
|
syslog('info', "shutdown CT $vmid: $upid\n");
|
||||||
|
|
||||||
my $cmd = ['vzctl', 'stop', $vmid];
|
my $cmd = ['vzctl', 'stop', $vmid];
|
||||||
|
|
||||||
push @$cmd, '--fast' if $param->{fast};
|
$timeout = 60 if !defined($timeout);
|
||||||
|
|
||||||
|
eval { run_command($cmd, timeout => $timeout); };
|
||||||
|
my $err = $@;
|
||||||
|
return if !$err;
|
||||||
|
|
||||||
|
die $err if !$param->{forceStop};
|
||||||
|
|
||||||
|
warn "shutdown failed - forcing stop now\n";
|
||||||
|
|
||||||
|
push @$cmd, '--fast';
|
||||||
run_command($cmd);
|
run_command($cmd);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
my $upid = $rpcenv->fork_worker('vzstop', $vmid, $user, $realcmd);
|
my $upid = $rpcenv->fork_worker('vzshutdown', $vmid, $user, $realcmd);
|
||||||
|
|
||||||
return $upid;
|
return $upid;
|
||||||
}});
|
}});
|
||||||
|
119
bin/ocf/pvevm
119
bin/ocf/pvevm
@ -29,9 +29,19 @@ use constant OCF_FAILED_MASTER => 9;
|
|||||||
|
|
||||||
$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
|
$ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin';
|
||||||
|
|
||||||
|
my $ocf_ressource_type = $0;
|
||||||
|
my $prio_hash = {
|
||||||
|
err => 3,
|
||||||
|
note => 5,
|
||||||
|
info => 6,
|
||||||
|
debug => 7,
|
||||||
|
};
|
||||||
|
|
||||||
$SIG{__DIE__} = sub {
|
$SIG{__DIE__} = sub {
|
||||||
die @_ if $^S; # skip if inside eval
|
die @_ if $^S; # skip if inside eval
|
||||||
$! = OCF_ERR_GENERIC;
|
$! = OCF_ERR_GENERIC;
|
||||||
|
ocf_log('err', @_);
|
||||||
|
exit($!);
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($> != 0) {
|
if ($> != 0) {
|
||||||
@ -55,11 +65,30 @@ my @ssh_cmd = ('ssh', @ssh_opts);
|
|||||||
sub ocf_log {
|
sub ocf_log {
|
||||||
my ($level, $msg) = @_;
|
my ($level, $msg) = @_;
|
||||||
|
|
||||||
# fixme:
|
|
||||||
|
|
||||||
chomp $msg;
|
chomp $msg;
|
||||||
|
|
||||||
print "$level: $msg\n";
|
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 {
|
sub check_running {
|
||||||
@ -92,8 +121,6 @@ sub validate_all {
|
|||||||
$status->{type} = $data->{type};
|
$status->{type} = $data->{type};
|
||||||
$status->{node} = $data->{node};
|
$status->{node} = $data->{node};
|
||||||
|
|
||||||
ocf_log('debug', "VM $vmid ($status->{type}) on node $status->{node}\n");
|
|
||||||
|
|
||||||
check_running($status);
|
check_running($status);
|
||||||
};
|
};
|
||||||
if (my $err = $@) {
|
if (my $err = $@) {
|
||||||
@ -156,7 +183,25 @@ if ($cmd eq 'start') {
|
|||||||
|
|
||||||
check_running($status);
|
check_running($status);
|
||||||
|
|
||||||
exit($status->{running} ? OCF_SUCCESS : OCF_ERR_GENERIC);
|
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 VM $status->{vmid} has failed");
|
||||||
|
ocf_log('err', "error while waiting for '$testprog' - $err");
|
||||||
|
exit(OCF_ERR_GENERIC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
exit(OCF_SUCCESS);
|
||||||
|
|
||||||
} elsif($cmd eq 'stop') {
|
} elsif($cmd eq 'stop') {
|
||||||
my $status = validate_all();
|
my $status = validate_all();
|
||||||
@ -166,12 +211,21 @@ if ($cmd eq 'start') {
|
|||||||
exit(OCF_SUCCESS);
|
exit(OCF_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $timeout = get_timeout();
|
||||||
|
|
||||||
my $upid;
|
my $upid;
|
||||||
|
|
||||||
|
my $param = {
|
||||||
|
node => $nodename,
|
||||||
|
vmid => $status->{vmid},
|
||||||
|
timeout => $timeout,
|
||||||
|
forceStop => 1,
|
||||||
|
};
|
||||||
|
|
||||||
if ($status->{type} eq 'qemu') {
|
if ($status->{type} eq 'qemu') {
|
||||||
$upid = PVE::API2::Qemu->vm_stop({node => $nodename, vmid => $status->{vmid}});
|
$upid = PVE::API2::Qemu->vm_shutdown($param);
|
||||||
} else {
|
} else {
|
||||||
$upid = PVE::API2::OpenVZ->vm_stop({node => $nodename, vmid => $status->{vmid}, fast => 1});
|
$upid = PVE::API2::OpenVZ->vm_shutdown($param);
|
||||||
}
|
}
|
||||||
|
|
||||||
upid_wait($upid);
|
upid_wait($upid);
|
||||||
@ -187,14 +241,25 @@ if ($cmd eq 'start') {
|
|||||||
} elsif($cmd eq 'status' || $cmd eq 'monitor') {
|
} elsif($cmd eq 'status' || $cmd eq 'monitor') {
|
||||||
|
|
||||||
my $status = validate_all();
|
my $status = validate_all();
|
||||||
if ($status->{running}) {
|
|
||||||
ocf_log('debug', "Resource is running");
|
if (!$status->{running}) {
|
||||||
exit(OCF_SUCCESS);
|
|
||||||
} else {
|
|
||||||
ocf_log('debug', "Resource is not running");
|
ocf_log('debug', "Resource is not running");
|
||||||
exit(OCF_NOT_RUNNING);
|
exit(OCF_NOT_RUNNING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ocf_log('debug', "Resource 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') {
|
} elsif($cmd eq 'migrate') {
|
||||||
my $status = validate_all();
|
my $status = validate_all();
|
||||||
if (!$status->{running}) {
|
if (!$status->{running}) {
|
||||||
@ -208,29 +273,11 @@ if ($cmd eq 'start') {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
# test ssh connection and try to detect node name
|
|
||||||
my @rem_ssh = (@ssh_cmd, "root\@$migratetarget");
|
|
||||||
my $cmd = [ @rem_ssh, '/bin/hostname' ];
|
|
||||||
my $targetnode = '';
|
|
||||||
eval {
|
|
||||||
PVE::Tools::run_command($cmd, outfunc => sub {
|
|
||||||
$targetnode = shift if !$targetnode;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
if (my $err = $@) {
|
|
||||||
ocf_log('err', "can't connect to target '$migratetarget' - $err");
|
|
||||||
exit(OCF_ERR_GENERIC);
|
|
||||||
}
|
|
||||||
if (!PVE::Cluster::check_node_exists($targetnode, 1)) {
|
|
||||||
ocf_log('err', "target hostname '$targetnode' is no cluster member");
|
|
||||||
exit(OCF_ERR_GENERIC);
|
|
||||||
}
|
|
||||||
|
|
||||||
my $upid;
|
my $upid;
|
||||||
my $params = {
|
my $params = {
|
||||||
node => $nodename,
|
node => $nodename,
|
||||||
vmid => $status->{vmid},
|
vmid => $status->{vmid},
|
||||||
target => $targetnode,
|
target => $migratetarget,
|
||||||
online => 1,
|
online => 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -365,6 +412,16 @@ __DATA__
|
|||||||
<content type="string"/>
|
<content type="string"/>
|
||||||
</parameter>
|
</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">
|
<parameter name="depend">
|
||||||
<longdesc lang="en">
|
<longdesc lang="en">
|
||||||
Service dependency; will not start without the specified
|
Service dependency; will not start without the specified
|
||||||
|
@ -73,6 +73,7 @@ my $cmddef = {
|
|||||||
}],
|
}],
|
||||||
|
|
||||||
start => [ 'PVE::API2::OpenVZ', 'vm_start', ['vmid'], { node => $nodename }, $upid_exit],
|
start => [ 'PVE::API2::OpenVZ', 'vm_start', ['vmid'], { node => $nodename }, $upid_exit],
|
||||||
|
shutdown => [ 'PVE::API2::OpenVZ', 'vm_shutdown', ['vmid'], { node => $nodename }, $upid_exit],
|
||||||
stop => [ 'PVE::API2::OpenVZ', 'vm_stop', ['vmid'], { node => $nodename }, $upid_exit],
|
stop => [ 'PVE::API2::OpenVZ', 'vm_stop', ['vmid'], { node => $nodename }, $upid_exit],
|
||||||
migrate => [ "PVE::API2::OpenVZ", 'migrate_vm', ['vmid', 'target'], { node => $nodename }, $upid_exit],
|
migrate => [ "PVE::API2::OpenVZ", 'migrate_vm', ['vmid', 'target'], { node => $nodename }, $upid_exit],
|
||||||
|
|
||||||
|
8
debian/changelog.Debian
vendored
8
debian/changelog.Debian
vendored
@ -1,3 +1,11 @@
|
|||||||
|
pve-manager (2.0-16) unstable; urgency=low
|
||||||
|
|
||||||
|
* improve OpenVZ API (impl. shutdown)
|
||||||
|
|
||||||
|
* improve HA resource agent
|
||||||
|
|
||||||
|
-- Proxmox Support Team <support@proxmox.com> Thu, 15 Dec 2011 13:48:39 +0100
|
||||||
|
|
||||||
pve-manager (2.0-15) unstable; urgency=low
|
pve-manager (2.0-15) unstable; urgency=low
|
||||||
|
|
||||||
* add HA resource agent
|
* add HA resource agent
|
||||||
|
@ -2,7 +2,7 @@ RELEASE=2.0
|
|||||||
|
|
||||||
VERSION=2.0
|
VERSION=2.0
|
||||||
PACKAGE=pve-manager
|
PACKAGE=pve-manager
|
||||||
PACKAGERELEASE=15
|
PACKAGERELEASE=16
|
||||||
|
|
||||||
BINDIR=${DESTDIR}/usr/bin
|
BINDIR=${DESTDIR}/usr/bin
|
||||||
PERLLIBDIR=${DESTDIR}/usr/share/perl5
|
PERLLIBDIR=${DESTDIR}/usr/share/perl5
|
||||||
|
@ -389,6 +389,7 @@ Ext.define('PVE.Utils', { statics: {
|
|||||||
vzmigrate: [ 'CT', gettext('Migrate') ],
|
vzmigrate: [ 'CT', gettext('Migrate') ],
|
||||||
vzstart: ['CT', gettext('Start') ],
|
vzstart: ['CT', gettext('Start') ],
|
||||||
vzstop: ['CT', gettext('Stop') ],
|
vzstop: ['CT', gettext('Stop') ],
|
||||||
|
vzshutdown: ['CT', gettext('Shutdown') ],
|
||||||
srvstart: ['SRV', gettext('Start') ],
|
srvstart: ['SRV', gettext('Start') ],
|
||||||
srvstop: ['SRV', gettext('Stop') ],
|
srvstop: ['SRV', gettext('Stop') ],
|
||||||
srvrestart: ['SRV', gettext('Restart') ],
|
srvrestart: ['SRV', gettext('Restart') ],
|
||||||
|
@ -47,7 +47,7 @@ Ext.define('PVE.openvz.CmdMenu', {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
vm_command('stop');
|
vm_command('shutdown');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -43,7 +43,7 @@ Ext.define('PVE.openvz.Config', {
|
|||||||
text: gettext('Stop'),
|
text: gettext('Stop'),
|
||||||
confirmMsg: Ext.String.format(gettext("Do you really want to stop VM {0}?"), vmid),
|
confirmMsg: Ext.String.format(gettext("Do you really want to stop VM {0}?"), vmid),
|
||||||
handler: function() {
|
handler: function() {
|
||||||
vm_command("stop", { fast: 1 });
|
vm_command("stop");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ Ext.define('PVE.openvz.Config', {
|
|||||||
text: gettext('Shutdown'),
|
text: gettext('Shutdown'),
|
||||||
confirmMsg: Ext.String.format(gettext("Do you really want to shutdown VM {0}?"), vmid),
|
confirmMsg: Ext.String.format(gettext("Do you really want to shutdown VM {0}?"), vmid),
|
||||||
handler: function() {
|
handler: function() {
|
||||||
vm_command('stop');
|
vm_command('shutdown');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user