ec2launcher 1.6.15 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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} -h #{options.hostname} #{setup_json_filename}"
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 '#{@options.hostname}'
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 #{@options.hostname} \"role[#{role}]\""
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: #{@options.hostname}",
223
- :body_text => "Server setup is complete for Host: #{@options.hostname}, Environment: #{@options.environ}, Application: #{@options.application}",
224
- :body_html => "<div>Server setup is complete for:</div><div><strong>Host:</strong> #{@options.hostname}</div><div><strong>Environment:</strong> #{@options.environ}</div><div><strong>Application:</strong> #{@options.application}</div>"
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
@@ -1,3 +1,2 @@
1
1
  require 'minitest/autorun'
2
2
  require 'minitest/pride'
3
- require File.expand_path('../../lib/ec2launcher.rb', __FILE__)
@@ -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
@@ -1,4 +1,5 @@
1
1
  require_relative "../../test_helper"
2
+ require 'ec2launcher/dsl/config'
2
3
 
3
4
  class ConfigParserTest < MiniTest::Unit::TestCase
4
5
  def test_full_config_parses_correctly
@@ -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.6.15
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-01 00:00:00.000000000 Z
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.6.6
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.6.6
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/ec2launcher/dsl/config_parser_test.rb
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
data/.gitignore DELETED
@@ -1,17 +0,0 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp