Recently posted a Pull Request to the vagrant-libvirt project.
I have rvm installed, so I think during that install, I have most of the dependencies for doing ruby development.
While debugging a vagrant plugin
I run rvm use system
from the terminal since /usr/bin/vagrant
needs to run and I have
vagrant gem installed in the rvm ruby gem folder for vagrant plugin building.
To create the patch, I did the following to troubleshooting
install pry-byebug into the vagrant gem directory
This is the ruby debugger recommended by a couple of sites for ruby2+ versions
vagrant plugin install pry-byebug
insert breakpoints where needed
Open the vagrant plugin file and add require pry
at the top and
binding.pry
at the line to start the debugger.
Example
/home/stanley/.vagrant.d/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/create_network_interfaces.rb
3 require 'vagrant/util/scoped_hash_override'
4 require 'pry-byebug'
...
....
......
39 # Vagrant gives you adapter 0 by default
40 # Assign interfaces to slots.
41 configured_networks(env, @logger).each do |options|
42 binding.pry
run vagrant normally, and it will break at the point requested
For some reason, I cannot step into ruby block code. Still something to figure out.
$ vagrant up
Bringing machine 'test1' up with 'libvirt' provider...
==> test1: Creating image (snapshot of base box volume).
==> test1: Creating domain with the following settings...
==> test1: -- Name: vagrant_testing_test1
==> test1: -- Domain type: kvm
==> test1: -- Cpus: 1
==> test1: -- Memory: 128M
==> test1: -- Base box: trusty64_2
==> test1: -- Kernel:
...
....
==> test1: Creating shared folders metadata...
From: /home/stanley/.vagrant.d/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/create_network_interfaces.rb @ line 44 VagrantPlugins::ProviderLibvirt::Action::CreateNetworkInterfaces#call:
39: # Vagrant gives you adapter 0 by default
40: # Assign interfaces to slots.
41: configured_networks(env, @logger).each do |options|
42: binding.pry
43: # dont need to create interface for this type
=> 44: next if options[:iface_type] == :forwarded_port
45:
46: # TODO fill first ifaces with adapter option specified.
47: if options[:adapter]
48: if adapters[options[:adapter]]
49: raise Errors::InterfaceSlotNotAvailable
copy the changed file to my git fork of the plugin
I copied the changed ruby file to my git fork of the plugin and remove all my debugs.
Probably not the recommended way to test and modify a plugin, but it works for me :)