vagrant 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/Gemfile +2 -2
  2. data/README.md +2 -2
  3. data/Rakefile +1 -1
  4. data/VERSION +1 -1
  5. data/config/default.rb +13 -3
  6. data/lib/vagrant.rb +10 -13
  7. data/lib/vagrant/actions/base.rb +14 -2
  8. data/lib/vagrant/actions/box/download.rb +2 -7
  9. data/lib/vagrant/actions/box/verify.rb +1 -1
  10. data/lib/vagrant/actions/runner.rb +0 -1
  11. data/lib/vagrant/actions/vm/boot.rb +2 -6
  12. data/lib/vagrant/actions/vm/customize.rb +7 -5
  13. data/lib/vagrant/actions/vm/destroy.rb +4 -3
  14. data/lib/vagrant/actions/vm/down.rb +6 -3
  15. data/lib/vagrant/actions/vm/export.rb +2 -4
  16. data/lib/vagrant/actions/vm/forward_ports.rb +77 -16
  17. data/lib/vagrant/actions/vm/halt.rb +10 -2
  18. data/lib/vagrant/actions/vm/import.rb +2 -4
  19. data/lib/vagrant/actions/vm/move_hard_drive.rb +2 -2
  20. data/lib/vagrant/actions/vm/network.rb +120 -0
  21. data/lib/vagrant/actions/vm/package.rb +11 -7
  22. data/lib/vagrant/actions/vm/provision.rb +3 -3
  23. data/lib/vagrant/actions/vm/reload.rb +2 -9
  24. data/lib/vagrant/actions/vm/shared_folders.rb +19 -39
  25. data/lib/vagrant/actions/vm/start.rb +10 -2
  26. data/lib/vagrant/actions/vm/up.rb +5 -6
  27. data/lib/vagrant/active_list.rb +23 -13
  28. data/lib/vagrant/box.rb +2 -2
  29. data/lib/vagrant/busy.rb +3 -3
  30. data/lib/vagrant/command.rb +2 -2
  31. data/lib/vagrant/commands/base.rb +40 -20
  32. data/lib/vagrant/commands/destroy.rb +17 -3
  33. data/lib/vagrant/commands/halt.rb +23 -3
  34. data/lib/vagrant/commands/package.rb +54 -14
  35. data/lib/vagrant/commands/provision.rb +31 -0
  36. data/lib/vagrant/commands/reload.rb +16 -3
  37. data/lib/vagrant/commands/resume.rb +16 -3
  38. data/lib/vagrant/commands/ssh.rb +25 -3
  39. data/lib/vagrant/commands/ssh_config.rb +20 -5
  40. data/lib/vagrant/commands/status.rb +107 -40
  41. data/lib/vagrant/commands/suspend.rb +16 -3
  42. data/lib/vagrant/commands/up.rb +26 -7
  43. data/lib/vagrant/config.rb +82 -12
  44. data/lib/vagrant/downloaders/base.rb +8 -1
  45. data/lib/vagrant/downloaders/http.rb +31 -19
  46. data/lib/vagrant/environment.rb +146 -49
  47. data/lib/vagrant/provisioners/base.rb +19 -5
  48. data/lib/vagrant/provisioners/chef.rb +12 -4
  49. data/lib/vagrant/provisioners/chef_server.rb +13 -6
  50. data/lib/vagrant/provisioners/chef_solo.rb +7 -3
  51. data/lib/vagrant/resource_logger.rb +126 -0
  52. data/lib/vagrant/ssh.rb +109 -8
  53. data/lib/vagrant/systems/base.rb +70 -0
  54. data/lib/vagrant/systems/linux.rb +137 -0
  55. data/lib/vagrant/util.rb +1 -45
  56. data/lib/vagrant/util/error_helper.rb +13 -0
  57. data/lib/vagrant/util/glob_loader.rb +22 -0
  58. data/lib/vagrant/util/output_helper.rb +9 -0
  59. data/lib/vagrant/util/plain_logger.rb +12 -0
  60. data/lib/vagrant/util/platform.rb +7 -2
  61. data/lib/vagrant/util/template_renderer.rb +2 -2
  62. data/lib/vagrant/util/translator.rb +35 -0
  63. data/lib/vagrant/vm.rb +91 -10
  64. data/templates/crontab_entry.erb +1 -0
  65. data/templates/network_entry.erb +8 -0
  66. data/templates/ssh_config.erb +1 -0
  67. data/templates/{errors.yml → strings.yml} +111 -3
  68. data/templates/sync.erb +14 -0
  69. data/test/test_helper.rb +46 -3
  70. data/test/vagrant/actions/box/download_test.rb +0 -17
  71. data/test/vagrant/actions/vm/boot_test.rb +3 -10
  72. data/test/vagrant/actions/vm/customize_test.rb +6 -0
  73. data/test/vagrant/actions/vm/destroy_test.rb +6 -5
  74. data/test/vagrant/actions/vm/down_test.rb +5 -11
  75. data/test/vagrant/actions/vm/export_test.rb +1 -0
  76. data/test/vagrant/actions/vm/forward_ports_test.rb +92 -15
  77. data/test/vagrant/actions/vm/halt_test.rb +36 -4
  78. data/test/vagrant/actions/vm/import_test.rb +2 -0
  79. data/test/vagrant/actions/vm/network_test.rb +237 -0
  80. data/test/vagrant/actions/vm/package_test.rb +35 -5
  81. data/test/vagrant/actions/vm/provision_test.rb +3 -3
  82. data/test/vagrant/actions/vm/reload_test.rb +1 -1
  83. data/test/vagrant/actions/vm/shared_folders_test.rb +41 -74
  84. data/test/vagrant/actions/vm/start_test.rb +41 -3
  85. data/test/vagrant/actions/vm/up_test.rb +10 -21
  86. data/test/vagrant/active_list_test.rb +28 -43
  87. data/test/vagrant/commands/base_test.rb +25 -4
  88. data/test/vagrant/commands/destroy_test.rb +24 -12
  89. data/test/vagrant/commands/halt_test.rb +33 -11
  90. data/test/vagrant/commands/package_test.rb +77 -57
  91. data/test/vagrant/commands/provision_test.rb +50 -0
  92. data/test/vagrant/commands/reload_test.rb +27 -11
  93. data/test/vagrant/commands/resume_test.rb +25 -14
  94. data/test/vagrant/commands/ssh_config_test.rb +40 -17
  95. data/test/vagrant/commands/ssh_test.rb +52 -13
  96. data/test/vagrant/commands/status_test.rb +21 -1
  97. data/test/vagrant/commands/suspend_test.rb +25 -14
  98. data/test/vagrant/commands/up_test.rb +25 -19
  99. data/test/vagrant/config_test.rb +74 -18
  100. data/test/vagrant/downloaders/base_test.rb +2 -1
  101. data/test/vagrant/downloaders/http_test.rb +18 -8
  102. data/test/vagrant/environment_test.rb +245 -77
  103. data/test/vagrant/provisioners/base_test.rb +4 -4
  104. data/test/vagrant/provisioners/chef_server_test.rb +18 -7
  105. data/test/vagrant/provisioners/chef_solo_test.rb +17 -7
  106. data/test/vagrant/provisioners/chef_test.rb +22 -9
  107. data/test/vagrant/resource_logger_test.rb +144 -0
  108. data/test/vagrant/ssh_session_test.rb +46 -0
  109. data/test/vagrant/ssh_test.rb +42 -2
  110. data/test/vagrant/systems/linux_test.rb +174 -0
  111. data/test/vagrant/util/error_helper_test.rb +5 -0
  112. data/test/vagrant/util/output_helper_test.rb +5 -0
  113. data/test/vagrant/util/plain_logger_test.rb +17 -0
  114. data/test/vagrant/util/platform_test.rb +18 -0
  115. data/test/vagrant/util/{errors_test.rb → translator_test.rb} +25 -21
  116. data/test/vagrant/util_test.rb +12 -49
  117. data/test/vagrant/vm_test.rb +133 -11
  118. data/vagrant.gemspec +39 -15
  119. metadata +64 -40
  120. data/lib/vagrant/commands/down.rb +0 -16
  121. data/lib/vagrant/util/errors.rb +0 -36
  122. data/lib/vagrant/util/progress_meter.rb +0 -33
  123. data/test/vagrant/commands/down_test.rb +0 -17
  124. data/test/vagrant/util/progress_meter_test.rb +0 -33
@@ -56,7 +56,7 @@ module Vagrant
56
56
  # of a specific instance.
57
57
  attr_accessor :env
58
58
 
59
- class <<self
59
+ class << self
60
60
  # Returns an array of all created boxes, as strings.
61
61
  #
62
62
  # @return [Array<String>]
@@ -149,4 +149,4 @@ module Vagrant
149
149
  self.class.directory(env, self.name)
150
150
  end
151
151
  end
152
- end
152
+ end
@@ -45,7 +45,7 @@ module Vagrant
45
45
 
46
46
  def wait_for_not_busy(sleeptime=5)
47
47
  if @@trap_thread
48
- logger.info "Exiting vagrant immediately!"
48
+ # logger.info "Exiting vagrant immediately!"
49
49
  Thread.kill(@@trap_thread)
50
50
  abort
51
51
  return # for tests
@@ -55,12 +55,12 @@ module Vagrant
55
55
  # Wait while the app is busy
56
56
  loop do
57
57
  break unless busy?
58
- logger.info "Waiting for vagrant to clean itself up..."
58
+ # logger.info "Waiting for vagrant to clean itself up..."
59
59
  sleep sleeptime
60
60
  end
61
61
 
62
62
  # Exit out of the entire script
63
- logger.info "Exiting vagrant..."
63
+ # logger.info "Exiting vagrant..."
64
64
  exit
65
65
  end
66
66
  end
@@ -5,7 +5,7 @@ module Vagrant
5
5
  class Command
6
6
  attr_reader :env
7
7
 
8
- class <<self
8
+ class << self
9
9
  # Executes a given subcommand within the current environment (from the
10
10
  # current working directory).
11
11
  def execute(*args)
@@ -24,4 +24,4 @@ module Vagrant
24
24
  Commands::Base.dispatch(env, *args)
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -12,7 +12,7 @@ module Vagrant
12
12
 
13
13
  attr_reader :env
14
14
 
15
- class <<self
15
+ class << self
16
16
  # Contains the list of registered subcommands. The registered commands are
17
17
  # stored in a hash table and are therefore unordered.
18
18
  #
@@ -50,22 +50,6 @@ module Vagrant
50
50
  klass.dispatch(env, *args)
51
51
  end
52
52
 
53
- # Prints out the list of supported commands and their descriptions (if
54
- # available) then exits.
55
- def puts_help
56
- puts "Usage: vagrant SUBCOMMAND ...\n\n"
57
-
58
- puts "Supported commands:"
59
- subcommands.keys.sort.each do |key|
60
- klass = subcommands[key]
61
- next if klass.description.empty?
62
-
63
- puts "#{' ' * 4}#{key.ljust(20)}#{klass.description}"
64
- end
65
-
66
- exit
67
- end
68
-
69
53
  # Sets or reads the description, depending on if the value is set in the
70
54
  # parameter.
71
55
  def description(value=nil)
@@ -92,7 +76,7 @@ module Vagrant
92
76
  else
93
77
  # Just print out the help, since this top-level command does nothing
94
78
  # on its own
95
- self.class.puts_help
79
+ show_help
96
80
  end
97
81
  end
98
82
 
@@ -110,6 +94,23 @@ module Vagrant
110
94
  # Methods below are not meant to be overriden/implemented by subclasses
111
95
  #-------------------------------------------------------------------
112
96
 
97
+ # Parses the options for a given command and if a name was
98
+ # given, it calls the single method, otherwise it calls the all
99
+ # method. This helper is an abstraction which allows commands to
100
+ # easily be used in both regular and multi-VM environments.
101
+ def all_or_single(args, method_prefix)
102
+ args = parse_options(args)
103
+
104
+ single_method = "#{method_prefix}_single".to_sym
105
+ if args[0]
106
+ send(single_method, args[0])
107
+ else
108
+ env.vms.keys.each do |name|
109
+ send(single_method, name)
110
+ end
111
+ end
112
+ end
113
+
113
114
  # Shows the version
114
115
  def puts_version
115
116
  File.open(File.join(PROJECT_ROOT, "VERSION"), "r") do |f|
@@ -122,6 +123,12 @@ module Vagrant
122
123
  def option_parser(reload=false)
123
124
  @option_parser = nil if reload
124
125
  @option_parser ||= OptionParser.new do |opts|
126
+ # The --help flag is available on all children commands, and will
127
+ # immediately show help.
128
+ opts.on("--help", "Show help for the current subcommand.") do
129
+ show_help
130
+ end
131
+
125
132
  options_spec(opts)
126
133
  end
127
134
  end
@@ -136,7 +143,6 @@ module Vagrant
136
143
  # to parse command line options.
137
144
  def parse_options(args)
138
145
  option_parser.parse!(args)
139
- options
140
146
  rescue OptionParser::InvalidOption
141
147
  show_help
142
148
  end
@@ -156,8 +162,22 @@ module Vagrant
156
162
  end
157
163
 
158
164
  puts option_parser.help
165
+
166
+ my_klass = self.class
167
+ if !my_klass.subcommands.empty?
168
+ puts "\nSupported subcommands:"
169
+ my_klass.subcommands.keys.sort.each do |key|
170
+ klass = my_klass.subcommands[key]
171
+ next if klass.description.empty?
172
+
173
+ puts "#{' ' * 8}#{key.ljust(20)}#{klass.description}"
174
+ end
175
+
176
+ puts "\nFor help on a specific subcommand, run `vagrant SUBCOMMAND --help`"
177
+ end
178
+
159
179
  exit
160
180
  end
161
181
  end
162
182
  end
163
- end
183
+ end
@@ -11,8 +11,22 @@ module Vagrant
11
11
  description "Destroys the vagrant environment"
12
12
 
13
13
  def execute(args=[])
14
- env.require_persisted_vm
15
- env.vm.destroy
14
+ all_or_single(args, :destroy)
15
+ end
16
+
17
+ # Destroys a single VM by name.
18
+ def destroy_single(name)
19
+ vm = env.vms[name.to_sym]
20
+ if vm.nil?
21
+ error_and_exit(:unknown_vm, :vm => name)
22
+ return # for tests
23
+ end
24
+
25
+ if vm.created?
26
+ vm.destroy
27
+ else
28
+ vm.env.logger.info "VM '#{name}' not created. Ignoring."
29
+ end
16
30
  end
17
31
 
18
32
  def options_spec(opts)
@@ -20,4 +34,4 @@ module Vagrant
20
34
  end
21
35
  end
22
36
  end
23
- end
37
+ end
@@ -11,13 +11,33 @@ module Vagrant
11
11
  description "Halts the currently running vagrant environment"
12
12
 
13
13
  def execute(args=[])
14
- env.require_persisted_vm
15
- env.vm.execute!(Actions::VM::Halt)
14
+ all_or_single(args, :halt)
15
+ end
16
+
17
+ def halt_single(name)
18
+ vm = env.vms[name.to_sym]
19
+ if vm.nil?
20
+ error_and_exit(:unknown_vm, :vm => name)
21
+ return # for tests
22
+ end
23
+
24
+ if vm.created?
25
+ vm.halt(options)
26
+ else
27
+ vm.env.logger.info "VM '#{name}' not created. Ignoring."
28
+ end
16
29
  end
17
30
 
18
31
  def options_spec(opts)
19
32
  opts.banner = "Usage: vagrant halt"
33
+
34
+ # Defaults
35
+ options[:force] = false
36
+
37
+ opts.on("-f", "--force", "Forceful shutdown of virtual machine.") do |v|
38
+ options[:force] = true
39
+ end
20
40
  end
21
41
  end
22
42
  end
23
- end
43
+ end
@@ -8,23 +8,57 @@ module Vagrant
8
8
  description "Packages a vagrant environment for distribution"
9
9
 
10
10
  def execute(args=[])
11
- parse_options(args)
11
+ args = parse_options(args)
12
12
 
13
- if !options[:base]
14
- # Packaging a pre-existing environment
15
- env.require_persisted_vm
13
+ if options[:base]
14
+ package_base
16
15
  else
17
- # Packaging a base box; that is a VM not tied to a specific
18
- # vagrant environment
19
- vm = VM.find(options[:base])
20
- vm.env = env if vm
21
- env.vm = vm
16
+ package_single(args[0])
17
+ end
18
+ end
22
19
 
23
- error_and_exit(:vm_base_not_found, :name => options[:base]) unless vm
20
+ def package_base
21
+ # Packaging a base box; that is a VM not tied to a specific
22
+ # vagrant environment
23
+ vm = VM.find(options[:base], env)
24
+ if !vm
25
+ error_and_exit(:vm_base_not_found, :name => options[:base])
26
+ return # for tests
24
27
  end
25
28
 
26
- error_and_exit(:vm_power_off_to_package) unless env.vm.powered_off?
27
- env.vm.package(args[0], options[:include])
29
+ package_vm(vm)
30
+ end
31
+
32
+ def package_single(name)
33
+ if name.nil? && env.multivm?
34
+ error_and_exit(:package_multivm)
35
+ return
36
+ end
37
+
38
+ vm = if name.nil?
39
+ env.vms.values.first
40
+ else
41
+ env.vms[name.to_sym]
42
+ end
43
+
44
+ if vm.nil?
45
+ error_and_exit(:unknown_vm, :vm => name)
46
+ return
47
+ elsif !vm.created?
48
+ error_and_exit(:environment_not_created)
49
+ return
50
+ end
51
+
52
+ package_vm(vm)
53
+ end
54
+
55
+ def package_vm(vm)
56
+ if !vm.powered_off?
57
+ error_and_exit(:vm_power_off_to_package)
58
+ return # for tests
59
+ end
60
+
61
+ vm.package(options)
28
62
  end
29
63
 
30
64
  def options_spec(opts)
@@ -32,15 +66,21 @@ module Vagrant
32
66
 
