File: StoragePool.pm

package info (click to toggle)
libsys-virt-perl 5.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 932 kB
  • sloc: perl: 2,035; sh: 12; makefile: 3
file content (553 lines) | stat: -rw-r--r-- 13,234 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
# -*- perl -*-
#
# Copyright (C) 2006-2009 Red Hat
# Copyright (C) 2006-2009 Daniel P. Berrange
#
# This program is free software; You can redistribute it and/or modify
# it under either:
#
# a) the GNU General Public License as published by the Free
#   Software Foundation; either version 2, or (at your option) any
#   later version,
#
# or
#
# b) the "Artistic License"
#
# The file "LICENSE" distributed along with this file provides full
# details of the terms and conditions of the two licenses.

=pod

=head1 NAME

Sys::Virt::StoragePool - Represent & manage a libvirt storage pool

=head1 DESCRIPTION

The C<Sys::Virt::StoragePool> module represents a storage pool managed
by libvirt. There are a variety of storage pool implementations for
LVM, Local directories/filesystems, network filesystems, disk
partitioning, iSCSI, and SCSI.

=head1 METHODS

=over 4

=cut

package Sys::Virt::StoragePool;

use strict;
use warnings;


sub _new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my %params = @_;

    my $con = exists $params{connection} ? $params{connection} : die "connection parameter is required";
    my $self;
    if (exists $params{name}) {
	$self = Sys::Virt::StoragePool::_lookup_by_name($con,  $params{name});
    } elsif (exists $params{uuid}) {
	if (length($params{uuid}) == 16) {
	    $self = Sys::Virt::StoragePool::_lookup_by_uuid($con,  $params{uuid});
	} elsif (length($params{uuid}) == 32 ||
		 length($params{uuid}) == 36) {
	    $self = Sys::Virt::StoragePool::_lookup_by_uuid_string($con,  $params{uuid});
	} else {
	    die "UUID must be either 16 unsigned bytes, or 32/36 hex characters long";
	}
    } elsif (exists $params{volume}) {
	$self = Sys::Virt::StoragePool::_lookup_by_volume($params{volume});
    } elsif (exists $params{target_path}) {
	$self = Sys::Virt::StoragePool::_lookup_by_target_path($con,  $params{target_path});
    } elsif (exists $params{xml}) {
	if ($params{nocreate}) {
	    $self = Sys::Virt::StoragePool::_define_xml($con,  $params{xml});
	} else {
	    $self = Sys::Virt::StoragePool::_create_xml($con,  $params{xml});
	}
    } else {
	die "address, id or uuid parameters are required";
    }

    bless $self, $class;

    return $self;
}


=item my $uuid = $pool->get_uuid()

Returns a 16 byte long string containing the raw globally unique identifier
(UUID) for the storage pool.

=item my $uuid = $pool->get_uuid_string()

Returns a printable string representation of the raw UUID, in the format
'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'.

=item my $name = $pool->get_name()

Returns a string with a locally unique name of the storage pool

=item $pool->is_active()

Returns a true value if the storage pool is currently running

=item $pool->is_persistent()

Returns a true value if the storage pool has a persistent configuration
file defined

=item my $xml = $pool->get_xml_description()

Returns an XML document containing a complete description of
the storage pool's configuration

=item $pool->create()

Start a storage pool whose configuration was previously defined using the
C<define_storage_pool> method in L<Sys::Virt>.

=item $pool->undefine()

Remove the configuration associated with a storage pool previously defined
with the C<define_storage pool> method in L<Sys::Virt>. If the storage pool is
running, you probably want to use the C<destroy> method instead.

=item $pool->destroy()

Immediately stop the storage pool.

=item $flag = $pool->get_autostart();

Return a true value if the storage pool is configured to automatically
start upon boot. Return false, otherwise

=item $pool->set_autostart($flag)

Set the state of the autostart flag, which determines whether the
storage pool will automatically start upon boot of the host OS

=item $pool->refresh([$flags]);

Refresh the storage pool state. Typically this will rescan the list
of storage volumes. The C<$flags> parameter is currently unused and
if omitted defaults to zero.

=item $pool->build([$flags]);

Construct the storage pool if it does not exist. As an example, for
a disk based storage pool this would ensure a partition table exists.
The C<$flags> parameter allows control over the build operation
and if omitted defaults to zero.

=item $pool->delete([$flags]);

Delete the storage pool. The C<$flags> parameter allows the data to
be optionally wiped during delete and if omitted defaults to zero.

=item $info = $pool->get_info()

Retrieve information about the current storage pool state. The
returned hash reference has the following keys

=over 4

=item state

The current status of the storage pool. See constants later.

=item capacity

The total logical size of the storage pool

=item allocation

The current physical allocation of the storage pool

=item available

The available space for creation of new volumes. This may
be less than the difference between capacity & allocation
if there are sizing / metadata constraints for volumes

=back

=item my $nnames = $pool->num_of_storage_volumes()

Return the number of running volumes in this storage pool. The value
can be used as the C<maxnames> parameter to C<list_storage_vol_names>.

=item my @volNames = $pool->list_storage_vol_names($maxnames)

Return a list of all volume names in this storage pool. The names can
be used with the C<get_volume_by_name> method.

=item my @vols = $pool->list_volumes()

Return a list of all volumes in the storage pool.
The elements in the returned list are instances of the
L<Sys::Virt::StorageVol> class. This method requires O(n)
RPC calls, so the C<list_all_volumes> method is
recommended as a more efficient alternative.

=cut

sub list_volumes {
    my $self = shift;

    my $nnames = $self->num_of_storage_volumes();
    my @names = $self->list_storage_vol_names($nnames);

    my @volumes;
    foreach my $name (@names) {
	eval {
	    push @volumes, Sys::Virt::StorageVol->_new(pool => $self, name => $name);
	};
	if ($@) {
	    # nada - volume went away before we could look it up
	};
    }
    return @volumes;
}


=item my @volumes = $pool->list_all_volumes($flags)

Return a list of all storage volumes associated with this pool.
The elements in the returned list are instances of the
L<Sys::Virt::StorageVol> class. The C<$flags> parameter can be
used to filter the list of return storage volumes.

=item my $vol = $pool->get_volume_by_name($name)

Return the volume with a name of C<$name>. The returned object is
an instance of the L<Sys::Virt::StorageVol> class.

=cut

sub get_volume_by_name {
    my $self = shift;
    my $name = shift;

    return Sys::Virt::StorageVol->_new(pool => $self, name => $name);
}

=item my $vol = $pool->create_volume($xml)

Create a new volume based on the XML description passed into the C<$xml>
parameter. The returned object is an instance of the L<Sys::Virt::StorageVol>
class. If the optional C<clonevol> is provided, data will be copied from
that source volume

=cut

sub create_volume {
    my $self = shift;
    my $xml = shift;

    return Sys::Virt::StorageVol->_new(pool => $self, xml => $xml);
}

=item my $vol = $pool->clone_volume($xml, $clonevol);

Create a new volume based on the XML description passed into the C<$xml>
parameter. The returned object is an instance of the L<Sys::Virt::StorageVol>
class. The new volume will be populated with data from the specified clone
source volume.

=cut


sub clone_volume {
    my $self = shift;
    my $xml = shift;
    my $clone = shift;

    return Sys::Virt::StorageVol->_new(pool => $self, xml => $xml, clone => $clone);
}

1;

=back

=head1 CONSTANTS

The following sets of constants may be useful in dealing with some of
the methods in this package

=head2 POOL STATES

The following constants are useful for interpreting the C<state>
key value in the hash returned by C<get_info>

=over 4

=item Sys::Virt::StoragePool::STATE_INACTIVE

The storage pool is not currently active

=item Sys::Virt::StoragePool::STATE_BUILDING

The storage pool is still being constructed and is not ready for use
yet.

=item Sys::Virt::StoragePool::STATE_RUNNING

The storage pool is running and can be queried for volumes

=item Sys::Virt::StoragePool::STATE_DEGRADED

The storage pool is running, but its operation is degraded due
to a failure.

=item Sys::Virt::StoragePool::STATE_INACCESSIBLE

The storage pool is not currently accessible

=back

=head2 DELETION MODES

=over 4

=item Sys::Virt::StoragePool::DELETE_NORMAL

Delete the pool without any attempt to scrub data

=item Sys::Virt::StoragePool::DELETE_ZEROED

Fill the allocated storage with zeros when deleting

=back


=head2 BUILD MODES

=over 4

=item Sys::Virt::StoragePool::BUILD_NEW

Construct a new storage pool from constituent bits

=item Sys::Virt::StoragePool::BUILD_RESIZE

Resize an existing built storage pool preserving data where
appropriate

=item Sys::Virt::StoragePool::BUILD_REPAIR

Repair an existing storage pool operating in degraded mode

=item Sys::Virt::StoragePool::BUILD_NO_OVERWRITE

Do not overwrite existing storage pool data

=item Sys::Virt::StoragePool::BUILD_OVERWRITE

Overwrite existing storage pool data

=back

=head2 CREATE MODES

When creating a storage pool it can be built at the same time.
The following values are therefore close to their BUILD
counterparts.

=over 4

=item Sys::Virt::StoragePool::CREATE_NORMAL

Just create the storage pool without building it.

=item Sys::Virt::StoragePool::CREATE_WITH_BUILD

When creating new storage pool also perform pool build without any flags.

=item Sys::Virt::StoragePool::CREATE_WITH_BUILD_OVERWRITE

Create the pool and perform pool build using the BUILD_OVERWRITE
flag. This is mutually exclusive to CREATE_WITH_BUILD_NO_OVERWRITE.

=item Sys::Virt::StoragePool::CREATE_WITH_BUILD_NO_OVERWRITE

Create the pool and perform pool build using the BUILD_NO_OVERWRITE
flag. This is mutually exclusive to CREATE_WITH_BUILD_OVERWRITE.

=back

=head2 XML DOCUMENTS

The following constants are useful when requesting
XML for storage pools

=over 4

=item Sys::Virt::StoragePool::XML_INACTIVE

Return XML describing the inactive state of the storage
pool.

=back

=head1 LIST FILTERING

The following constants are used to filter object lists

=over 4

=item Sys::Virt::StoragePool::LIST_ACTIVE

Include storage pools which are active

=item Sys::Virt::StoragePool::LIST_INACTIVE

Include storage pools which are inactive

=item Sys::Virt::StoragePool::LIST_AUTOSTART

Include storage pools which are marked for autostart

=item Sys::Virt::StoragePool::LIST_NO_AUTOSTART

Include storage pools which are not marked for autostart

=item Sys::Virt::StoragePool::LIST_PERSISTENT

Include storage pools which are persistent

=item Sys::Virt::StoragePool::LIST_TRANSIENT

Include storage pools which are transient

=item Sys::Virt::StoragePool::LIST_DIR

Include directory storage pools

=item Sys::Virt::StoragePool::LIST_DISK

Include disk storage pools

=item Sys::Virt::StoragePool::LIST_FS

Include filesystem storage pools

=item Sys::Virt::StoragePool::LIST_ISCSI

Include iSCSI storage pools

=item Sys::Virt::StoragePool::LIST_LOGICAL

Include LVM storage pools

=item Sys::Virt::StoragePool::LIST_MPATH

Include multipath storage pools

=item Sys::Virt::StoragePool::LIST_NETFS

Include network filesystem storage pools

=item Sys::Virt::StoragePool::LIST_RBD

Include RBD storage pools

=item Sys::Virt::StoragePool::LIST_SCSI

Include SCSI storage pools

=item Sys::Virt::StoragePool::LIST_SHEEPDOG

Include sheepdog storage pools

=item Sys::Virt::StoragePool::LIST_GLUSTER

Include gluster storage pools

=item Sys::Virt::StoragePool::LIST_ZFS

Include ZFS storage pools

=item Sys::Virt::StoragePool::LIST_VSTORAGE

Include VStorage storage pools

=back

=head2 EVENT ID CONSTANTS

=over 4

=item Sys::Virt::StoragePool::EVENT_ID_LIFECYCLE

Storage pool lifecycle events

=item Sys::Virt::StoragePool::EVENT_ID_REFRESH

Storage pool volume refresh events

=back

=head2 LIFECYCLE CHANGE EVENTS

The following constants allow storage pool lifecycle change events
to be interpreted. The events contain both a state change, and a
reason though the reason is currently unused.

=over 4

=item Sys::Virt::StoragePool::EVENT_DEFINED

Indicates that a persistent configuration has been defined for
the storage pool

=item Sys::Virt::StoragePool::EVENT_STARTED

The storage pool has started running

=item Sys::Virt::StoragePool::EVENT_STOPPED

The storage pool has stopped running

=item Sys::Virt::StoragePool::EVENT_UNDEFINED

The persistent configuration has gone away

=item Sys::Virt::StoragePool::EVENT_CREATED

The underlying storage has been built

=item Sys::Virt::StoragePool::EVENT_DELETED

The underlying storage has been released

=back

=head1 AUTHORS

Daniel P. Berrange <berrange@redhat.com>

=head1 COPYRIGHT

Copyright (C) 2006-2009 Red Hat
Copyright (C) 2006-2009 Daniel P. Berrange

=head1 LICENSE

This program is free software; you can redistribute it and/or modify
it under the terms of either the GNU General Public License as published
by the Free Software Foundation (either version 2 of the License, or at
your option any later version), or, the Artistic License, as specified
in the Perl README file.

=head1 SEE ALSO

L<Sys::Virt>, L<Sys::Virt::Error>, C<http://libvirt.org>

=cut