ec2launcher 1.6.15 → 1.7.0
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 +8 -8
- data/CHANGELOG.md +9 -0
- data/Gemfile.lock +28 -0
- data/Rakefile +11 -2
- data/lib/ec2launcher/block_device_builder.rb +6 -4
- data/lib/ec2launcher/dynamic_hostname_generator.rb +56 -0
- data/lib/ec2launcher/hostname_generator.rb +30 -20
- data/lib/ec2launcher/hostnames/host_name_generation.rb +42 -0
- data/lib/ec2launcher/init_options.rb +10 -0
- data/lib/ec2launcher/route53.rb +6 -0
- data/lib/ec2launcher/version.rb +1 -1
- data/lib/ec2launcher.rb +98 -50
- data/startup-scripts/setup.rb +23 -15
- data/startup-scripts/setup_instance.rb +66 -5
- data/test/spec/dynamic_hostname_generator_spec.rb +29 -0
- data/test/spec/hostnames/host_name_generation_spec.rb +42 -0
- data/test/test_helper.rb +0 -1
- data/test/unit/block_device_builder.rb +102 -0
- data/test/{ec2launcher → unit}/dsl/config_parser_test.rb +1 -0
- data/test/unit/route53_test.rb +184 -0
- metadata +25 -19
- data/.gitignore +0 -17
- data/bin/ec2launcher +0 -38
- data/ec2launcher.gemspec +0 -24
- data/yard_extensions/dsl_attribute_handler.rb +0 -14
data/startup-scripts/setup.rb
CHANGED
@@ -9,6 +9,8 @@ require 'json'
|
|
9
9
|
|
10
10
|
require 'ec2launcher'
|
11
11
|
|
12
|
+
require 'aws-sdk'
|
13
|
+
|
12
14
|
SETUP_SCRIPT = "setup_instance.rb"
|
13
15
|
|
14
16
|
class InitOptions
|
@@ -78,23 +80,40 @@ end
|
|
78
80
|
option_parser = InitOptions.new
|
79
81
|
options = option_parser.parse(ARGV)
|
80
82
|
|
83
|
+
if ARGV.length < 1
|
84
|
+
option_parser.help
|
85
|
+
abort
|
86
|
+
end
|
87
|
+
|
81
88
|
setup_json_filename = ARGV[0]
|
82
89
|
|
90
|
+
begin
|
91
|
+
logger = Log4r::Logger['ec2launcher']
|
92
|
+
unless logger
|
93
|
+
logger = Log4r::Logger.new 'ec2launcher'
|
94
|
+
log_output = Log4r::Outputter.stdout
|
95
|
+
log_output.formatter = PatternFormatter.new :pattern => "%m"
|
96
|
+
logger.outputters = log_output
|
97
|
+
end
|
98
|
+
rescue
|
99
|
+
end
|
100
|
+
|
83
101
|
# Read the setup JSON file
|
84
102
|
instance_data = JSON.parse(File.read(setup_json_filename))
|
85
103
|
|
86
104
|
# Path to executables
|
87
105
|
gem_path = instance_data["gem_path"]
|
88
106
|
ruby_path = instance_data["ruby_path"]
|
89
|
-
chef_path = instance_data["chef_path"]
|
90
107
|
|
91
108
|
# Pre-install gems
|
92
109
|
unless instance_data["gems"].nil?
|
110
|
+
puts "Preinstalling gems..."
|
93
111
|
instance_data["gems"].each {|gem_name| puts `#{gem_path} install --no-rdoc --no-ri #{gem_name}` }
|
94
112
|
end
|
95
113
|
|
96
114
|
# Pre-install packages
|
97
115
|
unless instance_data["packages"].nil?
|
116
|
+
puts "Preinstalling packages..."
|
98
117
|
puts `yum install #{instance_data["packages"].join(" ")} -y`
|
99
118
|
end
|
100
119
|
|
@@ -138,22 +157,11 @@ end
|
|
138
157
|
puts "Retrieving Chef validation.pem ..."
|
139
158
|
puts `s3curl.pl --id startup #{instance_data['chef_validation_pem_url']} > /etc/chef/validation.pem`
|
140
159
|
|
141
|
-
# Setting hostname
|
142
|
-
puts "Setting hostname ... #{options.hostname}"
|
143
|
-
`hostname #{options.hostname}`
|
144
|
-
`sed -i 's/^HOSTNAME=.*$/HOSTNAME=#{options.hostname}/' /etc/sysconfig/network`
|
145
|
-
|
146
|
-
# Set Chef node name
|
147
|
-
File.open("/etc/chef/client.rb", 'a') { |f| f.write("node_name \"#{options.hostname}\"") }
|
148
|
-
|
149
|
-
# Setup Chef client
|
150
|
-
puts "Connecting to Chef ..."
|
151
|
-
`rm -f /etc/chef/client.pem`
|
152
|
-
puts `#{chef_path}`
|
153
|
-
|
154
160
|
# Retrieve secondary setup script and run it
|
155
161
|
puts "Launching role setup script ..."
|
156
|
-
command = "#{ruby_path} /tmp/#{SETUP_SCRIPT} -a #{options.application} -e #{options.environ}
|
162
|
+
command = "#{ruby_path} /tmp/#{SETUP_SCRIPT} -a #{options.application} -e #{options.environ} "
|
163
|
+
command += " -h #{options.hostname} " if options.hostname
|
164
|
+
command += "#{setup_json_filename}"
|
157
165
|
command += " -c #{options.clone_host}" unless options.clone_host.nil?
|
158
166
|
command += " 2>&1 > /var/log/cloud-init.log"
|
159
167
|
run_command(command)
|
@@ -11,6 +11,7 @@ require 'json'
|
|
11
11
|
require 'aws-sdk'
|
12
12
|
|
13
13
|
require 'ec2launcher'
|
14
|
+
require 'ec2launcher/dynamic_hostname_generator'
|
14
15
|
|
15
16
|
AWS_KEYS = "/etc/aws/startup_runner_keys"
|
16
17
|
|
@@ -77,6 +78,17 @@ class InstanceSetup
|
|
77
78
|
option_parser = InitOptions.new
|
78
79
|
@options = option_parser.parse(args)
|
79
80
|
|
81
|
+
begin
|
82
|
+
@logger = Log4r::Logger['ec2launcher']
|
83
|
+
unless @logger
|
84
|
+
@logger = Log4r::Logger.new 'ec2launcher'
|
85
|
+
log_output = Log4r::Outputter.stdout
|
86
|
+
log_output.formatter = PatternFormatter.new :pattern => "%m"
|
87
|
+
@logger.outputters = log_output
|
88
|
+
end
|
89
|
+
rescue
|
90
|
+
end
|
91
|
+
|
80
92
|
@setup_json_filename = args[0]
|
81
93
|
|
82
94
|
# Load the AWS access keys
|
@@ -111,6 +123,55 @@ class InstanceSetup
|
|
111
123
|
parser = JSON::Parser.new(File.read(@setup_json_filename), { :create_additions => true })
|
112
124
|
instance_data = parser.parse()
|
113
125
|
|
126
|
+
##############################
|
127
|
+
# EXECUTABLES
|
128
|
+
##############################
|
129
|
+
chef_path = instance_data["chef_path"]
|
130
|
+
|
131
|
+
##############################
|
132
|
+
# HOST NAME
|
133
|
+
##############################
|
134
|
+
@hostname = @options.hostname
|
135
|
+
if instance_data["dynamic_name"]
|
136
|
+
puts "Calculating dynamic host name..."
|
137
|
+
hostname_generator = EC2Launcher::DynamicHostnameGenerator.new(instance_data["dynamic_name_prefix"], instance_data["dynamic_name_suffix"])
|
138
|
+
short_hostname = hostname_generator.generate_dynamic_hostname(@INSTANCE_ID)
|
139
|
+
@hostname = hostname_generator.generate_fqdn(short_hostname, instance_data["domain_name"])
|
140
|
+
|
141
|
+
instance_data["short_hostname"] = short_hostname
|
142
|
+
instance_data["hostname"] = @hostname
|
143
|
+
|
144
|
+
# Route53
|
145
|
+
if instance_data["route53_zone_id"]
|
146
|
+
puts "Adding host to Route53..."
|
147
|
+
|
148
|
+
# Find the local ip address
|
149
|
+
local_mac_address = `curl http://169.254.169.254/latest/meta-data/mac`.strip
|
150
|
+
local_ip_addresses = `curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/#{local_mac_address}/local-ipv4s`.strip
|
151
|
+
local_ip_address = local_ip_addresses.split[0]
|
152
|
+
|
153
|
+
# Add record to Route53.
|
154
|
+
# Note that we use the FQDN because that is what the AWS SDK requires, even though the Web Console only
|
155
|
+
# uses the short name.
|
156
|
+
aws_route53 = AWS::Route53.new
|
157
|
+
route53 = EC2Launcher::Route53.new(aws_route53, instance_data["route53_zone_id"], @logger)
|
158
|
+
route53_zone = aws_route53.client.get_hosted_zone({:id => instance_data["route53_zone_id"]})
|
159
|
+
route53.create_record(@hostname, local_ip_address)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
puts "Setting hostname ... #{@hostname}"
|
164
|
+
`hostname #{@hostname}`
|
165
|
+
`sed -i 's/^HOSTNAME=.*$/HOSTNAME=#{@hostname}/' /etc/sysconfig/network`
|
166
|
+
|
167
|
+
# Set Chef node name
|
168
|
+
File.open("/etc/chef/client.rb", 'a') { |f| f.write("node_name \"#{@hostname}\"") }
|
169
|
+
|
170
|
+
# Setup Chef client
|
171
|
+
puts "Connecting to Chef ..."
|
172
|
+
`rm -f /etc/chef/client.pem`
|
173
|
+
puts `#{chef_path}`
|
174
|
+
|
114
175
|
##############################
|
115
176
|
# EBS VOLUMES
|
116
177
|
##############################
|
@@ -172,7 +233,7 @@ class InstanceSetup
|
|
172
233
|
knife_config = <<EOF
|
173
234
|
log_level :info
|
174
235
|
log_location STDOUT
|
175
|
-
node_name '#{@
|
236
|
+
node_name '#{@hostname}'
|
176
237
|
client_key '/etc/chef/client.pem'
|
177
238
|
validation_client_name 'chef-validator'
|
178
239
|
validation_key '/etc/chef/validation.pem'
|
@@ -188,7 +249,7 @@ EOF
|
|
188
249
|
##############################
|
189
250
|
# Add roles
|
190
251
|
instance_data["roles"].each do |role|
|
191
|
-
cmd = "#{knife_path} node run_list add #{@
|
252
|
+
cmd = "#{knife_path} node run_list add #{@hostname} \"role[#{role}]\""
|
192
253
|
puts cmd
|
193
254
|
puts `#{cmd}`
|
194
255
|
end
|
@@ -219,9 +280,9 @@ EOF
|
|
219
280
|
ses.send_email(
|
220
281
|
:from => instance_data["email_notifications"]["from"],
|
221
282
|
:to => instance_data["email_notifications"]["to"],
|
222
|
-
:subject => "Server setup complete: #{@
|
223
|
-
:body_text => "Server setup is complete for Host: #{@
|
224
|
-
:body_html => "<div>Server setup is complete for:</div><div><strong>Host:</strong> #{@
|
283
|
+
:subject => "Server setup complete: #{@hostname}",
|
284
|
+
:body_text => "Server setup is complete for Host: #{@hostname}, Environment: #{@options.environ}, Application: #{@options.application}",
|
285
|
+
:body_html => "<div>Server setup is complete for:</div><div><strong>Host:</strong> #{@hostname}</div><div><strong>Environment:</strong> #{@options.environ}</div><div><strong>Application:</strong> #{@options.application}</div>"
|
225
286
|
)
|
226
287
|
else
|
227
288
|
puts "Skipping email notification."
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "../test_helper"
|
2
|
+
require 'ec2launcher/dynamic_hostname_generator'
|
3
|
+
|
4
|
+
describe "DynamicHostnameGenerator", "Dynamic host name generation" do
|
5
|
+
it "creates valid hostname without prefix or suffix" do
|
6
|
+
generator = EC2Launcher::DynamicHostnameGenerator.new
|
7
|
+
generator.generate_dynamic_hostname("i-abcdefgh").must_equal "abcdefgh"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "creates valid hostname with a simple suffix and no prefix" do
|
11
|
+
generator = EC2Launcher::DynamicHostnameGenerator.new(nil, "example.com")
|
12
|
+
generator.generate_dynamic_hostname("i-abcdefgh").must_equal "abcdefgh.example.com"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "creates valid hostname with a simple prefix with no suffix" do
|
16
|
+
generator = EC2Launcher::DynamicHostnameGenerator.new("prefix-")
|
17
|
+
generator.generate_dynamic_hostname("i-abcdefgh").must_equal "prefix-abcdefgh"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "creates valid hostname with both a prefix and suffix" do
|
21
|
+
generator = EC2Launcher::DynamicHostnameGenerator.new("prefix-", "example.com")
|
22
|
+
generator.generate_dynamic_hostname("i-abcdefgh").must_equal "prefix-abcdefgh.example.com"
|
23
|
+
end
|
24
|
+
|
25
|
+
it "creates valid hostname when the suffix starts with a period" do
|
26
|
+
generator = EC2Launcher::DynamicHostnameGenerator.new(nil, ".example.com")
|
27
|
+
generator.generate_dynamic_hostname("i-abcdefgh").must_equal "abcdefgh.example.com"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative "../../test_helper"
|
2
|
+
require 'ec2launcher/hostnames/host_name_generation'
|
3
|
+
|
4
|
+
class HostNameGenerationSpecTest
|
5
|
+
include EC2Launcher::HostNames::HostNameGeneration
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "HostNameGeneration" do
|
9
|
+
let (:generator) { HostNameGenerationSpecTest.new }
|
10
|
+
|
11
|
+
it "gives a valid short name given a long name and domain" do
|
12
|
+
generator.generate_short_name("host.example.com", "example.com").must_equal "host"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "gives a valid short name given a long name and no domain" do
|
16
|
+
generator.generate_short_name("host.example.com", nil).must_equal "host.example.com"
|
17
|
+
end
|
18
|
+
|
19
|
+
it "gives a valid short name given a long name and a domain that starts with a period" do
|
20
|
+
generator.generate_short_name("host.example.com", ".example.com").must_equal "host"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "gives a valid FQDN given a short name and a domain" do
|
24
|
+
generator.generate_fqdn("host", "example.com").must_equal "host.example.com"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "gives a valid FQDN given a short name and a domain that starts with a period" do
|
28
|
+
generator.generate_fqdn("host", ".example.com").must_equal "host.example.com"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "gives a valid FQDN with a short name and no domain" do
|
32
|
+
generator.generate_fqdn("host", nil).must_equal "host"
|
33
|
+
end
|
34
|
+
|
35
|
+
it "throws an exception when generating a FQDN without a short name" do
|
36
|
+
assert_raises(ArgumentError) { generator.generate_fqdn(nil, nil) }
|
37
|
+
end
|
38
|
+
|
39
|
+
it "throws an exception when generating a short name without a long name" do
|
40
|
+
assert_raises(ArgumentError) { generator.generate_short_name(nil, nil) }
|
41
|
+
end
|
42
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -0,0 +1,102 @@
|
|
1
|
+
require_relative "../test_helper"
|
2
|
+
require 'minitest/mock'
|
3
|
+
require 'ec2launcher/block_device_builder'
|
4
|
+
require 'ec2launcher/dsl/block_device'
|
5
|
+
|
6
|
+
class BlockDeviceBuilderTest < MiniTest::Unit::TestCase
|
7
|
+
|
8
|
+
def test_building_ephemeral_drives()
|
9
|
+
ec2 = MiniTest::Mock.new
|
10
|
+
logger = MiniTest::Mock.new
|
11
|
+
|
12
|
+
bdb = BlockDeviceBuilder.new(ec2, nil, logger)
|
13
|
+
|
14
|
+
bd_mapping = {}
|
15
|
+
bdb.build_ephemeral_drives(bd_mapping, "m1.large")
|
16
|
+
|
17
|
+
refute_nil bd_mapping
|
18
|
+
|
19
|
+
assert_true bd_mapping["/dev/sdb"]
|
20
|
+
assert_true bd_mapping["/dev/sdc"]
|
21
|
+
assert_equal "ephemeral0", bd_mapping["/dev/sdb"]
|
22
|
+
assert_equal "ephemeral1", bd_mapping["/dev/sdc"]
|
23
|
+
|
24
|
+
bd_mapping = {}
|
25
|
+
bdb.build_ephemeral_drives(bd_mapping, "m1.small")
|
26
|
+
|
27
|
+
refute_nil bd_mapping
|
28
|
+
|
29
|
+
assert_true bd_mapping["/dev/sdb"]
|
30
|
+
assert_equal "ephemeral0", bd_mapping["/dev/sdb"]
|
31
|
+
|
32
|
+
bd_mapping = {}
|
33
|
+
bdb.build_ephemeral_drives(bd_mapping, "t1.micro")
|
34
|
+
|
35
|
+
refute_nil bd_mapping
|
36
|
+
|
37
|
+
assert_equal 0, bd_mapping.keys.size
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_basic_ebs_volume_setup()
|
41
|
+
ec2 = MiniTest::Mock.new
|
42
|
+
logger = MiniTest::Mock.new
|
43
|
+
|
44
|
+
bdb = BlockDeviceBuilder.new(ec2, nil, logger)
|
45
|
+
|
46
|
+
bd_mapping = {}
|
47
|
+
block_devices = [ EC2Launcher::DSL::BlockDevice.new({:name => "database"}) ]
|
48
|
+
bdb.build_ebs_volumes(bd_mapping, block_devices)
|
49
|
+
|
50
|
+
refute_nil bd_mapping
|
51
|
+
assert_true bd_mapping["/dev/sdf"]
|
52
|
+
assert_equal 60, bd_mapping["/dev/sdf"][:volume_size]
|
53
|
+
assert_equal true, bd_mapping["/dev/sdf"][:delete_on_termination]
|
54
|
+
assert_nil bd_mapping["/dev/sdf"][:iops]
|
55
|
+
|
56
|
+
bd_mapping = {}
|
57
|
+
block_devices = [ EC2Launcher::DSL::BlockDevice.new({:name => "database", :size => 120}) ]
|
58
|
+
bdb.build_ebs_volumes(bd_mapping, block_devices)
|
59
|
+
|
60
|
+
refute_nil bd_mapping
|
61
|
+
assert_true bd_mapping["/dev/sdf"]
|
62
|
+
assert_equal 120, bd_mapping["/dev/sdf"][:volume_size]
|
63
|
+
assert_nil bd_mapping["/dev/sdf"][:iops]
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_ebs_volume_setup_with_multiple_drives()
|
67
|
+
ec2 = MiniTest::Mock.new
|
68
|
+
logger = MiniTest::Mock.new
|
69
|
+
|
70
|
+
bdb = BlockDeviceBuilder.new(ec2, nil, logger)
|
71
|
+
|
72
|
+
bd_mapping = {}
|
73
|
+
block_devices = [ EC2Launcher::DSL::BlockDevice.new({:name => "database", :count => 3}) ]
|
74
|
+
bdb.build_ebs_volumes(bd_mapping, block_devices)
|
75
|
+
|
76
|
+
refute_nil bd_mapping
|
77
|
+
assert_true bd_mapping["/dev/sdf"]
|
78
|
+
assert_true bd_mapping["/dev/sdg"]
|
79
|
+
assert_true bd_mapping["/dev/sdh"]
|
80
|
+
|
81
|
+
assert_nil bd_mapping["/dev/sdf"][:iops]
|
82
|
+
assert_nil bd_mapping["/dev/sdg"][:iops]
|
83
|
+
assert_nil bd_mapping["/dev/sdh"][:iops]
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_ebs_volume_setup_with_piops()
|
87
|
+
ec2 = MiniTest::Mock.new
|
88
|
+
logger = MiniTest::Mock.new
|
89
|
+
|
90
|
+
bdb = BlockDeviceBuilder.new(ec2, nil, logger)
|
91
|
+
|
92
|
+
bd_mapping = {}
|
93
|
+
block_devices = [ EC2Launcher::DSL::BlockDevice.new({:name => "database", :iops => 200}) ]
|
94
|
+
bdb.build_ebs_volumes(bd_mapping, block_devices)
|
95
|
+
|
96
|
+
refute_nil bd_mapping
|
97
|
+
assert_true bd_mapping["/dev/sdf"]
|
98
|
+
|
99
|
+
refute_nil bd_mapping["/dev/sdf"][:iops]
|
100
|
+
assert_equal 200, bd_mapping["/dev/sdf"][:iops]
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require_relative "../test_helper"
|
2
|
+
require 'minitest/mock'
|
3
|
+
require 'ec2launcher/route53'
|
4
|
+
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
class Route53Test < MiniTest::Unit::TestCase
|
8
|
+
|
9
|
+
def setup()
|
10
|
+
@default_hosted_zone_id = "ABCDEFGH"
|
11
|
+
@default_record_name = "server1.example.com"
|
12
|
+
@default_record_type = "A"
|
13
|
+
@default_record_ttl = 3600
|
14
|
+
@default_record_value = "10.0.0.1"
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_route53_with_mock_client(client)
|
18
|
+
route53 = OpenStruct.new
|
19
|
+
route53.client = client
|
20
|
+
route53
|
21
|
+
end
|
22
|
+
|
23
|
+
def generate_route53_record_set(name, type, ttl, value)
|
24
|
+
route53_result = OpenStruct.new
|
25
|
+
route53_result.data = {
|
26
|
+
:resource_record_sets => [
|
27
|
+
{
|
28
|
+
:name => name,
|
29
|
+
:type => type,
|
30
|
+
:ttl => ttl,
|
31
|
+
:resource_records => [
|
32
|
+
{
|
33
|
+
:value => value
|
34
|
+
}
|
35
|
+
]
|
36
|
+
}
|
37
|
+
]
|
38
|
+
}
|
39
|
+
route53_result
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_route53_change_request(action, zone_id, name, type, ttl, value)
|
43
|
+
{
|
44
|
+
:hosted_zone_id => zone_id,
|
45
|
+
:change_batch => {
|
46
|
+
:changes => [
|
47
|
+
{
|
48
|
+
:action => action,
|
49
|
+
:resource_record_set => {
|
50
|
+
:name => name,
|
51
|
+
:type => type,
|
52
|
+
:ttl => ttl,
|
53
|
+
:resource_records => [ { :value => value } ]
|
54
|
+
}
|
55
|
+
}
|
56
|
+
]
|
57
|
+
}
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def generate_route53_query(zone_id = nil, name = nil, type = nil)
|
62
|
+
zone_id ||= @default_hosted_zone_id
|
63
|
+
name ||= @default_record_name
|
64
|
+
type ||= @default_record_type
|
65
|
+
|
66
|
+
{
|
67
|
+
:hosted_zone_id => zone_id,
|
68
|
+
:start_record_name => name,
|
69
|
+
:start_record_type => type,
|
70
|
+
:max_items => 1
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_find_record()
|
75
|
+
mock_client = MiniTest::Mock.new
|
76
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
77
|
+
|
78
|
+
route53_query = generate_route53_query()
|
79
|
+
route53_result = generate_route53_record_set(@default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
80
|
+
|
81
|
+
# mock expects:
|
82
|
+
# method return arguments
|
83
|
+
#-------------------------------------------------------------
|
84
|
+
mock_client.expect(:list_resource_record_sets, route53_result, [route53_query])
|
85
|
+
|
86
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
87
|
+
record = route53.find_record(@default_record_name, @default_record_type)
|
88
|
+
|
89
|
+
assert mock_client.verify
|
90
|
+
|
91
|
+
refute_nil record
|
92
|
+
|
93
|
+
assert_equal @default_record_name, record.name
|
94
|
+
assert_equal @default_record_ttl, record.ttl
|
95
|
+
assert_equal @default_record_value, record.value
|
96
|
+
assert_equal @default_record_type, record.type
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_delete_record()
|
100
|
+
mock_client = MiniTest::Mock.new
|
101
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
102
|
+
|
103
|
+
change_request = generate_route53_change_request("DELETE", @default_hosted_zone_id, @default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
104
|
+
|
105
|
+
mock_client.expect(:change_resource_record_sets, nil, [change_request])
|
106
|
+
|
107
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
108
|
+
|
109
|
+
delete_result = route53.delete_record(@default_record_name, @default_record_type, @default_record_ttl, @default_record_value, false)
|
110
|
+
|
111
|
+
assert mock_client.verify
|
112
|
+
|
113
|
+
assert delete_result
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_delete_record_by_name()
|
117
|
+
mock_client = MiniTest::Mock.new
|
118
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
119
|
+
|
120
|
+
route53_query = generate_route53_query()
|
121
|
+
route53_result = generate_route53_record_set(@default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
122
|
+
change_request = generate_route53_change_request("DELETE", @default_hosted_zone_id, @default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
123
|
+
|
124
|
+
mock_client.expect(:list_resource_record_sets, route53_result, [route53_query])
|
125
|
+
mock_client.expect(:change_resource_record_sets, nil, [change_request])
|
126
|
+
|
127
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
128
|
+
delete_result = route53.delete_record_by_name(@default_record_name, @default_record_type, false)
|
129
|
+
|
130
|
+
assert mock_client.verify
|
131
|
+
|
132
|
+
assert delete_result
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_delete_record_by_name_does_not_exist()
|
136
|
+
mock_client = MiniTest::Mock.new
|
137
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
138
|
+
|
139
|
+
route53_query = generate_route53_query()
|
140
|
+
|
141
|
+
mock_client.expect(:list_resource_record_sets, nil, [route53_query])
|
142
|
+
|
143
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
144
|
+
delete_result = route53.delete_record_by_name(@default_record_name, @default_record_type, false)
|
145
|
+
|
146
|
+
assert mock_client.verify
|
147
|
+
assert_equal false, delete_result
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_creating_new_record()
|
151
|
+
mock_client = MiniTest::Mock.new
|
152
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
153
|
+
|
154
|
+
route53_query = generate_route53_query()
|
155
|
+
update_request = generate_route53_change_request("CREATE", @default_hosted_zone_id, @default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
156
|
+
|
157
|
+
mock_client.expect(:list_resource_record_sets, nil, [route53_query])
|
158
|
+
mock_client.expect(:change_resource_record_sets, nil, [update_request])
|
159
|
+
|
160
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
161
|
+
route53.create_record(@default_record_name, @default_record_value, @default_record_type, @default_record_ttl)
|
162
|
+
|
163
|
+
assert mock_client.verify
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_updating_existing_record()
|
167
|
+
mock_client = MiniTest::Mock.new
|
168
|
+
mock_route53 = create_route53_with_mock_client(mock_client)
|
169
|
+
|
170
|
+
route53_query = generate_route53_query()
|
171
|
+
find_result = generate_route53_record_set(@default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
172
|
+
delete_request = generate_route53_change_request("DELETE", @default_hosted_zone_id, @default_record_name, @default_record_type, @default_record_ttl, @default_record_value)
|
173
|
+
update_request = generate_route53_change_request("CREATE", @default_hosted_zone_id, @default_record_name, @default_record_type, @default_record_ttl, "10.0.1.1")
|
174
|
+
|
175
|
+
mock_client.expect(:list_resource_record_sets, find_result, [route53_query])
|
176
|
+
mock_client.expect(:change_resource_record_sets, nil, [delete_request])
|
177
|
+
mock_client.expect(:change_resource_record_sets, nil, [update_request])
|
178
|
+
|
179
|
+
route53 = EC2Launcher::Route53.new(mock_route53, @default_hosted_zone_id)
|
180
|
+
route53.create_record(@default_record_name, "10.0.1.1", @default_record_type, @default_record_ttl)
|
181
|
+
|
182
|
+
assert mock_client.verify
|
183
|
+
end
|
184
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ec2launcher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Laurent
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-05-
|
11
|
+
date: 2013-05-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.
|
19
|
+
version: 1.8.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ! '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 1.
|
26
|
+
version: 1.8.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: log4r
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,20 +69,10 @@ dependencies:
|
|
69
69
|
description: Tool to manage application configurations and launch new EC2 instances
|
70
70
|
based on the configurations.
|
71
71
|
email:
|
72
|
-
executables:
|
73
|
-
- ec2launcher
|
72
|
+
executables: []
|
74
73
|
extensions: []
|
75
74
|
extra_rdoc_files: []
|
76
75
|
files:
|
77
|
-
- .gitignore
|
78
|
-
- CHANGELOG.md
|
79
|
-
- Gemfile
|
80
|
-
- LICENSE
|
81
|
-
- README.md
|
82
|
-
- Rakefile
|
83
|
-
- bin/ec2launcher
|
84
|
-
- ec2launcher.gemspec
|
85
|
-
- lib/ec2launcher.rb
|
86
76
|
- lib/ec2launcher/application_processor.rb
|
87
77
|
- lib/ec2launcher/aws_initializer.rb
|
88
78
|
- lib/ec2launcher/backoff_runner.rb
|
@@ -97,20 +87,32 @@ files:
|
|
97
87
|
- lib/ec2launcher/dsl/email_notification.rb
|
98
88
|
- lib/ec2launcher/dsl/environment.rb
|
99
89
|
- lib/ec2launcher/dsl/helper.rb
|
90
|
+
- lib/ec2launcher/dynamic_hostname_generator.rb
|
100
91
|
- lib/ec2launcher/environment_processor.rb
|
101
92
|
- lib/ec2launcher/hostname_generator.rb
|
93
|
+
- lib/ec2launcher/hostnames/host_name_generation.rb
|
102
94
|
- lib/ec2launcher/init_options.rb
|
103
95
|
- lib/ec2launcher/instance_paths_config.rb
|
104
96
|
- lib/ec2launcher/route53.rb
|
105
97
|
- lib/ec2launcher/security_group_handler.rb
|
106
98
|
- lib/ec2launcher/terminator.rb
|
107
99
|
- lib/ec2launcher/version.rb
|
100
|
+
- lib/ec2launcher.rb
|
101
|
+
- CHANGELOG.md
|
102
|
+
- Gemfile
|
103
|
+
- Gemfile.lock
|
104
|
+
- LICENSE
|
105
|
+
- Rakefile
|
106
|
+
- README.md
|
107
|
+
- test/spec/dynamic_hostname_generator_spec.rb
|
108
|
+
- test/spec/hostnames/host_name_generation_spec.rb
|
109
|
+
- test/test_helper.rb
|
110
|
+
- test/unit/block_device_builder.rb
|
111
|
+
- test/unit/dsl/config_parser_test.rb
|
112
|
+
- test/unit/route53_test.rb
|
108
113
|
- startup-scripts/runurl
|
109
114
|
- startup-scripts/setup.rb
|
110
115
|
- startup-scripts/setup_instance.rb
|
111
|
-
- test/ec2launcher/dsl/config_parser_test.rb
|
112
|
-
- test/test_helper.rb
|
113
|
-
- yard_extensions/dsl_attribute_handler.rb
|
114
116
|
homepage: https://github.com/StudyBlue/ec2launcher
|
115
117
|
licenses:
|
116
118
|
- Apache 2.0
|
@@ -136,5 +138,9 @@ signing_key:
|
|
136
138
|
specification_version: 4
|
137
139
|
summary: Tool to launch EC2 instances.
|
138
140
|
test_files:
|
139
|
-
- test/
|
141
|
+
- test/spec/dynamic_hostname_generator_spec.rb
|
142
|
+
- test/spec/hostnames/host_name_generation_spec.rb
|
140
143
|
- test/test_helper.rb
|
144
|
+
- test/unit/block_device_builder.rb
|
145
|
+
- test/unit/dsl/config_parser_test.rb
|
146
|
+
- test/unit/route53_test.rb
|