You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[ls-apis] support APIs exposed by multiple servers
Currently, `cargo xtask ls-apis` will fail when it encounters an API
that is served by multiple entities.
For example, when adding the `ereporter-api` in #7833, which is served
by both MGS and sled-agent, `ls-apis` currently fails with an error like
this one:
```console
eliza@theseus ~/Code/oxide/omicron $ cargo xtask ls-apis apis
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.45s
Running `target/debug/xtask ls-apis apis`
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.01s
Running `target/debug/ls-apis apis`
loading metadata for workspace omicron from current workspace
loading metadata for workspace lldp from /home/eliza/.cargo/git/checkouts/lldp-d47de417041f191b/ce952e6/Cargo.toml
loading metadata for workspace propolis from /home/eliza/.cargo/git/checkouts/propolis-d68c8bd1bc59c9bd/6b5f2af/Cargo.toml
loading metadata for workspace crucible from /home/eliza/.cargo/git/checkouts/crucible-0a48bd218bc2bbbc/81a3528/Cargo.toml
loading metadata for workspace maghemite from /home/eliza/.cargo/git/checkouts/maghemite-c0236f0fd3d582b6/caafd88/Cargo.toml
loading metadata for workspace dendrite from /home/eliza/.cargo/git/checkouts/dendrite-ae9f1715c17fc765/a66561e/Cargo.toml
note: ignoring Cargo dependency from crucible-pantry -> ... -> crucible-control-client
note: ignoring Cargo dependency from omicron-sled-agent -> dns-server
error: API for client ereporter-client appears to be exported by multiple components: at least omicron-sled-agent and omicron-gateway (DepPath([PackageId { repr: "path+file:///home/eliza/Code/oxide/omicron/gateway#omicron-gateway@0.1.0" }]))
Error: found at least one API exported by multiple servers
# ... backtrace snipped for brevity ...
```
This is unfortunate, as it would be nice to be able to have such APIs
without breaking `ls-apis`. Therefore, this commit adds support for APIs
with multiple server components. This change ends up being pretty
straightforward; it's mainly just changing the `api_producers` map from
a map of client package names to server components to a map of client
package names to *a map of* server components, and updating the code
that consumes this information to loop over those server components as
appropriate.
Now, the various `ls-apis` commands can handle the new `ereproter-api`.
For example:
```console
eliza@theseus ~/Code/oxide/omicron $ cargo xtask ls-apis apis
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.37s
Running `target/debug/xtask ls-apis apis`
Compiling omicron-ls-apis v0.1.0 (/home/eliza/Code/oxide/omicron/dev-tools/ls-apis)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.69s
Running `target/debug/ls-apis apis`
loading metadata for workspace omicron from current workspace
loading metadata for workspace lldp from /home/eliza/.cargo/git/checkouts/lldp-d47de417041f191b/ce952e6/Cargo.toml
loading metadata for workspace maghemite from /home/eliza/.cargo/git/checkouts/maghemite-c0236f0fd3d582b6/caafd88/Cargo.toml
loading metadata for workspace propolis from /home/eliza/.cargo/git/checkouts/propolis-d68c8bd1bc59c9bd/6b5f2af/Cargo.toml
loading metadata for workspace crucible from /home/eliza/.cargo/git/checkouts/crucible-0a48bd218bc2bbbc/81a3528/Cargo.toml
loading metadata for workspace dendrite from /home/eliza/.cargo/git/checkouts/dendrite-ae9f1715c17fc765/a66561e/Cargo.toml
note: ignoring Cargo dependency from crucible-pantry -> ... -> crucible-control-client
note: ignoring Cargo dependency from omicron-sled-agent -> dns-server
Bootstrap Agent (client: bootstrap-agent-client)
consumed by: omicron-sled-agent (omicron/sled-agent) via 1 path
consumed by: wicketd (omicron/wicketd) via 2 paths
# ... snipped irrelevant APIs for brevity ...
Ereporter (client: ereporter-client)
consumed by: omicron-nexus (omicron/nexus) via 1 path
# ... snipped irrelevant APIs for brevity ...
eliza@theseus ~/Code/oxide/omicron $ cargo xtask ls-apis check
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.32s
Running `target/debug/xtask ls-apis check`
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.52s
Running `target/debug/ls-apis check`
loading metadata for workspace omicron from current workspace
loading metadata for workspace lldp from /home/eliza/.cargo/git/checkouts/lldp-d47de417041f191b/ce952e6/Cargo.toml
loading metadata for workspace maghemite from /home/eliza/.cargo/git/checkouts/maghemite-c0236f0fd3d582b6/caafd88/Cargo.toml
loading metadata for workspace propolis from /home/eliza/.cargo/git/checkouts/propolis-d68c8bd1bc59c9bd/6b5f2af/Cargo.toml
loading metadata for workspace crucible from /home/eliza/.cargo/git/checkouts/crucible-0a48bd218bc2bbbc/81a3528/Cargo.toml
loading metadata for workspace dendrite from /home/eliza/.cargo/git/checkouts/dendrite-ae9f1715c17fc765/a66561e/Cargo.toml
note: ignoring Cargo dependency from crucible-pantry -> ... -> crucible-control-client
note: ignoring Cargo dependency from omicron-sled-agent -> dns-server
Server-managed APIs:
Clickhouse Cluster Admin for Keepers (clickhouse-admin-keeper-client, exposed by omicron-clickhouse-admin)
Clickhouse Cluster Admin for Servers (clickhouse-admin-server-client, exposed by omicron-clickhouse-admin)
Clickhouse Single-Node Cluster Admin (clickhouse-admin-single-client, exposed by omicron-clickhouse-admin)
CockroachDB Cluster Admin (cockroach-admin-client, exposed by omicron-cockroach-admin)
Crucible Agent (crucible-agent-client, exposed by crucible-agent)
Crucible Control (for testing only) (crucible-control-client, exposed by propolis-server)
Crucible Pantry (crucible-pantry-client, exposed by crucible-pantry)
Maghemite DDM Admin (ddm-admin-client, exposed by ddmd)
DNS Server (dns-service-client, exposed by dns-server)
Ereporter (ereporter-client, exposed by omicron-gateway, omicron-sled-agent)
Management Gateway Service (gateway-client, exposed by omicron-gateway)
LLDP daemon (lldpd-client, exposed by lldpd)
Maghemite MG Admin (mg-admin-client, exposed by mgd)
External API (oxide-client, exposed by omicron-nexus)
Oximeter (oximeter-client, exposed by oximeter-collector)
Propolis (propolis-client, exposed by propolis-server)
Sled Agent (sled-agent-client, exposed by omicron-sled-agent)
Wicketd (wicketd-client, exposed by wicketd)
Client-managed API:
Bootstrap Agent (bootstrap-agent-client, exposed by omicron-sled-agent)
reason: depends on itself (i.e., instances call each other)
Dendrite DPD (dpd-client, exposed by dpd)
reason: Sled Agent calling DPD creates a circular dependency
Wicketd Installinator (installinator-client, exposed by wicketd)
reason: client is provided implicitly by the operator
Nexus Internal API (nexus-client, exposed by omicron-nexus)
reason: Circular dependencies between Nexus and other services
Crucible Repair (repair-client, exposed by crucible-downstairs)
reason: depends on itself (i.e., instances call each other)
Repo Depot API (repo-depot-client, exposed by omicron-sled-agent)
reason: depends on itself (i.e., instances call each other)
APIs with unknown version management: none
````
0 commit comments