File Coverage

blib/lib/Sys/Async/Virt.pm
Criterion Covered Total %
statement 107 1483 7.2
branch 0 180 0.0
condition 0 66 0.0
subroutine 36 237 15.1
pod 121 122 99.1
total 264 2088 12.6


line stmt bran cond sub pod time code
1             ####################################################################
2             #
3             # This file was generated using XDR::Parse version v1.0.1
4             # and LibVirt version v12.1.0
5             #
6             # Don't edit this file, use the source template instead
7             #
8             # ANY CHANGES HERE WILL BE LOST !
9             #
10             ####################################################################
11              
12              
13 1     1   257492 use v5.26;
  1         5  
14 1     1   14 use warnings;
  1         4  
  1         75  
15 1     1   7 no warnings qw(void);
  1         3  
  1         60  
16 1     1   680 use experimental 'signatures';
  1         4998  
  1         7  
17 1     1   1028 use Feature::Compat::Try;
  1         525  
  1         4  
18 1     1   785 use Future::AsyncAwait;
  1         29680  
  1         9  
19 1     1   1514 use Object::Pad 0.821;
  1         7761  
  1         145  
20 1     1   1013 use Sublike::Extended 0.29 'method', 'sub'; # From XS-Parse-Sublike, used by Future::AsyncAwait
  1         953  
  1         7  
21              
22             class Sys::Async::Virt v0.6.1;
23              
24              
25 1     1   349 use Carp qw(croak);
  1         3  
  1         80  
26 1     1   6 use Future;
  1         3  
  1         39  
27 1     1   935 use Future::IO;
  1         44429  
  1         49  
28 1     1   1433 use Future::Selector;
  1         3262  
  1         63  
29 1     1   500 use Log::Any qw($log);
  1         9026  
  1         4  
30 1     1   2136 use Scalar::Util qw(reftype weaken);
  1         2  
  1         62  
31              
32 1     1   8507 use Protocol::Sys::Virt::Remote::XDR v12.1.0;
  1         569748  
  1         9671  
33             my $remote = 'Protocol::Sys::Virt::Remote::XDR';
34              
35 1     1   1915 use Protocol::Sys::Virt::KeepAlive v12.1.0;
  1         20010  
  1         101  
36 1     1   2015 use Protocol::Sys::Virt::Remote v12.1.0;
  1         560571  
  1         319  
37 1     1   746 use Protocol::Sys::Virt::Transport v12.1.0;
  1         3409  
  1         232  
38 1     1   542 use Protocol::Sys::Virt::URI v12.1.0; # imports parse_url
  1         23546  
  1         90  
39              
40 1     1   650 use Sys::Async::Virt::Connection::Factory v0.6.1;
  1         15  
  1         40  
41 1     1   1409 use Sys::Async::Virt::Domain v0.6.1;
  1         21  
  1         62  
42 1     1   656 use Sys::Async::Virt::DomainCheckpoint v0.6.1;
  1         16  
  1         39  
43 1     1   510 use Sys::Async::Virt::DomainSnapshot v0.6.1;
  1         15  
  1         88  
44 1     1   568 use Sys::Async::Virt::Network v0.6.1;
  1         23  
  1         180  
45 1     1   772 use Sys::Async::Virt::NetworkPort v0.6.1;
  1         22  
  1         134  
46 1     1   565 use Sys::Async::Virt::NwFilter v0.6.1;
  1         20  
  1         102  
47 1     1   787 use Sys::Async::Virt::NwFilterBinding v0.6.1;
  1         22  
  1         87  
48 1     1   646 use Sys::Async::Virt::Interface v0.6.1;
  1         18  
  1         68  
49 1     1   554 use Sys::Async::Virt::StoragePool v0.6.1;
  1         29  
  1         232  
50 1     1   729 use Sys::Async::Virt::StorageVol v0.6.1;
  1         25  
  1         63  
51 1     1   759 use Sys::Async::Virt::NodeDevice v0.6.1;
  1         25  
  1         232  
52 1     1   723 use Sys::Async::Virt::Secret v0.6.1;
  1         53  
  1         42  
53              
54 1     1   477 use Sys::Async::Virt::Callback v0.6.1;
  1         24  
  1         122  
55 1     1   758 use Sys::Async::Virt::Stream v0.6.1;
  1         21  
  1         1386  
56              
57             use constant {
58 1         1629 CLOSE_REASON_ERROR => 0,
59             CLOSE_REASON_EOF => 1,
60             CLOSE_REASON_KEEPALIVE => 2,
61             CLOSE_REASON_CLIENT => 3,
62             TYPED_PARAM_INT => 1,
63             TYPED_PARAM_UINT => 2,
64             TYPED_PARAM_LLONG => 3,
65             TYPED_PARAM_ULLONG => 4,
66             TYPED_PARAM_DOUBLE => 5,
67             TYPED_PARAM_BOOLEAN => 6,
68             TYPED_PARAM_STRING => 7,
69             TYPED_PARAM_STRING_OKAY => 1 << 2,
70             TYPED_PARAM_FIELD_LENGTH => 80,
71             GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES => (1 << 0),
72             DOMAIN_DEFINE_VALIDATE => (1 << 0),
73             LIST_DOMAINS_ACTIVE => 1 << 0,
74             LIST_DOMAINS_INACTIVE => 1 << 1,
75             LIST_DOMAINS_PERSISTENT => 1 << 2,
76             LIST_DOMAINS_TRANSIENT => 1 << 3,
77             LIST_DOMAINS_RUNNING => 1 << 4,
78             LIST_DOMAINS_PAUSED => 1 << 5,
79             LIST_DOMAINS_SHUTOFF => 1 << 6,
80             LIST_DOMAINS_OTHER => 1 << 7,
81             LIST_DOMAINS_MANAGEDSAVE => 1 << 8,
82             LIST_DOMAINS_NO_MANAGEDSAVE => 1 << 9,
83             LIST_DOMAINS_AUTOSTART => 1 << 10,
84             LIST_DOMAINS_NO_AUTOSTART => 1 << 11,
85             LIST_DOMAINS_HAS_SNAPSHOT => 1 << 12,
86             LIST_DOMAINS_NO_SNAPSHOT => 1 << 13,
87             LIST_DOMAINS_HAS_CHECKPOINT => 1 << 14,
88             LIST_DOMAINS_NO_CHECKPOINT => 1 << 15,
89             GET_ALL_DOMAINS_STATS_ACTIVE => 1 << 0,
90             GET_ALL_DOMAINS_STATS_INACTIVE => 1 << 1,
91             GET_ALL_DOMAINS_STATS_PERSISTENT => 1 << 2,
92             GET_ALL_DOMAINS_STATS_TRANSIENT => 1 << 3,
93             GET_ALL_DOMAINS_STATS_RUNNING => 1 << 4,
94             GET_ALL_DOMAINS_STATS_PAUSED => 1 << 5,
95             GET_ALL_DOMAINS_STATS_SHUTOFF => 1 << 6,
96             GET_ALL_DOMAINS_STATS_OTHER => 1 << 7,
97             GET_ALL_DOMAINS_STATS_NOWAIT => 1 << 29,
98             GET_ALL_DOMAINS_STATS_BACKING => 1 << 30,
99             GET_ALL_DOMAINS_STATS_ENFORCE_STATS => 1 << 31,
100             DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_CONNECTED => 1,
101             DOMAIN_EVENT_AGENT_LIFECYCLE_STATE_DISCONNECTED => 2,
102             DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_UNKNOWN => 0,
103             DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_DOMAIN_STARTED => 1,
104             DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL => 2,
105             DOMAIN_EVENT_ID_LIFECYCLE => 0,
106             DOMAIN_EVENT_ID_REBOOT => 1,
107             DOMAIN_EVENT_ID_RTC_CHANGE => 2,
108             DOMAIN_EVENT_ID_WATCHDOG => 3,
109             DOMAIN_EVENT_ID_IO_ERROR => 4,
110             DOMAIN_EVENT_ID_GRAPHICS => 5,
111             DOMAIN_EVENT_ID_IO_ERROR_REASON => 6,
112             DOMAIN_EVENT_ID_CONTROL_ERROR => 7,
113             DOMAIN_EVENT_ID_BLOCK_JOB => 8,
114             DOMAIN_EVENT_ID_DISK_CHANGE => 9,
115             DOMAIN_EVENT_ID_TRAY_CHANGE => 10,
116             DOMAIN_EVENT_ID_PMWAKEUP => 11,
117             DOMAIN_EVENT_ID_PMSUSPEND => 12,
118             DOMAIN_EVENT_ID_BALLOON_CHANGE => 13,
119             DOMAIN_EVENT_ID_PMSUSPEND_DISK => 14,
120             DOMAIN_EVENT_ID_DEVICE_REMOVED => 15,
121             DOMAIN_EVENT_ID_BLOCK_JOB_2 => 16,
122             DOMAIN_EVENT_ID_TUNABLE => 17,
123             DOMAIN_EVENT_ID_AGENT_LIFECYCLE => 18,
124             DOMAIN_EVENT_ID_DEVICE_ADDED => 19,
125             DOMAIN_EVENT_ID_MIGRATION_ITERATION => 20,
126             DOMAIN_EVENT_ID_JOB_COMPLETED => 21,
127             DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED => 22,
128             DOMAIN_EVENT_ID_METADATA_CHANGE => 23,
129             DOMAIN_EVENT_ID_BLOCK_THRESHOLD => 24,
130             DOMAIN_EVENT_ID_MEMORY_FAILURE => 25,
131             DOMAIN_EVENT_ID_MEMORY_DEVICE_SIZE_CHANGE => 26,
132             DOMAIN_EVENT_ID_NIC_MAC_CHANGE => 27,
133             SUSPEND_TARGET_MEM => 0,
134             SUSPEND_TARGET_DISK => 1,
135             SUSPEND_TARGET_HYBRID => 2,
136             SECURITY_LABEL_BUFLEN => (4096 + 1),
137             SECURITY_MODEL_BUFLEN => (256 + 1),
138             SECURITY_DOI_BUFLEN => (256 + 1),
139             CPU_STATS_FIELD_LENGTH => 80,
140             CPU_STATS_ALL_CPUS => -1,
141             CPU_STATS_KERNEL => "kernel",
142             CPU_STATS_USER => "user",
143             CPU_STATS_IDLE => "idle",
144             CPU_STATS_IOWAIT => "iowait",
145             CPU_STATS_INTR => "intr",
146             CPU_STATS_GUEST => "guest",
147             CPU_STATS_UTILIZATION => "utilization",
148             MEMORY_STATS_FIELD_LENGTH => 80,
149             MEMORY_STATS_ALL_CELLS => -1,
150             MEMORY_STATS_TOTAL => "total",
151             MEMORY_STATS_FREE => "free",
152             MEMORY_STATS_BUFFERS => "buffers",
153             MEMORY_STATS_CACHED => "cached",
154             MEMORY_SHARED_PAGES_TO_SCAN => "shm_pages_to_scan",
155             MEMORY_SHARED_SLEEP_MILLISECS => "shm_sleep_millisecs",
156             MEMORY_SHARED_PAGES_SHARED => "shm_pages_shared",
157             MEMORY_SHARED_PAGES_SHARING => "shm_pages_sharing",
158             MEMORY_SHARED_PAGES_UNSHARED => "shm_pages_unshared",
159             MEMORY_SHARED_PAGES_VOLATILE => "shm_pages_volatile",
160             MEMORY_SHARED_FULL_SCANS => "shm_full_scans",
161             MEMORY_SHARED_MERGE_ACROSS_NODES => "shm_merge_across_nodes",
162             SEV_PDH => "pdh",
163             SEV_CERT_CHAIN => "cert-chain",
164             SEV_CPU0_ID => "cpu0-id",
165             SEV_CBITPOS => "cbitpos",
166             SEV_REDUCED_PHYS_BITS => "reduced-phys-bits",
167             SEV_MAX_GUESTS => "max-guests",
168             SEV_MAX_ES_GUESTS => "max-es-guests",
169             RO => (1 << 0),
170             NO_ALIASES => (1 << 1),
171             CRED_USERNAME => 1,
172             CRED_AUTHNAME => 2,
173             CRED_LANGUAGE => 3,
174             CRED_CNONCE => 4,
175             CRED_PASSPHRASE => 5,
176             CRED_ECHOPROMPT => 6,
177             CRED_NOECHOPROMPT => 7,
178             CRED_REALM => 8,
179             CRED_EXTERNAL => 9,
180             UUID_BUFLEN => (16),
181             UUID_STRING_BUFLEN => (36+1),
182             IDENTITY_USER_NAME => "user-name",
183             IDENTITY_UNIX_USER_ID => "unix-user-id",
184             IDENTITY_GROUP_NAME => "group-name",
185             IDENTITY_UNIX_GROUP_ID => "unix-group-id",
186             IDENTITY_PROCESS_ID => "process-id",
187             IDENTITY_PROCESS_TIME => "process-time",
188             IDENTITY_SASL_USER_NAME => "sasl-user-name",
189             IDENTITY_X509_DISTINGUISHED_NAME => "x509-distinguished-name",
190             IDENTITY_SELINUX_CONTEXT => "selinux-context",
191             CPU_COMPARE_ERROR => -1,
192             CPU_COMPARE_INCOMPATIBLE => 0,
193             CPU_COMPARE_IDENTICAL => 1,
194             CPU_COMPARE_SUPERSET => 2,
195             COMPARE_CPU_FAIL_INCOMPATIBLE => (1 << 0),
196             COMPARE_CPU_VALIDATE_XML => (1 << 1),
197             BASELINE_CPU_EXPAND_FEATURES => (1 << 0),
198             BASELINE_CPU_MIGRATABLE => (1 << 1),
199             BASELINE_CPU_IGNORE_HOST => (1 << 2),
200             ALLOC_PAGES_ADD => 0,
201             ALLOC_PAGES_SET => (1 << 0),
202             LIST_INTERFACES_INACTIVE => 1 << 0,
203             LIST_INTERFACES_ACTIVE => 1 << 1,
204             INTERFACE_DEFINE_VALIDATE => 1 << 0,
205             LIST_NETWORKS_INACTIVE => 1 << 0,
206             LIST_NETWORKS_ACTIVE => 1 << 1,
207             LIST_NETWORKS_PERSISTENT => 1 << 2,
208             LIST_NETWORKS_TRANSIENT => 1 << 3,
209             LIST_NETWORKS_AUTOSTART => 1 << 4,
210             LIST_NETWORKS_NO_AUTOSTART => 1 << 5,
211             NETWORK_CREATE_VALIDATE => 1 << 0,
212             NETWORK_DEFINE_VALIDATE => 1 << 0,
213             NETWORK_EVENT_ID_LIFECYCLE => 0,
214             NETWORK_EVENT_ID_METADATA_CHANGE => 1,
215             LIST_NODE_DEVICES_CAP_SYSTEM => 1 << 0,
216             LIST_NODE_DEVICES_CAP_PCI_DEV => 1 << 1,
217             LIST_NODE_DEVICES_CAP_USB_DEV => 1 << 2,
218             LIST_NODE_DEVICES_CAP_USB_INTERFACE => 1 << 3,
219             LIST_NODE_DEVICES_CAP_NET => 1 << 4,
220             LIST_NODE_DEVICES_CAP_SCSI_HOST => 1 << 5,
221             LIST_NODE_DEVICES_CAP_SCSI_TARGET => 1 << 6,
222             LIST_NODE_DEVICES_CAP_SCSI => 1 << 7,
223             LIST_NODE_DEVICES_CAP_STORAGE => 1 << 8,
224             LIST_NODE_DEVICES_CAP_FC_HOST => 1 << 9,
225             LIST_NODE_DEVICES_CAP_VPORTS => 1 << 10,
226             LIST_NODE_DEVICES_CAP_SCSI_GENERIC => 1 << 11,
227             LIST_NODE_DEVICES_CAP_DRM => 1 << 12,
228             LIST_NODE_DEVICES_CAP_MDEV_TYPES => 1 << 13,
229             LIST_NODE_DEVICES_CAP_MDEV => 1 << 14,
230             LIST_NODE_DEVICES_CAP_CCW_DEV => 1 << 15,
231             LIST_NODE_DEVICES_CAP_CSS_DEV => 1 << 16,
232             LIST_NODE_DEVICES_CAP_VDPA => 1 << 17,
233             LIST_NODE_DEVICES_CAP_AP_CARD => 1 << 18,
234             LIST_NODE_DEVICES_CAP_AP_QUEUE => 1 << 19,
235             LIST_NODE_DEVICES_CAP_AP_MATRIX => 1 << 20,
236             LIST_NODE_DEVICES_CAP_VPD => 1 << 21,
237             LIST_NODE_DEVICES_CAP_CCWGROUP_DEV => 1 << 22,
238             LIST_NODE_DEVICES_CAP_CCWGROUP_MEMBER => 1 << 23,
239             LIST_NODE_DEVICES_PERSISTENT => 1 << 28,
240             LIST_NODE_DEVICES_TRANSIENT => 1 << 29,
241             LIST_NODE_DEVICES_INACTIVE => 1 << 30,
242             LIST_NODE_DEVICES_ACTIVE => 1 << 31,
243             NODE_DEVICE_CREATE_XML_VALIDATE => 1 << 0,
244             NODE_DEVICE_DEFINE_XML_VALIDATE => 1 << 0,
245             NODE_DEVICE_EVENT_ID_LIFECYCLE => 0,
246             NODE_DEVICE_EVENT_ID_UPDATE => 1,
247             NWFILTER_DEFINE_VALIDATE => 1 << 0,
248             NWFILTER_BINDING_CREATE_VALIDATE => 1 << 0,
249             SECRET_USAGE_TYPE_NONE => 0,
250             SECRET_USAGE_TYPE_VOLUME => 1,
251             SECRET_USAGE_TYPE_CEPH => 2,
252             SECRET_USAGE_TYPE_ISCSI => 3,
253             SECRET_USAGE_TYPE_TLS => 4,
254             SECRET_USAGE_TYPE_VTPM => 5,
255             LIST_SECRETS_EPHEMERAL => 1 << 0,
256             LIST_SECRETS_NO_EPHEMERAL => 1 << 1,
257             LIST_SECRETS_PRIVATE => 1 << 2,
258             LIST_SECRETS_NO_PRIVATE => 1 << 3,
259             SECRET_DEFINE_VALIDATE => 1 << 0,
260             SECRET_EVENT_ID_LIFECYCLE => 0,
261             SECRET_EVENT_ID_VALUE_CHANGED => 1,
262             STORAGE_POOL_CREATE_NORMAL => 0,
263             STORAGE_POOL_CREATE_WITH_BUILD => 1 << 0,
264             STORAGE_POOL_CREATE_WITH_BUILD_OVERWRITE => 1 << 1,
265             STORAGE_POOL_CREATE_WITH_BUILD_NO_OVERWRITE => 1 << 2,
266             LIST_STORAGE_POOLS_INACTIVE => 1 << 0,
267             LIST_STORAGE_POOLS_ACTIVE => 1 << 1,
268             LIST_STORAGE_POOLS_PERSISTENT => 1 << 2,
269             LIST_STORAGE_POOLS_TRANSIENT => 1 << 3,
270             LIST_STORAGE_POOLS_AUTOSTART => 1 << 4,
271             LIST_STORAGE_POOLS_NO_AUTOSTART => 1 << 5,
272             LIST_STORAGE_POOLS_DIR => 1 << 6,
273             LIST_STORAGE_POOLS_FS => 1 << 7,
274             LIST_STORAGE_POOLS_NETFS => 1 << 8,
275             LIST_STORAGE_POOLS_LOGICAL => 1 << 9,
276             LIST_STORAGE_POOLS_DISK => 1 << 10,
277             LIST_STORAGE_POOLS_ISCSI => 1 << 11,
278             LIST_STORAGE_POOLS_SCSI => 1 << 12,
279             LIST_STORAGE_POOLS_MPATH => 1 << 13,
280             LIST_STORAGE_POOLS_RBD => 1 << 14,
281             LIST_STORAGE_POOLS_SHEEPDOG => 1 << 15,
282             LIST_STORAGE_POOLS_GLUSTER => 1 << 16,
283             LIST_STORAGE_POOLS_ZFS => 1 << 17,
284             LIST_STORAGE_POOLS_VSTORAGE => 1 << 18,
285             LIST_STORAGE_POOLS_ISCSI_DIRECT => 1 << 19,
286             STORAGE_POOL_DEFINE_VALIDATE => 1 << 0,
287             STORAGE_VOL_CREATE_PREALLOC_METADATA => 1 << 0,
288             STORAGE_VOL_CREATE_REFLINK => 1 << 1,
289             STORAGE_VOL_CREATE_VALIDATE => 1 << 2,
290             STORAGE_POOL_EVENT_ID_LIFECYCLE => 0,
291             STORAGE_POOL_EVENT_ID_REFRESH => 1,
292 1     1   11 };
  1         2  
