itamae 1.1.18 → 1.1.19

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: 21d7a4d489e16899e9c5554fc59a8741ec2aa0cc
4
- data.tar.gz: c188142a5e592f79df63523e0f193b266432d888
3
+ metadata.gz: 5bc2771249661bde6dc39318b631d963a7697ebc
4
+ data.tar.gz: e0daf9fcefe8de50700be1bd21a5e6d2713a514a
5
5
  SHA512:
6
- metadata.gz: 8221d7deaa055b4091ccb439c8ca9411f8d91baa938d1dd12dba5ca661b991f755a30eb8ed1789c2cb8c78239f739a1a0e28ffb02e8cb8dcceb21490934701d1
7
- data.tar.gz: deee523a22ae7d96c6d814580f67aed9afa8d5f120a9d131dc1d68ae594a6ba0d4da032070d63e625334a6dcb5fa03cc8a542c369076b8ad16a4ab976780d75c
6
+ metadata.gz: 554595b1b3c7a10964e2d087d3b1a8194f1baab016fd4e6408dea6ab920d671d64744b1a19f2ec488e835d9072eb980dca6b24677c3c99bae1a5c55162dd9d44
7
+ data.tar.gz: 7b245129c145755de0ff1751c9fe275be4bb30532540269be2c6e0300d376af02fc3b1ef063153b9a32b08f409ada0228a3c21705c4ceef13b6777e827745d5a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## v1.1.19
2
+
3
+ Features
4
+
5
+ - `verify` attribute
6
+ - command will be executed after running resource action.
7
+ - If it fails, Itamae will abort (notifications will not be executed)
8
+
9
+ Improvements
10
+
11
+ - [`--vagrant` option without `--host` assumes the VM name `default` (by @muratayusuke)](https://github.com/itamae-kitchen/itamae/pull/91)
12
+ - `delayed` is a valid notification timing.
13
+ - same as Chef
14
+ - If invalid notification timing is provided, an error will be raised.
15
+
1
16
  ## v1.1.18
2
17
 
3
18
  Improvements
data/lib/itamae/cli.rb CHANGED
@@ -33,7 +33,7 @@ module Itamae
33
33
  option :node_json, type: :string, aliases: ['-j']
34
34
  option :node_yaml, type: :string, aliases: ['-y']
35
35
  option :dry_run, type: :boolean, aliases: ['-n']
36
- option :host, required: true, type: :string, aliases: ['-h']
36
+ option :host, type: :string, aliases: ['-h']
37
37
  option :user, type: :string, aliases: ['-u']
38
38
  option :key, type: :string, aliases: ['-i']
39
39
  option :port, type: :numeric, aliases: ['-p']
@@ -46,6 +46,10 @@ module Itamae
46
46
  raise "Please specify recipe files."
47
47
  end
48
48
 
49
+ unless options[:host] || options[:vagrant]
50
+ raise "Please set '-h <hostname>' or '--vagrant'"
51
+ end
52
+
49
53
  Runner.run(recipe_files, :ssh, options)
50
54
  end
51
55
 
@@ -2,6 +2,10 @@ require 'itamae'
2
2
 
3
3
  module Itamae
4
4
  class Notification < Struct.new(:defined_in_resource, :action, :target_resource_desc, :timing)
5
+ def self.create(*args)
6
+ self.new(*args).tap(&:validate!)
7
+ end
8
+
5
9
  def resource
6
10
  runner.children.find_resource_by_description(target_resource_desc)
7
11
  end
@@ -17,6 +21,21 @@ module Itamae
17
21
  def runner
18
22
  defined_in_resource.recipe.runner
19
23
  end
24
+
25
+ def delayed?
26
+ [:delay, :delayed].include?(timing)
27
+ end
28
+
29
+ def immediately?
30
+ timing == :immediately
31
+ end
32
+
33
+ def validate!
34
+ unless [:delay, :delayed, :immediately].include?(timing)
35
+ Logger.error "'#{timing}' is not valid notification timing. (Valid option is delayed or immediately)"
36
+ abort
37
+ end
38
+ end
20
39
  end
21
40
 
22
41
  class Subscription < Notification
@@ -9,6 +9,7 @@ module Itamae
9
9
  attr_reader :attributes
10
10
  attr_reader :notifications
11
11
  attr_reader :subscriptions
12
+ attr_reader :verify_commands
12
13
  attr_reader :only_if_command
13
14
  attr_reader :not_if_command
14
15
 
@@ -18,6 +19,7 @@ module Itamae
18
19
  @attributes = Hashie::Mash.new
19
20
  @notifications = []
20
21
  @subscriptions = []
22
+ @verify_commands = []
21
23
  end
22
24
 
23
25
  def respond_to_missing?(method, include_private = false)
@@ -39,11 +41,11 @@ module Itamae
39
41
  end
40
42
 
41
43
  def notifies(action, resource_desc, timing = :delay)
42
- @notifications << Notification.new(@resource, action, resource_desc, timing)
44
+ @notifications << Notification.create(@resource, action, resource_desc, timing)
43
45
  end
44
46
 
45
47
  def subscribes(action, resource_desc, timing = :delay)
46
- @subscriptions << Subscription.new(@resource, action, resource_desc, timing)
48
+ @subscriptions << Subscription.create(@resource, action, resource_desc, timing)
47
49
  end
48
50
 
49
51
  def only_if(command)
@@ -57,6 +59,11 @@ module Itamae
57
59
  def node
58
60
  @resource.recipe.runner.node
59
61
  end
62
+
63
+ # Experimental
64
+ def verify(command)
65
+ @verify_commands << command
66
+ end
60
67
  end
61
68
 
62
69
  @defined_attributes ||= {}
@@ -102,6 +109,7 @@ module Itamae
102
109
  @subscriptions = context.subscriptions
103
110
  @only_if_command = context.only_if_command
104
111
  @not_if_command = context.not_if_command
112
+ @verify_commands = context.verify_commands
105
113
  end
106
114
 
107
115
  process_attributes
@@ -123,6 +131,7 @@ module Itamae
123
131
  run_action(action, options)
124
132
  end
125
133
 
134
+ verify unless options[:dry_run]
126
135
  notify(options) if updated?
127
136
  end
128
137
  rescue Backend::CommandExecutionError
@@ -326,10 +335,9 @@ module Itamae
326
335
  (notifications + recipe.children.subscribing(self)).each do |notification|
327
336
  message = "Notifying #{notification.action} to #{notification.action_resource.resource_type} resource '#{notification.action_resource.resource_name}'"
328
337
 
329
- case notification.timing
330
- when :delay
338
+ if notification.delayed?
331
339
  message << " (delayed)"
332
- when :immediately
340
+ elsif notification.immediately?
333
341
  message << " (immediately)"
334
342
  end
335
343
 
@@ -339,11 +347,21 @@ module Itamae
339
347
  Logger.info "(because it subscribes this resource)"
340
348
  end
341
349
 
342
- case notification.timing
343
- when :immediately
344
- notification.run(options)
345
- when :delay
350
+ if notification.delayed?
346
351
  @recipe.delayed_notifications << notification
352
+ elsif notification.immediately?
353
+ notification.run(options)
354
+ end
355
+ end
356
+ end
357
+
358
+ def verify
359
+ return if @verify_commands.empty?
360
+
361
+ Logger.info "Verifying..."
362
+ Logger.formatter.indent do
363
+ @verify_commands.each do |command|
364
+ run_command(command)
347
365
  end
348
366
  end
349
367
  end
data/lib/itamae/runner.rb CHANGED
@@ -69,8 +69,9 @@ module Itamae
69
69
 
70
70
  if options[:vagrant]
71
71
  config = Tempfile.new('', Dir.tmpdir)
72
- `vagrant ssh-config #{opts[:host]} > #{config.path}`
73
- opts.merge!(Net::SSH::Config.for(opts[:host], [config.path]))
72
+ hostname = opts[:host] || 'default'
73
+ `vagrant ssh-config #{hostname} > #{config.path}`
74
+ opts.merge!(Net::SSH::Config.for(hostname, [config.path]))
74
75
  opts[:host] = opts.delete(:host_name)
75
76
  end
76
77
 
@@ -1 +1 @@
1
- 1.1.18
1
+ 1.1.19
@@ -215,3 +215,9 @@ file "/tmp/file1" do
215
215
  notifies :create, "file[/tmp/never_exist4]"
216
216
  end
217
217
 
218
+ #####
219
+
220
+ execute 'true' do
221
+ verify 'true'
222
+ end
223
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itamae
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.18
4
+ version: 1.1.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryota Arai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
224
224
  version: '0'
225
225
  requirements: []
226
226
  rubyforge_project:
227
- rubygems_version: 2.2.2
227
+ rubygems_version: 2.4.5
228
228
  signing_key:
229
229
  specification_version: 4
230
230
  summary: Simple Configuration Management Tool