public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump
@ 2022-04-07 10:05 Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc Fabian Ebner
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Introduce 'protected' to automatically mark a backup as protected
upon completion, and 'notes-template' to generate notes from a
template string with certain variables.

Add both to the UI for manual backups and add 'notes-template' to the
UI for backup jobs.


Changes from v2:
    * Dropped already applied half of the series.
    * Switch to {{var}} syntax instead of $VAR.
    * Add a patch to have doc generation handle the braces.


common:

Fabian Ebner (1):
  REST handler: get property description: escape curly braces for
    asciidoc

 src/PVE/RESTHandler.pm | 3 +++
 1 file changed, 3 insertions(+)


guest-common:

Fabian Ebner (1):
  vzdump: schema: add 'notes-template' and 'protected' properties

 src/PVE/VZDump/Common.pm | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)


manager:

Fabian Ebner (4):
  vzdump: support setting protected status
  partially close #438: vzdump: support setting notes-template
  ui: backup: allow setting protected and notes-template for manual
    backup
  close #438: ui: backup job: allow setting a notes-template for a job

 PVE/VZDump.pm                 | 66 ++++++++++++++++++++++++++++++-----
 www/manager6/dc/Backup.js     | 18 ++++++++++
 www/manager6/window/Backup.js | 33 +++++++++++++++++-
 3 files changed, 107 insertions(+), 10 deletions(-)

