Can start, shutdown, kill and reset VMs of groups
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing

This commit is contained in:
Pierre HUBERT 2024-11-25 20:59:49 +01:00
parent 9f8e2e9dc2
commit 4b97fc498f
3 changed files with 60 additions and 6 deletions

View File

@ -17,7 +17,7 @@ pub async fn list(client: LibVirtReq) -> HttpResult {
Ok(HttpResponse::Ok().json(groups)) Ok(HttpResponse::Ok().json(groups))
} }
/// Get information about a VM /// Get information about the VMs of a group
pub async fn vm_info(vms_ids: GroupVmIdExtractor) -> HttpResult { pub async fn vm_info(vms_ids: GroupVmIdExtractor) -> HttpResult {
let mut vms = Vec::new(); let mut vms = Vec::new();
for vm in vms_ids.0 { for vm in vms_ids.0 {
@ -25,3 +25,43 @@ pub async fn vm_info(vms_ids: GroupVmIdExtractor) -> HttpResult {
} }
Ok(HttpResponse::Ok().json(vms)) Ok(HttpResponse::Ok().json(vms))
} }
/// Start the VMs of a group
pub async fn vm_start(client: LibVirtReq, vms_ids: GroupVmIdExtractor) -> HttpResult {
for vm in vms_ids.0 {
if let Some(uuid) = vm.uuid {
client.start_domain(uuid).await?;
}
}
Ok(HttpResponse::Ok().finish())
}
/// Shutdown the VMs of a group
pub async fn vm_shutdown(client: LibVirtReq, vms_ids: GroupVmIdExtractor) -> HttpResult {
for vm in vms_ids.0 {
if let Some(uuid) = vm.uuid {
client.shutdown_domain(uuid).await?;
}
}
Ok(HttpResponse::Ok().finish())
}
/// Kill the VMs of a group
pub async fn vm_kill(client: LibVirtReq, vms_ids: GroupVmIdExtractor) -> HttpResult {
for vm in vms_ids.0 {
if let Some(uuid) = vm.uuid {
client.kill_domain(uuid).await?;
}
}
Ok(HttpResponse::Ok().finish())
}
/// Reset the VMs of a group
pub async fn vm_reset(client: LibVirtReq, vms_ids: GroupVmIdExtractor) -> HttpResult {
for vm in vms_ids.0 {
if let Some(uuid) = vm.uuid {
client.reset_domain(uuid).await?;
}
}
Ok(HttpResponse::Ok().finish())
}

View File

@ -51,8 +51,8 @@ impl FromRequest for GroupVmIdExtractor {
let vms = match client.get_full_group_vm_list(&group_id).await { let vms = match client.get_full_group_vm_list(&group_id).await {
Ok(vms) => vms, Ok(vms) => vms,
Err(e) => { Err(e) => {
log::error!("Failed to get the VM of the group {group_id:?}: {e}"); log::error!("Failed to get the VMs of the group {group_id:?}: {e}");
return Err(ErrorBadRequest("Failed to get the VM of the group!")); return Err(ErrorBadRequest("Failed to get the VMs of the group!"));
} }
}; };

View File

@ -216,13 +216,27 @@ async fn main() -> std::io::Result<()> {
"/api/group/{gid}/vm/info", "/api/group/{gid}/vm/info",
web::get().to(groups_controller::vm_info), web::get().to(groups_controller::vm_info),
) )
// TODO start VM .route(
// TODO stop VM "/api/group/{gid}/vm/start",
web::get().to(groups_controller::vm_start),
)
.route(
"/api/group/{gid}/vm/shutdown",
web::get().to(groups_controller::vm_shutdown),
)
// TODO suspend VM // TODO suspend VM
// TODO resume VM // TODO resume VM
// TODO kill VM .route(
"/api/group/{gid}/vm/kill",
web::get().to(groups_controller::vm_kill),
)
.route(
"/api/group/{gid}/vm/reset",
web::get().to(groups_controller::vm_reset),
)
// TODO reset VM // TODO reset VM
// TODO screenshot VM // TODO screenshot VM
// TODO state of VM
// Network controller // Network controller
.route( .route(
"/api/network/create", "/api/network/create",