Skip to content

Commit bf939de

Browse files
committed
Update inventory query execution to handle IgnoreErrors the same as pyreclass
Not validated yet
1 parent c92bb00 commit bf939de

1 file changed

Lines changed: 95 additions & 7 deletions

File tree

src/invqueries/mod.rs

Lines changed: 95 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -168,17 +168,21 @@ impl Query {
168168
let o = Item::Obj(var.clone());
169169
let mut r = Mapping::new();
170170
for (n, node) in &exports.exports {
171-
let m = node
172-
.merged(exports.reclass.unwrap())
173-
.map_err(|e| anyhow!("while rendering exports for {n}: {e}"))?;
174-
let n_exports = m.get_exports();
171+
let m = node.merged(exports.reclass.unwrap());
172+
let n_exports = if let Ok(merged) = m.as_ref() {
173+
merged.get_exports()
174+
} else if self.ignore_errors {
175+
&Mapping::new()
176+
} else {
177+
return Err(m.err().unwrap());
178+
};
175179
let nv = o
176-
.value(n_exports, self.ignore_errors)
180+
.value(n_exports, true)
177181
.map_err(|e| anyhow!("while evaluating export value for {n}: {e}"))?;
178182
eprintln!("Got value {nv:?} for export {} for node {n}", self.qstr);
179183
if let Some(e) = self.expr.as_ref() {
180184
let ee = e
181-
.evaluate(n_exports, self.ignore_errors)
185+
.evaluate(n_exports, true)
182186
.map_err(|e| anyhow!("while evaluating export expression for {n}: {e}"))?;
183187
eprintln!("evaluating expr {e:?} with {n_exports:?}: {ee}");
184188
if ee {
@@ -295,12 +299,13 @@ mod invqueries_test {
295299
}
296300

297301
#[test]
298-
fn test_resolve_simple_errors_1() {
302+
fn test_resolve_missing_export_1() {
299303
let qstr = " exports:n1 ";
300304
let q = Query::parse(qstr).unwrap();
301305
let mut exports = Exports::default();
302306
let r = Reclass::new("./tests/inventory", "nodes", "classes", false).unwrap();
303307
exports.reclass = Some(&r);
308+
let mut expected = Mapping::new();
304309
for n in ["n1", "n2", "n3"] {
305310
let node = make_node(
306311
n,
@@ -312,11 +317,94 @@ mod invqueries_test {
312317
),
313318
);
314319
exports.exports.insert(n.into(), node);
320+
if n == "n1" {
321+
expected
322+
.insert(n.into(), Value::Literal("bar".to_owned()))
323+
.unwrap();
324+
}
325+
}
326+
let v = q.resolve(&exports).unwrap();
327+
assert_eq!(v, Value::Mapping(expected));
328+
}
329+
330+
#[test]
331+
fn test_resolve_errors_1() {
332+
let qstr = " exports:n1 ";
333+
let q = Query::parse(qstr).unwrap();
334+
let mut exports = Exports::default();
335+
let r = Reclass::new("./tests/inventory", "nodes", "classes", false).unwrap();
336+
exports.reclass = Some(&r);
337+
for n in ["n1", "n2", "n3"] {
338+
let node = if n == "n3" {
339+
make_node(
340+
n,
341+
&format!(
342+
r#"
343+
classes:
344+
- notexisting
345+
exports:
346+
{n}: bar
347+
"#
348+
),
349+
)
350+
} else {
351+
make_node(
352+
n,
353+
&format!(
354+
r#"
355+
exports:
356+
{n}: bar
357+
"#
358+
),
359+
)
360+
};
361+
exports.exports.insert(n.into(), node);
315362
}
316363
let v = q.resolve(&exports);
317364
assert!(v.is_err());
318365
}
319366

367+
#[test]
368+
fn test_resolve_ignore_errors_1() {
369+
let qstr = " +IgnoreErrors exports:foo ";
370+
let q = Query::parse(qstr).unwrap();
371+
let mut exports = Exports::default();
372+
let r = Reclass::new("./tests/inventory", "nodes", "classes", false).unwrap();
373+
exports.reclass = Some(&r);
374+
let mut expected = Mapping::new();
375+
for n in ["n1", "n2", "n3"] {
376+
let node = if n == "n3" {
377+
make_node(
378+
n,
379+
&format!(
380+
r#"
381+
classes:
382+
- notexisting
383+
exports:
384+
{n}: bar
385+
"#
386+
),
387+
)
388+
} else {
389+
make_node(
390+
n,
391+
r#"
392+
exports:
393+
foo: bar
394+
"#,
395+
)
396+
};
397+
exports.exports.insert(n.into(), node);
398+
if n != "n3" {
399+
expected
400+
.insert(n.into(), Value::Literal("bar".to_owned()))
401+
.unwrap();
402+
}
403+
}
404+
let v = q.resolve(&exports).unwrap();
405+
assert_eq!(v, Value::Mapping(expected));
406+
}
407+
320408
#[test]
321409
fn test_resolve_cond_1() {
322410
let qstr = " exports:foo if exports:foo != n3 ";

0 commit comments

Comments
 (0)