rundock 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee97ce7e9fab113c27e6782b3dc5a541b77fd6d7
4
- data.tar.gz: c449097d5bb33e5fa09be5d00b69bf9e37a74d01
3
+ metadata.gz: ac0d1b1d024e3fb776363046e50b0491d565bd14
4
+ data.tar.gz: fcc471769968893cec01ad5448596f89a25a60c4
5
5
  SHA512:
6
- metadata.gz: c096af8d1d925c6902ec72358b22d821e216dbb410981cb5d6fcacd363dbdd0730b543c6fcb0eb68a75c6bcd1636157f44fbb71687fdfe82883d35da62f2273d
7
- data.tar.gz: 9b9cab0135ffc8b2d710a3fdbd6b8a39d479d7339c28f3a14780256066ecda90e7346b3274d6a681dbac8fcfc208d4c6251a01428c1f80d0526a79fa325c5609
6
+ metadata.gz: 1ed1fa084c198d5ef541533a5b6dea968a9bdfef73b8fe952b50ded41587ac905eab7d1af64e92c31db8272083f2045e2ed4069b0eb72fc856dbfd225caaecd3
7
+ data.tar.gz: aeddc0612d79caa97beb41d77e104085514fed0cc96dcbf298b4df8ab4045721ebb5f69068a0ffb0fed7085f2b3f992e9a08423067536540d169d02f4d52f3af
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## v0.4.0
2
+
3
+ Improvements
4
+
5
+ - Support node hooks
6
+
7
+ Fix
8
+
9
+ - Fix plugin lib search path bug
10
+
1
11
  ## v0.3.0
2
12
 
3
13
  Improvements
data/Rakefile CHANGED
@@ -73,8 +73,14 @@ def do_rundock_scenarios(platform)
73
73
  default_ssh_opt = ''
74
74
  end
75
75
 
76
+ if scenario =~ %r{^*scenarios/(.*_hooks)_scenario.yml$}
77
+ hooks_opt = " -k ./spec/integration/hooks/#{Regexp.last_match(1)}.yml"
78
+ else
79
+ hooks_opt = ''
80
+ end
81
+
76
82
  execute('bundle exec exe/rundock' \
77
- " do #{scenario}#{default_ssh_opt} -l debug", true)
83
+ " do #{scenario}#{default_ssh_opt}#{hooks_opt} -l debug", true)
78
84
  end
79
85
  end
80
86
 
data/hooks_sample.yml ADDED
@@ -0,0 +1,7 @@
1
+ #
2
+ # Sample hook defines
3
+ # (This sample will be able to output to the log file)
4
+ #
5
+ logging:
6
+ hook_type: file
7
+ filepath: /var/log/rundock.log
@@ -6,6 +6,7 @@ module Rundock
6
6
  attr_accessor :nodeinfo
7
7
  attr_accessor :task_info
8
8
  attr_accessor :errexit
9
+ attr_accessor :enable_hooks
9
10
 
