Hi All,

Having recently had a need to manually export a VM from our RHEV environment I searched for a way to identify the VM's disks with the files on the storage system. The search led me to http://rhevdup.blogspot.com.au/2013/05/manual-export-of-vm-from-rhev.html but unfortunately, the script in that post only lists the first drive for a VM, making it less than useful for exporting VMs with multiple drives.

Inspired by that post I wrote my own version in Perl (I detest Python). The script works on our RHEV 3.4 with a Gluster storage back end. I would greatly appreciate it if some of you could test it on other RHEV/Ovirt versions and on different storage systems. Thanks for any feedback.

regards,
John


#! /usr/bin/env perl

# Run this script on the RHEV/Ovirt engine (management) machine
#
# Find the files on the storage which belong to a VM's disk(s)
# Input parameter: A single VM name (case sensitive)

use DBI;

my $vm = shift or die "No VM specified\n";

my $conf = '/etc/ovirt-engine/engine.conf.d/10-setup-database.conf';
my $host = 'localhost';
my $db;
my $user;
my $pass;
my $port = 5432;

open my $fi, '<', $conf or die "Can't read $conf\n";

while(<$fi>) {
    my $line = $_;
    $host = $1 if($line =~ /ENGINE_DB_HOST="(.*)"/);
    $db = $1 if($line =~ /ENGINE_DB_DATABASE="(.*)"/);
    $user = $1 if($line =~ /ENGINE_DB_USER="(.*)"/);
    $pass = $1 if($line =~ /ENGINE_DB_PASSWORD="(.*)"/);
    $port = $1 if($line =~ /ENGINE_DB_PORT="(.*)"/);
}

die "Unable to get all database details\n" if(!$db || !$user || !$pass);
my $dbh = DBI->connect("dbi:Pg:dbname=$db;host=$host;port=$port", $user, $pass, {AutoCommit=>1,RaiseError=>1,PrintError=>0});
die "Error connecting to the database\n" if(!$dbh);

# Get the device ID
my $sql = "select device_id from vms_for_disk_view where array_vm_names = '{$vm}'";
my @row = $dbh->selectrow_array($sql);
my $vm_id = $row[0];

if($vm_id) {
    print "\nVM ID:      $vm_id\n";

    # Get the drive ID(s)
$sql = "select image_guid, to_char(size/1024/1024/1024.0, '999G999D99'), to_char(actual_size/1024/1024/1024.0, '999G999D99'), storage_name from images_storage_domain_view where vm_names = '$vm' and entity_type = 'VM'"; my $sth = $dbh->prepare($sql) || die "Error preparing the SQL string \"$sql\"\n$dbh::errstr"; print "\nError executing $sql\n$DBI::errstr\n\n" unless $sth->execute();
    print "Disk ID(s): ";
    my $cnt = 0;

    while (@row = $sth->fetchrow_array) {
        print "            " if($cnt++);
print "$row[0], $row[1]GB allocated, $row[2]GB actual, on $row[3]\n";
    }

    $sth->finish;
    print "\n";
} else {
print "\nVM \"$vm\" not found. Be aware that the name is case sensitive.\n\n";
}

$dbh->disconnect;

_______________________________________________
Users mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/users

Reply via email to