mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-08-15 13:36:37 +00:00
jobs: move base registry to pve-common & split vzdump base out to guest-common
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
42a6d6cc77
commit
6f2e57c050
@ -15,6 +15,7 @@ use PVE::Storage;
|
|||||||
use PVE::Exception qw(raise_param_exc);
|
use PVE::Exception qw(raise_param_exc);
|
||||||
use PVE::VZDump;
|
use PVE::VZDump;
|
||||||
use PVE::VZDump::Common;
|
use PVE::VZDump::Common;
|
||||||
|
use PVE::VZDump::JobBase;
|
||||||
use PVE::Jobs; # for VZDump Jobs
|
use PVE::Jobs; # for VZDump Jobs
|
||||||
use Proxmox::RS::CalendarEvent;
|
use Proxmox::RS::CalendarEvent;
|
||||||
|
|
||||||
@ -223,8 +224,7 @@ __PACKAGE__->register_method({
|
|||||||
if $data->{ids}->{$id};
|
if $data->{ids}->{$id};
|
||||||
|
|
||||||
PVE::VZDump::verify_vzdump_parameters($param, 1);
|
PVE::VZDump::verify_vzdump_parameters($param, 1);
|
||||||
my $plugin = PVE::Jobs::Plugin->lookup('vzdump');
|
my $opts = PVE::VZDump::JobBase->check_config($id, $param, 1, 1);
|
||||||
my $opts = $plugin->check_config($id, $param, 1, 1);
|
|
||||||
|
|
||||||
$data->{ids}->{$id} = $opts;
|
$data->{ids}->{$id} = $opts;
|
||||||
|
|
||||||
@ -434,8 +434,7 @@ __PACKAGE__->register_method({
|
|||||||
die "no options specified\n" if !scalar(keys %$param);
|
die "no options specified\n" if !scalar(keys %$param);
|
||||||
|
|
||||||
PVE::VZDump::verify_vzdump_parameters($param);
|
PVE::VZDump::verify_vzdump_parameters($param);
|
||||||
my $plugin = PVE::Jobs::Plugin->lookup('vzdump');
|
my $opts = PVE::VZDump::JobBase->check_config($id, $param, 0, 1);
|
||||||
my $opts = $plugin->check_config($id, $param, 0, 1);
|
|
||||||
|
|
||||||
# try to find it in old vzdump.cron and convert it to a job
|
# try to find it in old vzdump.cron and convert it to a job
|
||||||
my ($idx) = grep { $jobs->[$_]->{id} eq $id } (0 .. scalar(@$jobs) - 1);
|
my ($idx) = grep { $jobs->[$_]->{id} eq $id } (0 .. scalar(@$jobs) - 1);
|
||||||
|
14
PVE/Jobs.pm
14
PVE/Jobs.pm
@ -4,13 +4,19 @@ use strict;
|
|||||||
use warnings;
|
use warnings;
|
||||||
use JSON;
|
use JSON;
|
||||||
|
|
||||||
use PVE::Cluster qw(cfs_read_file cfs_lock_file);
|
use PVE::Cluster qw(cfs_lock_file cfs_read_file cfs_register_file);
|
||||||
use PVE::Jobs::Plugin;
|
use PVE::Job::Registry;
|
||||||
use PVE::Jobs::VZDump;
|
use PVE::Jobs::VZDump;
|
||||||
use PVE::Tools;
|
use PVE::Tools;
|
||||||
|
|
||||||
PVE::Jobs::VZDump->register();
|
PVE::Jobs::VZDump->register();
|
||||||
PVE::Jobs::Plugin->init();
|
PVE::Job::Registry->init();
|
||||||
|
|
||||||
|
cfs_register_file(
|
||||||
|
'jobs.cfg',
|
||||||
|
sub { PVE::Job::Registry->parse_config(@_); },
|
||||||
|
sub { PVE::Job::Registry->write_config(@_); },
|
||||||
|
);
|
||||||
|
|
||||||
my $state_dir = "/var/lib/pve-manager/jobs";
|
my $state_dir = "/var/lib/pve-manager/jobs";
|
||||||
my $lock_dir = "/var/lock/pve-manager";
|
my $lock_dir = "/var/lock/pve-manager";
|
||||||
@ -284,7 +290,7 @@ sub run_jobs {
|
|||||||
|
|
||||||
next if !defined($next_sync) || time() < $next_sync; # not yet its (next) turn
|
next if !defined($next_sync) || time() < $next_sync; # not yet its (next) turn
|
||||||
|
|
||||||
my $plugin = PVE::Jobs::Plugin->lookup($type);
|
my $plugin = PVE::Job::Registry->lookup($type);
|
||||||
if (starting_job($id, $type)) {
|
if (starting_job($id, $type)) {
|
||||||
my $upid = eval { $plugin->run($cfg, $id, $schedule) };
|
my $upid = eval { $plugin->run($cfg, $id, $schedule) };
|
||||||
if (my $err = $@) {
|
if (my $err = $@) {
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
include ../../defines.mk
|
include ../../defines.mk
|
||||||
|
|
||||||
PERLSOURCE = \
|
PERLSOURCE = \
|
||||||
Plugin.pm\
|
VZDump.pm \
|
||||||
VZDump.pm
|
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
|
||||||
|
@ -1,108 +0,0 @@
|
|||||||
package PVE::Jobs::Plugin;
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use warnings;
|
|
||||||
|
|
||||||
use PVE::Cluster qw(cfs_register_file);
|
|
||||||
|
|
||||||
use base qw(PVE::SectionConfig);
|
|
||||||
|
|
||||||
cfs_register_file(
|
|
||||||
'jobs.cfg',
|
|
||||||
sub { __PACKAGE__->parse_config(@_); },
|
|
||||||
sub { __PACKAGE__->write_config(@_); }
|
|
||||||
);
|
|
||||||
|
|
||||||
my $defaultData = {
|
|
||||||
propertyList => {
|
|
||||||
type => { description => "Section type." },
|
|
||||||
id => {
|
|
||||||
description => "The ID of the job.",
|
|
||||||
type => 'string',
|
|
||||||
format => 'pve-configid',
|
|
||||||
maxLength => 64,
|
|
||||||
},
|
|
||||||
enabled => {
|
|
||||||
description => "Determines if the job is enabled.",
|
|
||||||
type => 'boolean',
|
|
||||||
default => 1,
|
|
||||||
optional => 1,
|
|
||||||
},
|
|
||||||
schedule => {
|
|
||||||
description => "Backup schedule. The format is a subset of `systemd` calendar events.",
|
|
||||||
type => 'string', format => 'pve-calendar-event',
|
|
||||||
maxLength => 128,
|
|
||||||
},
|
|
||||||
comment => {
|
|
||||||
optional => 1,
|
|
||||||
type => 'string',
|
|
||||||
description => "Description for the Job.",
|
|
||||||
maxLength => 512,
|
|
||||||
},
|
|
||||||
'repeat-missed' => {
|
|
||||||
optional => 1,
|
|
||||||
type => 'boolean',
|
|
||||||
description => "If true, the job will be run as soon as possible if it was missed".
|
|
||||||
" while the scheduler was not running.",
|
|
||||||
default => 0,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
sub private {
|
|
||||||
return $defaultData;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub parse_config {
|
|
||||||
my ($class, $filename, $raw) = @_;
|
|
||||||
|
|
||||||
my $cfg = $class->SUPER::parse_config($filename, $raw);
|
|
||||||
|
|
||||||
foreach my $id (sort keys %{$cfg->{ids}}) {
|
|
||||||
my $data = $cfg->{ids}->{$id};
|
|
||||||
|
|
||||||
$data->{id} = $id;
|
|
||||||
$data->{enabled} //= 1;
|
|
||||||
|
|
||||||
if (defined($data->{comment})) {
|
|
||||||
$data->{comment} = PVE::Tools::decode_text($data->{comment});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $cfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
# call the plugin specific decode/encode code
|
|
||||||
sub decode_value {
|
|
||||||
my ($class, $type, $key, $value) = @_;
|
|
||||||
|
|
||||||
my $plugin = __PACKAGE__->lookup($type);
|
|
||||||
return $plugin->decode_value($type, $key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub encode_value {
|
|
||||||
my ($class, $type, $key, $value) = @_;
|
|
||||||
|
|
||||||
my $plugin = __PACKAGE__->lookup($type);
|
|
||||||
return $plugin->encode_value($type, $key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub write_config {
|
|
||||||
my ($class, $filename, $cfg) = @_;
|
|
||||||
|
|
||||||
for my $job (values $cfg->{ids}->%*) {
|
|
||||||
if (defined($job->{comment})) {
|
|
||||||
$job->{comment} = PVE::Tools::encode_text($job->{comment});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$class->SUPER::write_config($filename, $cfg);
|
|
||||||
}
|
|
||||||
|
|
||||||
sub run {
|
|
||||||
my ($class, $cfg) = @_;
|
|
||||||
# implement in subclass
|
|
||||||
die "not implemented";
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
@ -3,71 +3,25 @@ package PVE::Jobs::VZDump;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
use PVE::INotify;
|
|
||||||
use PVE::VZDump::Common;
|
|
||||||
use PVE::API2::VZDump;
|
|
||||||
use PVE::Cluster;
|
use PVE::Cluster;
|
||||||
use PVE::JSONSchema;
|
use PVE::JSONSchema;
|
||||||
|
|
||||||
use base qw(PVE::Jobs::Plugin);
|
use PVE::VZDump::Common;
|
||||||
|
|
||||||
sub type {
|
use PVE::API2::VZDump;
|
||||||
return 'vzdump';
|
|
||||||
}
|
|
||||||
|
|
||||||
my $props = PVE::VZDump::Common::json_config_properties();
|
use base qw(PVE::VZDump::JobBase);
|
||||||
|
|
||||||
sub properties {
|
|
||||||
return $props;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub options {
|
|
||||||
my $options = {
|
|
||||||
enabled => { optional => 1 },
|
|
||||||
schedule => {},
|
|
||||||
comment => { optional => 1 },
|
|
||||||
'repeat-missed' => { optional => 1 },
|
|
||||||
};
|
|
||||||
foreach my $opt (keys %$props) {
|
|
||||||
if ($props->{$opt}->{optional}) {
|
|
||||||
$options->{$opt} = { optional => 1 };
|
|
||||||
} else {
|
|
||||||
$options->{$opt} = {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $options;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub decode_value {
|
|
||||||
my ($class, $type, $key, $value) = @_;
|
|
||||||
|
|
||||||
if ((my $format = $PVE::VZDump::Common::PROPERTY_STRINGS->{$key}) && !ref($value)) {
|
|
||||||
$value = PVE::JSONSchema::parse_property_string($format, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub encode_value {
|
|
||||||
my ($class, $type, $key, $value) = @_;
|
|
||||||
|
|
||||||
if ((my $format = $PVE::VZDump::Common::PROPERTY_STRINGS->{$key}) && ref($value) eq 'HASH') {
|
|
||||||
$value = PVE::JSONSchema::print_property_string($value, $format);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
sub run {
|
sub run {
|
||||||
my ($class, $conf) = @_;
|
my ($class, $conf) = @_;
|
||||||
|
|
||||||
|
my $props = $class->properties();
|
||||||
# remove all non vzdump related options
|
# remove all non vzdump related options
|
||||||
foreach my $opt (keys %$conf) {
|
foreach my $opt (keys %$conf) {
|
||||||
delete $conf->{$opt} if !defined($props->{$opt});
|
delete $conf->{$opt} if !defined($props->{$opt});
|
||||||
}
|
}
|
||||||
|
|
||||||
# Required as string parameters
|
# Required as string parameters # FIXME why?! we could just check ref()
|
||||||
for my $key (keys $PVE::VZDump::Common::PROPERTY_STRINGS->%*) {
|
for my $key (keys $PVE::VZDump::Common::PROPERTY_STRINGS->%*) {
|
||||||
if ($conf->{$key} && ref($conf->{$key}) eq 'HASH') {
|
if ($conf->{$key} && ref($conf->{$key}) eq 'HASH') {
|
||||||
my $format = $PVE::VZDump::Common::PROPERTY_STRINGS->{$key};
|
my $format = $PVE::VZDump::Common::PROPERTY_STRINGS->{$key};
|
||||||
@ -77,7 +31,7 @@ sub run {
|
|||||||
|
|
||||||
$conf->{quiet} = 1; # do not write to stdout/stderr
|
$conf->{quiet} = 1; # do not write to stdout/stderr
|
||||||
|
|
||||||
PVE::Cluster::cfs_update(); # refresh vmlist
|
PVE::Cluster::cfs_update(); # refresh vmlist; FIXME: move this to the job run loop
|
||||||
|
|
||||||
return PVE::API2::VZDump->vzdump($conf);
|
return PVE::API2::VZDump->vzdump($conf);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user