Commit f2040340 authored by Dietmar Maurer's avatar Dietmar Maurer

improve ocf agent and openvz api

parent 7a9373bd
...@@ -254,7 +254,7 @@ __PACKAGE__->register_method({ ...@@ -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({ ...@@ -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({ ...@@ -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 => { },
},
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,
default => 60,
},
forceStop => {
description => "Make sure the Container stops.",
type => 'boolean', type => 'boolean',
description => "This is faster but can lead to unclean container shutdown.",
optional => 1, optional => 1,
default => 0,
} }
}, },
}, },
...@@ -973,21 +1029,34 @@ __PACKAGE__->register_method({ ...@@ -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;
}}); }});
......
...@@ -29,9 +29,19 @@ use constant OCF_FAILED_MASTER => 9; ...@@ -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); ...@@ -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 { ...@@ -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') { ...@@ -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') { ...@@ -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') { ...@@ -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') { ...@@ -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__ ...@@ -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 = { ...@@ -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],
......
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 ...@@ -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: { ...@@ -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', { ...@@ -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', { ...@@ -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', { ...@@ -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');
} }
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment