From be4ba99c25329b18e39b6001fcdf2a9a7280096a Mon Sep 17 00:00:00 2001 From: jlanson Date: Tue, 17 Dec 2024 10:16:51 -0500 Subject: [PATCH] chore(docs): added developer docs Initial documentation oriented towards developers, describing the repo structure, Hipcheck distributed architecture, and plugin query control flow. Signed-off-by: jlanson --- site/content/docs/contributing/_index.md | 4 + .../contributing/developer-docs/_index.md | 25 +++ .../developer-docs/architecture.md | 57 +++++ .../developer_docs_plugin_grpc.drawio | 1 + .../developer_docs_plugin_grpc.png | Bin 0 -> 110185 bytes ...veloper_docs_plugin_sender_receiver.drawio | 1 + .../developer_docs_plugin_sender_receiver.png | Bin 0 -> 60866 bytes .../plugin-query-system/index.md | 212 ++++++++++++++++++ .../developer-docs/repo-structure.md | 83 +++++++ 9 files changed, 383 insertions(+) create mode 100644 site/content/docs/contributing/developer-docs/_index.md create mode 100644 site/content/docs/contributing/developer-docs/architecture.md create mode 100755 site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.drawio create mode 100755 site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.png create mode 100755 site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.drawio create mode 100755 site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.png create mode 100644 site/content/docs/contributing/developer-docs/plugin-query-system/index.md create mode 100644 site/content/docs/contributing/developer-docs/repo-structure.md diff --git a/site/content/docs/contributing/_index.md b/site/content/docs/contributing/_index.md index d76135bd..8f721195 100644 --- a/site/content/docs/contributing/_index.md +++ b/site/content/docs/contributing/_index.md @@ -30,4 +30,8 @@ A walkthrough of running Hipcheck for the first time. A walkthrough of running Hipcheck for the first time. {% end %} +{% waypoint(title="Developer Docs", path="@/docs/contributing/developer-docs/_index.md") %} +Documentation for Hipcheck developers. +{% end %} + diff --git a/site/content/docs/contributing/developer-docs/_index.md b/site/content/docs/contributing/developer-docs/_index.md new file mode 100644 index 00000000..dfd27f77 --- /dev/null +++ b/site/content/docs/contributing/developer-docs/_index.md @@ -0,0 +1,25 @@ +--- +title: Developer Docs +template: docs.html +sort_by: weight +page_template: docs_page.html +weight: 3 +--- + +# Hipcheck Developer Docs + +
+ +{% waypoint(title="Repo Structure", path="@/docs/contributing/developer-docs/repo-structure.md") %} +List of key directories in the Hipcheck repository. +{% end %} + +{% waypoint(title="Architecture", path="@/docs/contributing/developer-docs/architecture.md") %} +Hipcheck's distributed architecture and how plugins get started. +{% end %} + +{% waypoint(title="Query System", path="@/docs/contributing/developer-docs/plugin-query-system/index.md") %} +The life of a plugin query from inception, through gRPC, to SDK, and back. +{% end %} + +
diff --git a/site/content/docs/contributing/developer-docs/architecture.md b/site/content/docs/contributing/developer-docs/architecture.md new file mode 100644 index 00000000..f845270f --- /dev/null +++ b/site/content/docs/contributing/developer-docs/architecture.md @@ -0,0 +1,57 @@ +--- +title: Architecture +weight: 2 +--- + +# Architecture and Plugin Startup + +This document describes the distributed architecture of Hipcheck and how plugins +get started. + +Hipcheck is a relatively simple multiprocessed tool that follows a star topology +(there is a single central node to which all other nodes connect). Users invoke +the main Hipcheck binary, often referred to as "Hipcheck core" or `hc`, on the +command line, and provide a [policy file][policy_file] which specifies the set +of top-level plugins to use during analysis. Once Hipcheck resolves these +plugins and their dependencies, it starts each plugin in a separate child +process. Once all plugins are started and initialized, Hipcheck +core enters the analysis phase. During this phase it acts as a simple hub for +querying top-level plugins and relaying queries between plugins, as plugins are +intended to only communicate with each other through the core. + +## Plugin Startup + +Hipcheck core uses the `plugins/manager.rs::PluginExecutor` struct to start +plugins. The `PluginExecutor` has fields like `max_spawn_attempts` and +`backoff_interval` for controlling the startup process. These fields can be +configured using the `Exec.kdl` file. + +The main function in `PluginExecutor` is `start_plugin()`, which takes a +description of a plugin on file and returns a `Result` containing a handle to +the plugin process, called `PluginContext`. + +In `start_plugin()`, once the `PluginExecutor` has done the work of locating the +plugin entrypoint binary on disk, it moves into a loop of attempting to start +the plugin, at most `max_spawn_attempts` times. For each spawn attempt, it will +call `PluginExecutor::get_available_port()` to get valid local port to tell the +plugin to listen on. The executor creates a +`std::process::Command` object for the child process, with `stdout/stderr` +forwarded to Hipcheck core. + +Within each spawn attempt, `PluginExecutor` will try to connect to the port on +which the plugin should be listening. Since process startup and port +initialization can take differing amounts of time, the executor does a series of +up to `max_conn_attempts` connection attempts. For each failed connection, +the executor waits `backoff_interval`, which increases linearly with the number of +failed connections. The calculated backoff is modulated by a random `jitter` +between 0 and `jitter_percent`. + +Overall, the sleep duration between failed connections is equal to + + (backoff * conn_attempts) * (1.0 +/- jitter) + +As soon as `PluginExecutor::start_plugin()` successfully starts and connects to the child +process, it stores the process and plugin information in a `PluginContext` and +returns it to the caller. It however returns an error if `max_spawn_attempts` is reached. + +[policy_file]: @/docs/guide/config/policy-file.md diff --git a/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.drawio b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.drawio new file mode 100755 index 00000000..fb114031 --- /dev/null +++ b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.png b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_grpc.png new file mode 100755 index 0000000000000000000000000000000000000000..3df47e63417bdff79131282e6a9a61fc7aa4a07c GIT binary patch literal 110185 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

