use std::collections::BTreeMap;
use std::net::SocketAddr;
use std::path::{Path, PathBuf};
use std::process::Stdio;
use std::time::Duration;
use anyhow::{bail, Context, Result};
use tokio::process::Command;
use tracing::{info, warn};
use super::ingress::IngressRule;
use super::slot_field_u16;
use crate::config::{CloudConfig, Provider};
pub const POND_TLD: &str = "pond.localhost";
pub const POND_CERT_SANS: [&str; 5] = [
"*.pond.localhost",
"pond.localhost",
"localhost",
"127.0.0.1",
"::1",
];
pub const DEFAULT_DOOR_PORT: u16 = 8443;
pub const DEFAULT_POND_ENV: &str = "pond";
const STATIC_SLOT: &str = "static";
const UPSTREAM_HOST: &str = "127.0.0.1";
const CERT_FILE: &str = "pond-cert.pem";
const KEY_FILE: &str = "pond-key.pem";
pub fn door_state_dir(workspace_root: &Path) -> PathBuf {
workspace_root.join(".yah/infra/pond/_door")
}
pub fn pond_hostname(service: &str, env: &str, component: Option<&str>) -> String {
let mut label = dns_label(service);
if env != DEFAULT_POND_ENV {
label.push('-');
label.push_str(&dns_label(env));
}
if let Some(c) = component {
label.push('-');
label.push_str(&dns_label(c));
}
format!("{label}.{POND_TLD}")
}
fn dns_label(s: &str) -> String {
let mut out = String::with_capacity(s.len());
for ch in s.chars() {
if ch.is_ascii_alphanumeric() {
out.push(ch.to_ascii_lowercase());
} else if !out.ends_with('-') {
out.push('-');
}
}
out.trim_matches('-').to_string()
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PondDoorPlan {
pub listen: SocketAddr,
pub rules: Vec<IngressRule>,
pub sources: Vec<String>,
}
impl PondDoorPlan {
pub fn upstreams_env(&self) -> Result<String> {
Ok(self
.rules
.iter()
.map(IngressRule::passway_upstream)
.collect::<Result<Vec<_>>>()?
.join(","))
}
pub fn urls(&self) -> Vec<String> {
self.rules
.iter()
.map(|r| {
if self.listen.port() == 443 {
format!("https://{}", r.hostname)
} else {
format!("https://{}:{}", r.hostname, self.listen.port())
}
})
.collect()
}
pub fn is_empty(&self) -> bool {
self.rules.is_empty()
}
}
pub fn plan_pond_door(cfg: &CloudConfig, listen: SocketAddr) -> Result<PondDoorPlan> {
let mut rules: Vec<IngressRule> = Vec::new();
let mut sources: Vec<String> = Vec::new();
let mut by_host: BTreeMap<String, String> = BTreeMap::new();
let mut by_port: BTreeMap<u16, String> = BTreeMap::new();
for (service, swm) in &cfg.services {
for (env, mirror) in &swm.mirrors {
let mut fronted: Vec<(String, Option<String>, u16)> = Vec::new();
for (role, slot) in &mirror.providers {
if slot.inline_kind() != Some(Provider::MiniflareContainer) {
continue;
}
let (base, component) = split_slot_role(role);
if base != STATIC_SLOT {
continue;
}
let Some(port) = slot_field_u16(slot.fields(), "port") else {
warn!(
service = %service,
env = %env,
slot = %role,
"pond mirror declares no `port` — skipping (nothing to front)",
);
continue;
};
fronted.push((role.clone(), component.map(str::to_string), port));
}
if fronted.is_empty() {
fronted.extend(bare_container_ponds(cfg, swm, env));
}
for (role, component, port) in fronted {
let hostname = pond_hostname(service, env, component.as_deref());
let label = format!("{service}/{env}");
if let Some(first) = by_host.get(&hostname) {
bail!(
"pond hostname {hostname:?} is claimed by both {first} and {label} — \
one hostname routes one way, so the second would be dead config that \
reads as live. Rename one of the services, or give one of them a \
distinct mirror env."
);
}
if let Some(first) = by_port.get(&port) {
bail!(
"pond port {port} is claimed by both {first} and {label} — two \
miniflares cannot bind the same host port, so whichever comes up \
second fails to bind. Give one of them its own \
`[providers.{STATIC_SLOT}] port`."
);
}
by_host.insert(hostname.clone(), label.clone());
by_port.insert(port, label.clone());
rules.push(IngressRule {
hostname,
port,
slot: role.clone(),
provider_id: None,
machine: None,
upstream_host: Some(UPSTREAM_HOST.to_string()),
});
if !sources.contains(&label) {
sources.push(label);
}
}
}
}
rules.sort_by(|a, b| a.hostname.cmp(&b.hostname));
sources.sort();
Ok(PondDoorPlan {
listen,
rules,
sources,
})
}
fn bare_container_ponds(
cfg: &CloudConfig,
swm: &crate::config::ServiceWithMirrors,
env: &str,
) -> Vec<(String, Option<String>, u16)> {
if env != DEFAULT_POND_ENV {
return Vec::new();
}
let mut out = Vec::new();
for component in &swm.service.components {
if component.kind != "container" || component.git.is_some() {
continue;
}
let manifest = cfg
.workspace_root
.join(&component.path)
.join("workload.toml");
let Ok(src) = std::fs::read_to_string(&manifest) else {
continue;
};
match super::container::parse_container_recipe(&src) {
Ok(recipe) => match recipe.run.host_port.or(recipe.run.port) {
Some(port) => out.push((
format!("component:{}", component.id),
Some(component.id.clone()),
port,
)),
None => warn!(
manifest = %manifest.display(),
"container pond declares no [run].port — skipping (nothing to dial)",
),
},
Err(e) => warn!(
manifest = %manifest.display(),
error = %e,
"container pond manifest did not parse — skipping",
),
}
}
if out.len() == 1 {
out[0].1 = None;
}
out
}
fn split_slot_role(role: &str) -> (&str, Option<&str>) {
match role.split_once(':') {
Some((base, component)) => (base, Some(component)),
None => (role, None),
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CertPair {
pub cert: PathBuf,
pub key: PathBuf,
}
pub fn ensure_pond_cert(state_dir: &Path, reissue: bool) -> Result<CertPair> {
ensure_pond_cert_as(state_dir, reissue, is_root())
}
pub fn ensure_pond_cert_as(
state_dir: &Path,
reissue: bool,
running_as_root: bool,
) -> Result<CertPair> {
let pair = CertPair {
cert: state_dir.join(CERT_FILE),
key: state_dir.join(KEY_FILE),
};
if !reissue && pair.cert.exists() && pair.key.exists() {
return Ok(pair);
}
if running_as_root {
bail!(
"refusing to issue the pond leaf as root: mkcert's CA lives in YOUR login keychain \
and home directory, not root's, so issuing here would mint a leaf from a second CA \
that no browser trusts — and leave it root-owned in your tree.\n\n yah cloud pond \
cert # as yourself, once\n sudo yah cloud pond door --port 443\n\nThe \
serve half is fine as root; only issuance is not.",
);
}
std::fs::create_dir_all(state_dir)
.with_context(|| format!("creating pond door state dir {}", state_dir.display()))?;
let caroot = mkcert_caroot().with_context(|| {
format!(
"`mkcert` is not on PATH — the pond front door needs a browser-trusted leaf for \
{}, which no public CA can issue (the name is not public) and which a self-signed \
cert cannot make a browser accept.\n\n brew install mkcert nss # nss = Firefox \
trust store\n mkcert -install # one-time, asks for your password\n\n\
Then re-run this command.",
POND_CERT_SANS[0],
)
})?;
if !caroot.join("rootCA.pem").exists() {
bail!(
"mkcert is installed but its local CA is not (no rootCA.pem in {}). Run `mkcert \
-install` once — it asks for your password and writes the macOS login keychain \
plus the NSS/Firefox stores — then re-run this command.",
caroot.display(),
);
}
let out = std::process::Command::new("mkcert")
.arg("-cert-file")
.arg(&pair.cert)
.arg("-key-file")
.arg(&pair.key)
.args(POND_CERT_SANS)
.output()
.context("running mkcert to issue the pond wildcard leaf")?;
if !out.status.success() {
bail!(
"mkcert failed to issue the pond leaf ({}): {}",
out.status,
String::from_utf8_lossy(&out.stderr).trim(),
);
}
info!(
cert = %pair.cert.display(),
caroot = %caroot.display(),
"issued pond wildcard leaf",
);
Ok(pair)
}
pub fn is_root() -> bool {
unsafe { libc::geteuid() == 0 }
}
fn mkcert_caroot() -> Option<PathBuf> {
let out = std::process::Command::new("mkcert")
.arg("-CAROOT")
.stderr(Stdio::null())
.output()
.ok()?;
if !out.status.success() {
return None;
}
let path = String::from_utf8_lossy(&out.stdout).trim().to_string();
(!path.is_empty()).then(|| PathBuf::from(path))
}
pub fn resolve_passway_binary(workspace_root: &Path) -> Result<PathBuf> {
if let Some(p) = std::env::var_os("PASSWAY_BIN") {
let p = PathBuf::from(p);
if p.exists() {
return Ok(p);
}
bail!(
"PASSWAY_BIN points at {}, which does not exist",
p.display()
);
}
for rel in [
"oss/passway/target/release/passway",
"oss/passway/target/debug/passway",
] {
let p = workspace_root.join(rel);
if p.exists() {
return Ok(p);
}
}
if std::process::Command::new("passway")
.arg("--version")
.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.map(|s| s.success())
.unwrap_or(false)
{
return Ok(PathBuf::from("passway"));
}
bail!(
"no passway binary found. Build it once:\n\n cargo build --release \
--manifest-path oss/passway/Cargo.toml -p passway\n\nor point PASSWAY_BIN at one.",
)
}
pub fn door_env(
plan: &PondDoorPlan,
cert: &CertPair,
state_dir: &Path,
) -> Result<Vec<(String, String)>> {
Ok(vec![
("PASSWAY_LISTEN".into(), plan.listen.to_string()),
("PASSWAY_TLS_MODE".into(), "manual".into()),
("PASSWAY_TLS_CERT".into(), cert.cert.display().to_string()),
("PASSWAY_TLS_KEY".into(), cert.key.display().to_string()),
("PASSWAY_UPSTREAM_SOURCE".into(), "static".into()),
("PASSWAY_UPSTREAMS".into(), plan.upstreams_env()?),
("PASSWAY_UPSTREAM_TLS".into(), "false".into()),
(
"PASSWAY_PID_FILE".into(),
state_dir
.join(format!("pingora-{}.pid", plan.listen.port()))
.display()
.to_string(),
),
(
"PASSWAY_UPGRADE_SOCK".into(),
state_dir
.join(format!("upgrade-{}.sock", plan.listen.port()))
.display()
.to_string(),
),
])
}
const READY_LINE: &str = "passway listening on";
pub async fn spawn_pond_door(
workspace_root: &Path,
plan: &PondDoorPlan,
cert: &CertPair,
ready_timeout: Duration,
) -> Result<tokio::process::Child> {
let state_dir = door_state_dir(workspace_root);
std::fs::create_dir_all(&state_dir)
.with_context(|| format!("creating pond door state dir {}", state_dir.display()))?;
let bin = resolve_passway_binary(workspace_root)?;
if super::pond::port_has_listener(&plan.listen.ip().to_string(), plan.listen.port()) {
bail!(
"{} already has a listener — another pond door (or an unrelated process) holds it. \
Stop it, or pass a different port.",
plan.listen,
);
}
if plan.listen.port() < 1024 {
warn!(
port = plan.listen.port(),
"binding a privileged port: this needs root on macOS/Linux and camp never sudos — \
expect EACCES unless you arranged for it",
);
}
let mut cmd = Command::new(&bin);
for (k, v) in door_env(plan, cert, &state_dir)? {
cmd.env(k, v);
}
cmd.stdout(Stdio::piped())
.stderr(Stdio::piped())
.kill_on_drop(true);
let mut child = cmd
.spawn()
.with_context(|| format!("spawning passway from {}", bin.display()))?;
let (ready_tx, ready_rx) = tokio::sync::oneshot::channel::<()>();
if let Some(stderr) = child.stderr.take() {
let mut ready_tx = Some(ready_tx);
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let mut lines = BufReader::new(stderr).lines();
while let Ok(Some(line)) = lines.next_line().await {
if line.contains(READY_LINE) {
if let Some(tx) = ready_tx.take() {
let _ = tx.send(());
}
}
eprintln!("{line}");
}
});
}
if let Some(stdout) = child.stdout.take() {
tokio::spawn(async move {
use tokio::io::{AsyncBufReadExt, BufReader};
let mut lines = BufReader::new(stdout).lines();
while let Ok(Some(line)) = lines.next_line().await {
println!("{line}");
}
});
}
match tokio::time::timeout(ready_timeout, ready_rx).await {
Ok(Ok(())) => {
info!(
listen = %plan.listen,
fronting = plan.rules.len(),
"pond front door ready",
);
Ok(child)
}
Ok(Err(_)) | Err(_) => {
let _ = child.start_kill();
let _ = child.wait().await;
bail!(
"passway never reported {READY_LINE:?} on {} within {:?} — its log is above. \
An unreadable cert path and a privileged port are the two that fail here.",
plan.listen,
ready_timeout,
)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::MirrorProviderSlot;
fn rule(hostname: &str, port: u16) -> IngressRule {
IngressRule {
hostname: hostname.into(),
port,
slot: STATIC_SLOT.into(),
provider_id: None,
machine: None,
upstream_host: Some(UPSTREAM_HOST.into()),
}
}
fn plan(rules: Vec<IngressRule>, port: u16) -> PondDoorPlan {
PondDoorPlan {
listen: format!("127.0.0.1:{port}").parse().unwrap(),
rules,
sources: vec![],
}
}
#[test]
fn hostname_is_one_label_under_the_pond_tld() {
assert_eq!(
pond_hostname("yah-dashboard", "pond", None),
"yah-dashboard.pond.localhost"
);
assert_eq!(
pond_hostname("yah-dashboard", "local-sim", None),
"yah-dashboard-local-sim.pond.localhost"
);
assert_eq!(
pond_hostname("yah", "pond", Some("docs")),
"yah-docs.pond.localhost"
);
for env in ["pond", "local-sim"] {
let h = pond_hostname("yah-dashboard", env, None);
let label = h.strip_suffix(&format!(".{POND_TLD}")).unwrap();
assert!(!label.contains('.'), "{h} nests below the wildcard");
}
}
#[test]
fn odd_service_names_become_valid_labels() {
assert_eq!(dns_label("Yah_Dashboard"), "yah-dashboard");
assert_eq!(dns_label("--weird--name--"), "weird-name");
assert_eq!(dns_label("a.b.c"), "a-b-c");
}
#[test]
fn upstreams_render_in_passways_host_fan_in_grammar() {
let p = plan(
vec![
rule("yah-dashboard.pond.localhost", 4323),
rule("yah-marketing.pond.localhost", 4322),
],
8443,
);
assert_eq!(
p.upstreams_env().unwrap(),
"yah-dashboard.pond.localhost=127.0.0.1:4323,\
yah-marketing.pond.localhost=127.0.0.1:4322"
);
}
#[test]
fn urls_drop_the_port_only_on_443() {
assert_eq!(
plan(vec![rule("a.pond.localhost", 1)], 8443).urls(),
vec!["https://a.pond.localhost:8443"]
);
assert_eq!(
plan(vec![rule("a.pond.localhost", 1)], 443).urls(),
vec!["https://a.pond.localhost"]
);
}
#[test]
fn door_env_carries_no_acme_knob() {
let p = plan(vec![rule("a.pond.localhost", 4322)], 8443);
let cert = CertPair {
cert: "/tmp/c.pem".into(),
key: "/tmp/k.pem".into(),
};
let env = door_env(&p, &cert, Path::new("/tmp/door")).unwrap();
let keys: Vec<&str> = env.iter().map(|(k, _)| k.as_str()).collect();
assert!(
!keys.iter().any(|k| k.starts_with("PASSWAY_ACME")),
"the pond door must never select passway's ACME arm — no public CA can issue for \
a .localhost name: {keys:?}",
);
let get = |k: &str| {
env.iter()
.find(|(n, _)| n == k)
.map(|(_, v)| v.as_str())
.unwrap()
};
assert_eq!(get("PASSWAY_TLS_MODE"), "manual");
assert_eq!(get("PASSWAY_LISTEN"), "127.0.0.1:8443");
assert_eq!(get("PASSWAY_UPSTREAM_SOURCE"), "static");
}
#[test]
fn issuing_as_root_is_refused_but_reusing_an_existing_leaf_is_not() {
let dir = tempfile::tempdir().unwrap();
let state = dir.path().join("_door");
let err = ensure_pond_cert_as(&state, false, true).unwrap_err();
let msg = format!("{err:#}");
assert!(msg.contains("yah cloud pond cert"), "got: {msg}");
assert!(msg.contains("--port 443"), "got: {msg}");
assert!(
!state.exists(),
"a refused issue must not leave a root-owned state dir behind",
);
std::fs::create_dir_all(&state).unwrap();
std::fs::write(state.join(CERT_FILE), b"leaf").unwrap();
std::fs::write(state.join(KEY_FILE), b"key").unwrap();
let pair = ensure_pond_cert_as(&state, false, true).expect("reuse is allowed as root");
assert_eq!(pair.cert, state.join(CERT_FILE));
}
#[test]
fn the_pid_file_and_upgrade_sock_are_keyed_by_port() {
let cert = CertPair {
cert: "/tmp/c.pem".into(),
key: "/tmp/k.pem".into(),
};
let paths = |port: u16| -> (String, String) {
let p = plan(vec![rule("a.pond.localhost", 4322)], port);
let env = door_env(&p, &cert, Path::new("/tmp/door")).unwrap();
let get = |k: &str| {
env.iter()
.find(|(n, _)| n == k)
.map(|(_, v)| v.clone())
.unwrap()
};
(get("PASSWAY_PID_FILE"), get("PASSWAY_UPGRADE_SOCK"))
};
let (pid_8443, sock_8443) = paths(8443);
let (pid_443, sock_443) = paths(443);
assert!(pid_8443.ends_with("/door/pingora-8443.pid"), "{pid_8443}");
assert!(pid_443.ends_with("/door/pingora-443.pid"), "{pid_443}");
assert_ne!(pid_8443, pid_443);
assert_ne!(sock_8443, sock_443);
}
fn miniflare_slot(port: i64) -> MirrorProviderSlot {
let mut fields = BTreeMap::new();
fields.insert("port".to_string(), toml::Value::Integer(port));
MirrorProviderSlot::Inline {
kind: Provider::MiniflareContainer,
fields,
}
}
fn workspace_with(services: &[(&str, &str, i64)]) -> tempfile::TempDir {
let dir = tempfile::tempdir().unwrap();
for (svc, env, port) in services {
let mirrors = dir.path().join(".yah/services").join(svc).join("mirrors");
std::fs::create_dir_all(&mirrors).unwrap();
std::fs::write(
dir.path()
.join(".yah/services")
.join(svc)
.join("service.toml"),
format!("schema_version = 1\nname = \"{svc}\"\ndomain = \"{svc}.example\"\n"),
)
.unwrap();
std::fs::write(
mirrors.join(format!("{env}.toml")),
format!(
"schema_version = 1\nshape = \"local\"\n\n\
[providers.static]\nkind = \"miniflare-container\"\nport = {port}\n\
bucket = \"b\"\n"
),
)
.unwrap();
}
dir
}
#[test]
fn every_pond_mirror_is_fronted_with_no_opt_in() {
let ws = workspace_with(&[
("yah-marketing", "pond", 4322),
("yah-dashboard", "pond", 4323),
]);
let cfg = CloudConfig::load(ws.path()).unwrap();
let p = plan_pond_door(&cfg, "127.0.0.1:8443".parse().unwrap()).unwrap();
assert_eq!(
p.urls(),
vec![
"https://yah-dashboard.pond.localhost:8443",
"https://yah-marketing.pond.localhost:8443",
],
"rules sort by hostname so two runs render identical config",
);
assert_eq!(
p.sources,
vec![
"yah-dashboard/pond".to_string(),
"yah-marketing/pond".to_string()
]
);
}
#[test]
fn a_non_pond_mirror_is_not_fronted() {
let ws = workspace_with(&[("yah-marketing", "pond", 4322)]);
let mirrors = ws.path().join(".yah/services/yah-marketing/mirrors");
std::fs::write(
mirrors.join("dev.toml"),
"schema_version = 1\nshape = \"local\"\n\n[providers.static]\n\
kind = \"local-static\"\nport = 4321\n",
)
.unwrap();
let cfg = CloudConfig::load(ws.path()).unwrap();
let p = plan_pond_door(&cfg, "127.0.0.1:8443".parse().unwrap()).unwrap();
assert_eq!(
p.rules.len(),
1,
"only the miniflare-container slot is a pond"
);
assert_eq!(p.rules[0].hostname, "yah-marketing.pond.localhost");
}
#[test]
fn a_bare_container_pond_is_fronted_at_its_published_host_port() {
let ws = workspace_with(&[("yah-marketing", "pond", 4322)]);
let svc = ws.path().join(".yah/services/yah-admin");
std::fs::create_dir_all(svc.join("mirrors")).unwrap();
std::fs::write(
svc.join("service.toml"),
"schema_version = 1\nname = \"yah-admin\"\ndomain = \"admin.example\"\n\n\
[[components]]\nid = \"admin\"\nkind = \"container\"\n\
path = \"crates/admin\"\nrole = \"compute\"\n",
)
.unwrap();
std::fs::write(
svc.join("mirrors/pond.toml"),
"schema_version = 1\nshape = \"local\"\n",
)
.unwrap();
let comp = ws.path().join("crates/admin");
std::fs::create_dir_all(&comp).unwrap();
std::fs::write(
comp.join("workload.toml"),
"schema_version = 1\nname = \"yah-admin\"\nkind = \"container\"\n\n\
[build]\ndockerfile = \"Dockerfile\"\n\n[run]\nport = 4325\nhost_port = 4326\n",
)
.unwrap();
let cfg = CloudConfig::load(ws.path()).unwrap();
let p = plan_pond_door(&cfg, "127.0.0.1:8443".parse().unwrap()).unwrap();
let admin = p
.rules
.iter()
.find(|r| r.hostname.starts_with("yah-admin."))
.expect("the bare-container pond is fronted");
assert_eq!(
admin.upstream().unwrap(),
"127.0.0.1:4326",
"the door dials the published HOST port, not the in-container one",
);
assert_eq!(
admin.hostname, "yah-admin.pond.localhost",
"one container means no component qualifier in the label",
);
}
#[test]
fn a_container_component_outside_the_pond_env_is_not_fronted() {
let ws = workspace_with(&[("yah-marketing", "pond", 4322)]);
let svc = ws.path().join(".yah/services/yah-admin");
std::fs::create_dir_all(svc.join("mirrors")).unwrap();
std::fs::write(
svc.join("service.toml"),
"schema_version = 1\nname = \"yah-admin\"\ndomain = \"admin.example\"\n\n\
[[components]]\nid = \"admin\"\nkind = \"container\"\n\
path = \"crates/admin\"\nrole = \"compute\"\n",
)
.unwrap();
std::fs::write(
svc.join("mirrors/dev.toml"),
"schema_version = 1\nshape = \"local\"\n",
)
.unwrap();
let comp = ws.path().join("crates/admin");
std::fs::create_dir_all(&comp).unwrap();
std::fs::write(
comp.join("workload.toml"),
"schema_version = 1\nname = \"yah-admin\"\nkind = \"container\"\n\n\
[build]\ndockerfile = \"Dockerfile\"\n\n[run]\nport = 4325\n",
)
.unwrap();
let cfg = CloudConfig::load(ws.path()).unwrap();
let p = plan_pond_door(&cfg, "127.0.0.1:8443".parse().unwrap()).unwrap();
assert_eq!(p.rules.len(), 1);
assert_eq!(p.rules[0].hostname, "yah-marketing.pond.localhost");
}
#[test]
fn two_ponds_on_one_port_is_an_error_not_a_last_writer_wins() {
let ws = workspace_with(&[
("yah-marketing", "pond", 4322),
("yah-dashboard", "pond", 4322),
]);
let cfg = CloudConfig::load(ws.path()).unwrap();
let err = plan_pond_door(&cfg, "127.0.0.1:8443".parse().unwrap()).unwrap_err();
let msg = format!("{err:#}");
assert!(msg.contains("4322"), "got: {msg}");
assert!(msg.contains("yah-dashboard/pond"), "got: {msg}");
}
}