knife-stackbuilder 0.5.8 → 0.5.9
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 +4 -4
- data/lib/stackbuilder/chef/stack_container_node.rb +21 -30
- data/lib/stackbuilder/chef/stack_generic_node.rb +16 -5
- data/lib/stackbuilder/chef/stack_node_manager.rb +36 -13
- data/lib/stackbuilder/chef/stack_provider.rb +1 -1
- data/lib/stackbuilder/chef/stack_vagrant_node.rb +6 -3
- data/lib/stackbuilder/common/config.rb +2 -0
- data/lib/stackbuilder/common/helpers.rb +20 -23
- data/lib/stackbuilder/stack/node_task.rb +8 -19
- data/lib/stackbuilder/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ab807fc026606708f650e207c681ea3ffb82486
|
4
|
+
data.tar.gz: 71a6b26ab5974d2e1c117f04da246f150dcc4375
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53bac33ce0fe0a52524d8dbe36d18aadd34cdecd0a0bbe66cd2bf2ff393f2741cf08f745cde95c34c962e8a6db1e56ebae016a182ae199157bb94d2014985577
|
7
|
+
data.tar.gz: 52a0c878e71ee0f512fa3eb8b6213aa03a24a7772e9e2bc2c99dfc0324168998e2f96b6f6878de2c6040ae197ed22ce84bcc58414269d5a24c08c2b343e00507
|
@@ -200,30 +200,26 @@ module StackBuilder::Chef
|
|
200
200
|
unless ENV['DOCKER_TLS_VERIFY']
|
201
201
|
end
|
202
202
|
|
203
|
-
echo_output = @logger.info? || @logger.debug?
|
204
203
|
build_exists = @name==`docker images | awk '$1=="#{@name}" { print $1 }'`.strip
|
205
204
|
|
206
205
|
knife_cmd = Chef::Knife::ContainerDockerInit.new
|
207
206
|
|
208
207
|
# Run as a forked job (This captures all output and removes noise from output)
|
209
|
-
|
208
|
+
knife_cmd.name_args = [ @name ]
|
210
209
|
|
211
|
-
|
210
|
+
knife_cmd.config[:local_mode] = false
|
211
|
+
knife_cmd.config[:base_image] = build_exists ? @name : @knife_config['image']
|
212
|
+
knife_cmd.config[:force] = true
|
213
|
+
knife_cmd.config[:generate_berksfile] = false
|
214
|
+
knife_cmd.config[:include_credentials] = true
|
212
215
|
|
213
|
-
|
214
|
-
|
215
|
-
k.config[:force] = true
|
216
|
-
k.config[:generate_berksfile] = false
|
217
|
-
k.config[:include_credentials] = true
|
216
|
+
knife_cmd.config[:dockerfiles_path] = @dockerfiles_build_dir
|
217
|
+
knife_cmd.config[:run_list] = @knife_config['run_list']
|
218
218
|
|
219
|
-
|
220
|
-
|
219
|
+
knife_cmd.config[:encrypted_data_bag_secret] = IO.read(@env_key_file) \
|
220
|
+
unless File.exist? (@env_key_file)
|
221
221
|
|
222
|
-
|
223
|
-
unless File.exist? (@env_key_file)
|
224
|
-
|
225
|
-
run_knife(k)
|
226
|
-
end
|
222
|
+
run_knife_forked(knife_cmd)
|
227
223
|
|
228
224
|
dockerfiles_named_path = @dockerfiles_build_dir + '/' + @name
|
229
225
|
|
@@ -282,21 +278,16 @@ module StackBuilder::Chef
|
|
282
278
|
# Run the build as a forked job (This captures all output and removes noise from output)
|
283
279
|
knife_cmd = Chef::Knife::ContainerDockerBuild.new
|
284
280
|
|
285
|
-
|
286
|
-
|
287
|
-
k.name_args = [ @name ]
|
281
|
+
knife_cmd.name_args = [ @name ]
|
288
282
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
run_knife(k)
|
295
|
-
end
|
283
|
+
knife_cmd.config[:run_berks] = false
|
284
|
+
knife_cmd.config[:force_build] = true
|
285
|
+
knife_cmd.config[:dockerfiles_path] = @dockerfiles_build_dir
|
286
|
+
knife_cmd.config[:cleanup] = true
|
296
287
|
|
297
|
-
|
298
|
-
|
299
|
-
|
288
|
+
begin
|
289
|
+
results = run_knife_forked(knife_cmd)
|
290
|
+
rescue Exception => msg
|
300
291
|
|
301
292
|
if @logger.level>=::Logger::WARN
|
302
293
|
|
@@ -306,10 +297,10 @@ module StackBuilder::Chef
|
|
306
297
|
%x(docker rmi -f #{@name})
|
307
298
|
|
308
299
|
puts "Knife container build Chef convergence failed with an error."
|
309
|
-
puts "#{
|
300
|
+
puts "#{results[0]}"
|
310
301
|
end
|
311
302
|
|
312
|
-
raise
|
303
|
+
raise msg
|
313
304
|
end
|
314
305
|
|
315
306
|
puts 'Saving docker image for upload. This may take a few minutes.'
|
@@ -6,7 +6,7 @@ module StackBuilder::Chef
|
|
6
6
|
|
7
7
|
class GenericNodeManager < StackBuilder::Chef::NodeManager
|
8
8
|
|
9
|
-
def create_vm(name, knife_config)
|
9
|
+
def create_vm(index, name, knife_config)
|
10
10
|
|
11
11
|
create_class_name = knife_config['create']['class']
|
12
12
|
raise ArgumentError, "Knife plugin's server 'create' class name not provided." \
|
@@ -21,16 +21,27 @@ module StackBuilder::Chef
|
|
21
21
|
knife_cmd.name_args = [ name ]
|
22
22
|
end
|
23
23
|
|
24
|
+
if knife_config['create'].has_key?('pool_key')
|
25
|
+
|
26
|
+
pool_key = knife_config['create']['pool_key']
|
27
|
+
|
28
|
+
placement_pools = knife_config['placement_pools']
|
29
|
+
raise ArgumentError, "Knife plugin 'placement_pools' list was not provided." \
|
30
|
+
if placement_pools.nil?
|
31
|
+
|
32
|
+
knife_cmd.config[pool_key.to_sym] = placement_pools[index % placement_pools.size]
|
33
|
+
end
|
34
|
+
|
24
35
|
config_knife(knife_cmd, knife_config['create']['options'] || { })
|
25
36
|
config_knife(knife_cmd, knife_config['options'] || { })
|
26
37
|
|
27
38
|
if knife_config['create']['synchronized']
|
28
39
|
@@sync ||= Mutex.new
|
29
40
|
@@sync.synchronize {
|
30
|
-
|
41
|
+
run_knife_forked(knife_cmd)
|
31
42
|
}
|
32
43
|
else
|
33
|
-
|
44
|
+
run_knife_forked(knife_cmd)
|
34
45
|
end
|
35
46
|
end
|
36
47
|
|
@@ -59,10 +70,10 @@ module StackBuilder::Chef
|
|
59
70
|
if knife_config['delete']['synchronized']
|
60
71
|
@@sync ||= Mutex.new
|
61
72
|
@@sync.synchronize {
|
62
|
-
|
73
|
+
run_knife_forked(knife_cmd)
|
63
74
|
}
|
64
75
|
else
|
65
|
-
|
76
|
+
run_knife_forked(knife_cmd)
|
66
77
|
end
|
67
78
|
end
|
68
79
|
end
|
@@ -67,13 +67,22 @@ module StackBuilder::Chef
|
|
67
67
|
def create(index)
|
68
68
|
|
69
69
|
name = "#{@node_id}-#{index}"
|
70
|
-
self.create_vm(name, @knife_config)
|
70
|
+
self.create_vm(index, name, @knife_config)
|
71
71
|
|
72
72
|
node = Chef::Node.load(name)
|
73
73
|
node.normal['stack_id'] = @id
|
74
74
|
node.normal['stack_node'] = @name
|
75
75
|
node.save
|
76
76
|
|
77
|
+
begin
|
78
|
+
# Wait for node to become available
|
79
|
+
node_search("name:#{name}", StackBuilder::Common::Config.timeouts[:QUERY_TIMEOUT])
|
80
|
+
|
81
|
+
rescue Exception => msg
|
82
|
+
raise StackBuilder::Common::StackBuilderError, \
|
83
|
+
"Error waiting for node named '#{name} to be indexed in Chef Server: #{msg}"
|
84
|
+
end
|
85
|
+
|
77
86
|
unless @env_key_file.nil?
|
78
87
|
env_key = IO.read(@env_key_file)
|
79
88
|
knife_ssh( name,
|
@@ -88,7 +97,7 @@ module StackBuilder::Chef
|
|
88
97
|
raise msg
|
89
98
|
end
|
90
99
|
|
91
|
-
def create_vm(name, knife_config)
|
100
|
+
def create_vm(index, name, knife_config)
|
92
101
|
raise StackBuilder::Common::NotImplemented, 'HostNodeManager.create_vm'
|
93
102
|
end
|
94
103
|
|
@@ -135,7 +144,7 @@ module StackBuilder::Chef
|
|
135
144
|
"exit $result" )
|
136
145
|
else
|
137
146
|
node = Chef::Node.load(name)
|
138
|
-
attributes.each { |k,v| node.
|
147
|
+
attributes.each { |k,v| node.normal[k] = v }
|
139
148
|
node.save
|
140
149
|
end
|
141
150
|
|
@@ -199,16 +208,9 @@ module StackBuilder::Chef
|
|
199
208
|
|
200
209
|
def get_stack_node_resources
|
201
210
|
|
202
|
-
|
203
|
-
|
204
|
-
escaped_query = URI.escape(
|
205
|
-
"stack_id:#{@id} AND stack_node:#{@name}",
|
206
|
-
Regexp.new("[^#{URI::PATTERN::UNRESERVED}]") )
|
207
|
-
|
208
|
-
results = query.search('node', escaped_query, nil, 0, 999999)
|
211
|
+
results = node_search("stack_id:#{@id} AND stack_node:#{@name}")
|
209
212
|
@nodes = results[0]
|
210
|
-
|
211
|
-
results[2]
|
213
|
+
@nodes.size
|
212
214
|
end
|
213
215
|
|
214
216
|
def knife_ssh(name, cmd)
|
@@ -235,11 +237,32 @@ module StackBuilder::Chef
|
|
235
237
|
error = StackBuilder::Common::TeeIO.new($stderr)
|
236
238
|
|
237
239
|
@logger.info("Running '#{cmd}' on node 'name:#{name}'.")
|
238
|
-
run_knife(knife_cmd,
|
240
|
+
run_knife(knife_cmd, output, error)
|
239
241
|
else
|
240
242
|
run_knife(knife_cmd)
|
241
243
|
end
|
242
244
|
end
|
243
245
|
|
246
|
+
def node_search(search_query, timeout = 0)
|
247
|
+
|
248
|
+
query = Chef::Search::Query.new
|
249
|
+
escaped_query = URI.escape(search_query, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
250
|
+
|
251
|
+
if timeout>0
|
252
|
+
@logger.info("Waiting '#{search_query}' to return results.")
|
253
|
+
results = Timeout::timeout(timeout) {
|
254
|
+
|
255
|
+
while true do
|
256
|
+
results = query.search('node', escaped_query, nil, 0, 999999)
|
257
|
+
return results if results[0].size>0
|
258
|
+
end
|
259
|
+
}
|
260
|
+
else
|
261
|
+
results = query.search('node', escaped_query, nil, 0, 999999)
|
262
|
+
end
|
263
|
+
|
264
|
+
results
|
265
|
+
end
|
266
|
+
|
244
267
|
end
|
245
268
|
end
|
@@ -37,7 +37,7 @@ module StackBuilder::Chef
|
|
37
37
|
@id = id
|
38
38
|
|
39
39
|
stack_environment = stack['environment']
|
40
|
-
raise
|
40
|
+
raise ArgumentError, "Stack file is fixed to the environment '#{stack_environment}', " +
|
41
41
|
" which it does not match the environment '#{@environment}' provided." \
|
42
42
|
unless stack_environment.nil? || stack_environment==@environment
|
43
43
|
|
@@ -6,7 +6,7 @@ module StackBuilder::Chef
|
|
6
6
|
|
7
7
|
class VagrantNodeManager < StackBuilder::Chef::NodeManager
|
8
8
|
|
9
|
-
def create_vm(name, knife_config)
|
9
|
+
def create_vm(index, name, knife_config)
|
10
10
|
|
11
11
|
handle_vagrant_box_additions(name, knife_config)
|
12
12
|
|
@@ -39,12 +39,15 @@ module StackBuilder::Chef
|
|
39
39
|
|
40
40
|
@@sync ||= Mutex.new
|
41
41
|
@@sync.synchronize {
|
42
|
-
|
42
|
+
run_knife_forked(knife_cmd)
|
43
43
|
}
|
44
44
|
end
|
45
45
|
|
46
46
|
def delete_vm(name, knife_config)
|
47
47
|
|
48
|
+
puts "deleting #{name}"
|
49
|
+
exit 1
|
50
|
+
|
48
51
|
knife_cmd = Chef::Knife::VagrantServerDelete.new
|
49
52
|
knife_cmd.name_args = [ name ]
|
50
53
|
knife_cmd.config[:yes] = true
|
@@ -52,7 +55,7 @@ module StackBuilder::Chef
|
|
52
55
|
|
53
56
|
@@sync ||= Mutex.new
|
54
57
|
@@sync.synchronize {
|
55
|
-
|
58
|
+
run_knife_forked(knife_cmd)
|
56
59
|
}
|
57
60
|
|
58
61
|
handle_vagrant_box_cleanup(knife_config)
|
@@ -4,6 +4,7 @@ module StackBuilder::Common
|
|
4
4
|
|
5
5
|
class Config
|
6
6
|
|
7
|
+
QUERY_TIMEOUT = 60
|
7
8
|
CACHE_TIMEOUT = 60
|
8
9
|
|
9
10
|
class << self
|
@@ -18,6 +19,7 @@ module StackBuilder::Common
|
|
18
19
|
# Determine timeouts
|
19
20
|
config.timeouts = { } if config.timeouts.nil?
|
20
21
|
config.timeouts[:CACHE_TIMEOUT] = CACHE_TIMEOUT unless config.timeouts.has_key?(:CACHE_TIMEOUT)
|
22
|
+
config.timeouts[:QUERY_TIMEOUT] = QUERY_TIMEOUT unless config.timeouts.has_key?(:QUERY_TIMEOUT)
|
21
23
|
|
22
24
|
# Create cache folder
|
23
25
|
config.enable_caching = false if config.enable_caching.nil?
|
@@ -47,6 +47,8 @@ module StackBuilder::Common
|
|
47
47
|
previous_stderr, $stderr = $stderr, stderr
|
48
48
|
yield(job)
|
49
49
|
Marshal.dump([stdout.string, stderr.string], write)
|
50
|
+
rescue Exception => msg
|
51
|
+
Marshal.dump([stdout.string, stderr.string, msg], write)
|
50
52
|
ensure
|
51
53
|
$stdout = previous_stdout
|
52
54
|
$stderr = previous_stderr
|
@@ -369,42 +371,37 @@ module StackBuilder::Common
|
|
369
371
|
end
|
370
372
|
|
371
373
|
#
|
372
|
-
# Helper
|
374
|
+
# Helper commands to run Chef knife
|
373
375
|
#
|
374
|
-
def run_knife(knife_cmd,
|
376
|
+
def run_knife(knife_cmd, output = StringIO.new, error = StringIO.new)
|
375
377
|
|
376
378
|
knife_cmd.ui = Chef::Knife::UI.new(output, error, STDIN, knife_cmd.config) \
|
377
379
|
unless output.nil? && error.nil?
|
378
380
|
|
379
|
-
run
|
380
|
-
|
381
|
-
|
382
|
-
begin
|
383
|
-
knife_cmd.run
|
384
|
-
run = false
|
381
|
+
knife_cmd.run
|
382
|
+
output.string
|
383
|
+
end
|
385
384
|
|
386
|
-
|
385
|
+
#
|
386
|
+
# Helper to run one or more Chef knife commands as a forked jobs
|
387
|
+
#
|
388
|
+
def run_knife_forked(*knife_cmd)
|
387
389
|
|
388
|
-
|
390
|
+
logger = StackBuilder::Common::Config.logger
|
389
391
|
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
puts "* StdErr from knife run: #{error.string}"
|
394
|
-
end
|
392
|
+
job_results = run_jobs(knife_cmd, true, logger.info? || logger.debug?) do |k|
|
393
|
+
run_knife(k)
|
394
|
+
end
|
395
395
|
|
396
|
-
|
397
|
-
raise msg
|
398
|
-
end
|
396
|
+
results = knife_cmd.collect do |k|
|
399
397
|
|
400
|
-
|
398
|
+
result = job_results[k.object_id]
|
399
|
+
raise result[2] unless result[2].nil?
|
401
400
|
|
402
|
-
|
403
|
-
retries -= 1
|
404
|
-
end
|
401
|
+
result[0]
|
405
402
|
end
|
406
403
|
|
407
|
-
|
404
|
+
(results.size==1 ? results[0] : results)
|
408
405
|
end
|
409
406
|
|
410
407
|
#
|
@@ -211,29 +211,17 @@ module StackBuilder::Stack
|
|
211
211
|
|
212
212
|
threads = [ ]
|
213
213
|
|
214
|
-
scale = (@deleted ? @manager.get_scale : @scale)
|
215
214
|
if @targets.empty?
|
216
215
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
@manager.process(scale, events, self.parse_attributes(@attributes, 0))
|
221
|
-
scale -= 1
|
222
|
-
end
|
223
|
-
|
224
|
-
if @sync == "all"
|
225
|
-
scale.times do |i|
|
226
|
-
@manager.process(i, events, self.parse_attributes(@attributes, i))
|
227
|
-
end
|
228
|
-
else
|
229
|
-
scale.times do |i|
|
230
|
-
spawn_processing(i, events, threads)
|
231
|
-
end
|
232
|
-
end
|
216
|
+
scale = (@deleted ? @manager.get_scale : @scale)
|
217
|
+
scale.times do |i|
|
218
|
+
spawn_processing(i, events, threads)
|
233
219
|
end
|
234
220
|
else
|
235
221
|
@targets.each do |t|
|
236
|
-
|
222
|
+
|
223
|
+
scale = (@deleted ? t.manager.get_scale : t.scale)
|
224
|
+
scale.times do |i|
|
237
225
|
spawn_processing(i, events, threads, t)
|
238
226
|
end
|
239
227
|
end
|
@@ -284,12 +272,13 @@ module StackBuilder::Stack
|
|
284
272
|
"#{orchestrate_events.collect { |e| e } .join(", ")}") if @logger.debug?
|
285
273
|
|
286
274
|
if @sync==SYNC_ALL || (i==0 && @sync==SYNC_FIRST)
|
275
|
+
@resource_sync[i].wait if target.nil?
|
287
276
|
@manager.process(i, orchestrate_events, parse_attributes(@attributes, i), target_manager)
|
288
277
|
else
|
289
|
-
@resource_sync[i].wait if target.nil?
|
290
278
|
threads << Thread.new {
|
291
279
|
|
292
280
|
begin
|
281
|
+
@resource_sync[i].wait if target.nil?
|
293
282
|
@manager.process(i, orchestrate_events, parse_attributes(@attributes, i), target_manager)
|
294
283
|
|
295
284
|
rescue Exception => msg
|
data/lib/stackbuilder/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-stackbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mevan Samaratunga
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef
|