293              
294              
295             use constant {
296 1         77664 _STATE_NONE => 0,
297             _STATE_INITIALIZING => 1,
298             _STATE_INITIALIZED => 2, # Process transports: in/out pipes have been connected
299             _STATE_AUTHENTICATING => 3, # Process transports: failure to start is discovered in this state
300             _STATE_AUTHENTICATED => 4,
301             _STATE_OPENING => 5,
302             _STATE_OPENED => 6,
303             _STATE_CLEANING_UP => 7,
304             _STATE_CLOSING => 8,
305             _STATE_CLOSED => 9,
306 1     1   7 };
  1         3  
307              
308             field $_domains = {};
309             field $_domain_checkpoints = {};
310             field $_domain_snapshots = {};
311             field $_networks = {};
312             field $_network_ports = {};
313             field $_nwfilters = {};
314             field $_nwfilter_bindings = {};
315             field $_interfaces = {};
316             field $_storage_pools = {};
317             field $_storage_vols = {};
318             field $_node_devices = {};
319             field $_secrets = {};
320             field $_callbacks = {};
321             field $_streams = {};
322              
323             # cached host data:
324             field $_maplen = 0; # length of the cpu map in bytes
325             field $_cpus = 0; # number of cpus in the hypervisor
326             field $_typed_param_string_okay = undef;
327              
328              
329             field $_url :param = $ENV{LIBVIRT_DEFAULT_URI};
330             field $_readonly :reader :param = undef;
331 0     0 0   field $_sasl :param = undef;
  0            
332             field $_connection :param = undef;
333             field $_transport :param = undef;
334             field $_remote :reader :param = undef;
335 0     0 1   field $_factory :param = undef;
  0            
