Exit with an error if we would overwrite an existing libvirt domain.
Fixes RHBZ#617110
---
lib/Sys/VirtV2V/Connection/LibVirt.pm | 4 ++++
lib/Sys/VirtV2V/Target/LibVirt.pm | 31 ++++++++++++++++++++++++++++++-
lib/Sys/VirtV2V/Target/RHEV.pm | 11 +++++++++++
3 files changed, 45 insertions(+), 1 deletions(-)
diff --git a/lib/Sys/VirtV2V/Connection/LibVirt.pm
b/lib/Sys/VirtV2V/Connection/LibVirt.pm
index b83a10d..51331da 100644
--- a/lib/Sys/VirtV2V/Connection/LibVirt.pm
+++ b/lib/Sys/VirtV2V/Connection/LibVirt.pm
@@ -79,6 +79,10 @@ sub new
$self->{uri} = URI->new($uri);
$self->{name} = $name;
+ # Check that the guest doesn't already exist on the target
+ die(user_message(__x("Domain {name} already exists on the target.",
+ name => $name))) if ($target->guest_exists($name));
+
# Parse uri authority for hostname and username
$self->{uri}->authority() =~ /^(?:([^:]*)(?::([^@]*))?@)?(.*)$/
or die(user_message(__x("Unable to parse URI authority: {auth}",
diff --git a/lib/Sys/VirtV2V/Target/LibVirt.pm b/lib/Sys/VirtV2V/Target/LibVirt.pm
index 574590c..279e93d 100644
--- a/lib/Sys/VirtV2V/Target/LibVirt.pm
+++ b/lib/Sys/VirtV2V/Target/LibVirt.pm
@@ -145,8 +145,10 @@ sub close
package Sys::VirtV2V::Target::LibVirt;
-use Sys::VirtV2V::Util qw(user_message);
+use Sys::Virt;
+use Sys::Virt::Error;
+use Sys::VirtV2V::Util qw(user_message);
use Locale::TextDomain 'virt-v2v';
=head1 NAME
@@ -288,6 +290,33 @@ sub get_volume
return Sys::VirtV2V::Target::LibVirt::Vol->_get($self->{pool}, $name);
}
+=item guest_exists(name)
+
+Return 1 if a guest with I<name> already exists, 0 otherwise.
+
+=cut
+
+sub guest_exists
+{
+ my $self = shift;
+ my ($name) = @_;
+
+ eval {
+ $self->{vmm}->get_domain_by_name($name);
+ };
+
+ if ($@) {
+ if ($@->code == Sys::Virt::Error::ERR_NO_DOMAIN) {
+ return 0;
+ }
+
+ die(user_message(__x("Error checking for domain: {error}",
+ error => $@->stringify())));
+ }
+
+ return 1;
+}
+
=item create_guest(dom)
Create the guest in the target
diff --git a/lib/Sys/VirtV2V/Target/RHEV.pm b/lib/Sys/VirtV2V/Target/RHEV.pm
index 574b022..218cf63 100644
--- a/lib/Sys/VirtV2V/Target/RHEV.pm
+++ b/lib/Sys/VirtV2V/Target/RHEV.pm
@@ -618,6 +618,17 @@ sub get_volume
die("Cannot retrieve an existing RHEV storage volume by name");
}
+=item guest_exists(name)
+
+This always returns 0 for a RHEV target.
+
+=cut
+
+sub guest_exists
+{
+ return 0;
+}
+
=item create_guest(dom)
Create the guest in the target
--
1.7.2.3