public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fiona Ebner <f.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Subject: [pbs-devel] [PATCH proxmox 2/2] section config: fix handling array schema in unknown sections
Date: Wed, 30 Nov 2022 14:12:30 +0100	[thread overview]
Message-ID: <20221130131230.105779-2-f.ebner@proxmox.com> (raw)
In-Reply-To: <20221130131230.105779-1-f.ebner@proxmox.com>

Mostly relevant when the config is written out again after parsing it
with unknown sections. Previously, with duplicate keys, only the last
value would be saved. Now, duplicate keys are assumed to be part of
an array schema and handled as such.

Because the unknown section parsing does not know if a certain
property does actually have an array schema, it's not possible to
detect duplicate keys for non-array-schema properties, and if a
property with array-schema shows up only once, it will not be saved as
a Value::Array, but a Value::String.

Writing, or to be precise the format_section_content methods, already
handle Value::Array, so don't need to be adapted.

Fixes: 0cd0d16 ("section config: support allowing unknown section types")
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
 proxmox-section-config/src/lib.rs | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/proxmox-section-config/src/lib.rs b/proxmox-section-config/src/lib.rs
index 929ab92..66eeacf 100644
--- a/proxmox-section-config/src/lib.rs
+++ b/proxmox-section-config/src/lib.rs
@@ -529,7 +529,14 @@ impl SectionConfig {
                                 continue;
                             }
                             if let Some((key, value)) = (self.parse_section_content)(line) {
-                                config[key] = json!(value);
+                                match &mut config[&key] {
+                                    Value::Null => config[key] = json!(value),
+                                    // Assume it's an array schema in order to handle actual array
+                                    // schemas as good as we can.
+                                    Value::String(current) => config[key] = json!([current, value]),
+                                    Value::Array(array) => array.push(json!(value)),
+                                    other => bail!("got unexpected Value {:?}", other),
+                                }
                             } else {
                                 bail!("syntax error (expected section properties)");
                             }
@@ -1137,6 +1144,8 @@ fn test_section_config_array() {
     let mut config = SectionConfig::new(&ID_SCHEMA);
     config.register_plugin(plugin);
 
+    let config_unknown = SectionConfig::new(&ID_SCHEMA).allow_unknown_sections(true);
+
     let raw = r"
 
 sync: s-4a1011e8-40e2
@@ -1182,6 +1191,15 @@ sync: s-6c32330a-6204
 
     check(res);
 
+    let res_unknown = config_unknown.parse(filename, raw).unwrap();
+    println!("RES (unknown): {:?}", res_unknown);
+    let written_unknown = config_unknown.write(filename, &res_unknown).unwrap();
+    println!("CONFIG (unknown):\n{}", written_unknown);
+
+    check(res_unknown);
+
+    assert_eq!(written, written_unknown);
+
     let raw = r"
 
 sync: fail
-- 
2.30.2





  reply	other threads:[~2022-11-30 13:13 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-30 13:12 [pbs-devel] [PATCH proxmox 1/2] section config: add test for array schema Fiona Ebner
2022-11-30 13:12 ` Fiona Ebner [this message]
2022-12-12 13:06 ` [pbs-devel] applied-series: " Wolfgang Bumiller

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=20221130131230.105779-2-f.ebner@proxmox.com \
    --to=f.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
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal