From: Dominik Csapak <d.csapak@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: Re: [pbs-devel] [PATCH v2 proxmox-backup 02/15] add verify job config
Date: Thu, 8 Oct 2020 10:15:42 +0200 [thread overview]
Message-ID: <fd6d187e-9d5c-e157-e7b4-88efa3486f4b@proxmox.com> (raw)
In-Reply-To: <20201008075001.ehfl3nstli3djlyq@olga.proxmox.com>
On 10/8/20 9:50 AM, Wolfgang Bumiller wrote:
> On Wed, Oct 07, 2020 at 11:03:11AM +0200, Hannes Laimer wrote:
>> Signed-off-by: Hannes Laimer <h.laimer@proxmox.com>
>> ---
>> src/config.rs | 1 +
>> src/config/verify.rs | 189 +++++++++++++++++++++++++++++++++++++++++++
>> 2 files changed, 190 insertions(+)
>> create mode 100644 src/config/verify.rs
>>
>> diff --git a/src/config.rs b/src/config.rs
>> index c2ac6da1..ab7fc81a 100644
>> --- a/src/config.rs
>> +++ b/src/config.rs
>> @@ -23,6 +23,7 @@ pub mod network;
>> pub mod remote;
>> pub mod sync;
>> pub mod user;
>> +pub mod verify;
>>
>> /// Check configuration directory permissions
>> ///
>> diff --git a/src/config/verify.rs b/src/config/verify.rs
>> new file mode 100644
>> index 00000000..7c92a16e
>> --- /dev/null
>> +++ b/src/config/verify.rs
>> @@ -0,0 +1,189 @@
>> +use anyhow::{Error};
>> +use lazy_static::lazy_static;
>> +use std::collections::HashMap;
>> +use serde::{Serialize, Deserialize};
>> +
>> +use proxmox::api::{
>> + api,
>> + schema::*,
>> + section_config::{
>> + SectionConfig,
>> + SectionConfigData,
>> + SectionConfigPlugin,
>> + }
>> +};
>> +
>> +use proxmox::tools::{fs::replace_file, fs::CreateOptions};
>> +
>> +use crate::api2::types::*;
>> +
>> +lazy_static! {
>> + static ref CONFIG: SectionConfig = init();
>> +}
>> +
>> +
>> +#[api(
>> + properties: {
>> + id: {
>> + schema: JOB_ID_SCHEMA,
>> + },
>> + store: {
>> + schema: DATASTORE_SCHEMA,
>> + },
>> + "ignore-verified": {
>> + optional: true,
>> + schema: IGNORE_VERIFIED_BACKUPS_SCHEMA,
>> + },
>> + "outdated-after": {
>> + optional: true,
>> + schema: VERIFICATION_OUTDATED_AFTER_SCHEMA,
>> + },
>> + comment: {
>> + optional: true,
>> + schema: SINGLE_LINE_COMMENT_SCHEMA,
>> + },
>> + schedule: {
>> + optional: true,
>> + schema: VERIFY_SCHEDULE_SCHEMA,
>> + },
>> + }
>> +)]
>> +#[serde(rename_all="kebab-case")]
>> +#[derive(Serialize,Deserialize)]
>> +/// Verify Job
>> +pub struct VerifyJobConfig {
>
> First things first - can we name this `VerificationJobConfig`? I'm not a
> fan of using a verb here...
>
>> + pub id: String,
>> + pub store: String,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub ignore_verified: Option<bool>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub outdated_after: Option<i64>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub comment: Option<String>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub schedule: Option<String>,
>> +}
>> +
>> +// FIXME: generate duplicate schemas/structs from one listing?
>
> Why though?
>
> So my question there is, what is this supposed to actually represent?
>
> It is a separate struct and it contains the keys from the other struct,
> but how do they relate to each other? (And I mean apart from "we do this
> in PVE, too", I do not consider that a good argument...)
>
> Do you really need all of these fields in there or really just the id?
>
> And if you want/need all the info as part of the state, what's stopping
> you from simply using an actual struct member of type `VerifyJobConfig`
> instead of flattening it out?
>
fyi, hannes probably copied it from our sync jobs
the rationale here is that we need a list of all those properties below
in a flat array (so no nested object) for easy use in the gui
and we wanted to have a strict type (Vec<VerifyJobStatus>) instead of
Vec<Value> (or simply Value) to get some compile time guarantees
but the additional fields do not belong in the config so we needed
a second struct
>> +#[api(
>> + properties: {
>> + id: {
>> + schema: JOB_ID_SCHEMA,
>> + },
>> + store: {
>> + schema: DATASTORE_SCHEMA,
>> + },
>> + "ignore-verified": {
>> + optional: true,
>> + schema: IGNORE_VERIFIED_BACKUPS_SCHEMA,
>> + },
>> + "outdated-after": {
>> + optional: true,
>> + schema: VERIFICATION_OUTDATED_AFTER_SCHEMA,
>> + },
>> + comment: {
>> + optional: true,
>> + schema: SINGLE_LINE_COMMENT_SCHEMA,
>> + },
>> + schedule: {
>> + optional: true,
>> + schema: VERIFY_SCHEDULE_SCHEMA,
>> + },
>> + "next-run": {
>> + description: "Estimated time of the next run (UNIX epoch).",
>> + optional: true,
>> + type: Integer,
>> + },
>> + "last-run-state": {
>> + description: "Result of the last run.",
>> + optional: true,
>> + type: String,
>> + },
>> + "last-run-upid": {
>> + description: "Task UPID of the last run.",
>> + optional: true,
>> + type: String,
>> + },
>> + "last-run-endtime": {
>> + description: "Endtime of the last run.",
>> + optional: true,
>> + type: Integer,
>> + },
>> + }
>> +)]
>> +#[serde(rename_all="kebab-case")]
>> +#[derive(Serialize,Deserialize)]
>> +/// Status of Verify Job
>> +pub struct VerifyJobStatus {
>> + pub id: String,
>> + pub store: String,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub ignore_verified: Option<bool>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub outdated_after: Option<i64>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub comment: Option<String>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub schedule: Option<String>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub next_run: Option<i64>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub last_run_state: Option<String>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub last_run_upid: Option<String>,
>> + #[serde(skip_serializing_if="Option::is_none")]
>> + pub last_run_endtime: Option<i64>,
>> +}
>> +
>> +
>> +fn init() -> SectionConfig {
>> + let obj_schema = match VerifyJobConfig::API_SCHEMA {
>> + Schema::Object(ref obj_schema) => obj_schema,
>> + _ => unreachable!(),
>> + };
>> +
>> + let plugin = SectionConfigPlugin::new("verify".to_string(), Some(String::from("id")), obj_schema);
>> + let mut config = SectionConfig::new(&JOB_ID_SCHEMA);
>> + config.register_plugin(plugin);
>> +
>> + config
>> +}
>> +
>> +pub const VERIFY_CFG_FILENAME: &str = "/etc/proxmox-backup/verify.cfg";
>> +pub const VERIFY_CFG_LOCKFILE: &str = "/etc/proxmox-backup/.verify.lck";
>> +
>> +pub fn config() -> Result<(SectionConfigData, [u8;32]), Error> {
>> +
>> + let content = proxmox::tools::fs::file_read_optional_string(VERIFY_CFG_FILENAME)?;
>> + let content = content.unwrap_or(String::from(""));
>
> Use `unwrap_or_else(String::new)`.
>
>> +
>> + let digest = openssl::sha::sha256(content.as_bytes());
>> + let data = CONFIG.parse(VERIFY_CFG_FILENAME, &content)?;
>> + Ok((data, digest))
>> +}
>> +
>> +pub fn save_config(config: &SectionConfigData) -> Result<(), Error> {
>> + let raw = CONFIG.write(VERIFY_CFG_FILENAME, &config)?;
>> +
>> + let backup_user = crate::backup::backup_user()?;
>> + let mode = nix::sys::stat::Mode::from_bits_truncate(0o0640);
>> + // set the correct owner/group/permissions while saving file
>> + // owner(rw) = root, group(r)= backup
>> +
>> + let options = CreateOptions::new()
>> + .perm(mode)
>> + .owner(nix::unistd::ROOT)
>> + .group(backup_user.gid);
>> +
>> + replace_file(VERIFY_CFG_FILENAME, raw.as_bytes(), options)?;
>> +
>> + Ok(())
>> +}
>> +
>> +// shell completion helper
>> +pub fn complete_verify_job_id(_arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
>> + match config() {
>> + Ok((data, _digest)) => data.sections.iter().map(|(id, _)| id.to_string()).collect(),
>> + Err(_) => return vec![],
>> + }
>> +}
>> \ No newline at end of file
>> --
>> 2.20.1
>
>
> _______________________________________________
> 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:[~2020-10-08 8:16 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-07 9:03 [pbs-devel] [PATCH v2 proxmox-backup 00/15] add job based verify scheduling Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 01/15] add two new schemas for verify jobs Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 02/15] add verify job config Hannes Laimer
2020-10-08 7:50 ` Wolfgang Bumiller
2020-10-08 8:15 ` Dominik Csapak [this message]
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 03/15] api2: add verify job config endpoint Hannes Laimer
2020-10-08 8:22 ` Wolfgang Bumiller
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 04/15] add do_verification_job function to verify.rs Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 05/15] api2: add verify job admin endpoint Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 06/15] add scheduling for verify jobs Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 07/15] set a diffrent worker_type based on what is going to be verified(snapshot, group, ds) Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 08/15] ui: add verify job view Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 09/15] ui: add verify job edit window Hannes Laimer
2020-10-08 9:58 ` Dominik Csapak
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 10/15] ui: add task descriptions for the different types of verify(job, snapshot, group, ds) Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 11/15] remove verify_schedule field from DatastoreConfig Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 12/15] remove verify_schedule field from datastore config endpoint Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 13/15] remove verify-schedule field from DataStoreEdit and DataStoreConfig Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 14/15] remove old verification scheduling from proxmox-backup-proxy.rs Hannes Laimer
2020-10-07 9:03 ` [pbs-devel] [PATCH v2 proxmox-backup 15/15] verify job: log number of planned verifications Hannes Laimer
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=fd6d187e-9d5c-e157-e7b4-88efa3486f4b@proxmox.com \
--to=d.csapak@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal