Command line option changes: -s -> -f -c -> -ic -c, --connect now generates an error message. New option -oc specifies output connection. --- lib/Sys/VirtV2V/MetadataReader.pm | 20 +++-- lib/Sys/VirtV2V/MetadataReader/LibVirt.pm | 9 ++- lib/Sys/VirtV2V/MetadataReader/LibVirtXML.pm | 5 +- v2v/virt-v2v.pl | 108 ++++++++++++++------------ 4 files changed, 79 insertions(+), 63 deletions(-) diff --git a/lib/Sys/VirtV2V/MetadataReader.pm b/lib/Sys/VirtV2V/MetadataReader.pm index 6a1bec3..7b5e7d5 100644 --- a/lib/Sys/VirtV2V/MetadataReader.pm +++ b/lib/Sys/VirtV2V/MetadataReader.pm @@ -36,7 +36,9 @@ Sys::VirtV2V::MetadataReader - Read a variety of guest metadata formats use Sys::VirtV2V::MetadataReader; - $reader = Sys::VirtV2V::MetadataReader->instantiate("libvirtxml", $vmm, @args); + $reader = Sys::VirtV2V::MetadataReader->instantiate("libvirtxml", $uri, + $config, @args); + exit 1 unless($mdr->is_configured()); $dom = $reader->get_dom(); =head1 DESCRIPTION @@ -53,7 +55,7 @@ implements methods to access backends. =over -=item instantiate(name, vmm, @args) +=item instantiate(name, $uri, $config, @args) =over @@ -61,13 +63,13 @@ implements methods to access backends. The name of the module to instantiate. -=item config +=item uri -A parsed virt-v2v configuration file. +A URI describing the target connection. -=item vmm +=item config -A Sys::Virt connection. +A parsed virt-v2v configuration file. =item args @@ -83,15 +85,15 @@ sub instantiate { my $class = shift; - my ($name, $config, $vmm, @args) = @_; + my ($name, $uri, $config, @args) = @_; defined($name) or carp("instantiate called without name argument"); + defined($uri) or carp("instantiate called without uri argument"); defined($config) or carp("instantiate called without config argument"); - defined($vmm) or carp("instantiate called without vmm argument"); foreach my $module ($class->modules()) { if($module->get_name() eq $name) { - return $module->_new($config->{$name}, $vmm, @args); + return $module->_new($uri, $config->{$name}, @args); } } diff --git a/lib/Sys/VirtV2V/MetadataReader/LibVirt.pm b/lib/Sys/VirtV2V/MetadataReader/LibVirt.pm index d18f432..e6fcfff 100644 --- a/lib/Sys/VirtV2V/MetadataReader/LibVirt.pm +++ b/lib/Sys/VirtV2V/MetadataReader/LibVirt.pm @@ -38,7 +38,8 @@ Sys::VirtV2V::MetadataReader::LibVirt - Read libvirt metadata from libvirtd use Sys::VirtV2V::MetadataReader; - $reader = Sys::VirtV2V::MetadataReader->instantiate("libvirt", $vmm, @args); + $reader = Sys::VirtV2V::MetadataReader->instantiate + ("libvirt", "xen+ssh://xenserver.example.com/", $config, @args); $dom = $reader->get_dom(); =head1 DESCRIPTION @@ -62,12 +63,16 @@ sub _new { my $class = shift; - my ($config, $vmm, @args) = @_; + my ($uri, $config, @args) = @_; my $self = {}; bless($self, $class); + my @vmm_params = (auth => 1); + push(@vmm_params, url => $uri) if defined($uri); + my $vmm = Sys::Virt->new(@vmm_params); + $self->{vmm} = $vmm; $self->_handle_args(@args); diff --git a/lib/Sys/VirtV2V/MetadataReader/LibVirtXML.pm b/lib/Sys/VirtV2V/MetadataReader/LibVirtXML.pm index 877b7e5..191210f 100644 --- a/lib/Sys/VirtV2V/MetadataReader/LibVirtXML.pm +++ b/lib/Sys/VirtV2V/MetadataReader/LibVirtXML.pm @@ -37,7 +37,8 @@ Sys::VirtV2V::MetadataReader::LibVirtXML - Read libvirt XML from a file use Sys::VirtV2V::MetadataReader; - $reader = Sys::VirtV2V::MetadataReader->instantiate("libvirtxml", $vmm, @args); + $reader = Sys::VirtV2V::MetadataReader->instantiate("libvirtxml", undef, + $config, @args); $dom = $reader->get_dom(); =head1 DESCRIPTION @@ -61,7 +62,7 @@ sub _new { my $class = shift; - my ($config, $vmm, @args) = @_; + my ($uri, $config, @args) = @_; my %obj = (); my $self = \%obj; diff --git a/v2v/virt-v2v.pl b/v2v/virt-v2v.pl index 0ad3c6e..ad1610f 100755 --- a/v2v/virt-v2v.pl +++ b/v2v/virt-v2v.pl @@ -46,9 +46,9 @@ virt-v2v - Convert a guest to use KVM virt-v2v guest-domain.xml - virt-v2v -s virt-v2v.conf guest-domain.xml + virt-v2v -f virt-v2v.conf guest-domain.xml - virt-v2v --connect qemu:///system guest-domain.xml + virt-v2v -ic qemu:///system guest-domain =head1 DESCRIPTION @@ -112,58 +112,59 @@ table below. =cut -my $help; +my $input_method = "libvirt"; -=item B<--help> - -Display brief help. - -=cut +=item B<-i input> -my $version; +Specifies how the conversion source metadata can be obtained. The default is +C<libvirt>. Supported options are: -=item B<--version> +=over -Display version number and exit. +=item I<libvirt> -=cut +Guest argument is the name of a libvirt domain. -my $uri; +=item I<libvirtxml> -=item B<--connect URI> | B<-c URI> +Guest argument is the path to an XML file describing a libvirt domain. -Connect to libvirt using the given I<URI>. If omitted, then we connect to the -default libvirt hypervisor. +=back =cut -my $input = "libvirt"; +my $input_uri; -=item B<--input input> | B<-i input> +=item B<-ic URI> -The specified guest description uses the given I<input format>. The default is -C<libvirt>. Supported options are: +Specifies the connection to use when using the libvirt input method. If omitted, +then we connect to the default libvirt hypervisor. -=over - -=item I<libvirt> - -Guest argument is the name of a libvirt domain. +=cut -=item I<libvirtxml> +my $output_uri = "qemu:///system"; -Guest argument is the path to an XML file describing a libvirt domain. +=item B<-oc URI> -=back +Specifies the libvirt connection to use to create the converted guest. If +ommitted, this defaults to qemu:///system. =cut my $config_file; -=item B<--config file> | B<-s file> +=item B<-f file>, B<--config file> Load the virt-v2v configuration from I<file>. There is no default. +=item B<--help> + +Display brief help. + +=item B<--version> + +Display version number and exit. + =back =cut @@ -171,26 +172,28 @@ Load the virt-v2v configuration from I<file>. There is no default. # Initialise the message output prefix Sys::VirtV2V::UserMessage->set_identifier('virt-v2v'); -GetOptions ("help|?" => \$help, - "version" => \$version, - "connect|c=s" => \$uri, - "input|i=s" => \$input, - "config|s=s" => \$config_file - ) or pod2usage(2); -pod2usage(0) if($help); - -if ($version) { - print "$Sys::VirtV2V::VERSION\n"; - exit(0); -} +GetOptions ("help|?" => sub { + pod2usage(0); + }, + "version" => sub { + print "$Sys::VirtV2V::VERSION\n"; + exit(0); + }, + "c|connect" => sub { + # -c|--connect is the default for other virt tools. Be nice to + # the user and point out that virt-v2v is different. + pod2usage({ -message => __("Use -ic or -oc to specify an ". + "input or an output connection"), + -exitval => 1 }); + }, + "i=s" => \$input_method, + "ic=s" => \$input_uri, + "oc=s" => \$output_uri, + "f|config=s" => \$config_file +) or pod2usage(2); pod2usage(user_message(__"no guest argument given")) if @ARGV == 0; -# Connect to libvirt -my @vmm_params = (auth => 1); -push(@vmm_params, uri => $uri) if(defined($uri)); -my $vmm = Sys::Virt->new(@vmm_params); - # Read the config file if one was given my $config = {}; if(defined($config_file)) { @@ -206,11 +209,11 @@ if(defined($config_file)) { } # Get an appropriate MetadataReader -my $mdr = Sys::VirtV2V::MetadataReader->instantiate($input, $config, - $vmm, @ARGV); +my $mdr = Sys::VirtV2V::MetadataReader->instantiate($input_method, $input_uri, + $config, @ARGV); if(!defined($mdr)) { - print STDERR user_message __x("{input} is not a valid metadata format", - input => $input); + print STDERR user_message __x("{input} is not a valid input method", + input => $input_method); exit(1); } @@ -239,6 +242,11 @@ my $os = inspect_guest($g); # Instantiate a GuestOS instance to manipulate the guest my $guestos = Sys::VirtV2V::GuestOS->instantiate($g, $os); +# Connect to target libvirt +my @vmm_params = (auth => 1); +push(@vmm_params, uri => $output_uri) if(defined($output_uri)); +my $vmm = Sys::Virt->new(@vmm_params); + # Modify the guest and its metadata for the target hypervisor Sys::VirtV2V::Converter->convert($vmm, $guestos, $dom, $os); -- 1.6.6