检查验证器 Puppet 架构

概览

验证器系统会发送 FIDL 命令来控制“puppet”程序,该程序会调用库功能来修改验证器随后评估的某些状态。如需详细了解检查验证工具,请参阅自述文件

Puppet 包含以下部分:

  • 提供 FIDL 协议。
  • 解压缩协议并进行库调用。
  • 构建包含 Puppet 和验证器程序的集成测试。

本文档重点介绍了位于 //src/diagnostics/Verifier/inspect/lib/rust/src/main.rs 的 Inspect Validator Rust Puppet。

FIDL 设计

用于检查 Puppet 的 FIDL 协议在 //src/diagnostics/Verifier/inspect/fidl/inspect_puppet.fidl 中定义。FIDL 协议与 Inspect Library API 中的函数密切相关,后者定义了要应用于任何 Inspect API 实现的操作。FIDL API 编写为与 Rust API 相对应。

(注意:检查 API 可以不同于 Rust API;此类 API 可能需要修改伪代码架构。)

传送 FIDL

main() 函数会执行样板代码,通过 run_driver_service() 提供单个 FIDL 客户端,后者会从 FIDL 流接收 InitializeAct 事件。Act 事件由 Actor 对象解压缩,该对象保留控制 Inspect 库所需的状态。

Actor 和 Inspect 库

Actor 包含一个 Inspector(Inspect 库的入口点对象)、一个哈希映射 nodes 和一个哈希映射 properties。它会实现一个函数 act(),该函数包含一个巨大的 match 语句(在其他语言中是“switch”或“case”),以调用该库实现的每个操作。Puppet 可以针对库不支持的操作报告 Unimplemented

验证工具调用每个操作后,将测试库对 VMO 的影响。该库应负责传播操作的效果,以便验证器能够看到这些操作。

nodesproperties 的哈希映射会存储 Inspect 库返回的值。由于 Rust 是一种 RAII 语言,会在对内存的引用丢失时自动进行清理,因此未存储节点或属性会导致该节点或属性立即被删除。此外,存储属性还允许更新其值以响应 FIDL 命令。

测试和构建系统

验证器和 Puppet 的组合应进行封闭的集成测试。

依赖项和名称

验证器的 BUILD.gn 文件定义了一个 validator_bin 目标,Rust 木偶的 BUILD.gn 文件将其用作名为 inspect_validator_test_rusttest_package()(用于执行 Rust 木偶的测试)的依赖项。

Rust puppet 本身是一个组件。 该构建规则会生成 inspect_validator_rust_puppet,它包含在 fuchsia_unittest_package() 的二进制文件中。

验证工具的 Build.gn 文件中的 validator_bin 目标包含在 fuchsia_unittest_package()deps 中。

CQ/CI

通过将 inspect_validator_test_rust 放在其 BUILD.gngroup("tests")deps 中,您可以轻松地将 inspect_validator/lib/rust:tests 添加到 src/diagnostics/BUILD.gngroup("tests")deps 中。构建系统将会获取此标识符,并使 Inspect Validator Rust Puppet 测试在 CQ 和 CI 中运行。

.cml Meta 文件

//src/diagnostics/Verifier/inspect/meta 中包含以下 CML 文件:

  • puppet.slice.cml

    让 puppet 二进制文件运行,使用 logger 和 Inspect,然后提供 Verified 协议。

  • 验证工具.cml

    • use: protocol: 指定验证工具需要运行的服务。
      • fuchsia.diagnostics.ArchiveAccessor 允许读取 puppet 已发布的 Inspect 数据。
      • diagnostics.validate.InspectPuppet 允许其控制木偶。
    • children: name: "puppet" 会将木偶置于组件层次结构中。
    • children: url: "#meta/puppet.cm" 允许找到并加载木偶。
    • 若要显示 puppet 的日志,则需要 offer: protocol: "fuchsia.logger.LogSink"
    • 为每个 Puppet 的验证程序提供必要的结构化配置。
  • test.fragment.cml

    定义运行 Inspect Validator 测试管理器所需的功能,该管理器是验证程序和组件的父级。

这些分片由每个 puppet 目录中的 puppet 和验证器的 CML 文件使用,或供测试管理器使用。目前有 4 种木偶:

验证器控制器的 CML 在 fuchsia_unittest_package()(对于 Rust 或 C++)或 fuchsia_unittest_component()(对于 Go)的 manifest 键中引用。