]> git.proxmox.com Git - pve-common.git/commitdiff
move Job base config & registry over from manager as PVE::Job::Registry
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 12 Nov 2022 15:00:58 +0000 (16:00 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Sat, 12 Nov 2022 15:01:04 +0000 (16:01 +0100)
It was PVE::Jobs::Plugin in pve-manager so we don't have any clash
potential, so no Breaks record required in d/control.

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/Makefile
src/PVE/Job/Registry.pm [new file with mode: 0644]

index 4e79c5d5eaa2d6d54eb2e2fe97478996364bac67..2d8bdc40c0fe11a62b2fc9e9ae9ce9cc9bf4c99a 100644 (file)
@@ -19,6 +19,7 @@ LIB_SOURCES = \
        Format.pm \
        INotify.pm \
        JSONSchema.pm \
+       Job/Registry.pm \
        LDAP.pm \
        Network.pm \
        OTP.pm \
@@ -39,6 +40,7 @@ all:
 
 install: $(addprefix PVE/,${LIB_SOURCES})
        install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE
+       install -d -m 0755 ${DESTDIR}${PERLDIR}/PVE/Job
        for i in ${LIB_SOURCES}; do install -D -m 0644 PVE/$$i ${DESTDIR}${PERLDIR}/PVE/$$i; done
 
 
diff --git a/src/PVE/Job/Registry.pm b/src/PVE/Job/Registry.pm
new file mode 100644 (file)
index 0000000..e427f49
--- /dev/null
@@ -0,0 +1,113 @@
+package PVE::Job::Registry;
+
+use strict;
+use warnings;
+
+# The job (config) base class, normally you would use this in one of two variants:
+#
+# 1) base of directly in manager and handle everything there; great for stuff that isn't residing
+#    outside of the manager, so that there is no cyclic dependency (forbidden!) required
+#
+# 2) use two (or even more) classes, one in the library (e.g., guest-common, access-control, ...)
+#    basing off this module, providing the basic config implementation. Then one in pve-manager
+#    (where every dependency is available) basing off the intermediate config one, that then holds
+#    the implementation of the 'run` method and is used in the job manager
+
+use base qw(PVE::SectionConfig);
+
+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 get_job {
+    my ($class, $cfg, $id) = @_;
+
+    return {
+    }
+}
+
+sub parse_config {
+    my ($class, $filename, $raw, $allow_unknown) = @_;
+
+    my $cfg = $class->SUPER::parse_config($filename, $raw, $allow_unknown);
+
+    foreach my $id (sort keys %{$cfg->{ids}}) {
+       my $data = $cfg->{ids}->{$id};
+
+       $data->{id} = $id;
+       $data->{enabled}  //= 1;
+
+       $data->{comment} = PVE::Tools::decode_text($data->{comment}) if defined($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, $allow_unknown) = @_;
+
+    for my $job (values $cfg->{ids}->%*) {
+       $job->{comment} = PVE::Tools::encode_text($job->{comment}) if defined($job->{comment});
+    }
+
+    $class->SUPER::write_config($filename, $cfg, $allow_unknown);
+}
+
+sub run {
+    my ($class, $cfg) = @_;
+
+    die "not implemented"; # implement in subclass
+}
+
+1;