All checks were successful
Run Check Script / check (pull_request) Successful in 1m15s
## Fully automated inventory gathering now works! Boot up harmony_inventory_agent with `cargo run -p harmony_inventory_agent` Launch the DiscoverInventoryAgentScore , currently available this way : `RUST_LOG=info cargo run -p example-cli -- -f Discover -y` And you will have automatically all hosts saved to the database. Run `cargo sqlx setup` if you have not done it yet. Co-authored-by: Ian Letourneau <ian@noma.to> Reviewed-on: #127 Co-authored-by: Jean-Gabriel Gill-Couture <jg@nationtech.io> Co-committed-by: Jean-Gabriel Gill-Couture <jg@nationtech.io>
66 lines
1.8 KiB
Rust
66 lines
1.8 KiB
Rust
use crate::{
|
|
hardware::PhysicalHost,
|
|
inventory::{InventoryRepository, RepoError},
|
|
};
|
|
use async_trait::async_trait;
|
|
use harmony_types::id::Id;
|
|
use log::info;
|
|
use sqlx::{Pool, Sqlite, SqlitePool};
|
|
|
|
/// A thread-safe, connection-pooled repository using SQLite.
|
|
#[derive(Debug)]
|
|
pub struct SqliteInventoryRepository {
|
|
pool: Pool<Sqlite>,
|
|
}
|
|
|
|
impl SqliteInventoryRepository {
|
|
pub async fn new(database_url: &str) -> Result<Self, RepoError> {
|
|
let pool = SqlitePool::connect(database_url)
|
|
.await
|
|
.map_err(|e| RepoError::ConnectionFailed(e.to_string()))?;
|
|
|
|
info!("SQLite inventory repository initialized at '{database_url}'");
|
|
Ok(Self { pool })
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl InventoryRepository for SqliteInventoryRepository {
|
|
async fn save(&self, host: &PhysicalHost) -> Result<(), RepoError> {
|
|
let data = serde_json::to_vec(host).map_err(|e| RepoError::Serialization(e.to_string()))?;
|
|
|
|
let id = Id::default().to_string();
|
|
let host_id = host.id.to_string();
|
|
|
|
sqlx::query!(
|
|
"INSERT INTO physical_hosts (id, version_id, data) VALUES (?, ?, ?)",
|
|
host_id,
|
|
id,
|
|
data,
|
|
)
|
|
.execute(&self.pool)
|
|
.await?;
|
|
|
|
info!("Saved new inventory version for host '{}'", host.id);
|
|
Ok(())
|
|
}
|
|
|
|
async fn get_latest_by_id(&self, host_id: &str) -> Result<Option<PhysicalHost>, RepoError> {
|
|
let _row = sqlx::query_as!(
|
|
DbHost,
|
|
r#"SELECT id, version_id, data as "data: Json<PhysicalHost>" FROM physical_hosts WHERE id = ? ORDER BY version_id DESC LIMIT 1"#,
|
|
host_id
|
|
)
|
|
.fetch_optional(&self.pool)
|
|
.await?;
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
use sqlx::types::Json;
|
|
struct DbHost {
|
|
data: Json<PhysicalHost>,
|
|
id: Id,
|
|
version_id: Id,
|
|
}
|