itamae 1.4.5 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -1
- data/README.md +45 -5
- data/lib/itamae/backend.rb +12 -12
- data/lib/itamae/cli.rb +2 -2
- data/lib/itamae/logger.rb +44 -53
- data/lib/itamae/node.rb +1 -1
- data/lib/itamae/notification.rb +1 -1
- data/lib/itamae/recipe.rb +4 -4
- data/lib/itamae/resource.rb +1 -1
- data/lib/itamae/resource/base.rb +21 -22
- data/lib/itamae/resource/file.rb +4 -4
- data/lib/itamae/resource/remote_directory.rb +3 -3
- data/lib/itamae/resource/remote_file.rb +1 -1
- data/lib/itamae/runner.rb +6 -6
- data/lib/itamae/version.txt +1 -1
- data/spec/integration/recipes/default.rb +1 -1
- data/spec/unit/lib/itamae/resource/base_spec.rb +1 -1
- data/spec/unit/spec_helper.rb +1 -2
- data/wercker.yml +1 -1
- metadata +2 -4
- data/spec/unit/lib/itamae/logger_spec.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5824e615aa71ac1b33b444d24ef09a784ce481fe
|
4
|
+
data.tar.gz: 18ded54560fa8f2c95d94bdee351d33edfc53b06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f04064f58c4b1ed7130dee98dd8d640562140e49b49de8f4cf098181fe628fd1eafa9ff6350ed3e3213d52f9b1a160133e6169c973a34a556b095bd3a29a540a
|
7
|
+
data.tar.gz: 7180ffdc7d22da2ba174d6c9985e8bf596ba458943e3483a4391af88a84da75ff6535e2627aebdcce58fb60b4b72305b8ff7f4fb8ff389f94400fa5e31b07697
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## v1.5.0
|
2
|
+
|
3
|
+
Improvements
|
4
|
+
|
5
|
+
- [Make a logger injectable from outside of Itamae.](https://github.com/itamae-kitchen/itamae/pull/160)
|
6
|
+
|
1
7
|
## v1.4.5
|
2
8
|
|
3
9
|
Improvements
|
@@ -417,4 +423,3 @@ Features
|
|
417
423
|
Incompatible changes
|
418
424
|
|
419
425
|
- `uid` and `gid` attributes of `user` resource accept only Integer. (https://github.com/ryotarai/itamae/pull/65)
|
420
|
-
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Itamae [![Gem Version](https://badge.fury.io/rb/itamae.svg)](http://badge.fury.io/rb/itamae) [![Code Climate](https://codeclimate.com/github/ryotarai/itamae/badges/gpa.svg)](https://codeclimate.com/github/ryotarai/itamae) [![wercker status](https://app.wercker.com/status/3e7be3b982d3671940a07e3ef45d9f5f/s/master "wercker status")](https://app.wercker.com/project/bykey/3e7be3b982d3671940a07e3ef45d9f5f) [![Slack](https://
|
1
|
+
# Itamae [![Gem Version](https://badge.fury.io/rb/itamae.svg)](http://badge.fury.io/rb/itamae) [![Code Climate](https://codeclimate.com/github/ryotarai/itamae/badges/gpa.svg)](https://codeclimate.com/github/ryotarai/itamae) [![wercker status](https://app.wercker.com/status/3e7be3b982d3671940a07e3ef45d9f5f/s/master "wercker status")](https://app.wercker.com/project/bykey/3e7be3b982d3671940a07e3ef45d9f5f) [![Slack](https://img.shields.io/badge/slack-join-blue.svg)](https://itamae-slackin.herokuapp.com/)
|
2
2
|
|
3
3
|
Simple and lightweight configuration management tool inspired by Chef.
|
4
4
|
|
@@ -6,9 +6,9 @@ Simple and lightweight configuration management tool inspired by Chef.
|
|
6
6
|
|
7
7
|
## Concept
|
8
8
|
|
9
|
-
- Chef-like DSL
|
9
|
+
- Chef-like DSL (but not compatible with Chef)
|
10
10
|
- Simpler and lighter weight than Chef
|
11
|
-
-
|
11
|
+
- Only recipes
|
12
12
|
- Idempotent
|
13
13
|
|
14
14
|
## Installation
|
@@ -19,9 +19,49 @@ $ gem install itamae
|
|
19
19
|
|
20
20
|
## Getting Started
|
21
21
|
|
22
|
-
|
22
|
+
Create a recipe file as `recipe.rb`:
|
23
23
|
|
24
|
-
|
24
|
+
```ruby
|
25
|
+
package 'nginx' do
|
26
|
+
action :install
|
27
|
+
end
|
28
|
+
|
29
|
+
service 'nginx' do
|
30
|
+
action [:enable, :start]
|
31
|
+
end
|
32
|
+
```
|
33
|
+
|
34
|
+
And then excute `itamae` command to apply a recipe to a local machine.
|
35
|
+
|
36
|
+
```
|
37
|
+
$ itamae local recipe.rb
|
38
|
+
INFO : Starting Itamae...
|
39
|
+
INFO : Recipe: /home/user/recipe.rb
|
40
|
+
INFO : package[nginx]
|
41
|
+
INFO : action: install
|
42
|
+
INFO : installed will change from 'false' to 'true'
|
43
|
+
INFO : service[nginx]
|
44
|
+
INFO : action: enable
|
45
|
+
INFO : action: start
|
46
|
+
```
|
47
|
+
|
48
|
+
Or you can apply a recipe to a remote machine by `itamae ssh`.
|
49
|
+
|
50
|
+
```
|
51
|
+
$ itamae ssh --host host001.example.jp recipe.rb
|
52
|
+
```
|
53
|
+
|
54
|
+
You can also apply a recipe to Vagrant VM by `itamae ssh --vagrant`.
|
55
|
+
|
56
|
+
```
|
57
|
+
$ itamae ssh --vagrant --host vm_name recipe.rb
|
58
|
+
```
|
59
|
+
|
60
|
+
You can find further information to use Itamae on [Itamae Wiki](https://github.com/itamae-kitchen/itamae/wiki).
|
61
|
+
|
62
|
+
Enjoy!
|
63
|
+
|
64
|
+
## Documentation
|
25
65
|
|
26
66
|
https://github.com/itamae-kitchen/itamae/wiki
|
27
67
|
|
data/lib/itamae/backend.rb
CHANGED
@@ -44,11 +44,11 @@ module Itamae
|
|
44
44
|
options = {error: true}.merge(options)
|
45
45
|
|
46
46
|
command = build_command(commands, options)
|
47
|
-
|
47
|
+
Itamae.logger.debug "Executing `#{command}`..."
|
48
48
|
|
49
49
|
result = nil
|
50
50
|
|
51
|
-
|
51
|
+
Itamae.logger.with_indent do
|
52
52
|
reset_output_handler
|
53
53
|
result = @backend.run_command(command)
|
54
54
|
flush_output_handler_buffer
|
@@ -60,7 +60,7 @@ module Itamae
|
|
60
60
|
method = :error
|
61
61
|
message = "Command `#{command}` failed. (exit status: #{result.exit_status})"
|
62
62
|
|
63
|
-
unless
|
63
|
+
unless Itamae.logger.level == ::Logger::DEBUG
|
64
64
|
result.stdout.each_line do |l|
|
65
65
|
log_output_line("stdout", l, :error)
|
66
66
|
end
|
@@ -70,7 +70,7 @@ module Itamae
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
Itamae.logger.public_send(method, message)
|
74
74
|
end
|
75
75
|
|
76
76
|
if options[:error] && result.exit_status != 0
|
@@ -86,15 +86,15 @@ module Itamae
|
|
86
86
|
|
87
87
|
def receive_file(src, dst = nil)
|
88
88
|
if dst
|
89
|
-
|
89
|
+
Itamae.logger.debug "Receiving a file from '#{src}' to '#{dst}'..."
|
90
90
|
else
|
91
|
-
|
91
|
+
Itamae.logger.debug "Receiving a file from '#{src}'..."
|
92
92
|
end
|
93
93
|
@backend.receive_file(src, dst)
|
94
94
|
end
|
95
95
|
|
96
96
|
def send_file(src, dst)
|
97
|
-
|
97
|
+
Itamae.logger.debug "Sending a file from '#{src}' to '#{dst}'..."
|
98
98
|
unless ::File.exist?(src)
|
99
99
|
raise SourceNotExistError, "The file '#{src}' doesn't exist."
|
100
100
|
end
|
@@ -105,7 +105,7 @@ module Itamae
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def send_directory(src, dst)
|
108
|
-
|
108
|
+
Itamae.logger.debug "Sending a directory from '#{src}' to '#{dst}'..."
|
109
109
|
unless ::File.exist?(src)
|
110
110
|
raise SourceNotExistError, "The directory '#{src}' doesn't exist."
|
111
111
|
end
|
@@ -157,7 +157,7 @@ module Itamae
|
|
157
157
|
|
158
158
|
def log_output_line(output_name, line, severity = :debug)
|
159
159
|
line = line.gsub(/[[:cntrl:]]/, '')
|
160
|
-
|
160
|
+
Itamae.logger.public_send(severity, "#{output_name} | #{line}")
|
161
161
|
end
|
162
162
|
|
163
163
|
def build_command(commands, options)
|
@@ -245,7 +245,7 @@ module Itamae
|
|
245
245
|
class Docker < Base
|
246
246
|
def finalize
|
247
247
|
image = @backend.commit_container
|
248
|
-
|
248
|
+
Itamae.logger.info "Image created: #{image.id}"
|
249
249
|
end
|
250
250
|
|
251
251
|
private
|
@@ -253,12 +253,12 @@ module Itamae
|
|
253
253
|
begin
|
254
254
|
require 'docker'
|
255
255
|
rescue LoadError
|
256
|
-
|
256
|
+
Itamae.logger.fatal "To use docker backend, please install 'docker-api' gem"
|
257
257
|
end
|
258
258
|
|
259
259
|
# TODO: Move to Specinfra?
|
260
260
|
Excon.defaults[:ssl_verify_peer] = @options[:tls_verify_peer]
|
261
|
-
::Docker.logger =
|
261
|
+
::Docker.logger = Itamae.logger
|
262
262
|
|
263
263
|
Specinfra::Backend::Docker.new(
|
264
264
|
docker_image: @options[:image],
|
data/lib/itamae/cli.rb
CHANGED
@@ -10,8 +10,8 @@ module Itamae
|
|
10
10
|
opts = Config.new(opts).load
|
11
11
|
super(args, opts, config)
|
12
12
|
|
13
|
-
Itamae
|
14
|
-
Itamae
|
13
|
+
Itamae.logger.level = ::Logger.const_get(options[:log_level].upcase)
|
14
|
+
Itamae.logger.formatter.colored = options[:color]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.define_exec_options
|
data/lib/itamae/logger.rb
CHANGED
@@ -4,28 +4,7 @@ require 'ansi/code'
|
|
4
4
|
|
5
5
|
module Itamae
|
6
6
|
module Logger
|
7
|
-
|
8
|
-
attr_accessor :colored
|
9
|
-
attr_accessor :depth
|
10
|
-
attr_accessor :color
|
11
|
-
|
12
|
-
INDENT_LENGTH = 2
|
13
|
-
|
14
|
-
def initialize(*args)
|
15
|
-
super
|
16
|
-
|
17
|
-
@depth = 0
|
18
|
-
end
|
19
|
-
|
20
|
-
def call(severity, datetime, progname, msg)
|
21
|
-
log = "%s : %s%s\n" % ["%5s" % severity, ' ' * INDENT_LENGTH * depth , msg2str(msg)]
|
22
|
-
if colored
|
23
|
-
colorize(log, severity)
|
24
|
-
else
|
25
|
-
log
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
7
|
+
module IndentHelper
|
29
8
|
def with_indent
|
30
9
|
indent
|
31
10
|
yield
|
@@ -42,12 +21,42 @@ module Itamae
|
|
42
21
|
end
|
43
22
|
|
44
23
|
def indent
|
45
|
-
|
24
|
+
self.indent_depth += 1
|
46
25
|
end
|
47
26
|
|
48
27
|
def outdent
|
49
|
-
|
50
|
-
|
28
|
+
self.indent_depth -= 1
|
29
|
+
self.indent_depth = 0 if self.indent_depth < 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def indent_depth
|
33
|
+
@indent_depth ||= 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def indent_depth=(val)
|
37
|
+
@indent_depth = val
|
38
|
+
end
|
39
|
+
|
40
|
+
%w!debug info warn error fatal unknown!.each do |level|
|
41
|
+
module_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
42
|
+
def #{level}(msg)
|
43
|
+
super(" " * indent_depth + msg)
|
44
|
+
end
|
45
|
+
EOC
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class Formatter
|
50
|
+
attr_accessor :colored
|
51
|
+
attr_accessor :color
|
52
|
+
|
53
|
+
def call(severity, datetime, progname, msg)
|
54
|
+
log = "%s : %s\n" % ["%5s" % severity, msg2str(msg)]
|
55
|
+
if colored
|
56
|
+
colorize(log, severity)
|
57
|
+
else
|
58
|
+
log
|
59
|
+
end
|
51
60
|
end
|
52
61
|
|
53
62
|
def color(code)
|
@@ -89,37 +98,19 @@ module Itamae
|
|
89
98
|
ANSI.public_send(color_code) { str }
|
90
99
|
end
|
91
100
|
end
|
101
|
+
end
|
92
102
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
end
|
97
|
-
|
98
|
-
def log_device
|
99
|
-
@log_device || $stdout
|
100
|
-
end
|
101
|
-
|
102
|
-
def log_device=(value)
|
103
|
-
@log_device = value
|
104
|
-
@logger = create_logger
|
105
|
-
end
|
106
|
-
|
107
|
-
private
|
108
|
-
|
109
|
-
def create_logger
|
110
|
-
::Logger.new(log_device).tap do |logger|
|
111
|
-
logger.formatter = Formatter.new
|
112
|
-
end
|
113
|
-
end
|
103
|
+
@logger = ::Logger.new($stdout).tap do |l|
|
104
|
+
l.formatter = Itamae::Logger::Formatter.new
|
105
|
+
end.extend(Itamae::Logger::IndentHelper)
|
114
106
|
|
115
|
-
|
116
|
-
|
117
|
-
|
107
|
+
class << self
|
108
|
+
def logger
|
109
|
+
@logger
|
110
|
+
end
|
118
111
|
|
119
|
-
|
120
|
-
|
121
|
-
end
|
112
|
+
def logger=(l)
|
113
|
+
@logger = l.extend(Itamae::Logger::IndentHelper)
|
122
114
|
end
|
123
115
|
end
|
124
116
|
end
|
125
|
-
|
data/lib/itamae/node.rb
CHANGED
@@ -34,7 +34,7 @@ module Itamae
|
|
34
34
|
errors = Schash::Validator.new(&block).validate(@mash)
|
35
35
|
unless errors.empty?
|
36
36
|
errors.each do |error|
|
37
|
-
|
37
|
+
Itamae.logger.error "'#{error.position.join('->')}' #{error.message}"
|
38
38
|
end
|
39
39
|
raise ValidationError
|
40
40
|
end
|
data/lib/itamae/notification.rb
CHANGED
@@ -32,7 +32,7 @@ module Itamae
|
|
32
32
|
|
33
33
|
def validate!
|
34
34
|
unless [:delay, :delayed, :immediately].include?(timing)
|
35
|
-
|
35
|
+
Itamae.logger.error "'#{timing}' is not valid notification timing. (Valid option is delayed or immediately)"
|
36
36
|
abort
|
37
37
|
end
|
38
38
|
end
|
data/lib/itamae/recipe.rb
CHANGED
@@ -49,7 +49,7 @@ module Itamae
|
|
49
49
|
def run(options = {})
|
50
50
|
show_banner
|
51
51
|
|
52
|
-
|
52
|
+
Itamae.logger.with_indent do
|
53
53
|
@children.run(options)
|
54
54
|
run_delayed_notifications(options)
|
55
55
|
end
|
@@ -68,7 +68,7 @@ module Itamae
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def show_banner
|
71
|
-
|
71
|
+
Itamae.logger.info "Recipe: #{@path}"
|
72
72
|
end
|
73
73
|
|
74
74
|
class EvalContext
|
@@ -118,7 +118,7 @@ module Itamae
|
|
118
118
|
end
|
119
119
|
|
120
120
|
if runner.children.find_recipe_by_path(path)
|
121
|
-
|
121
|
+
Itamae.logger.debug "Recipe, #{path}, is skipped because it is already included"
|
122
122
|
return
|
123
123
|
end
|
124
124
|
|
@@ -151,7 +151,7 @@ module Itamae
|
|
151
151
|
private
|
152
152
|
|
153
153
|
def show_banner
|
154
|
-
|
154
|
+
Itamae.logger.debug "#{@definition.resource_type}[#{@definition.resource_name}]"
|
155
155
|
end
|
156
156
|
end
|
157
157
|
end
|
data/lib/itamae/resource.rb
CHANGED
data/lib/itamae/resource/base.rb
CHANGED
@@ -121,14 +121,14 @@ module Itamae
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def run(specific_action = nil, options = {})
|
124
|
-
|
124
|
+
Itamae.logger.debug "#{resource_type}[#{resource_name}]"
|
125
125
|
|
126
|
-
|
126
|
+
Itamae.logger.with_indent_if(Itamae.logger.debug?) do
|
127
127
|
if do_not_run_because_of_only_if?
|
128
|
-
|
128
|
+
Itamae.logger.debug "#{resource_type}[#{resource_name}] Execution skipped because of only_if attribute"
|
129
129
|
return
|
130
130
|
elsif do_not_run_because_of_not_if?
|
131
|
-
|
131
|
+
Itamae.logger.debug "#{resource_type}[#{resource_name}] Execution skipped because of not_if attribute"
|
132
132
|
return
|
133
133
|
end
|
134
134
|
|
@@ -142,7 +142,7 @@ module Itamae
|
|
142
142
|
|
143
143
|
@updated = false
|
144
144
|
rescue Backend::CommandExecutionError
|
145
|
-
|
145
|
+
Itamae.logger.error "#{resource_type}[#{resource_name}] Failed."
|
146
146
|
exit 2
|
147
147
|
end
|
148
148
|
|
@@ -172,24 +172,24 @@ module Itamae
|
|
172
172
|
|
173
173
|
clear_current_attributes
|
174
174
|
|
175
|
-
|
175
|
+
Itamae.logger.debug "#{resource_type}[#{resource_name}] action: #{action}"
|
176
176
|
|
177
177
|
return if action == :nothing
|
178
178
|
|
179
|
-
|
180
|
-
|
179
|
+
Itamae.logger.with_indent_if(Itamae.logger.debug?) do
|
180
|
+
Itamae.logger.debug "(in pre_action)"
|
181
181
|
pre_action
|
182
182
|
|
183
|
-
|
183
|
+
Itamae.logger.debug "(in set_current_attributes)"
|
184
184
|
set_current_attributes
|
185
185
|
|
186
|
-
|
186
|
+
Itamae.logger.debug "(in show_differences)"
|
187
187
|
show_differences
|
188
188
|
|
189
189
|
method_name = "action_#{action}"
|
190
190
|
if options[:dry_run]
|
191
191
|
unless respond_to?(method_name)
|
192
|
-
|
192
|
+
Itamae.logger.error "action #{action.inspect} is unavailable"
|
193
193
|
end
|
194
194
|
else
|
195
195
|
public_send(method_name, options)
|
@@ -228,14 +228,14 @@ module Itamae
|
|
228
228
|
if current_value.nil? && value.nil?
|
229
229
|
# ignore
|
230
230
|
elsif current_value.nil? && !value.nil?
|
231
|
-
|
232
|
-
|
231
|
+
Itamae.logger.formatter.color :green do
|
232
|
+
Itamae.logger.info "#{resource_type}[#{resource_name}] #{key} will be '#{value}'"
|
233
233
|
end
|
234
234
|
elsif current_value == value || value.nil?
|
235
|
-
|
235
|
+
Itamae.logger.debug "#{resource_type}[#{resource_name}] #{key} will not change (current value is '#{current_value}')"
|
236
236
|
else
|
237
|
-
|
238
|
-
|
237
|
+
Itamae.logger.formatter.color :green do
|
238
|
+
Itamae.logger.info "#{resource_type}[#{resource_name}] #{key} will change from '#{current_value}' to '#{value}'"
|
239
239
|
end
|
240
240
|
end
|
241
241
|
end
|
@@ -319,7 +319,7 @@ module Itamae
|
|
319
319
|
end
|
320
320
|
|
321
321
|
def updated!
|
322
|
-
|
322
|
+
Itamae.logger.debug "This resource is updated."
|
323
323
|
@updated = true
|
324
324
|
end
|
325
325
|
|
@@ -337,10 +337,10 @@ module Itamae
|
|
337
337
|
message << " (immediately)"
|
338
338
|
end
|
339
339
|
|
340
|
-
|
340
|
+
Itamae.logger.info message
|
341
341
|
|
342
342
|
if notification.instance_of?(Subscription)
|
343
|
-
|
343
|
+
Itamae.logger.info "(because it subscribes this resource)"
|
344
344
|
end
|
345
345
|
|
346
346
|
if notification.delayed?
|
@@ -354,8 +354,8 @@ module Itamae
|
|
354
354
|
def verify
|
355
355
|
return if @verify_commands.empty?
|
356
356
|
|
357
|
-
|
358
|
-
|
357
|
+
Itamae.logger.info "Verifying..."
|
358
|
+
Itamae.logger.with_indent do
|
359
359
|
@verify_commands.each do |command|
|
360
360
|
run_command(command)
|
361
361
|
end
|
@@ -364,4 +364,3 @@ module Itamae
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
end
|
367
|
-
|
data/lib/itamae/resource/file.rb
CHANGED
@@ -110,9 +110,9 @@ module Itamae
|
|
110
110
|
diff = run_command(["diff", "-u", attributes.path, @temppath], error: false)
|
111
111
|
if diff.exit_status == 0
|
112
112
|
# no change
|
113
|
-
|
113
|
+
Itamae.logger.debug "file content will not change"
|
114
114
|
else
|
115
|
-
|
115
|
+
Itamae.logger.info "diff:"
|
116
116
|
diff.stdout.each_line do |line|
|
117
117
|
color = if line.start_with?('+')
|
118
118
|
:green
|
@@ -121,8 +121,8 @@ module Itamae
|
|
121
121
|
else
|
122
122
|
:clear
|
123
123
|
end
|
124
|
-
|
125
|
-
|
124
|
+
Itamae.logger.formatter.color(color) do
|
125
|
+
Itamae.logger.info line.chomp
|
126
126
|
end
|
127
127
|
end
|
128
128
|
end
|
@@ -44,11 +44,11 @@ module Itamae
|
|
44
44
|
diff = run_command(["diff", "-u", attributes.path, @temppath], error: false)
|
45
45
|
if diff.exit_status == 0
|
46
46
|
# no change
|
47
|
-
|
47
|
+
Itamae.logger.debug "directory content will not change"
|
48
48
|
else
|
49
|
-
|
49
|
+
Itamae.logger.info "diff:"
|
50
50
|
diff.stdout.each_line do |line|
|
51
|
-
|
51
|
+
Itamae.logger.info "#{line.strip}"
|
52
52
|
end
|
53
53
|
end
|
54
54
|
end
|
@@ -27,7 +27,7 @@ module Itamae
|
|
27
27
|
source_file_exts.each do |ext|
|
28
28
|
path = ::File.join(@recipe.dir, source_file_dir, "#{dirs[i..-1].join("/")}#{ext}")
|
29
29
|
if ::File.exist?(path)
|
30
|
-
|
30
|
+
Itamae.logger.debug "#{path} is used as a source file."
|
31
31
|
return path
|
32
32
|
else
|
33
33
|
searched_paths << path
|
data/lib/itamae/runner.rb
CHANGED
@@ -6,14 +6,14 @@ module Itamae
|
|
6
6
|
class Runner
|
7
7
|
class << self
|
8
8
|
def run(recipe_files, backend_type, options)
|
9
|
-
|
9
|
+
Itamae.logger.info "Starting Itamae..."
|
10
10
|
|
11
11
|
backend = Backend.create(backend_type, options)
|
12
12
|
runner = self.new(backend, options)
|
13
13
|
runner.load_recipes(recipe_files)
|
14
14
|
|
15
15
|
if dot_file = options[:dot]
|
16
|
-
|
16
|
+
Itamae.logger.info "Writing dependency graph in DOT to #{dot_file}..."
|
17
17
|
open(dot_file, 'w') do |f|
|
18
18
|
f.write(runner.children.deps_in_dot)
|
19
19
|
end
|
@@ -61,23 +61,23 @@ module Itamae
|
|
61
61
|
if @options[:ohai]
|
62
62
|
unless @backend.run_command("which ohai", error: false).exit_status == 0
|
63
63
|
# install Ohai
|
64
|
-
|
64
|
+
Itamae.logger.info "Installing Chef package... (to use Ohai)"
|
65
65
|
@backend.run_command("curl -L https://www.opscode.com/chef/install.sh | bash")
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
Itamae.logger.info "Loading node data via ohai..."
|
69
69
|
hash.merge!(JSON.parse(@backend.run_command("ohai").stdout))
|
70
70
|
end
|
71
71
|
|
72
72
|
if @options[:node_json]
|
73
73
|
path = File.expand_path(@options[:node_json])
|
74
|
-
|
74
|
+
Itamae.logger.info "Loading node data from #{path}..."
|
75
75
|
hash.merge!(JSON.load(open(path)))
|
76
76
|
end
|
77
77
|
|
78
78
|
if @options[:node_yaml]
|
79
79
|
path = File.expand_path(@options[:node_yaml])
|
80
|
-
|
80
|
+
Itamae.logger.info "Loading node data from #{path}..."
|
81
81
|
hash.merge!(YAML.load(open(path)))
|
82
82
|
end
|
83
83
|
|
data/lib/itamae/version.txt
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.5.0
|
@@ -124,7 +124,7 @@ describe TestResource do
|
|
124
124
|
context 'with dry_run' do
|
125
125
|
context 'when specified action is unavailable' do
|
126
126
|
it 'logs error' do
|
127
|
-
expect(Itamae
|
127
|
+
expect(Itamae.logger).to receive(:error).with(/action :name is unavailable/)
|
128
128
|
subject.run(nil, dry_run: true)
|
129
129
|
end
|
130
130
|
end
|
data/spec/unit/spec_helper.rb
CHANGED
data/wercker.yml
CHANGED
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.
|
4
|
+
version: 1.5.0
|
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-
|
11
|
+
date: 2015-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -249,7 +249,6 @@ files:
|
|
249
249
|
- spec/integration/spec_helper.rb
|
250
250
|
- spec/unit/lib/itamae/backend_spec.rb
|
251
251
|
- spec/unit/lib/itamae/config_spec.rb
|
252
|
-
- spec/unit/lib/itamae/logger_spec.rb
|
253
252
|
- spec/unit/lib/itamae/node_spec.rb
|
254
253
|
- spec/unit/lib/itamae/recipe_spec.rb
|
255
254
|
- spec/unit/lib/itamae/resource/base_spec.rb
|
@@ -298,7 +297,6 @@ test_files:
|
|
298
297
|
- spec/integration/spec_helper.rb
|
299
298
|
- spec/unit/lib/itamae/backend_spec.rb
|
300
299
|
- spec/unit/lib/itamae/config_spec.rb
|
301
|
-
- spec/unit/lib/itamae/logger_spec.rb
|
302
300
|
- spec/unit/lib/itamae/node_spec.rb
|
303
301
|
- spec/unit/lib/itamae/recipe_spec.rb
|
304
302
|
- spec/unit/lib/itamae/resource/base_spec.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Itamae
|
4
|
-
describe Logger do
|
5
|
-
let(:io) { StringIO.new }
|
6
|
-
|
7
|
-
before do
|
8
|
-
Logger.log_device = io
|
9
|
-
end
|
10
|
-
|
11
|
-
[:fatal, :error, :warn, :info, :debug].each do |level|
|
12
|
-
describe "##{level}" do
|
13
|
-
it "puts #{level} log" do
|
14
|
-
Logger.public_send(level, "CONTENT")
|
15
|
-
expect(io.string).to include('CONTENT')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|