Hello community, here is the log from the commit of package vagrant-libvirt for openSUSE:Factory checked in at 2020-11-03 15:15:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/vagrant-libvirt (Old) and /work/SRC/openSUSE:Factory/.vagrant-libvirt.new.3463 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "vagrant-libvirt" Tue Nov 3 15:15:53 2020 rev:10 rq:845382 version:0.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/vagrant-libvirt/vagrant-libvirt.changes 2020-09-15 16:27:52.418572861 +0200 +++ /work/SRC/openSUSE:Factory/.vagrant-libvirt.new.3463/vagrant-libvirt.changes 2020-11-03 15:16:19.276025931 +0100 @@ -1,0 +2,48 @@ +Thu Oct 22 15:45:01 UTC 2020 - Dan Čermák <dcer...@suse.com> + +New upstream release 0.2.1 + +## [0.2.1](https://github.com/vagrant-libvirt/vagrant-libvirt/tree/0.2.1) (2020-10-03) + +[Full Changelog](https://github.com/vagrant-libvirt/vagrant-libvirt/compare/0.2.0...0.2.1) + +**Closed issues:** + +- Erubis dependency #1142 + + +## [0.2.0](https://github.com/vagrant-libvirt/vagrant-libvirt/tree/0.2.0) (2020-10-03) + +[Full Changelog](https://github.com/vagrant-libvirt/vagrant-libvirt/compare/0.1.2...0.2.0) + +**Closed issues:** + +- First time using - vagrant up fails with network related errors [\#1146](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1146) +- Waiting for domain to get an IP address [\#1145](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1145) +- CentOS 8 fail to install libvirt Failed to build gem native extension [\#1135](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1135) +- `\<module:Util\>': uninitialized constant VagrantPlugins::ProviderLibvirt::Util::ErbTemplate \(NameError\) [\#1131](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1131) +- vagrant asking for VBoxManage binary [\#1125](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1125) +- after upgrading vagrant to 2.2.9 \(from 2.2.7\) a vagrant up destroys the domain on error [\#1122](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1122) +- Failure to detect second machine instance using Vagrant CLI [\#1121](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1121) +- Help/Feature-Request: Host-only management network [\#1117](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1117) +- libvirt plugin install FAILs to find existing "package configuration for libvirt is not found" [\#1104](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1104) +- Fedora box download is not available [\#1070](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/1070) + +**Merged pull requests:** + +- Support release notes generation [\#1150](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1150) ([electrofelix](https://github.com/electrofelix)) +- Add docker image for vagrant-libvirt [\#1149](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1149) ([electrofelix](https://github.com/electrofelix)) +- Use Vagrant::Util::TemplateRenderer instead of Erubis. [\#1144](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1144) ([voxik](https://github.com/voxik)) +- config: allow for setting URI from environment [\#1141](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1141) ([electrofelix](https://github.com/electrofelix)) +- Limit CI jobs to a subset of combinations [\#1140](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1140) ([electrofelix](https://github.com/electrofelix)) +- Add @uri config tests and minor refactor [\#1139](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1139) ([electrofelix](https://github.com/electrofelix)) +- Update test syntax to remove stubs [\#1138](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1138) ([electrofelix](https://github.com/electrofelix)) +- let the user set the domain title and description [\#1137](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1137) ([rgl](https://github.com/rgl)) +- remove redundant setting of default volume/backingStore mode [\#1134](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1134) ([eighthave](https://github.com/eighthave)) +- Add WWN support [\#1123](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1123) ([cvoltz](https://github.com/cvoltz)) +- update examples to use fedora/32-cloud-base [\#1119](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1119) ([timhughes](https://github.com/timhughes)) +- add snapshot\_pool\_name to README [\#1114](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1114) ([abbbi](https://github.com/abbbi)) +- action/forward\_ports.rb: Fix SSH tunnel spawning and PID tracking [\#1037](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1037) ([zakame](https://github.com/zakame)) +- Add public\_address provider capability [\#1036](https://github.com/vagrant-libvirt/vagrant-libvirt/pull/1036) ([zakame](https://github.com/zakame)) + +------------------------------------------------------------------- Old: ---- vagrant-libvirt-0.1.2.gem New: ---- vagrant-libvirt-0.2.1.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ vagrant-libvirt.spec ++++++ --- /var/tmp/diff_new_pack.vyYFVf/_old 2020-11-03 15:16:20.136026759 +0100 +++ /var/tmp/diff_new_pack.vyYFVf/_new 2020-11-03 15:16:20.136026759 +0100 @@ -21,7 +21,7 @@ %global rb_ruby_suffix %rb_default_ruby_suffix Name: vagrant-libvirt -Version: 0.1.2 +Version: 0.2.1 Release: 0 %define mod_name vagrant-libvirt %define mod_full_name %{mod_name}-%{version} ++++++ vagrant-libvirt-0.1.2.gem -> vagrant-libvirt-0.2.1.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2020-05-12 11:05:44.000000000 +0200 +++ new/README.md 2020-10-03 22:20:38.000000000 +0200 @@ -16,54 +16,55 @@ <!-- note in vim set "let g:vmt_list_item_char='-'" to generate the correct output --> <!-- vim-markdown-toc GFM --> -- [Features](#features) -- [Future work](#future-work) -- [Installation](#installation) - - [Possible problems with plugin installation on Linux](#possible-problems-with-plugin-installation-on-linux) -- [Vagrant Project Preparation](#vagrant-project-preparation) - - [Add Box](#add-box) - - [Create Vagrantfile](#create-vagrantfile) - - [Start VM](#start-vm) - - [How Project Is Created](#how-project-is-created) - - [Libvirt Configuration](#libvirt-configuration) - - [Provider Options](#provider-options) - - [Domain Specific Options](#domain-specific-options) - - [Reload behavior](#reload-behavior) -- [Networks](#networks) - - [Private Network Options](#private-network-options) - - [Public Network Options](#public-network-options) - - [Management Network](#management-network) -- [Additional Disks](#additional-disks) - - [Reload behavior](#reload-behavior-1) -- [CDROMs](#cdroms) -- [Input](#input) -- [PCI device passthrough](#pci-device-passthrough) -- [Using USB Devices](#using-usb-devices) - - [USB Controller Configuration](#usb-controller-configuration) - - [USB Device Passthrough](#usb-device-passthrough) - - [USB Redirector Devices](#usb-redirector-devices) - - [Filter for USB Redirector Devices](#filter-for-usb-redirector-devices) -- [Random number generator passthrough](#random-number-generator-passthrough) -- [Watchdog device](#watchdog-device) -- [Smartcard device](#smartcard-device) -- [Hypervisor Features](#hypervisor-features) -- [CPU features](#cpu-features) -- [Memory Backing](#memory-backing) -- [No box and PXE boot](#no-box-and-pxe-boot) -- [SSH Access To VM](#ssh-access-to-vm) -- [Forwarded Ports](#forwarded-ports) -- [Synced Folders](#synced-folders) -- [QEMU Session Support](#qemu-session-support) -- [Customized Graphics](#customized-graphics) -- [TPM Devices](#tpm-devices) -- [Libvirt communication channels](#libvirt-communication-channels) -- [Custom command line arguments and environment variables](#custom-command-line-arguments-and-environment-variables) -- [Box Format](#box-format) -- [Create Box](#create-box) -- [Package Box from VM](#package-box-from-vm) -- [Troubleshooting VMs](#troubleshooting-vms) -- [Development](#development) -- [Contributing](#contributing) +* [Features](#features) +* [Future work](#future-work) +* [Using Docker based Installation](#using-docker-based-installation) +* [Installation](#installation) + * [Possible problems with plugin installation on Linux](#possible-problems-with-plugin-installation-on-linux) +* [Vagrant Project Preparation](#vagrant-project-preparation) + * [Add Box](#add-box) + * [Create Vagrantfile](#create-vagrantfile) + * [Start VM](#start-vm) + * [How Project Is Created](#how-project-is-created) + * [Libvirt Configuration](#libvirt-configuration) + * [Provider Options](#provider-options) + * [Domain Specific Options](#domain-specific-options) + * [Reload behavior](#reload-behavior) +* [Networks](#networks) + * [Private Network Options](#private-network-options) + * [Public Network Options](#public-network-options) + * [Management Network](#management-network) +* [Additional Disks](#additional-disks) + * [Reload behavior](#reload-behavior-1) +* [CDROMs](#cdroms) +* [Input](#input) +* [PCI device passthrough](#pci-device-passthrough) +* [Using USB Devices](#using-usb-devices) + * [USB Controller Configuration](#usb-controller-configuration) + * [USB Device Passthrough](#usb-device-passthrough) + * [USB Redirector Devices](#usb-redirector-devices) + * [Filter for USB Redirector Devices](#filter-for-usb-redirector-devices) +* [Random number generator passthrough](#random-number-generator-passthrough) +* [Watchdog device](#watchdog-device) +* [Smartcard device](#smartcard-device) +* [Hypervisor Features](#hypervisor-features) +* [CPU features](#cpu-features) +* [Memory Backing](#memory-backing) +* [No box and PXE boot](#no-box-and-pxe-boot) +* [SSH Access To VM](#ssh-access-to-vm) +* [Forwarded Ports](#forwarded-ports) +* [Synced Folders](#synced-folders) +* [QEMU Session Support](#qemu-session-support) +* [Customized Graphics](#customized-graphics) +* [TPM Devices](#tpm-devices) +* [Libvirt communication channels](#libvirt-communication-channels) +* [Custom command line arguments and environment variables](#custom-command-line-arguments-and-environment-variables) +* [Box Format](#box-format) +* [Create Box](#create-box) +* [Package Box from VM](#package-box-from-vm) +* [Troubleshooting VMs](#troubleshooting-vms) +* [Development](#development) +* [Contributing](#contributing) <!-- vim-markdown-toc --> @@ -92,6 +93,39 @@ * Take a look at [open issues](https://github.com/vagrant-libvirt/vagrant-libvirt/issues?state=open). +## Using Docker based Installation + +Due to the number of issues encountered around compatibility between the ruby runtime environment +that is part of the upstream vagrant installation and the library dependencies of libvirt that +this project requires to communicate with libvirt, there is a docker image build and published. + +This should allow users to execute vagrant with vagrant-libvirt without needing to deal with +the compatibility issues, though you may need to extend the image for your own needs should +you make use of additional plugins. + +To get the image: +```bash +docker pull vagrantlibvirt/vagrant-libvirt:latest +``` + +Running the image: +```bash +docker run -it -rm \ + -e LIBVIRT_DEFAULT_URI \ + -v /var/run/libvirt/:/var/run/libvirt/ \ + -v ~/.vagrant.d:/.vagrant.d \ + -v $(pwd):$(pwd) \ + -w $(pwd) \ + vagrantlibvirt/vagrant-libvirt:latest \ + vagrant status +``` + +Note that if you are connecting to a remote system libvirt, you may omit the +`-v /var/run/libvirt/:/var/run/libvirt/` mount bind. Some distributions patch the local +vagrant environment to ensure vagrant-libvirt uses `qemu:///session`, which means you +may need to set the environment variable `LIBVIRT_DEFAULT_URI` to the same value if +looking to use this in place of your distribution provided installation. + ## Installation First, you should have both QEMU and Libvirt installed if you plan to run VMs @@ -210,7 +244,7 @@ example: ```shell -vagrant init fedora/24-cloud-base +vagrant init fedora/32-cloud-base ``` ### Create Vagrantfile @@ -221,7 +255,7 @@ ```ruby Vagrant.configure("2") do |config| config.vm.define :test_vm do |test_vm| - test_vm.vm.box = "fedora/24-cloud-base" + test_vm.vm.box = "fedora/32-cloud-base" end end ``` @@ -285,7 +319,10 @@ Connection-independent options: * `storage_pool_name` - Libvirt storage pool name, where box image and instance - snapshots will be stored. + snapshots (if `snapshot_pool_name` is not set) will be stored. +* `snapshot_pool_name` - Libvirt storage pool name. If set, the created + snapshot of the instance will be stored at this location instead of + `storage_pool_name`. For example: @@ -299,6 +336,8 @@ ### Domain Specific Options +* `title` - A short description of the domain. +* `description` - A human readable description of the virtual machine. * `disk_bus` - The type of disk device to emulate. Defaults to virtio if not set. Possible values are documented in Libvirt's [description for _target_](http://libvirt.org/formatdomain.html#elementsDisks). NOTE: this @@ -774,6 +813,7 @@ Disks with this option set to true need to be removed manually. * `shareable` - Set to true if you want to simulate shared SAN storage. * `serial` - Serial number of the disk device. +* `wwn` - WWN number of the disk device. The following example creates two additional disks. @@ -1395,7 +1435,7 @@ ```ruby Vagrant.configure(2) do |config| - config.vm.box = "fedora/24-cloud-base" + config.vm.box = "fedora/32-cloud-base" config.vm.provider :libvirt do |libvirt| libvirt.channel :type => 'unix', :target_name => 'org.qemu.guest_agent.0', :target_type => 'virtio' end Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/action/create_domain.rb new/lib/vagrant-libvirt/action/create_domain.rb --- old/lib/vagrant-libvirt/action/create_domain.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/action/create_domain.rb 2020-10-03 22:20:38.000000000 +0200 @@ -31,6 +31,8 @@ # Gather some info about domain @name = env[:domain_name] + @title = config.title + @description = config.description @uuid = config.uuid @cpus = config.cpus.to_i @cpuset = config.cpuset @@ -195,6 +197,8 @@ # Output the settings we're going to use to the user env[:ui].info(I18n.t('vagrant_libvirt.creating_domain')) env[:ui].info(" -- Name: #{@name}") + env[:ui].info(" -- Title: #{@title}") if @title != '' + env[:ui].info(" -- Description: #{@description}") if @description != '' env[:ui].info(" -- Forced UUID: #{@uuid}") if @uuid != '' env[:ui].info(" -- Domain type: #{@domain_type}") env[:ui].info(" -- Cpus: #{@cpus}") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/action/create_domain_volume.rb new/lib/vagrant-libvirt/action/create_domain_volume.rb --- old/lib/vagrant-libvirt/action/create_domain_volume.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/action/create_domain_volume.rb 2020-10-03 22:20:38.000000000 +0200 @@ -51,7 +51,6 @@ xml.permissions do xml.owner storage_uid(env) xml.group storage_gid(env) - xml.mode '0600' xml.label 'virt_image_t' end end @@ -61,7 +60,6 @@ xml.permissions do xml.owner storage_uid(env) xml.group storage_gid(env) - xml.mode '0600' xml.label 'virt_image_t' end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/action/forward_ports.rb new/lib/vagrant-libvirt/action/forward_ports.rb --- old/lib/vagrant-libvirt/action/forward_ports.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/action/forward_ports.rb 2020-10-03 22:20:38.000000000 +0200 @@ -98,6 +98,7 @@ Port=#{ssh_info[:port]} UserKnownHostsFile=/dev/null ExitOnForwardFailure=yes + ControlMaster=no StrictHostKeyChecking=no PasswordAuthentication=no ForwardX11=#{ssh_info[:forward_x11] ? 'yes' : 'no'} @@ -109,7 +110,7 @@ options += " -o ProxyCommand=\"#{ssh_info[:proxy_command]}\"" if machine.provider_config.connect_via_ssh # TODO: instead of this, try and lock and get the stdin from spawn... - ssh_cmd = 'exec ' + ssh_cmd = '' if host_port <= 1024 @@lock.synchronize do # TODO: add i18n @@ -127,7 +128,7 @@ log_file = ssh_forward_log_file(host_ip, host_port, guest_ip, guest_port) @logger.info "Logging to #{log_file}" - spawn(ssh_cmd, [:out, :err] => [log_file, 'w']) + spawn(ssh_cmd, [:out, :err] => [log_file, 'w'], :pgroup => true) end def ssh_forward_log_file(host_ip, host_port, guest_ip, guest_port) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/action/halt_confirm.rb new/lib/vagrant-libvirt/action/halt_confirm.rb --- old/lib/vagrant-libvirt/action/halt_confirm.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/action/halt_confirm.rb 1970-01-01 01:00:00.000000000 +0100 @@ -1,20 +0,0 @@ -module VagrantPlugins - module ProviderLibvirt - module Action - # This class asks the user to confirm the destruction of a machine - # that Vagrant manages. This is provided as a built-in on top of - # {Confirm} because it sets up the proper keys and such so that - # `vagrant destroy -f` works properly. - class HaltConfirm < Vagrant::Action::Builtin::Confirm - def initialize(app, env) - force_key = :force_confirm_halt - message = I18n.t("vagrant_libvirt.package_confirm_halt", - name: env[:machine].name) - - super(app, env, message, force_key, allowed: ["y", "n", "Y", "N"]) - end - end - end - end -end - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/cap/public_address.rb new/lib/vagrant-libvirt/cap/public_address.rb --- old/lib/vagrant-libvirt/cap/public_address.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/vagrant-libvirt/cap/public_address.rb 2020-10-03 22:20:38.000000000 +0200 @@ -0,0 +1,16 @@ +module VagrantPlugins + module ProviderLibvirt + module Cap + class PublicAddress + def self.public_address(machine) + # This does not need to be a globally routable address, it + # only needs to be accessible from the machine running + # Vagrant. + ssh_info = machine.ssh_info + return nil if !ssh_info + ssh_info[:host] + end + end + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/config.rb new/lib/vagrant-libvirt/config.rb --- old/lib/vagrant-libvirt/config.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/config.rb 2020-10-03 22:20:38.000000000 +0200 @@ -67,6 +67,8 @@ attr_accessor :default_prefix # Domain specific settings used while creating new domain. + attr_accessor :title + attr_accessor :description attr_accessor :uuid attr_accessor :memory attr_accessor :nodeset @@ -197,6 +199,8 @@ @system_uri = UNSET_VALUE # Domain specific settings. + @title = UNSET_VALUE + @description = UNSET_VALUE @uuid = UNSET_VALUE @memory = UNSET_VALUE @nodeset = UNSET_VALUE @@ -600,7 +604,8 @@ cache: options[:cache] || 'default', allow_existing: options[:allow_existing], shareable: options[:shareable], - serial: options[:serial] + serial: options[:serial], + wwn: options[:wwn] } @disks << disk # append @@ -618,14 +623,21 @@ @qemu_env.merge!(options) end - # code to generate URI from a config moved out of the connect action - def _generate_uri + # code to generate URI from from either the LIBVIRT_URI environment + # variable or a config moved out of the connect action + def _generate_uri(qemu_use_session) + + # If the LIBVIRT_DEFAULT_URI var is set, we'll use that + if ENV.fetch('LIBVIRT_DEFAULT_URI', '') != "" + return ENV['LIBVIRT_DEFAULT_URI'] + end + # builds the Libvirt connection URI from the given driver config # Setup connection uri. uri = @driver.dup virt_path = case uri when 'qemu', 'kvm' - @qemu_use_session ? '/session' : '/system' + qemu_use_session ? '/session' : '/system' when 'openvz', 'uml', 'phyp', 'parallels' '/system' when '@en', 'esx' @@ -643,31 +655,37 @@ uri << '+ssh://' uri << @username + '@' if @username - uri << if @host - @host - else - 'localhost' - end + uri << ( @host ? @host : 'localhost' ) else uri << '://' uri << @host if @host end uri << virt_path - uri << '?no_verify=1' + + params = {'no_verify' => '1'} if @id_ssh_key_file # set ssh key for access to Libvirt host - uri << "\&keyfile=" # if no slash, prepend $HOME/.ssh/ - @id_ssh_key_file.prepend("#{`echo ${HOME}`.chomp}/.ssh/") if @id_ssh_key_file !~ /\A\// - uri << @id_ssh_key_file + @id_ssh_key_file.prepend("#{ENV['HOME']}/.ssh/") if @id_ssh_key_file !~ /\A\// + params['keyfile'] = @id_ssh_key_file end # set path to Libvirt socket - uri << "\&socket=" + @socket if @socket + params['socket'] = @socket if @socket + + uri << "?" + params.map{|pair| pair.join('=')}.join('&') uri end + def _parse_uri(uri) + begin + URI.parse(uri) + rescue + raise "@uri set to invalid uri '#{uri}'" + end + end + def finalize! @driver = 'kvm' if @driver == UNSET_VALUE @host = nil if @host == UNSET_VALUE @@ -691,12 +709,25 @@ @management_network_domain = nil if @management_network_domain == UNSET_VALUE @system_uri = 'qemu:///system' if @system_uri == UNSET_VALUE - @qemu_use_session = false if @qemu_use_session == UNSET_VALUE + # If uri isn't set then let's build one from various sources. + # Default to passing false for qemu_use_session if it's not set. + if @uri == UNSET_VALUE + @uri = _generate_uri(@qemu_use_session == UNSET_VALUE ? false : @qemu_use_session) + end - # generate a URI if none is supplied - @uri = _generate_uri if @uri == UNSET_VALUE + # Set qemu_use_session based on the URI if it wasn't set by the user + if @qemu_use_session == UNSET_VALUE + uri = _parse_uri(@uri) + if (uri.scheme.start_with? "qemu") && (uri.path.include? "session") + @qemu_use_session = true + else + @qemu_use_session = false + end + end # Domain specific settings. + @title = '' if @title == UNSET_VALUE + @description = '' if @description == UNSET_VALUE @uuid = '' if @uuid == UNSET_VALUE @memory = 512 if @memory == UNSET_VALUE @nodeset = nil if @nodeset == UNSET_VALUE @@ -814,6 +845,14 @@ def validate(machine) errors = _detected_errors + # The @uri and @qemu_use_session should not conflict + uri = _parse_uri(@uri) + if (uri.scheme.start_with? "qemu") && (uri.path.include? "session") + if @qemu_use_session != true + errors << "the URI and qemu_use_session configuration conflict: uri:'#{@uri}' qemu_use_session:'#{@qemu_use_session}'" + end + end + machine.provider_config.disks.each do |disk| if disk[:path] && (disk[:path][0] == '/') errors << "absolute volume paths like '#{disk[:path]}' not yet supported" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/plugin.rb new/lib/vagrant-libvirt/plugin.rb --- old/lib/vagrant-libvirt/plugin.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/plugin.rb 2020-10-03 22:20:38.000000000 +0200 @@ -39,6 +39,11 @@ Cap::NicMacAddresses end + provider_capability(:libvirt, :public_address) do + require_relative 'cap/public_address' + Cap::PublicAddress + end + # lower priority than nfs or rsync # https://github.com/vagrant-libvirt/vagrant-libvirt/pull/170 synced_folder('9p', 4) do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/templates/domain.xml.erb new/lib/vagrant-libvirt/templates/domain.xml.erb --- old/lib/vagrant-libvirt/templates/domain.xml.erb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/templates/domain.xml.erb 2020-10-03 22:20:38.000000000 +0200 @@ -1,5 +1,7 @@ <domain type='<%= @domain_type %>' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name><%= @name %></name> + <title><%= @title %></title> + <description><%= @description %></description> <uuid><%= @uuid %></uuid> <memory><%= @memory_size %></memory> <vcpu<% if @cpuset %> cpuset='<%= @cpuset %>'<% end %>><%= @cpus %></vcpu> @@ -127,6 +129,9 @@ <% if d[:serial] %> <serial><%= d[:serial] %></serial> <% end %> + <% if d[:wwn] %> + <wwn><%= d[:wwn] %></wwn> + <% end %> <%# this will get auto generated by Libvirt <address type='pci' domain='0x0000' bus='0x00' slot='???' function='0x0'/> -%> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/util/erb_template.rb new/lib/vagrant-libvirt/util/erb_template.rb --- old/lib/vagrant-libvirt/util/erb_template.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/util/erb_template.rb 2020-10-03 22:20:38.000000000 +0200 @@ -1,20 +1,19 @@ -require 'erubis' - module VagrantPlugins module ProviderLibvirt module Util module ErbTemplate # TODO: remove and use nokogiri builder - # TODO: might be a chance to use vagrant template system according to https://github.com/mitchellh/vagrant/issues/3231 def to_xml(template_name = nil, data = binding) erb = template_name || self.class.to_s.split('::').last.downcase - path = File.join(File.dirname(__FILE__), '..', 'templates', - "#{erb}.xml.erb") - template = File.read(path) + path = File.join(File.dirname(__FILE__), '..', 'templates') + template = "#{erb}.xml" # TODO: according to erubis documentation, we should rather use evaluate and forget about # binding since the template may then change variables values - Erubis::Eruby.new(template, trim: true).result(data) + Vagrant::Util::TemplateRenderer.render_with(:render, template, template_root: path) do |renderer| + iv = data.eval ("instance_variables.collect {|i| [i, instance_variable_get(i.to_sym)]}") + iv.each {|k, v| renderer.instance_variable_set(k, v)} + end end end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/vagrant-libvirt/version.rb new/lib/vagrant-libvirt/version.rb --- old/lib/vagrant-libvirt/version.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/lib/vagrant-libvirt/version.rb 2020-10-03 22:20:38.000000000 +0200 @@ -1,5 +1,5 @@ module VagrantPlugins module ProviderLibvirt - VERSION = '0.1.2'.freeze + VERSION = '0.2.1'.freeze end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2020-05-12 11:05:44.000000000 +0200 +++ new/metadata 2020-10-03 22:20:38.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: vagrant-libvirt version: !ruby/object:Gem::Version - version: 0.1.2 + version: 0.2.1 platform: ruby authors: - Lukas Stanek @@ -10,7 +10,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2020-05-12 00:00:00.000000000 Z +date: 2020-10-03 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: rspec-core @@ -130,7 +130,6 @@ - lib/vagrant-libvirt/action/destroy_domain.rb - lib/vagrant-libvirt/action/destroy_networks.rb - lib/vagrant-libvirt/action/forward_ports.rb -- lib/vagrant-libvirt/action/halt_confirm.rb - lib/vagrant-libvirt/action/halt_domain.rb - lib/vagrant-libvirt/action/handle_box_image.rb - lib/vagrant-libvirt/action/handle_storage_pool.rb @@ -158,6 +157,7 @@ - lib/vagrant-libvirt/action/wait_till_up.rb - lib/vagrant-libvirt/cap/mount_p9.rb - lib/vagrant-libvirt/cap/nic_mac_addresses.rb +- lib/vagrant-libvirt/cap/public_address.rb - lib/vagrant-libvirt/cap/synced_folder.rb - lib/vagrant-libvirt/config.rb - lib/vagrant-libvirt/driver.rb @@ -209,20 +209,20 @@ - !ruby/object:Gem::Version version: '0' requirements: [] -rubygems_version: 3.0.6 +rubygems_version: 3.0.3 signing_key: specification_version: 4 summary: libvirt provider for Vagrant. test_files: -- spec/support/libvirt_context.rb -- spec/support/sharedcontext.rb -- spec/support/environment_helper.rb -- spec/unit/templates/domain_all_settings.xml -- spec/unit/templates/domain_custom_cpu_model.xml -- spec/unit/templates/domain_defaults.xml -- spec/unit/templates/domain_spec.rb - spec/unit/action/wait_till_up_spec.rb - spec/unit/action/destroy_domain_spec.rb - spec/unit/action/set_name_of_domain_spec.rb - spec/unit/config_spec.rb +- spec/unit/templates/domain_defaults.xml +- spec/unit/templates/domain_all_settings.xml +- spec/unit/templates/domain_spec.rb +- spec/unit/templates/domain_custom_cpu_model.xml +- spec/support/libvirt_context.rb +- spec/support/environment_helper.rb +- spec/support/sharedcontext.rb - spec/spec_helper.rb diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/support/libvirt_context.rb new/spec/support/libvirt_context.rb --- old/spec/support/libvirt_context.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/support/libvirt_context.rb 2020-10-03 22:20:38.000000000 +0200 @@ -25,6 +25,6 @@ # return some information for domain when needed allow(domain).to receive(:mac).and_return('9C:D5:53:F1:5A:E7') - machine.stub(id: id) + allow(machine).to receive(:id).and_return(id) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/support/sharedcontext.rb new/spec/support/sharedcontext.rb --- old/spec/support/sharedcontext.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/support/sharedcontext.rb 2020-10-03 22:20:38.000000000 +0200 @@ -28,7 +28,7 @@ let(:plugin) { register_plugin } before (:each) do - machine.stub(guest: guest) - machine.stub(communicator: communicator) + allow(machine).to receive(:guest).and_return(guest) + allow(machine).to receive(:communicator).and_return(communicator) end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/action/destroy_domain_spec.rb new/spec/unit/action/destroy_domain_spec.rb --- old/spec/unit/action/destroy_domain_spec.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/action/destroy_domain_spec.rb 2020-10-03 22:20:38.000000000 +0200 @@ -33,7 +33,7 @@ before do allow(libvirt_domain).to receive(:list_snapshots).and_return([]) allow(libvirt_domain).to receive(:has_managed_save?).and_return(nil) - root_disk.stub(name: 'test.img') + allow(root_disk).to receive(:name).and_return('test.img') end context 'when only has root disk' do @@ -57,7 +57,7 @@ let(:extra_disk) { double('libvirt_extra_disk') } before do - extra_disk.stub(name: 'test-vdb.qcow2') + allow(extra_disk).to receive(:name).and_return('test-vdb.qcow2') end it 'destroys disks individually' do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/action/set_name_of_domain_spec.rb new/spec/unit/action/set_name_of_domain_spec.rb --- old/spec/unit/action/set_name_of_domain_spec.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/action/set_name_of_domain_spec.rb 2020-10-03 22:20:38.000000000 +0200 @@ -10,12 +10,12 @@ dmn = VagrantPlugins::ProviderLibvirt::Action::SetNameOfDomain.new(Object.new, @env) first = dmn.build_domain_name(@env) second = dmn.build_domain_name(@env) - first.should_not eq(second) + expect(first).to_not eq(second) end it 'builds simple domain name' do @env.default_prefix = 'pre_' dmn = VagrantPlugins::ProviderLibvirt::Action::SetNameOfDomain.new(Object.new, @env) - dmn.build_domain_name(@env).should eq('pre_') + expect(dmn.build_domain_name(@env)).to eq('pre_') end end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/config_spec.rb new/spec/unit/config_spec.rb --- old/spec/unit/config_spec.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/config_spec.rb 2020-10-03 22:20:38.000000000 +0200 @@ -6,12 +6,185 @@ describe VagrantPlugins::ProviderLibvirt::Config do include_context 'unit' + let(:fake_env) { Hash.new } + + describe '#finalize!' do + it 'is valid with defaults' do + subject.finalize! + end + + context '@uri' do + before(:example) do + stub_const("ENV", fake_env) + end + + context 'when LIBVIRT_DEFAULT_URI is defined' do + it 'should always use this value' do + fake_env['LIBVIRT_DEFAULT_URI'] = "custom:///custom_path" + + subject.finalize! + expect(subject.uri).to eq("custom:///custom_path") + expect(subject.qemu_use_session).to eq(false) + end + + context 'when LIBVIRT_DEFAULT_URI contains "qemu"' do + [ + [ + 'set qemu_use_session if "session" present', + 'qemu:///session', + true, + ], + [ + 'handle different protocol additions', + 'qemu+ssh:///session', + true, + ], + [ + 'handle options before and after path', + 'qemu://remote/session?keyfile=my_id_rsa', + true, + ], + [ + 'identify when session not set', + 'qemu://remote/system', + false, + ], + [ + 'handle session appearing elsewhere', + 'qemu://remote/system?keyfile=my_session_id', + false, + ], + ].each do |title, uri, session| + it "should #{title}" do + fake_env['LIBVIRT_DEFAULT_URI'] = uri + + subject.finalize! + expect(subject.uri).to eq(uri) + expect(subject.qemu_use_session).to eq(session) + end + end + end + end + + context 'when @driver is defined' do + defaults = {'id_ssh_key_file' => nil} + [ + [ + {'driver' => 'kvm'}, + 'qemu:///system?no_verify=1', + false, + ], + [ + {'driver' => 'qemu'}, + 'qemu:///system?no_verify=1', + false, + ], + [ + {'driver' => 'qemu', 'qemu_use_session' => true}, + 'qemu:///session?no_verify=1', + true, + ], + [ + {'driver' => 'openvz'}, + 'openvz:///system?no_verify=1', + false, + ], + [ + {'driver' => 'vbox'}, + 'vbox:///session?no_verify=1', + false, + ], + ].each do |inputs, output_uri, output_session| + it "should detect #{inputs}" do + inputs.merge(defaults).each do |k, v| + subject.instance_variable_set("@#{k}", v) + end + + subject.finalize! + expect(subject.uri).to eq(output_uri) + expect(subject.qemu_use_session).to eq(output_session) + end + end + + it "should raise exception for unrecognized" do + subject.driver = "bad-driver" + + expect { subject.finalize! }.to raise_error("Require specify driver bad-driver") + end + end + + context 'when @connect_via_ssh defined' do + defaults = {'driver' => 'qemu', 'id_ssh_key_file' => nil} + [ + [ + {'connect_via_ssh' => true}, + 'qemu+ssh://localhost/system?no_verify=1', + ], + [ + {'connect_via_ssh' => true, 'username' => 'my_user'}, + 'qemu+ssh://my_user@localhost/system?no_verify=1', + ], + [ + {'connect_via_ssh' => true, 'host' => 'remote_server'}, + 'qemu+ssh://remote_server/system?no_verify=1', + ], + ].each do |inputs, output_uri| + it "should detect #{inputs}" do + inputs.merge(defaults).each do |k, v| + subject.instance_variable_set("@#{k}", v) + end + + subject.finalize! + expect(subject.uri).to eq(output_uri) + end + end + end + + context 'when @id_ssh_key_file defined' do + defaults = {'driver' => 'qemu'} + [ + [ + {}, + 'qemu:///system?no_verify=1&keyfile=/home/user/.ssh/id_rsa', + ], + [ + {'id_ssh_key_file' => '/path/to/keyfile'}, + 'qemu:///system?no_verify=1&keyfile=/path/to/keyfile', + ], + ].each do |inputs, output_uri| + it "should detect #{inputs}" do + inputs.merge(defaults).each do |k, v| + subject.instance_variable_set("@#{k}", v) + end + + fake_env['HOME'] = '/home/user' + + subject.finalize! + expect(subject.uri).to eq(output_uri) + end + end + end + + context 'when @socket defined' do + it "should detect @socket set" do + subject.socket = '/var/run/libvirt/libvirt-sock' + subject.id_ssh_key_file = false + + subject.finalize! + expect(subject.uri).to eq('qemu:///system?no_verify=1&socket=/var/run/libvirt/libvirt-sock') + end + end + end + end + def assert_invalid + subject.finalize! errors = subject.validate(machine) raise "No errors: #{errors.inspect}" if errors.values.all?(&:empty?) end def assert_valid + subject.finalize! errors = subject.validate(machine) raise "Errors: #{errors.inspect}" unless errors.values.all?(&:empty?) end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/templates/domain_all_settings.xml new/spec/unit/templates/domain_all_settings.xml --- old/spec/unit/templates/domain_all_settings.xml 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/templates/domain_all_settings.xml 2020-10-03 22:20:38.000000000 +0200 @@ -1,5 +1,7 @@ <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name></name> + <title>title</title> + <description>description</description> <uuid></uuid> <memory></memory> <vcpu cpuset='1-4,^3,6'>1</vcpu> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/templates/domain_custom_cpu_model.xml new/spec/unit/templates/domain_custom_cpu_model.xml --- old/spec/unit/templates/domain_custom_cpu_model.xml 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/templates/domain_custom_cpu_model.xml 2020-10-03 22:20:38.000000000 +0200 @@ -1,5 +1,7 @@ <domain type='' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name></name> + <title></title> + <description></description> <uuid></uuid> <memory></memory> <vcpu>1</vcpu> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/templates/domain_defaults.xml new/spec/unit/templates/domain_defaults.xml --- old/spec/unit/templates/domain_defaults.xml 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/templates/domain_defaults.xml 2020-10-03 22:20:38.000000000 +0200 @@ -1,5 +1,7 @@ <domain type='' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <name></name> + <title></title> + <description></description> <uuid></uuid> <memory></memory> <vcpu>1</vcpu> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/spec/unit/templates/domain_spec.rb new/spec/unit/templates/domain_spec.rb --- old/spec/unit/templates/domain_spec.rb 2020-05-12 11:05:44.000000000 +0200 +++ new/spec/unit/templates/domain_spec.rb 2020-10-03 22:20:38.000000000 +0200 @@ -27,6 +27,8 @@ context 'when all settings enabled' do before do + domain.title = 'title' + domain.description = 'description' domain.instance_variable_set('@domain_type', 'kvm') domain.cpu_mode = 'custom' domain.cpu_feature(name: 'AAA', policy: 'required')