use std::error::Error as StdError;
use std::ffi::CStr;
use std::fmt::{Display, Formatter, Result as FmtResult};
use crate::enumutil::impl_enum;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ErrorLevel {
None,
Warning,
Error,
}
impl_enum! {
enum: ErrorLevel,
raw: sys::virErrorLevel,
match: {
sys::VIR_ERR_NONE => None,
sys::VIR_ERR_WARNING => Warning,
sys::VIR_ERR_ERROR => Error,
_ => None,
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ErrorDomain {
None,
Xen,
Xend,
XenStore,
SExpr,
Xml,
Dom,
Rpc,
Proxy,
Conf,
Qemu,
Net,
Test,
Remote,
OpenVz,
XenXm,
StatsLinux,
Lxc,
Storage,
Network,
Domain,
Uml,
Nodedev,
XenINotify,
Security,
VBox,
Interface,
ONe,
Esx,
Phyp,
Secret,
Cpu,
XenApi,
Nwfilter,
Hook,
DomainSnapshot,
Audit,
SysInfo,
Streams,
Vmware,
Event,
Libxl,
Locking,
HyperV,
Capabilities,
Uri,
Auth,
Dbus,
Parallels,
Device,
Ssh,
Lockspace,
Initctl,
Identity,
Cgroup,
Access,
Systemd,
Bhyve,
Crypto,
Firewall,
Polkit,
Thread,
Admin,
Logging,
XenXl,
Perf,
Libssh,
ResCtrl,
Firewalld,
DomainCheckpoint,
Tpm,
Bpf,
Ch,
Last,
}
impl_enum! {
enum: ErrorDomain,
raw: sys::virErrorDomain,
match: {
sys::VIR_FROM_NONE => None,
sys::VIR_FROM_XEN => Xen,
sys::VIR_FROM_XEND => Xend,
sys::VIR_FROM_XENSTORE => XenStore,
sys::VIR_FROM_SEXPR => SExpr,
sys::VIR_FROM_XML => Xml,
sys::VIR_FROM_DOM => Dom,
sys::VIR_FROM_RPC => Rpc,
sys::VIR_FROM_PROXY => Proxy,
sys::VIR_FROM_CONF => Conf,
sys::VIR_FROM_QEMU => Qemu,
sys::VIR_FROM_NET => Net,
sys::VIR_FROM_TEST => Test,
sys::VIR_FROM_REMOTE => Remote,
sys::VIR_FROM_OPENVZ => OpenVz,
sys::VIR_FROM_XENXM => XenXm,
sys::VIR_FROM_STATS_LINUX => StatsLinux,
sys::VIR_FROM_LXC => Lxc,
sys::VIR_FROM_STORAGE => Storage,
sys::VIR_FROM_NETWORK => Network,
sys::VIR_FROM_DOMAIN => Domain,
sys::VIR_FROM_UML => Uml,
sys::VIR_FROM_NODEDEV => Nodedev,
sys::VIR_FROM_XEN_INOTIFY => XenINotify,
sys::VIR_FROM_SECURITY => Security,
sys::VIR_FROM_VBOX => VBox,
sys::VIR_FROM_INTERFACE => Interface,
sys::VIR_FROM_ONE => ONe,
sys::VIR_FROM_ESX => Esx,
sys::VIR_FROM_PHYP => Phyp,
sys::VIR_FROM_SECRET => Secret,
sys::VIR_FROM_CPU => Cpu,
sys::VIR_FROM_XENAPI => XenApi,
sys::VIR_FROM_NWFILTER => Nwfilter,
sys::VIR_FROM_HOOK => Hook,
sys::VIR_FROM_DOMAIN_SNAPSHOT => DomainSnapshot,
sys::VIR_FROM_AUDIT => Audit,
sys::VIR_FROM_SYSINFO => SysInfo,
sys::VIR_FROM_STREAMS => Streams,
sys::VIR_FROM_VMWARE => Vmware,
sys::VIR_FROM_EVENT => Event,
sys::VIR_FROM_LIBXL => Libxl,
sys::VIR_FROM_LOCKING => Locking,
sys::VIR_FROM_HYPERV => HyperV,
sys::VIR_FROM_CAPABILITIES => Capabilities,
sys::VIR_FROM_URI => Uri,
sys::VIR_FROM_AUTH => Auth,
sys::VIR_FROM_DBUS => Dbus,
sys::VIR_FROM_PARALLELS => Parallels,
sys::VIR_FROM_DEVICE => Device,
sys::VIR_FROM_SSH => Ssh,
sys::VIR_FROM_LOCKSPACE => Lockspace,
sys::VIR_FROM_INITCTL => Initctl,
sys::VIR_FROM_IDENTITY => Identity,
sys::VIR_FROM_CGROUP => Cgroup,
sys::VIR_FROM_ACCESS => Access,
sys::VIR_FROM_SYSTEMD => Systemd,
sys::VIR_FROM_BHYVE => Bhyve,
sys::VIR_FROM_CRYPTO => Crypto,
sys::VIR_FROM_FIREWALL => Firewall,
sys::VIR_FROM_POLKIT => Polkit,
sys::VIR_FROM_THREAD => Thread,
sys::VIR_FROM_ADMIN => Admin,
sys::VIR_FROM_LOGGING => Logging,
sys::VIR_FROM_XENXL => XenXl,
sys::VIR_FROM_PERF => Perf,
sys::VIR_FROM_LIBSSH => Libssh,
sys::VIR_FROM_RESCTRL => ResCtrl,
sys::VIR_FROM_FIREWALLD => Firewalld,
sys::VIR_FROM_DOMAIN_CHECKPOINT => DomainCheckpoint,
sys::VIR_FROM_TPM => Tpm,
sys::VIR_FROM_BPF => Bpf,
sys::VIR_FROM_CH => Ch,
_ => Last => sys::VIR_FROM_NONE,
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ErrorNumber {
Ok,
InternalError,
NoMemory,
NoSupport,
UnknownHost,
NoConnect,
InvalidConn,
InvalidDomain,
InvalidArg,
OperationFailed,
GetFailed,
PostFailed,
HttpError,
SExprSerial,
NoXen,
XenCall,
OsType,
NoKernel,
NoRoot,
NoSource,
NoTarget,
NoName,
NoOs,
NoDevice,
NoXenStore,
DriverFull,
CallFailed,
XmlError,
DomExist,
OperationDenied,
OpenFailed,
ReadFailed,
ParseFailed,
ConfSyntax,
WriteFailed,
XmlDetail,
InvalidNetwork,
NetworkExist,
SystemError,
Rpc,
GnutlsError,
NoNetworkStart,
NoDomain,
NoNetwork,
InvalidMac,
AuthFailed,
InvalidStoragePool,
InvalidStorageVol,
NoStorage,
NoStoragePool,
NoStorageVolume,
NoNode,
InvalidNodeDevice,
NoNodeDevice,
NoSecurityModel,
OperationInvalid,
NoInterfaceStart,
NoInterface,
InvalidInterface,
MultipleInterfaces,
NoNwfilterStart,
InvalidNwfilter,
NoNwfilter,
BuildFirewall,
NoSecretStart,
InvalidSecret,
NoSecret,
ConfigUnsupported,
OperationTimeout,
MigratePersistFailed,
HookScriptFailed,
InvalidDomainSnapshot,
NoDomainSnapshot,
InvalidStream,
ArgumentUnsupported,
StorageProbeFailed,
StoragePoolBuilt,
SnapshotRevertRisky,
OperationAborted,
AuthCancelled,
NoDomainMetadata,
MigrateUnsafe,
Overflow,
BlockCopyActive,
OperationUnsupported,
Ssh,
AgentUnresponsive,
ResourceBusy,
AccessDenied,
DbusService,
StorageVolExist,
CpuIncompatible,
XmlInvalidSchema,
MigrateFinishOk,
AuthUnavailable,
NoServer,
NoClient,
AgentUnsynced,
Libssh,
DeviceMissing,
InvalidNwfilterBinding,
NoNwfilterBinding,
InvalidDomainCheckpoint,
NoDomainCheckpoint,
NoDomainBackup,
InvalidNetworkPort,
NetworkPortExists,
NoNetworkPort,
NoHostname,
CheckpointInconsistent,
MultipleDomains,
NoNetworkMetadata,
AgentCommandTimeout,
AgentCommandFailed,
Last,
}
impl_enum! {
enum: ErrorNumber,
raw: sys::virErrorNumber,
match: {
sys::VIR_ERR_OK => Ok,
sys::VIR_ERR_INTERNAL_ERROR => InternalError,
sys::VIR_ERR_NO_MEMORY => NoMemory,
sys::VIR_ERR_NO_SUPPORT => NoSupport,
sys::VIR_ERR_UNKNOWN_HOST => UnknownHost,
sys::VIR_ERR_NO_CONNECT => NoConnect,
sys::VIR_ERR_INVALID_CONN => InvalidConn,
sys::VIR_ERR_INVALID_DOMAIN => InvalidDomain,
sys::VIR_ERR_INVALID_ARG => InvalidArg,
sys::VIR_ERR_OPERATION_FAILED => OperationFailed,
sys::VIR_ERR_GET_FAILED => GetFailed,
sys::VIR_ERR_POST_FAILED => PostFailed,
sys::VIR_ERR_HTTP_ERROR => HttpError,
sys::VIR_ERR_SEXPR_SERIAL => SExprSerial,
sys::VIR_ERR_NO_XEN => NoXen,
sys::VIR_ERR_XEN_CALL => XenCall,
sys::VIR_ERR_OS_TYPE => OsType,
sys::VIR_ERR_NO_KERNEL => NoKernel,
sys::VIR_ERR_NO_ROOT => NoRoot,
sys::VIR_ERR_NO_SOURCE => NoSource,
sys::VIR_ERR_NO_TARGET => NoTarget,
sys::VIR_ERR_NO_NAME => NoName,
sys::VIR_ERR_NO_OS => NoOs,
sys::VIR_ERR_NO_DEVICE => NoDevice,
sys::VIR_ERR_NO_XENSTORE => NoXenStore,
sys::VIR_ERR_DRIVER_FULL => DriverFull,
sys::VIR_ERR_CALL_FAILED => CallFailed,
sys::VIR_ERR_XML_ERROR => XmlError,
sys::VIR_ERR_DOM_EXIST => DomExist,
sys::VIR_ERR_OPERATION_DENIED => OperationDenied,
sys::VIR_ERR_OPEN_FAILED => OpenFailed,
sys::VIR_ERR_READ_FAILED => ReadFailed,
sys::VIR_ERR_PARSE_FAILED => ParseFailed,
sys::VIR_ERR_CONF_SYNTAX => ConfSyntax,
sys::VIR_ERR_WRITE_FAILED => WriteFailed,
sys::VIR_ERR_XML_DETAIL => XmlDetail,
sys::VIR_ERR_INVALID_NETWORK => InvalidNetwork,
sys::VIR_ERR_NETWORK_EXIST => NetworkExist,
sys::VIR_ERR_SYSTEM_ERROR => SystemError,
sys::VIR_ERR_RPC => Rpc,
sys::VIR_ERR_GNUTLS_ERROR => GnutlsError,
sys::VIR_WAR_NO_NETWORK => NoNetworkStart,
sys::VIR_ERR_NO_DOMAIN => NoDomain,
sys::VIR_ERR_NO_NETWORK => NoNetwork,
sys::VIR_ERR_INVALID_MAC => InvalidMac,
sys::VIR_ERR_AUTH_FAILED => AuthFailed,
sys::VIR_ERR_INVALID_STORAGE_POOL => InvalidStoragePool,
sys::VIR_ERR_INVALID_STORAGE_VOL => InvalidStorageVol,
sys::VIR_WAR_NO_STORAGE => NoStorage,
sys::VIR_ERR_NO_STORAGE_POOL => NoStoragePool,
sys::VIR_ERR_NO_STORAGE_VOL => NoStorageVolume,
sys::VIR_WAR_NO_NODE => NoNode,
sys::VIR_ERR_INVALID_NODE_DEVICE => InvalidNodeDevice,
sys::VIR_ERR_NO_NODE_DEVICE => NoNodeDevice,
sys::VIR_ERR_NO_SECURITY_MODEL => NoSecurityModel,
sys::VIR_ERR_OPERATION_INVALID => OperationInvalid,
sys::VIR_WAR_NO_INTERFACE => NoInterfaceStart,
sys::VIR_ERR_NO_INTERFACE => NoInterface,
sys::VIR_ERR_INVALID_INTERFACE => InvalidInterface,
sys::VIR_ERR_MULTIPLE_INTERFACES => MultipleInterfaces,
sys::VIR_WAR_NO_NWFILTER => NoNwfilterStart,
sys::VIR_ERR_INVALID_NWFILTER => InvalidNwfilter,
sys::VIR_ERR_NO_NWFILTER => NoNwfilter,
sys::VIR_ERR_BUILD_FIREWALL => BuildFirewall,
sys::VIR_WAR_NO_SECRET => NoSecretStart,
sys::VIR_ERR_INVALID_SECRET => InvalidSecret,
sys::VIR_ERR_NO_SECRET => NoSecret,
sys::VIR_ERR_CONFIG_UNSUPPORTED => ConfigUnsupported,
sys::VIR_ERR_OPERATION_TIMEOUT => OperationTimeout,
sys::VIR_ERR_MIGRATE_PERSIST_FAILED => MigratePersistFailed,
sys::VIR_ERR_HOOK_SCRIPT_FAILED => HookScriptFailed,
sys::VIR_ERR_INVALID_DOMAIN_SNAPSHOT => InvalidDomainSnapshot,
sys::VIR_ERR_NO_DOMAIN_SNAPSHOT => NoDomainSnapshot,
sys::VIR_ERR_INVALID_STREAM => InvalidStream,
sys::VIR_ERR_ARGUMENT_UNSUPPORTED => ArgumentUnsupported,
sys::VIR_ERR_STORAGE_PROBE_FAILED => StorageProbeFailed,
sys::VIR_ERR_STORAGE_POOL_BUILT => StoragePoolBuilt,
sys::VIR_ERR_SNAPSHOT_REVERT_RISKY => SnapshotRevertRisky,
sys::VIR_ERR_OPERATION_ABORTED => OperationAborted,
sys::VIR_ERR_AUTH_CANCELLED => AuthCancelled,
sys::VIR_ERR_NO_DOMAIN_METADATA => NoDomainMetadata,
sys::VIR_ERR_MIGRATE_UNSAFE => MigrateUnsafe,
sys::VIR_ERR_OVERFLOW => Overflow,
sys::VIR_ERR_BLOCK_COPY_ACTIVE => BlockCopyActive,
sys::VIR_ERR_OPERATION_UNSUPPORTED => OperationUnsupported,
sys::VIR_ERR_SSH => Ssh,
sys::VIR_ERR_AGENT_UNRESPONSIVE => AgentUnresponsive,
sys::VIR_ERR_RESOURCE_BUSY => ResourceBusy,
sys::VIR_ERR_ACCESS_DENIED => AccessDenied,
sys::VIR_ERR_DBUS_SERVICE => DbusService,
sys::VIR_ERR_STORAGE_VOL_EXIST => StorageVolExist,
sys::VIR_ERR_CPU_INCOMPATIBLE => CpuIncompatible,
sys::VIR_ERR_XML_INVALID_SCHEMA => XmlInvalidSchema,
sys::VIR_ERR_MIGRATE_FINISH_OK => MigrateFinishOk,
sys::VIR_ERR_AUTH_UNAVAILABLE => AuthUnavailable,
sys::VIR_ERR_NO_SERVER => NoServer,
sys::VIR_ERR_NO_CLIENT => NoClient,
sys::VIR_ERR_AGENT_UNSYNCED => AgentUnsynced,
sys::VIR_ERR_LIBSSH => Libssh,
sys::VIR_ERR_DEVICE_MISSING => DeviceMissing,
sys::VIR_ERR_INVALID_NWFILTER_BINDING => InvalidNwfilterBinding,
sys::VIR_ERR_NO_NWFILTER_BINDING => NoNwfilterBinding,
sys::VIR_ERR_INVALID_DOMAIN_CHECKPOINT => InvalidDomainCheckpoint,
sys::VIR_ERR_NO_DOMAIN_CHECKPOINT => NoDomainCheckpoint,
sys::VIR_ERR_NO_DOMAIN_BACKUP => NoDomainBackup,
sys::VIR_ERR_INVALID_NETWORK_PORT => InvalidNetworkPort,
sys::VIR_ERR_NETWORK_PORT_EXIST => NetworkPortExists,
sys::VIR_ERR_NO_NETWORK_PORT => NoNetworkPort,
sys::VIR_ERR_NO_HOSTNAME => NoHostname,
sys::VIR_ERR_CHECKPOINT_INCONSISTENT => CheckpointInconsistent,
sys::VIR_ERR_MULTIPLE_DOMAINS => MultipleDomains,
sys::VIR_ERR_NO_NETWORK_METADATA => NoNetworkMetadata,
sys::VIR_ERR_AGENT_COMMAND_TIMEOUT => AgentCommandTimeout,
sys::VIR_ERR_AGENT_COMMAND_FAILED => AgentCommandFailed,
_ => Last => sys::VIR_ERR_INTERNAL_ERROR,
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Error {
code: sys::virErrorNumber,
domain: sys::virErrorDomain,
message: String,
level: sys::virErrorLevel,
}
extern "C" fn noop(_data: *mut libc::c_void, _error: sys::virErrorPtr) {}
impl Error {
pub fn last_error() -> Error {
let ptr: sys::virErrorPtr = unsafe { sys::virGetLastError() };
if ptr.is_null() {
Error {
code: sys::VIR_ERR_INTERNAL_ERROR,
domain: sys::VIR_FROM_NONE,
message: "an unknown libvirt error occurred".into(),
level: sys::VIR_ERR_ERROR,
}
} else {
unsafe { Error::from_raw(ptr) }
}
}
unsafe fn from_raw(ptr: sys::virErrorPtr) -> Error {
let code = (*ptr).code as sys::virErrorNumber;
let domain = (*ptr).domain as sys::virErrorDomain;
let message = CStr::from_ptr((*ptr).message)
.to_string_lossy()
.into_owned();
let level = (*ptr).level;
Error {
code,
domain,
message,
level,
}
}
pub fn code(&self) -> ErrorNumber {
ErrorNumber::from_raw(self.code)
}
pub fn domain(&self) -> ErrorDomain {
ErrorDomain::from_raw(self.domain)
}
pub fn message(&self) -> &str {
&self.message
}
pub fn level(&self) -> ErrorLevel {
ErrorLevel::from_raw(self.level)
}
}
impl StdError for Error {}
impl Display for Error {
fn fmt(&self, f: &mut Formatter) -> FmtResult {
match self.level() {
ErrorLevel::None => {}
_ => write!(f, "{}: ", self.level())?,
}
write!(
f,
"{} [code={} ({}), domain={} ({})]",
self.message,
self.code(),
self.code,
self.domain(),
self.domain,
)
}
}
pub fn clear_error_callback() {
unsafe {
sys::virSetErrorFunc(std::ptr::null_mut(), Some(noop));
}
}