vagrant-kvm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. data/.gitignore +14 -0
  2. data/CHANGELOG.md +3 -0
  3. data/Gemfile +10 -0
  4. data/LICENSE +8 -0
  5. data/README.md +90 -0
  6. data/Rakefile +15 -0
  7. data/example_box/README.md +18 -0
  8. data/example_box/box.xml +78 -0
  9. data/example_box/metadata.json +3 -0
  10. data/lib/vagrant-kvm.rb +20 -0
  11. data/lib/vagrant-kvm/action.rb +268 -0
  12. data/lib/vagrant-kvm/action/boot.rb +22 -0
  13. data/lib/vagrant-kvm/action/check_box.rb +36 -0
  14. data/lib/vagrant-kvm/action/check_created.rb +21 -0
  15. data/lib/vagrant-kvm/action/check_kvm.rb +23 -0
  16. data/lib/vagrant-kvm/action/check_running.rb +21 -0
  17. data/lib/vagrant-kvm/action/created.rb +20 -0
  18. data/lib/vagrant-kvm/action/destroy.rb +19 -0
  19. data/lib/vagrant-kvm/action/destroy_confirm.rb +17 -0
  20. data/lib/vagrant-kvm/action/export.rb +57 -0
  21. data/lib/vagrant-kvm/action/forced_halt.rb +21 -0
  22. data/lib/vagrant-kvm/action/import.rb +54 -0
  23. data/lib/vagrant-kvm/action/init_storage_pool.rb +19 -0
  24. data/lib/vagrant-kvm/action/is_paused.rb +20 -0
  25. data/lib/vagrant-kvm/action/is_running.rb +20 -0
  26. data/lib/vagrant-kvm/action/is_saved.rb +20 -0
  27. data/lib/vagrant-kvm/action/match_mac_address.rb +21 -0
  28. data/lib/vagrant-kvm/action/message_not_created.rb +16 -0
  29. data/lib/vagrant-kvm/action/message_will_not_destroy.rb +17 -0
  30. data/lib/vagrant-kvm/action/network.rb +69 -0
  31. data/lib/vagrant-kvm/action/package.rb +20 -0
  32. data/lib/vagrant-kvm/action/package_vagrantfile.rb +31 -0
  33. data/lib/vagrant-kvm/action/prepare_nfs_settings.rb +61 -0
  34. data/lib/vagrant-kvm/action/prune_nfs_exports.rb +20 -0
  35. data/lib/vagrant-kvm/action/resume.rb +25 -0
  36. data/lib/vagrant-kvm/action/setup_package_files.rb +51 -0
  37. data/lib/vagrant-kvm/action/share_folders.rb +76 -0
  38. data/lib/vagrant-kvm/action/suspend.rb +20 -0
  39. data/lib/vagrant-kvm/config.rb +31 -0
  40. data/lib/vagrant-kvm/driver/driver.rb +271 -0
  41. data/lib/vagrant-kvm/errors.rb +11 -0
  42. data/lib/vagrant-kvm/plugin.rb +73 -0
  43. data/lib/vagrant-kvm/provider.rb +104 -0
  44. data/lib/vagrant-kvm/util.rb +12 -0
  45. data/lib/vagrant-kvm/util/kvm_template_renderer.rb +20 -0
  46. data/lib/vagrant-kvm/util/network_definition.rb +106 -0
  47. data/lib/vagrant-kvm/util/vm_definition.rb +192 -0
  48. data/lib/vagrant-kvm/version.rb +5 -0
  49. data/locales/en.yml +4 -0
  50. data/templates/libvirt_domain.erb +64 -0
  51. data/vagrant-kvm.gemspec +58 -0
  52. metadata +191 -0
@@ -0,0 +1,22 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class Boot
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ @env = env
11
+
12
+ # Start up the VM
13
+ env[:ui].info I18n.t("vagrant.actions.vm.boot.booting")
14
+ env[:machine].provider.driver.start
15
+
16
+ @app.call(env)
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class CheckBox
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ box_name = env[:machine].config.vm.box
11
+ raise Vagrant::Errors::BoxNotSpecified if !box_name
12
+
13
+ if !env[:box_collection].find(box_name, :kvm)
14
+ box_url = env[:machine].config.vm.box_url
15
+ raise Vagrant::Errors::BoxSpecifiedDoesntExist, :name => box_name if !box_url
16
+
17
+ # Add the box then reload the box collection so that it becomes
18
+ # aware of it.
19
+ env[:ui].info I18n.t("vagrant.actions.vm.check_box.not_found", :name => box_name)
20
+ env[:action_runner].run(Vagrant::Action.action_box_add, {
21
+ :box_name => box_name,
22
+ :box_provider => env[:machine].provider_name,
23
+ :box_url => box_url
24
+ })
25
+
26
+ # Reload the environment and set the VM to be the new loaded VM.
27
+ env[:machine] = env[:machine].env.machine(
28
+ env[:machine].name, env[:machine].provider_name, true)
29
+ end
30
+
31
+ @app.call(env)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ # This middleware checks that the VM is created, and raises an exception
5
+ # if it is not, notifying the user that creation is required.
6
+ class CheckCreated
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ if env[:machine].state.id == :not_created
13
+ raise Vagrant::Errors::VMNotCreatedError
14
+ end
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ # Checks that the libvirt/kvm/qemu environment is ready to be used.
5
+ class CheckKvm
6
+ def initialize(app, env)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ # This verifies that kvm/qemu is installed, the environment is
12
+ # set-up and the driver is ready to function. If not, then an
13
+ # exception will be raised which will break us out of execution
14
+ # of the middleware sequence.
15
+ Driver::Driver.new.verify!
16
+
17
+ # Carry on.
18
+ @app.call(env)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ # This middleware checks that the VM is running, and raises an exception
5
+ # if it is not, notifying the user that the VM must be running.
6
+ class CheckRunning
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ if env[:machine].state.id != :running
13
+ raise Vagrant::Errors::VMNotRunningError
14
+ end
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class Created
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is created.
11
+ env[:result] = env[:machine].state.id != :not_created
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class Destroy
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.actions.vm.destroy.destroying")
11
+ env[:machine].provider.driver.delete
12
+ env[:machine].id = nil
13
+
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ require "vagrant/action/builtin/confirm"
2
+
3
+ module VagrantPlugins
4
+ module ProviderKvm
5
+ module Action
6
+ class DestroyConfirm < Vagrant::Action::Builtin::Confirm
7
+ def initialize(app, env)
8
+ force_key = :force_confirm_destroy
9
+ message = I18n.t("vagrant.commands.destroy.confirmation",
10
+ :name => env[:machine].name)
11
+
12
+ super(app, env, message, force_key)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,57 @@
1
+ require "fileutils"
2
+
3
+ module VagrantPlugins
4
+ module ProviderKvm
5
+ module Action
6
+ class Export
7
+ attr_reader :temp_dir
8
+
9
+ def initialize(app, env)
10
+ @app = app
11
+ end
12
+
13
+ def call(env)
14
+ @env = env
15
+
16
+ raise Vagrant::Errors::VMPowerOffToPackage if \
17
+ @env[:machine].provider.state.id != :poweroff
18
+
19
+ setup_temp_dir
20
+ export
21
+
22
+ @app.call(env)
23
+
24
+ recover(env) # called to cleanup temp directory
25
+ end
26
+
27
+ def recover(env)
28
+ if temp_dir && File.exist?(temp_dir)
29
+ FileUtils.rm_rf(temp_dir)
30
+ end
31
+ end
32
+
33
+ def setup_temp_dir
34
+ @env[:ui].info I18n.t("vagrant.actions.vm.export.create_dir")
35
+ @temp_dir = @env["export.temp_dir"] = @env[:tmp_path].join(Time.now.to_i.to_s)
36
+ FileUtils.mkpath(@env["export.temp_dir"])
37
+ end
38
+
39
+ def export
40
+ @env[:ui].info I18n.t("vagrant.actions.vm.export.exporting")
41
+ @env[:machine].provider.driver.export(xml_path) do |progress|
42
+ @env[:ui].clear_line
43
+ @env[:ui].report_progress(progress.percent, 100, false)
44
+ end
45
+
46
+ # Clear the line a final time so the next data can appear
47
+ # alone on the line.
48
+ @env[:ui].clear_line
49
+ end
50
+
51
+ def xml_path
52
+ File.join(@env["export.temp_dir"], "box.xml")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class ForcedHalt
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ current_state = env[:machine].state.id
11
+ if current_state == :running
12
+ env[:ui].info I18n.t("vagrant.actions.vm.halt.force")
13
+ env[:machine].provider.driver.halt
14
+ end
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,54 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class Import
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
11
+ :name => env[:machine].box.name)
12
+
13
+ # Import the virtual machine (ovf or libvirt)
14
+ # if a libvirt XML definition is present we use it
15
+ # otherwise we convert the OVF
16
+ storage_path = File.join(env[:tmp_path],"/storage-pool")
17
+ box_file = env[:machine].box.directory.join("box.xml").to_s
18
+ if File.file?(box_file)
19
+ env[:machine].id = env[:machine].provider.driver.import(
20
+ box_file, storage_path)
21
+ else
22
+ box_file = env[:machine].box.directory.join("box.ovf").to_s
23
+ env[:machine].id = env[:machine].provider.driver.import_ovf(
24
+ box_file, storage_path)
25
+ end
26
+
27
+ # If we got interrupted, then the import could have been
28
+ # interrupted and its not a big deal. Just return out.
29
+ return if env[:interrupted]
30
+
31
+ # Flag as erroneous and return if import failed
32
+ raise Vagrant::Errors::VMImportFailure if !env[:machine].id
33
+
34
+ # Import completed successfully. Continue the chain
35
+ @app.call(env)
36
+ end
37
+
38
+ def recover(env)
39
+ if env[:machine].provider.state.id != :not_created
40
+ return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
41
+
42
+ # Interrupted, destroy the VM. We note that we don't want to
43
+ # validate the configuration here, and we don't want to confirm
44
+ # we want to destroy.
45
+ destroy_env = env.clone
46
+ destroy_env[:config_validate] = false
47
+ destroy_env[:force_confirm_destroy] = true
48
+ env[:action_runner].run(Action.action_destroy, destroy_env)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,19 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ # Initialize storage pool.
5
+ class InitStoragePool
6
+ def initialize(app, env)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ # Create a storage pool in tmp_path if it doesn't exist
12
+ Driver::Driver.new.init_storage(env[:tmp_path])
13
+
14
+ @app.call(env)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class IsPaused
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is paused.
11
+ env[:result] = env[:machine].state.id == :paused
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class IsRunning
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is running.
11
+ env[:result] = env[:machine].state.id == :running
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,20 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class IsSaved
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ # Set the result to be true if the machine is saved.
11
+ env[:result] = env[:machine].state.id == :saved
12
+
13
+ # Call the next if we have one (but we shouldn't, since this
14
+ # middleware is built to run with the Call-type middlewares)
15
+ @app.call(env)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class MatchMACAddress
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ raise Vagrant::Errors::VMBaseMacNotSpecified if !env[:machine].config.vm.base_mac
11
+
12
+ # Create the proc which we want to use to modify the virtual machine
13
+ env[:ui].info I18n.t("vagrant.actions.vm.match_mac.matching")
14
+ env[:machine].provider.driver.set_mac_address(env[:machine].config.vm.base_mac)
15
+
16
+ @app.call(env)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class MessageNotCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info I18n.t("vagrant.commands.common.vm_not_created")
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end