-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  2022-04-27  8:49   ` [pve-devel] applied: " Thomas Lamprecht
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 guest-common 1/1] vzdump: schema: add 'notes-template' and 'protected' properties Fabian Ebner
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Text enclosed in unescaped curly braces will be interpreted as an
attribute reference breaking and e.g. lead to the description not
showing up at all a generated man page further down the line.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

New in v3.

Tried out various uses of curly braces and seems to work for man
pages, HTML doc and API-viewer.

 src/PVE/RESTHandler.pm | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/PVE/RESTHandler.pm b/src/PVE/RESTHandler.pm
index 4f1458b..c746181 100644
--- a/src/PVE/RESTHandler.pm
+++ b/src/PVE/RESTHandler.pm
@@ -517,6 +517,9 @@ my $get_property_description = sub {
 	chomp $wdescr;
 	$wdescr =~ s/^$/+/mg;
 
+	$wdescr =~ s/{/\\{/g;
+	$wdescr =~ s/}/\\}/g;
+
 	$res .= $wdescr . "\n";
 
 	if (my $req = $phash->{requires}) {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 guest-common 1/1] vzdump: schema: add 'notes-template' and 'protected' properties
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 1/4] vzdump: support setting protected status Fabian Ebner
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

In command_line(), notes are printed, quoted, but otherwise as is,
which is a bit ugly for multi-line notes. But it is part of the
commandline, so print it.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v2:
    * Switch to {{var}} syntax.

 src/PVE/VZDump/Common.pm | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/src/PVE/VZDump/Common.pm b/src/PVE/VZDump/Common.pm
index 83d7413..d8c78c4 100644
--- a/src/PVE/VZDump/Common.pm
+++ b/src/PVE/VZDump/Common.pm
@@ -233,7 +233,22 @@ my $confdesc = {
 	type => 'string',
 	description => 'Backup all known guest systems included in the specified pool.',
 	optional => 1,
-    }
+    },
+    'notes-template' => {
+	type => 'string',
+	description => "Template string for generating notes for the backup(s). It can contain ".
+	    "variables which will be replaced by their values. Currently supported are ".
+	    "{{cluster}}, {{guestname}}, {{node}}, and {{vmid}}, but more might be added in the ".
+	    "future.",
+	requires => 'storage',
+	optional => 1,
+    },
+    protected => {
+	type => 'boolean',
+	description => "If true, mark backup(s) as protected.",
+	requires => 'storage',
+	optional => 1,
+    },
 };
 
 sub get_confdesc {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 manager 1/4] vzdump: support setting protected status
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 guest-common 1/1] vzdump: schema: add 'notes-template' and 'protected' properties Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 2/4] partially close #438: vzdump: support setting notes-template Fabian Ebner
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Check the number of protected backups early if the protected flag
is set.

Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

No changes from v2.

 PVE/VZDump.pm | 43 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
index f34a5969..f0a28a76 100644
--- a/PVE/VZDump.pm
+++ b/PVE/VZDump.pm
@@ -4,6 +4,7 @@ use strict;
 use warnings;
 
 use Fcntl ':flock';
+use File::Basename;
 use File::Path;
 use IO::File;
 use IO::Select;
@@ -780,21 +781,33 @@ sub exec_backup_task {
 	    }
 	}
 
-	if ($backup_limit && !$opts->{remove}) {
+	if (($backup_limit && !$opts->{remove}) || $opts->{protected}) {
 	    my $count;
+	    my $protected_count;
 	    if (my $storeid = $opts->{storage}) {
-		my $backups = PVE::Storage::volume_list($cfg, $storeid, $vmid, 'backup');
-		$count = grep {
-		    !$_->{protected} && (!$_->{subtype} || $_->{subtype} eq $vmtype)
-		} $backups->@*;
+		my @backups = grep {
+		    !$_->{subtype} || $_->{subtype} eq $vmtype
+		} PVE::Storage::volume_list($cfg, $storeid, $vmid, 'backup')->@*;
+
+		$count = grep { !$_->{protected} } @backups;
+		$protected_count = scalar(@backups) - $count;
 	    } else {
 		$count = grep { !$_->{mark} || $_->{mark} ne "protected" } get_backup_file_list($opts->{dumpdir}, $bkname)->@*;
 	    }
 
-	    die "There is a max backup limit of $backup_limit enforced by the".
-		" target storage or the vzdump parameters.".
-		" Either increase the limit or delete old backup(s).\n"
-		if $count >= $backup_limit;
+	    if ($opts->{protected}) {
+		my $max_protected = PVE::Storage::get_max_protected_backups(
+		    $opts->{scfg},
+		    $opts->{storage},
+		);
+		if ($max_protected > -1 && $protected_count >= $max_protected) {
+		    die "The number of protected backups per guest is limited to $max_protected ".
+			"on storage '$opts->{storage}'\n";
+		}
+	    } elsif ($count >= $backup_limit) {
+		die "There is a max backup limit of $backup_limit enforced by the target storage ".
+		    "or the vzdump parameters. Either increase the limit or delete old backups.\n";
+	    }
 	}
 
 	if (!$self->{opts}->{pbs}) {
@@ -995,6 +1008,18 @@ sub exec_backup_task {
 	    debugmsg ('info', "archive file size: $cs", $logfd);
 	}
 
+	# Mark as protected before pruning.
+	if (my $storeid = $opts->{storage}) {
+	    my $volname = $opts->{pbs} ? $task->{target} : basename($task->{target});
+	    my $volid = "${storeid}:backup/${volname}";
+
+	    if ($opts->{protected}) {
+		debugmsg('info', "marking backup as protected", $logfd);
+		eval { PVE::Storage::update_volume_attribute($cfg, $volid, 'protected', 1) };
+		die "unable to set protected flag - $@\n" if $@;
+	    }
+	}
+
 	if ($opts->{remove}) {
 	    my $keepstr = join(', ', map { "$_=$prune_options->{$_}" } sort keys %$prune_options);
 	    debugmsg ('info', "prune older backups with retention: $keepstr", $logfd);
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 manager 2/4] partially close #438: vzdump: support setting notes-template
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
                   ` (2 preceding siblings ...)
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 1/4] vzdump: support setting protected status Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 3/4] ui: backup: allow setting protected and notes-template for manual backup Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 4/4] close #438: ui: backup job: allow setting a notes-template for a job Fabian Ebner
  5 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v2:
    * Switch to {{var}} syntax.

Arguably, a warning from failing to set notes is not very visible, but
I didn't want to make it a full-blown error.

 PVE/VZDump.pm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
index f0a28a76..ceecdbe3 100644
--- a/PVE/VZDump.pm
+++ b/PVE/VZDump.pm
@@ -70,6 +70,22 @@ sub run_command {
     PVE::Tools::run_command($cmdstr, %param, logfunc => $logfunc);
 }
 