33
67
  # Defaults
34
68
  options[:include] = []
69
+ options[:base] = nil
70
+ options[:output] = nil
35
71
 
36
- opts.on("--base [BASE]", "Name or UUID of VM to create a base box from") do |v|
72
+ opts.on("--base BASE", "Name or UUID of VM to create a base box from") do |v|
37
73
  options[:base] = v
38
74
  end
39
75
 
40
76
  opts.on("--include x,y,z", Array, "List of files to include in the package") do |v|
41
77
  options[:include] = v
42
78
  end
79
+
80
+ opts.on("-o", "--output FILE", "File to save the package as.") do |v|
81
+ options[:output] = v
82
+ end
43
83
  end
44
84
  end
45
85
  end
46
- end
86
+ end
@@ -0,0 +1,31 @@
1
+ module Vagrant
2
+ class Commands
3
+ #run the provisioner on a running vm
4
+ class Provision < Base
5
+ Base.subcommand "provision", self
6
+ description "Run the provisioner"
7
+
8
+ def execute(args=[])
9
+ all_or_single(args, :provision)
10
+ end
11
+
12
+ def provision_single(name)
13
+ vm = env.vms[name.to_sym]
14
+ if vm.nil?
15
+ error_and_exit(:unknown_vm, :vm => name)
16
+ return # for tests
17
+ end
18
+
19
+ if vm.vm.running?
20
+ vm.provision
21
+ else
22
+ vm.env.logger.info "VM '#{name}' not running. Ignoring provision request."
23
+ end
24
+ end
25
+
26
+ def options_spec(opts)
27
+ opts.banner = "Usage: vagrant provision"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -10,8 +10,21 @@ module Vagrant
10
10
  description "Reload the vagrant environment"
11
11
 
12
12
  def execute(args=[])
13
- env.require_persisted_vm
14
- env.vm.execute!(Actions::VM::Reload)
13
+ all_or_single(args, :reload)
14
+ end
15
+
16
+ def reload_single(name)
17
+ vm = env.vms[name.to_sym]
18
+ if vm.nil?
19
+ error_and_exit(:unknown_vm, :vm => name)
20
+ return # for tests
21
+ end
22
+
23
+ if vm.created?
24
+ vm.reload
25
+ else
26
+ vm.env.logger.info "VM '#{name}' not created. Ignoring."
27
+ end
15
28
  end
16
29
 
17
30
  def options_spec(opts)
@@ -19,4 +32,4 @@ module Vagrant
19
32
  end
20
33
  end
21
34
  end
22
- end
35
+ end
@@ -10,8 +10,21 @@ module Vagrant
10
10
  description "Resumes a suspend vagrant environment"
11
11
 
12
12
  def execute(args=[])
13
- env.require_persisted_vm
14
- env.vm.resume
13
+ all_or_single(args, :resume)
14
+ end
15
+
16
+ def resume_single(name)
17
+ vm = env.vms[name.to_sym]
18
+ if vm.nil?
19
+ error_and_exit(:unknown_vm, :vm => name)
20
+ return # for tests
21
+ end
22
+
23
+ if vm.created?
24
+ vm.resume
25
+ else
26
+ vm.env.logger.info "VM '#{name}' not created. Ignoring."
27
+ end
15
28
  end
16
29
 
17
30
  def options_spec(opts)
@@ -19,4 +32,4 @@ module Vagrant
19
32
  end
20
33
  end
21
34
  end
22
- end
35
+ end
@@ -10,8 +10,30 @@ module Vagrant
10
10
  description "SSH into the currently running environment"
11
11
 
12
12
  def execute(args=[])
13
- env.require_persisted_vm
14
- env.ssh.connect
13
+ args = parse_options(args)
14
+ ssh_connect(args[0])
15
+ end
16
+
17
+ def ssh_connect(name)
18
+ if name.nil? && env.multivm?
19
+ if env.primary_vm.nil?
20
+ error_and_exit(:ssh_multivm)
21
+ return # for tests
22
+ end
23
+ end
24
+
25
+ vm = name.nil? ? env.primary_vm : env.vms[name.to_sym]
26
+ if vm.nil?
27
+ error_and_exit(:unknown_vm, :vm => name)
28
+ return # for tests
29
+ end
30
+
31
+ if !vm.created?
32
+ error_and_exit(:environment_not_created)
33
+ return
34
+ else
35
+ vm.ssh.connect
36
+ end
15
37
  end
16
38
 
17
39
  def options_spec(opts)
@@ -19,4 +41,4 @@ module Vagrant
19
41
  end
20
42
  end
21
43
  end
22
- end
44
+ end