Can get domains list
This commit is contained in:
parent
b69c97e6fe
commit
908b0f4c56
@ -59,6 +59,26 @@ impl Handler<GetHypervisorInfo> for LibVirtActor {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(result = "anyhow::Result<Vec<DomainXMLUuid>>")]
|
||||
pub struct GetDomainsListReq;
|
||||
|
||||
impl Handler<GetDomainsListReq> for LibVirtActor {
|
||||
type Result = anyhow::Result<Vec<DomainXMLUuid>>;
|
||||
|
||||
fn handle(&mut self, _msg: GetDomainsListReq, _ctx: &mut Self::Context) -> Self::Result {
|
||||
log::debug!("Get full list of domains");
|
||||
let domains = self.m.list_all_domains(0)?;
|
||||
let mut ids = Vec::with_capacity(domains.len());
|
||||
|
||||
for d in domains {
|
||||
ids.push(DomainXMLUuid::parse_from_str(&d.get_uuid_string()?)?);
|
||||
}
|
||||
|
||||
Ok(ids)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(result = "anyhow::Result<DomainXML>")]
|
||||
pub struct GetDomainXMLReq(pub DomainXMLUuid);
|
||||
|
@ -24,6 +24,24 @@ pub async fn create(client: LibVirtReq, req: web::Json<VMInfo>) -> HttpResult {
|
||||
Ok(HttpResponse::Ok().json(id))
|
||||
}
|
||||
|
||||
/// Get the list of domains
|
||||
pub async fn list_all(client: LibVirtReq) -> HttpResult {
|
||||
let list = client.get_full_list().await?;
|
||||
let mut out = Vec::with_capacity(list.len());
|
||||
|
||||
for entry in list {
|
||||
let info = VMInfo::from_domain(entry)?;
|
||||
out.push(VMInfoAndState {
|
||||
state: client
|
||||
.get_domain_state(info.uuid.expect("Domain without UUID !"))
|
||||
.await?,
|
||||
info,
|
||||
})
|
||||
}
|
||||
|
||||
Ok(HttpResponse::Ok().json(out))
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
pub struct SingleVMUUidReq {
|
||||
uid: DomainXMLUuid,
|
||||
|
@ -13,6 +13,16 @@ impl LibVirtClient {
|
||||
self.0.send(libvirt_actor::GetHypervisorInfo).await?
|
||||
}
|
||||
|
||||
/// Get the full list of domain
|
||||
pub async fn get_full_list(&self) -> anyhow::Result<Vec<DomainXML>> {
|
||||
let ids = self.0.send(libvirt_actor::GetDomainsListReq).await??;
|
||||
let mut info = Vec::with_capacity(ids.len());
|
||||
for id in ids {
|
||||
info.push(self.get_single_domain(id).await?)
|
||||
}
|
||||
Ok(info)
|
||||
}
|
||||
|
||||
/// Get the information about a single domain
|
||||
pub async fn get_single_domain(&self, id: DomainXMLUuid) -> anyhow::Result<DomainXML> {
|
||||
self.0.send(libvirt_actor::GetDomainXMLReq(id)).await?
|
||||
|
@ -136,6 +136,7 @@ async fn main() -> std::io::Result<()> {
|
||||
)
|
||||
// Virtual machines controller
|
||||
.route("/api/vm/create", web::post().to(vm_controller::create))
|
||||
.route("/api/vm/list", web::get().to(vm_controller::list_all))
|
||||
.route("/api/vm/{uid}", web::get().to(vm_controller::get_single))
|
||||
})
|
||||
.bind(&AppConfig::get().listen_address)?
|
||||
|
Loading…
Reference in New Issue
Block a user