vagrant-libvirt 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +12 -0
  4. data/LICENSE +22 -0
  5. data/README.md +33 -0
  6. data/Rakefile +7 -0
  7. data/example_box/README.md +14 -0
  8. data/example_box/Vagrantfile +45 -0
  9. data/example_box/metadata.json +5 -0
  10. data/lib/vagrant-libvirt/action/connect_libvirt.rb +72 -0
  11. data/lib/vagrant-libvirt/action/create_domain.rb +62 -0
  12. data/lib/vagrant-libvirt/action/create_domain_volume.rb +58 -0
  13. data/lib/vagrant-libvirt/action/create_network_interfaces.rb +85 -0
  14. data/lib/vagrant-libvirt/action/destroy_domain.rb +28 -0
  15. data/lib/vagrant-libvirt/action/handle_box_image.rb +121 -0
  16. data/lib/vagrant-libvirt/action/handle_storage_pool.rb +49 -0
  17. data/lib/vagrant-libvirt/action/is_created.rb +18 -0
  18. data/lib/vagrant-libvirt/action/message_already_created.rb +16 -0
  19. data/lib/vagrant-libvirt/action/message_not_created.rb +16 -0
  20. data/lib/vagrant-libvirt/action/read_ssh_info.rb +51 -0
  21. data/lib/vagrant-libvirt/action/read_state.rb +38 -0
  22. data/lib/vagrant-libvirt/action/set_name_of_domain.rb +31 -0
  23. data/lib/vagrant-libvirt/action/start_domain.rb +27 -0
  24. data/lib/vagrant-libvirt/action/sync_folders.rb +58 -0
  25. data/lib/vagrant-libvirt/action/timed_provision.rb +21 -0
  26. data/lib/vagrant-libvirt/action/wait_till_up.rb +96 -0
  27. data/lib/vagrant-libvirt/action.rb +94 -0
  28. data/lib/vagrant-libvirt/config.rb +48 -0
  29. data/lib/vagrant-libvirt/errors.rb +90 -0
  30. data/lib/vagrant-libvirt/plugin.rb +77 -0
  31. data/lib/vagrant-libvirt/provider.rb +76 -0
  32. data/lib/vagrant-libvirt/templates/default_storage_pool.xml.erb +13 -0
  33. data/lib/vagrant-libvirt/templates/domain.xml.erb +34 -0
  34. data/lib/vagrant-libvirt/templates/interface.xml.erb +7 -0
  35. data/lib/vagrant-libvirt/templates/volume_snapshot.xml.erb +26 -0
  36. data/lib/vagrant-libvirt/util/collection.rb +22 -0
  37. data/lib/vagrant-libvirt/util/erb_template.rb +21 -0
  38. data/lib/vagrant-libvirt/util/timer.rb +17 -0
  39. data/lib/vagrant-libvirt/util.rb +10 -0
  40. data/lib/vagrant-libvirt/version.rb +5 -0
  41. data/lib/vagrant-libvirt.rb +30 -0
  42. data/locales/en.yml +103 -0
  43. data/vagrant-libvirt.gemspec +23 -0
  44. metadata +127 -0
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Libvirt
3
+ module Action
4
+ class MessageAlreadyCreated
5
+ def initialize(app, env)
6
+ @app = app
7
+ end
8
+
9
+ def call(env)
10
+ env[:ui].info(I18n.t("vagrant_libvirt.already_created"))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ module VagrantPlugins
2
+ module Libvirt
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_libvirt.not_created"))
11
+ @app.call(env)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,51 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Action
6
+ # This action reads the SSH info for the machine and puts it into the
7
+ # `:machine_ssh_info` key in the environment.
8
+ class ReadSSHInfo
9
+ def initialize(app, env)
10
+ @app = app
11
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::read_ssh_info")
12
+ end
13
+
14
+ def call(env)
15
+ env[:machine_ssh_info] = read_ssh_info(
16
+ env[:libvirt_compute], env[:machine])
17
+
18
+ @app.call(env)
19
+ end
20
+
21
+
22
+ def read_ssh_info(libvirt, machine)
23
+ return nil if machine.id.nil?
24
+
25
+ # Find the machine
26
+ server = libvirt.servers.get(machine.id)
27
+ if server.nil?
28
+ # The machine can't be found
29
+ @logger.info("Machine couldn't be found, assuming it got destroyed.")
30
+ machine.id = nil
31
+ return nil
32
+ end
33
+
34
+ # Get ip address of machine
35
+ ip_address = server.public_ip_address
36
+ ip_address = server.private_ip_address if ip_address == nil
37
+ return nil if ip_address == nil
38
+
39
+ # Return the info
40
+ # TODO: Some info should be configurable in Vagrantfile
41
+ return {
42
+ :host => ip_address,
43
+ :port => 22,
44
+ :username => 'root',
45
+ }
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ require "log4r"
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Action
6
+ # This action reads the state of the machine and puts it in the
7
+ # `:machine_state_id` key in the environment.
8
+ class ReadState
9
+ def initialize(app, env)
10
+ @app = app
11
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::read_state")
12
+ end
13
+
14
+ def call(env)
15
+ env[:machine_state_id] = read_state(env[:libvirt_compute], env[:machine])
16
+
17
+ @app.call(env)
18
+ end
19
+
20
+ def read_state(libvirt, machine)
21
+ return :not_created if machine.id.nil?
22
+
23
+ # Find the machine
24
+ server = libvirt.servers.get(machine.id)
25
+ if server.nil? || [:"shutting-down", :terminated].include?(server.state.to_sym)
26
+ # The machine can't be found
27
+ @logger.info("Machine not found or terminated, assuming it got destroyed.")
28
+ machine.id = nil
29
+ return :not_created
30
+ end
31
+
32
+ # Return the state
33
+ return server.state.to_sym
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ module VagrantPlugins
2
+ module Libvirt
3
+ module Action
4
+
5
+ # Setup name for domain and domain volumes.
6
+ class SetNameOfDomain
7
+ def initialize(app, env)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ env[:domain_name] = env[:root_path].basename.to_s.dup
13
+ env[:domain_name].gsub!(/[^-a-z0-9_]/i, "")
14
+ env[:domain_name] << "_#{Time.now.to_i}"
15
+
16
+ # Check if the domain name is not already taken
17
+ domain = Libvirt::Util::Collection.find_matching(
18
+ env[:libvirt_compute].servers.all, env[:domain_name])
19
+ if domain != nil
20
+ raise Vagrant::Errors::DomainNameExists,
21
+ :domain_name => env[:domain_name]
22
+ end
23
+
24
+ @app.call(env)
25
+ end
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,27 @@
1
+ require 'log4r'
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Action
6
+
7
+ # Just start the domain.
8
+ class StartDomain
9
+ def initialize(app, env)
10
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::start_domain")
11
+ @app = app
12
+ end
13
+
14
+ def call(env)
15
+ env[:ui].info(I18n.t("vagrant_libvirt.starting_domain"))
16
+
17
+ domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)
18
+ raise Errors::NoDomainError if domain == nil
19
+ domain.start
20
+
21
+ @app.call(env)
22
+ end
23
+ end
24
+
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,58 @@
1
+ require "log4r"
2
+ require "vagrant/util/subprocess"
3
+
4
+ module VagrantPlugins
5
+ module Libvirt
6
+ module Action
7
+ # This middleware uses `rsync` to sync the folders over to the
8
+ # libvirt domain.
9
+ class SyncFolders
10
+ def initialize(app, env)
11
+ @app = app
12
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::sync_folders")
13
+ end
14
+
15
+ def call(env)
16
+ @app.call(env)
17
+
18
+ ssh_info = env[:machine].ssh_info
19
+
20
+ env[:machine].config.vm.synced_folders.each do |id, data|
21
+ hostpath = File.expand_path(data[:hostpath], env[:root_path])
22
+ guestpath = data[:guestpath]
23
+
24
+ # Make sure there is a trailing slash on the host path to
25
+ # avoid creating an additional directory with rsync
26
+ hostpath = "#{hostpath}/" if hostpath !~ /\/$/
27
+
28
+ env[:ui].info(I18n.t("vagrant_libvirt.rsync_folder",
29
+ :hostpath => hostpath,
30
+ :guestpath => guestpath))
31
+
32
+ # Create the guest path
33
+ env[:machine].communicate.sudo("mkdir -p '#{guestpath}'")
34
+ env[:machine].communicate.sudo(
35
+ "chown #{ssh_info[:username]} '#{guestpath}'")
36
+
37
+ # Rsync over to the guest path using the SSH info
38
+ command = [
39
+ "rsync", "--verbose", "--archive", "-z",
40
+ "--exclude", ".vagrant/",
41
+ "-e", "ssh -p #{ssh_info[:port]} -o StrictHostKeyChecking=no -i '#{ssh_info[:private_key_path]}'",
42
+ hostpath,
43
+ "#{ssh_info[:username]}@#{ssh_info[:host]}:#{guestpath}"]
44
+
45
+ r = Vagrant::Util::Subprocess.execute(*command)
46
+ if r.exit_code != 0
47
+ raise Errors::RsyncError,
48
+ :guestpath => guestpath,
49
+ :hostpath => hostpath,
50
+ :stderr => r.stderr
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+
@@ -0,0 +1,21 @@
1
+ require "vagrant-libvirt/util/timer"
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Action
6
+ # This is the same as the builtin provision except it times the
7
+ # provisioner runs.
8
+ class TimedProvision < Vagrant::Action::Builtin::Provision
9
+ def run_provisioner(env, p)
10
+ timer = Util::Timer.time do
11
+ super
12
+ end
13
+
14
+ env[:metrics] ||= {}
15
+ env[:metrics]["provisioner_times"] ||= []
16
+ env[:metrics]["provisioner_times"] << [p.class.to_s, timer]
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,96 @@
1
+ require 'log4r'
2
+ require 'vagrant-libvirt/util/timer'
3
+ require 'vagrant/util/retryable'
4
+
5
+ module VagrantPlugins
6
+ module Libvirt
7
+ module Action
8
+
9
+ # Wait till domain is started, till it obtains an IP address and is
10
+ # accessible via ssh.
11
+ class WaitTillUp
12
+ include Vagrant::Util::Retryable
13
+
14
+ def initialize(app, env)
15
+ @logger = Log4r::Logger.new("vagrant_libvirt::action::wait_till_up")
16
+ @app = app
17
+ end
18
+
19
+ def call(env)
20
+ # Initialize metrics if they haven't been
21
+ env[:metrics] ||= {}
22
+
23
+ # Get domain object
24
+ domain = env[:libvirt_compute].servers.get(env[:machine].id.to_s)
25
+ raise NoDomainError if domain == nil
26
+
27
+ # Wait for domain to obtain an ip address. Ip address is searched
28
+ # from arp table, either localy or remotely via ssh, if libvirt
29
+ # connection was done via ssh.
30
+ env[:ip_address] = nil
31
+ env[:metrics]["instance_ip_time"] = Util::Timer.time do
32
+ env[:ui].info(I18n.t("vagrant_libvirt.waiting_for_ip"))
33
+ retryable(:on => Fog::Errors::TimeoutError, :tries => 300) do
34
+ # If we're interrupted don't worry about waiting
35
+ next if env[:interrupted]
36
+
37
+ # Wait for domain to obtain an ip address
38
+ domain.wait_for(2) {
39
+ addresses.each_pair do |type, ip|
40
+ env[:ip_address] = ip[0]
41
+ end
42
+ env[:ip_address] != nil
43
+ }
44
+ end
45
+ end
46
+ terminate(env) if env[:interrupted]
47
+ @logger.info("Got IP address #{env[:ip_address]}")
48
+ @logger.info("Time for getting IP: #{env[:metrics]["instance_ip_time"]}")
49
+
50
+ # Machine has ip address assigned, now wait till we are able to
51
+ # connect via ssh.
52
+ env[:metrics]["instance_ssh_time"] = Util::Timer.time do
53
+ env[:ui].info(I18n.t("vagrant_libvirt.waiting_for_ssh"))
54
+ retryable(:on => Fog::Errors::TimeoutError, :tries => 60) do
55
+ # If we're interrupted don't worry about waiting
56
+ next if env[:interrupted]
57
+
58
+ # Wait till we are able to connect via ssh.
59
+ while true
60
+ # If we're interrupted then just back out
61
+ break if env[:interrupted]
62
+ break if env[:machine].communicate.ready?
63
+ sleep 2
64
+ end
65
+ end
66
+ end
67
+ terminate(env) if env[:interrupted]
68
+ @logger.info("Time for SSH ready: #{env[:metrics]["instance_ssh_time"]}")
69
+
70
+ # Booted and ready for use.
71
+ #env[:ui].info(I18n.t("vagrant_libvirt.ready"))
72
+
73
+ @app.call(env)
74
+ end
75
+
76
+ def recover(env)
77
+ return if env["vagrant.error"].is_a?(Vagrant::Errors::VagrantError)
78
+
79
+ if env[:machine].provider.state.id != :not_created
80
+ # Undo the import
81
+ terminate(env)
82
+ end
83
+ end
84
+
85
+ def terminate(env)
86
+ destroy_env = env.dup
87
+ destroy_env.delete(:interrupted)
88
+ destroy_env[:config_validate] = false
89
+ destroy_env[:force_confirm_destroy] = true
90
+ env[:action_runner].run(Action.action_destroy, destroy_env)
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
@@ -0,0 +1,94 @@
1
+ require 'vagrant/action/builder'
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Action
6
+ # Include the built-in modules so we can use them as top-level things.
7
+ include Vagrant::Action::Builtin
8
+
9
+ # This action is called to bring the box up from nothing.
10
+ def self.action_up
11
+ Vagrant::Action::Builder.new.tap do |b|
12
+ b.use ConfigValidate
13
+ b.use ConnectLibvirt
14
+ b.use Call, IsCreated do |env, b2|
15
+ if env[:result]
16
+ b2.use MessageAlreadyCreated
17
+ next
18
+ end
19
+
20
+ b2.use SetNameOfDomain
21
+ b2.use HandleStoragePool
22
+ b2.use HandleBoxImage
23
+ b2.use CreateDomainVolume
24
+ b2.use CreateDomain
25
+ b2.use CreateNetworkInterfaces
26
+ end
27
+
28
+ b.use TimedProvision
29
+ b.use StartDomain
30
+ b.use WaitTillUp
31
+ b.use SyncFolders
32
+ end
33
+ end
34
+
35
+ # This is the action that is primarily responsible for completely
36
+ # freeing the resources of the underlying virtual machine.
37
+ def self.action_destroy
38
+ Vagrant::Action::Builder.new.tap do |b|
39
+ b.use ConfigValidate
40
+ b.use Call, IsCreated do |env, b2|
41
+ if !env[:result]
42
+ b2.use MessageNotCreated
43
+ next
44
+ end
45
+
46
+ b2.use ConnectLibvirt
47
+ b2.use DestroyDomain
48
+ end
49
+ end
50
+ end
51
+
52
+ # This action is called to read the state of the machine. The resulting
53
+ # state is expected to be put into the `:machine_state_id` key.
54
+ def self.action_read_state
55
+ Vagrant::Action::Builder.new.tap do |b|
56
+ b.use ConfigValidate
57
+ b.use ConnectLibvirt
58
+ b.use ReadState
59
+ end
60
+ end
61
+
62
+ # This action is called to read the SSH info of the machine. The
63
+ # resulting state is expected to be put into the `:machine_ssh_info`
64
+ # key.
65
+ def self.action_read_ssh_info
66
+ Vagrant::Action::Builder.new.tap do |b|
67
+ b.use ConfigValidate
68
+ b.use ConnectLibvirt
69
+ b.use ReadSSHInfo
70
+ end
71
+ end
72
+
73
+ action_root = Pathname.new(File.expand_path("../action", __FILE__))
74
+ autoload :ConnectLibvirt, action_root.join("connect_libvirt")
75
+ autoload :IsCreated, action_root.join("is_created")
76
+ autoload :MessageAlreadyCreated, action_root.join("message_already_created")
77
+ autoload :MessageNotCreated, action_root.join("message_not_created")
78
+ autoload :HandleStoragePool, action_root.join("handle_storage_pool")
79
+ autoload :HandleBoxImage, action_root.join("handle_box_image")
80
+ autoload :SetNameOfDomain, action_root.join("set_name_of_domain")
81
+ autoload :CreateDomainVolume, action_root.join("create_domain_volume")
82
+ autoload :CreateDomain, action_root.join("create_domain")
83
+ autoload :CreateNetworkInterfaces, action_root.join("create_network_interfaces")
84
+ autoload :DestroyDomain, action_root.join("destroy_domain")
85
+ autoload :StartDomain, action_root.join("start_domain")
86
+ autoload :ReadState, action_root.join("read_state")
87
+ autoload :ReadSSHInfo, action_root.join("read_ssh_info")
88
+ autoload :TimedProvision, action_root.join("timed_provision")
89
+ autoload :WaitTillUp, action_root.join("wait_till_up")
90
+ autoload :SyncFolders, action_root.join("sync_folders")
91
+ end
92
+ end
93
+ end
94
+
@@ -0,0 +1,48 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ class Config < Vagrant.plugin('2', :config)
6
+ # A hypervisor name to access via Libvirt.
7
+ attr_accessor :driver
8
+
9
+ # The name of the server, where libvirtd is running.
10
+ attr_accessor :host
11
+
12
+ # If use ssh tunnel to connect to Libvirt.
13
+ attr_accessor :connect_via_ssh
14
+
15
+ # The username to access Libvirt.
16
+ attr_accessor :username
17
+
18
+ # Password for Libvirt connection.
19
+ attr_accessor :password
20
+
21
+ # Libvirt storage pool name, where box image and instance snapshots will
22
+ # be stored.
23
+ attr_accessor :storage_pool_name
24
+
25
+ def initialize
26
+ @driver = UNSET_VALUE
27
+ @host = UNSET_VALUE
28
+ @connect_via_ssh = UNSET_VALUE
29
+ @username = UNSET_VALUE
30
+ @password = UNSET_VALUE
31
+ @storage_pool_name = UNSET_VALUE
32
+ end
33
+
34
+ def finalize!
35
+ @driver = 'qemu' if @driver == UNSET_VALUE
36
+ @host = nil if @host == UNSET_VALUE
37
+ @connect_via_ssh = false if @connect_via_ssh == UNSET_VALUE
38
+ @username = nil if @username == UNSET_VALUE
39
+ @password = nil if @password == UNSET_VALUE
40
+ @storage_pool_name = 'default' if @storage_pool_name == UNSET_VALUE
41
+ end
42
+
43
+ def validate(machine)
44
+ end
45
+ end
46
+ end
47
+ end
48
+
@@ -0,0 +1,90 @@
1
+ require 'vagrant'
2
+
3
+ module VagrantPlugins
4
+ module Libvirt
5
+ module Errors
6
+ class VagrantLibvirtError < Vagrant::Errors::VagrantError
7
+ error_namespace("vagrant_libvirt.errors")
8
+ end
9
+
10
+ # Storage pools and volumes exceptions
11
+ class NoStoragePool < VagrantLibvirtError
12
+ error_key(:no_storage_pool)
13
+ end
14
+
15
+ class DomainVolumeExists < VagrantLibvirtError
16
+ error_key(:domain_volume_exists)
17
+ end
18
+
19
+ class NoDomainVolume < VagrantLibvirtError
20
+ error_key(:no_domain_volume)
21
+ end
22
+
23
+ class CreatingStoragePoolError < VagrantLibvirtError
24
+ error_key(:creating_storage_pool_error)
25
+ end
26
+
27
+ class ImageUploadError < VagrantLibvirtError
28
+ error_key(:image_upload_error_error)
29
+ end
30
+
31
+
32
+ # Box exceptions
33
+ class NoBoxVolume < VagrantLibvirtError
34
+ error_key(:no_box_volume)
35
+ end
36
+
37
+ class NoBoxVirtualSizeSet < VagrantLibvirtError
38
+ error_key(:no_box_virtual_size_error)
39
+ end
40
+
41
+ class NoBoxFormatSet < VagrantLibvirtError
42
+ error_key(:no_box_format_error)
43
+ end
44
+
45
+ class WrongBoxFormatSet < VagrantLibvirtError
46
+ error_key(:wrong_box_format_error)
47
+ end
48
+
49
+
50
+ # Fog libvirt exceptions
51
+ class FogLibvirtConnectionError < VagrantLibvirtError
52
+ error_key(:fog_libvirt_connection_error)
53
+ end
54
+
55
+ class FogCreateVolumeError < VagrantLibvirtError
56
+ error_key(:fog_create_volume_error)
57
+ end
58
+
59
+ class FogCreateDomainVolumeError < VagrantLibvirtError
60
+ error_key(:fog_create_domain_volume_error)
61
+ end
62
+
63
+ class FogCreateServerError < VagrantLibvirtError
64
+ error_key(:fog_create_server_error)
65
+ end
66
+
67
+
68
+ # Other exceptions
69
+ class InterfaceSlotNotAvailable < VagrantLibvirtError
70
+ error_key(:interface_slot_not_available)
71
+ end
72
+
73
+ class RsyncError < VagrantLibvirtError
74
+ error_key(:rsync_error)
75
+ end
76
+
77
+ class DomainNameExists < VagrantLibvirtError
78
+ error_key(:domain_name_exists_error)
79
+ end
80
+
81
+ class NoDomainError < VagrantLibvirtError
82
+ error_key(:no_domain_error)
83
+ end
84
+
85
+ class AttachDeviceError < VagrantLibvirtError
86
+ error_key(:attach_device_error)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,77 @@
1
+ begin
2
+ require 'vagrant'
3
+ rescue LoadError
4
+ raise "The Vagrant Libvirt plugin must be run within Vagrant."
5
+ end
6
+
7
+
8
+ # This is a sanity check to make sure no one is attempting to install
9
+ # this into an early Vagrant version.
10
+ if Vagrant::VERSION < '1.1.0'
11
+ raise "The Vagrant Libvirt plugin is only compatible with Vagrant 1.1+"
12
+ end
13
+
14
+ module VagrantPlugins
15
+ module Libvirt
16
+ class Plugin < Vagrant.plugin('2')
17
+ name "libvirt"
18
+ description <<-DESC
19
+ Vagrant plugin to manage VMs in libvirt.
20
+ DESC
21
+
22
+
23
+ config("libvirt", :provider) do
24
+ require_relative "config"
25
+ Config
26
+ end
27
+
28
+ provider "libvirt" do
29
+ # Setup logging and i18n
30
+ setup_logging
31
+ setup_i18n
32
+
33
+ require_relative "provider"
34
+ Provider
35
+ end
36
+
37
+
38
+ # This initializes the internationalization strings.
39
+ def self.setup_i18n
40
+ I18n.load_path << File.expand_path("locales/en.yml", Libvirt.source_root)
41
+ I18n.reload!
42
+ end
43
+
44
+
45
+ # This sets up our log level to be whatever VAGRANT_LOG is.
46
+ def self.setup_logging
47
+ require "log4r"
48
+
49
+ level = nil
50
+ begin
51
+ level = Log4r.const_get(ENV["VAGRANT_LOG"].upcase)
52
+ rescue NameError
53
+ # This means that the logging constant wasn't found,
54
+ # which is fine. We just keep `level` as `nil`. But
55
+ # we tell the user.
56
+ level = nil
57
+ end
58
+
59
+ # Some constants, such as "true" resolve to booleans, so the
60
+ # above error checking doesn't catch it. This will check to make
61
+ # sure that the log level is an integer, as Log4r requires.
62
+ level = nil if !level.is_a?(Integer)
63
+
64
+ # Set the logging level on all "vagrant" namespaced
65
+ # logs as long as we have a valid level.
66
+ if level
67
+ logger = Log4r::Logger.new("vagrant_libvirt")
68
+ logger.outputters = Log4r::Outputter.stderr
69
+ logger.level = level
70
+ logger = nil
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+