stack-kicker 0.0.21 → 0.0.22

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.
Files changed (3) hide show
  1. data/lib/stack-kicker/version.rb +1 -1
  2. data/lib/stack.rb +145 -129
  3. metadata +2 -2
@@ -1,5 +1,5 @@
1
1
  module Stack
2
2
  module Kicker
3
- VERSION = "0.0.21"
3
+ VERSION = "0.0.22"
4
4
  end
5
5
  end
data/lib/stack.rb CHANGED
@@ -57,9 +57,11 @@ module Stack
57
57
  end
58
58
 
59
59
  def Stack.show_stacks(stackfile = 'Stackfile')
60
- # our local config file
61
- config_raw = File.read(stackfile)
62
- eval(config_raw)
60
+ # evaluate our Stackfile, but only the once
61
+ if defined?(StackConfig::Stacks).nil?
62
+ config_raw = File.read(stackfile)
63
+ eval(config_raw)
64
+ end
63
65
 
64
66
  Logger.info { "Stacks:" }
65
67
  StackConfig::Stacks.each do |name, details|
@@ -77,14 +79,20 @@ module Stack
77
79
  end
78
80
 
79
81
  def Stack.select_stack(stackfile = 'Stackfile', stack_name)
80
- # our local config file
81
- config_raw = File.read(stackfile)
82
- eval(config_raw)
82
+ # evaluate our Stackfile, but only the once
83
+ if defined?(StackConfig::Stacks).nil?
84
+ config_raw = File.read(stackfile)
85
+ eval(config_raw)
86
+ end
83
87
 
84
88
  # if there is only one stack defined in the Stackfile, load it:
85
89
  if StackConfig::Stacks.count == 1 && stack_name.nil?
86
90
  stack_name = StackConfig::Stacks.keys[0]
87
91
  Logger.info { "Defaulting to #{stack_name} as there is a single stack defined and no stack named" }
92
+ elsif stack_name.nil?
93
+ Logger.info { "You didn't specify a stack, and there are multiple stacks defined in #{stackfile}" }
94
+ Stack.show_stacks(stackfile)
95
+ exit
88
96
  end
89
97
 
90
98
  # returns a config object, injecting the name into the returned config
@@ -135,42 +143,48 @@ module Stack
135
143
 
136
144
  # check that all the required config items are set
137
145
  def Stack.check_config(config)
138
- if config['REGION'].nil? || config['USERNAME'].nil? || config['PASSWORD'].nil? || config['AUTH_URL'].nil? || config['TENANT_NAME'].nil? &&
139
- config['REGION'].empty? || config['USERNAME'].empty? || config['PASSWORD'].empty? || config['AUTH_URL'].empty? || config['TENANT_NAME'].empty?
140
- Logger.error { "REGION, USERNAME, PASSWORD, AUTH_URL & TENANT_NAME must all be set" }
141
- exit
142
- end
143
-
144
- # load defaults for any items not configured
145
- Stack.populate_config(config)
146
+ if config[:checked].nil?
147
+ if config['REGION'].nil? || config['USERNAME'].nil? || config['PASSWORD'].nil? || config['AUTH_URL'].nil? || config['TENANT_NAME'].nil? &&
148
+ config['REGION'].empty? || config['USERNAME'].empty? || config['PASSWORD'].empty? || config['AUTH_URL'].empty? || config['TENANT_NAME'].empty?
149
+ Logger.error { "REGION, USERNAME, PASSWORD, AUTH_URL & TENANT_NAME must all be set" }
150
+ exit
151
+ end
146
152
 
147
- if config[:provisioner] == 'chef'
148
- # check that we have semi-sensible Chef setup
149
- # at a bare minimum, we need the directory where we're going to download
150
- # validation.pem to to exist
151
- dot_chef_abs = File.absolute_path(File.join(config[:stackhome], config[:dot_chef]))
152
- if !File.directory?(dot_chef_abs)
153
- Logger.warn "#{dot_chef_abs} doesn't exist"
153
+ if config[:roles].nil?
154
+ Logger.error { "No roles defined in #{config[:name]}, aborting." }
155
+ exit
154
156
  end
155
157
 
