Fix include: with machineid-compat and a few other keys

It turns out we basically have to slap an `Option<T>` around
everything, (in particular `bool` etc.) we need to be able
to distinguish in (I believe) all the cases between
"value unspecified" and "value provided".

Concretely it didn't work to try to set `machineid-compat: false`
in an included yaml treefile becuase it was just defaulted to `true`
by the toplevel.

Down the line we should move all of the parsing into Rust
and have two different `struct` types for "YAML we load" versus
"verified treefile".

Closes: https://github.com/projectatomic/rpm-ostree/issues/1524

Closes: #1525
Approved by: lucab
This commit is contained in:
Colin Walters 2018-08-28 14:09:57 -04:00 committed by Atomic Bot
parent 1984848b8e
commit 3d60a31aaa
2 changed files with 17 additions and 11 deletions

View File

@ -207,11 +207,9 @@ pub struct Rojig {
pub description: Option<String>, pub description: Option<String>,
} }
// https://github.com/serde-rs/serde/issues/368 // Because of how we handle includes, *everything* here has to be
fn serde_true() -> bool { // Option<T>. The defaults live in the code (e.g. machineid-compat defaults
true // to `true`).
}
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
pub struct TreeComposeConfig { pub struct TreeComposeConfig {
@ -272,20 +270,21 @@ pub struct TreeComposeConfig {
pub initramfs_args: Option<Vec<String>>, pub initramfs_args: Option<Vec<String>>,
// Tree layout options // Tree layout options
#[serde(default)] #[serde(skip_serializing_if = "Option::is_none")]
pub boot_location: BootLocation, pub boot_location: Option<BootLocation>,
#[serde(default)] #[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "tmp-is-dir")] #[serde(rename = "tmp-is-dir")]
pub tmp_is_dir: bool, pub tmp_is_dir: Option<bool>,
// systemd // systemd
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub units: Option<Vec<String>>, pub units: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub default_target: Option<String>, pub default_target: Option<String>,
#[serde(default = "serde_true")] #[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "machineid-compat")] #[serde(rename = "machineid-compat")]
pub machineid_compat: bool, // Defaults to `true`
pub machineid_compat: Option<bool>,
// versioning // versioning
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
@ -419,6 +418,7 @@ packages-s390x:
let tf = &t.tf; let tf = &t.tf;
assert!(tf.parsed.rojig.is_none()); assert!(tf.parsed.rojig.is_none());
assert!(tf.rojig_spec.is_none()); assert!(tf.rojig_spec.is_none());
assert!(tf.parsed.machineid_compat.is_none());
} }
#[test] #[test]

View File

@ -19,8 +19,14 @@ assert_file_has_content_literal err.txt \
"'units' directive is incompatible with machineid-compat = false" "'units' directive is incompatible with machineid-compat = false"
echo "ok conflict with units" echo "ok conflict with units"
# In this test we also want to test that include:
# correctly handles machineid-compat.
prepare_compose_test "machineid-compat" prepare_compose_test "machineid-compat"
pysetjsonmember "machineid-compat" 'False' pysetjsonmember "machineid-compat" 'False'
cat > composedata/fedora-machineid-compat-includer.yaml <<EOF
include: fedora-machineid-compat.json
EOF
export treefile=composedata/fedora-machineid-compat-includer.yaml
runcompose runcompose
echo "ok compose" echo "ok compose"