use ::xdr_codec;
use std::convert::From;
pub mod generated {
#![allow(non_camel_case_types)]
#![allow(dead_code)]
#![allow(non_snake_case)]
#![allow(unused_assignments)]
use ::xdr_codec;
use super::{ErrorCode,ErrorDomain};
include!(concat!(env!("OUT_DIR"), "/virnetprotocol_xdr.rs"));
include!(concat!(env!("OUT_DIR"), "/remote_protocol_xdr.rs"));
impl virNetMessageError {
pub fn code(&self) -> ErrorCode {
ErrorCode::from(self.code)
}
pub fn domain(&self) -> ErrorDomain {
ErrorDomain::from(self.domain)
}
}
}
pub trait LibvirtRpc<R: ::std::io::Read> where {
const PROCEDURE: ::remote_procedure;
type Response: Send + ::xdr_codec::Unpack<R>;
}
pub use self::generated::remote_procedure;
pub use self::generated::{virNetMessageStatus,virNetMessageHeader,virNetMessageError};
#[derive(Debug,Clone)]
pub struct Domain(generated::remote_nonnull_domain);
impl Domain {
pub fn id(&self) -> i32 {
self.0.id
}
pub fn name(&self) -> String {
self.0.name.0.clone()
}
pub fn uuid(&self) -> ::uuid::Uuid {
let bytes = self.0.uuid.0;
::uuid::Uuid::from_bytes(&bytes).unwrap()
}
}
impl ::std::default::Default for generated::virNetMessageHeader {
fn default() -> Self {
generated::virNetMessageHeader {
prog: 0x20008086,
vers: 1,
proc_: 0,
type_: generated::virNetMessageType::VIR_NET_CALL,
serial: 0,
status: generated::virNetMessageStatus::VIR_NET_OK,
}
}
}
#[derive(Debug)]
pub struct LibvirtMessage<P> {
pub header: generated::virNetMessageHeader,
pub payload: P,
}
impl<P: xdr_codec::Pack<Out>, Out: xdr_codec::Write> xdr_codec::Pack<Out> for LibvirtMessage<P> {
fn pack(&self, out: &mut Out) -> xdr_codec::Result<usize> {
let mut sz: usize = 0;
sz += try!(self.header.pack(out));
sz += try!(self.payload.pack(out));
Ok(sz)
}
}
macro_rules! delegate_pack_impl {
($t:ty) => {
impl<Out: xdr_codec::Write> xdr_codec::Pack<Out> for $t {
fn pack(&self, out: &mut Out) -> xdr_codec::Result<usize> {
self.0.pack(out)
}
}
}
}
macro_rules! delegate_unpack_impl {
($t:ty) => {
impl<In: xdr_codec::Read> xdr_codec::Unpack<In> for $t {
fn unpack(input: &mut In) -> xdr_codec::Result<(Self, usize)> {
let (inner, len) = try!(xdr_codec::Unpack::unpack(input));
let mut pkt: $t = unsafe { ::std::mem::zeroed() };
pkt.0 = inner;
Ok((pkt, len))
}
}
}
}
macro_rules! req {
($name: ident) => {
#[derive(Debug)]
pub struct $name(());
delegate_pack_impl!($name);
impl $name {
pub fn new() -> Self {
$name(())
}
}
};
($name:ident : $inner:ident { $($f:ident : $t:ty => $e: expr),+ }) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_pack_impl!($name);
impl $name {
pub fn new($( $f: $t,)+) -> Self {
let inner = $inner {
$(
$f: $e,
)+
};
$name(inner)
}
}
};
($name:ident : $inner:ident { $($f:ident as $arg:ident : $t:ty => $e: expr),+ }) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_pack_impl!($name);
impl $name {
pub fn new($( $arg: $t,)+) -> Self {
let inner = $inner {
$(
$f: $e,
)+
};
$name(inner)
}
}
};
($name:ident : $inner:ident { $($f: ident => $e: expr),+ }) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_pack_impl!($name);
impl $name {
pub fn new() -> Self {
let inner = $inner {
$(
$f: $e,
)+
};
$name(inner)
}
}
};
($name:ident : $inner:ident { $($f: ident : $t: ty),+ }) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_pack_impl!($name);
impl $name {
pub fn new($( $f: $t,)+) -> Self {
let inner = $inner {
$(
$f,
)+
};
$name(inner)
}
}
};
($name:ident : $inner:ident { $($f: ident as $arg: ident : $t: ty),+ }) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_pack_impl!($name);
impl $name {
pub fn new($( $arg: $t,)+) -> Self {
let inner = $inner {
$(
$f: $arg,
)+
};
$name(inner)
}
}
};
}
macro_rules! resp {
($name: ident) => {
#[derive(Debug)]
pub struct $name(());
delegate_unpack_impl!($name);
impl Into<()> for $name {
fn into(self) -> () {
()
}
}
};
($name: ident : $inner: ty) => {
#[derive(Debug)]
pub struct $name($inner);
delegate_unpack_impl!($name);
};
}
macro_rules! rpc {
($id:path, $req:ident => $resp:ident) => {
impl<R: ::std::io::Read> LibvirtRpc<R> for $req {
const PROCEDURE: ::remote_procedure = $id;
type Response = $resp;
}
}
}
req!(NodeGetInfoRequest);
resp!(NodeGetInfoResponse: generated::remote_node_get_info_ret);
rpc!(remote_procedure::REMOTE_PROC_NODE_GET_INFO, NodeGetInfoRequest => NodeGetInfoResponse);
#[derive(Debug)]
pub struct NodeInfo(NodeGetInfoResponse);
impl From<NodeGetInfoResponse> for NodeInfo {
fn from(resp: NodeGetInfoResponse) -> Self {
NodeInfo(resp)
}
}
impl NodeInfo {
pub fn get_memory(&self) -> u64 {
(self.0).0.memory
}
pub fn get_cpus(&self) -> i32 {
(self.0).0.cpus
}
pub fn get_cores(&self) -> i32 {
(self.0).0.cores
}
pub fn get_sockets(&self) -> i32 {
(self.0).0.sockets
}
pub fn get_nodes(&self) -> i32 {
(self.0).0.nodes
}
}
req!(AuthListRequest);
resp!(AuthListResponse: generated::remote_auth_list_ret);
rpc!(remote_procedure::REMOTE_PROC_AUTH_LIST, AuthListRequest => AuthListResponse);
use generated::remote_connect_open_args;
req!(ConnectOpenRequest: remote_connect_open_args {
name => Some(generated::remote_nonnull_string("qemu:///system".to_string())),
flags => 0
});
resp!(ConnectOpenResponse);
rpc!(remote_procedure::REMOTE_PROC_CONNECT_OPEN, ConnectOpenRequest => ConnectOpenResponse);
req!(GetLibVersionRequest);
resp!(GetLibVersionResponse: generated::remote_connect_get_lib_version_ret);
rpc!(remote_procedure::REMOTE_PROC_CONNECT_GET_LIB_VERSION, GetLibVersionRequest => GetLibVersionResponse);
impl GetLibVersionResponse {
pub fn version(&self) -> (u32, u32, u32) {
let mut version = (self.0).lib_ver;
let major = version / 1000000;
version %= 1000000;
let minor = version / 1000;
version %= 1000;
let micro = version;
(major as u32, minor as u32, micro as u32)
}
}
use generated::remote_connect_list_defined_domains_args;
req!(ListDefinedDomainsRequest: remote_connect_list_defined_domains_args {
maxnames => generated::REMOTE_DOMAIN_LIST_MAX as i32
});
resp!(ListDefinedDomainsResponse: generated::remote_connect_list_defined_domains_ret);
rpc!(remote_procedure::REMOTE_PROC_CONNECT_LIST_DEFINED_DOMAINS, ListDefinedDomainsRequest => ListDefinedDomainsResponse);
impl ListDefinedDomainsResponse {
pub fn get_domain_names(&self) -> Vec<String> {
let mut names = Vec::new();
for name in &(self.0).names {
names.push(name.0.to_string());
}
names
}
}
use generated::remote_domain_define_xml_flags_args;
req!(DomainDefineXMLRequest: remote_domain_define_xml_flags_args {
xml: &str => generated::remote_nonnull_string(xml.to_string()),
flags: u32 => flags
});
resp!(DomainDefineXMLResponse: generated::remote_domain_define_xml_flags_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_DEFINE_XML_FLAGS, DomainDefineXMLRequest => DomainDefineXMLResponse);
impl ::std::convert::Into<Domain> for DomainDefineXMLResponse {
fn into(self) -> Domain {
Domain (self.0.dom)
}
}
impl DomainDefineXMLResponse {
pub fn get_domain(&self) -> Domain {
Domain ((self.0).dom.clone())
}
}
use generated::remote_domain_shutdown_args;
req!(DomainShutdownRequest: remote_domain_shutdown_args {
dom: &Domain => dom.0.to_owned()
});
resp!(DomainShutdownResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SHUTDOWN, DomainShutdownRequest => DomainShutdownResponse);
use generated::remote_domain_reboot_args;
req!(DomainRebootRequest: remote_domain_reboot_args {
dom: &Domain => dom.0.to_owned(),
flags: u32 => flags
});
resp!(DomainRebootResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_REBOOT, DomainRebootRequest => DomainRebootResponse);
use generated::remote_domain_reset_args;
req!(DomainResetRequest: remote_domain_reset_args {
dom: &Domain => dom.0.to_owned(),
flags: u32 => flags
});
resp!(DomainResetResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_RESET, DomainResetRequest => DomainResetResponse);
use generated::remote_domain_undefine_flags_args;
req!(DomainUndefineRequest: remote_domain_undefine_flags_args {
dom: Domain => dom.0,
flags: u32 => flags
});
resp!(DomainUndefineResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_UNDEFINE, DomainUndefineRequest => DomainUndefineResponse);
#[allow(non_snake_case)]
pub mod DomainCreateFlags {
bitflags! {
pub flags DomainCreateFlags: u32 {
const START_PAUSED = 1,
const START_AUTODESTROY = 2,
const START_BYPASS_CACHE = 4,
const START_FORCE_BOOT = 8,
const START_VALIDATE = 16,
}
}
}
use generated::remote_domain_create_with_flags_args;
req!(DomainCreateRequest: remote_domain_create_with_flags_args {
dom: Domain => dom.0,
flags: DomainCreateFlags::DomainCreateFlags => flags.bits()
});
resp!(DomainCreateResponse: generated::remote_domain_create_with_flags_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS, DomainCreateRequest => DomainCreateResponse);
impl ::std::convert::Into<Domain> for DomainCreateResponse {
fn into(self) -> Domain {
Domain (self.0.dom)
}
}
impl DomainCreateResponse {
pub fn get_domain(&self) -> Domain {
Domain ((self.0).dom.clone())
}
}
#[allow(non_snake_case)]
pub mod DomainDestroyFlags {
bitflags! {
pub flags DomainDestroyFlags: u32 {
const DESTROY_DEFAULT = 0,
const DESTROY_GRACEFUL = 1,
}
}
}
use generated::remote_domain_destroy_flags_args;
req!(DomainDestroyRequest: remote_domain_destroy_flags_args {
dom: &Domain => dom.0.clone(),
flags: DomainDestroyFlags::DomainDestroyFlags => flags.bits()
});
resp!(DomainDestroyResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_DESTROY_FLAGS, DomainDestroyRequest => DomainDestroyResponse);
#[allow(non_snake_case)]
pub mod ListAllDomainsFlags {
bitflags! {
pub flags ListAllDomainsFlags: u32 {
const DOMAINS_ACTIVE = 1,
const DOMAINS_INACTIVE = 2,
const DOMAINS_PERSISTENT = 4,
const DOMAINS_TRANSIENT = 8,
const DOMAINS_RUNNING = 16,
const DOMAINS_PAUSED = 32,
const DOMAINS_SHUTOFF = 64,
const DOMAINS_OTHER = 128,
const DOMAINS_MANAGEDSAVE = 256,
const DOMAINS_NO_MANAGEDSAVE = 512,
const DOMAINS_AUTOSTART = 1024,
const DOMAINS_NO_AUTOSTART = 2048,
const DOMAINS_HAS_SNAPSHOT = 4096,
const DOMAINS_NO_SNAPSHOT = 8192,
}
}
}
#[derive(Debug)]
pub struct ListAllDomainsRequest(generated::remote_connect_list_all_domains_args);
impl ListAllDomainsRequest {
pub fn new(flags: ListAllDomainsFlags::ListAllDomainsFlags) -> Self {
let payload = generated::remote_connect_list_all_domains_args {
need_results: 1,
flags: flags.bits(),
};
ListAllDomainsRequest(payload)
}
}
delegate_pack_impl!(ListAllDomainsRequest);
#[derive(Debug)]
pub struct ListAllDomainsResponse(generated::remote_connect_list_all_domains_ret);
impl ::std::convert::Into<Vec<Domain>> for ListAllDomainsResponse {
fn into(self) -> Vec<Domain> {
let mut domains = Vec::new();
for dom in &(self.0).domains {
domains.push(Domain(dom.clone()))
}
domains
}
}
delegate_unpack_impl!(ListAllDomainsResponse);
impl<R: ::std::io::Read> LibvirtRpc<R> for ListAllDomainsRequest {
const PROCEDURE: ::remote_procedure = remote_procedure::REMOTE_PROC_CONNECT_LIST_ALL_DOMAINS;
type Response = ListAllDomainsResponse;
}
use generated::remote_connect_domain_event_callback_register_any_args;
req!(DomainEventCallbackRegisterAnyRequest: remote_connect_domain_event_callback_register_any_args {
eventID as event: i32 => event,
dom as domain: Option<&Domain> => domain.map(|dom| Box::new(dom.0.clone()))
});
resp!(DomainEventCallbackRegisterAnyResponse: generated::remote_connect_domain_event_callback_register_any_ret);
rpc!(remote_procedure::REMOTE_PROC_CONNECT_DOMAIN_EVENT_CALLBACK_REGISTER_ANY, DomainEventCallbackRegisterAnyRequest => DomainEventCallbackRegisterAnyResponse);
impl DomainEventCallbackRegisterAnyResponse {
pub fn callback_id(&self) -> i32 {
self.0.callbackID
}
}
use generated::remote_domain_lookup_by_uuid_args;
req!(DomainLookupByUuidRequest: remote_domain_lookup_by_uuid_args {
uuid: &::uuid::Uuid => generated::remote_uuid(uuid.as_bytes().clone())
});
resp!(DomainLookupByUuidResponse: generated::remote_domain_lookup_by_uuid_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_LOOKUP_BY_UUID, DomainLookupByUuidRequest => DomainLookupByUuidResponse);
impl DomainLookupByUuidResponse {
pub fn domain(&self) -> Domain {
Domain ((self.0).dom.clone())
}
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventCrashedDetailType {
Panicked = 0,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventStartedDetailType {
Booted = 0,
Migrated = 1,
Restored = 2,
FromSnapshot = 3,
Wakeup = 4,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventStoppedDetailType {
Shutdown = 0,
Destroyed = 1,
Crashed = 2,
Migrated = 3,
Saved = 4,
Failed = 5,
FromSnapshot = 6,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventSuspendedDetailType {
Paused = 0,
Migrated = 1,
IoError = 2,
Watchdog = 3,
Restored = 4,
FromSnapshot = 5,
ApiError = 6,
PostCopy = 7,
PostCopyFailed = 8,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventResumedDetailType {
Unpaused = 0,
Migrated = 1,
FromSnapshot = 2,
PostCopy = 3,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventDefinedDetailType {
Added = 0,
Updated = 1,
Renamed = 2,
FromSnapshot = 3,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventUndefinedDetailType {
Removed = 0,
Renamed = 1,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventShutdownDetailType {
Finished = 0,
}
#[derive(Debug)]
#[repr(u8)]
pub enum EventPmSuspendedDetailType {
Memory = 0,
Disk = 1,
}
pub trait DomainEvent where Self: Sized {
type From: Into<Self> + ::xdr_codec::Unpack<::std::io::Cursor<::bytes::BytesMut>>;
}
#[derive(Debug)]
pub enum DomainEventInfo {
Defined(EventDefinedDetailType),
Undefined(EventUndefinedDetailType),
Started(EventStartedDetailType),
Suspended(EventSuspendedDetailType),
Stopped(EventStoppedDetailType),
Shutdown(EventShutdownDetailType),
Resumed(EventResumedDetailType),
Crashed(EventCrashedDetailType),
PmSuspended(EventPmSuspendedDetailType),
Other(i32, i32)
}
#[derive(Debug)]
pub struct DomainLifecycleEvent {
pub domain: Domain,
pub info: DomainEventInfo,
}
const VIR_DOMAIN_EVENT_DEFINED: i32 = 0;
const VIR_DOMAIN_EVENT_UNDEFINED: i32 = 1;
const VIR_DOMAIN_EVENT_STARTED: i32 = 2;
const VIR_DOMAIN_EVENT_SUSPENDED: i32 = 3;
const VIR_DOMAIN_EVENT_RESUMED: i32 = 4;
const VIR_DOMAIN_EVENT_STOPPED: i32 = 5;
const VIR_DOMAIN_EVENT_SHUTDOWN: i32 = 6;
const VIR_DOMAIN_EVENT_PMSUSPENDED: i32 = 7;
const VIR_DOMAIN_EVENT_CRASHED: i32 = 8;
impl DomainEvent for DomainLifecycleEvent {
type From = generated::remote_domain_event_callback_lifecycle_msg;
}
impl From<generated::remote_domain_event_callback_lifecycle_msg> for DomainLifecycleEvent {
fn from(ev: generated::remote_domain_event_callback_lifecycle_msg) -> Self {
use ::std::mem;
let info = match ev.msg.event {
VIR_DOMAIN_EVENT_DEFINED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Defined(detail)
}
VIR_DOMAIN_EVENT_UNDEFINED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Undefined(detail)
}
VIR_DOMAIN_EVENT_STARTED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Started(detail)
}
VIR_DOMAIN_EVENT_SUSPENDED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Suspended(detail)
}
VIR_DOMAIN_EVENT_STOPPED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Stopped(detail)
}
VIR_DOMAIN_EVENT_RESUMED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Resumed(detail)
}
VIR_DOMAIN_EVENT_SHUTDOWN => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Shutdown(detail)
}
VIR_DOMAIN_EVENT_CRASHED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::Crashed(detail)
}
VIR_DOMAIN_EVENT_PMSUSPENDED => {
let detail = unsafe { mem::transmute(ev.msg.detail as u8) };
DomainEventInfo::PmSuspended(detail)
}
i => {
DomainEventInfo::Other(i, ev.msg.detail)
}
};
let domain = Domain(ev.msg.dom);
DomainLifecycleEvent { domain, info }
}
}
#[derive(Debug)]
pub struct DomainRebootEvent {
pub domain: Domain,
}
impl DomainEvent for DomainRebootEvent {
type From = generated::remote_domain_event_callback_reboot_msg;
}
impl From<generated::remote_domain_event_callback_reboot_msg> for DomainRebootEvent {
fn from(ev: generated::remote_domain_event_callback_reboot_msg) -> Self {
let domain = Domain(ev.msg.dom);
DomainRebootEvent { domain }
}
}
#[derive(Debug,Copy,Clone)]
#[repr(i32)]
pub enum DomainBlockJobType {
Unknown = 0,
Pull = 1,
Copy = 2,
Commit = 3,
ActiveCommit = 4,
}
#[derive(Debug,Copy,Clone)]
#[repr(i32)]
pub enum DomainBlockJobStatus {
Completed = 0,
Failed = 1,
Canceled = 2,
Ready = 3,
}
#[derive(Debug)]
pub struct DomainBlockJobInfo {
type_: DomainBlockJobType,
status: DomainBlockJobStatus,
}
impl DomainBlockJobInfo {
pub fn get_type(&self) -> DomainBlockJobType {
self.type_
}
pub fn get_status(&self) -> DomainBlockJobStatus {
self.status
}
}
#[derive(Debug)]
pub struct DomainBlockJobEvent {
pub domain: Domain,
pub info: DomainBlockJobInfo,
}
impl From<generated::remote_domain_event_callback_block_job_msg> for DomainBlockJobEvent {
fn from(msg: generated::remote_domain_event_callback_block_job_msg) -> Self {
let msg = msg.msg;
let dom = Domain(msg.dom);
let type_ = unsafe { ::std::mem::transmute(msg.type_) };
let status = unsafe { ::std::mem::transmute(msg.status) };
let info = DomainBlockJobInfo { type_, status };
DomainBlockJobEvent { domain: dom, info: info }
}
}
impl DomainEvent for DomainBlockJobEvent {
type From = generated::remote_domain_event_callback_block_job_msg;
}
#[derive(Debug,Copy,Clone)]
pub enum DomainEventId {
Lifecycle,
Reboot,
RtcChange,
Watchdog,
IoError,
Graphics,
IoErrorReason,
ControlError,
BlockJob,
DiskChange,
TrayChange,
PmWakeup,
PmSuspend,
BalloonChange,
PmSuspendDisk,
DeviceRemoved,
BlockJob2,
Tunable,
AgentLifecycle,
DeviceAdded,
MigrationIteration,
JobCompleted,
DeviceRemovalFailed,
MetadataChanged,
BlockThreshold,
}
impl DomainEventId {
pub fn to_procedure(&self) -> remote_procedure {
use self::DomainEventId::*;
use remote_procedure::*;
match *self {
Lifecycle => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_LIFECYCLE,
Reboot => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_REBOOT,
RtcChange => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_RTC_CHANGE,
Watchdog => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_WATCHDOG,
IoError => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_IO_ERROR,
Graphics => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_GRAPHICS,
IoErrorReason => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_IO_ERROR_REASON,
ControlError => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_CONTROL_ERROR,
BlockJob => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_BLOCK_JOB,
DiskChange => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DISK_CHANGE,
TrayChange => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_TRAY_CHANGE,
PmWakeup => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMWAKEUP,
PmSuspend => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND,
BalloonChange => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_BALLOON_CHANGE,
PmSuspendDisk => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND_DISK,
DeviceRemoved => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_REMOVED,
DeviceAdded => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED,
Tunable => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_TUNABLE,
AgentLifecycle => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_AGENT_LIFECYCLE,
BlockJob2 => REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB_2,
MigrationIteration => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_MIGRATION_ITERATION,
JobCompleted => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_JOB_COMPLETED,
DeviceRemovalFailed => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_REMOVAL_FAILED,
MetadataChanged => REMOTE_PROC_DOMAIN_EVENT_CALLBACK_METADATA_CHANGE,
BlockThreshold => REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD,
}
}
pub fn from_procedure(proc_: remote_procedure) -> Option<Self> {
use self::DomainEventId::*;
use remote_procedure::*;
match proc_ {
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_LIFECYCLE => Some(Lifecycle),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_REBOOT => Some(Reboot),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_RTC_CHANGE => Some(RtcChange),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_WATCHDOG => Some(Watchdog),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_IO_ERROR => Some(IoError),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_GRAPHICS => Some(Graphics),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_IO_ERROR_REASON => Some(IoErrorReason),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_CONTROL_ERROR => Some(ControlError),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_BLOCK_JOB => Some(BlockJob),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DISK_CHANGE => Some(DiskChange),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_TRAY_CHANGE => Some(TrayChange),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMWAKEUP => Some(PmWakeup),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND => Some(PmSuspend),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_BALLOON_CHANGE => Some(BalloonChange),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_PMSUSPEND_DISK => Some(PmSuspendDisk),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_REMOVED => Some(DeviceRemoved),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_ADDED => Some(DeviceAdded),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_TUNABLE => Some(Tunable),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_AGENT_LIFECYCLE => Some(AgentLifecycle),
REMOTE_PROC_DOMAIN_EVENT_BLOCK_JOB_2 => Some(BlockJob2),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_MIGRATION_ITERATION => Some(MigrationIteration),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_JOB_COMPLETED => Some(JobCompleted),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_DEVICE_REMOVAL_FAILED => Some(DeviceRemovalFailed),
REMOTE_PROC_DOMAIN_EVENT_CALLBACK_METADATA_CHANGE => Some(MetadataChanged),
REMOTE_PROC_DOMAIN_EVENT_BLOCK_THRESHOLD => Some(BlockThreshold),
_ => None,
}
}
}
#[allow(non_snake_case)]
pub mod ListAllStoragePoolsFlags {
bitflags! {
pub flags ListAllStoragePoolsFlags: u32 {
const LIST_STORAGE_POOLS_INACTIVE = 1,
const LIST_STORAGE_POOLS_ACTIVE = 2,
const LIST_STORAGE_POOLS_PERSISTENT = 4,
const LIST_STORAGE_POOLS_TRANSIENT = 8,
const LIST_STORAGE_POOLS_AUTOSTART = 16,
const LIST_STORAGE_POOLS_NO_AUTOSTART = 32,
const LIST_STORAGE_POOLS_DIR = 64,
const LIST_STORAGE_POOLS_FS = 128,
const LIST_STORAGE_POOLS_NETFS = 256,
const LIST_STORAGE_POOLS_LOGICAL = 512,
const LIST_STORAGE_POOLS_DISK = 1024,
const LIST_STORAGE_POOLS_ISCSI = 2048,
const LIST_STORAGE_POOLS_SCSI = 4096,
const LIST_STORAGE_POOLS_MPATH = 8192,
const LIST_STORAGE_POOLS_RBD = 16384,
const LIST_STORAGE_POOLS_SHEEPDOG = 32768,
const LIST_STORAGE_POOLS_GLUSTER = 65536,
const LIST_STORAGE_POOLS_ZFS = 131072,
const LIST_STORAGE_POOLS_VSTORAGE = 262144,
}
}
}
#[derive(Debug)]
pub struct StoragePool(generated::remote_nonnull_storage_pool);
impl From<generated::remote_nonnull_storage_pool> for StoragePool {
fn from(inner: generated::remote_nonnull_storage_pool) -> Self {
StoragePool(inner)
}
}
#[derive(Debug)]
pub struct ListAllStoragePoolsRequest(generated::remote_connect_list_all_storage_pools_args);
delegate_pack_impl!(ListAllStoragePoolsRequest);
impl ListAllStoragePoolsRequest {
pub fn new(flags: ListAllStoragePoolsFlags::ListAllStoragePoolsFlags) -> Self {
let pl = generated::remote_connect_list_all_storage_pools_args {
need_results: 1,
flags: flags.bits(),
};
ListAllStoragePoolsRequest(pl)
}
}
#[derive(Debug)]
pub struct ListAllStoragePoolsResponse(generated::remote_connect_list_all_storage_pools_ret);
delegate_unpack_impl!(ListAllStoragePoolsResponse);
impl Into<Vec<StoragePool>> for ListAllStoragePoolsResponse {
fn into(self) -> Vec<StoragePool> {
let mut result = Vec::new();
for pool in self.0.pools {
result.push(pool.into());
}
result
}
}
rpc!(remote_procedure::REMOTE_PROC_CONNECT_LIST_ALL_STORAGE_POOLS, ListAllStoragePoolsRequest => ListAllStoragePoolsResponse);
use generated::remote_storage_pool_define_xml_args;
req!(StoragePoolDefineXmlRequest: remote_storage_pool_define_xml_args {
xml: &str => generated::remote_nonnull_string(xml.to_string()),
flags: u32 => flags
});
resp!(StoragePoolDefineXmlResponse: generated::remote_storage_pool_define_xml_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_DEFINE_XML, StoragePoolDefineXmlRequest => StoragePoolDefineXmlResponse);
impl Into<StoragePool> for StoragePoolDefineXmlResponse {
fn into(self) -> StoragePool {
StoragePool(self.0.pool)
}
}
use generated::remote_storage_pool_lookup_by_uuid_args;
req!(StoragePoolLookupByUuidRequest: remote_storage_pool_lookup_by_uuid_args {
uuid: &::uuid::Uuid => generated::remote_uuid(uuid.as_bytes().clone())
});
resp!(StoragePoolLookupByUuidResponse: generated::remote_storage_pool_lookup_by_uuid_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_UUID, StoragePoolLookupByUuidRequest => StoragePoolLookupByUuidResponse);
impl Into<StoragePool> for StoragePoolLookupByUuidResponse {
fn into(self) -> StoragePool {
StoragePool(self.0.pool)
}
}
use generated::remote_storage_pool_lookup_by_name_args;
req!(StoragePoolLookupByNameRequest: remote_storage_pool_lookup_by_name_args {
name: &str => generated::remote_nonnull_string(name.to_string())
});
resp!(StoragePoolLookupByNameResponse: generated::remote_storage_pool_lookup_by_name_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_LOOKUP_BY_NAME, StoragePoolLookupByNameRequest => StoragePoolLookupByNameResponse);
impl Into<StoragePool> for StoragePoolLookupByNameResponse {
fn into(self) -> StoragePool {
StoragePool(self.0.pool)
}
}
use generated::remote_storage_pool_create_args;
req!(StoragePoolCreateRequest: remote_storage_pool_create_args {
pool: &StoragePool => pool.0.clone(),
flags: u32 => flags
});
resp!(StoragePoolCreateResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_CREATE, StoragePoolCreateRequest => StoragePoolCreateResponse);
use generated::remote_storage_pool_destroy_args;
req!(StoragePoolDestroyRequest: remote_storage_pool_destroy_args {
pool: &StoragePool => pool.0.clone()
});
resp!(StoragePoolDestroyResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_DESTROY, StoragePoolDestroyRequest => StoragePoolDestroyResponse);
use generated::remote_storage_pool_undefine_args;
req!(StoragePoolUndefineRequest: remote_storage_pool_undefine_args {
pool: StoragePool => pool.0
});
resp!(StoragePoolUndefineResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_UNDEFINE, StoragePoolUndefineRequest => StoragePoolUndefineResponse);
use generated::remote_storage_pool_get_info_args;
req!(StoragePoolGetInfoRequest: remote_storage_pool_get_info_args {
pool: &StoragePool => pool.0.clone()
});
resp!(StoragePoolGetInfoResponse: generated::remote_storage_pool_get_info_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_GET_INFO, StoragePoolGetInfoRequest => StoragePoolGetInfoResponse);
#[derive(Debug)]
pub struct StoragePoolInfo(StoragePoolGetInfoResponse);
impl From<StoragePoolGetInfoResponse> for StoragePoolInfo {
fn from(v: StoragePoolGetInfoResponse) -> Self {
StoragePoolInfo(v)
}
}
impl StoragePoolInfo {
pub fn get_capacity(&self) -> u64 {
(self.0).0.capacity
}
pub fn get_allocation(&self) -> u64 {
(self.0).0.allocation
}
pub fn get_available(&self) -> u64 {
(self.0).0.available
}
}
use generated::remote_storage_pool_list_volumes_args;
req!(StoragePoolListVolumesRequest: remote_storage_pool_list_volumes_args {
pool: &StoragePool => pool.0.clone(),
maxnames: i32 => maxnames
});
resp!(StoragePoolListVolumesResponse: generated::remote_storage_pool_list_volumes_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_LIST_VOLUMES, StoragePoolListVolumesRequest => StoragePoolListVolumesResponse);
impl Into<Vec<String>> for StoragePoolListVolumesResponse {
fn into(self) -> Vec<String> {
self.0.names.into_iter().map(|nns| nns.0).collect()
}
}
#[derive(Debug)]
pub struct Volume(generated::remote_nonnull_storage_vol);
impl Volume {
pub fn name(&self) -> &str {
&self.0.name.0
}
pub fn key(&self) -> &str {
&self.0.key.0
}
pub fn pool_name(&self) -> &str {
&self.0.pool.0
}
}
impl From<generated::remote_nonnull_storage_vol> for Volume {
fn from(inner: generated::remote_nonnull_storage_vol) -> Self {
Volume(inner)
}
}
use generated::remote_storage_pool_list_all_volumes_args;
req!(StoragePoolListAllVolumesRequest: remote_storage_pool_list_all_volumes_args {
pool: &StoragePool => pool.0.clone(),
need_results: i32 => need_results,
flags: u32 => flags
});
resp!(StoragePoolListAllVolumesResponse: generated::remote_storage_pool_list_all_volumes_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_POOL_LIST_ALL_VOLUMES, StoragePoolListAllVolumesRequest => StoragePoolListAllVolumesResponse);
impl Into<Vec<Volume>> for StoragePoolListAllVolumesResponse {
fn into(self) -> Vec<Volume> {
self.0.vols.into_iter().map(|vol| vol.into()).collect()
}
}
#[allow(non_snake_case)]
pub mod StorageVolCreateXmlFlags {
bitflags! {
pub flags StorageVolCreateXmlFlags: u32 {
const VOL_CREATE_PREALLOC_METADATA = 1,
const VOL_CREATE_REFLINK = 2,
}
}
}
use generated::remote_storage_vol_create_xml_args;
req!(StorageVolCreateXmlRequest: remote_storage_vol_create_xml_args {
pool: &StoragePool => pool.0.clone(),
xml: &str => generated::remote_nonnull_string(xml.to_owned()),
flags: StorageVolCreateXmlFlags::StorageVolCreateXmlFlags => flags.bits()
});
resp!(StorageVolCreateXmlResponse: generated::remote_storage_vol_create_xml_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_CREATE_XML, StorageVolCreateXmlRequest => StorageVolCreateXmlResponse);
impl Into<Volume> for StorageVolCreateXmlResponse {
fn into(self) -> Volume {
self.0.vol.into()
}
}
use generated::remote_storage_vol_create_xml_from_args;
req!(StorageVolCreateXmlFromRequest: remote_storage_vol_create_xml_from_args {
pool: &StoragePool => pool.0.clone(),
xml: &str => generated::remote_nonnull_string(xml.to_owned()),
clonevol: &Volume => clonevol.0.clone(),
flags: StorageVolCreateXmlFlags::StorageVolCreateXmlFlags => flags.bits()
});
resp!(StorageVolCreateXmlFromResponse: generated::remote_storage_vol_create_xml_from_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_CREATE_XML_FROM, StorageVolCreateXmlFromRequest => StorageVolCreateXmlFromResponse);
impl Into<Volume> for StorageVolCreateXmlFromResponse {
fn into(self) -> Volume {
self.0.vol.into()
}
}
use generated::remote_storage_vol_delete_args;
req!(StorageVolDeleteRequest: remote_storage_vol_delete_args {
vol: Volume => vol.0.clone(),
flags: u32 => flags
});
resp!(StorageVolDeleteResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_DELETE, StorageVolDeleteRequest => StorageVolDeleteResponse);
use generated::remote_storage_vol_wipe_args;
req!(StorageVolWipeRequest: remote_storage_vol_wipe_args {
vol: &Volume => vol.0.clone(),
flags: u32 => flags
});
resp!(StorageVolWipeResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_WIPE, StorageVolWipeRequest => StorageVolWipeResponse);
use generated::remote_storage_vol_lookup_by_name_args;
req!(StorageVolLookupByNameRequest: remote_storage_vol_lookup_by_name_args {
pool: &StoragePool => pool.0.clone(),
name: &str => generated::remote_nonnull_string(name.to_owned())
});
resp!(StorageVolLookupByNameResponse: generated::remote_storage_vol_lookup_by_name_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_LOOKUP_BY_NAME, StorageVolLookupByNameRequest => StorageVolLookupByNameResponse);
impl Into<Volume> for StorageVolLookupByNameResponse {
fn into(self) -> Volume {
Volume(self.0.vol)
}
}
#[allow(non_snake_case)]
pub mod StorageVolResizeFlags {
bitflags! {
pub flags StorageVolResizeFlags: u32 {
const RESIZE_ALLOCATE = 1,
const RESIZE_DELTA = 2,
const RESIZE_SHRINK = 4,
}
}
}
use generated::remote_storage_vol_resize_args;
req!(StorageVolResizeRequest: remote_storage_vol_resize_args {
vol: &Volume => vol.0.clone(),
capacity: u64 => capacity,
flags: StorageVolResizeFlags::StorageVolResizeFlags => flags.bits()
});
resp!(StorageVolResizeResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_RESIZE, StorageVolResizeRequest => StorageVolResizeResponse);
use generated::remote_storage_vol_get_info_args;
req!(StorageVolGetInfoRequest: remote_storage_vol_get_info_args {
vol: &Volume => vol.0.clone()
});
resp!(StorageVolGetInfoResponse: generated::remote_storage_vol_get_info_ret);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_GET_INFO, StorageVolGetInfoRequest => StorageVolGetInfoResponse);
impl Into<VolumeInfo> for StorageVolGetInfoResponse {
fn into(self) -> VolumeInfo {
VolumeInfo(self.0)
}
}
#[derive(Debug)]
pub struct VolumeInfo(generated::remote_storage_vol_get_info_ret);
impl VolumeInfo {
pub fn get_capacity(&self) -> u64 {
(self.0).capacity
}
pub fn get_allocation(&self) -> u64 {
(self.0).allocation
}
}
use generated::remote_domain_screenshot_args;
req!(DomainScreenshotRequest: remote_domain_screenshot_args {
dom: &Domain => dom.0.clone(),
screen: u32 => screen,
flags: u32 => flags
});
resp!(DomainScreenshotResponse: generated::remote_domain_screenshot_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SCREENSHOT, DomainScreenshotRequest => DomainScreenshotResponse);
impl Into<Option<String>> for DomainScreenshotResponse {
fn into(self) -> Option<String> {
self.0.mime.map(|s| s.0)
}
}
use generated::remote_storage_vol_download_args;
req!(StorageVolDownloadRequest: remote_storage_vol_download_args {
vol: &Volume => vol.0.clone(),
offset: u64 => offset,
length: u64 => length,
flags: u32 => flags
});
resp!(StorageVolDownloadResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_DOWNLOAD, StorageVolDownloadRequest => StorageVolDownloadResponse);
use generated::remote_storage_vol_upload_args;
req!(StorageVolUploadRequest: remote_storage_vol_upload_args {
vol: &Volume => vol.0.clone(),
offset: u64 => offset,
length: u64 => length,
flags: u32 => flags
});
resp!(StorageVolUploadResponse);
rpc!(remote_procedure::REMOTE_PROC_STORAGE_VOL_UPLOAD, StorageVolUploadRequest => StorageVolUploadResponse);
use generated::remote_domain_get_info_args;
req!(DomainGetInfoRequest: remote_domain_get_info_args {
dom: &Domain => dom.0.clone()
});
resp!(DomainGetInfoResponse: generated::remote_domain_get_info_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_GET_INFO, DomainGetInfoRequest => DomainGetInfoResponse);
use generated::remote_domain_attach_device_flags_args;
req!(DomainAttachDeviceRequest: remote_domain_attach_device_flags_args {
dom: &Domain => dom.0.clone(),
xml: &str => generated::remote_nonnull_string(xml.to_owned()),
flags: DomainModificationImpact::DomainModificationImpact => flags.bits()
});
resp!(DomainAttachDeviceResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_ATTACH_DEVICE_FLAGS, DomainAttachDeviceRequest => DomainAttachDeviceResponse);
use generated::remote_domain_detach_device_flags_args;
req!(DomainDetachDeviceRequest: remote_domain_detach_device_flags_args {
dom: &Domain => dom.0.clone(),
xml: &str => generated::remote_nonnull_string(xml.to_owned()),
flags: DomainModificationImpact::DomainModificationImpact => flags.bits()
});
resp!(DomainDetachDeviceResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_DETACH_DEVICE_FLAGS, DomainDetachDeviceRequest => DomainDetachDeviceResponse);
use generated::remote_domain_update_device_flags_args;
req!(DomainUpdateDeviceRequest: remote_domain_update_device_flags_args {
dom: &Domain => dom.0.clone(),
xml: &str => generated::remote_nonnull_string(xml.to_owned()),
flags: DomainModificationImpact::DomainModificationImpact => flags.bits()
});
resp!(DomainUpdateDeviceResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_UPDATE_DEVICE_FLAGS, DomainUpdateDeviceRequest => DomainUpdateDeviceResponse);
use generated::remote_domain_set_memory_flags_args;
req!(DomainSetMemoryRequest: remote_domain_set_memory_flags_args {
dom: &Domain => dom.0.clone(),
memory: u64 => memory,
flags: DomainModificationImpact::MemoryModificationImpact => flags.bits()
});
resp!(DomainSetMemoryResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SET_MEMORY_FLAGS, DomainSetMemoryRequest => DomainSetMemoryResponse);
use generated::remote_domain_get_memory_parameters_args;
req!(DomainGetMemoryParametersRequest: remote_domain_get_memory_parameters_args {
dom: &Domain => dom.0.clone(),
nparams: u32 => nparams as i32,
flags: DomainModificationImpact::DomainModificationImpact => flags.bits()
});
resp!(DomainGetMemoryParametersResponse: generated::remote_domain_get_memory_parameters_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS, DomainGetMemoryParametersRequest => DomainGetMemoryParametersResponse);
impl DomainGetMemoryParametersResponse {
pub fn count(&self) -> u32 {
self.0.nparams as u32
}
pub fn parameters(self) -> Vec<TypedParam> {
self.0.params.into_iter().map(TypedParam::from).collect()
}
}
use generated::remote_domain_set_vcpus_flags_args;
req!(DomainSetVcpusRequest: remote_domain_set_vcpus_flags_args {
dom: &Domain => dom.0.clone(),
nvcpus: u32 => nvcpus,
flags: DomainModificationImpact::VcpuModificationImpact => flags.bits()
});
resp!(DomainSetVcpusResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS, DomainSetVcpusRequest => DomainSetVcpusResponse);
use generated::remote_domain_get_vcpus_flags_args;
req!(DomainGetVcpusRequest: remote_domain_get_vcpus_flags_args {
dom: &Domain => dom.0.clone(),
flags: DomainModificationImpact::VcpuModificationImpact => flags.bits()
});
resp!(DomainGetVcpusResponse: generated::remote_domain_get_vcpus_flags_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS, DomainGetVcpusRequest => DomainGetVcpusResponse);
impl Into<u32> for DomainGetVcpusResponse {
fn into(self) -> u32 {
(self.0).num as u32
}
}
use generated::remote_domain_get_autostart_args;
req!(DomainGetAutoStartRequest: remote_domain_get_autostart_args {
dom: &Domain => dom.0.clone()
});
resp!(DomainGetAutoStartResponse: generated::remote_domain_get_autostart_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_GET_AUTOSTART, DomainGetAutoStartRequest => DomainGetAutoStartResponse);
impl Into<bool> for DomainGetAutoStartResponse {
fn into(self) -> bool {
(self.0).autostart == 1
}
}
use generated::remote_domain_set_autostart_args;
req!(DomainSetAutoStartRequest: remote_domain_set_autostart_args {
dom: &Domain => dom.0.clone(),
autostart: bool => if autostart { 1 } else { 0 }
});
resp!(DomainSetAutoStartResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SET_AUTOSTART, DomainSetAutoStartRequest => DomainSetAutoStartResponse);
use generated::remote_domain_send_key_args;
req!(DomainSendKeyRequest: remote_domain_send_key_args {
dom: &Domain => dom.0.clone(),
codeset: u32 => codeset,
holdtime: u32 => holdtime,
keycodes: Vec<u32> => keycodes,
flags: u32 => flags
});
resp!(DomainSendKeyResponse);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_SEND_KEY, DomainSendKeyRequest => DomainSendKeyResponse);
use generated::remote_domain_get_xml_desc_args;
req!(DomainGetXmlDescRequest: remote_domain_get_xml_desc_args {
dom: &Domain => dom.0.clone(),
flags: DomainXmlFlags::DomainXmlFlags => flags.bits()
});
resp!(DomainGetXmlDescResponse: generated::remote_domain_get_xml_desc_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_GET_XML_DESC, DomainGetXmlDescRequest => DomainGetXmlDescResponse);
impl Into<String> for DomainGetXmlDescResponse {
fn into(self) -> String {
(self.0).xml.0
}
}
#[allow(non_snake_case)]
pub mod DomainXmlFlags {
bitflags! {
pub flags DomainXmlFlags: u32 {
const SECURE = 1,
const INACTIVE = 2,
const UPDATE_CPU = 4,
const MIGRATABLE = 8,
}
}
}
#[allow(non_snake_case)]
pub mod DomainModificationImpact {
bitflags! {
pub flags DomainModificationImpact: u32 {
const AFFECT_CURRENT = 0,
const AFFECT_LIVE = 1,
const AFFECT_CONFIG = 2,
}
}
bitflags! {
pub flags MemoryModificationImpact: u32 {
const MEM_CURRENT = 0,
const MEM_LIVE = 1,
const MEM_CONFIG = 2,
const MEM_MAXIMUM = 4,
}
}
bitflags! {
pub flags VcpuModificationImpact: u32 {
const VCPU_CURRENT = 0,
const VCPU_LIVE = 1,
const VCPU_CONFIG = 2,
const VCPU_MAXIMUM = 4,
const VCPU_GUEST = 8,
const VCPU_HOTPLUGGABLE = 16,
}
}
}
#[allow(non_snake_case)]
pub mod DomainMigrateFlags {
bitflags! {
pub flags DomainMigrateFlags: u32 {
const VIR_MIGRATE_LIVE = 1,
const VIR_MIGRATE_PEER2PEER = 2,
const VIR_MIGRATE_TUNNELLED = 4,
const VIR_MIGRATE_PERSIST_DEST = 8,
const VIR_MIGRATE_UNDEFINE_SOURCE = 16,
const VIR_MIGRATE_PAUSED = 32,
const VIR_MIGRATE_NON_SHARED_DISK = 64,
const VIR_MIGRATE_NON_SHARED_INC = 128,
const VIR_MIGRATE_CHANGE_PROTECTION = 256,
const VIR_MIGRATE_UNSAFE = 512,
const VIR_MIGRATE_OFFLINE = 1024,
const VIR_MIGRATE_COMPRESSED = 2048,
const VIR_MIGRATE_ABORT_ON_ERROR = 4096,
const VIR_MIGRATE_AUTO_CONVERGE = 8192,
const VIR_MIGRATE_RDMA_PIN_ALL = 16384,
const VIR_MIGRATE_POSTCOPY = 32768,
const VIR_MIGRATE_TLS = 65536,
}
}
}
use generated::remote_domain_migrate_perform3_params_args;
req!(MigratePerformRequest: remote_domain_migrate_perform3_params_args {
dom: &Domain => dom.0.clone(),
dconnuri: Option<&str> => dconnuri.map(|uri| generated::remote_nonnull_string(uri.to_string())),
params: Vec<MigrationParam> => params.into_iter().map(|mp| {
let tp: TypedParam = mp.into();
tp.into()
}).collect(),
cookie_in: Vec<u8> => cookie_in,
flags: DomainMigrateFlags::DomainMigrateFlags => flags.bits()
});
resp!(MigratePerformResponse: generated::remote_domain_migrate_perform3_params_ret);
rpc!(remote_procedure::REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3_PARAMS, MigratePerformRequest => MigratePerformResponse);
#[derive(Debug)]
pub enum MigrationParam {
Uri(String),
DestinationName(String),
DestinationXml(String),
PersistentXml(String),
Bandwidth(u64),
GraphicsUri(String),
ListenAddress(String),
MigrateDisks(String),
DisksPort(i32),
Compression(String),
CompressionLevel(i32),
CompressionThreads(i32),
DecompressionThreads(i32),
CompressionXbzrleCache(u64),
AutoConvergeInitial(i32),
AutoConvergeIncrement(i32),
}
impl Into<TypedParam> for MigrationParam {
fn into(self) -> TypedParam {
match self {
MigrationParam::Uri(ref s) => TypedParam::string("migrate_uri", s),
MigrationParam::DestinationName(ref s) => TypedParam::string("destination_name", s),
MigrationParam::DestinationXml(ref s) => TypedParam::string("destination_xml", s),
MigrationParam::PersistentXml(ref s) => TypedParam::string("persistent_xml", s),
MigrationParam::Bandwidth(ref i) => TypedParam::ulonglong("bandwidth", *i),
MigrationParam::GraphicsUri(ref s) => TypedParam::string("graphics_uri", s),
MigrationParam::ListenAddress(ref s) => TypedParam::string("listen_address", s),
MigrationParam::MigrateDisks(ref s) => TypedParam::string("migrate_disks", s),
MigrationParam::DisksPort(ref i) => TypedParam::int("disks_port", *i),
MigrationParam::Compression(ref s) => TypedParam::string("compression", s),
MigrationParam::CompressionLevel(ref i) => TypedParam::int("compression.mt.level", *i),
MigrationParam::CompressionThreads(ref i) => TypedParam::int("compression.mt.threads", *i),
MigrationParam::DecompressionThreads(ref i) => TypedParam::int("compression.mt.dthreads", *i),
MigrationParam::CompressionXbzrleCache(ref i) => TypedParam::ulonglong("compression.xbzrle.cache", *i),
MigrationParam::AutoConvergeInitial(ref i) => TypedParam::int("auto_converge.initial", *i),
MigrationParam::AutoConvergeIncrement(ref i) => TypedParam::int("auto_converge.increment", *i),
}
}
}
#[derive(Debug)]
pub struct TypedParam(generated::remote_typed_param);
impl TypedParam {
fn string(name: &str, value: &str) -> Self {
TypedParam(generated::remote_typed_param {
field: generated::remote_nonnull_string(name.to_string()),
value: generated::remote_typed_param_value::Const7(generated::remote_nonnull_string(value.to_string())),
})
}
fn ulonglong(name: &str, value: u64) -> Self {
TypedParam(generated::remote_typed_param {
field: generated::remote_nonnull_string(name.to_string()),
value: generated::remote_typed_param_value::Const4(value),
})
}
fn int(name: &str, value: i32) -> Self {
TypedParam(generated::remote_typed_param {
field: generated::remote_nonnull_string(name.to_string()),
value: generated::remote_typed_param_value::Const1(value),
})
}
}
impl Into<generated::remote_typed_param> for TypedParam {
fn into(self) -> generated::remote_typed_param {
self.0
}
}
impl From<generated::remote_typed_param> for TypedParam {
fn from(p: generated::remote_typed_param) -> Self {
TypedParam(p)
}
}
#[derive(Debug)]
pub struct DomainInfo(DomainGetInfoResponse);
impl DomainInfo {
pub fn get_state(&self) -> DomainState {
DomainState::from((self.0).0.state as u8)
}
pub fn get_max_mem(&self) -> u64 {
(self.0).0.maxMem
}
pub fn get_num_cpus(&self) -> u32 {
(self.0).0.nrVirtCpu as u32
}
}
impl From<DomainGetInfoResponse> for DomainInfo {
fn from(resp: DomainGetInfoResponse) -> Self {
DomainInfo(resp)
}
}
#[derive(Debug)]
#[repr(u8)]
pub enum DomainState {
NoState = 0,
Running = 1,
Blocked = 2,
Paused = 3,
Shutdown = 4,
Shutoff = 5,
Crashed = 6,
PmSuspended = 7
}
impl From<u8> for DomainState {
fn from(v: u8) -> Self {
unsafe { ::std::mem::transmute(v) }
}
}
#[derive(Debug)]
#[repr(u32)]
pub enum ErrorCode {
OK = 0,
InternalError = 1,
NoMemory = 2,
NoSupport = 3,
UnknownHost = 4,
NoConnect = 5,
InvalidConn = 6,
InvalidDomain = 7,
InvalidArg = 8,
OperationFailed = 9,
GetFailed = 10,
PostFailed = 11,
HttpError = 12,
SexprSerial = 13,
NoXen = 14,
XenCall = 15,
OsType = 16,
NoKernel = 17,
NoRoot = 18,
NoSource = 19,
NoTarget = 20,
NoName = 21,
NoOs = 22,
NoDevice = 23,
NoXenstore = 24,
DriverFull = 25,
CallFailed = 26,
XmlError = 27,
DomExist = 28,
OperationDenied = 29,
OpenFailed = 30,
ReadFailed = 31,
ParseFailed = 32,
ConfSyntax = 33,
WriteFailed = 34,
XmlDetail = 35,
InvalidNetwork = 36,
NetworkExist = 37,
SystemError = 38,
Rpc = 39,
GnutlsError = 40,
VirWarNoNetwork = 41,
NoDomain = 42,
NoNetwork = 43,
InvalidMac = 44,
AuthFailed = 45,
InvalidStoragePool = 46,
InvalidStorageVol = 47,
VirWarNoStorage = 48,
NoStoragePool = 49,
NoStorageVol = 50,
VirWarNoNode = 51,
InvalidNodeDevice = 52,
NoNodeDevice = 53,
NoSecurityModel = 54,
OperationInvalid = 55,
VirWarNoInterface = 56,
NoInterface = 57,
InvalidInterface = 58,
MultipleInterfaces = 59,
VirWarNoNwfilter = 60,
InvalidNwfilter = 61,
NoNwfilter = 62,
BuildFirewall = 63,
VirWarNoSecret = 64,
InvalidSecret = 65,
NoSecret = 66,
ConfigUnsupported = 67,
OperationTimeout = 68,
MigratePersistFailed = 69,
HookScriptFailed = 70,
InvalidDomainSnapshot = 71,
NoDomainSnapshot = 72,
InvalidStream = 73,
ArgumentUnsupported = 74,
StorageProbeFailed = 75,
StoragePoolBuilt = 76,
SnapshotRevertRisky = 77,
OperationAborted = 78,
AuthCancelled = 79,
NoDomainMetadata = 80,
MigrateUnsafe = 81,
Overflow = 82,
BlockCopyActive = 83,
OperationUnsupported = 84,
Ssh = 85,
AgentUnresponsive = 86,
ResourceBusy = 87,
AccessDenied = 88,
DbusService = 89,
StorageVolExist = 90,
CpuIncompatible = 91,
XmlInvalidSchema = 92,
MigrateFinishOk = 93,
AuthUnavailable = 94,
NoServer = 95,
NoClient = 96,
AgentUnsynced = 97,
Libssh = 98,
}
impl From<i32> for ErrorCode {
fn from(v: i32) -> Self {
unsafe { ::std::mem::transmute(v) }
}
}
#[derive(Debug)]
#[repr(u32)]
pub enum ErrorDomain {
None = 0,
Xen = 1,
Xend = 2,
Xenstore = 3,
Sexpr = 4,
Xml = 5,
Dom = 6,
Rpc = 7,
Proxy = 8,
Conf = 9,
Qemu = 10,
Net = 11,
Test = 12,
Remote = 13,
Openvz = 14,
Xenxm = 15,
StatsLinux = 16,
Lxc = 17,
Storage = 18,
Network = 19,
Domain = 20,
Uml = 21,
Nodedev = 22,
XenInotify = 23,
Security = 24,
Vbox = 25,
Interface = 26,
One = 27,
Esx = 28,
Phyp = 29,
Secret = 30,
Cpu = 31,
Xenapi = 32,
Nwfilter = 33,
Hook = 34,
DomainSnapshot = 35,
Audit = 36,
Sysinfo = 37,
Streams = 38,
Vmware = 39,
Event = 40,
Libxl = 41,
Locking = 42,
Hyperv = 43,
Capabilities = 44,
Uri = 45,
Auth = 46,
Dbus = 47,
Parallels = 48,
Device = 49,
Ssh = 50,
Lockspace = 51,
Initctl = 52,
Identity = 53,
Cgroup = 54,
Access = 55,
Systemd = 56,
Bhyve = 57,
Crypto = 58,
Firewall = 59,
Polkit = 60,
Thread = 61,
Admin = 62,
Logging = 63,
Xenxl = 64,
Perf = 65,
Libssh = 66,
}
impl From<i32> for ErrorDomain {
fn from(v: i32) -> Self {
unsafe { ::std::mem::transmute(v) }
}
}