vagrant-triggers 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +6 -2
- data/CHANGELOG.md +20 -2
- data/Gemfile +6 -1
- data/README.md +28 -14
- data/lib/vagrant-triggers.rb +2 -1
- data/lib/vagrant-triggers/action/trigger.rb +16 -42
- data/lib/vagrant-triggers/config.rb +12 -9
- data/lib/vagrant-triggers/dsl.rb +65 -0
- data/lib/vagrant-triggers/plugin.rb +1 -1
- data/lib/vagrant-triggers/version.rb +1 -1
- data/locales/en.yml +21 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/vagrant-triggers/action/trigger_spec.rb +42 -152
- data/spec/vagrant-triggers/config_spec.rb +14 -7
- data/spec/vagrant-triggers/dsl_spec.rb +133 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 92d93f338ac34daa73bb81b1c67e82a098ed6a3b
|
4
|
+
data.tar.gz: 19f64c4f8f7d5379719a126d8e5fdf0fa2db76b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0cb4fa497e40a8697e7f86d7276c63a7e38df7c5c82aaa3c804566fa3bc783138547f8d60640f7cde21b7d051bc1abe891fd0f4cd80f24ced622eb7e19c54bb5
|
7
|
+
data.tar.gz: ad5b94780e81efe97b693e0460ce1163983a95c171d980d2021ffe99c69b92746ee68125e3ab75c2a398a7de0530965c5d30e126f7028c2cdfd88f7d9d30b00d
|
data/.travis.yml
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
-
|
3
|
+
- 2.0.0
|
4
4
|
env:
|
5
|
-
- VAGRANT_VERSION=v1.
|
5
|
+
- VAGRANT_VERSION=v1.5.2
|
6
6
|
matrix:
|
7
7
|
include:
|
8
|
+
- env: VAGRANT_VERSION=master
|
9
|
+
- env: VAGRANT_VERSION=v1.4.3
|
8
10
|
- env: VAGRANT_VERSION=v1.3.5
|
9
11
|
rvm: 1.9.3
|
10
12
|
- env: VAGRANT_VERSION=v1.2.7
|
11
13
|
rvm: 1.9.3
|
14
|
+
allow_failures:
|
15
|
+
- env: VAGRANT_VERSION=master
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,22 @@
|
|
1
|
-
## 0.
|
1
|
+
## 0.3.0 (April 4, 2014)
|
2
|
+
|
3
|
+
CHANGES:
|
4
|
+
|
5
|
+
- Implement a new DSL for running scripts.
|
6
|
+
|
7
|
+
DEPRECATIONS:
|
8
|
+
|
9
|
+
- The ```:info``` and ```:execute``` options has been replaced by the new DSL.
|
10
|
+
|
11
|
+
IMPROVEMENTS:
|
12
|
+
|
13
|
+
- Plugin messages are now localized.
|
14
|
+
|
15
|
+
BUG FIXES:
|
16
|
+
|
17
|
+
- Avoid loops by adding VAGRANT_NO_TRIGGERS to the subprocess shell.
|
18
|
+
|
19
|
+
## 0.2.2 (March 1, 2014)
|
2
20
|
|
3
21
|
NEW FEATURES:
|
4
22
|
|
@@ -6,7 +24,7 @@ NEW FEATURES:
|
|
6
24
|
|
7
25
|
BUG FIXES:
|
8
26
|
|
9
|
-
- Remove Vagrant specific environment variables when executing commands [(#5)](https://github.com/emyl/vagrant-triggers/issues/
|
27
|
+
- Remove Vagrant specific environment variables when executing commands [(#5)](https://github.com/emyl/vagrant-triggers/issues/5)
|
10
28
|
|
11
29
|
## 0.2.1 (November 19, 2013)
|
12
30
|
|
data/Gemfile
CHANGED
@@ -2,8 +2,13 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
|
+
# Warning: Hack below.
|
6
|
+
#
|
7
|
+
# Add the current project gem to the "plugins" group
|
8
|
+
dependencies.find { |dep| dep.name == "vagrant-triggers" }.instance_variable_set(:@groups, [:default, :plugins])
|
9
|
+
|
5
10
|
group :development do
|
6
|
-
gem "vagrant", :github => "mitchellh/vagrant", :ref => ENV.fetch("VAGRANT_VERSION", "
|
11
|
+
gem "vagrant", :github => "mitchellh/vagrant", :ref => ENV.fetch("VAGRANT_VERSION", "master")
|
7
12
|
end
|
8
13
|
|
9
14
|
group :test do
|
data/README.md
CHANGED
@@ -17,32 +17,42 @@ Installation is performed in the prescribed manner for Vagrant plugins:
|
|
17
17
|
|
18
18
|
### Basic usage
|
19
19
|
|
20
|
-
|
20
|
+
```ruby
|
21
|
+
Vagrant.configure("2") do |config|
|
22
|
+
# Your existing Vagrant configuration
|
23
|
+
...
|
21
24
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
+
config.trigger.before :command, :option => "value" do
|
26
|
+
run "script"
|
27
|
+
...
|
28
|
+
end
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
config.trigger.after :command, :option => "value" do
|
31
|
+
run "script"
|
32
|
+
...
|
33
|
+
end
|
34
|
+
end
|
28
35
|
```
|
29
36
|
|
30
37
|
The first argument is the command in which the trigger will be tied. It could be an array (e.g. ```[:up, :resume]```) in case of multiple commands.
|
31
38
|
|
32
39
|
### Options
|
33
40
|
|
34
|
-
* ```:
|
35
|
-
* ```:
|
36
|
-
|
37
|
-
* ```:append_to_path => ["dir", "dir"]```: additional places where looking for the script. See [this wiki page](https://github.com/emyl/vagrant-triggers/wiki/The-:append_to_path-option) for details.
|
38
|
-
* ```:force => true```: continue even if the script fails (exits with non-zero code)
|
41
|
+
* ```:append_to_path => ["dir", "dir"]```: additional places where looking for scripts. See [this wiki page](https://github.com/emyl/vagrant-triggers/wiki/The-:append_to_path-option) for details.
|
42
|
+
* ```:force => true```: continue even one of the scripts fails (exits with non-zero code)
|
39
43
|
* ```:stdout => true```: display script output
|
40
44
|
|
45
|
+
### Trigger block DSL
|
46
|
+
|
47
|
+
The given block will be evaluated by an instance of the [VagrantPlugins::Triggers::DSL](https://github.com/emyl/vagrant-triggers/blob/master/lib/vagrant-triggers/dsl.rb) class. This class defines a very simple DSL for running scripts on the host machine. Basically only one method (`run`) is directly defined, all the other calls will be forwarded to Vagrant's [ui](https://github.com/mitchellh/vagrant/blob/master/lib/vagrant/ui.rb) instance. This allows the definition of custom messages along with scripts.
|
48
|
+
|
49
|
+
For additional details you can take a look to the [VagrantPlugins::Triggers::DSL](https://github.com/emyl/vagrant-triggers/blob/master/lib/vagrant-triggers/dsl.rb) definition.
|
50
|
+
|
41
51
|
### Skipping execution
|
42
52
|
|
43
53
|
Triggers won't run if ```VAGRANT_NO_TRIGGERS``` environment variable is set.
|
44
54
|
|
45
|
-
##
|
55
|
+
## A more detailed example
|
46
56
|
|
47
57
|
In the following example a VirtualBox VM (not managed by Vagrant) will be tied to the machine defined in ```Vagrantfile```, to make so that it follows its lifecycle:
|
48
58
|
|
@@ -55,12 +65,17 @@ Vagrant.configure("2") do |config|
|
|
55
65
|
:suspend => "controlvm 22aed8b3-d246-40d5-8ad4-176c17552c43 savestate",
|
56
66
|
:halt => "controlvm 22aed8b3-d246-40d5-8ad4-176c17552c43 acpipowerbutton",
|
57
67
|
}.each do |command, trigger|
|
58
|
-
config.trigger.before command, :
|
68
|
+
config.trigger.before command, :stdout => true do
|
69
|
+
info "Executing #{command} action on the VirtualBox tied VM..."
|
70
|
+
run "vboxmanage #{trigger}"
|
71
|
+
end
|
59
72
|
end
|
60
73
|
|
61
74
|
end
|
62
75
|
```
|
63
76
|
|
77
|
+
For additional examples, see the [trigger recipes](https://github.com/emyl/vagrant-triggers/wiki/Trigger-recipes) wiki page.
|
78
|
+
|
64
79
|
## Contributing
|
65
80
|
|
66
81
|
To contribute, clone the repository, and use [Bundler](http://bundler.io/)
|
@@ -76,4 +91,3 @@ You can now fork this repository, make your changes and send a pull request.
|
|
76
91
|
|
77
92
|
|
78
93
|
[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/emyl/vagrant-triggers/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
|
79
|
-
|
data/lib/vagrant-triggers.rb
CHANGED
@@ -5,9 +5,10 @@ module VagrantPlugins
|
|
5
5
|
module Triggers
|
6
6
|
lib_path = Pathname.new(File.expand_path("../vagrant-triggers", __FILE__))
|
7
7
|
autoload :Action, lib_path.join("action")
|
8
|
+
autoload :DSL, lib_path.join("dsl")
|
8
9
|
autoload :Config, lib_path.join("config")
|
9
10
|
autoload :Errors, lib_path.join("errors")
|
10
|
-
|
11
|
+
|
11
12
|
# This returns the path to the source of this plugin.
|
12
13
|
#
|
13
14
|
# @return [Pathname]
|
@@ -1,6 +1,4 @@
|
|
1
1
|
require "log4r"
|
2
|
-
require "shellwords"
|
3
|
-
require "vagrant/util/subprocess"
|
4
2
|
|
5
3
|
module VagrantPlugins
|
6
4
|
module Triggers
|
@@ -22,41 +20,6 @@ module VagrantPlugins
|
|
22
20
|
|
23
21
|
private
|
24
22
|
|
25
|
-
def build_environment
|
26
|
-
@logger.debug("Original environment: #{ENV.inspect}")
|
27
|
-
|
28
|
-
# Remove GEM_ environment variables
|
29
|
-
["GEM_HOME", "GEM_PATH", "GEMRC"].each { |gem_var| ENV.delete(gem_var) }
|
30
|
-
|
31
|
-
# Create the new PATH removing Vagrant bin directory
|
32
|
-
# and appending directories specified through the
|
33
|
-
# :append_to_path option
|
34
|
-
new_path = ENV["VAGRANT_INSTALLER_ENV"] ? ENV["PATH"].gsub(/#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}.*?#{File::PATH_SEPARATOR}/, "") : ENV["PATH"]
|
35
|
-
new_path += Array(@options[:append_to_path]).map { |dir| "#{File::PATH_SEPARATOR}#{dir}" }.join
|
36
|
-
ENV["PATH"] = new_path
|
37
|
-
@logger.debug("PATH modifed: #{ENV["PATH"]}")
|
38
|
-
end
|
39
|
-
|
40
|
-
def execute(raw_command)
|
41
|
-
@env[:ui].info 'Executing command "' + raw_command + '"...'
|
42
|
-
command = Shellwords.shellsplit(raw_command)
|
43
|
-
env_backup = ENV.to_hash
|
44
|
-
begin
|
45
|
-
build_environment
|
46
|
-
result = Vagrant::Util::Subprocess.execute(command[0], *command[1..-1])
|
47
|
-
rescue Vagrant::Errors::CommandUnavailable, Vagrant::Errors::CommandUnavailableWindows
|
48
|
-
raise Errors::CommandUnavailable, :command => command[0]
|
49
|
-
ensure
|
50
|
-
ENV.replace(env_backup)
|
51
|
-
end
|
52
|
-
if result.exit_code != 0 && !@options[:force]
|
53
|
-
raise Errors::CommandFailed, :command => raw_command, :stderr => result.stderr
|
54
|
-
end
|
55
|
-
if @options[:stdout]
|
56
|
-
@env[:ui].info "Command output:\n\n#{result.stdout}\n"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
23
|
def fire_triggers
|
61
24
|
# Triggers don't fire on environment load and unload.
|
62
25
|
return if [:environment_load, :environment_unload].include?(@env[:action_name])
|
@@ -66,13 +29,24 @@ module VagrantPlugins
|
|
66
29
|
@logger.debug("Looking for triggers #{@condition} action #{current_action}.")
|
67
30
|
triggers_to_fire = @env[:machine].config.trigger.triggers.find_all { |t| t[:action] == current_action && t[:condition] == @condition }
|
68
31
|
unless triggers_to_fire.empty?
|
69
|
-
|
32
|
+
# Emit a warning message if the old syntax is found
|
33
|
+
if @env[:machine].config.trigger.deprecation_warning
|
34
|
+
@env[:ui].warn I18n.t("vagrant_triggers.action.trigger.deprecated_syntax")
|
35
|
+
end
|
36
|
+
@env[:ui].info I18n.t("vagrant_triggers.action.trigger.running_triggers", :condition => @condition)
|
70
37
|
triggers_to_fire.each do |trigger|
|
38
|
+
# Ugly block, will change in v0.4
|
71
39
|
@options = trigger[:options]
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
40
|
+
case
|
41
|
+
when trigger[:proc]
|
42
|
+
dsl = DSL.new(@env[:ui], @options)
|
43
|
+
dsl.instance_eval &trigger[:proc]
|
44
|
+
when @options[:execute]
|
45
|
+
dsl = DSL.new(@env[:ui], @options)
|
46
|
+
dsl.execute @options[:execute]
|
47
|
+
when @options[:info]
|
48
|
+
dsl = DSL.new(@env[:ui], @options)
|
49
|
+
dsl.info @options[:info]
|
76
50
|
else
|
77
51
|
@logger.debug("Trigger command not found.")
|
78
52
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
module VagrantPlugins
|
2
2
|
module Triggers
|
3
3
|
class Config < Vagrant.plugin("2", :config)
|
4
|
+
attr_reader :deprecation_warning
|
4
5
|
attr_reader :triggers
|
5
|
-
|
6
|
+
|
6
7
|
def initialize
|
7
|
-
@
|
8
|
+
@deprecation_warning = false
|
9
|
+
@triggers = []
|
8
10
|
end
|
9
11
|
|
10
|
-
def after(actions, options = {})
|
11
|
-
add_trigger(actions, :after, options)
|
12
|
+
def after(actions, options = {}, &block)
|
13
|
+
add_trigger(actions, :after, options, block)
|
12
14
|
end
|
13
15
|
|
14
|
-
def before(actions, options = {})
|
15
|
-
add_trigger(actions, :before, options)
|
16
|
-
end
|
16
|
+
def before(actions, options = {}, &block)
|
17
|
+
add_trigger(actions, :before, options, block)
|
18
|
+
end
|
17
19
|
|
18
20
|
def validate(machine)
|
19
21
|
errors = []
|
@@ -27,9 +29,10 @@ module VagrantPlugins
|
|
27
29
|
|
28
30
|
private
|
29
31
|
|
30
|
-
def add_trigger(actions, condition, options)
|
32
|
+
def add_trigger(actions, condition, options, proc)
|
31
33
|
Array(actions).each do |action|
|
32
|
-
@triggers << { :action => action, :condition => condition, :options => options }
|
34
|
+
@triggers << { :action => action, :condition => condition, :options => options, :proc => proc }
|
35
|
+
@deprecation_warning = true if options[:execute] || options[:info]
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "log4r"
|
2
|
+
require "shellwords"
|
3
|
+
require "vagrant/util/subprocess"
|
4
|
+
|
5
|
+
module VagrantPlugins
|
6
|
+
module Triggers
|
7
|
+
class DSL
|
8
|
+
def initialize(ui, options = {})
|
9
|
+
@logger = Log4r::Logger.new("vagrant::plugins::triggers::dsl")
|
10
|
+
@options = options
|
11
|
+
@ui = ui
|
12
|
+
end
|
13
|
+
|
14
|
+
def run(raw_command, options = {})
|
15
|
+
@ui.info I18n.t("vagrant_triggers.action.trigger.executing_command", :command => raw_command)
|
16
|
+
command = Shellwords.shellsplit(raw_command)
|
17
|
+
env_backup = ENV.to_hash
|
18
|
+
begin
|
19
|
+
build_environment
|
20
|
+
result = Vagrant::Util::Subprocess.execute(command[0], *command[1..-1])
|
21
|
+
rescue Vagrant::Errors::CommandUnavailable, Vagrant::Errors::CommandUnavailableWindows
|
22
|
+
raise Errors::CommandUnavailable, :command => command[0]
|
23
|
+
ensure
|
24
|
+
ENV.replace(env_backup)
|
25
|
+
end
|
26
|
+
if result.exit_code != 0 && !@options[:force]
|
27
|
+
raise Errors::CommandFailed, :command => raw_command, :stderr => result.stderr
|
28
|
+
end
|
29
|
+
if @options[:stdout]
|
30
|
+
@ui.info I18n.t("vagrant_triggers.action.trigger.command_output", :output => result.stdout)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
alias_method :execute, :run
|
34
|
+
|
35
|
+
def method_missing(method, *args, &block)
|
36
|
+
# If the @ui object responds to the given method, call it
|
37
|
+
if @ui.respond_to?(method)
|
38
|
+
@ui.send(method, *args, *block)
|
39
|
+
else
|
40
|
+
super(method, *args, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def build_environment
|
47
|
+
@logger.debug("Original environment: #{ENV.inspect}")
|
48
|
+
|
49
|
+
# Remove GEM_ environment variables
|
50
|
+
["GEM_HOME", "GEM_PATH", "GEMRC"].each { |gem_var| ENV.delete(gem_var) }
|
51
|
+
|
52
|
+
# Create the new PATH removing Vagrant bin directory
|
53
|
+
# and appending directories specified through the
|
54
|
+
# :append_to_path option
|
55
|
+
new_path = ENV["VAGRANT_INSTALLER_ENV"] ? ENV["PATH"].gsub(/#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}.*?#{File::PATH_SEPARATOR}/, "") : ENV["PATH"]
|
56
|
+
new_path += Array(@options[:append_to_path]).map { |dir| "#{File::PATH_SEPARATOR}#{dir}" }.join
|
57
|
+
ENV["PATH"] = new_path
|
58
|
+
@logger.debug("PATH modifed: #{ENV["PATH"]}")
|
59
|
+
|
60
|
+
# Add the VAGRANT_NO_TRIGGERS variable to avoid loops
|
61
|
+
ENV["VAGRANT_NO_TRIGGERS"] = "1"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# This is a sanity check to make sure no one is attempting to install
|
2
2
|
# this into an early Vagrant version.
|
3
3
|
if Vagrant::VERSION < "1.2.0"
|
4
|
-
raise "The Vagrant Triggers plugin is only compatible with Vagrant 1.
|
4
|
+
raise "The Vagrant Triggers plugin is only compatible with Vagrant 1.2+"
|
5
5
|
end
|
6
6
|
|
7
7
|
module VagrantPlugins
|
data/locales/en.yml
CHANGED
@@ -1,5 +1,26 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_triggers:
|
3
|
+
action:
|
4
|
+
trigger:
|
5
|
+
command_output: |-
|
6
|
+
Command output:
|
7
|
+
---------------
|
8
|
+
%{output}
|
9
|
+
---------------
|
10
|
+
deprecated_syntax: |-
|
11
|
+
--------------------
|
12
|
+
DEPRECATION WARNING:
|
13
|
+
--------------------
|
14
|
+
The `:execute` and `:info` trigger options are deprecated
|
15
|
+
and will be removed in vagrant-triggers 0.4. Please upgrade
|
16
|
+
your Vagrantfile according to the new trigger DSL.
|
17
|
+
|
18
|
+
More information on the project home page:
|
19
|
+
https://github.com/emyl/vagrant-triggers
|
20
|
+
executing_command: |-
|
21
|
+
Executing command "%{command}"...
|
22
|
+
running_triggers: |-
|
23
|
+
Running triggers %{condition} action...
|
3
24
|
errors:
|
4
25
|
command_failed: |-
|
5
26
|
The command "%{command}" returned a failed exit code. The
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require "fileutils"
|
2
1
|
require "spec_helper"
|
3
2
|
|
4
3
|
describe VagrantPlugins::Triggers::Action::Trigger do
|
@@ -12,171 +11,62 @@ describe VagrantPlugins::Triggers::Action::Trigger do
|
|
12
11
|
let(:ui) { double("ui", :info => info) }
|
13
12
|
let(:info) { double("info") }
|
14
13
|
|
15
|
-
let(:result) { double("result", :exit_code => 0, :stderr => stderr) }
|
16
|
-
let(:stderr) { double("stderr") }
|
17
|
-
|
18
14
|
before do
|
19
|
-
|
15
|
+
trigger_block = Proc.new { nil }
|
16
|
+
@triggers = [ { :action => machine_action, :condition => condition, :options => { }, :proc => trigger_block } ]
|
17
|
+
machine.stub_chain(:config, :trigger, :deprecation_warning)
|
20
18
|
machine.stub_chain(:config, :trigger, :triggers).and_return(@triggers)
|
21
19
|
end
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
it "should skip :environment_load and :environment_unload actions" do
|
29
|
-
[:environment_load, :environment_unload].each do |action|
|
30
|
-
env.stub(:[]).with(:action_name).and_return(action)
|
31
|
-
env.should_not_receive(:[]).with(:machine_action)
|
32
|
-
described_class.new(app, env, condition).call(env)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
it "shouldn't fire if machine action is not defined" do
|
37
|
-
env.stub(:[]).with(:action_name)
|
38
|
-
env.stub(:[]).with(:machine_action).and_return(nil)
|
39
|
-
env.should_not_receive(:[]).with(:machine)
|
40
|
-
described_class.new(app, env, condition).call(env)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "should fire trigger when all conditions are satisfied" do
|
44
|
-
Vagrant::Util::Subprocess.should_receive(:execute).with("foo")
|
45
|
-
described_class.new(app, env, condition).call(env)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should fire all defined triggers" do
|
49
|
-
@triggers << { :action => machine_action, :condition => condition, :options => { :execute => "bar" } }
|
50
|
-
Vagrant::Util::Subprocess.should_receive(:execute).twice
|
51
|
-
described_class.new(app, env, condition).call(env)
|
52
|
-
end
|
53
|
-
|
54
|
-
it "shouldn't execute trigger with no command" do
|
55
|
-
@triggers[0][:options] = {}
|
56
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
57
|
-
described_class.new(app, env, condition).call(env)
|
58
|
-
end
|
59
|
-
|
60
|
-
it "shouldn't fire trigger when condition doesn't match" do
|
61
|
-
@triggers[0][:condition] = "blah"
|
62
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
63
|
-
described_class.new(app, env, condition).call(env)
|
64
|
-
end
|
65
|
-
|
66
|
-
it "shouldn't fire trigger when action doesn't match" do
|
67
|
-
@triggers[0][:action] = "blah"
|
68
|
-
Vagrant::Util::Subprocess.should_not_receive(:execute)
|
69
|
-
described_class.new(app, env, condition).call(env)
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should raise an error if executed command exits with non-zero code" do
|
73
|
-
result.stub(:exit_code => 1)
|
74
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandFailed)
|
75
|
-
end
|
76
|
-
|
77
|
-
it "shouldn't raise an error if executed command exits with non-zero code but :force option was specified" do
|
78
|
-
@triggers[0][:options][:force] = true
|
79
|
-
result.stub(:exit_code => 1)
|
80
|
-
expect { described_class.new(app, env, condition).call(env) }.not_to raise_error()
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should display output if :stdout option was specified" do
|
84
|
-
@triggers[0][:options][:stdout] = true
|
85
|
-
result.stub(:stdout => "Some output")
|
86
|
-
ui.should_receive(:info).with("Command output:\n\nSome output\n")
|
21
|
+
it "should skip :environment_load and :environment_unload actions" do
|
22
|
+
[:environment_load, :environment_unload].each do |action|
|
23
|
+
env.stub(:[]).with(:action_name).and_return(action)
|
24
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
87
25
|
described_class.new(app, env, condition).call(env)
|
88
26
|
end
|
89
27
|
end
|
90
28
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
File.stub(:executable?).with("#{@tmp_dir}/foo").and_return(true)
|
97
|
-
end
|
98
|
-
|
99
|
-
after do
|
100
|
-
File.delete("#{@tmp_dir}/foo")
|
101
|
-
end
|
102
|
-
|
103
|
-
it "should raise a CommandUnavailable error by default" do
|
104
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should raise a CommandUnavailable error on Windows" do
|
108
|
-
Vagrant::Util::Platform.stub(:windows? => true)
|
109
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should honor the :append_to_path option and restore original path after execution" do
|
113
|
-
@triggers[0][:options][:append_to_path] = @tmp_dir
|
114
|
-
original_path = ENV["PATH"]
|
115
|
-
described_class.new(app, env, condition).call(env)
|
116
|
-
expect(ENV["PATH"]).to eq(original_path)
|
117
|
-
end
|
118
|
-
|
119
|
-
it "should accept an array for the :append_to_path option" do
|
120
|
-
@triggers[0][:options][:append_to_path] = [@tmp_dir, @tmp_dir]
|
121
|
-
expect { described_class.new(app, env, condition).call(env) }.not_to raise_error()
|
122
|
-
end
|
29
|
+
it "shouldn't fire if machine action is not defined" do
|
30
|
+
env.stub(:[]).with(:action_name)
|
31
|
+
env.stub(:[]).with(:machine_action).and_return(nil)
|
32
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
33
|
+
described_class.new(app, env, condition).call(env)
|
123
34
|
end
|
124
35
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
ENV["GEMRC"] = "#{ENV["EMBEDDED_DIR"]}/etc/gemrc"
|
132
|
-
ENV["PATH"] = "#{ENV["EMBEDDED_DIR"]}/bin:#{ENV["PATH"]}"
|
133
|
-
end
|
134
|
-
|
135
|
-
context "with a command which is present into the Vagrant embedded dir" do
|
136
|
-
before do
|
137
|
-
Dir.mkdir("#{ENV["EMBEDDED_DIR"]}/bin")
|
138
|
-
File.open("#{ENV["EMBEDDED_DIR"]}/bin/foo", "w+", 0700) { |file| }
|
139
|
-
end
|
140
|
-
|
141
|
-
it "should raise a CommandUnavailable error" do
|
142
|
-
expect { described_class.new(app, env, condition).call(env) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
143
|
-
end
|
36
|
+
it "should fire trigger when all conditions are satisfied" do
|
37
|
+
dsl = double("dsl")
|
38
|
+
VagrantPlugins::Triggers::DSL.stub(:new).with(ui, @triggers.first[:options]).and_return(dsl)
|
39
|
+
dsl.should_receive(:instance_eval).and_yield
|
40
|
+
described_class.new(app, env, condition).call(env)
|
41
|
+
end
|
144
42
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
43
|
+
it "should fire all defined triggers" do
|
44
|
+
@triggers << @triggers.first
|
45
|
+
VagrantPlugins::Triggers::DSL.should_receive(:new).twice
|
46
|
+
described_class.new(app, env, condition).call(env)
|
47
|
+
end
|
149
48
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
described_class.new(app, env, condition).call(env)
|
156
|
-
end
|
49
|
+
it "shouldn't execute trigger with no command or block" do
|
50
|
+
@triggers[0][:proc] = nil
|
51
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
52
|
+
described_class.new(app, env, condition).call(env)
|
53
|
+
end
|
157
54
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
described_class.new(app, env, condition).call(env)
|
164
|
-
end
|
55
|
+
it "shouldn't fire trigger when condition doesn't match" do
|
56
|
+
@triggers[0][:condition] = "blah"
|
57
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
58
|
+
described_class.new(app, env, condition).call(env)
|
59
|
+
end
|
165
60
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
described_class.new(app, env, condition).call(env)
|
172
|
-
end
|
61
|
+
it "shouldn't fire trigger when action doesn't match" do
|
62
|
+
@triggers[0][:action] = "blah"
|
63
|
+
VagrantPlugins::Triggers::DSL.should_not_receive(:new)
|
64
|
+
described_class.new(app, env, condition).call(env)
|
65
|
+
end
|
173
66
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
ENV["GEMRC"] = nil
|
179
|
-
ENV["PATH"] = @original_path
|
180
|
-
end
|
67
|
+
it "should emit a warning message if the deprecation warning flag is set" do
|
68
|
+
machine.stub_chain(:config, :trigger, :deprecation_warning).and_return(true)
|
69
|
+
ui.should_receive(:warn).with(/DEPRECATION WARNING/)
|
70
|
+
described_class.new(app, env, condition).call(env)
|
181
71
|
end
|
182
72
|
end
|
@@ -16,25 +16,32 @@ describe VagrantPlugins::Triggers::Config do
|
|
16
16
|
|
17
17
|
describe "add triggers" do
|
18
18
|
it "should add before triggers" do
|
19
|
-
config.before
|
20
|
-
expect(config.triggers
|
19
|
+
config.before(:up) { run "ls" }
|
20
|
+
expect(config.triggers).to have(1).item
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should add after triggers" do
|
24
|
-
config.after
|
25
|
-
expect(config.triggers
|
24
|
+
config.after(:up) { run "ls" }
|
25
|
+
expect(config.triggers).to have(1).item
|
26
|
+
end
|
27
|
+
|
28
|
+
[:execute, :info].each do |option|
|
29
|
+
it "should set the deprecation warning flag if the old #{option.to_s} option is passed" do
|
30
|
+
config.before(:up, option => true)
|
31
|
+
expect(config.deprecation_warning).to be_true
|
32
|
+
end
|
26
33
|
end
|
27
34
|
end
|
28
35
|
|
29
36
|
describe "accept multiple entries" do
|
30
37
|
it "should record multiple entries" do
|
31
|
-
config.before
|
32
|
-
config.after
|
38
|
+
config.before(:up) { run "ls" }
|
39
|
+
config.after(:up) { run "ls" }
|
33
40
|
expect(config.triggers).to have(2).items
|
34
41
|
end
|
35
42
|
|
36
43
|
it "should record multiple entries if the action is an array" do
|
37
|
-
config.before
|
44
|
+
config.before([:up, :halt]) { run "ls" }
|
38
45
|
expect(config.triggers).to have(2).items
|
39
46
|
end
|
40
47
|
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe VagrantPlugins::Triggers::DSL do
|
5
|
+
let(:result) { double("result", :exit_code => 0, :stderr => stderr) }
|
6
|
+
let(:stderr) { double("stderr") }
|
7
|
+
|
8
|
+
let(:ui) { double("ui", :info => info) }
|
9
|
+
let(:info) { double("info") }
|
10
|
+
|
11
|
+
before do
|
12
|
+
@command = "foo"
|
13
|
+
@dsl = described_class.new(ui, {})
|
14
|
+
end
|
15
|
+
|
16
|
+
context "method missing" do
|
17
|
+
it "acts as proxy if the ui object respond to the called method" do
|
18
|
+
ui.stub(:foo).and_return("bar")
|
19
|
+
expect(@dsl.foo).to eq("bar")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "run a regular command" do
|
24
|
+
before do
|
25
|
+
Vagrant::Util::Subprocess.stub(:execute => result)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should raise an error if executed command exits with non-zero code" do
|
29
|
+
result.stub(:exit_code => 1)
|
30
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandFailed)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "shouldn't raise an error if executed command exits with non-zero code but :force option was specified" do
|
34
|
+
dsl = described_class.new(ui, :force => true)
|
35
|
+
result.stub(:exit_code => 1)
|
36
|
+
expect { dsl.run(@command) }.not_to raise_error()
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should display output if :stdout option was specified" do
|
40
|
+
dsl = described_class.new(ui, :stdout => true)
|
41
|
+
result.stub(:stdout => "Some output")
|
42
|
+
ui.should_receive(:info).with(/Some output/)
|
43
|
+
dsl.run(@command)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should pass VAGRANT_NO_TRIGGERS environment variable to the command" do
|
47
|
+
Vagrant::Util::Subprocess.should_receive(:execute) do |command|
|
48
|
+
expect(ENV).to have_key("VAGRANT_NO_TRIGGERS")
|
49
|
+
result
|
50
|
+
end
|
51
|
+
@dsl.run(@command)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "run a command not in the PATH" do
|
56
|
+
before do
|
57
|
+
@tmp_dir = Vagrant::Util::Platform.windows? ? ENV["USERPROFILE"] : ENV["HOME"]
|
58
|
+
File.open("#{@tmp_dir}/#{@command}", "w+", 0700) { |file| }
|
59
|
+
File.stub(:executable? => false)
|
60
|
+
File.stub(:executable?).with("#{@tmp_dir}/#{@command}").and_return(true)
|
61
|
+
end
|
62
|
+
|
63
|
+
after do
|
64
|
+
File.delete("#{@tmp_dir}/#{@command}")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should raise a CommandUnavailable error by default" do
|
68
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should raise a CommandUnavailable error on Windows" do
|
72
|
+
Vagrant::Util::Platform.stub(:windows? => true)
|
73
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should honor the :append_to_path option and restore original path after execution" do
|
77
|
+
dsl = described_class.new(ui, :append_to_path => @tmp_dir)
|
78
|
+
original_path = ENV["PATH"]
|
79
|
+
dsl.run(@command)
|
80
|
+
expect(ENV["PATH"]).to eq(original_path)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should accept an array for the :append_to_path option" do
|
84
|
+
dsl = described_class.new(ui, :append_to_path => [@tmp_dir, @tmp_dir])
|
85
|
+
expect { dsl.run(@command) }.not_to raise_error()
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context "run a command simulating the Vagrant environment" do
|
90
|
+
before do
|
91
|
+
@original_path = ENV["PATH"]
|
92
|
+
ENV["VAGRANT_INSTALLER_ENV"] = "1"
|
93
|
+
ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"] = Vagrant::Util::Platform.windows? ? ENV["USERPROFILE"] : ENV["HOME"]
|
94
|
+
ENV["GEM_HOME"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/gems"
|
95
|
+
ENV["GEM_PATH"] = ENV["GEM_HOME"]
|
96
|
+
ENV["GEMRC"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/etc/gemrc"
|
97
|
+
ENV["PATH"] = "#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin:#{ENV["PATH"]}"
|
98
|
+
end
|
99
|
+
|
100
|
+
context "with a command which is present into the Vagrant embedded dir" do
|
101
|
+
before do
|
102
|
+
Dir.mkdir("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin")
|
103
|
+
File.open("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin/#{@command}", "w+", 0700) { |file| }
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should raise a CommandUnavailable error" do
|
107
|
+
expect { @dsl.run(@command) }.to raise_error(VagrantPlugins::Triggers::Errors::CommandUnavailable)
|
108
|
+
end
|
109
|
+
|
110
|
+
after do
|
111
|
+
FileUtils.rm_rf("#{ENV["VAGRANT_INSTALLER_EMBEDDED_DIR"]}/bin")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
["GEM_HOME", "GEM_PATH", "GEMRC"].each do |env_var|
|
116
|
+
it "should not pass #{env_var} to the executed command" do
|
117
|
+
Vagrant::Util::Subprocess.should_receive(:execute) do |command|
|
118
|
+
expect(ENV).not_to have_key(env_var)
|
119
|
+
result
|
120
|
+
end
|
121
|
+
@dsl.run(@command)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
after do
|
126
|
+
ENV["EMBEDDED_DIR"] = nil
|
127
|
+
ENV["GEM_HOME"] = nil
|
128
|
+
ENV["GEM_PATH"] = nil
|
129
|
+
ENV["GEMRC"] = nil
|
130
|
+
ENV["PATH"] = @original_path
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-triggers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emiliano Ticci
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- lib/vagrant-triggers/action/trigger.rb
|
65
65
|
- lib/vagrant-triggers/action.rb
|
66
66
|
- lib/vagrant-triggers/config.rb
|
67
|
+
- lib/vagrant-triggers/dsl.rb
|
67
68
|
- lib/vagrant-triggers/errors.rb
|
68
69
|
- lib/vagrant-triggers/plugin.rb
|
69
70
|
- lib/vagrant-triggers/version.rb
|
@@ -75,6 +76,7 @@ files:
|
|
75
76
|
- spec/spec_helper.rb
|
76
77
|
- spec/vagrant-triggers/action/trigger_spec.rb
|
77
78
|
- spec/vagrant-triggers/config_spec.rb
|
79
|
+
- spec/vagrant-triggers/dsl_spec.rb
|
78
80
|
- spec/vagrant-triggers/vagrant_spec.rb
|
79
81
|
- vagrant-triggers.gemspec
|
80
82
|
- .gitignore
|
@@ -106,4 +108,5 @@ test_files:
|
|
106
108
|
- spec/spec_helper.rb
|
107
109
|
- spec/vagrant-triggers/action/trigger_spec.rb
|
108
110
|
- spec/vagrant-triggers/config_spec.rb
|
111
|
+
- spec/vagrant-triggers/dsl_spec.rb
|
109
112
|
- spec/vagrant-triggers/vagrant_spec.rb
|