10
11
  AVAIL_TAKE_OVERS = [
11
12
  :task_info,
@@ -0,0 +1,46 @@
1
+ require 'yaml'
2
+
3
+ module Rundock
4
+ module Builder
5
+ class HookBuilder < Base
6
+ HookStructureError = Class.new(NotImplementedError)
7
+
8
+ def build(enables)
9
+ if enables.blank?
10
+ return []
11
+ elsif @options[:hooks] && FileTest.exist?(@options[:hooks])
12
+ hooks_file = @options[:hooks]
13
+ else
14
+ return []
15
+ end
16
+
17
+ build_from_file(hooks_file, enables)
18
+ end
19
+
20
+ def build_from_attributes(attributes)
21
+ return [] unless attributes.key?(:enable_hooks)
22
+ build_from_file(attributes[:hooks], attributes[:enable_hooks])
23
+ end
24
+
25
+ private
26
+
27
+ def build_from_file(file, enables)
28
+ hooks = []
29
+ allow_all = enables.include?('all')
30
+
31
+ File.open(file) do |f|
32
+ YAML.load_documents(f) do |y|
33
+ y.each do |k, v|
34
+ raise HookStructureError if !v.is_a?(Hash) || !v.key?('hook_type')
35
+ next if !allow_all && enables.include?(k)
36
+ hook = Rundock::HookFactory.instance(v['hook_type']).create(k, v.deep_symbolize_keys)
37
+ hooks << hook
38
+ end
39
+ end
40
+ end
41
+
42
+ hooks
43
+ end
44
+ end
45
+ end
46
+ end
@@ -21,16 +21,19 @@ module Rundock
21
21
  n.deep_symbolize_keys.each do |k, v|
22
22
  if k == :node
23
23
  node_attribute.finalize_node
24
- builder = BackendBuilder.new(@options, v, node_info)
25
- backend = builder.build
24
+ backend_builder = BackendBuilder.new(@options, v, node_info)
25
+ backend = backend_builder.build
26
26
 
27
27
  node = Node.new(v, backend)
28
28
  node_attribute.nodename = v
29
- scen.node_info[v.to_sym] = node_attribute.nodeinfo = builder.parsed_options
29
+ scen.node_info[v.to_sym] = node_attribute.nodeinfo = backend_builder.parsed_options
30
30
 
31
31
  if @options[:command]
32
32
  node.add_operation(build_cli_command_operation(@options[:command], node_attribute, @options))
33
33
  end
34
+ elsif k == :hook
35
+ node_attribute.enable_hooks = Array(v)
36
+ node.hooks = HookBuilder.new(@options).build(Array(v)) if node
34
37
  else
35
38
 
36
39
  next unless node
@@ -47,6 +50,7 @@ module Rundock
47
50
 
48
51
  def build_task(tasks, backend, node_attribute)
49
52
  node = Node.new(node_attribute.nodename, backend)
53
+ node.hooks = HookBuilder.new(nil).build_from_attributes(node_attribute.nodeinfo)
50
54
  scen = Scenario.new
51
55
 
52
56
  tasks.each do |k, v|
@@ -64,6 +68,7 @@ module Rundock
64
68
  @options[:host].split(',').each do |host|
65
69
  backend = BackendBuilder.new(@options, host, nil).build
66
70
  node = Node.new(host, backend)
71
+ node.hooks = HookBuilder.new(@options).build(['all'])
67
72
  node.add_operation(
68
73
  build_cli_command_operation(@options[:command], Rundock::Attribute::NodeAttribute.new, @options))
69
74
  scen.nodes.push(node)
data/lib/rundock/cli.rb CHANGED
@@ -6,6 +6,7 @@ module Rundock
6
6
  DEFAULT_SCENARIO_FILE_PATH = './scenario.yml'
7
7
  DEFAULT_SSH_OPTIONS_DEFAULT_FILE_PATH = './default_ssh.yml'
8
8
  DEFAULT_HOSTGROUP_FILE_PATH = './hostgroup.yml'
9
+ DEFAULT_HOOKS_FILE_PATH = './hooks.yml'
9
10
 
10
11
  class_option :log_level, type: :string, aliases: ['-l'], default: 'info'
11
12
  class_option :color, type: :boolean, default: true
@@ -27,6 +28,7 @@ module Rundock
27
28
  desc 'do [SCENARIO] [options]', 'Run rundock from scenario file'
28
29
  option :sudo, type: :boolean, default: false
29
30
  option :default_ssh_opts, type: :string, aliases: ['-d'], default: DEFAULT_SSH_OPTIONS_DEFAULT_FILE_PATH
31
+ option :hooks, type: :string, aliases: ['-k'], default: DEFAULT_HOOKS_FILE_PATH
30
32
  option :run_anyway, type: :boolean, default: false
31
33
  option :dry_run, type: :boolean, aliases: ['-n']
32
34
  def do(*scenario_file_path)
@@ -39,6 +41,7 @@ module Rundock
39
41
  desc 'ssh [options]', 'Run rundock ssh with various options'
40
42
  option :command, type: :string, aliases: ['-c']
41
43
  option :default_ssh_opts, type: :string, aliases: ['-d'], default: DEFAULT_SSH_OPTIONS_DEFAULT_FILE_PATH
44
+ option :hooks, type: :string, aliases: ['-k'], default: DEFAULT_HOOKS_FILE_PATH
42
45
  option :host, type: :string, aliases: ['-h'], banner: 'You can specify comma separated hosts.[ex: host1,host2,..]'
43
46
  option :hostgroup, type: :string, aliases: ['-g']
44
47
  option :user, type: :string, aliases: ['-u']
@@ -0,0 +1,19 @@
1
+ module Rundock
2
+ module Hook
3
+ class Base
4
+ HookNotImplementedError = Class.new(NotImplementedError)
5
+
6
+ attr_reader :name
7
+ attr_reader :contents
8
+
9
+ def initialize(name, contents = {})
10
+ @name = name
11
+ @contents = contents
12
+ end
13
+
14
+ def hook(log_buffer = [], node_info = {})
15
+ raise HookNotImplementedError
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ module Rundock
2
+ class HookFactory
3
+ HookNotImplementedError = Class.new(NotImplementedError)
4
+
5
+ def self.instance(type)
6
+ self.new(type)
7
+ end
8
+
9
+ def initialize(type)
10
+ @type = type
11
+ end
12
+
13
+ def create(name, attributes)
14
+ klass = "Rundock::Hook::#{@type.to_s.to_camel_case}"
15
+ Logger.debug("initialize #{klass} hook")
16
+ raise HookNotImplementedError unless Rundock::Hook::Base.subclasses.map(&:to_s).include?(klass)
17
+
18
+ obj = nil
19
+ klass.split('::').map do |k|
20
+ if obj.nil?
21
+ obj = Kernel.const_get(k)
22
+ else
23
+ obj = obj.const_get(k)
24
+ end
25
+ end
26
+
27
+ hook = obj.new(name, attributes)
28
+ hook
29
+ end
30
+ end
31
+ end
@@ -4,15 +4,34 @@ require 'ansi/code'
4
4
 
5
5
  module Rundock
6
6
  module Logger
7
+ class LogEntity
8
+ attr_accessor :severity
9
+ attr_accessor :datetime
10
+ attr_accessor :progname
11
+ attr_accessor :msg
12
+ attr_accessor :indent_depth
13
+
14
+ def initialize(severity, datetime, progname, msg, indent_depth)
15
+ @severity = severity
16
+ @datetime = datetime
17
+ @progname = progname
18
+ @msg = msg
19
+ @indent_depth = indent_depth
20
+ end
21
+ end
22
+
7
23
  class Formatter
8
24
  attr_accessor :colored
9
25
  attr_accessor :indent_depth
10
26
  attr_accessor :color
11
27
  attr_accessor :show_header
28
+ attr_accessor :onrec
29
+ attr_accessor :buffer
12
30
 
13
31
  def initialize(*args)
14
32
  super
15
33
  @indent_depth = 0
34
+ @buffer = []
16
35
  end
17
36
 
18
37
  def call(severity, datetime, progname, msg)
@@ -22,6 +41,8 @@ module Rundock
22
41
  out = "%s\n" % [msg2str(msg)]
23
42
  end
24
43
 
44
+ @buffer << LogEntity.new(severity, datetime, progname, msg, indent_depth)
45
+
25
46
  if colored
26
47
  colorize(out, severity)
27
48
  else
@@ -52,6 +73,12 @@ module Rundock
52
73
  @color = prev_color
53
74
  end
54
75
 
76
+ def flush
77
+ ret = @buffer.dup
78
+ @buffer.clear
79
+ ret
80
+ end
81
+
55
82
  private
56
83
 
57
84
  def msg2str(msg)
data/lib/rundock/node.rb CHANGED
@@ -5,11 +5,13 @@ module Rundock
5
5
  attr_reader :name
6
6
  attr_reader :operations
7
7
  attr_reader :backend
8
+ attr_accessor :hooks
8
9
 
9
10
  def initialize(name, backend)
10
11
  @name = name
11
12
  @backend = backend
12
13
  @operations = []
14
+ @hooks = []
13
15
  end
14
16
 
15
17
  def add_operation(ope)
@@ -24,15 +26,29 @@ module Rundock
24
26
  end
25
27
 
26
28
  def run
29
+ Logger.formatter.onrec = true
27
30
  Logger.debug("run node: #{@name}")
28
31
  if @operations.blank?
29
32
  Logger.warn("no operation running: #{@name}")
30
33
  return
31
34
  end
35
+
36
+ nodeinfo = nil
37
+
32
38
  @operations.each do |ope|
33
39
  Logger.debug("run operation: #{ope.class}")
40
+ nodeinfo = ope.attributes[:nodeinfo] if nodeinfo.nil?
34
41
  ope.run(@backend, ope.attributes)
35
42
  end
43
+
44
+ log_buffer = Logger.formatter.flush unless Logger.formatter.buffer.empty?
45
+
46
+ @hooks.each do |h|
47
+ Logger.debug("run hook: #{h.name}")
48
+ h.hook(log_buffer, nodeinfo)
49
+ end
50
+
51
+ Logger.formatter.onrec = false
36
52
  end
37
53
  end
38
54
  end
@@ -0,0 +1,45 @@
1
+ require 'rundock/operation/base'
2
+
3
+ module Rundock
4
+ module Hook
5
+ # You can use this sample as following yaml files for example.
6
+ #
7
+ # [hook.yml]
8
+ # major_log:
9
+ # hook_type: file
10
+ # filepath: /var/log/rundock.log
11
+ # minor_log:
12
+ # hook_type: file
13
+ # filepath: /tmp/rundock.log
14
+ #
15
+ # [scenario.yml]
16
+ # - node: anyhost-01
17
+ # command:
18
+ # - 'rm -f /tmp/aaa'
19
+ # hook:
20
+ # - major_log
21
+ # - minor_log
22
+ # - node: localhost
23
+ # command:
24
+ # - 'echo aaa > /tmp/abc'
25
+ # hook: all
26
+ # ---
27
+ # anyhost-01:
28
+ # host: 192.168.1.11
29
+ # ssh_opts:
30
+ # port: 22
31
+ # user: anyuser
32
+ # key: ~/.ssh/id_rsa
33
+ # ---
34
+ class File < Base
35
+ def hook(log_buffer, node_info)
36
+ file = ::File.open(@contents[:filepath], 'w')
37
+ file.puts("[hookname:#{@name} node:#{node_info[:host]}]")
38
+ log_buffer.each do |log|
39
+ file.puts("[\%5s:] %s%s\n" % [log.severity, ' ' * 2 * log.indent_depth, log.msg])
40
+ end
41
+ file.close
42
+ end
43
+ end
44
+ end
45
+ end
@@ -77,7 +77,7 @@ module Rundock
77
77
  next if g !~ /^(rundock-plugin-#{plugin})-/
78
78
  next if Gem::Specification.find_by_name(g).nil?
79
79
  Logger.debug("Loading rundock plugin: #{g}")
80
- libdir = "#{Gem::Specification.find_by_name(g).full_gem_path}/lib/#{Regexp.last_match(0).gsub(/-/, '/')}"
80
+ libdir = "#{Gem::Specification.find_by_name(g).full_gem_path}/lib/#{Regexp.last_match(1).gsub(/-/, '/')}"
81
81
  Dir.glob("#{libdir}/*.rb").each do |f|
82
82
  require f.gsub(/.rb$/, '')
83
83
  end
@@ -1,3 +1,3 @@
1
1
  module Rundock
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
3
3
  end
data/lib/rundock.rb CHANGED
@@ -6,6 +6,8 @@ require 'rundock/operation/base'
6
6
  require 'rundock/operation/task'
7
7
  require 'rundock/operation/command'
8
8
  require 'rundock/operation_factory'
9
+ require 'rundock/hook_factory'
10
+ require 'rundock/hook/base'
9
11
  require 'rundock/node'
10
12
  require 'rundock/attribute/base'
11
13
  require 'rundock/attribute/node_attribute'
@@ -14,6 +16,7 @@ require 'rundock/backend'
14
16
  require 'rundock/builder/base'
15
17
  require 'rundock/builder/default_ssh_builder'
16
18
  require 'rundock/builder/backend_builder'
19
+ require 'rundock/builder/hook_builder'
17
20
  require 'rundock/builder/operation_builder'
18
21
  require 'rundock/builder/scenario_builder'
19
22
  require 'rundock/runner'
data/scenario_sample.yml CHANGED
@@ -34,6 +34,9 @@
34
34
  command:
35
35
  - "hostname"
36
36
  - "uname -a"
37
+ hook:
38
+ - mail
39
+ - file
37
40
  - node: anyhost-01
38
41
  task:
39
42
  - echo_platform
@@ -44,6 +47,7 @@
44
47
  - errexit: false
45
48
  - "rm /tmp/safetyfile"
46
49
  - "ls -1 /tmp"
50
+ hook: all
47
51
  ---
48
52
  anyhost-01:
49
53
  host: 192.168.1.11
@@ -0,0 +1,6 @@
1
+ file_all_1:
2
+ hook_type: file
3
+ filepath: /var/tmp/hello_rundock_from_file_hook_all_1_scenario
4
+ file_all_2:
5
+ hook_type: file
6
+ filepath: /var/tmp/hello_rundock_from_file_hook_all_2_scenario
@@ -0,0 +1,9 @@
1
+ file_one:
2
+ hook_type: file
3
+ filepath: /var/tmp/hello_rundock_from_file_hook_one_scenario
4
+ file_array_1:
5
+ hook_type: file
6
+ filepath: /var/tmp/hello_rundock_from_file_hook_array_1_scenario
7
+ file_array_2:
8
+ hook_type: file
9
+ filepath: /var/tmp/hello_rundock_from_file_hook_array_2_scenario
@@ -0,0 +1,5 @@
1
+ - node: localhost
2
+ command:
3
+ - "rm -f /var/tmp/hello_rundock_from_file_hook_all_1_scenario"
4
+ - "rm -f /var/tmp/hello_rundock_from_file_hook_all_2_scenario"
5
+ hook: file_all
@@ -0,0 +1,15 @@
1
+ - node: localhost
2
+ command:
3
+ - "rm -f /var/tmp/hello_rundock_from_file_hook_one_scenario"
4
+ - "rm -f /var/tmp/hello_rundock_from_file_hook_array_1_scenario"
5
+ - "rm -f /var/tmp/hello_rundock_from_file_hook_array_2_scenario"
6
+ hook: file_one
7
+ - node: anyhost-01
8
+ command:
9
+ - "echo aaa"
10
+ hook:
11
+ - file_array_1
12
+ - file_array_2
13
+ ---
14
+ anyhost-01:
15
+ host: localhost
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe file('/var/tmp/hello_rundock_from_file_hook_one_scenario') do
4
+ it { should be_file }
5
+ its(:content) { should match(/hookname:file_one /) }
6
+ end
7
+
8
+ describe file('/var/tmp/hello_rundock_from_file_hook_array_1_scenario') do
9
+ it { should be_file }
10
+ its(:content) { should match(/hookname:file_array_1 /) }
11
+ end
12
+
13
+ describe file('/var/tmp/hello_rundock_from_file_hook_array_2_scenario') do
14
+ it { should be_file }
15
+ its(:content) { should match(/hookname:file_array_2 /) }
16
+ end
17
+
18
+ describe file('/var/tmp/hello_rundock_from_file_hook_all_1_scenario') do
19
+ it { should be_file }
20
+ its(:content) { should match(/hookname:file_all_1 /) }
21
+ end
22
+
23
+ describe file('/var/tmp/hello_rundock_from_file_hook_all_2_scenario') do
24
+ it { should be_file }
25
+ its(:content) { should match(/hookname:file_all_2 /) }
26
+ end
@@ -0,0 +1,12 @@
1
+ - node: anyhost-01
2
+ command:
3
+ - "echo 'hookname:file_all_1 ' > /var/tmp/hello_rundock_from_file_hook_all_1_scenario"
4
+ - "echo 'hookname:file_all_2 ' > /var/tmp/hello_rundock_from_file_hook_all_2_scenario"
5
+ hook: all
6
+ ---
7
+ anyhost-01:
8
+ host: 172.17.42.1
9
+ ssh_opts:
10
+ port: 22222
11
+ user: tester
12
+ key: "<replaced_by_platforms>"
@@ -0,0 +1,16 @@
1
+ - node: anyhost-01
2
+ command:
3
+ - "echo 'hookname:file_one ' > /var/tmp/hello_rundock_from_file_hook_one_scenario"
4
+ - "echo 'hookname:file_array_1 ' > /var/tmp/hello_rundock_from_file_hook_array_1_scenario"
5
+ - "echo 'hookname:file_array_2 ' > /var/tmp/hello_rundock_from_file_hook_array_2_scenario"
6
+ hook:
7
+ - file_one
8
+ - file_array_1
9
+ - file_array_2
10
+ ---
11
+ anyhost-01:
12
+ host: 172.17.42.1
13
+ ssh_opts:
14
+ port: 22222
15
+ user: tester
16
+ key: "<replaced_by_platforms>"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rundock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - hiracy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-13 00:00:00.000000000 Z
11
+ date: 2015-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -150,6 +150,7 @@ files:
150
150
  - circle.yml
151
151
  - default_ssh.yml
152
152
  - exe/rundock
153
+ - hooks_sample.yml
153
154
  - lib/rundock.rb
154
155
  - lib/rundock/attribute/base.rb
155
156
  - lib/rundock/attribute/node_attribute.rb
@@ -157,17 +158,21 @@ files:
157
158
  - lib/rundock/builder/backend_builder.rb
158
159
  - lib/rundock/builder/base.rb
159
160
  - lib/rundock/builder/default_ssh_builder.rb
161
+ - lib/rundock/builder/hook_builder.rb
160
162
  - lib/rundock/builder/operation_builder.rb
161
163
  - lib/rundock/builder/scenario_builder.rb
162
164
  - lib/rundock/cli.rb
163
165
  - lib/rundock/ext/hash.rb
164
166
  - lib/rundock/ext/object/blank.rb
167
+ - lib/rundock/hook/base.rb
168
+ - lib/rundock/hook_factory.rb
165
169
  - lib/rundock/logger.rb
166
170
  - lib/rundock/node.rb
167
171
  - lib/rundock/operation/base.rb
168
172
  - lib/rundock/operation/command.rb
169
173
  - lib/rundock/operation/task.rb
170
174
  - lib/rundock/operation_factory.rb
175
+ - lib/rundock/plugin/hook/file.rb
171
176
  - lib/rundock/plugin/operation/deploy.rb
172
177
  - lib/rundock/plugin/operation/host_inventory.rb
173
178
  - lib/rundock/plugin/operation/sample_operation.rb
@@ -177,19 +182,26 @@ files:
177
182
  - rundock.gemspec
178
183
  - scenario_sample.yml
179
184
  - spec/integration/groups/simple_host_group.yml
185
+ - spec/integration/hooks/all_file_hooks.yml
186
+ - spec/integration/hooks/simple_file_hooks.yml
180
187
  - spec/integration/platforms/centos6/Dockerfile
181
188
  - spec/integration/platforms/centos6/setup.sh
189
+ - spec/integration/platforms/localhost/scenarios/all_file_hooks_scenario.yml
182
190
  - spec/integration/platforms/localhost/scenarios/deploy_scenario.yml
183
191
  - spec/integration/platforms/localhost/scenarios/run_anyway_scenario.yml
184
192
  - spec/integration/platforms/localhost/scenarios/simple_echo_scenario.yml
193
+ - spec/integration/platforms/localhost/scenarios/simple_file_hooks_scenario.yml
185
194
  - spec/integration/platforms/localhost/scenarios/simple_plugin_scenario.yml
186
195
  - spec/integration/platforms/localhost/scenarios/use_default_ssh_scenario.yml
187
196
  - spec/integration/recipes/deploy_spec.rb
197
+ - spec/integration/recipes/file_hook_spec.rb
188
198
  - spec/integration/recipes/simple_echo_scenario_spec.rb
189
199
  - spec/integration/recipes/simple_echo_spec.rb
190
200
  - spec/integration/recipes/simple_plugin_scenario_spec.rb
201
+ - spec/integration/scenarios/all_file_hooks_scenario.yml
191
202
  - spec/integration/scenarios/deploy_scenario.yml
192
203
  - spec/integration/scenarios/simple_echo_scenario.yml
204
+ - spec/integration/scenarios/simple_file_hooks_scenario.yml
193
205
  - spec/integration/scenarios/simple_plugin_scenario.yml
194
206
  - spec/integration/scenarios/use_default_ssh_scenario.yml
195
207
  - spec/integration/spec_helper.rb