[pdm-devel] [PATCH proxmox-yew-comp 1/2] utils: move task descriptions to a submodule
Dominik Csapak
d.csapak at proxmox.com
Thu Dec 18 12:49:38 CET 2025
Looks mostly good, but it seems there were some task descriptions
that were added. It's not a big deal, but I'd prefer it to
have the new ones added as their own commit or at least
mentioned in the commit message.
i saw the following new ones:
create_vnet
create_zone
reloadnetworkall
was that intended?
On 12/18/25 10:52 AM, Lukas Wagner wrote:
> No functional changes. Reexports from the 'utils' module ensure that
> clients don't have to change.
>
> Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
> ---
> src/utils/mod.rs | 228 ++-------------------------------
> src/utils/task_descriptions.rs | 214 +++++++++++++++++++++++++++++++
> 2 files changed, 226 insertions(+), 216 deletions(-)
> create mode 100644 src/utils/task_descriptions.rs
>
> diff --git a/src/utils/mod.rs b/src/utils/mod.rs
> index 856297f..600e436 100644
> --- a/src/utils/mod.rs
> +++ b/src/utils/mod.rs
> @@ -1,6 +1,4 @@
> use std::collections::HashMap;
> -use std::fmt::Display;
> -use std::sync::Mutex;
>
> use percent_encoding::percent_decode;
> use serde_json::Value;
> @@ -11,9 +9,13 @@ use crate::common_api_types::ProxmoxUpid;
> use pwt::tr;
>
> mod clipboard;
> +mod task_descriptions;
> +
> #[allow(deprecated)]
> pub use clipboard::{copy_text_to_clipboard, copy_to_clipboard};
>
> +pub use task_descriptions::*;
> +
> /// Somewhat like a human would tell durations, omit zero values and do not
> /// give seconds precision if we talk days already
> pub fn format_duration_human(ut: f64) -> String {
> @@ -154,122 +156,6 @@ pub fn epoch_to_input_value(epoch: i64) -> String {
> }
> }
>
> -// todo: we want to use Fn(&str, Option<&str>),
> -#[allow(clippy::type_complexity)]
> -static TASK_DESCR_TABLE: Mutex<
> - Option<HashMap<String, Box<dyn Send + Sync + Fn(String, Option<String>) -> String>>>,
> -> = Mutex::new(None);
> -
> -pub trait IntoTaskDescriptionRenderFn {
> - fn into_task_description_render_fn(
> - self,
> - ) -> Box<dyn Send + Sync + Fn(String, Option<String>) -> String>;
> -}
> -
> -impl<F: 'static + Send + Sync + Fn(String, Option<String>) -> String> IntoTaskDescriptionRenderFn
> - for F
> -{
> - fn into_task_description_render_fn(
> - self,
> - ) -> Box<dyn Send + Sync + Fn(String, Option<String>) -> String> {
> - Box::new(self)
> - }
> -}
> -
> -impl<A: Display, B: Display> IntoTaskDescriptionRenderFn for (A, B) {
> - fn into_task_description_render_fn(
> - self,
> - ) -> Box<dyn 'static + Send + Sync + Fn(String, Option<String>) -> String> {
> - let task_type = self.0.to_string();
> - let action = self.1.to_string();
> - Box::new(move |_, id| {
> - format!(
> - "{} {} {}",
> - task_type,
> - id.as_deref().unwrap_or("unknown"),
> - action
> - )
> - })
> - }
> -}
> -
> -impl IntoTaskDescriptionRenderFn for String {
> - fn into_task_description_render_fn(
> - self,
> - ) -> Box<dyn 'static + Send + Sync + Fn(String, Option<String>) -> String> {
> - Box::new(move |_, _id| self.clone())
> - }
> -}
> -
> -pub fn register_task_description(
> - name: impl Into<String>,
> - render: impl IntoTaskDescriptionRenderFn,
> -) {
> - let mut map = TASK_DESCR_TABLE.lock().unwrap();
> - if map.is_none() {
> - *map = Some(HashMap::new());
> - }
> -
> - let map = map.as_mut().unwrap();
> -
> - let name: String = name.into();
> - let render = render.into_task_description_render_fn();
> -
> - map.insert(name, render);
> -}
> -
> -pub fn lookup_task_description(name: &str, id: Option<&str>) -> Option<String> {
> - let map = TASK_DESCR_TABLE.lock().unwrap();
> - match *map {
> - Some(ref map) => map
> - .get(name)
> - .map(|function| function(name.to_string(), id.map(|id| id.to_string()))),
> - None => None,
> - }
> -}
> -
> -pub fn registered_task_types() -> Vec<String> {
> - let map = TASK_DESCR_TABLE.lock().unwrap();
> - match *map {
> - Some(ref map) => map.keys().map(|t| t.to_string()).collect(),
> - None => Vec::new(),
> - }
> -}
> -
> -pub fn init_task_descr_table_base() {
> - register_task_description("aptupdate", tr!("Update package database"));
> - // TRANSLATORS: Spice is a proper name, see https://www.spice-space.org
> - register_task_description("spiceshell", tr!("Shell (Spice)"));
> - register_task_description("vncshell", tr!("Shell (VNC)"));
> - register_task_description("termproxy", tr!("Console (xterm.js)"));
> -
> - register_task_description("diskinit", (tr!("Disk"), tr!("Initialize Disk with GPT")));
> - register_task_description("srvstart", (tr!("Service"), tr!("Start")));
> - register_task_description("srvstop", (tr!("Service"), tr!("Stop")));
> - register_task_description("srvrestart", (tr!("Service"), tr!("Restart")));
> - register_task_description("srvreload", (tr!("Service"), tr!("Reload")));
> -}
> -
> -/// Uses information from the given `UPID` to render the task description with [`format_task_description`]
> -pub fn format_upid(upid: &str) -> String {
> - match upid.parse::<ProxmoxUpid>() {
> - Err(_) => upid.to_string(),
> - Ok(upid) => format_task_description(&upid.worker_type, upid.worker_id.as_deref()),
> - }
> -}
> -
> -/// Formats the given worker type and id to a Human readable task description
> -pub fn format_task_description(worker_type: &str, worker_id: Option<&str>) -> String {
> - if let Some(text) = lookup_task_description(worker_type, worker_id) {
> - text
> - } else {
> - match worker_id {
> - Some(id) => format!("{} {}", worker_type, id),
> - None => worker_type.to_string(),
> - }
> - }
> -}
> -
> pub struct AuthDomainInfo {
> pub ty: String, // type
> //pub description: String,
> @@ -349,104 +235,14 @@ pub fn set_location_href(href: &str) {
> let _ = location.set_href(href);
> }
>
> -/// Register PVE task descriptions
> -pub fn register_pve_tasks() {
> - register_task_description("qmstart", ("VM", tr!("Start")));
> - register_task_description("acmedeactivate", ("ACME Account", tr!("Deactivate")));
> - register_task_description("acmenewcert", ("SRV", tr!("Order Certificate")));
> - register_task_description("acmerefresh", ("ACME Account", tr!("Refresh")));
> - register_task_description("acmeregister", ("ACME Account", tr!("Register")));
> - register_task_description("acmerenew", ("SRV", tr!("Renew Certificate")));
> - register_task_description("acmerevoke", ("SRV", tr!("Revoke Certificate")));
> - register_task_description("acmeupdate", ("ACME Account", tr!("Update")));
> - register_task_description("auth-realm-sync", (tr!("Realm"), tr!("Sync")));
> - register_task_description("auth-realm-sync-test", (tr!("Realm"), tr!("Sync Preview")));
> - register_task_description("cephcreatemds", ("Ceph Metadata Server", tr!("Create")));
> - register_task_description("cephcreatemgr", ("Ceph Manager", tr!("Create")));
> - register_task_description("cephcreatemon", ("Ceph Monitor", tr!("Create")));
> - register_task_description("cephcreateosd", ("Ceph OSD", tr!("Create")));
> - register_task_description("cephcreatepool", ("Ceph Pool", tr!("Create")));
> - register_task_description("cephdestroymds", ("Ceph Metadata Server", tr!("Destroy")));
> - register_task_description("cephdestroymgr", ("Ceph Manager", tr!("Destroy")));
> - register_task_description("cephdestroymon", ("Ceph Monitor", tr!("Destroy")));
> - register_task_description("cephdestroyosd", ("Ceph OSD", tr!("Destroy")));
> - register_task_description("cephdestroypool", ("Ceph Pool", tr!("Destroy")));
> - register_task_description("cephdestroyfs", ("CephFS", tr!("Destroy")));
> - register_task_description("cephfscreate", ("CephFS", tr!("Create")));
> - register_task_description("cephsetpool", ("Ceph Pool", tr!("Edit")));
> - register_task_description("cephsetflags", tr!("Change global Ceph flags"));
> - register_task_description("clustercreate", tr!("Create Cluster"));
> - register_task_description("clusterjoin", tr!("Join Cluster"));
> - register_task_description("dircreate", (tr!("Directory Storage"), tr!("Create")));
> - register_task_description("dirremove", (tr!("Directory"), tr!("Remove")));
> - register_task_description("download", (tr!("File"), tr!("Download")));
> - register_task_description("hamigrate", ("HA", tr!("Migrate")));
> - register_task_description("hashutdown", ("HA", tr!("Shutdown")));
> - register_task_description("hastart", ("HA", tr!("Start")));
> - register_task_description("hastop", ("HA", tr!("Stop")));
> - register_task_description("imgcopy", tr!("Copy data"));
> - register_task_description("imgdel", tr!("Erase data"));
> - register_task_description("lvmcreate", (tr!("LVM Storage"), tr!("Create")));
> - register_task_description("lvmremove", ("Volume Group", tr!("Remove")));
> - register_task_description("lvmthincreate", (tr!("LVM-Thin Storage"), tr!("Create")));
> - register_task_description("lvmthinremove", ("Thinpool", tr!("Remove")));
> - register_task_description("migrateall", tr!("Bulk migrate VMs and Containers"));
> - register_task_description("move_volume", ("CT", tr!("Move Volume")));
> - register_task_description("pbs-download", ("VM/CT", tr!("File Restore Download")));
> - register_task_description("pull_file", ("CT", tr!("Pull file")));
> - register_task_description("push_file", ("CT", tr!("Push file")));
> - register_task_description("qmclone", ("VM", tr!("Clone")));
> - register_task_description("qmconfig", ("VM", tr!("Configure")));
> - register_task_description("qmcreate", ("VM", tr!("Create")));
> - register_task_description("qmdelsnapshot", ("VM", tr!("Delete Snapshot")));
> - register_task_description("qmdestroy", ("VM", tr!("Destroy")));
> - register_task_description("qmigrate", ("VM", tr!("Migrate")));
> - register_task_description("qmmove", ("VM", tr!("Move disk")));
> - register_task_description("qmpause", ("VM", tr!("Pause")));
> - register_task_description("qmreboot", ("VM", tr!("Reboot")));
> - register_task_description("qmreset", ("VM", tr!("Reset")));
> - register_task_description("qmrestore", ("VM", tr!("Restore")));
> - register_task_description("qmresume", ("VM", tr!("Resume")));
> - register_task_description("qmrollback", ("VM", tr!("Rollback")));
> - register_task_description("qmshutdown", ("VM", tr!("Shutdown")));
> - register_task_description("qmsnapshot", ("VM", tr!("Snapshot")));
> - register_task_description("qmstart", ("VM", tr!("Start")));
> - register_task_description("qmstop", ("VM", tr!("Stop")));
> - register_task_description("qmsuspend", ("VM", tr!("Hibernate")));
> - register_task_description("qmtemplate", ("VM", tr!("Convert to template")));
> - register_task_description("resize", ("VM/CT", tr!("Resize")));
> - register_task_description("spiceproxy", ("VM/CT", tr!("Console") + " (Spice)"));
> - register_task_description("spiceshell", tr!("Shell") + " (Spice)");
> - register_task_description("startall", tr!("Bulk start VMs and Containers"));
> - register_task_description("stopall", tr!("Bulk shutdown VMs and Containers"));
> - register_task_description("suspendall", tr!("Suspend all VMs"));
> - register_task_description("unknownimgdel", tr!("Destroy image from unknown guest"));
> - register_task_description("wipedisk", ("Device", tr!("Wipe Disk")));
> - register_task_description("vncproxy", ("VM/CT", tr!("Console")));
> - register_task_description("vncshell", tr!("Shell"));
> - register_task_description("vzclone", ("CT", tr!("Clone")));
> - register_task_description("vzcreate", ("CT", tr!("Create")));
> - register_task_description("vzdelsnapshot", ("CT", tr!("Delete Snapshot")));
> - register_task_description("vzdestroy", ("CT", tr!("Destroy")));
> - register_task_description("vzdump", |_ty, id| match id {
> - Some(id) => format!("VM/CT {id} - {}", tr!("Backup")),
> - None => tr!("Backup Job"),
> - });
> - register_task_description("vzmigrate", ("CT", tr!("Migrate")));
> - register_task_description("vzmount", ("CT", tr!("Mount")));
> - register_task_description("vzreboot", ("CT", tr!("Reboot")));
> - register_task_description("vzrestore", ("CT", tr!("Restore")));
> - register_task_description("vzresume", ("CT", tr!("Resume")));
> - register_task_description("vzrollback", ("CT", tr!("Rollback")));
> - register_task_description("vzshutdown", ("CT", tr!("Shutdown")));
> - register_task_description("vzsnapshot", ("CT", tr!("Snapshot")));
> - register_task_description("vzstart", ("CT", tr!("Start")));
> - register_task_description("vzstop", ("CT", tr!("Stop")));
> - register_task_description("vzsuspend", ("CT", tr!("Suspend")));
> - register_task_description("vztemplate", ("CT", tr!("Convert to template")));
> - register_task_description("vzumount", ("CT", tr!("Unmount")));
> - register_task_description("zfscreate", (tr!("ZFS Storage"), tr!("Create")));
> - register_task_description("zfsremove", ("ZFS Pool", tr!("Remove")));
> +/// Uses information from the given `UPID` to render the task description with [`format_task_description`]
> +pub fn format_upid(upid: &str) -> String {
> + match upid.parse::<ProxmoxUpid>() {
> + Err(_) => upid.to_string(),
> + Ok(upid) => {
> + task_descriptions::format_task_description(&upid.worker_type, upid.worker_id.as_deref())
> + }
> + }
> }
>
> pub fn openid_redirection_authorization() -> Option<HashMap<String, String>> {
> diff --git a/src/utils/task_descriptions.rs b/src/utils/task_descriptions.rs
> new file mode 100644
> index 0000000..86525a4
> --- /dev/null
> +++ b/src/utils/task_descriptions.rs
> @@ -0,0 +1,214 @@
> +use std::{collections::HashMap, fmt::Display, sync::Mutex};
> +
> +use pwt::tr;
> +
> +// todo: we want to use Fn(&str, Option<&str>),
> +#[allow(clippy::type_complexity)]
> +static TASK_DESCR_TABLE: Mutex<
> + Option<HashMap<String, Box<dyn Send + Sync + Fn(String, Option<String>) -> String>>>,
> +> = Mutex::new(None);
> +
> +pub trait IntoTaskDescriptionRenderFn {
> + fn into_task_description_render_fn(
> + self,
> + ) -> Box<dyn Send + Sync + Fn(String, Option<String>) -> String>;
> +}
> +
> +impl<F: 'static + Send + Sync + Fn(String, Option<String>) -> String> IntoTaskDescriptionRenderFn
> + for F
> +{
> + fn into_task_description_render_fn(
> + self,
> + ) -> Box<dyn Send + Sync + Fn(String, Option<String>) -> String> {
> + Box::new(self)
> + }
> +}
> +
> +impl<A: Display, B: Display> IntoTaskDescriptionRenderFn for (A, B) {
> + fn into_task_description_render_fn(
> + self,
> + ) -> Box<dyn 'static + Send + Sync + Fn(String, Option<String>) -> String> {
> + let task_type = self.0.to_string();
> + let action = self.1.to_string();
> + Box::new(move |_, id| {
> + format!(
> + "{} {} {}",
> + task_type,
> + id.as_deref().unwrap_or("unknown"),
> + action
> + )
> + })
> + }
> +}
> +
> +impl IntoTaskDescriptionRenderFn for String {
> + fn into_task_description_render_fn(
> + self,
> + ) -> Box<dyn 'static + Send + Sync + Fn(String, Option<String>) -> String> {
> + Box::new(move |_, _id| self.clone())
> + }
> +}
> +
> +pub fn register_task_description(
> + name: impl Into<String>,
> + render: impl IntoTaskDescriptionRenderFn,
> +) {
> + let mut map = TASK_DESCR_TABLE.lock().unwrap();
> + if map.is_none() {
> + *map = Some(HashMap::new());
> + }
> +
> + let map = map.as_mut().unwrap();
> +
> + let name: String = name.into();
> + let render = render.into_task_description_render_fn();
> +
> + map.insert(name, render);
> +}
> +
> +pub fn lookup_task_description(name: &str, id: Option<&str>) -> Option<String> {
> + let map = TASK_DESCR_TABLE.lock().unwrap();
> + match *map {
> + Some(ref map) => map
> + .get(name)
> + .map(|function| function(name.to_string(), id.map(|id| id.to_string()))),
> + None => None,
> + }
> +}
> +
> +pub fn registered_task_types() -> Vec<String> {
> + let map = TASK_DESCR_TABLE.lock().unwrap();
> + match *map {
> + Some(ref map) => map.keys().map(|t| t.to_string()).collect(),
> + None => Vec::new(),
> + }
> +}
> +
> +pub fn init_task_descr_table_base() {
> + register_task_description("aptupdate", tr!("Update package database"));
> + // TRANSLATORS: Spice is a proper name, see https://www.spice-space.org
> + register_task_description("spiceshell", tr!("Shell (Spice)"));
> + register_task_description("vncshell", tr!("Shell (VNC)"));
> + register_task_description("termproxy", tr!("Console (xterm.js)"));
> +
> + register_task_description("diskinit", (tr!("Disk"), tr!("Initialize Disk with GPT")));
> + register_task_description("srvstart", (tr!("Service"), tr!("Start")));
> + register_task_description("srvstop", (tr!("Service"), tr!("Stop")));
> + register_task_description("srvrestart", (tr!("Service"), tr!("Restart")));
> + register_task_description("srvreload", (tr!("Service"), tr!("Reload")));
> +}
> +
> +/// Formats the given worker type and id to a Human readable task description
> +pub fn format_task_description(worker_type: &str, worker_id: Option<&str>) -> String {
> + if let Some(text) = lookup_task_description(worker_type, worker_id) {
> + text
> + } else {
> + match worker_id {
> + Some(id) => format!("{} {}", worker_type, id),
> + None => worker_type.to_string(),
> + }
> + }
> +}
> +
> +/// Register PVE task descriptions
> +pub fn register_pve_tasks() {
> + register_task_description("qmstart", ("VM", tr!("Start")));
> + register_task_description("acmedeactivate", ("ACME Account", tr!("Deactivate")));
> + register_task_description("acmenewcert", ("SRV", tr!("Order Certificate")));
> + register_task_description("acmerefresh", ("ACME Account", tr!("Refresh")));
> + register_task_description("acmeregister", ("ACME Account", tr!("Register")));
> + register_task_description("acmerenew", ("SRV", tr!("Renew Certificate")));
> + register_task_description("acmerevoke", ("SRV", tr!("Revoke Certificate")));
> + register_task_description("acmeupdate", ("ACME Account", tr!("Update")));
> + register_task_description("auth-realm-sync", (tr!("Realm"), tr!("Sync")));
> + register_task_description("auth-realm-sync-test", (tr!("Realm"), tr!("Sync Preview")));
> + register_task_description("cephcreatemds", ("Ceph Metadata Server", tr!("Create")));
> + register_task_description("cephcreatemgr", ("Ceph Manager", tr!("Create")));
> + register_task_description("cephcreatemon", ("Ceph Monitor", tr!("Create")));
> + register_task_description("cephcreateosd", ("Ceph OSD", tr!("Create")));
> + register_task_description("cephcreatepool", ("Ceph Pool", tr!("Create")));
> + register_task_description("cephdestroymds", ("Ceph Metadata Server", tr!("Destroy")));
> + register_task_description("cephdestroymgr", ("Ceph Manager", tr!("Destroy")));
> + register_task_description("cephdestroymon", ("Ceph Monitor", tr!("Destroy")));
> + register_task_description("cephdestroyosd", ("Ceph OSD", tr!("Destroy")));
> + register_task_description("cephdestroypool", ("Ceph Pool", tr!("Destroy")));
> + register_task_description("cephdestroyfs", ("CephFS", tr!("Destroy")));
> + register_task_description("cephfscreate", ("CephFS", tr!("Create")));
> + register_task_description("cephsetpool", ("Ceph Pool", tr!("Edit")));
> + register_task_description("cephsetflags", tr!("Change global Ceph flags"));
> + register_task_description("clustercreate", tr!("Create Cluster"));
> + register_task_description("clusterjoin", tr!("Join Cluster"));
> + register_task_description("create_zone", tr!("Create EVPN Zone"));
> + register_task_description("create_vnet", tr!("Create EVPN VNet"));
> + register_task_description("dircreate", (tr!("Directory Storage"), tr!("Create")));
> + register_task_description("dirremove", (tr!("Directory"), tr!("Remove")));
> + register_task_description("download", (tr!("File"), tr!("Download")));
> + register_task_description("hamigrate", ("HA", tr!("Migrate")));
> + register_task_description("hashutdown", ("HA", tr!("Shutdown")));
> + register_task_description("hastart", ("HA", tr!("Start")));
> + register_task_description("hastop", ("HA", tr!("Stop")));
> + register_task_description("imgcopy", tr!("Copy data"));
> + register_task_description("imgdel", tr!("Erase data"));
> + register_task_description("lvmcreate", (tr!("LVM Storage"), tr!("Create")));
> + register_task_description("lvmremove", ("Volume Group", tr!("Remove")));
> + register_task_description("lvmthincreate", (tr!("LVM-Thin Storage"), tr!("Create")));
> + register_task_description("lvmthinremove", ("Thinpool", tr!("Remove")));
> + register_task_description("migrateall", tr!("Bulk migrate VMs and Containers"));
> + register_task_description("move_volume", ("CT", tr!("Move Volume")));
> + register_task_description("pbs-download", ("VM/CT", tr!("File Restore Download")));
> + register_task_description("pull_file", ("CT", tr!("Pull file")));
> + register_task_description("push_file", ("CT", tr!("Push file")));
> + register_task_description("qmclone", ("VM", tr!("Clone")));
> + register_task_description("qmconfig", ("VM", tr!("Configure")));
> + register_task_description("qmcreate", ("VM", tr!("Create")));
> + register_task_description("qmdelsnapshot", ("VM", tr!("Delete Snapshot")));
> + register_task_description("qmdestroy", ("VM", tr!("Destroy")));
> + register_task_description("qmigrate", ("VM", tr!("Migrate")));
> + register_task_description("qmmove", ("VM", tr!("Move disk")));
> + register_task_description("qmpause", ("VM", tr!("Pause")));
> + register_task_description("qmreboot", ("VM", tr!("Reboot")));
> + register_task_description("qmreset", ("VM", tr!("Reset")));
> + register_task_description("qmrestore", ("VM", tr!("Restore")));
> + register_task_description("qmresume", ("VM", tr!("Resume")));
> + register_task_description("qmrollback", ("VM", tr!("Rollback")));
> + register_task_description("qmshutdown", ("VM", tr!("Shutdown")));
> + register_task_description("qmsnapshot", ("VM", tr!("Snapshot")));
> + register_task_description("qmstart", ("VM", tr!("Start")));
> + register_task_description("qmstop", ("VM", tr!("Stop")));
> + register_task_description("qmsuspend", ("VM", tr!("Hibernate")));
> + register_task_description("qmtemplate", ("VM", tr!("Convert to template")));
> + register_task_description("reloadnetworkall", tr!("Apply SDN configuration"));
> + register_task_description("resize", ("VM/CT", tr!("Resize")));
> + register_task_description("spiceproxy", ("VM/CT", tr!("Console") + " (Spice)"));
> + register_task_description("spiceshell", tr!("Shell") + " (Spice)");
> + register_task_description("startall", tr!("Bulk start VMs and Containers"));
> + register_task_description("stopall", tr!("Bulk shutdown VMs and Containers"));
> + register_task_description("suspendall", tr!("Suspend all VMs"));
> + register_task_description("unknownimgdel", tr!("Destroy image from unknown guest"));
> + register_task_description("wipedisk", ("Device", tr!("Wipe Disk")));
> + register_task_description("vncproxy", ("VM/CT", tr!("Console")));
> + register_task_description("vncshell", tr!("Shell"));
> + register_task_description("vzclone", ("CT", tr!("Clone")));
> + register_task_description("vzcreate", ("CT", tr!("Create")));
> + register_task_description("vzdelsnapshot", ("CT", tr!("Delete Snapshot")));
> + register_task_description("vzdestroy", ("CT", tr!("Destroy")));
> + register_task_description("vzdump", |_ty, id| match id {
> + Some(id) => format!("VM/CT {id} - {}", tr!("Backup")),
> + None => tr!("Backup Job"),
> + });
> + register_task_description("vzmigrate", ("CT", tr!("Migrate")));
> + register_task_description("vzmount", ("CT", tr!("Mount")));
> + register_task_description("vzreboot", ("CT", tr!("Reboot")));
> + register_task_description("vzrestore", ("CT", tr!("Restore")));
> + register_task_description("vzresume", ("CT", tr!("Resume")));
> + register_task_description("vzrollback", ("CT", tr!("Rollback")));
> + register_task_description("vzshutdown", ("CT", tr!("Shutdown")));
> + register_task_description("vzsnapshot", ("CT", tr!("Snapshot")));
> + register_task_description("vzstart", ("CT", tr!("Start")));
> + register_task_description("vzstop", ("CT", tr!("Stop")));
> + register_task_description("vzsuspend", ("CT", tr!("Suspend")));
> + register_task_description("vztemplate", ("CT", tr!("Convert to template")));
> + register_task_description("vzumount", ("CT", tr!("Unmount")));
> + register_task_description("zfscreate", (tr!("ZFS Storage"), tr!("Create")));
> + register_task_description("zfsremove", ("ZFS Pool", tr!("Remove")));
> +}
More information about the pdm-devel
mailing list