9sr)T}Gr8*_59Hd~- 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 z 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 ZaYkBEc7|(T>xTjU$;+rn=S!MA`yUH+RzLs% literal 0 HcmV?d00001 diff --git a/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.drawio b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.drawio new file mode 100755 index 00000000..6b98368e --- /dev/null +++ b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.png b/site/content/docs/contributing/developer-docs/plugin-query-system/developer_docs_plugin_sender_receiver.png new file mode 100755 index 0000000000000000000000000000000000000000..7d573d092848b23f4724fc54ed94eeec8ee505af GIT binary patch literal 60866 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®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 Bh&ccN literal 0 HcmV?d00001 diff --git a/site/content/docs/contributing/developer-docs/plugin-query-system/index.md b/site/content/docs/contributing/developer-docs/plugin-query-system/index.md new file mode 100644 index 00000000..e860305a --- /dev/null +++ b/site/content/docs/contributing/developer-docs/plugin-query-system/index.md @@ -0,0 +1,212 @@ +--- +title: Plugin Query System +weight: 3 +--- + +# Plugin Query System + +This document describes the control flow through [Hipcheck core][hc_core], down +to gRPC, into the [Rust SDK][rust_sdk], and back to the core during a plugin +system query. This document assumes the plugins are already started and +configured, and that we have established a gRPC stream with them over which to +send and receive messages defined by our `hipcheck-common/proto` protobuf +schema. + +## Overview and Design Requirements + +Hipcheck plugins are child processes of the Hipcheck core process that it +communicates with over distinct gRPC channels. Each Hipcheck plugin defines a +set of query endpoints that act as remote functions. They each receive a JSON- +serialized key and return a JSON-serialized result. During a query endpoint's +execution, it may need to invoke another plugin's query endpoint(s). All +communicaton between plugins goes through Hipcheck core, so just as Hipcheck +core issues a request to a given endpoint, the endpoint can ask Hipcheck core to +issue another request to a different endpoint and report back the reponse so +that the original endpoint can complete its own behavior. + +A "session" describes the series of messages between Hipcheck core and a query +endpoint needed to complete a single query. This includes those queries made by +the endpoint to other plugins as part of answering the original query. Hipcheck +expects each plugin to be able to handle multiple active "sessions," such that +if a queried endpoint is waiting for it's own request to be responded to by +Hipcheck core, the plugin process is not blocked from receiving and handling new +queries, including to the same query endpoint. Thus, each query object sent to +and from the plugin has a session ID field to associate it with a particular +session. + +![Rust SDK Sender-Receiver Pairs](developer_docs_plugin_sender_receiver.png) + +In Rust, the gRPC channel is accessed with using a `mpsc::{Sender, Receiver}` +pair. The `Sender` can be cloned many times, meaning that many threads can +`send` messages on the channel without needing exclusive access to any resource. +However, a `Receiver` cannot be shared. The Rust SDK addresses this restriction +and the above multiple-session, single-channel requirement by having a +`HcSessionSocket` object that has the exclusive `Receiver` to the plugin's gRPC +channel with Hipcheck core. When it receives a message from Hipcheck core, the +`HcSessionSocket` determines which existing local session the message belongs +to, and forwards that message on a separate, private `Sender/Receiver` pair that +it has with that session. Each session is represented by a `PluginEngine` +instance. When the `PluginEngine` receives a message on its local `Receiver`, it +knows that the message is not intended for any other session currently executing +in the plugin. If the `HcSessionSocket` receives a request message that does not +correspond to any existing session, it spawns a new `PluginEngine` to handle the +new session and creates a new private `Sender/Receiver` pair for communicating +with it. + +`PluginEngine` instances eventually have to send messages back to Hipcheck core. +Because `Sender` objects can be cloned, the `HcSessionSocket` simply maintains a +copy of the `Sender` for sending messages to Hipcheck core, and gives each +`PluginEngine` a cloned instance of that `Sender`. In summation, all gRPC +messages received by the Rust SDK from Hipcheck Core must go through +`HcSessionSocket` for demultiplexing, but each `PluginEngine` can send messages +to Hipcheck core on the gRPC channel directly. + +### `hipcheck-common` and Chunking + +The actual type that we can send over our gRPC channel to the live plugin is +called `PluginQuery`, and is automatically defined by the Rust code generated +from the protobuf definitions in `hipcheck-common/proto`. We choose to define +this high-level `Query` object to allow us to control the Hipcheck-facing struct +definition. For instance, `PluginQuery`'s `state` field is an `i32`, but for +`Query` we can make `state` a custom `enum` and translate from +`PluginQuery.state` to improve readability. + +An additional complexity is that gRPC has a maximum per-message size of 4MB. To +abstract this reality from users, the `hipcheck-common` crate defines a chunking +algorithm used by both Hipcheck core and the Rust SDK. Each code-facing `Query` +object is chunked into one or more `PluginQuery` objects before being sent on +the wire, and on the listening side the message is de-fragemented with a +`hipcheck-common::QuerySynthesizer`. + +![Query Control Flow with Rust SDK](developer_docs_plugin_grpc.png) + +## Part 1: Sending a request to a plugin + +The plugin query system begins with a call to `score_results()`, which iterates +through all the policy file's top-level analyses one-by-one. For each, +`score_results()` calls `HcEngine::query()`, which is the entrypoint for all +queries to plugins. `HcEngine::query()` is memo-ized using the `salsa` crate, so +the running `hc` core binary caches all queries and responses sent through +`HcEngine::query()`. If later in execution `HcEngine::query()` is called again +for the same set of parameters, it will return the cached output value without +involving the plugin process. + +As described in the Overview, Hipcheck core has a unique gRPC channel with each +running plugin, so the first thing `HcEngine::query()` must do is find the +appropriate channel handle for the target plugin. The `HcPluginCore` object that +powers `HcEngine` under the hood (set with `HcEngine::set_core()`) has a map +containing all the plugin handles. `HcEngine::query()` keys this map using the +target publisher/plugin pair to get the appropriate plugin handle, which is an +object of type `ActivePlugin`. It then forwards the target query endpoint and +key to `ActivePlugin::query()`. + +Now that we have the active plugin handle, and therefore the right gRPC channel +for this query, we can formulate a query message. `ActivePlugin::query()` +formulates the high-level `Query` object and forwards it to the `query()` +function of the contained `PluginTransport` type. `ActivePlugin` is merely a +thin wrapper around `PluginTransport` with some additional state tracking +the next session ID to use. + +Inside `PluginTransport::query()` is where the `Query` object gets chunked into +a `Vec` and each one gets sent over the gRPC channel. We have now +successfully sent out a query. + +## Part 2 - Receiving Queries from gRPC + +Meanwhile, the plugin process (if using the Rust SDK), has been listening on the +gRPC channel with `HcSessionSocket.rx::recv()`. As mentioned in the Overview, +there is one `HcSessionSocket` instance that receives all `PluginQuery` messages +off the wire. Each message is returned to the `HcSessionSocket::listen()` +function, which determines if the message's session ID matches its list of +active sessions. If not, this newly-received `PluginQuery` object marks the +start of a new session, so the `HcSessionSocket` creates and initializes a +`PluginEngine` instance to handle it. `HcSessionSocket` creates a one-way `mpsc` +channel for it to forward `PluginQuery` objects with the appropriate session ID +to this `PluginEngine`. Thus, when a `PluginEngine` called `recv()` on its +channel that it shares with `HcSessionSocket`, it can be sure that all messages +have the same session ID. The last thing `HcSessionSocket::listen()` does is +forward the `PluginQuery` over this channel, then goes back to listening for +gRPC messages. + +The `PluginQuery` travels up through `PluginEngine::recv_raw()` into +`PluginEngine::recv()`, where it is de-fragmentized with zero or more +other messages to produce a software-facing `Query` object. + +If this is the first `Query` to a new `PluginEngine`, the object is +received by `PluginEngine::handle_session_fallible()`. The `PluginEngine` +doesn't yet know which query endpoint to call, so it has to match +`Query.name` against the output of `Plugin.queries()` to find the right +one. Once we have the right endpoint, we take the key (the argument) from +`Query.key` and call the endpoint with it. + +## Part 3 - Querying other plugins + +Now we are actually executing query endpoint code. Over the course of its +execution, the endpoint may need information from another plugin. To enable +the query endpoint to do so, each query endpoint is provided a handle to +its associated `PluginEngine` along with the query key. The endpoint can then +call `PluginEngine::query()` with the plugin publisher and name, the target +query endpoint name, and the query key. Within `PluginEngine::query()`, these +parameters are formulated into a `Query` object and forwarded to +`PluginEngine::send()`. The `send()` function uses the chunking algorithm from +`hipcheck-common` to produce a `Vec` and send them out over the +gRPC channel `Sender` with `PluginEngine.tx::send()`. As a reminder, this does +not go back through the `HcSessionSocket`, the `PluginEngine` can send messages +to Hipcheck core directly. + +## Part 4 - Receiving and Interpreting Messages from Plugins + +When we last left the Hipcheck core, it had just sent its `Vec` +over gRPC with `PluginTransport.tx::send()`. Note that this is just one thread +of execution in Hipcheck core. Just as a plugin process must be able to handle +multiple live sessions, the Hipcheck core may have multiple tasks each executing +independent queries. Thus, Hipcheck has the same issue of ensuring messages +received from the gRPC channel make it to the correct `PluginTransport` objects, +but it solves this problem differently than the Rust SDK does. + +Each `PluginTransport` object shares a `Mutex` that guards the +`MultiplexedQueryReceiver` object. While the `PluginTransport` waits for a +message from the `PluginEngine` session that was spawned remotely to handle its +request, it enters a loop. In each iteration of the loop, it blocks until it can +acquire the `MulitplexedQueryReceiver`. Once it has acquired the receiver, it +checks the receiver's backlog for any messages matching its target session ID. +If none are found, it listens on the gRPC wire directly for the next message. If +the next message matches our session, we take the message, otherwise we put it +in the backlog to save it for the `PluginTransport` that does want that message. +After this, we drop our lock on the `Mutex` and +restart the loop. The reason we drop and re-acquire the lock is so that one +`PluginTransport` that spends a very long time waiting for its message(s) does +not prevent other `PluginTransport` instances from receiving their messages. By +dropping and trying to re-acquire the `Mutex` lock, we give other +`PluginTransport` instances a chance to acquire the receiver. + +The `PluginTransport` continues this loop until it has received all the +`PluginQuery` objects it needs to de-fragment into a `Query` object. It then +returns the `Query` to the caller, which is `ActivePlugin::query()`. This +function does the job of converting `Query` into a Hipcheck core-specific type +called `PluginResponse`. Until now, the Hipcheck core has not really checked the +content of the `Query`, but now it needs to decide whether the `Query` is the +query endpoint returning a value or requesting additional information. The +`PluginResponse` enum separates these two possibilities, plus an additional +error variant. + +`ActivePlugin::query()` returns the `PluginResponse` up to the caller, namely +`HcEngine::query()`. Here, if the `PluginResponse` was `Completed`, we have +finished the query and return its output value that was stored as a field in +`Completed`. Otherwise, we have to recursively call `HcEngine::query()` with the +query information stored in `PluginResponse::AwaitingResult`. + +Once this recursive call completes, we must forward the output of that query to +forward to our original query endpoint who asked for it. We do this by passing +that output to `ActivePlugin::resume_query()`. One of the main differences of +this function is that the generated `Query` object uses an existing session ID +instead of a newly-generated one, since this `Query` is part of an ongoing +session. + +The original query endpoint may return a `PluginResponse::AwaitingResult` zero +or more times, but eventually we will get a `PluginResponse::Completed`, and by +passing the contained output up to the calling function, we have completed a +query using the plugin system! + +[hc_core]: @/docs/contributing/developer-docs/architecture.md +[rust_sdk]: @/docs/guide/making-plugins/rust-sdk.md diff --git a/site/content/docs/contributing/developer-docs/repo-structure.md b/site/content/docs/contributing/developer-docs/repo-structure.md new file mode 100644 index 00000000..981d1931 --- /dev/null +++ b/site/content/docs/contributing/developer-docs/repo-structure.md @@ -0,0 +1,83 @@ +--- +title: Repo Structure +weight: 1 +--- + +# The Hipcheck Repository + +This document describes the overall layout of the Hipcheck repository, in an +effort to help new developers become acquainted with where different +functionality resides. + +## The Repository Root + +The repository is a cargo workspace, containing multiple crates and +organizational directories. + +Some of these directories include: +- `hipcheck/` - The main `hc` binary crate. +- `sdk/` - Contains the plugin [software development kits (SDKs)][plugin_sdk] maintained by the Hipcheck + team for various languages, which each language's SDK in a separate subdirectory. + - `rust/` - The Hipcheck [Rust SDK][rust_sdk] crate. +- `hipcheck-common/` - An internal library crate containing functionality shared between the `hc` binary crate and the Rust SDK. + - `proto/` - The Protobuf protocol definition for communication between the `hc` binary and plugins. +- `hipcheck-macros/` - An internal library crate of proc macros for the `hc` binary. +- `hipcheck-sdk-macros/` - An internal library crate of proc macros for the Rust SDK. +- `plugins/` - Contains each plugin supported directly by the Hipcheck team as a + separate crate. +- `site/` - Source for the Hipcheck website. +- `dist/` - Items related to distributing Hipcheck as a container. +- `xtask/` - A crate containing custom commands that can be invoked via `cargo xtask ` within the Hipcheck workspace. + `src/task/` - Contains each module corresponding to a single `xtask` subcommand. + +## The Hipcheck binary crate + +Important modules within the `hipcheck/` binary crate include: +- `cache/` - Implements the `hc cache` subcommand for manipulating the + repository and plugin caches. +- `cli.rs` - Defines the Hipcheck command line interface. +- `config.rs` - Functionality for calculating the Hipcheck score tree from a + policy file. +- `engine.rs` - Entrypoint for interacting with Hipcheck plugins. +- `init/` - Code to be run as part of Hipcheck's startup. +- `main.rs` - Entrypoint for executing any of the subcommands defined by + `cli.rs`. +- `plugin/` - All code related to retreiving, managing, and starting plugins. +- `policy/` - Defines policy files and their parsing. +- `policy_expr/` - Defines the [policy expression language][policy_expr] parsing and execution. +- `report/` - Functionality for building a report from the results of an + analysis. +- `score.rs` - Combining score tree and analysis results to produce an overall + risk score for the analysis. +- `session/` - Managing a given Hipcheck `check` execution from start to finish, + including plugin retrieval and execution, policy file parsing, analysis, + scoring, and report building. +- `setup.rs` - Implements the `hc setup` subcommand that does one-time actions + as part of a Hipcheck installation. +- `shell/` - Managing the terminal output of the Hipcheck `hc` process. +- `source/` - Code for manipulating Git repositories. +- `target/` - Defines the various types of Hipcheck analysis targets (e.g. + SBOMs, packages, GitHub repos, local repos, etc.), how they are identified + from a user-supplied string, and how they resolve to a particular repo and + commit for analysis. + +### The `policy_expr` Module + +- `token.rs` - Definition of the tokens that make up the policy expression + language using the `logos` crate +- `bridge.rs` - Code for making `logos` interoperable with `nom` parser crate. +- `expr.rs` - Definitions of language objects (functions, primitives, etc.) and + the `nom` parsers that transform token streams into them. +- `error.rs` - Definitions of errors related to parsing and executing policy + expressions. +- `json_pointer.rs` - Code for injecting JSON data into policy expressions. +- `env.rs` - Definition and standard impl of the `Env` struct, which defines the + implementation of functions used in the policy expression language. +- `pass.rs` - Visitor or mutating operations on an entire `expr.rs::Expr` tree, + such as resolving functions and type checking/fixing. +- `mod.rs` - Definition of expression execution and standard pre-execution pass + groupings. + +[plugin_sdk]: @/docs/rfds/0006-rust-plugin-sdk.md +[rust_sdk]: @/docs/guide/making-plugins/rust-sdk.md +[policy_expr]: @/docs/guide/config/policy-expr.md