From: "Fabian Grünbichler" <f.gruenbichler@proxmox.com>
To: Proxmox Backup Server development discussion
<pbs-devel@lists.proxmox.com>,
Christian Ebner <c.ebner@proxmox.com>
Subject: Re: [pbs-devel] [PATCH v3 proxmox-backup] ui: warn of missing gc-schedule, prune/verify jobs
Date: Wed, 6 Dec 2023 15:09:14 +0100 (CET) [thread overview]
Message-ID: <1776013681.1933.1701871754440@webmail.proxmox.com> (raw)
In-Reply-To: <20231206113101.139743-1-c.ebner@proxmox.com>
> Christian Ebner <c.ebner@proxmox.com> hat am 06.12.2023 12:31 CET geschrieben:
>
> Warn about a missing garbage collection schedule, prune job or verify
> job configurations in the datastore's summary panel.
>
> Show the number of prune/verify job configurations, if there are jobs
> configured.
for all of them there are possible reasons for not having them set up:
- verify: I trust my storage to protect me against bit rot, and I don't want to incur the performance penalty of doing a full verification just to ensure logical consistency
- prune: I only do client-side pruning
- prune+GC: this is an append-only backup storage, I never want to remove data
all of those could be improved of course (logical-verification as a verify mode or new job type, changing the warning to information if a prune action was done recently, allowing an explicit "append-only" flag that actually disallows pruning, ..)
all of them except for GC also don't take namespaces into account, but that might be harder to get right.
there's another source of confusion if I am an unprivileged user - I might not "see" the jobs that are defined, and get a warning as a result, even though everything is okay. that last one *could* be tackled by leaking the count, even if not leaking the details, but I am not sure if we want to do that ;) for GC at least we could differentiate based on status code and make the user aware that unknown is for lack of privs.
I'd also differentiate between "unknown because no request made/no response retrieved yet" and "unknown because request failed" - the latter case should be a "warning" as well (and ideally contain the error at least as tool tip?), and not "missing", except if we can match the failure to missing privileges..
> Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
> ---
> changes since version 2:
> - move message string initialization to controllers `init` function
>
> changes since version 1:
> - add check mark icon for configured jobs/schedule
> - add question mark icon for unknown configuration state
> - fix typo in garbage collection variable name
> - add missing trailing commas found by pve-eslint
> - refactor message initialization to allow to use format helper
> functions
> www/datastore/Summary.js | 96 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 96 insertions(+)
>
> diff --git a/www/datastore/Summary.js b/www/datastore/Summary.js
> index a932b4e0..273a5bf0 100644
> --- a/www/datastore/Summary.js
> +++ b/www/datastore/Summary.js
> @@ -49,12 +49,30 @@ Ext.define('PBS.DataStoreInfo', {
> usage: {},
> stillbad: 0,
> mountpoint: "",
> + gcScheduleMsg: "",
> + pruneJobMsg: "",
> + verifyJobMsg: "",
> },
> },
>
> controller: {
> xclass: 'Ext.app.ViewController',
>
> + fmtConfigured: function(fmtString, params) {
> + let msg = Ext.String.format(fmtString, params);
> + return `<i class="fa fa-fw fa-lg fa-check-circle good"></i> ${msg}`;
> + },
> +
> + fmtMissing: function(fmtString, params) {
> + let msg = Ext.String.format(fmtString, params);
> + return `<i class="fa fa-fw fa-lg fa-question-circle-o warning"></i> ${msg}`;
> + },
> +
> + fmtWarning: function(fmtString, params) {
> + let msg = Ext.String.format(fmtString, params);
> + return `<i class="fa fa-fw fa-lg fa-exclamation-circle warning"></i> ${msg}`;
> + },
> +
> onLoad: function(store, data, success) {
> let me = this;
> if (!success) {
> @@ -101,6 +119,50 @@ Ext.define('PBS.DataStoreInfo', {
> vm.set('ctcount', countstext(counts.ct));
> vm.set('vmcount', countstext(counts.vm));
> vm.set('hostcount', countstext(counts.host));
> +
> + Proxmox.Utils.API2Request({
> + url: `/config/datastore/${me.view.datastore}`,
> + success: function(response) {
> + if (response.result.data['gc-schedule']) {
> + vm.set('gcScheduleMsg', me.fmtConfigured(gettext('configured')));
> + } else {
> + vm.set('gcScheduleMsg', me.fmtWarning(gettext('none configured')));
> + }
> + },
> + failure: function() {
> + vm.set('gcScheduleMsg', me.fmtMissing(gettext('unknown')));
> + },
> + });
> +
> + Proxmox.Utils.API2Request({
> + url: `/admin/prune?store=${me.view.datastore}`,
> + success: function(response) {
> + let len = response.result.data.length;
> + if (len > 0) {
> + vm.set('pruneJobMsg', me.fmtConfigured(gettext('{0} configured'), len));
> + } else {
> + vm.set('pruneJobMsg', me.fmtWarning(gettext('none configured')));
> + }
> + },
> + failure: function() {
> + vm.set('pruneJobMsg', me.fmtMissing(gettext('unknown')));
> + },
> + });
> +
> + Proxmox.Utils.API2Request({
> + url: `/admin/verify?store=${me.view.datastore}`,
> + success: function(response) {
> + let len = response.result.data.length;
> + if (len > 0) {
> + vm.set('verifyJobMsg', me.fmtConfigured(gettext('{0} configured'), len));
> + } else {
> + vm.set('verifyJobMsg', me.fmtWarning(gettext('none configured')));
> + }
> + },
> + failure: function() {
> + vm.set('verifyJobMsg', me.fmtMissing(gettext('unknown')));
> + },
> + });
> },
>
> startStore: function() { this.store.startUpdate(); },
> @@ -108,6 +170,12 @@ Ext.define('PBS.DataStoreInfo', {
>
> init: function(view) {
> let me = this;
> +
> + let vm = me.getViewModel();
> + vm.set('gcScheduleMsg', me.fmtMissing(gettext('unknown')));
> + vm.set('pruneJobMsg', me.fmtMissing(gettext('unknown')));
> + vm.set('verifyJobMsg', me.fmtMissing(gettext('unknown')));
> +
> let datastore = encodeURIComponent(view.datastore);
> me.store = Ext.create('Proxmox.data.ObjectStore', {
> interval: 5*1000,
> @@ -201,6 +269,34 @@ Ext.define('PBS.DataStoreInfo', {
> visible: '{stillbad}',
> },
> },
> + {
> + title: gettext('Garbage Collection Schedule'),
> + printBar: false,
> + bind: {
> + data: {
> + text: '{gcScheduleMsg}',
> + },
> + },
> + padding: '10 0 0 0',
> + },
> + {
> + title: gettext('Prune Jobs'),
> + printBar: false,
> + bind: {
> + data: {
> + text: '{pruneJobMsg}',
> + },
> + },
> + },
> + {
> + title: gettext('Verify Jobs'),
> + printBar: false,
> + bind: {
> + data: {
> + text: '{verifyJobMsg}',
> + },
> + },
> + },
> ],
> });
>
> --
> 2.39.2
>
>
>
> _______________________________________________
> pbs-devel mailing list
> pbs-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
next prev parent reply other threads:[~2023-12-06 14:09 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-06 11:31 Christian Ebner
2023-12-06 13:37 ` Gabriel Goller
2023-12-06 14:09 ` Fabian Grünbichler [this message]
2023-12-06 14:43 ` Christian Ebner
2023-12-11 9:09 ` Thomas Lamprecht
2023-12-11 9:44 ` Christian Ebner
2023-12-11 10:43 ` Thomas Lamprecht
2023-12-11 10:59 ` Christian Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1776013681.1933.1701871754440@webmail.proxmox.com \
--to=f.gruenbichler@proxmox.com \
--cc=c.ebner@proxmox.com \
--cc=pbs-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox