[Libguestfs] [PATCH v2v] Add -ou option for setting output UUID.
Richard W.M. Jones
rjones at redhat.com
Thu Mar 24 11:46:08 UTC 2011
I'm not sure whether this patch is really necessary or a good idea.
It does make testing easier, since you can test virt-v2v on a single
host (using the -ou none option).
Note that current virt-v2v.git does not preserve the UUID in either of
the target cases (this is a regression/change from earlier behaviour).
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
-------------- next part --------------
>From 8b93d6fa151d3deb8dad69e05ae3730ed7d7fe38 Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Thu, 24 Mar 2011 11:42:59 +0000
Subject: [PATCH 2/2] Add -ou option for setting output UUID.
---
lib/Sys/VirtConvert/Connection/LibVirt.pm | 1 +
lib/Sys/VirtConvert/Connection/LibVirtTarget.pm | 41 +++++++++++++++++++++-
lib/Sys/VirtConvert/Connection/RHEVTarget.pm | 27 +++++++++++++--
v2v/virt-v2v.pl | 29 +++++++++++++++-
4 files changed, 92 insertions(+), 6 deletions(-)
diff --git a/lib/Sys/VirtConvert/Connection/LibVirt.pm b/lib/Sys/VirtConvert/Connection/LibVirt.pm
index b351296..dc2127c 100644
--- a/lib/Sys/VirtConvert/Connection/LibVirt.pm
+++ b/lib/Sys/VirtConvert/Connection/LibVirt.pm
@@ -159,6 +159,7 @@ sub _parse_dom
my $root = $dom->getDocumentElement();
$meta{name} = _node_val($root, 'name/text()');
+ $meta{uuid} = _node_val($root, 'uuid/text()');
$meta{memory} = _node_val($root, 'memory/text()') * 1024;
$meta{cpus} = _node_val($root, 'vcpu/text()');
$meta{arch} = _node_val($root, 'os/type/@arch');
diff --git a/lib/Sys/VirtConvert/Connection/LibVirtTarget.pm b/lib/Sys/VirtConvert/Connection/LibVirtTarget.pm
index 5b64278..c175655 100644
--- a/lib/Sys/VirtConvert/Connection/LibVirtTarget.pm
+++ b/lib/Sys/VirtConvert/Connection/LibVirtTarget.pm
@@ -261,7 +261,34 @@ sub guest_exists
return 1;
}
-=item create_guest(desc, meta, config, guestcaps, output_name)
+=item guest_uuid_exists(uuid)
+
+Return 1 if a guest with I<uuid> already exists, 0 otherwise.
+
+=cut
+
+sub guest_uuid_exists
+{
+ my $self = shift;
+ my ($uuid) = @_;
+
+ eval {
+ $self->{vmm}->get_domain_by_uuid($uuid);
+ };
+
+ if ($@) {
+ if ($@->code == Sys::Virt::Error::ERR_NO_DOMAIN) {
+ return 0;
+ }
+
+ v2vdie __x('Error checking for domain: {error}',
+ error => $@->stringify());
+ }
+
+ return 1;
+}
+
+=item create_guest(desc, meta, config, guestcaps, output_name, output_uuid)
Create the guest in the target
@@ -270,11 +297,20 @@ Create the guest in the target
sub create_guest
{
my $self = shift;
- my ($desc, $meta, $config, $guestcaps, $output_name) = @_;
+ my ($desc, $meta, $config, $guestcaps, $output_name, $output_uuid) = @_;
my $vmm = $self->{vmm};
$meta->{name} = $output_name;
+
+ if (defined $output_uuid) {
+ if ($output_uuid ne "none") {
+ $meta->{uuid} = $output_uuid;
+ } else {
+ delete $meta->{uuid};
+ }
+ }
+
_configure_capabilities($vmm, $meta, $guestcaps);
$vmm->define_domain(_meta_to_domxml($meta, $config, $guestcaps));
@@ -311,6 +347,7 @@ DOM
my $root = $dom->getDocumentElement();
_append_elem($root, 'name', $meta->{name});
+ _append_elem($root, 'uuid', $meta->{uuid}) if defined $meta->{uuid};
_append_elem($root, 'memory', $meta->{memory} / 1024);
_append_elem($root, 'vcpu', $meta->{cpus});
diff --git a/lib/Sys/VirtConvert/Connection/RHEVTarget.pm b/lib/Sys/VirtConvert/Connection/RHEVTarget.pm
index 4ebdcb9..42aa869 100644
--- a/lib/Sys/VirtConvert/Connection/RHEVTarget.pm
+++ b/lib/Sys/VirtConvert/Connection/RHEVTarget.pm
@@ -605,7 +605,18 @@ sub guest_exists
return 0;
}
-=item create_guest(desc, meta, config, guestcaps, output_name)
+=item guest_uuid_exists(uuid)
+
+This always returns 0 for a RHEV target.
+
+=cut
+
+sub guest_uuid_exists
+{
+ return 0;
+}
+
+=item create_guest(desc, meta, config, guestcaps, output_name, output_uuid)
Create the guest in the target
@@ -614,7 +625,7 @@ Create the guest in the target
sub create_guest
{
my $self = shift;
- my ($desc, $meta, $config, $guestcaps, $output_name) = @_;
+ my ($desc, $meta, $config, $guestcaps, $output_name, $output_uuid) = @_;
# Get the number of virtual cpus
my $ncpus = $meta->{cpus};
@@ -625,7 +636,17 @@ sub create_guest
# Generate a creation date
my $vmcreation = _format_time(gmtime());
- my $vmuuid = rhev_util::get_uuid();
+ my $vmuuid;
+ if (defined $output_uuid) {
+ if ($output_uuid ne "none") {
+ $vmuuid = $output_uuid;
+ } else {
+ $vmuuid = rhev_util::get_uuid();
+ }
+ } else {
+ $vmuuid =
+ defined $meta->{uuid} ? $meta->{uuid} : rhev_util::get_uuid();
+ }
my $ostype = _get_os_type($desc);
diff --git a/v2v/virt-v2v.pl b/v2v/virt-v2v.pl
index cdf77ab..8bd9c23 100755
--- a/v2v/virt-v2v.pl
+++ b/v2v/virt-v2v.pl
@@ -198,6 +198,24 @@ as the input name.
=cut
+my $output_uuid;
+
+=item B<-ou> I<UUID>
+
+=item B<-ou none>
+
+Change the UUID of the guest.
+
+If this option is not given, then the output UUID is the same
+as the input UUID.
+
+The I<-ou> option changes the UUID to the one given.
+
+The I<-ou none> option removes the UUID (this lets the target
+hypervisor choose a new random UUID for the guest).
+
+=cut
+
my $config_file;
$config_file = '/etc/virt-v2v.conf';
@@ -337,6 +355,7 @@ GetOptions ("help|?" => sub {
$output_sparse = parse_allocation($value);
},
"on=s" => \$output_name,
+ "ou=s" => \$output_uuid,
"f|config=s" => \$config_file,
"n|network=s" => sub {
my (undef, $value) = @_;
@@ -474,6 +493,14 @@ v2vdie __x('Domain {name} already exists on the target.',
name => $output_name)
if $target->guest_exists($output_name);
+# Check that the user is not using -ou option to set a UUID that
+# already exists on the target.
+v2vdie __x('Domain with UUID {uuid} already exists on the target.',
+ uuid => $output_uuid)
+ if defined $output_uuid &&
+ $output_uuid ne "none" &&
+ $target->guest_uuid_exists($output_uuid);
+
# Copy source storage to target
$source->copy_storage($target, $output_format, $output_sparse);
@@ -518,7 +545,7 @@ if ($@) {
$g->close();
-$target->create_guest($desc, $meta, $config, $guestcaps, $output_name);
+$target->create_guest($desc, $meta, $config, $guestcaps, $output_name, $output_uuid);
if($guestcaps->{block} eq 'virtio' && $guestcaps->{net} eq 'virtio') {
logmsg NOTICE, __x('{name} configured with virtio drivers.',
--
1.7.4.1
More information about the Libguestfs
mailing list