336             field $_keepalive :param = undef;
337             field $_ping_interval :param = 60;
338              
339             field $_on_close :param = sub {};
340             field $_on_stream :param = undef;
341             field $_on_message :param = sub {};
342              
343             field $_sasl_session = undef;
344             field $_selector = Future::Selector->new;
345             field $_completed_f = undef;
346             field $_eof = 0;
347             field $_state = _STATE_NONE; # state machine
348             field $_replies = {};
349              
350              
351 0     0     method _no_translation(@args) {
  0            
  0            
  0            
352 0           return @args;
353             }
354              
355 0     0     method _translate_remote_nonnull_domain($dom, @) {
  0            
  0            
  0            
356 0           $self->_domain_instance( $dom );
357             }
358              
359 0     0     method _translate_remote_nonnull_domain_checkpoint($checkpoint, @) {
  0            
  0            
  0            
360 0           $self->_domain_checkpoint_instance( $checkpoint );
361             }
362              
363 0     0     method _translate_remote_nonnull_domain_snapshot($snapshot, @) {
  0            
  0            
  0            
364 0           $self->_domain_snapshot_instance( $snapshot );
365             }
366              
367 0     0     method _translate_remote_nonnull_network($network, @) {
  0            
  0            
  0            
368 0           $self->_network_instance( $network );
369             }
370              
371 0     0     method _translate_remote_nonnull_network_port($network_port, @) {
  0            
  0            
  0            
372 0           $self->_network_port_instance( $network_port );
373             }
374              
375 0     0     method _translate_remote_nonnull_nwfilter($nwfilter, @) {
  0            
  0            
  0            
376 0           $self->_network_nwfilter_instance( $nwfilter );
377             }
378              
379 0     0     method _translate_remote_nonnull_nwfilter_binding($binding, @) {
  0            
  0            
  0            
380 0           $self->_network_nwfilter_binding_instance( $binding );
381             }
382              
383 0     0     method _translate_remote_nonnull_interface($interface, @) {
  0            
  0            
  0            
384 0           $self->_network_interface_instance( $interface );
385             }
386              
387 0     0     method _translate_remote_nonnull_storage_pool($pool, @) {
  0            
  0            
  0            
388 0           $self->_storage_pool_instance( $pool );
389             }
390              
391 0     0     method _translate_remote_nonnull_storage_vol($vol, @) {
  0            
  0            
  0            
392 0           $self->_storage_vol_instance( $vol );
393             }
394              
395 0     0     method _translate_remote_nonnull_node_device($device, @) {
  0            
  0            
  0            
396 0           $self->_node_device_instance( $device );
397             }
398              
399 0     0     method _translate_remote_nonnull_secret($secret, @) {
  0            
  0            
  0            
400 0           $self->_secret_instance( $secret );
401             }
402              
403             my @reply_translators = (
404             undef,
405             \&_no_translation,
406             \&_no_translation,
407             sub { 3; my $client = shift; _translated_reply($client, undef, { }, @_) },
408             sub { 4; my $client = shift; _translated_reply($client, undef, { }, @_) },
409             sub { 5; my $client = shift; _translated_reply($client, undef, { }, @_) },
410             \&_no_translation,
411             sub { 7; my $client = shift; _translated_reply($client, undef, { }, @_) },
412             \&_no_translation,
413             \&_no_translation,
414             sub { 10; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
415             sub { 11; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
416             \&_no_translation,
417             \&_no_translation,
418             sub { 14; my $client = shift; _translated_reply($client, undef, { }, @_) },
419             sub { 15; my $client = shift; _translated_reply($client, undef, { }, @_) },
420             \&_no_translation,
421             sub { 17; my $client = shift; _translated_reply($client, undef, { }, @_) },
422             sub { 18; my $client = shift; _translated_reply($client, undef, { }, @_) },
423             sub { 19; my $client = shift; _translated_reply($client, undef, { }, @_) },
424             \&_no_translation,
425             sub { 21; my $client = shift; _translated_reply($client, undef, { }, @_) },
426             sub { 22; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
427             sub { 23; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
428             sub { 24; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
429             sub { 25; my $client = shift; _translated_reply($client, undef, { }, @_) },
430             \&_no_translation,
431             \&_no_translation,
432             \&_no_translation,
433             \&_no_translation,
434             \&_no_translation,
435             \&_no_translation,
436             \&_no_translation,
437             \&_no_translation,
438             \&_no_translation,
439             \&_no_translation,
440             sub { 36; my $client = shift; _translated_reply($client, undef, { }, @_) },
441             sub { 37; my $client = shift; _translated_reply($client, undef, { }, @_) },
442             sub { 38; my $client = shift; _translated_reply($client, undef, { }, @_) },
443             \&_no_translation,
444             sub { 40; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
445             sub { 41; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
446             \&_no_translation,
447             sub { 43; my $client = shift; _translated_reply($client, undef, { }, @_) },
448             sub { 44; my $client = shift; _translated_reply($client, undef, { }, @_) },
449             sub { 45; my $client = shift; _translated_reply($client, undef, { }, @_) },
450             sub { 46; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
451             sub { 47; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
452             \&_no_translation,
453             \&_no_translation,
454             sub { 50; my $client = shift; _translated_reply($client, undef, { }, @_) },
455             sub { 51; my $client = shift; _translated_reply($client, undef, { }, @_) },
456             sub { 52; my $client = shift; _translated_reply($client, undef, { }, @_) },
457             \&_no_translation,
458             \&_no_translation,
459             \&_no_translation,
460             sub { 56; my $client = shift; _translated_reply($client, undef, { }, @_) },
461             sub { 57; my $client = shift; _translated_reply($client, undef, { }, @_) },
462             \&_no_translation,
463             sub { 59; my $client = shift; _translated_reply($client, undef, { }, @_) },
464             sub { 60; my $client = shift; _translated_reply($client, undef, { }, @_) },
465             \&_no_translation,
466             \&_no_translation,
467             sub { 63; my $client = shift; _translated_reply($client, undef, { ddom => \&_translate_remote_nonnull_domain }, @_) },
468             \&_no_translation,
469             \&_no_translation,
470             \&_no_translation,
471             \&_no_translation,
472             \&_no_translation,
473             \&_no_translation,
474             \&_no_translation,
475             sub { 71; my $client = shift; _translated_reply($client, undef, { }, @_) },
476             sub { 72; my $client = shift; _translated_reply($client, undef, { }, @_) },
477             sub { 73; my $client = shift; _translated_reply($client, undef, { }, @_) },
478             sub { 74; my $client = shift; _translated_reply($client, undef, { }, @_) },
479             sub { 75; my $client = shift; _translated_reply($client, undef, { }, @_) },
480             sub { 76; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
481             sub { 77; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
482             \&_no_translation,
483             \&_no_translation,
484             \&_no_translation,
485             \&_no_translation,
486             \&_no_translation,
487             \&_no_translation,
488             sub { 84; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
489             sub { 85; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
490             sub { 86; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
491             \&_no_translation,
492             sub { 88; my $client = shift; _translated_reply($client, undef, { }, @_) },
493             sub { 89; my $client = shift; _translated_reply($client, undef, { }, @_) },
494             \&_no_translation,
495             sub { 91; my $client = shift; _translated_reply($client, undef, { }, @_) },
496             sub { 92; my $client = shift; _translated_reply($client, undef, { }, @_) },
497             sub { 93; my $client = shift; _translated_reply($client, undef, { vol => \&_translate_remote_nonnull_storage_vol }, @_) },
498             \&_no_translation,
499             sub { 95; my $client = shift; _translated_reply($client, undef, { vol => \&_translate_remote_nonnull_storage_vol }, @_) },
500             sub { 96; my $client = shift; _translated_reply($client, undef, { vol => \&_translate_remote_nonnull_storage_vol }, @_) },
501             sub { 97; my $client = shift; _translated_reply($client, undef, { vol => \&_translate_remote_nonnull_storage_vol }, @_) },
502             \&_no_translation,
503             sub { 99; my $client = shift; _translated_reply($client, undef, { }, @_) },
504             sub { 100; my $client = shift; _translated_reply($client, undef, { }, @_) },
505             \&_no_translation,
506             sub { 102; my $client = shift; _translated_reply($client, undef, { }, @_) },
507             sub { 103; my $client = shift; _translated_reply($client, undef, { }, @_) },
508             sub { 104; my $client = shift; _translated_reply($client, undef, { }, @_) },
509             \&_no_translation,
510             \&_no_translation,
511             sub { 107; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
512             \&_no_translation,
513             sub { 109; my $client = shift; _translated_reply($client, undef, { ddom => \&_translate_remote_nonnull_domain }, @_) },
514             sub { 110; my $client = shift; _translated_reply($client, undef, { }, @_) },
515             sub { 111; my $client = shift; _translated_reply($client, undef, { }, @_) },
516             sub { 112; my $client = shift; _translated_reply($client, undef, { }, @_) },
517             sub { 113; my $client = shift; _translated_reply($client, undef, { dev => \&_translate_remote_nonnull_node_device }, @_) },
518             sub { 114; my $client = shift; _translated_reply($client, undef, { }, @_) },
519             sub { 115; my $client = shift; _translated_reply($client, undef, { }, @_) },
520             sub { 116; my $client = shift; _translated_reply($client, undef, { }, @_) },
521             sub { 117; my $client = shift; _translated_reply($client, undef, { }, @_) },
522             \&_no_translation,
523             \&_no_translation,
524             \&_no_translation,
525             \&_no_translation,
526             \&_no_translation,
527             sub { 123; my $client = shift; _translated_reply($client, undef, { dev => \&_translate_remote_nonnull_node_device }, @_) },
528             \&_no_translation,
529             sub { 125; my $client = shift; _translated_reply($client, undef, { vol => \&_translate_remote_nonnull_storage_vol }, @_) },
530             sub { 126; my $client = shift; _translated_reply($client, undef, { }, @_) },
531             sub { 127; my $client = shift; _translated_reply($client, undef, { }, @_) },
532             sub { 128; my $client = shift; _translated_reply($client, undef, { iface => \&_translate_remote_nonnull_interface }, @_) },
533             sub { 129; my $client = shift; _translated_reply($client, undef, { iface => \&_translate_remote_nonnull_interface }, @_) },
534             sub { 130; my $client = shift; _translated_reply($client, undef, { }, @_) },
535             sub { 131; my $client = shift; _translated_reply($client, undef, { iface => \&_translate_remote_nonnull_interface }, @_) },
536             \&_no_translation,
537             \&_no_translation,
538             \&_no_translation,
539             sub { 135; my $client = shift; _translated_reply($client, undef, { }, @_) },
540             sub { 136; my $client = shift; _translated_reply($client, undef, { }, @_) },
541             sub { 137; my $client = shift; _translated_reply($client, undef, { }, @_) },
542             sub { 138; my $client = shift; _translated_reply($client, undef, { }, @_) },
543             sub { 139; my $client = shift; _translated_reply($client, undef, { }, @_) },
544             sub { 140; my $client = shift; _translated_reply($client, undef, { }, @_) },
545             sub { 141; my $client = shift; _translated_reply($client, undef, { secret => \&_translate_remote_nonnull_secret }, @_) },
546             sub { 142; my $client = shift; _translated_reply($client, undef, { secret => \&_translate_remote_nonnull_secret }, @_) },
547             sub { 143; my $client = shift; _translated_reply($client, undef, { }, @_) },
548             \&_no_translation,
549             sub { 145; my $client = shift; _translated_reply($client, undef, { }, @_) },
550             \&_no_translation,
551             sub { 147; my $client = shift; _translated_reply($client, undef, { secret => \&_translate_remote_nonnull_secret }, @_) },
552             \&_no_translation,
553             \&_no_translation,
554             sub { 150; my $client = shift; _translated_reply($client, undef, { }, @_) },
555             sub { 151; my $client = shift; _translated_reply($client, undef, { }, @_) },
556             sub { 152; my $client = shift; _translated_reply($client, undef, { }, @_) },
557             sub { 153; my $client = shift; _translated_reply($client, undef, { }, @_) },
558             sub { 154; my $client = shift; _translated_reply($client, undef, { }, @_) },
559             sub { 155; my $client = shift; _translated_reply($client, undef, { }, @_) },
560             sub { 156; my $client = shift; _translated_reply($client, undef, { }, @_) },
561             sub { 157; my $client = shift; _translated_reply($client, undef, { }, @_) },
562             sub { 158; my $client = shift; _translated_reply($client, undef, { }, @_) },
563             sub { 159; my $client = shift; _translated_reply($client, undef, { }, @_) },
564             \&_no_translation,
565             \&_no_translation,
566             sub { 162; my $client = shift; _translated_reply($client, undef, { }, @_) },
567             \&_no_translation,
568             \&_no_translation,
569             \&_no_translation,
570             \&_no_translation,
571             \&_no_translation,
572             \&_no_translation,
573             sub { 169; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
574             sub { 170; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
575             sub { 171; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
576             sub { 172; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
577             sub { 173; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
578             \&_no_translation,
579             sub { 175; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter }, @_) },
580             sub { 176; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter }, @_) },
581             sub { 177; my $client = shift; _translated_reply($client, undef, { }, @_) },
582             sub { 178; my $client = shift; _translated_reply($client, undef, { }, @_) },
583             sub { 179; my $client = shift; _translated_reply($client, undef, { }, @_) },
584             sub { 180; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter }, @_) },
585             \&_no_translation,
586             \&_no_translation,
587             sub { 183; my $client = shift; _translated_reply($client, undef, { }, @_) },
588             \&_no_translation,
589             sub { 185; my $client = shift; _translated_reply($client, undef, { snap => \&_translate_remote_nonnull_domain_snapshot }, @_) },
590             sub { 186; my $client = shift; _translated_reply($client, undef, { }, @_) },
591             sub { 187; my $client = shift; _translated_reply($client, undef, { }, @_) },
592             sub { 188; my $client = shift; _translated_reply($client, undef, { }, @_) },
593             sub { 189; my $client = shift; _translated_reply($client, undef, { snap => \&_translate_remote_nonnull_domain_snapshot }, @_) },
594             sub { 190; my $client = shift; _translated_reply($client, undef, { }, @_) },
595             sub { 191; my $client = shift; _translated_reply($client, undef, { snap => \&_translate_remote_nonnull_domain_snapshot }, @_) },
596             \&_no_translation,
597             \&_no_translation,
598             \&_no_translation,
599             sub { 195; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
600             sub { 196; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
601             \&_no_translation,
602             sub { 198; my $client = shift; _translated_reply($client, undef, { }, @_) },
603             \&_no_translation,
604             sub { 200; my $client = shift; _translated_reply($client, undef, { }, @_) },
605             \&_no_translation,
606             sub { 202; my $client = shift; _translated_reply($client, undef, { }, @_) },
607             sub { 203; my $client = shift; _translated_reply($client, undef, { }, @_) },
608             \&_no_translation,
609             \&_no_translation,
610             sub { 206; my $client = shift; _translated_reply($client, undef, { }, @_) },
611             \&_no_translation,
612             \&_no_translation,
613             \&_no_translation,
614             \&_no_translation,
615             sub { 211; my $client = shift; _translated_reply($client, undef, { }, @_) },
616             \&_no_translation,
617             \&_no_translation,
618             \&_no_translation,
619             \&_no_translation,
620             \&_no_translation,
621             \&_no_translation,
622             \&_no_translation,
623             \&_no_translation,
624             \&_no_translation,
625             \&_no_translation,
626             \&_no_translation,
627             sub { 223; my $client = shift; _translated_reply($client, undef, { }, @_) },
628             undef,
629             \&_no_translation,
630             \&_no_translation,
631             sub { 227; my $client = shift; _translated_reply($client, undef, { }, @_) },
632             sub { 228; my $client = shift; _translated_reply($client, undef, { }, @_) },
633             \&_no_translation,
634             \&_no_translation,
635             \&_no_translation,
636             \&_no_translation,
637             \&_no_translation,
638             \&_no_translation,
639             sub { 235; my $client = shift; _translated_reply($client, undef, { }, @_) },
640             \&_no_translation,
641             \&_no_translation,
642             \&_no_translation,
643             \&_no_translation,
644             \&_no_translation,
645             undef,
646             sub { 242; my $client = shift; _translated_reply($client, undef, { }, @_) },
647             sub { 243; my $client = shift; _translated_reply($client, undef, { }, @_) },
648             sub { 244; my $client = shift; _translated_reply($client, undef, { snap => \&_translate_remote_nonnull_domain_snapshot }, @_) },
649             \&_no_translation,
650             sub { 246; my $client = shift; _translated_reply($client, undef, { }, @_) },
651             sub { 247; my $client = shift; _translated_reply($client, undef, { }, @_) },
652             undef,
653             \&_no_translation,
654             \&_no_translation,
655             \&_no_translation,
656             \&_no_translation,
657             sub { 253; my $client = shift; _translated_reply($client, undef, { }, @_) },
658             \&_no_translation,
659             sub { 255; my $client = shift; _translated_reply($client, undef, { }, @_) },
660             \&_no_translation,
661             sub { 257; my $client = shift; _translated_reply($client, undef, { }, @_) },
662             \&_no_translation,
663             \&_no_translation,
664             \&_no_translation,
665             \&_no_translation,
666             sub { 262; my $client = shift; _translated_reply($client, undef, { }, @_) },
667             sub { 263; my $client = shift; _translated_reply($client, undef, { }, @_) },
668             \&_no_translation,
669             sub { 265; my $client = shift; _translated_reply($client, undef, { }, @_) },
670             \&_no_translation,
671             \&_no_translation,
672             sub { 268; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
673             sub { 269; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
674             sub { 270; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
675             sub { 271; my $client = shift; _translated_reply($client, undef, { }, @_) },
676             sub { 272; my $client = shift; _translated_reply($client, undef, { }, @_) },
677             sub { 273; my $client = shift; _translated_reply($client, undef, { domains => \&_translate_remote_nonnull_domain }, @_) },
678             sub { 274; my $client = shift; _translated_reply($client, undef, { snapshots => \&_translate_remote_nonnull_domain_snapshot }, @_) },
679             sub { 275; my $client = shift; _translated_reply($client, undef, { snapshots => \&_translate_remote_nonnull_domain_snapshot }, @_) },
680             sub { 276; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
681             sub { 277; my $client = shift; _translated_reply($client, undef, { }, @_) },
682             \&_no_translation,
683             \&_no_translation,
684             \&_no_translation,
685             sub { 281; my $client = shift; _translated_reply($client, undef, { pools => \&_translate_remote_nonnull_storage_pool }, @_) },
686             sub { 282; my $client = shift; _translated_reply($client, undef, { vols => \&_translate_remote_nonnull_storage_vol }, @_) },
687             sub { 283; my $client = shift; _translated_reply($client, undef, { nets => \&_translate_remote_nonnull_network }, @_) },
688             sub { 284; my $client = shift; _translated_reply($client, undef, { ifaces => \&_translate_remote_nonnull_interface }, @_) },
689             sub { 285; my $client = shift; _translated_reply($client, undef, { devices => \&_translate_remote_nonnull_node_device }, @_) },
690             sub { 286; my $client = shift; _translated_reply($client, undef, { filters => \&_translate_remote_nonnull_nwfilter }, @_) },
691             sub { 287; my $client = shift; _translated_reply($client, undef, { secrets => \&_translate_remote_nonnull_secret }, @_) },
692             \&_no_translation,
693             sub { 289; my $client = shift; _translated_reply($client, undef, { }, @_) },
694             \&_no_translation,
695             \&_no_translation,
696             sub { 292; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
697             \&_no_translation,
698             \&_no_translation,
699             \&_no_translation,
700             \&_no_translation,
701             sub { 297; my $client = shift; _translated_reply($client, undef, { dev => \&_translate_remote_nonnull_node_device }, @_) },
702             \&_no_translation,
703             sub { 299; my $client = shift; _translated_reply($client, undef, { }, @_) },
704             \&_no_translation,
705             \&_no_translation,
706             \&_no_translation,
707             \&_no_translation,
708             \&_no_translation,
709             \&_no_translation,
710             \&_no_translation,
711             \&_no_translation,
712             \&_no_translation,
713             \&_no_translation,
714             \&_no_translation,
715             sub { 311; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
716             sub { 312; my $client = shift; _translated_reply($client, undef, { }, @_) },
717             \&_no_translation,
718             \&_no_translation,
719             sub { 315; my $client = shift; _translated_msg($client, { net => \&_translate_remote_nonnull_network }, @_) },
720             \&_no_translation,
721             \&_no_translation,
722             sub { 318; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
723             sub { 319; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
724             sub { 320; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
725             sub { 321; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
726             sub { 322; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
727             sub { 323; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
728             sub { 324; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
729             sub { 325; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
730             sub { 326; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
731             sub { 327; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
732             sub { 328; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
733             sub { 329; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
734             sub { 330; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
735             sub { 331; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
736             sub { 332; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
737             sub { 333; my $client = shift; _translated_msg($client, { msg => { dom => \&_translate_remote_nonnull_domain } }, @_) },
738             \&_no_translation,
739             sub { 335; my $client = shift; _translated_reply($client, undef, { }, @_) },
740             sub { 336; my $client = shift; _translated_reply($client, undef, { }, @_) },
741             \&_no_translation,
742             \&_no_translation,
743             undef,
744             \&_no_translation,
745             sub { 341; my $client = shift; _translated_reply($client, undef, { }, @_) },
746             sub { 342; my $client = shift; _translated_reply($client, undef, { }, @_) },
747             \&_no_translation,
748             sub { 344; my $client = shift; _translated_reply($client, undef, { }, @_) },
749             \&_no_translation,
750             sub { 346; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
751             \&_no_translation,
752             sub { 348; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
753             sub { 349; my $client = shift; _translated_reply($client, undef, { }, @_) },
754             sub { 350; my $client = shift; _translated_reply($client, undef, { dom => \&_translate_remote_nonnull_domain }, @_) },
755             \&_no_translation,
756             \&_no_translation,
757             sub { 353; my $client = shift; _translated_reply($client, undef, { }, @_) },
758             sub { 354; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
759             \&_no_translation,
760             \&_no_translation,
761             \&_no_translation,
762             sub { 358; my $client = shift; _translated_reply($client, undef, { }, @_) },
763             sub { 359; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
764             \&_no_translation,
765             \&_no_translation,
766             undef,
767             sub { 363; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
768             \&_no_translation,
769             sub { 365; my $client = shift; _translated_reply($client, undef, { }, @_) },
770             \&_no_translation,
771             sub { 367; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
772             \&_no_translation,
773             \&_no_translation,
774             sub { 370; my $client = shift; _translated_msg($client, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
775             sub { 371; my $client = shift; _translated_reply($client, undef, { }, @_) },
776             \&_no_translation,
777             sub { 373; my $client = shift; _translated_msg($client, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
778             \&_no_translation,
779             \&_no_translation,
780             sub { 376; my $client = shift; _translated_msg($client, { dev => \&_translate_remote_nonnull_node_device }, @_) },
781             sub { 377; my $client = shift; _translated_msg($client, { dev => \&_translate_remote_nonnull_node_device }, @_) },
782             \&_no_translation,
783             sub { 379; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
784             \&_no_translation,
785             \&_no_translation,
786             sub { 382; my $client = shift; _translated_msg($client, { secret => \&_translate_remote_nonnull_secret }, @_) },
787             sub { 383; my $client = shift; _translated_msg($client, { secret => \&_translate_remote_nonnull_secret }, @_) },
788             \&_no_translation,
789             sub { 385; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
790             \&_no_translation,
791             sub { 387; my $client = shift; _translated_reply($client, undef, { }, @_) },
792             sub { 388; my $client = shift; _translated_reply($client, undef, { }, @_) },
793             \&_no_translation,
794             \&_no_translation,
795             sub { 391; my $client = shift; _translated_reply($client, undef, { pool => \&_translate_remote_nonnull_storage_pool }, @_) },
796             \&_no_translation,
797             sub { 393; my $client = shift; _translated_reply($client, undef, { }, @_) },
798             sub { 394; my $client = shift; _translated_reply($client, undef, { }, @_) },
799             sub { 395; my $client = shift; _translated_reply($client, undef, { }, @_) },
800             sub { 396; my $client = shift; _translated_reply($client, undef, { }, @_) },
801             sub { 397; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter_binding }, @_) },
802             sub { 398; my $client = shift; _translated_reply($client, undef, { }, @_) },
803             sub { 399; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter_binding }, @_) },
804             \&_no_translation,
805             sub { 401; my $client = shift; _translated_reply($client, undef, { bindings => \&_translate_remote_nonnull_nwfilter_binding }, @_) },
806             \&_no_translation,
807             sub { 403; my $client = shift; _translated_reply($client, undef, { }, @_) },
808             sub { 404; my $client = shift; _translated_reply($client, undef, { ports => \&_translate_remote_nonnull_network_port }, @_) },
809             sub { 405; my $client = shift; _translated_reply($client, undef, { port => \&_translate_remote_nonnull_network_port }, @_) },
810             sub { 406; my $client = shift; _translated_reply($client, undef, { port => \&_translate_remote_nonnull_network_port }, @_) },
811             sub { 407; my $client = shift; _translated_reply($client, undef, { }, @_) },
812             \&_no_translation,
813             sub { 409; my $client = shift; _translated_reply($client, undef, { }, @_) },
814             \&_no_translation,
815             sub { 411; my $client = shift; _translated_reply($client, undef, { checkpoint => \&_translate_remote_nonnull_domain_checkpoint }, @_) },
816             sub { 412; my $client = shift; _translated_reply($client, undef, { }, @_) },
817             sub { 413; my $client = shift; _translated_reply($client, undef, { checkpoints => \&_translate_remote_nonnull_domain_checkpoint }, @_) },
818             sub { 414; my $client = shift; _translated_reply($client, undef, { checkpoints => \&_translate_remote_nonnull_domain_checkpoint }, @_) },
819             sub { 415; my $client = shift; _translated_reply($client, undef, { checkpoint => \&_translate_remote_nonnull_domain_checkpoint }, @_) },
820             sub { 416; my $client = shift; _translated_reply($client, undef, { parent => \&_translate_remote_nonnull_domain_checkpoint }, @_) },
821             \&_no_translation,
822             sub { 418; my $client = shift; _translated_reply($client, undef, { }, @_) },
823             \&_no_translation,
824             sub { 420; my $client = shift; _translated_reply($client, undef, { }, @_) },
825             \&_no_translation,
826             sub { 422; my $client = shift; _translated_reply($client, undef, { }, @_) },
827             sub { 423; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
828             sub { 424; my $client = shift; _translated_reply($client, undef, { }, @_) },
829             \&_no_translation,
830             sub { 426; my $client = shift; _translated_reply($client, undef, { }, @_) },
831             \&_no_translation,
832             sub { 428; my $client = shift; _translated_reply($client, undef, { dev => \&_translate_remote_nonnull_node_device }, @_) },
833             \&_no_translation,
834             \&_no_translation,
835             sub { 431; my $client = shift; _translated_reply($client, undef, { nwfilter => \&_translate_remote_nonnull_nwfilter }, @_) },
836             sub { 432; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
837             sub { 433; my $client = shift; _translated_reply($client, undef, { }, @_) },
838             \&_no_translation,
839             sub { 435; my $client = shift; _translated_reply($client, undef, { }, @_) },
840             sub { 436; my $client = shift; _translated_reply($client, undef, { }, @_) },
841             sub { 437; my $client = shift; _translated_reply($client, undef, { net => \&_translate_remote_nonnull_network }, @_) },
842             sub { 438; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) },
843             \&_no_translation,
844             \&_no_translation,
845             \&_no_translation,
846             \&_no_translation,
847             \&_no_translation,
848             \&_no_translation,
849             sub { 445; my $client = shift; _translated_reply($client, undef, { }, @_) },
850             sub { 446; my $client = shift; _translated_msg($client, { net => \&_translate_remote_nonnull_network }, @_) },
851             \&_no_translation,
852             \&_no_translation,
853             sub { 449; my $client = shift; _translated_reply($client, undef, { }, @_) },
854             \&_no_translation,
855             \&_no_translation,
856             \&_no_translation,
857             sub { 453; my $client = shift; _translated_msg($client, { dom => \&_translate_remote_nonnull_domain }, @_) }
858             );
859              
860 0     0     sub _map( $client, $unwrap, $argmap, $data) {
  0            
  0            
  0            
  0            
  0            
861 0           for my $key (keys $argmap->%*) {
862 0           my $val = $data->{$key};
863              
864 0 0 0       if (ref $argmap->{$key} and reftype $argmap->{$key} eq 'HASH') {
    0 0        
865 0           $data->{$key} = _map( $client, undef, $argmap->{$key}, $val );
866             }
867             elsif (ref $val and reftype $val eq 'ARRAY') {
868             $data->{$key} = [
869 0           map { $argmap->{$key}->( $client, $_ ) } $val->@* ];
  0            
870             }
871             else {
872 0           $data->{$key} = $argmap->{$key}->( $client, $val );
873             }
874             }
875              
876 0           return $data;
877             }
878              
879 0     0     sub _translated_msg($client, $argsmap, %args) {
  0            
  0            
  0            
  0            
880 0 0         return (%args, ) unless $args{data};
881 0           my $data = _map($client, undef, $argsmap, $args{data});
882 0           my $msg = delete $data->{msg};
883 0           delete $data->{callbackID};
884 0 0         if ($msg) {
885             $args{data} = {
886 0           $data->%*, $msg->%*
887             };
888             }
889 0           return (%args, );
890             }
891              
892 0     0     sub _translated_reply($client, $unwrap, $argmap, %args) {
  0            
  0            
  0            
  0            
  0            
893 0 0         return (%args, ) unless $args{data};
894 0           my $data = $args{data};
895 0           $args{data} = _map($client, $unwrap, $argmap, $data);
896 0 0         if ($unwrap) {
897 0           $args{data} = $args{data}->{$unwrap};
898             }
899 0           return (%args, );
900             }
901              
902             sub _domain_factory {
903 0     0     return Sys::Async::Virt::Domain->new( @_ );
904             }
905              
906             sub _domain_checkpoint_factory {
907 0     0     return Sys::Async::Virt::DomainCheckpoint->new( @_ );
908             }
909              
910             sub _domain_snapshot_factory {
911 0     0     return Sys::Async::Virt::DomainSnapshot->new( @_ );
912             }
913              
914             sub _network_factory {
915 0     0     return Sys::Async::Virt::Network->new( @_ );
916             }
917              
918             sub _network_port_factory {
919 0     0     return Sys::Async::Virt::NetworkPort->new( @_ );
920             }
921              
922             sub _nwfilter_factory {
923 0     0     return Sys::Async::Virt::NwFilter->new( @_ );
924             }
925              
926             sub _nwfilter_binding_factory {
927 0     0     return Sys::Async::Virt::NwFilterBinding->new( @_ );
928             }
929              
930             sub _interface_factory {
931 0     0     return Sys::Async::Virt::Interface->new( @_ );
932             }
933              
934             sub _storage_pool_factory {
935 0     0     return Sys::Async::Virt::StoragePool->new( @_ );
936             }
937              
938             sub _storage_vol_factory {
939 0     0     return Sys::Async::Virt::StorageVol->new( @_ );
940             }
941              
942             sub _node_device_factory {
943 0     0     return Sys::Async::Virt::NodeDevice->new( @_ );
944             }
945              
946             sub _secret_factory {
947 0     0     return Sys::Async::Virt::Secret->new( @_ );
948             }
949              
950 0     0     method _domain_instance($id) {
  0            
  0            
  0            
951             # Use $id->{id} as part of the cache key so we return a different domain
952             # instance between the cases where the server includes an 'id' and where
953             # it does not, such as:
954             # my ($off_dom) = $virt->list_all_domains->@*;
955             # my $on_dom = $off_dom->create;
956             #
957             # Here, $off_dom does not have an 'id' value. $on_dom has been assigned
958             # an 'id' because it's running.
959 0   0       my $dom_id = $id->{id} // '';
960 0           my $key = "$dom_id/$id->{uuid}";
961 0           my $c = $_domains->{$key};
962 0 0         unless ($c) {
963 0           $c = $_domains->{$key} = _domain_factory(
964             client => $self,
965             remote => $_remote,
966             rpc_id => $id );
967 0           weaken $_domains->{$key};
968             }
969 0           return $c;
970             }
971              
972 0     0     method _domain_checkpoint_instance($id) {
  0            
  0            
  0            
973 0           my $key = "$id->{dom}->{uuid}/$id->{name}";
974 0           my $c = $_domain_checkpoints->{$key};
975 0 0         unless ($c) {
976 0           $c = $_domain_checkpoints->{$key} =
977             _domain_checkpoint_factory(
978             client => $self,
979             remote => $_remote,
980             rpc_id => $id );
981 0           weaken $_domain_checkpoints->{$key};
982             }
983 0           return $c;
984             }
985              
986 0     0     method _domain_snapshot_instance($id) {
  0            
  0            
  0            
987 0           my $key = "$id->{dom}->{uuid}/$id->{name}";
988 0           my $c = $_domain_snapshots->{$id->{uuid}};
989 0 0         unless ($c) {
990             $c = $_domain_snapshots->{$id->{uuid}} =
991 0           _domain_snapshot_factory(
992             client => $self,
993             remote => $_remote,
994             rpc_id => $id );
995 0           weaken $_domain_snapshots->{$id->{uuid}};
996             }
997 0           return $c;
998             }
999              
1000 0     0     method _network_instance($id) {
  0            
  0            
  0            
1001 0           my $c = $_networks->{$id->{uuid}};
1002 0 0         unless ($c) {
1003             $c = $_networks->{$id->{uuid}} =
1004 0           _network_factory(
1005             client => $self,
1006             remote => $_remote,
1007             rpc_id => $id );
1008 0           weaken $_networks->{$id->{uuid}};
1009             }
1010 0           return $c;
1011             }
1012              
1013 0     0     method _network_port_instance($id) {
  0            
  0            
  0            
1014 0           my $c = $_network_ports->{$id->{uuid}};
1015 0 0         unless ($c) {
1016             $c = $_network_ports->{$id->{uuid}} =
1017 0           _network_port_factory(
1018             client => $self,
1019             remote => $_remote,
1020             rpc_id => $id );
1021 0           weaken $_network_ports->{$id->{uuid}};
1022             }
1023 0           return $c;
1024             }
1025              
1026 0     0     method _nwfilter_instance($id) {
  0            
  0            
  0            
1027 0           my $c = $_nwfilters->{$id->{uuid}};
1028 0 0         unless ($c) {
1029             $c = $_nwfilters->{$id->{uuid}} =
1030 0           _nwfilter_factory(
1031             client => $self,
1032             remote => $_remote,
1033             rpc_id => $id );
1034 0           weaken $_nwfilters->{$id->{uuid}};
1035             }
1036 0           return $c;
1037             }
1038              
1039 0     0     method _nwfilter_binding_instance($id) {
  0            
  0            
  0            
1040 0           my $key = "$id->{portdev}/$id->{filtername}";
1041 0           my $c = $_nwfilter_bindings->{$key};
1042 0 0         unless ($c) {
1043 0           $c = $_nwfilter_bindings->{$key} =
1044             _nwfilter_binding_factory(
1045             client => $self,
1046             remote => $_remote,
1047             rpc_id => $id );
1048 0           weaken $_nwfilter_bindings->{$key};
1049             }
1050 0           return $c;
1051             }
1052              
1053 0     0     method _interface_instance($id) {
  0            
  0            
  0            
1054 0           my $key = "$id->{mac}/$id->{name}";
1055 0           my $c = $_interfaces->{$key};
1056 0 0         unless ($c) {
1057 0           $c = $_interfaces->{$key} =
1058             _interface_factory(
1059             client => $self,
1060             remote => $_remote,
1061             rpc_id => $id );
1062 0           weaken $_interfaces->{$key};
1063             }
1064 0           return $c;
1065             }
1066              
1067 0     0     method _storage_pool_instance($id) {
  0            
  0            
  0            
1068 0           my $c = $_storage_pools->{$id->{uuid}};
1069 0 0         unless ($c) {
1070             $c = $_storage_pools->{$id->{uuid}} =
1071 0           _storage_pool_factory(
1072             client => $self,
1073             remote => $_remote,
1074             rpc_id => $id );
1075 0           weaken $_storage_pools->{$id->{uuid}};
1076             }
1077 0           return $c;
1078             }
1079              
1080 0     0     method _storage_vol_instance($id) {
  0            
  0            
  0            
1081 0           my $c = $_storage_vols->{$id->{key}};
1082 0 0         unless ($c) {
1083             $c = $_storage_vols->{$id->{key}} =
1084 0           _storage_vol_factory(
1085             client => $self,
1086             remote => $_remote,
1087             rpc_id => $id );
1088 0           weaken $_storage_vols->{$id->{key}};
1089             }
1090 0           return $c;
1091             }
1092              
1093 0     0     method _node_device_instance($id) {
  0            
  0            
  0            
1094 0           my $c = $_node_devices->{$id->{name}};
1095 0 0         unless ($c) {
1096             $c = $_node_devices->{$id->{name}} =
1097 0           _node_device_factory(
1098             client => $self,
1099             remote => $_remote,
1100             rpc_id => $id );
1101 0           weaken $_node_devices->{$id->{name}};
1102             }
1103 0           return $c;
1104             }
1105              
1106 0     0     method _secret_instance($id) {
  0            
  0            
  0            
1107 0           my $c = $_secrets->{$id->{uuid}};
1108 0 0         unless ($c) {
1109             $c = $_secrets->{$id->{uuid}} =
1110 0           _secret_factory(
1111             client => $self,
1112             remote => $_remote,
1113             rpc_id => $id );
1114 0           weaken $_secrets->{$id->{uuid}};
1115             }
1116 0           return $c;
1117             }
1118              
1119 0     0     async method _call($proc, $args = {}, :$unwrap = '', :$stream = '', :$empty = '') {
  0            
  0            
  0            
  0            
  0            
  0            
1120 0 0         die $log->fatal( "RPC call without remote connection (proc: $proc)" )
1121             unless $self->is_connected;
1122 0           my $serial = await $_remote->call( $proc, $args );
1123 0           my $f = Future->new;
1124 0           $log->trace( "Setting serial $serial future (proc: $proc)" );
1125 0           $_replies->{$serial} = $f;
1126 0           $_selector->add(
1127             data => 'reply',
1128             f => $f
1129             );
1130             ### Return a stream somehow...
1131 0           my @rv = await $f;
1132 0 0         $rv[0] = $rv[0]->{$unwrap} if $unwrap;
1133 0 0         shift @rv if $empty;
1134 0 0         if ($stream) {
1135 0 0         my $s = Sys::Async::Virt::Stream->new(
1136             rpc_id => $serial,
1137             proc => $proc,
1138             client => $self,
1139             direction => ($stream eq 'write' ? 'send' : 'receive'),
1140             );
1141 0           $_streams->{$serial} = $s;
1142 0           weaken $_streams->{$serial};
1143              
1144 0           push @rv, $s;
1145             }
1146              
1147 0           return @rv;
1148             }
1149              
1150 0     0     async method _from_cpumap($cpumap, $offset = 0) {
  0            
  0            
  0            
  0            
  0            
1151 0           my $cpus = await $self->_cpus;
1152 0           return [ map { vec( $cpumap, $offset+$_, 1 ) } 0 .. ($cpus - 1) ];
  0            
1153             }
1154              
1155 0     0     async method _to_cpumap($cpuarray) {
  0            
  0            
  0            
  0            
1156 0           my $maplen = await $self->_maplen;
1157 0           my $map = "\0" x $maplen;
1158             vec( $map, $cpuarray->[$_] ? 1 : 0, 1 )
1159 0 0         for ( 0 .. scalar($cpuarray->@*) );
1160              
1161 0           return $map
1162             }
1163              
1164 0     0     async method _cpus() {
  0            
  0            
  0            
1165 0 0         return $_cpus if $_cpus;
1166              
1167 0           await $self->get_cpu_map;
1168 0           return $_cpus;
1169             }
1170              
1171 0     0     async method _maplen() {
  0            
  0            
  0            
1172 0 0         return $_maplen if $_maplen;
1173              
1174 0           await $self->get_cpu_map;
1175 0           return $_maplen;
1176             }
1177              
1178 0     0     async method _send($proc, $serial, :$data = undef, :$hole = undef, %rest) {
  0            
  0            
  0            
  0            
  0            
  0            
1179 0           await $_remote->stream(
1180             $proc, $serial,
1181             data => $data,
1182             hole => $hole);
1183             }
1184              
1185 0     0     async method _typed_param_string_okay() {
  0            
  0            
  0            
1186 0 0 0       return $_typed_param_string_okay //=
1187             ((await $self->_supports_feature(
1188             $_remote->DRV_FEATURE_TYPED_PARAM_STRING ))
1189             ? $self->TYPED_PARAM_STRING_OKAY : 0);
1190             }
1191              
1192 0     0     async method _filter_typed_param_string($params) {
  0            
  0            
  0            
  0            
1193             return await $self->_typed_param_string_okay
1194             ? $params
1195             : [ grep {
1196 0           $params->{value}->{type} != $remote->VIR_TYPED_PARAM_STRING
1197             } @$params ];
1198             }
1199              
1200 0     0     method _dispatch_closed(@args) {
  0            
  0            
  0            
1201 0           $_on_close->( $self, @args );
1202              
1203             # dispatch only once, on first-come-first-serve basis:
1204 0     0     $_on_close = sub { };
1205             }
1206              
1207 0     0     method _dispatch_message(:$data = undef, :$header = undef, %args) {
  0            
  0            
  0            
1208 0 0         if ($_keepalive) {
1209 0           $_keepalive->mark_active;
1210             }
1211 0 0 0       if ($data
      0        
1212             and defined $data->{callbackID}
1213             and my $cb = $_callbacks->{$data->{callbackID}}) {
1214              
1215 0           my %cbargs = $reply_translators[$header->{proc}]->(
1216             $self, data => $data, header => $header, %args
1217             );
1218 0           return $cb->_dispatch_event($cbargs{data});
1219             }
1220             else {
1221 0           my %cbargs = $reply_translators[$header->{proc}]->( $self, %args );
1222 0           return $_on_message->( $cbargs{data} );
1223             }
1224             }
1225              
1226 0     0     method _dispatch_reply(:$header, %args) {
  0            
  0            
  0            
1227 0           $log->trace( "Dispatching serial $header->{serial} / $header->{proc}" );
1228 0 0         if ($_keepalive) {
1229 0           $_keepalive->mark_active;
1230             }
1231 0           my $f = delete $_replies->{$header->{serial}};
1232              
1233 0 0         if (exists $args{data}) {
    0          
1234 0           my %cbargs = $reply_translators[$header->{proc}]->( $self, header => $header, %args );
1235 0           $f->done( $cbargs{data} );
1236             }
1237             elsif (exists $args{error}) {
1238 0           $f->fail( $args{error}->{message}, undef, $args{error} );
1239             }
1240             else {
1241 0           die 'Unhandled reply';
1242             }
1243              
1244 0           $log->trace( "Dispatching serial $header->{serial} done" );
1245 0           return $f;
1246             }
1247              
1248 0     0     method _dispatch_stream(:$header, %args) {
  0            
  0            
  0            
1249 0 0         if ($_keepalive) {
1250 0           $_keepalive->mark_active;
1251             }
1252              
1253 0 0         if (my $stream = $_streams->{$header->{serial}}) {
1254 0 0         if ($args{error}) {
1255 0           return $stream->_dispatch_error($args{error});
1256             }
1257             else {
1258 0           return $stream->_dispatch_receive($args{data}, $args{hole}, $args{eof}, $args{final});
1259             }
1260             }
1261             else {
1262 0           return $_on_stream->( $self, header => $header, %args );
1263             }
1264             }
1265              
1266 0     0 1   method configure(%args) {
  0            
  0            
  0            
1267 0           for my $key (keys %args) {
1268 0   0 0     $self->{$key} = $args{$key} // sub {};
1269             }
1270             }
1271              
1272 0     0 1   method register($r) {
  0            
  0            
  0            
1273             $r->configure(
1274 0     0     on_closed => sub { $self->_dispatch_closed( @_ ) },
1275 0     0     on_message => sub { $self->_dispatch_message( @_ ) },
1276 0     0     on_reply => sub { $self->_dispatch_reply( @_ ) },
1277 0     0     on_stream => sub { $self->_dispatch_stream( @_ ) }
  0            
1278             );
1279 0           $_remote = $r;
1280             }
1281              
1282 0     0 1   async method run_once() {
  0            
  0            
  0            
1283 0 0         return if $_eof;
1284 0           my ($len, $type) = $_transport->need;
1285 0           $log->trace( 'Reading data from connection' );
1286              
1287             ###BUG: what if $type == 'fd' and we have sasl encodng??
1288 0           my ($data, $eof);
1289 0 0         if ($_sasl_session) {
1290 0           my $buf;
1291 0           ($buf, $eof) = await $_connection->read( 'data', 4 );
1292              
1293 0 0         return (undef, $eof) if $eof;
1294              
1295 0           my $sasl_len = unpack( 'L>', $buf );
1296 0           ($buf, $eof) = await $_connection->read( 'data', $sasl_len );
1297              
1298 0 0         return (undef, $eof) if $eof;
1299              
1300 0           return ( $_sasl_session->decode( $buf, $sasl_len ), $eof );
1301             }
1302              
1303             # closing the connection will kill the 'read' action
1304 0           ($data, $eof) = await $_connection->read( $type, $len );
1305 0           $log->trace( 'Reading data from connection: completed' );
1306              
1307 0           return ($data, $eof);
1308             }
1309              
1310 0     0     method _deregister_callback($f, $proc, $id) {
  0            
  0            
  0            
  0            
  0            
1311 0           delete $_callbacks->{$id};
1312 0           my $r = $self->_call( $proc, { callbackID => $id } );
1313 0 0         $r->on_ready( $f ) if $f;
1314              
1315 0           $_selector->add(
1316             data => 'callback',
1317             f => $r
1318             );
1319 0           return;
1320             }
1321              
1322 0     0     method _send_finish($proc, $serial, $abort) {
  0            
  0            
  0            
  0            
  0            
1323 0           my $r = $_remote->stream_end($proc, $serial, $abort);
1324             # streams send a final "OK" message; we should be awaiting that
1325             # instead of declaring the future $f done here
1326              
1327 0           $_selector->add(
1328             data => 'stream',
1329             f => $r
1330             );
1331 0           return;
1332             }
1333              
1334 0     0 1   async method initialize() {
  0            
  0            
  0            
1335 0 0         return unless $_state == _STATE_NONE;
1336 0           $_state = _STATE_INITIALIZING;
1337              
1338 0 0         unless ($_connection) {
1339 0   0       $_factory //= Sys::Async::Virt::Connection::Factory->new;
1340 0           $_connection = $_factory->create_connection( $_url,
1341             readonly => $_readonly );
1342             }
1343              
1344 0 0         unless ($_transport) {
1345 0           $_transport = Protocol::Sys::Virt::Transport->new(
1346             role => 'client',
1347 0     0     on_send => async sub($opaque, @data) {
  0            
  0            
  0            
1348 0 0         if ($_sasl_session) {
1349 0           my $bufsize = $_sasl_session->property('maxbuf');
1350 0           my $buf = join( '', @data );
1351 0           my $idx = 0;
1352 0           my $len = length $buf;
1353 0           while ($len > 0) {
1354 0           my $enc =
1355             $_sasl_session->encode( substr( $buf, $idx, $bufsize ) );
1356 0           await $_connection->write( pack('L>', length($enc)), $enc );
1357 0           $len -= $bufsize;
1358 0           $idx += $bufsize;
1359             }
1360             }
1361             else {
1362 0           await $_connection->write( @data );
1363             }
1364 0           return $opaque;
1365 0           });
1366             }
1367              
1368 0   0       $_remote //= Protocol::Sys::Virt::Remote->new( role => 'client' );
1369 0           $_remote->register( $_transport );
1370 0           $self->register( $_remote );
1371              
1372 0 0         unless ($_connection->connected) {
1373             await Future->wait_any(
1374             $_connection->connect,
1375             Future::IO->sleep( 60 )
1376 0     0     ->then(sub { Future->fail('timeout') })
  0            
1377             );
1378             }
1379 0           $log->trace( "Connected" );
1380 0           $_selector->add( data => undef, f => $self->_dispatch_loop );
1381 0           $_state = _STATE_INITIALIZED;
1382             }
1383              
1384 0     0     async method _dispatch_loop() {
  0            
  0            
  0            
1385 0           while (not $_completed_f->is_ready) {
1386 0           my ($data, $eof) = do {
1387 0           try {
1388 0           await $self->run_once;
1389             }
1390             catch ($e) {
1391             # closing the server stream here doesn't make sense:
1392             # throwing this exception will kill the loop, which
1393             # means we can't process further server frames
1394 0           die $e;
1395             }
1396             };
1397              
1398              
1399             # submit $data to $_transport, allowing $transport to raise an error
1400             # if the stream is terminated early.
1401             #
1402             # $_transport->receive() may return a list of futures to be awaited.
1403 0 0         if (my @dispatch_values = $_transport->receive($data)) {
1404 0           await Future->wait_all( @dispatch_values );
1405 0           $log->trace( 'Processed input data from connection' );
1406             }
1407 0 0         if ($eof) {
1408 0           $_eof = 1;
1409 0           $log->info( 'EOF' );
1410 0           $_selector->add(
1411             data => 'closing',
1412             f => $self->_close( $self->CLOSE_REASON_EOF )
1413             );
1414             }
1415             }
1416             }
1417              
1418 0     0 1   async method run() {
  0            
  0            
  0            
1419 0 0         return if $_completed_f;
1420              
1421 0           $_completed_f = Future->new;
1422 0           await $_selector->run_until_ready( $_completed_f );
1423             }
1424              
1425 0     0 1   method stop() {
  0            
  0            
1426 0 0         croak 'Not running' unless $_completed_f;
1427 0 0         $_completed_f->done unless $_completed_f->is_ready;
1428             }
1429              
1430 0     0 1   method is_connected() {
  0            
  0            
1431 0   0       return not ($_state == _STATE_NONE
1432             or $_state == _STATE_INITIALIZING
1433             or $_state == _STATE_CLOSED);
1434             }
1435              
1436 0     0 1   method is_opened() {
  0            
  0            
1437 0           return ($_state == _STATE_OPENED);
1438             }
1439              
1440 0     0     method _remove_stream($id) {
  0            
  0            
  0            
1441 0           delete $_streams->{$id};
1442 0           return;
1443             }
1444              
1445             # ENTRYPOINT: REMOTE_PROC_CONNECT_IS_SECURE
1446 0     0 1   async method is_secure() {
  0            
  0            
  0            
1447 0   0       return ($self->is_opened
1448             and $_connection->is_secure
1449             and await $self->_call( $remote->PROC_CONNECT_IS_SECURE,
1450             {}, unwrap => 'secure' ));
1451             }
1452              
1453 0     0 1   async method connect() {
  0            
  0            
  0            
1454 0           await $self->initialize;
1455 0           await $self->auth;
1456 0           await $self->open;
1457             }
1458              
1459             # ENTRYPOINT: REMOTE_PROC_CONNECT_DOMAIN_EVENT_CALLBACK_REGISTER_ANY
1460             # ENTRYPOINT: REMOTE_PROC_CONNECT_DOMAIN_EVENT_CALLBACK_DEREGISTER_ANY
1461 0     0 1   async method domain_event_register_any($eventID, $domain = undef) {
  0            
  0            
  0            
  0            
  0            
1462 0 0         my $dom = $domain ? $domain->rpc_id : undef;
1463 0           my $rv = await $self->_call(
1464             $remote->PROC_CONNECT_DOMAIN_EVENT_CALLBACK_REGISTER_ANY,
1465             { eventID => $eventID, dom => $dom });
1466 0           my $dereg = $remote->PROC_CONNECT_DOMAIN_EVENT_CALLBACK_DEREGISTER_ANY;
1467             my $cb = Sys::Async::Virt::Callback->new(
1468             id => $rv->{callbackID},
1469             client => $self,
1470             deregister_call => $dereg,
1471 0     0     factory => sub { Future->new }
  0            
1472             );
1473 0           $_callbacks->{$rv->{callbackID}} = $cb;
1474 0           weaken $_callbacks->{$rv->{callbackID}};
1475              
1476 0           return $cb;
1477             }
1478              
1479             # ENTRYPOINT: REMOTE_PROC_CONNECT_NETWORK_EVENT_REGISTER_ANY
1480             # ENTRYPOINT: REMOTE_PROC_CONNECT_NETWORK_EVENT_DEREGISTER_ANY
1481 0     0 1   async method network_event_register_any($eventID, $network = undef) {
  0            
  0            
  0            
  0            
  0            
1482 0 0         my $net = $network ? $network->rpc_id : undef;
1483 0           my $rv = await $self->_call(
1484             $remote->PROC_CONNECT_NETWORK_EVENT_REGISTER_ANY,
1485             { eventID => $eventID, net => $net });
1486 0           my $dereg = $remote->PROC_CONNECT_NETWORK_EVENT_DEREGISTER_ANY;
1487             my $cb = Sys::Async::Virt::Callback->new(
1488             id => $rv->{callbackID},
1489             client => $self,
1490             deregister_call => $dereg,
1491 0     0     factory => sub { Future->new }
  0            
1492             );
1493 0           $_callbacks->{$rv->{callbackID}} = $cb;
1494              
1495 0           return $cb;
1496             }
1497              
1498             # ENTRYPOINT: REMOTE_PROC_CONNECT_STORAGE_POOL_EVENT_REGISTER_ANY
1499             # ENTRYPOINT: REMOTE_PROC_CONNECT_STORAGE_POOL_EVENT_DEREGISTER_ANY
1500 0     0 1   async method storage_pool_event_register_any($eventID, $pool = undef) {
  0            
  0            
  0            
  0            
  0            
1501 0 0         my $p = $pool ? $pool->rpc_id : undef;
1502 0           my $rv = await $self->_call(
1503             $remote->PROC_CONNECT_STORAGE_POOL_EVENT_REGISTER_ANY,
1504             { eventID => $eventID, pool => $p });
1505 0           my $dereg = $remote->PROC_CONNECT_STORAGE_POOL_EVENT_DEREGISTER_ANY;
1506             my $cb = Sys::Async::Virt::Callback->new(
1507             id => $rv->{callbackID},
1508             client => $self,
1509             deregister_call => $dereg,
1510 0     0     factory => sub { Future->new }
  0            
1511             );
1512 0           $_callbacks->{$rv->{callbackID}} = $cb;
1513              
1514 0           return $cb;
1515             }
1516              
1517             # ENTRYPOINT: REMOTE_PROC_CONNECT_NODE_DEVICE_EVENT_REGISTER_ANY
1518             # ENTRYPOINT: REMOTE_PROC_CONNECT_NODE_DEVICE_EVENT_DEREGISTER_ANY
1519 0     0 1   async method node_device_event_register_any($eventID, $dev = undef) {
  0            
  0            
  0            
  0            
  0            
1520 0 0         my $d = $dev ? $dev->rpc_id : undef;
1521 0           my $rv = await $self->_call(
1522             $remote->PROC_CONNECT_NODE_DEVICE_EVENT_REGISTER_ANY,
1523             { eventID => $eventID, dev => $d });
1524 0           my $dereg = $remote->PROC_CONNECT_NODE_DEVICE_EVENT_DEREGISTER_ANY;
1525             my $cb = Sys::Async::Virt::Callback->new(
1526             id => $rv->{callbackID},
1527             client => $self,
1528             deregister_call => $dereg,
1529 0     0     factory => sub { Future->new }
  0            
1530             );
1531 0           $_callbacks->{$rv->{callbackID}} = $cb;
1532              
1533 0           return $cb;
1534             }
1535              
1536             # ENTRYPOINT: REMOTE_PROC_CONNECT_SECRET_EVENT_REGISTER_ANY
1537             # ENTRYPOINT: REMOTE_PROC_CONNECT_SECRET_EVENT_DEREGISTER_ANY
1538 0     0 1   async method secret_event_register_any($eventID, $secret = undef) {
  0            
  0            
  0            
  0            
  0            
1539 0 0         my $s = $secret ? $secret->rpc_id : undef;
1540 0           my $rv = await $self->_call(
1541             $remote->PROC_CONNECT_SECRET_EVENT_REGISTER_ANY,
1542             { eventID => $eventID, secret => $s });
1543 0           my $dereg = $remote->PROC_CONNECT_SECRET_EVENT_DEREGISTER_ANY;
1544             my $cb = Sys::Async::Virt::Callback->new(
1545             id => $rv->{callbackID},
1546             client => $self,
1547             deregister_call => $dereg,
1548 0     0     factory => sub { Future->new }
  0            
1549             );
1550 0           $_callbacks->{$rv->{callbackID}} = $cb;
1551              
1552 0           return $cb;
1553             }
1554              
1555             # ENTRYPOINT: REMOTE_PROC_AUTH_LIST
1556             # ENTRYPOINT: REMOTE_PROC_AUTH_POLKIT
1557             # ENTRYPOINT: REMOTE_PROC_AUTH_SASL_INIT
1558             # ENTRYPOINT: REMOTE_PROC_AUTH_SASL_START
1559             # ENTRYPOINT: REMOTE_PROC_AUTH_SASL_STEP
1560              
1561             # auth( $auth_type )
1562             # --> clients take the selected auth mechanism from the
1563             # connection URL: auth='sasl[.]" / auth='none' / auth='polkit'
1564             # in order to be able to handle SASL AUTH, we'll need an Authen::SASL
1565             # authentication parameter to be passed in though...
1566              
1567 0     0 1   async method auth($auth_type = undef) {
  0            
  0            
  0            
  0            
1568 0 0         return unless $_state == _STATE_INITIALIZED;
1569 0           $_state = _STATE_AUTHENTICATING;
1570              
1571 0           my $auth_types = await $self->_call( $remote->PROC_AUTH_LIST, {},
1572             unwrap => 'types' );
1573 0           my $selected;
1574 0 0         if (defined $auth_type) {
1575 0           my $want;
1576 0 0         if ($auth_type eq 'sasl') {
    0          
    0          
1577 0           $want = $remote->AUTH_SASL;
1578             }
1579             elsif ($auth_type eq 'polkit') {
1580 0           $want = $remote->AUTH_POLKIT;
1581             }
1582             elsif ($auth_type eq 'none') {
1583 0           $want = $remote->AUTH_NONE;
1584             }
1585             else {
1586 0           die "Unknown authentication method $auth_type requested";
1587             }
1588              
1589 0           for my $type ( $auth_types->@* ) {
1590 0 0         if ($want == $type) {
1591 0           $selected = $type;
1592 0           last;
1593             }
1594             }
1595 0 0         die "Requested authentication method $auth_type not supported by the server"
1596             if not defined $selected;
1597             }
1598             else {
1599 0           $selected = shift $auth_types->@*;
1600             }
1601              
1602 0           $log->trace( "Selected auth method: $selected" );
1603 0 0         if ($selected == $remote->AUTH_POLKIT) {
    0          
1604 0           await $self->_call( $remote->PROC_AUTH_POLKIT );
1605             }
1606             elsif ($selected == $remote->AUTH_SASL) {
1607 0           my $mechs = await $self->_call( $remote->PROC_AUTH_SASL_INIT, {},
1608             unwrap => 'mechlist' );
1609 0           $_sasl->mechanism( $mechs );
1610              
1611 0           my %uri = parse_url( $_url );
1612             my $auth = $_sasl->client_new(
1613             'libvirt', $uri{host},
1614 0 0         $_connection->is_secure ? '' : 'noplaintext noanonymous' );
1615 0           $auth->property('maxbuf', 65536);
1616              
1617 0           my $initial = $auth->client_start;
1618 0           my $rv = await $self->_call( $remote->PROC_AUTH_SASL_START,
1619             {
1620             mech => $auth->mechanism,
1621             nil => (defined $initial ? 0 : 1),
1622             data => ($initial // '')
1623             } );
1624 0           my ($complete, $data) = $rv->@{ qw( complete data ) };
1625              
1626 0   0       while (not $complete or $auth->need_step) {
1627 0           my $next_data = $auth->client_step( $data );
1628 0 0 0       last if ($complete and not $auth->need_step);
1629 0 0         last if $auth->error;
1630              
1631 0           $rv = await $self->_call( $remote->PROC_AUTH_SASL_STEP,
1632             {
1633             nil => (defined $next_data ? 0 : 1),
1634             data => ($next_data // '')
1635             } );
1636 0           ( $complete, $data ) = $rv->@{ qw( complete data ) };
1637             }
1638 0 0         if (my $err = $auth->error) {
    0          
1639 0           die $err;
1640             }
1641             elsif (not $auth->is_success) {
1642 0           die 'Unknown SASL error';
1643             }
1644              
1645 0 0 0       if (defined $auth->property( 'ssf' )
1646             and $auth->property( 'ssf' ) > 0) {
1647 0           $log->trace( '"ssf" set; setting codec' );
1648 0           $log->trace( '"maxbuf" set: ' . $auth->property('maxbuf') );
1649              
1650 0           $_sasl_session = $auth;
1651             }
1652             }
1653              
1654 0           $_state = _STATE_AUTHENTICATED;
1655 0           return;
1656             }
1657              
1658 0     0     async method _register_keepalive() {
  0            
  0            
  0            
1659 0 0         if (await $self->_supports_feature(
1660             $_remote->DRV_FEATURE_PROGRAM_KEEPALIVE )) {
1661             $_keepalive //= Protocol::Sys::Virt::KeepAlive->new(
1662             max_inactive => 5,
1663 0     0     on_ack => sub { $log->trace('KeepAlive PING ACK'); return; },
  0            
1664             on_ping => sub {
1665 0     0     $log->trace('KeepAlive ACK-ing PING');
1666 0 0         return $_[0]->pong unless $_eof;
1667             },
1668             on_fail => sub {
1669 0     0     $log->fatal('KeepAlive time out - closing connection');
1670 0           return $self->_close( $self->CLOSE_REASON_KEEPALIVE );
1671 0   0       });
1672              
1673 0           $_keepalive->register( $_transport );
1674             $_selector->add( data => 'PING',
1675             gen => sub {
1676             Future::IO
1677             ->sleep( $_ping_interval )
1678             ->on_done(sub {
1679 0           $log->trace('Sending PING');
1680             })
1681             ->then(sub {
1682 0 0         $_keepalive->ping unless $_eof;
1683 0     0     })
1684 0           });
1685             }
1686             }
1687              
1688             # ENTRYPOINT: REMOTE_PROC_CONNECT_OPEN
1689             # ENTRYPOINT: REMOTE_PROC_CONNECT_REGISTER_CLOSE_CALLBACK
1690 0     0 1   async method open() {
  0            
  0            
  0            
1691 0 0         return unless $_state == _STATE_AUTHENTICATED;
1692 0           $_state = _STATE_OPENING;
1693              
1694 0           await $self->_register_keepalive();
1695 0           my %parsed_url = parse_url( $_url );
1696 0 0         my $flags = $_readonly ? RO : 0;
1697             await $self->_call( $remote->PROC_CONNECT_OPEN,
1698 0           { name => $parsed_url{name}, flags => $flags } );
1699 0 0         if (await $self->_supports_feature(
1700             $_remote->DRV_FEATURE_REMOTE_CLOSE_CALLBACK )) {
1701 0           await $self->_call( $remote->PROC_CONNECT_REGISTER_CLOSE_CALLBACK );
1702             }
1703 0 0         if (not await $self->_supports_feature(
1704             $_remote->DRV_FEATURE_REMOTE_EVENT_CALLBACK )) {
1705 0           die "Remote does not support REMOTE_EVENT_CALLBACK feature";
1706             }
1707              
1708 0           $_state = _STATE_OPENED;
1709             }
1710              
1711             # ENTRYPOINT: REMOTE_PROC_CONNECT_CLOSE
1712             # ENTRYPOINT: REMOTE_PROC_CONNECT_UNREGISTER_CLOSE_CALLBACK
1713 0     0     async method _close($reason) {
  0            
  0            
  0            
  0            
1714 0 0 0       unless (_STATE_INITIALIZED <= $_state and $_state <= _STATE_OPENED) {
1715 0 0         $_completed_f->done unless $_completed_f->is_ready;
1716 0           return;
1717             }
1718 0           $_state = _STATE_CLEANING_UP;
1719              
1720 0 0 0       unless ($_connection->is_read_eof
1721             or $_connection->is_write_eof) {
1722             # when orderly connected both for reading and writing,
1723             # clean up all resources the server allocated for us
1724 0           try {
1725             await Future->wait_all(
1726             (map { $_->cancel }
1727             grep { $_ } values $_callbacks->%*),
1728             (map { $_->abort }
1729 0           grep { $_ } values $_streams->%*)
1730             );
1731 0           $log->debug( 'Unregistering CLOSE CALLBACK' );
1732 0           await $self->_call(
1733             $remote->PROC_CONNECT_UNREGISTER_CLOSE_CALLBACK );
1734              
1735 0           $log->debug( 'Closing session' );
1736 0           await $self->_call( $remote->PROC_CONNECT_CLOSE );
1737              
1738 0           $_completed_f->done;
1739 0           await $_connection->close;
1740             # @@@TODO: wait for server to close the connection?
1741             }
1742             catch ($e) {
1743 0           $log->error( "Error during release of server resources: $e" );
1744             }
1745             }
1746             else {
1747             # stop loops reading from and writing to the connection
1748 0           await $_connection->close;
1749             # @@@TODO: wait for server to close the connection?
1750             }
1751              
1752             # These *should* have been de-allocated above; however,
1753             # when the connection to the server doesn't work properly
1754             # anymore, we want to simply discard the client side resources
1755             # ... the server is on its own
1756              
1757 0           $_state = _STATE_CLOSING;
1758 0 0         if (my @callbacks = values $_callbacks->%*) {
1759 0           $log->debug( 'Cleaning up callbacks not deregistered from the server' );
1760 0           for my $cb (@callbacks) {
1761 0 0         next unless $cb;
1762              
1763             # 'cleanup' cleans the items from the array
1764 0           $cb->cleanup;
1765             }
1766             }
1767 0 0         if (my @streams = values $_streams->%*) {
1768 0           $log->debug( 'Cleaning up streams not deregistered from the server' );
1769 0           for my $stream (@streams) {
1770 0 0         next unless $stream;
1771              
1772             # 'cleanup' cleans the items from the array
1773 0           $stream->cleanup;
1774             }
1775             }
1776 0 0         if (my @replies = keys $_replies->%*) {
1777 0           $log->debug( 'Cleaning up (failing) on-going RPC calls' );
1778 0           for my $serial (@replies) {
1779 0           my $reply = delete $_replies->{$serial};
1780 0 0         next unless $reply;
1781              
1782 0           $reply->fail( 'Closed before reply received' );
1783             }
1784             }
1785              
1786 0           $_state = _STATE_CLOSED;
1787 0           $self->_dispatch_closed( $reason );
1788 0 0         $_completed_f->done unless $_completed_f->is_ready;
1789 0           return;
1790             }
1791              
1792 0     0 1   async method close() {
  0            
  0            
  0            
1793 0 0 0       return if ($_state == _STATE_NONE or _STATE_CLEANING_UP <= $_state);
1794 0           await $self->_close( $self->CLOSE_REASON_CLIENT );
1795             }
1796              
1797             # ENTRYPOINT: REMOTE_PROC_NODE_ALLOC_PAGES
1798 0     0 1   async method alloc_pages($page_counts, $start_cell, $cell_count, $flags ) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1799             my $rv = await $self->_call(
1800             $remote->PROC_NODE_ALLOC_PAGES,
1801             { pageSizes => [ map { $_->{size} } $page_counts->@* ],
1802 0           pageCounts => [ map { $_->{count} } $page_counts->@* ],
1803             startCell => $start_cell,
1804             cellCount => $cell_count,
1805             flags => $flags } );
1806              
1807 0           return $rv->{ret};
1808             }
1809              
1810             # ENTRYPOINT: REMOTE_PROC_NODE_GET_CELLS_FREE_MEMORY
1811 0     0 1   async method get_cells_free_memory($start_cell, $max_cells) {
  0            
  0            
  0            
  0            
  0            
1812 0           my $rv = await $self->_call(
1813             $remote->PROC_NODE_GET_CELLS_FREE_MEMORY,
1814             { startCell => $start_cell, maxcells => $max_cells } );
1815              
1816 0           return $rv->{cells};
1817             }
1818              
1819             # ENTRYPOINT: REMOTE_PROC_NODE_GET_CPU_MAP
1820 0     0 1   async method get_cpu_map() {
  0            
  0            
  0            
1821 0           my $rv = await $self->_call(
1822             $remote->PROC_NODE_GET_CPU_MAP,
1823             { need_map => 1, need_online => 1, flags => 0 } );
1824              
1825 0           $_cpus = $rv->{ret};
1826 0           $_maplen = length($rv->{cpumap});
1827              
1828             return {
1829             totcpus => $rv->{ret},
1830             totonline => $rv->{online},
1831             maplen => length($rv->{cpumap}),
1832             onlinemap => await $self->_from_cpumap( $rv->{cpumap} )
1833 0           };
1834             }
1835              
1836             # ENTRYPOINT: REMOTE_PROC_NODE_GET_FREE_PAGES
1837 0     0 1   async method get_free_pages($pages, $start_cell, $cell_count, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1838 0           my $rv = await $self->_call(
1839             $remote->PROC_NODE_GET_FREE_PAGES,
1840             { pages => $pages, startCell => $start_cell,
1841             cellCount => $cell_count, flags => $flags // 0 } );
1842              
1843 0           my @rv;
1844 0           my $cell_counts = [];
1845 0           while (1) {
1846 0           my $count = shift $rv->{counts}->@*;
1847 0           push $cell_counts->@*, $count;
1848              
1849 0 0         if (scalar($cell_counts->@*) == scalar($pages->@*)) {
1850 0           push @rv, $cell_counts;
1851 0           $cell_counts = [];
1852             }
1853 0 0         if (scalar($rv->{counts}->@*) == 0) {
1854 0           last;
1855             }
1856             }
1857              
1858 0           return \@rv;
1859             }
1860              
1861 0     0     async method _domain_migrate_finish($dname, $cookie, $uri, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1862 0           return await $self->_call(
1863             $remote->PROC_DOMAIN_MIGRATE_FINISH,
1864             { dname => $dname, cookie => $cookie, uri => $uri, flags => $flags // 0 }, unwrap => 'ddom' );
1865             }
1866              
1867 0     0     async method _domain_migrate_finish2($dname, $cookie, $uri, $flags, $retcode) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1868 0           return await $self->_call(
1869             $remote->PROC_DOMAIN_MIGRATE_FINISH2,
1870             { dname => $dname, cookie => $cookie, uri => $uri, flags => $flags // 0, retcode => $retcode }, unwrap => 'ddom' );
1871             }
1872              
1873 0     0     method _domain_migrate_prepare_tunnel($flags, $dname, $bandwidth, $dom_xml) {
  0            
  0            
  0            
  0            
  0            
  0            
1874 0   0       return $self->_call(
1875             $remote->PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL,
1876             { flags => $flags // 0, dname => $dname, bandwidth => $bandwidth, dom_xml => $dom_xml }, stream => 'write', empty => 1 );
1877             }
1878              
1879 0     0     async method _supports_feature($feature) {
  0            
  0            
  0            
  0            
1880 0           return await $self->_call(
1881             $remote->PROC_CONNECT_SUPPORTS_FEATURE,
1882             { feature => $feature }, unwrap => 'supported' );
1883             }
1884              
1885 0     0 1   async method baseline_cpu($xmlCPUs, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1886 0           return await $self->_call(
1887             $remote->PROC_CONNECT_BASELINE_CPU,
1888             { xmlCPUs => $xmlCPUs, flags => $flags // 0 }, unwrap => 'cpu' );
1889             }
1890              
1891 0     0 1   async method baseline_hypervisor_cpu($emulator, $arch, $machine, $virttype, $xmlCPUs, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1892 0           return await $self->_call(
1893             $remote->PROC_CONNECT_BASELINE_HYPERVISOR_CPU,
1894             { emulator => $emulator, arch => $arch, machine => $machine, virttype => $virttype, xmlCPUs => $xmlCPUs, flags => $flags // 0 }, unwrap => 'cpu' );
1895             }
1896              
1897 0     0 1   async method compare_cpu($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1898 0           return await $self->_call(
1899             $remote->PROC_CONNECT_COMPARE_CPU,
1900             { xml => $xml, flags => $flags // 0 }, unwrap => 'result' );
1901             }
1902              
1903 0     0 1   async method compare_hypervisor_cpu($emulator, $arch, $machine, $virttype, $xmlCPU, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
1904 0           return await $self->_call(
1905             $remote->PROC_CONNECT_COMPARE_HYPERVISOR_CPU,
1906             { emulator => $emulator, arch => $arch, machine => $machine, virttype => $virttype, xmlCPU => $xmlCPU, flags => $flags // 0 }, unwrap => 'result' );
1907             }
1908              
1909 0     0 1   async method domain_create_xml($xml_desc, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1910 0           return await $self->_call(
1911             $remote->PROC_DOMAIN_CREATE_XML,
1912             { xml_desc => $xml_desc, flags => $flags // 0 }, unwrap => 'dom' );
1913             }
1914              
1915 0     0 1   async method domain_define_xml($xml) {
  0            
  0            
  0            
  0            
1916 0           return await $self->_call(
1917             $remote->PROC_DOMAIN_DEFINE_XML,
1918             { xml => $xml }, unwrap => 'dom' );
1919             }
1920              
1921 0     0 1   async method domain_define_xml_flags($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1922 0           return await $self->_call(
1923             $remote->PROC_DOMAIN_DEFINE_XML_FLAGS,
1924             { xml => $xml, flags => $flags // 0 }, unwrap => 'dom' );
1925             }
1926              
1927 0     0 1   async method domain_lookup_by_id($id) {
  0            
  0            
  0            
  0            
1928 0           return await $self->_call(
1929             $remote->PROC_DOMAIN_LOOKUP_BY_ID,
1930             { id => $id }, unwrap => 'dom' );
1931             }
1932              
1933 0     0 1   async method domain_lookup_by_name($name) {
  0            
  0            
  0            
  0            
1934 0           return await $self->_call(
1935             $remote->PROC_DOMAIN_LOOKUP_BY_NAME,
1936             { name => $name }, unwrap => 'dom' );
1937             }
1938              
1939 0     0 1   async method domain_lookup_by_uuid($uuid) {
  0            
  0            
  0            
  0            
1940 0           return await $self->_call(
1941             $remote->PROC_DOMAIN_LOOKUP_BY_UUID,
1942             { uuid => $uuid }, unwrap => 'dom' );
1943             }
1944              
1945 0     0 1   method domain_restore($from) {
  0            
  0            
  0            
1946 0           return $self->_call(
1947             $remote->PROC_DOMAIN_RESTORE,
1948             { from => $from }, empty => 1 );
1949             }
1950              
1951 0     0 1   method domain_restore_flags($from, $dxml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1952 0   0       return $self->_call(
1953             $remote->PROC_DOMAIN_RESTORE_FLAGS,
1954             { from => $from, dxml => $dxml, flags => $flags // 0 }, empty => 1 );
1955             }
1956              
1957 0     0 1   async method domain_restore_params($params, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1958 0           $params = await $self->_filter_typed_param_string( $params );
1959 0           return await $self->_call(
1960             $remote->PROC_DOMAIN_RESTORE_PARAMS,
1961             { params => $params, flags => $flags // 0 }, empty => 1 );
1962             }
1963              
1964 0     0 1   method domain_save_image_define_xml($file, $dxml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1965 0   0       return $self->_call(
1966             $remote->PROC_DOMAIN_SAVE_IMAGE_DEFINE_XML,
1967             { file => $file, dxml => $dxml, flags => $flags // 0 }, empty => 1 );
1968             }
1969              
1970 0     0 1   async method domain_save_image_get_xml_desc($file, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
1971 0           return await $self->_call(
1972             $remote->PROC_DOMAIN_SAVE_IMAGE_GET_XML_DESC,
1973             { file => $file, flags => $flags // 0 }, unwrap => 'xml' );
1974             }
1975              
1976 0     0 1   async method domain_xml_from_native($nativeFormat, $nativeConfig, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
1977 0           return await $self->_call(
1978             $remote->PROC_CONNECT_DOMAIN_XML_FROM_NATIVE,
1979             { nativeFormat => $nativeFormat, nativeConfig => $nativeConfig, flags => $flags // 0 }, unwrap => 'domainXml' );
1980             }
1981              
1982 0     0 1   async method domain_xml_to_native($nativeFormat, $domainXml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
1983 0           return await $self->_call(
1984             $remote->PROC_CONNECT_DOMAIN_XML_TO_NATIVE,
1985             { nativeFormat => $nativeFormat, domainXml => $domainXml, flags => $flags // 0 }, unwrap => 'nativeConfig' );
1986             }
1987              
1988 0     0 1   async method find_storage_pool_sources($type, $srcSpec, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
1989 0           return await $self->_call(
1990             $remote->PROC_CONNECT_FIND_STORAGE_POOL_SOURCES,
1991             { type => $type, srcSpec => $srcSpec, flags => $flags // 0 }, unwrap => 'xml' );
1992             }
1993              
1994 0     0 1   async method get_all_domain_stats($doms, $stats, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
1995 0           return await $self->_call(
1996             $remote->PROC_CONNECT_GET_ALL_DOMAIN_STATS,
1997             { doms => $doms, stats => $stats, flags => $flags // 0 }, unwrap => 'retStats' );
1998             }
1999              
2000 0     0 1   async method get_capabilities() {
  0            
  0            
  0            
2001 0           return await $self->_call(
2002             $remote->PROC_CONNECT_GET_CAPABILITIES,
2003             { }, unwrap => 'capabilities' );
2004             }
2005              
2006 0     0 1   async method get_cpu_model_names($arch, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2007 0           return await $self->_call(
2008             $remote->PROC_CONNECT_GET_CPU_MODEL_NAMES,
2009             { arch => $arch, need_results => $remote->CPU_MODELS_MAX, flags => $flags // 0 }, unwrap => 'models' );
2010             }
2011              
2012 0     0 1   async method get_domain_capabilities($emulatorbin, $arch, $machine, $virttype, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
  0            
  0            
  0            
2013 0           return await $self->_call(
2014             $remote->PROC_CONNECT_GET_DOMAIN_CAPABILITIES,
2015             { emulatorbin => $emulatorbin, arch => $arch, machine => $machine, virttype => $virttype, flags => $flags // 0 }, unwrap => 'capabilities' );
2016             }
2017              
2018 0     0 1   async method get_hostname() {
  0            
  0            
  0            
2019 0           return await $self->_call(
2020             $remote->PROC_CONNECT_GET_HOSTNAME,
2021             { }, unwrap => 'hostname' );
2022             }
2023              
2024 0     0 1   async method get_lib_version() {
  0            
  0            
  0            
2025 0           return await $self->_call(
2026             $remote->PROC_CONNECT_GET_LIB_VERSION,
2027             { }, unwrap => 'lib_ver' );
2028             }
2029              
2030 0     0 1   async method get_max_vcpus($type) {
  0            
  0            
  0            
  0            
2031 0           return await $self->_call(
2032             $remote->PROC_CONNECT_GET_MAX_VCPUS,
2033             { type => $type }, unwrap => 'max_vcpus' );
2034             }
2035              
2036 0     0 1   async method get_storage_pool_capabilities($flags = 0) {
  0            
  0            
  0            
  0            
2037 0           return await $self->_call(
2038             $remote->PROC_CONNECT_GET_STORAGE_POOL_CAPABILITIES,
2039             { flags => $flags // 0 }, unwrap => 'capabilities' );
2040             }
2041              
2042 0     0 1   async method get_sysinfo($flags = 0) {
  0            
  0            
  0            
  0            
2043 0           return await $self->_call(
2044             $remote->PROC_CONNECT_GET_SYSINFO,
2045             { flags => $flags // 0 }, unwrap => 'sysinfo' );
2046             }
2047              
2048 0     0 1   async method get_type() {
  0            
  0            
  0            
2049 0           return await $self->_call(
2050             $remote->PROC_CONNECT_GET_TYPE,
2051             { }, unwrap => 'type' );
2052             }
2053              
2054 0     0 1   async method get_uri() {
  0            
  0            
  0            
2055 0           return await $self->_call(
2056             $remote->PROC_CONNECT_GET_URI,
2057             { }, unwrap => 'uri' );
2058             }
2059              
2060 0     0 1   async method get_version() {
  0            
  0            
  0            
2061 0           return await $self->_call(
2062             $remote->PROC_CONNECT_GET_VERSION,
2063             { }, unwrap => 'hv_ver' );
2064             }
2065              
2066 0     0 1   method interface_change_begin($flags = 0) {
  0            
  0            
  0            
2067 0   0       return $self->_call(
2068             $remote->PROC_INTERFACE_CHANGE_BEGIN,
2069             { flags => $flags // 0 }, empty => 1 );
2070             }
2071              
2072 0     0 1   method interface_change_commit($flags = 0) {
  0            
  0            
  0            
2073 0   0       return $self->_call(
2074             $remote->PROC_INTERFACE_CHANGE_COMMIT,
2075             { flags => $flags // 0 }, empty => 1 );
2076             }
2077              
2078 0     0 1   method interface_change_rollback($flags = 0) {
  0            
  0            
  0            
2079 0   0       return $self->_call(
2080             $remote->PROC_INTERFACE_CHANGE_ROLLBACK,
2081             { flags => $flags // 0 }, empty => 1 );
2082             }
2083              
2084 0     0 1   async method interface_define_xml($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2085 0           return await $self->_call(
2086             $remote->PROC_INTERFACE_DEFINE_XML,
2087             { xml => $xml, flags => $flags // 0 }, unwrap => 'iface' );
2088             }
2089              
2090 0     0 1   async method interface_lookup_by_mac_string($mac) {
  0            
  0            
  0            
  0            
2091 0           return await $self->_call(
2092             $remote->PROC_INTERFACE_LOOKUP_BY_MAC_STRING,
2093             { mac => $mac }, unwrap => 'iface' );
2094             }
2095              
2096 0     0 1   async method interface_lookup_by_name($name) {
  0            
  0            
  0            
  0            
2097 0           return await $self->_call(
2098             $remote->PROC_INTERFACE_LOOKUP_BY_NAME,
2099             { name => $name }, unwrap => 'iface' );
2100             }
2101              
2102 0     0 1   async method list_all_domains($flags = 0) {
  0            
  0            
  0            
  0            
2103 0           return await $self->_call(
2104             $remote->PROC_CONNECT_LIST_ALL_DOMAINS,
2105             { need_results => $remote->DOMAIN_LIST_MAX, flags => $flags // 0 }, unwrap => 'domains' );
2106             }
2107              
2108 0     0 1   async method list_all_interfaces($flags = 0) {
  0            
  0            
  0            
  0            
2109 0           return await $self->_call(
2110             $remote->PROC_CONNECT_LIST_ALL_INTERFACES,
2111             { need_results => $remote->INTERFACE_LIST_MAX, flags => $flags // 0 }, unwrap => 'ifaces' );
2112             }
2113              
2114 0     0 1   async method list_all_networks($flags = 0) {
  0            
  0            
  0            
  0            
2115 0           return await $self->_call(
2116             $remote->PROC_CONNECT_LIST_ALL_NETWORKS,
2117             { need_results => $remote->NETWORK_LIST_MAX, flags => $flags // 0 }, unwrap => 'nets' );
2118             }
2119              
2120 0     0 1   async method list_all_node_devices($flags = 0) {
  0            
  0            
  0            
  0            
2121 0           return await $self->_call(
2122             $remote->PROC_CONNECT_LIST_ALL_NODE_DEVICES,
2123             { need_results => $remote->NODE_DEVICE_LIST_MAX, flags => $flags // 0 }, unwrap => 'devices' );
2124             }
2125              
2126 0     0 1   async method list_all_nwfilter_bindings($flags = 0) {
  0            
  0            
  0            
  0            
2127 0           return await $self->_call(
2128             $remote->PROC_CONNECT_LIST_ALL_NWFILTER_BINDINGS,
2129             { need_results => $remote->NWFILTER_BINGING_LIST_MAX, flags => $flags // 0 }, unwrap => 'bindings' );
2130             }
2131              
2132 0     0 1   async method list_all_nwfilters($flags = 0) {
  0            
  0            
  0            
  0            
2133 0           return await $self->_call(
2134             $remote->PROC_CONNECT_LIST_ALL_NWFILTERS,
2135             { need_results => $remote->NWFILTER_LIST_MAX, flags => $flags // 0 }, unwrap => 'filters' );
2136             }
2137              
2138 0     0 1   async method list_all_secrets($flags = 0) {
  0            
  0            
  0            
  0            
2139 0           return await $self->_call(
2140             $remote->PROC_CONNECT_LIST_ALL_SECRETS,
2141             { need_results => $remote->SECRET_LIST_MAX, flags => $flags // 0 }, unwrap => 'secrets' );
2142             }
2143              
2144 0     0 1   async method list_all_storage_pools($flags = 0) {
  0            
  0            
  0            
  0            
2145 0           return await $self->_call(
2146             $remote->PROC_CONNECT_LIST_ALL_STORAGE_POOLS,
2147             { need_results => $remote->STORAGE_POOL_LIST_MAX, flags => $flags // 0 }, unwrap => 'pools' );
2148             }
2149              
2150 0     0 1   async method list_defined_domains() {
  0            
  0            
  0            
2151 0           return await $self->_call(
2152             $remote->PROC_CONNECT_LIST_DEFINED_DOMAINS,
2153             { maxnames => $remote->DOMAIN_LIST_MAX }, unwrap => 'names' );
2154             }
2155              
2156 0     0 1   async method list_defined_interfaces() {
  0            
  0            
  0            
2157 0           return await $self->_call(
2158             $remote->PROC_CONNECT_LIST_DEFINED_INTERFACES,
2159             { maxnames => $remote->INTERFACE_LIST_MAX }, unwrap => 'names' );
2160             }
2161              
2162 0     0 1   async method list_defined_networks() {
  0            
  0            
  0            
2163 0           return await $self->_call(
2164             $remote->PROC_CONNECT_LIST_DEFINED_NETWORKS,
2165             { maxnames => $remote->NETWORK_LIST_MAX }, unwrap => 'names' );
2166             }
2167              
2168 0     0 1   async method list_defined_storage_pools() {
  0            
  0            
  0            
2169 0           return await $self->_call(
2170             $remote->PROC_CONNECT_LIST_DEFINED_STORAGE_POOLS,
2171             { maxnames => $remote->STORAGE_POOL_LIST_MAX }, unwrap => 'names' );
2172             }
2173              
2174 0     0 1   async method list_domains() {
  0            
  0            
  0            
2175 0           return await $self->_call(
2176             $remote->PROC_CONNECT_LIST_DOMAINS,
2177             { maxids => $remote->DOMAIN_LIST_MAX }, unwrap => 'ids' );
2178             }
2179              
2180 0     0 1   async method list_interfaces() {
  0            
  0            
  0            
2181 0           return await $self->_call(
2182             $remote->PROC_CONNECT_LIST_INTERFACES,
2183             { maxnames => $remote->INTERFACE_LIST_MAX }, unwrap => 'names' );
2184             }
2185              
2186 0     0 1   async method list_networks() {
  0            
  0            
  0            
2187 0           return await $self->_call(
2188             $remote->PROC_CONNECT_LIST_NETWORKS,
2189             { maxnames => $remote->NETWORK_LIST_MAX }, unwrap => 'names' );
2190             }
2191              
2192 0     0 1   async method list_nwfilters() {
  0            
  0            
  0            
2193 0           return await $self->_call(
2194             $remote->PROC_CONNECT_LIST_NWFILTERS,
2195             { maxnames => $remote->NWFILTER_LIST_MAX }, unwrap => 'names' );
2196             }
2197              
2198 0     0 1   async method list_secrets() {
  0            
  0            
  0            
2199 0           return await $self->_call(
2200             $remote->PROC_CONNECT_LIST_SECRETS,
2201             { maxuuids => $remote->SECRET_LIST_MAX }, unwrap => 'uuids' );
2202             }
2203              
2204 0     0 1   async method list_storage_pools() {
  0            
  0            
  0            
2205 0           return await $self->_call(
2206             $remote->PROC_CONNECT_LIST_STORAGE_POOLS,
2207             { maxnames => $remote->STORAGE_POOL_LIST_MAX }, unwrap => 'names' );
2208             }
2209              
2210 0     0 1   async method network_create_xml($xml) {
  0            
  0            
  0            
  0            
2211 0           return await $self->_call(
2212             $remote->PROC_NETWORK_CREATE_XML,
2213             { xml => $xml }, unwrap => 'net' );
2214             }
2215              
2216 0     0 1   async method network_create_xml_flags($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2217 0           return await $self->_call(
2218             $remote->PROC_NETWORK_CREATE_XML_FLAGS,
2219             { xml => $xml, flags => $flags // 0 }, unwrap => 'net' );
2220             }
2221              
2222 0     0 1   async method network_define_xml($xml) {
  0            
  0            
  0            
  0            
2223 0           return await $self->_call(
2224             $remote->PROC_NETWORK_DEFINE_XML,
2225             { xml => $xml }, unwrap => 'net' );
2226             }
2227              
2228 0     0 1   async method network_define_xml_flags($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2229 0           return await $self->_call(
2230             $remote->PROC_NETWORK_DEFINE_XML_FLAGS,
2231             { xml => $xml, flags => $flags // 0 }, unwrap => 'net' );
2232             }
2233              
2234 0     0 1   async method network_lookup_by_name($name) {
  0            
  0            
  0            
  0            
2235 0           return await $self->_call(
2236             $remote->PROC_NETWORK_LOOKUP_BY_NAME,
2237             { name => $name }, unwrap => 'net' );
2238             }
2239              
2240 0     0 1   async method network_lookup_by_uuid($uuid) {
  0            
  0            
  0            
  0            
2241 0           return await $self->_call(
2242             $remote->PROC_NETWORK_LOOKUP_BY_UUID,
2243             { uuid => $uuid }, unwrap => 'net' );
2244             }
2245              
2246 0     0 1   async method node_get_cpu_stats($cpuNum, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2247 0           my $nparams = await $self->_call(
2248             $remote->PROC_NODE_GET_CPU_STATS,
2249             { cpuNum => $cpuNum, nparams => 0, flags => $flags // 0 }, unwrap => 'nparams' );
2250 0           return await $self->_call(
2251             $remote->PROC_NODE_GET_CPU_STATS,
2252             { cpuNum => $cpuNum, nparams => $nparams, flags => $flags // 0 }, unwrap => 'params' );
2253             }
2254              
2255 0     0 1   async method node_get_free_memory() {
  0            
  0            
  0            
2256 0           return await $self->_call(
2257             $remote->PROC_NODE_GET_FREE_MEMORY,
2258             { }, unwrap => 'freeMem' );
2259             }
2260              
2261 0     0 1   method node_get_info() {
  0            
  0            
2262 0           return $self->_call(
2263             $remote->PROC_NODE_GET_INFO,
2264             { } );
2265             }
2266              
2267 0     0 1   async method node_get_memory_parameters($flags = 0) {
  0            
  0            
  0            
  0            
2268 0           $flags |= await $self->_typed_param_string_okay();
2269 0           my $nparams = await $self->_call(
2270             $remote->PROC_NODE_GET_MEMORY_PARAMETERS,
2271             { nparams => 0, flags => $flags // 0 }, unwrap => 'nparams' );
2272 0           return await $self->_call(
2273             $remote->PROC_NODE_GET_MEMORY_PARAMETERS,
2274             { nparams => $nparams, flags => $flags // 0 }, unwrap => 'params' );
2275             }
2276              
2277 0     0 1   async method node_get_memory_stats($cellNum, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2278 0           my $nparams = await $self->_call(
2279             $remote->PROC_NODE_GET_MEMORY_STATS,
2280             { nparams => 0, cellNum => $cellNum, flags => $flags // 0 }, unwrap => 'nparams' );
2281 0           return await $self->_call(
2282             $remote->PROC_NODE_GET_MEMORY_STATS,
2283             { nparams => $nparams, cellNum => $cellNum, flags => $flags // 0 }, unwrap => 'params' );
2284             }
2285              
2286 0     0 1   method node_get_security_model() {
  0            
  0            
2287 0           return $self->_call(
2288             $remote->PROC_NODE_GET_SECURITY_MODEL,
2289             { } );
2290             }
2291              
2292 0     0 1   async method node_get_sev_info($flags = 0) {
  0            
  0            
  0            
  0            
2293 0           $flags |= await $self->_typed_param_string_okay();
2294 0           my $nparams = await $self->_call(
2295             $remote->PROC_NODE_GET_SEV_INFO,
2296             { nparams => 0, flags => $flags // 0 }, unwrap => 'nparams' );
2297 0           return await $self->_call(
2298             $remote->PROC_NODE_GET_SEV_INFO,
2299             { nparams => $nparams, flags => $flags // 0 }, unwrap => 'params' );
2300             }
2301              
2302 0     0 1   async method node_list_devices($cap, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2303 0           return await $self->_call(
2304             $remote->PROC_NODE_LIST_DEVICES,
2305             { cap => $cap, maxnames => $remote->NODE_DEVICE_LIST_MAX, flags => $flags // 0 }, unwrap => 'names' );
2306             }
2307              
2308 0     0 1   async method node_num_of_devices($cap, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2309 0           return await $self->_call(
2310             $remote->PROC_NODE_NUM_OF_DEVICES,
2311             { cap => $cap, flags => $flags // 0 }, unwrap => 'num' );
2312             }
2313              
2314 0     0 1   async method node_set_memory_parameters($params, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2315 0           $params = await $self->_filter_typed_param_string( $params );
2316 0           return await $self->_call(
2317             $remote->PROC_NODE_SET_MEMORY_PARAMETERS,
2318             { params => $params, flags => $flags // 0 }, empty => 1 );
2319             }
2320              
2321 0     0 1   method node_suspend_for_duration($target, $duration, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2322 0   0       return $self->_call(
2323             $remote->PROC_NODE_SUSPEND_FOR_DURATION,
2324             { target => $target, duration => $duration, flags => $flags // 0 }, empty => 1 );
2325             }
2326              
2327 0     0 1   async method num_of_defined_domains() {
  0            
  0            
  0            
2328 0           return await $self->_call(
2329             $remote->PROC_CONNECT_NUM_OF_DEFINED_DOMAINS,
2330             { }, unwrap => 'num' );
2331             }
2332              
2333 0     0 1   async method num_of_defined_interfaces() {
  0            
  0            
  0            
2334 0           return await $self->_call(
2335             $remote->PROC_CONNECT_NUM_OF_DEFINED_INTERFACES,
2336             { }, unwrap => 'num' );
2337             }
2338              
2339 0     0 1   async method num_of_defined_networks() {
  0            
  0            
  0            
2340 0           return await $self->_call(
2341             $remote->PROC_CONNECT_NUM_OF_DEFINED_NETWORKS,
2342             { }, unwrap => 'num' );
2343             }
2344              
2345 0     0 1   async method num_of_defined_storage_pools() {
  0            
  0            
  0            
2346 0           return await $self->_call(
2347             $remote->PROC_CONNECT_NUM_OF_DEFINED_STORAGE_POOLS,
2348             { }, unwrap => 'num' );
2349             }
2350              
2351 0     0 1   async method num_of_domains() {
  0            
  0            
  0            
2352 0           return await $self->_call(
2353             $remote->PROC_CONNECT_NUM_OF_DOMAINS,
2354             { }, unwrap => 'num' );
2355             }
2356              
2357 0     0 1   async method num_of_interfaces() {
  0            
  0            
  0            
2358 0           return await $self->_call(
2359             $remote->PROC_CONNECT_NUM_OF_INTERFACES,
2360             { }, unwrap => 'num' );
2361             }
2362              
2363 0     0 1   async method num_of_networks() {
  0            
  0            
  0            
2364 0           return await $self->_call(
2365             $remote->PROC_CONNECT_NUM_OF_NETWORKS,
2366             { }, unwrap => 'num' );
2367             }
2368              
2369 0     0 1   async method num_of_nwfilters() {
  0            
  0            
  0            
2370 0           return await $self->_call(
2371             $remote->PROC_CONNECT_NUM_OF_NWFILTERS,
2372             { }, unwrap => 'num' );
2373             }
2374              
2375 0     0 1   async method num_of_secrets() {
  0            
  0            
  0            
2376 0           return await $self->_call(
2377             $remote->PROC_CONNECT_NUM_OF_SECRETS,
2378             { }, unwrap => 'num' );
2379             }
2380              
2381 0     0 1   async method num_of_storage_pools() {
  0            
  0            
  0            
2382 0           return await $self->_call(
2383             $remote->PROC_CONNECT_NUM_OF_STORAGE_POOLS,
2384             { }, unwrap => 'num' );
2385             }
2386              
2387 0     0 1   async method nwfilter_binding_create_xml($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2388 0           return await $self->_call(
2389             $remote->PROC_NWFILTER_BINDING_CREATE_XML,
2390             { xml => $xml, flags => $flags // 0 }, unwrap => 'nwfilter' );
2391             }
2392              
2393 0     0 1   async method nwfilter_binding_lookup_by_port_dev($name) {
  0            
  0            
  0            
  0            
2394 0           return await $self->_call(
2395             $remote->PROC_NWFILTER_BINDING_LOOKUP_BY_PORT_DEV,
2396             { name => $name }, unwrap => 'nwfilter' );
2397             }
2398              
2399 0     0 1   async method nwfilter_define_xml($xml) {
  0            
  0            
  0            
  0            
2400 0           return await $self->_call(
2401             $remote->PROC_NWFILTER_DEFINE_XML,
2402             { xml => $xml }, unwrap => 'nwfilter' );
2403             }
2404              
2405 0     0 1   async method nwfilter_define_xml_flags($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2406 0           return await $self->_call(
2407             $remote->PROC_NWFILTER_DEFINE_XML_FLAGS,
2408             { xml => $xml, flags => $flags // 0 }, unwrap => 'nwfilter' );
2409             }
2410              
2411 0     0 1   async method nwfilter_lookup_by_name($name) {
  0            
  0            
  0            
  0            
2412 0           return await $self->_call(
2413             $remote->PROC_NWFILTER_LOOKUP_BY_NAME,
2414             { name => $name }, unwrap => 'nwfilter' );
2415             }
2416              
2417 0     0 1   async method nwfilter_lookup_by_uuid($uuid) {
  0            
  0            
  0            
  0            
2418 0           return await $self->_call(
2419             $remote->PROC_NWFILTER_LOOKUP_BY_UUID,
2420             { uuid => $uuid }, unwrap => 'nwfilter' );
2421             }
2422              
2423 0     0 1   async method secret_define_xml($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2424 0           return await $self->_call(
2425             $remote->PROC_SECRET_DEFINE_XML,
2426             { xml => $xml, flags => $flags // 0 }, unwrap => 'secret' );
2427             }
2428              
2429 0     0 1   async method secret_lookup_by_usage($usageType, $usageID) {
  0            
  0            
  0            
  0            
  0            
2430 0           return await $self->_call(
2431             $remote->PROC_SECRET_LOOKUP_BY_USAGE,
2432             { usageType => $usageType, usageID => $usageID }, unwrap => 'secret' );
2433             }
2434              
2435 0     0 1   async method secret_lookup_by_uuid($uuid) {
  0            
  0            
  0            
  0            
2436 0           return await $self->_call(
2437             $remote->PROC_SECRET_LOOKUP_BY_UUID,
2438             { uuid => $uuid }, unwrap => 'secret' );
2439             }
2440              
2441 0     0 1   async method set_identity($params, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2442 0           $params = await $self->_filter_typed_param_string( $params );
2443 0           return await $self->_call(
2444             $remote->PROC_CONNECT_SET_IDENTITY,
2445             { params => $params, flags => $flags // 0 }, empty => 1 );
2446             }
2447              
2448 0     0 1   async method storage_pool_create_xml($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2449 0           return await $self->_call(
2450             $remote->PROC_STORAGE_POOL_CREATE_XML,
2451             { xml => $xml, flags => $flags // 0 }, unwrap => 'pool' );
2452             }
2453              
2454 0     0 1   async method storage_pool_define_xml($xml, $flags = 0) {
  0            
  0            
  0            
  0            
  0            
2455 0           return await $self->_call(
2456             $remote->PROC_STORAGE_POOL_DEFINE_XML,
2457             { xml => $xml, flags => $flags // 0 }, unwrap => 'pool' );
2458             }
2459              
2460 0     0 1   async method storage_pool_lookup_by_name($name) {
  0            
  0            
  0            
  0            
2461 0           return await $self->_call(
2462             $remote->PROC_STORAGE_POOL_LOOKUP_BY_NAME,
2463             { name => $name }, unwrap => 'pool' );
2464             }
2465              
2466 0     0 1   async method storage_pool_lookup_by_target_path($path) {
  0            
  0            
  0            
  0            
2467 0           return await $self->_call(
2468             $remote->PROC_STORAGE_POOL_LOOKUP_BY_TARGET_PATH,
2469             { path => $path }, unwrap => 'pool' );
2470             }
2471              
2472 0     0 1   async method storage_pool_lookup_by_uuid($uuid) {
  0            
  0            
  0            
  0            
2473 0           return await $self->_call(
2474             $remote->PROC_STORAGE_POOL_LOOKUP_BY_UUID,
2475             { uuid => $uuid }, unwrap => 'pool' );
2476             }
2477              
2478 0     0 1   async method storage_vol_lookup_by_key($key) {
  0            
  0            
  0            
  0            
2479 0           return await $self->_call(
2480             $remote->PROC_STORAGE_VOL_LOOKUP_BY_KEY,
2481             { key => $key }, unwrap => 'vol' );
2482             }
2483              
2484 0     0 1   async method storage_vol_lookup_by_path($path) {
  0            
  0            
  0            
  0            
2485 0           return await $self->_call(
2486             $remote->PROC_STORAGE_VOL_LOOKUP_BY_PATH,
2487             { path => $path }, unwrap => 'vol' );
2488             }
2489              
2490              
2491             1;
2492              
2493             __END__