Add peer card discovery scaffold

This commit is contained in:
Eric Wendland 2026-05-16 14:24:21 +02:00
commit 81149605bc
11 changed files with 271 additions and 15 deletions

View file

@ -250,6 +250,45 @@ impl Store {
.map_err(StoreError::from)
}
pub fn upsert_peer_card(&self, peer_card: &StoredPeerCard) -> Result<(), StoreError> {
self.conn.execute(
"INSERT OR REPLACE INTO peer_cards(peer_id, card_json, updated_at_ms) VALUES (?1, ?2, ?3)",
params![peer_card.peer_id, peer_card.card_json, peer_card.updated_at_ms],
)?;
Ok(())
}
pub fn get_peer_card(&self, peer_id: &str) -> Result<Option<StoredPeerCard>, StoreError> {
let mut stmt = self.conn.prepare(
"SELECT peer_id, card_json, updated_at_ms FROM peer_cards WHERE peer_id = ?1",
)?;
let mut rows = stmt.query(params![peer_id])?;
if let Some(row) = rows.next()? {
Ok(Some(StoredPeerCard {
peer_id: row.get(0)?,
card_json: row.get(1)?,
updated_at_ms: row.get(2)?,
}))
} else {
Ok(None)
}
}
pub fn list_peer_cards(&self) -> Result<Vec<StoredPeerCard>, StoreError> {
let mut stmt = self
.conn
.prepare("SELECT peer_id, card_json, updated_at_ms FROM peer_cards ORDER BY peer_id")?;
let rows = stmt.query_map([], |row| {
Ok(StoredPeerCard {
peer_id: row.get(0)?,
card_json: row.get(1)?,
updated_at_ms: row.get(2)?,
})
})?;
rows.collect::<Result<Vec<_>, _>>()
.map_err(StoreError::from)
}
pub fn insert_ssh_cert_request(
&self,
request: &StoredSshCertRequest,
@ -430,6 +469,13 @@ pub struct CasObject {
pub path: String,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StoredPeerCard {
pub peer_id: String,
pub card_json: String,
pub updated_at_ms: i64,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct StoredSshCertRequest {
pub request_id: String,
@ -527,4 +573,20 @@ mod tests {
vec![revocation]
);
}
#[test]
fn peer_card_roundtrip() {
let store = Store::open_memory().expect("open");
let peer_card = StoredPeerCard {
peer_id: "node:laptop".to_owned(),
card_json: r#"{"node_id":"node:laptop"}"#.to_owned(),
updated_at_ms: 10,
};
store.upsert_peer_card(&peer_card).expect("insert");
assert_eq!(
store.get_peer_card("node:laptop").expect("get"),
Some(peer_card.clone())
);
assert_eq!(store.list_peer_cards().expect("list"), vec![peer_card]);
}
}