ec2launcher 1.0.32 → 1.0.33
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/lib/ec2launcher.rb +6 -187
- data/lib/ec2launcher/application_processor.rb +81 -0
- data/lib/ec2launcher/directory_processing.rb +63 -0
- data/lib/ec2launcher/environment_processor.rb +93 -0
- data/lib/ec2launcher/version.rb +1 -1
- data/startup-scripts/setup_instance.rb +10 -1
- metadata +5 -2
data/CHANGELOG.md
CHANGED
data/lib/ec2launcher.rb
CHANGED
@@ -19,6 +19,8 @@ require 'ec2launcher/instance_paths_config'
|
|
19
19
|
require 'ec2launcher/block_device_builder'
|
20
20
|
require 'ec2launcher/hostname_generator'
|
21
21
|
|
22
|
+
require 'ec2launcher/config_wrapper'
|
23
|
+
|
22
24
|
include Log4r
|
23
25
|
|
24
26
|
module EC2Launcher
|
@@ -57,54 +59,11 @@ module EC2Launcher
|
|
57
59
|
end
|
58
60
|
|
59
61
|
# Load configuration data
|
60
|
-
|
61
|
-
|
62
|
-
environments_directories = process_directory_list(@config.environments, "environments", "Environments", false)
|
63
|
-
applications_directories = process_directory_list(@config.applications, "applications", "Applications", true)
|
64
|
-
|
65
|
-
# Load other environments
|
66
|
-
@environments = { }
|
67
|
-
environments_directories.each do |env_dir|
|
68
|
-
Dir.entries(env_dir).each do |env_name|
|
69
|
-
filename = File.join(env_dir, env_name)
|
70
|
-
next if File.directory?(filename)
|
62
|
+
config_wrapper = ConfigWrapper.new(@options.directory)
|
71
63
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
@environments[new_env.name] = new_env
|
76
|
-
new_env.aliases.each {|env_alias| @environments[env_alias] = new_env }
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
# Load applications
|
81
|
-
@applications = {}
|
82
|
-
applications_directories.each do |app_dir|
|
83
|
-
Dir.entries(app_dir).each do |application_name|
|
84
|
-
filename = File.join(app_dir, application_name)
|
85
|
-
next if File.directory?(filename)
|
86
|
-
|
87
|
-
apps = EC2Launcher::DSL::ApplicationDSL.execute(File.read(filename)).applications
|
88
|
-
apps.each do |new_application|
|
89
|
-
@applications[new_application.name] = new_application
|
90
|
-
validate_application(filename, new_application)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
# Process inheritance rules for environments
|
96
|
-
@environments.values.each do |env|
|
97
|
-
new_env = process_environment_inheritance(env)
|
98
|
-
@environments[new_env.name] = new_env
|
99
|
-
end
|
100
|
-
|
101
|
-
# Process inheritance rules for applications
|
102
|
-
@applications.values.each do |app|
|
103
|
-
next if app.inherit.nil?
|
104
|
-
|
105
|
-
new_app = process_application_inheritance(app)
|
106
|
-
@applications[new_app.name] = new_app
|
107
|
-
end
|
64
|
+
@config = config_wrapper.config
|
65
|
+
@environments = config_wrapper.environments
|
66
|
+
@applications = config_wrapper.applications
|
108
67
|
|
109
68
|
if @options.list
|
110
69
|
puts ""
|
@@ -452,23 +411,6 @@ module EC2Launcher
|
|
452
411
|
end
|
453
412
|
end
|
454
413
|
|
455
|
-
# Given a list of possible directories, build a list of directories that actually exist.
|
456
|
-
#
|
457
|
-
# @param [Array<String>] directories list of possible directories
|
458
|
-
# @return [Array<String>] directories that exist or an empty array if none of the directories exist.
|
459
|
-
#
|
460
|
-
def build_list_of_valid_directories(directories)
|
461
|
-
dirs = []
|
462
|
-
unless directories.nil?
|
463
|
-
if directories.kind_of? Array
|
464
|
-
directories.each {|d| dirs << d if File.directory?(d) }
|
465
|
-
else
|
466
|
-
dirs << directories if File.directory?(directories)
|
467
|
-
end
|
468
|
-
end
|
469
|
-
dirs
|
470
|
-
end
|
471
|
-
|
472
414
|
# Searches for the most recent AMI matching the criteria.
|
473
415
|
#
|
474
416
|
# @param [String] arch system archicture, `i386` or `x86_64`
|
@@ -640,103 +582,6 @@ module EC2Launcher
|
|
640
582
|
new_instance
|
641
583
|
end
|
642
584
|
|
643
|
-
# Read in the configuration file stored in the workspace directory.
|
644
|
-
# By default this will be './config.rb'.
|
645
|
-
#
|
646
|
-
# @return [EC2Launcher::Config] the parsed configuration object
|
647
|
-
def load_config_file()
|
648
|
-
# Load configuration file
|
649
|
-
config_filename = File.join(@options.directory, "config.rb")
|
650
|
-
abort("Unable to find 'config.rb' in '#{@options.directory}'") unless File.exists?(config_filename)
|
651
|
-
EC2Launcher::DSL::ConfigDSL.execute(File.read(config_filename)).config
|
652
|
-
end
|
653
|
-
|
654
|
-
# Load and parse an environment file
|
655
|
-
#
|
656
|
-
# @param [String] name full pathname of the environment file to load
|
657
|
-
# @param [EC2Launcher::Environment, nil] default_environment the default environment,
|
658
|
-
# which will be used as the base for the new environment. Optional.
|
659
|
-
# @param [Boolean] fail_on_missing print an error and exit if the file does not exist.
|
660
|
-
#
|
661
|
-
# @return [EC2Launcher::Environment] the new environment loaded from the specified file.
|
662
|
-
#
|
663
|
-
def load_environment_file(name, fail_on_missing = false)
|
664
|
-
unless File.exists?(name)
|
665
|
-
abort("Unable to read environment: #{name}") if fail_on_missing
|
666
|
-
return nil
|
667
|
-
end
|
668
|
-
|
669
|
-
load_env = EC2Launcher::DSL::Environment.new
|
670
|
-
load_env.load(File.read(name))
|
671
|
-
load_env
|
672
|
-
end
|
673
|
-
|
674
|
-
# Attempts to build a list of valid directories.
|
675
|
-
#
|
676
|
-
# @param [Array<String>, nil] target_directories list of possible directories
|
677
|
-
# @param [String] default_directory directory to use if the target_directories list is empty or nil
|
678
|
-
# @param [String] name name of the type of directory. Used only for error messages.
|
679
|
-
# @param [Boolean] fail_on_error exit with an error if the list of valid directories is empty
|
680
|
-
#
|
681
|
-
# @return [Array<String] list of directories that exist
|
682
|
-
#
|
683
|
-
def process_directory_list(target_directories, default_directory, name, fail_on_error = false)
|
684
|
-
dirs = []
|
685
|
-
if target_directories.nil?
|
686
|
-
dirs << File.join(@options.directory, default_directory)
|
687
|
-
else
|
688
|
-
target_directories.each {|d| dirs << File.join(@options.directory, d) }
|
689
|
-
end
|
690
|
-
valid_directories = build_list_of_valid_directories(dirs)
|
691
|
-
|
692
|
-
if valid_directories.empty?
|
693
|
-
temp_dirs = dirs.each {|d| "'#{d}'"}.join(", ")
|
694
|
-
if fail_on_error
|
695
|
-
abort("ERROR - #{name} directories not found: #{temp_dirs}")
|
696
|
-
else
|
697
|
-
@log.warn "WARNING - #{name} directories not found: #{temp_dirs}"
|
698
|
-
end
|
699
|
-
end
|
700
|
-
|
701
|
-
valid_directories
|
702
|
-
end
|
703
|
-
|
704
|
-
def process_application_inheritance(app)
|
705
|
-
return app if app.inherit.nil?
|
706
|
-
|
707
|
-
# Find base application
|
708
|
-
base_app = @applications[app.inherit]
|
709
|
-
abort("Invalid inheritance '#{app.inherit}' in #{app.name}") if base_app.nil?
|
710
|
-
|
711
|
-
new_app = nil
|
712
|
-
if base_app.inherit.nil?
|
713
|
-
# Clone base application
|
714
|
-
new_app = Marshal::load(Marshal.dump(base_app))
|
715
|
-
else
|
716
|
-
new_app = process_application_inheritance(base_app)
|
717
|
-
end
|
718
|
-
new_app.merge(app)
|
719
|
-
new_app
|
720
|
-
end
|
721
|
-
|
722
|
-
def process_environment_inheritance(env)
|
723
|
-
return env if env.inherit.nil?
|
724
|
-
|
725
|
-
# Find base environment
|
726
|
-
base_env = @environments[env.inherit]
|
727
|
-
abort("Invalid inheritance '#{env.inherit}' in #{env.name}") if base_env.nil?
|
728
|
-
|
729
|
-
new_env = nil
|
730
|
-
if base_env.inherit.nil?
|
731
|
-
# Clone base environment
|
732
|
-
new_env = Marshal::load(Marshal.dump(base_env))
|
733
|
-
else
|
734
|
-
new_env = process_environment_inheritance(base_env)
|
735
|
-
end
|
736
|
-
new_env.merge(env)
|
737
|
-
new_env
|
738
|
-
end
|
739
|
-
|
740
585
|
# Given a string containing a command to run, replaces any inline variables.
|
741
586
|
# Supported variables include:
|
742
587
|
# * @APPLICATION@ - name of the application
|
@@ -764,32 +609,6 @@ module EC2Launcher
|
|
764
609
|
cmd
|
765
610
|
end
|
766
611
|
|
767
|
-
# Validates all settings in an application file
|
768
|
-
#
|
769
|
-
# @param [String] filename name of the application file
|
770
|
-
# @param [EC2Launcher::DSL::Application] application application object to validate
|
771
|
-
#
|
772
|
-
def validate_application(filename, application)
|
773
|
-
unless application.availability_zone.nil? || AVAILABILITY_ZONES.include?(application.availability_zone)
|
774
|
-
abort("Invalid availability zone '#{application.availability_zone}' in application '#{application.name}' (#{filename})")
|
775
|
-
end
|
776
|
-
|
777
|
-
unless application.instance_type.nil? || INSTANCE_TYPES.include?(application.instance_type)
|
778
|
-
abort("Invalid instance type '#{application.instance_type}' in application '#{application.name}' (#{filename})")
|
779
|
-
end
|
780
|
-
end
|
781
|
-
|
782
|
-
# Validates all settings in an environment file
|
783
|
-
#
|
784
|
-
# @param [String] filename name of the environment file
|
785
|
-
# @param [EC2Launcher::DSL::Environment] environment environment object to validate
|
786
|
-
#
|
787
|
-
def validate_environment(filename, environment)
|
788
|
-
unless environment.availability_zone.nil? || AVAILABILITY_ZONES.include?(environment.availability_zone)
|
789
|
-
abort("Invalid availability zone '#{environment.availability_zone}' in environment '#{environment.name}' (#{filename})")
|
790
|
-
end
|
791
|
-
end
|
792
|
-
|
793
612
|
# Builds the launch scripts that should run on the new instance.
|
794
613
|
#
|
795
614
|
# @param [String] fqdn Fully qualified hostname
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012 Sean Laurent
|
3
|
+
#
|
4
|
+
require 'rubygems'
|
5
|
+
require 'log4r'
|
6
|
+
|
7
|
+
require 'ec2launcher/directory_processing'
|
8
|
+
require 'ec2launcher/dsl/application'
|
9
|
+
require 'ec2launcher/dsl/environment'
|
10
|
+
|
11
|
+
include Log4r
|
12
|
+
|
13
|
+
module EC2Launcher
|
14
|
+
class ApplicationProcessor
|
15
|
+
attr_accessor :applications
|
16
|
+
|
17
|
+
include DirectoryProcessing
|
18
|
+
|
19
|
+
def initialize(base_directory, applications_directories)
|
20
|
+
app_dirs = process_directory_list(base_directory, applications_directories, "applications", "Applications", true)
|
21
|
+
|
22
|
+
# Load applications
|
23
|
+
@applications = {}
|
24
|
+
app_dirs.each do |app_dir|
|
25
|
+
Dir.entries(app_dir).each do |application_name|
|
26
|
+
filename = File.join(app_dir, application_name)
|
27
|
+
next if File.directory?(filename)
|
28
|
+
|
29
|
+
apps = EC2Launcher::DSL::ApplicationDSL.execute(File.read(filename)).applications
|
30
|
+
apps.each do |new_application|
|
31
|
+
@applications[new_application.name] = new_application
|
32
|
+
validate_application(filename, new_application)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Process inheritance rules for applications
|
38
|
+
@applications.values.each do |app|
|
39
|
+
next if app.inherit.nil?
|
40
|
+
|
41
|
+
new_app = process_application_inheritance(app)
|
42
|
+
@applications[new_app.name] = new_app
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def process_application_inheritance(app)
|
49
|
+
return app if app.inherit.nil?
|
50
|
+
|
51
|
+
# Find base application
|
52
|
+
base_app = @applications[app.inherit]
|
53
|
+
abort("Invalid inheritance '#{app.inherit}' in #{app.name}") if base_app.nil?
|
54
|
+
|
55
|
+
new_app = nil
|
56
|
+
if base_app.inherit.nil?
|
57
|
+
# Clone base application
|
58
|
+
new_app = Marshal::load(Marshal.dump(base_app))
|
59
|
+
else
|
60
|
+
new_app = process_application_inheritance(base_app)
|
61
|
+
end
|
62
|
+
new_app.merge(app)
|
63
|
+
new_app
|
64
|
+
end
|
65
|
+
|
66
|
+
# Validates all settings in an application file
|
67
|
+
#
|
68
|
+
# @param [String] filename name of the application file
|
69
|
+
# @param [EC2Launcher::DSL::Application] application application object to validate
|
70
|
+
#
|
71
|
+
def validate_application(filename, application)
|
72
|
+
unless application.availability_zone.nil? || AVAILABILITY_ZONES.include?(application.availability_zone)
|
73
|
+
abort("Invalid availability zone '#{application.availability_zone}' in application '#{application.name}' (#{filename})")
|
74
|
+
end
|
75
|
+
|
76
|
+
unless application.instance_type.nil? || INSTANCE_TYPES.include?(application.instance_type)
|
77
|
+
abort("Invalid instance type '#{application.instance_type}' in application '#{application.name}' (#{filename})")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012 Sean Laurent
|
3
|
+
#
|
4
|
+
require 'rubygems'
|
5
|
+
require 'log4r'
|
6
|
+
|
7
|
+
include Log4r
|
8
|
+
|
9
|
+
module EC2Launcher
|
10
|
+
module DirectoryProcessing
|
11
|
+
# Attempts to build a list of valid directories.
|
12
|
+
#
|
13
|
+
# @param [Array<String>, nil] target_directories list of possible directories
|
14
|
+
# @param [String] default_directory directory to use if the target_directories list is empty or nil
|
15
|
+
# @param [String] name name of the type of directory. Used only for error messages.
|
16
|
+
# @param [Boolean] fail_on_error exit with an error if the list of valid directories is empty
|
17
|
+
#
|
18
|
+
# @return [Array<String] list of directories that exist
|
19
|
+
#
|
20
|
+
def process_directory_list(base_directory, target_directories, default_directory, name, fail_on_error = false)
|
21
|
+
log = Logger['ec2launcher']
|
22
|
+
dirs = []
|
23
|
+
if target_directories.nil?
|
24
|
+
dirs << File.join(base_directory, default_directory)
|
25
|
+
else
|
26
|
+
target_directories.each do |d|
|
27
|
+
dirs << File.join(base_directory, d)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
valid_directories = build_list_of_valid_directories(dirs)
|
31
|
+
|
32
|
+
if valid_directories.empty?
|
33
|
+
temp_dirs = dirs.each {|d| "'#{d}'"}.join(", ")
|
34
|
+
if fail_on_error
|
35
|
+
abort("ERROR - #{name} directories not found: #{temp_dirs}")
|
36
|
+
else
|
37
|
+
log.warn "WARNING - #{name} directories not found: #{temp_dirs}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
valid_directories
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
# Given a list of possible directories, build a list of directories that actually exist.
|
47
|
+
#
|
48
|
+
# @param [Array<String>] directories list of possible directories
|
49
|
+
# @return [Array<String>] directories that exist or an empty array if none of the directories exist.
|
50
|
+
#
|
51
|
+
def build_list_of_valid_directories(directories)
|
52
|
+
dirs = []
|
53
|
+
unless directories.nil?
|
54
|
+
if directories.kind_of? Array
|
55
|
+
directories.each {|d| dirs << d if File.directory?(d) }
|
56
|
+
else
|
57
|
+
dirs << directories if File.directory?(directories)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
dirs
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012 Sean Laurent
|
3
|
+
#
|
4
|
+
require 'rubygems'
|
5
|
+
require 'log4r'
|
6
|
+
|
7
|
+
require 'ec2launcher/directory_processing'
|
8
|
+
|
9
|
+
include Log4r
|
10
|
+
|
11
|
+
module EC2Launcher
|
12
|
+
class EnvironmentProcessor
|
13
|
+
attr_accessor :environments
|
14
|
+
|
15
|
+
include DirectoryProcessing
|
16
|
+
|
17
|
+
def initialize(base_directory, environments_directories)
|
18
|
+
env_dirs = process_directory_list(base_directory, environments_directories, "environments", "Environments", false)
|
19
|
+
|
20
|
+
# Load other environments
|
21
|
+
@environments = { }
|
22
|
+
env_dirs.each do |env_dir|
|
23
|
+
Dir.entries(env_dir).each do |env_name|
|
24
|
+
filename = File.join(env_dir, env_name)
|
25
|
+
next if File.directory?(filename)
|
26
|
+
|
27
|
+
new_env = load_environment_file(filename)
|
28
|
+
validate_environment(filename, new_env)
|
29
|
+
|
30
|
+
@environments[new_env.name] = new_env
|
31
|
+
new_env.aliases.each {|env_alias| @environments[env_alias] = new_env }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Process inheritance rules for environments
|
36
|
+
@environments.values.each do |env|
|
37
|
+
new_env = process_environment_inheritance(env)
|
38
|
+
@environments[new_env.name] = new_env
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# Load and parse an environment file
|
45
|
+
#
|
46
|
+
# @param [String] name full pathname of the environment file to load
|
47
|
+
# @param [EC2Launcher::Environment, nil] default_environment the default environment,
|
48
|
+
# which will be used as the base for the new environment. Optional.
|
49
|
+
# @param [Boolean] fail_on_missing print an error and exit if the file does not exist.
|
50
|
+
#
|
51
|
+
# @return [EC2Launcher::Environment] the new environment loaded from the specified file.
|
52
|
+
#
|
53
|
+
def load_environment_file(name, fail_on_missing = false)
|
54
|
+
unless File.exists?(name)
|
55
|
+
abort("Unable to read environment: #{name}") if fail_on_missing
|
56
|
+
return nil
|
57
|
+
end
|
58
|
+
|
59
|
+
load_env = EC2Launcher::DSL::Environment.new
|
60
|
+
load_env.load(File.read(name))
|
61
|
+
load_env
|
62
|
+
end
|
63
|
+
|
64
|
+
def process_environment_inheritance(env)
|
65
|
+
return env if env.inherit.nil?
|
66
|
+
|
67
|
+
# Find base environment
|
68
|
+
base_env = @environments[env.inherit]
|
69
|
+
abort("Invalid inheritance '#{env.inherit}' in #{env.name}") if base_env.nil?
|
70
|
+
|
71
|
+
new_env = nil
|
72
|
+
if base_env.inherit.nil?
|
73
|
+
# Clone base environment
|
74
|
+
new_env = Marshal::load(Marshal.dump(base_env))
|
75
|
+
else
|
76
|
+
new_env = process_environment_inheritance(base_env)
|
77
|
+
end
|
78
|
+
new_env.merge(env)
|
79
|
+
new_env
|
80
|
+
end
|
81
|
+
|
82
|
+
# Validates all settings in an environment file
|
83
|
+
#
|
84
|
+
# @param [String] filename name of the environment file
|
85
|
+
# @param [EC2Launcher::DSL::Environment] environment environment object to validate
|
86
|
+
#
|
87
|
+
def validate_environment(filename, environment)
|
88
|
+
unless environment.availability_zone.nil? || AVAILABILITY_ZONES.include?(environment.availability_zone)
|
89
|
+
abort("Invalid availability zone '#{environment.availability_zone}' in environment '#{environment.name}' (#{filename})")
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
data/lib/ec2launcher/version.rb
CHANGED
@@ -377,7 +377,16 @@ def run_chef_client(chef_path)
|
|
377
377
|
end
|
378
378
|
|
379
379
|
result = run_chef_client(chef_path)
|
380
|
-
|
380
|
+
unless result == 0
|
381
|
+
puts "***** ERROR running chef-client. Relaunching chef-client in 30 seconds."
|
382
|
+
sleep(30)
|
383
|
+
result = run_chef_client(chef_path)
|
384
|
+
end
|
385
|
+
unless result == 0
|
386
|
+
puts "***** ERROR running chef-client. Relaunching chef-client in 30 seconds."
|
387
|
+
sleep(30)
|
388
|
+
result = run_chef_client(chef_path)
|
389
|
+
end
|
381
390
|
|
382
391
|
##############################
|
383
392
|
# EMAIL NOTIFICATION
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ec2launcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.33
|
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: 2012-08-
|
12
|
+
date: 2012-08-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|
@@ -60,15 +60,18 @@ files:
|
|
60
60
|
- bin/ec2launcher
|
61
61
|
- ec2launcher.gemspec
|
62
62
|
- lib/ec2launcher.rb
|
63
|
+
- lib/ec2launcher/application_processor.rb
|
63
64
|
- lib/ec2launcher/backoff_runner.rb
|
64
65
|
- lib/ec2launcher/block_device_builder.rb
|
65
66
|
- lib/ec2launcher/defaults.rb
|
67
|
+
- lib/ec2launcher/directory_processing.rb
|
66
68
|
- lib/ec2launcher/dsl/application.rb
|
67
69
|
- lib/ec2launcher/dsl/block_device.rb
|
68
70
|
- lib/ec2launcher/dsl/config.rb
|
69
71
|
- lib/ec2launcher/dsl/email_notification.rb
|
70
72
|
- lib/ec2launcher/dsl/environment.rb
|
71
73
|
- lib/ec2launcher/dsl/helper.rb
|
74
|
+
- lib/ec2launcher/environment_processor.rb
|
72
75
|
- lib/ec2launcher/hostname_generator.rb
|
73
76
|
- lib/ec2launcher/init_options.rb
|
74
77
|
- lib/ec2launcher/instance_paths_config.rb
|