156
- # Check we have a #{dot_chef_abs}/.chef/knife.rb
157
- knife_rb_abs = dot_chef_abs + '/knife.rb'
158
- if File.exists?(knife_rb_abs)
159
- Logger.info "Found #{knife_rb_abs}, lets hope it contains something sensible"
160
- else
161
- Logger.warn "#{knife_rb_abs} doesn't exist, please run 'stack-kicker configure-knife <stack-name>'"
158
+ # load defaults for any items not configured
159
+ Stack.populate_config(config)
160
+
161
+ if config[:provisioner] == 'chef'
162
+ # check that we have semi-sensible Chef setup
163
+ # at a bare minimum, we need the directory where we're going to download
164
+ # validation.pem to to exist
165
+ dot_chef_abs = File.absolute_path(File.join(config[:stackhome], config[:dot_chef]))
166
+ if !File.directory?(dot_chef_abs)
167
+ Logger.warn "#{dot_chef_abs} doesn't exist"
168
+ end
169
+
170
+ # Check we have a #{dot_chef_abs}/.chef/knife.rb
171
+ knife_rb_abs = dot_chef_abs + '/knife.rb'
172
+ if File.exists?(knife_rb_abs)
173
+ Logger.info "Found #{knife_rb_abs}, lets hope it contains something sensible"
174
+ else
175
+ Logger.warn "#{knife_rb_abs} doesn't exist, please run 'stack-kicker configure-knife <stack-name>'"
176
+ end
162
177
  end
163
178
  end
179
+ config[:checked] = true
164
180
  end
165
181
 
166
182
  # validate that all our OpenStack creds, image_id, flavors, keys etc are valid
167
183
  def Stack.validate(config)
168
184
 
185
+ # check & populate the config with defaults for anything not specified.
169
186
  Stack.check_config(config)
170
187
 
171
- # populate the config & then walk through the AZs verifying the config
172
- Stack.populate_config(config)
173
-
174
188
  # check that the ssh-key is loaded, otherwise most post-install scripts will fail
175
189
  # this lazily assumes that the :key_pair name matches the file the keys were loaded
176
190
  # from
@@ -313,133 +327,135 @@ cookbook_path [ '<%=config[:stackhome]%>/cookbooks' ]
313
327
  # config[:role_details] contains built out role details with defaults filled in from stack defaults
314
328
  # config[:node_details] contains node details built out from role_details
315
329
 
316
- if config[:find_file_paths].nil?
317
- config[:find_file_paths] = Array.new
318
- end
330
+ if config[:populated].nil?
331
+ if config[:find_file_paths].nil?
332
+ config[:find_file_paths] = Array.new
333
+ end
319
334
 
320
- # set some sensible defaults to the stack-wide defaults if they haven't been set in the Stackfile.
321
- if config[:provisioner].nil?
322
- Logger.warn { "Defaulting to chef for config[:provisioner] "}
323
- config[:provisioner] = 'chef'
324
- end
335
+ # set some sensible defaults to the stack-wide defaults if they haven't been set in the Stackfile.
336
+ if config[:provisioner].nil?
337
+ Logger.warn { "Defaulting to chef for config[:provisioner] "}
338
+ config[:provisioner] = 'chef'
339
+ end
325
340
 
326
- if config[:dot_chef].nil?
327
- Logger.warn { "Defaulting to .chef for config[:dot_chef] "}
328
- config[:dot_chef] = '.chef'
329
- end
341
+ if config[:dot_chef].nil?
342
+ Logger.warn { "Defaulting to .chef for config[:dot_chef] "}
343
+ config[:dot_chef] = '.chef'
344
+ end
330
345
 
331
- if config[:chef_environment].nil?
332
- Logger.warn { "Defaulting to _default for config[:chef_environment]" }
333
- config[:chef_environment] = '_default'
334
- end
346
+ if config[:chef_environment].nil?
347
+ Logger.warn { "Defaulting to _default for config[:chef_environment]" }
348
+ config[:chef_environment] = '_default'
349
+ end
335
350
 
336
- if config[:chef_validation_pem].nil?
337
- Logger.warn { "Defaulting to .chef/validation.pem for config[:chef_validation_pem]" }
338
- config[:chef_validation_pem] = '.chef/validation.pem'
339
- end
340
- chef_validation_pem_abs = Stack.find_file(config, config[:chef_validation_pem])
341
- # only store the abs if we found it...
342
- config[:chef_validation_pem] = chef_validation_pem_abs unless chef_validation_pem_abs.nil?
351
+ if config[:chef_validation_pem].nil?
352
+ Logger.warn { "Defaulting to .chef/validation.pem for config[:chef_validation_pem]" }
353
+ config[:chef_validation_pem] = '.chef/validation.pem'
354
+ end
355
+ chef_validation_pem_abs = Stack.find_file(config, config[:chef_validation_pem])
356
+ # only store the abs if we found it...
357
+ config[:chef_validation_pem] = chef_validation_pem_abs unless chef_validation_pem_abs.nil?
343
358
 