+my $generate_notes = sub {
+    my ($notes_template, $task) = @_;
+
+    my $info = {
+	cluster => PVE::Cluster::get_clinfo()->{cluster}->{name},
+	guestname => $task->{hostname},
+	node => PVE::INotify::nodename(),
+	vmid => $task->{vmid},
+    };
+
+    my $vars = join('|', keys $info->%*);
+    $notes_template =~ s/\{\{($vars)\}\}/\Q$info->{$1}\E/g;
+
+    return $notes_template;
+};
+
 my $parse_prune_backups_maxfiles = sub {
     my ($param, $kind) = @_;
 
@@ -1013,6 +1029,13 @@ sub exec_backup_task {
 	    my $volname = $opts->{pbs} ? $task->{target} : basename($task->{target});
 	    my $volid = "${storeid}:backup/${volname}";
 
+	    if ($opts->{'notes-template'} && $opts->{'notes-template'} ne '') {
+		debugmsg('info', "adding notes to backup", $logfd);
+		my $notes = $generate_notes->($opts->{'notes-template'}, $task);
+		eval { PVE::Storage::update_volume_attribute($cfg, $volid, 'notes', $notes) };
+		debugmsg('warn', "unable to add notes - $@", $logfd) if $@;
+	    }
+
 	    if ($opts->{protected}) {
 		debugmsg('info', "marking backup as protected", $logfd);
 		eval { PVE::Storage::update_volume_attribute($cfg, $volid, 'protected', 1) };
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 manager 3/4] ui: backup: allow setting protected and notes-template for manual backup
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
                   ` (3 preceding siblings ...)
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 2/4] partially close #438: vzdump: support setting notes-template Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 4/4] close #438: ui: backup job: allow setting a notes-template for a job Fabian Ebner
  5 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Setting a width, so the text area can fill the horizontal space.

Suggested-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v2:
    * Add default value and tooltip for notes-tempalte.

 www/manager6/window/Backup.js | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/www/manager6/window/Backup.js b/www/manager6/window/Backup.js
index 726122c8..c4aafec1 100644
--- a/www/manager6/window/Backup.js
+++ b/www/manager6/window/Backup.js
@@ -154,19 +154,41 @@ Ext.define('PVE.window.Backup', {
 	    },
 	});
 
+	let protectedCheckbox = Ext.create('Proxmox.form.Checkbox', {
+	    name: 'protected',
+	    checked: false,
+	    uncheckedValue: 0,
+	    fieldLabel: gettext('Protected'),
+	});
+
 	me.formPanel = Ext.create('Proxmox.panel.InputPanel', {
 	    bodyPadding: 10,
 	    border: false,
 	    column1: [
 		storagesel,
 		modeSelector,
-		removeCheckbox,
+		protectedCheckbox,
 	    ],
 	    column2: [
 		compressionSelector,
 		mailtoField,
+		removeCheckbox,
 	    ],
 	    columnB: [
+		{
+		    xtype: 'textareafield',
+		    name: 'notes-template',
+		    fieldLabel: gettext('Notes'),
+		    anchor: '100%',
+		    value: '{{guestname}}',
+		    autoEl: {
+			tag: 'div',
+			'data-qtip': Ext.String.format(
+			    gettext('Notes added to the backup. Possible variables are {0}'),
+			    '{{cluster}}, {{guestname}}, {{node}}, {{vmid}}',
+			),
+		    },
+		},
 		{
 		    xtype: 'label',
 		    name: 'pruneLabel',
@@ -229,6 +251,14 @@ Ext.define('PVE.window.Backup', {
 		    params.compress = values.compress;
 		}
 
+		if (values.protected) {
+		    params.protected = values.protected;
+		}
+
+		if (values['notes-template']) {
+		    params['notes-template'] = values['notes-template'];
+		}
+
 		Proxmox.Utils.API2Request({
 		    url: '/nodes/' + me.nodename + '/vzdump',
 		    params: params,
@@ -272,6 +302,7 @@ Ext.define('PVE.window.Backup', {
 	    modal: true,
 	    layout: 'auto',
 	    border: false,
+	    width: 600,
 	    items: [me.formPanel],
 	    buttons: [helpBtn, '->', submitBtn],
 	    listeners: {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] [PATCH v3 manager 4/4] close #438: ui: backup job: allow setting a notes-template for a job
  2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
                   ` (4 preceding siblings ...)
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 3/4] ui: backup: allow setting protected and notes-template for manual backup Fabian Ebner
@ 2022-04-07 10:05 ` Fabian Ebner
  5 siblings, 0 replies; 8+ messages in thread
From: Fabian Ebner @ 2022-04-07 10:05 UTC (permalink / raw)
  To: pve-devel

Add a tooltip to the comment field, to better distinguish it from the
notes-template.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---

Changes from v2:
    * Squash in patch setting default value.
    * Switch to {{var}} syntax.
    * Use singular "backup" in gettext to be able to reuse same
      message as for manual backup.

 www/manager6/dc/Backup.js | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/www/manager6/dc/Backup.js b/www/manager6/dc/Backup.js
index 2b892c6f..9b129266 100644
--- a/www/manager6/dc/Backup.js
+++ b/www/manager6/dc/Backup.js
@@ -231,6 +231,24 @@ Ext.define('PVE.dc.BackupEdit', {
 		    name: 'comment',
 		    fieldLabel: gettext('Comment'),
 		    deleteEmpty: !me.isCreate,
+		    autoEl: {
+			tag: 'div',
+			'data-qtip': gettext('Description of the job'),
+		    },
+		},
+		{
+		    xtype: 'proxmoxtextfield',
+		    name: 'notes-template',
+		    fieldLabel: gettext('Notes'),
+		    deleteEmpty: !me.isCreate,
+		    value: me.isCreate ? '{{guestname}}' : undefined,
+		    autoEl: {
+			tag: 'div',
+			'data-qtip': Ext.String.format(
+			    gettext('Notes added to the backup. Possible variables are {0}'),
+			    '{{cluster}}, {{guestname}}, {{node}}, {{vmid}}',
+			),
+		    },
 		},
 	    ],
 	    onGetValues: function(values) {
-- 
2.30.2





^ permalink raw reply	[flat|nested] 8+ messages in thread

* [pve-devel] applied: [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc
  2022-04-07 10:05 ` [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc Fabian Ebner
@ 2022-04-27  8:49   ` Thomas Lamprecht
  0 siblings, 0 replies; 8+ messages in thread
From: Thomas Lamprecht @ 2022-04-27  8:49 UTC (permalink / raw)
  To: Proxmox VE development discussion, Fabian Ebner

On 07.04.22 12:05, Fabian Ebner wrote:
> Text enclosed in unescaped curly braces will be interpreted as an
> attribute reference breaking and e.g. lead to the description not
> showing up at all a generated man page further down the line.
> 
> Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
> ---
> 
> New in v3.
> 
> Tried out various uses of curly braces and seems to work for man
> pages, HTML doc and API-viewer.
> 
>  src/PVE/RESTHandler.pm | 3 +++
>  1 file changed, 3 insertions(+)
> 
>

applied, thanks!




^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-04-27  8:50 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-07 10:05 [pve-devel] [PATCH-SEREIES v3 common/guest-common/manager] add protected and notes-template parameters for vzdump Fabian Ebner
2022-04-07 10:05 ` [pve-devel] [PATCH v3 common 1/1] REST handler: get property description: escape curly braces for asciidoc Fabian Ebner
2022-04-27  8:49   ` [pve-devel] applied: " Thomas Lamprecht
2022-04-07 10:05 ` [pve-devel] [PATCH v3 guest-common 1/1] vzdump: schema: add 'notes-template' and 'protected' properties Fabian Ebner
2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 1/4] vzdump: support setting protected status Fabian Ebner
2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 2/4] partially close #438: vzdump: support setting notes-template Fabian Ebner
2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 3/4] ui: backup: allow setting protected and notes-template for manual backup Fabian Ebner
2022-04-07 10:05 ` [pve-devel] [PATCH v3 manager 4/4] close #438: ui: backup job: allow setting a notes-template for a job Fabian Ebner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal