Skip to content

Commit 9142595

Browse files
committed
treefile: Add new add-commit-metadata key
Add support for a new `add-commit-metadata` key in the treefile so that we can directly specify commit metadata we want to inject from there. This will be useful in Fedora CoreOS, where we'll have separate treefiles for each streams, each with stream-specific metadata values required.
1 parent 3a3f2d3 commit 9142595

File tree

6 files changed

+70
-5
lines changed

6 files changed

+70
-5
lines changed

rust/src/treefile.rs

+43-2
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,20 @@ fn merge_vec_field<T>(dest: &mut Option<Vec<T>>, src: &mut Option<Vec<T>>) {
279279
}
280280
}
281281

282+
/// Merge a map field similarly to Python's `dict.update()`. In case of
283+
/// duplicate keys, `dest` wins (`src` is the "included" config).
284+
fn merge_map_field<T>(
285+
dest: &mut Option<HashMap<String, T>>,
286+
src: &mut Option<HashMap<String, T>>)
287+
{
288+
if let Some(mut srcv) = src.take() {
289+
if let Some(mut destv) = dest.take() {
290+
srcv.extend(destv.drain());
291+
}
292+
*dest = Some(srcv);
293+
}
294+
}
295+
282296
/// Given two configs, merge them.
283297
fn treefile_merge(dest: &mut TreeComposeConfig, src: &mut TreeComposeConfig) {
284298
macro_rules! merge_basics {
@@ -291,6 +305,11 @@ fn treefile_merge(dest: &mut TreeComposeConfig, src: &mut TreeComposeConfig) {
291305
$( merge_vec_field(&mut dest.$field, &mut src.$field); )*
292306
}};
293307
};
308+
macro_rules! merge_maps {
309+
( $($field:ident),* ) => {{
310+
$( merge_map_field(&mut dest.$field, &mut src.$field); )*
311+
}};
312+
};
294313

295314
merge_basics!(
296315
treeref,
@@ -328,6 +347,9 @@ fn treefile_merge(dest: &mut TreeComposeConfig, src: &mut TreeComposeConfig) {
328347
remove_files,
329348
remove_from_packages
330349
);
350+
merge_maps!(
351+
add_commit_metadata
352+
);
331353
}
332354

333355
/// Merge the treefile externals. There are currently only two keys that
@@ -663,6 +685,9 @@ struct TreeComposeConfig {
663685
#[serde(skip_serializing_if = "Option::is_none")]
664686
#[serde(rename = "remove-from-packages")]
665687
remove_from_packages: Option<Vec<Vec<String>>>,
688+
#[serde(skip_serializing_if = "Option::is_none")]
689+
#[serde(rename = "add-commit-metadata")]
690+
add_commit_metadata: Option<HashMap<String, serde_json::Value>>,
666691

667692
#[serde(flatten)]
668693
legacy_fields: LegacyTreeComposeConfigFields,
@@ -1011,24 +1036,40 @@ rojig:
10111036
#[test]
10121037
fn test_treefile_merge() {
10131038
let basearch = Some(ARCH_X86_64);
1014-
let mut base_input = io::BufReader::new(VALID_PRELUDE.as_bytes());
1015-
let mut base = treefile_parse_stream(InputFormat::YAML, &mut base_input, basearch).unwrap();
1039+
let mut base = append_and_parse(
1040+
r###"
1041+
add-commit-metadata:
1042+
my-first-key: "please don't override me"
1043+
my-second-key: "override me"
1044+
"###,
1045+
);
10161046
let mut mid_input = io::BufReader::new(
10171047
r###"
10181048
packages:
10191049
- some layered packages
1050+
add-commit-metadata:
1051+
my-second-key: "something better"
1052+
my-third-key: 1000
1053+
my-fourth-key:
1054+
nested: table
10201055
"###
10211056
.as_bytes(),
10221057
);
10231058
let mut mid = treefile_parse_stream(InputFormat::YAML, &mut mid_input, basearch).unwrap();
10241059
let mut top_input = io::BufReader::new(ROJIG_YAML.as_bytes());
10251060
let mut top = treefile_parse_stream(InputFormat::YAML, &mut top_input, basearch).unwrap();
1061+
assert!(top.add_commit_metadata.is_none());
10261062
treefile_merge(&mut mid, &mut base);
10271063
treefile_merge(&mut top, &mut mid);
10281064
let tf = &top;
10291065
assert!(tf.packages.as_ref().unwrap().len() == 8);
10301066
let rojig = tf.rojig.as_ref().unwrap();
10311067
assert!(rojig.name == "exampleos");
1068+
let data = tf.add_commit_metadata.as_ref().unwrap();
1069+
assert!(data.get("my-first-key").unwrap().as_str().unwrap() == "please don't override me");
1070+
assert!(data.get("my-second-key").unwrap().as_str().unwrap() == "something better");
1071+
assert!(data.get("my-third-key").unwrap().as_i64().unwrap() == 1000);
1072+
assert!(data.get("my-fourth-key").unwrap().as_object().unwrap().get("nested").unwrap().as_str().unwrap() == "table");
10321073
}
10331074

10341075
#[test]

src/app/rpmostree-compose-builtin-tree.c

+14
Original file line numberDiff line numberDiff line change
@@ -711,19 +711,33 @@ rpm_ostree_compose_context_new (const char *treefile_pathstr,
711711

712712
self->metadata = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
713713
(GDestroyNotify)g_variant_unref);
714+
715+
/* metadata from the treefile itself has the lowest priority */
716+
JsonNode *add_commit_metadata_node =
717+
json_object_get_member (self->treefile, "add-commit-metadata");
718+
if (add_commit_metadata_node)
719+
{
720+
if (!rpmostree_composeutil_read_json_metadata (add_commit_metadata_node,
721+
self->metadata, error))
722+
return FALSE;
723+
}
724+
725+
/* then --add-metadata-from-json */
714726
if (opt_metadata_json)
715727
{
716728
if (!rpmostree_composeutil_read_json_metadata_from_file (opt_metadata_json,
717729
self->metadata, error))
718730
return FALSE;
719731
}
720732

733+
/* and finally --add-metadata-string */
721734
if (opt_metadata_strings)
722735
{
723736
if (!parse_metadata_keyvalue_strings (opt_metadata_strings, self->metadata, error))
724737
return FALSE;
725738
}
726739

740+
727741
g_auto(GStrv) layers = ror_treefile_get_all_ostree_layers (self->treefile_rs);
728742
if (layers && *layers && !opt_unified_core)
729743
return glnx_throw (error, "ostree-layers requires unified-core mode");

tests/compose-tests/libbasic-test.sh

+4
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ ostree --repo=${repobuild} show --print-metadata-key exampleos.tests ${treeref}
4646
assert_file_has_content meta.txt 'smoketested.*e2e'
4747
ostree --repo=${repobuild} show --print-metadata-key rpmostree.rpmmd-repos ${treeref} > meta.txt
4848
assert_file_has_content meta.txt 'id.*fedora.*timestamp'
49+
ostree --repo=${repobuild} show --print-metadata-key foobar ${treeref} > meta.txt
50+
assert_file_has_content meta.txt 'bazboo'
51+
ostree --repo=${repobuild} show --print-metadata-key overrideme ${treeref} > meta.txt
52+
assert_file_has_content meta.txt 'new val'
4953
echo "ok metadata"
5054

5155
ostree --repo=${repobuild} ls -R ${treeref} /usr/lib/ostree-boot > bootls.txt

tests/compose-tests/test-basic-unified.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ cat > metadata.json <<EOF
2121
"rev": "97ec21c614689e533d294cdae464df607b526ab9",
2222
"src": "https://gitlab.com/exampleos/custom-atomic-host"
2323
},
24-
"exampleos.tests": ["smoketested", "e2e"]
24+
"exampleos.tests": ["smoketested", "e2e"],
25+
"overrideme": "new val"
2526
}
2627
EOF
2728
runcompose --ex-unified-core --add-metadata-from-json metadata.json

tests/compose-tests/test-basic.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ cat > metadata.json <<EOF
1313
"rev": "97ec21c614689e533d294cdae464df607b526ab9",
1414
"src": "https://gitlab.com/exampleos/custom-atomic-host"
1515
},
16-
"exampleos.tests": ["smoketested", "e2e"]
16+
"exampleos.tests": ["smoketested", "e2e"],
17+
"overrideme": "new val"
1718
}
1819
EOF
1920
runcompose --add-metadata-from-json metadata.json

tests/composedata/fedora-base.json

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,9 @@
2626
"ignore-removed-users": ["root"],
2727
"ignore-removed-groups": ["root"],
2828
"check-passwd": { "type": "file", "filename": "passwd" },
29-
"check-groups": { "type": "file", "filename": "group" }
29+
"check-groups": { "type": "file", "filename": "group" },
30+
"add-commit-metadata": {
31+
"foobar": "bazboo",
32+
"overrideme": "old var"
33+
}
3034
}

0 commit comments

Comments
 (0)