344
- if config[:name_template].nil?
345
- Logger.warn { "Defaulting to '%s-%s-%s%04d' for config[:name_template]" }
346
- config[:name_template] = '%s-%s-%s%04d'
347
- end
359
+ if config[:name_template].nil?
360
+ Logger.warn { "Defaulting to '%s-%s-%s%04d' for config[:name_template]" }
361
+ config[:name_template] = '%s-%s-%s%04d'
362
+ end
348
363
 
349
- if config[:site_template].nil?
350
- Logger.warn { "Defaulting to '%s' for config[:site_template]" }
351
- config[:site_template] = '%s'
352
- end
364
+ if config[:site_template].nil?
365
+ Logger.warn { "Defaulting to '%s' for config[:site_template]" }
366
+ config[:site_template] = '%s'
367
+ end
353
368
 
354
- if config[:global_service_name].nil?
355
- Logger.error { "Defaulting to 'UNKNOWN' for config[:global_service_name]" }
356
- config[:site_template] = 'UNKNOWN'
357
- end
369
+ if config[:global_service_name].nil?
370
+ Logger.error { "Defaulting to 'UNKNOWN' for config[:global_service_name]" }
371
+ config[:site_template] = 'UNKNOWN'
372
+ end
358
373
 
359
- if config[:metadata].nil?
360
- config[:metadata] = Hash.new
361
- end
374
+ if config[:metadata].nil?
375
+ config[:metadata] = Hash.new
376
+ end
362
377
 
363
- if config[:node_details].nil?
364
- Logger.debug { "Initializing config[:node_details] and config[:azs]" }
365
- config[:node_details] = Hash.new
366
- config[:azs] = Array.new
378
+ if config[:node_details].nil?
379
+ Logger.debug { "Initializing config[:node_details] and config[:azs]" }
380
+ config[:node_details] = Hash.new
381
+ config[:azs] = Array.new
367
382
 
368
- config[:roles].each do |role,role_details|
369
- Logger.debug { "Setting defaults for #{role}" }
383
+ config[:roles].each do |role,role_details|
384
+ Logger.debug { "Setting defaults for #{role}" }
370
385
 
371
- # default to 1 node of this role if :count isn't set
372
- if role_details[:count].nil?
373
- role_details[:count] = 1
374
- end
386
+ # default to 1 node of this role if :count isn't set
387
+ if role_details[:count].nil?
388
+ role_details[:count] = 1
389
+ end
375
390
 
376
- if (role_details[:data_dir].nil?)
377
- role_details[:data_dir] = '/dummy'
378
- end
391
+ if (role_details[:data_dir].nil?)
392
+ role_details[:data_dir] = '/dummy'
393
+ end
379
394
 
380
- # Has the cloud_config_yaml been overridden?
381
- if (role_details[:cloud_config_yaml])
382
- role_details[:cloud_config_yaml] = Stack.find_file(config, role_details[:cloud_config_yaml])
383
- else
384
- role_details[:cloud_config_yaml] = Stack.find_file(config, 'cloud-config.yaml')
385
- end
395
+ # Has the cloud_config_yaml been overridden?
396
+ if (role_details[:cloud_config_yaml])
397
+ role_details[:cloud_config_yaml] = Stack.find_file(config, role_details[:cloud_config_yaml])
398
+ else
399
+ role_details[:cloud_config_yaml] = Stack.find_file(config, 'cloud-config.yaml')
400
+ end
386
401
 
387
- # Has the default bootstrap script been overridden
388
- if (role_details[:bootstrap])
389
- if (role_details[:bootstrap].empty?)
390
- Logger.debug { "role_details[:bootstrap] is empty, ignoring" }
402
+ # Has the default bootstrap script been overridden
403
+ if (role_details[:bootstrap])
404
+ if (role_details[:bootstrap].empty?)
405
+ Logger.debug { "role_details[:bootstrap] is empty, ignoring" }
406
+ else
407
+ role_details[:bootstrap] = Stack.find_file(config, role_details[:bootstrap])
408
+ end
391
409
  else
392
- role_details[:bootstrap] = Stack.find_file(config, role_details[:bootstrap])
410
+ role_details[:bootstrap] = Stack.find_file(config, 'chef-client-bootstrap-excl-validation-pem.sh')
393
411
  end
394
- else
395
- role_details[:bootstrap] = Stack.find_file(config, 'chef-client-bootstrap-excl-validation-pem.sh')
396
- end
397
412
 
398
- # we default to the role name for the security group unless explicitly set
399
- if role_details[:security_group].nil?
400
- role_details[:security_group] = role.to_s
401
- end
413
+ # we default to the role name for the security group unless explicitly set
414
+ if role_details[:security_group].nil?
415
+ role_details[:security_group] = role.to_s
416
+ end
402
417
 
403
- # default to execing post install scripts in stackhome is a cwd wasn't set
404
- # (cwd is calculated relative to stackhome)
405
- if role_details[:post_install_cwd].nil?
406
- role_details[:post_install_cwd] = '/.'
407
- end
418
+ # default to execing post install scripts in stackhome is a cwd wasn't set
419
+ # (cwd is calculated relative to stackhome)
420
+ if role_details[:post_install_cwd].nil?
421
+ role_details[:post_install_cwd] = '/.'
422
+ end
408
423
 
409
- if role_details[:post_install_args].nil?
410
- role_details[:post_install_args] = ''
411
- end
424
+ if role_details[:post_install_args].nil?
425
+ role_details[:post_install_args] = ''
426
+ end
412
427
 
413
- (1..role_details[:count]).each do |p|
414
- Logger.debug { "Populating the config[:role_details][:azs] array with AZ" }
415
- role_details[:azs] = Array.new if role_details[:azs].nil?
428
+ (1..role_details[:count]).each do |p|
429
+ Logger.debug { "Populating the config[:role_details][:azs] array with AZ" }
430
+ role_details[:azs] = Array.new if role_details[:azs].nil?
416
431
 
417
- # is there an az set for this node?
418
- if role_details[:azs][p-1].nil?
419
- # inherit the global az
420
- Logger.debug { "Inheriting the AZ for #{role} (#{config['REGION']})" }
421
- role_details[:azs][p-1] = config['REGION']
422
- end
432
+ # is there an az set for this node?
433
+ if role_details[:azs][p-1].nil?
434
+ # inherit the global az
435
+ Logger.debug { "Inheriting the AZ for #{role} (#{config['REGION']})" }
436
+ role_details[:azs][p-1] = config['REGION']
437
+ end
423
438
 
424
- # add this AZ to the AZ list, we'll dedupe later
425
- config[:azs] << role_details[:azs][p-1]
439
+ # add this AZ to the AZ list, we'll dedupe later
440
+ config[:azs] << role_details[:azs][p-1]
426
441
 
427
- hostname = Stack.generate_hostname(config, role, p)
428
- Logger.debug { "Setting node_details for #{hostname}, using element #{p}-1 from #{role_details[:azs]}" }
429
- config[:node_details][hostname] = { :az => role_details[:azs][p-1], :region => role_details[:azs][p-1], :role => role }
442
+ hostname = Stack.generate_hostname(config, role, p)
443
+ Logger.debug { "Setting node_details for #{hostname}, using element #{p}-1 from #{role_details[:azs]}" }
444
+ config[:node_details][hostname] = { :az => role_details[:azs][p-1], :region => role_details[:azs][p-1], :role => role }
445
+ end
430
446
  end
431
447
  end
432
- end
433
- config[:azs].uniq!
448
+ config[:azs].uniq!
434
449
 
435
- # if set the region specific settings from the global settings if not already specified
436
- config[:azs].each do |az|
437
- # we store region spefic stuff in hash
438
- config[az] = Hash.new if config[az].nil?
450
+ # if set the region specific settings from the global settings if not already specified
451
+ config[:azs].each do |az|
452
+ # we store region spefic stuff in hash
453
+ config[az] = Hash.new if config[az].nil?
439
454
 
440
- config[az]['image_id'] = config['image_id'] if config[az]['image_id'].nil?
455
+ config[az]['image_id'] = config['image_id'] if config[az]['image_id'].nil?
456
+ end
441
457
  end
442
-
458
+ config[:populated] = true
443
459
  config[:node_details]
444
460
  end
445
461
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stack-kicker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.21
4
+ version: 0.0.22
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-18 00:00:00.000000000 Z
12
+ date: 2013-06-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rdoc