use crate::error::{Error, Result};
use crate::proto::moby::buildkit::v1::control_client::ControlClient;
use tonic::transport::{Channel, Endpoint};
#[derive(Clone)]
pub struct BuildKitClient {
control: ControlClient<Channel>,
}
impl BuildKitClient {
pub async fn connect(addr: impl Into<String>) -> Result<Self> {
let addr = addr.into();
tracing::info!("Connecting to buildkitd at {}", addr);
let endpoint = Endpoint::from_shared(addr.clone())
.map_err(|_| Error::InvalidEndpoint(addr.clone()))?
.timeout(std::time::Duration::from_secs(30));
let channel = endpoint
.connect()
.await
.map_err(|e| Error::Connection {
endpoint: addr,
source: e,
})?;
let control = ControlClient::new(channel);
tracing::info!("Successfully connected to buildkitd");
Ok(Self { control })
}
pub fn control(&mut self) -> &mut ControlClient<Channel> {
&mut self.control
}
pub async fn health_check(&mut self) -> Result<()> {
use crate::proto::moby::buildkit::v1::InfoRequest;
let _info = self
.control
.info(InfoRequest {})
.await?;
tracing::debug!("BuildKit health check passed");
Ok(())
}
}