awsborn 0.4.0 → 0.5.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.
data/.gitignore CHANGED
@@ -19,3 +19,4 @@ rdoc
19
19
  pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
+ awsborn.log
data/README.mdown CHANGED
@@ -62,8 +62,8 @@ Servers take five different directives:
62
62
 
63
63
  * `instance_type` -- a symbol. One of `:m1_small`, `:m1_large`, `:m1_xlarge`,
64
64
  `:m2_2xlarge`, `:m2_4xlarge`, `:c1_medium`, and `:c1_xlarge`.
65
- * `image_id` -- a valid EC2 AMI. Specify `:sudo_user` as an option if the AMI
66
- does not allow you to log in as root.
65
+ * `image_id` -- a valid EC2 AMI or a hash `{:i386 => 'ami-3232', :x64 => 'ami-6464'}`
66
+ Specify `:sudo_user` as an option if the AMI does not allow you to log in as root.
67
67
  * `security_group` -- a security group that you own.
68
68
  * `keys` -- one or more globs to public ssh key files. When the servers are running,
69
69
  `root` will be able to log in using any one of these keys.
@@ -103,6 +103,7 @@ Keys that override server type settings:
103
103
  * `:security_group`
104
104
  * `:keys`
105
105
  * `:bootstrap_script`
106
+ * `:image_id`
106
107
 
107
108
  ### Launching a cluster
108
109
 
@@ -233,7 +234,13 @@ Other rake tasks include:
233
234
 
234
235
  ## Bugs and surprising features
235
236
 
236
- No bugs are known at this time.
237
+ * There is a race condition in launch: Immediately after the launch request (`launch_instance`) we
238
+ call `instance_running?`, but occasionally, AWS will not recognise the instance id yet
239
+ (`InvalidInstanceID.NotFound: The instance ID 'i-e9005283' does not exist`)
240
+ * Running with `rake` suppresses stack traces which makes it hard to debug rare errors. The rake
241
+ tasks or entry points should catch exceptions and print the stack trace.
242
+ * `t1_micro` instances will select an i386 image when `image_id` is specified as a hash. To run
243
+ them with x64 images, specify the image name on the server directive.
237
244
 
238
245
  ### Untested features
239
246
 
@@ -246,8 +253,6 @@ No bugs are known at this time.
246
253
  * Hack RightAws to verify certificates.
247
254
  * Elastic Load Balancing.
248
255
  * Launch servers in parallel.
249
- * Make `image_id` a hash with different AMIs for different instance types.
250
- * Make `image_id` overridable per server.
251
256
 
252
257
 
253
258
  ## Note on Patches/Pull Requests
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
data/lib/awsborn/rake.rb CHANGED
@@ -11,7 +11,10 @@ module Awsborn
11
11
  task :all => [:start, "chef:run"]
12
12
  task :default => :all
13
13
 
14
- desc "Start all servers (or host=name1,name2)."
14
+ desc "Like 'all' but with chef debugging on."
15
+ task :debug => ["chef:set_chef_debug", :all]
16
+
17
+ desc "Start all servers (or host=name1,name2) but don't run chef."
15
18
  task :start do |t,args|
16
19
  hosts = args[:host] && args[:host].split(',')
17
20
  default_cluster.launch hosts
@@ -13,6 +13,10 @@ module Awsborn
13
13
  @children ||= []
14
14
  @children << klass
15
15
  end
16
+ # Set image_id. Examples:
17
+ # image_id 'ami-123123'
18
+ # image_id 'ami-123123', :sudo_user => 'ubuntu'
19
+ # image_id :i386 => 'ami-323232', :x64 => 'ami-646464', :sudo_user => 'ubuntu'
16
20
  def image_id (*args)
17
21
  unless args.empty?
18
22
  @image_id = args.first
@@ -218,7 +222,17 @@ module Awsborn
218
222
  volume.is_a?(Array) && volume.last == :format
219
223
  end
220
224
  def image_id
221
- self.class.image_id
225
+ return @options[:image_id] if @options[:image_id]
226
+ tmp = self.class.image_id
227
+ tmp.is_a?(String) ? tmp : tmp[architecture]
228
+ end
229
+ def architecture
230
+ string = constant(instance_type)
231
+ case
232
+ when INSTANCE_TYPES_32_BIT.include?(string) then :i386
233
+ when INSTANCE_TYPES_64_BIT.include?(string) then :x64
234
+ else raise "Don't know if #{instance_type} is i386 or x64"
235
+ end
222
236
  end
223
237
  def instance_type
224
238
  @options[:instance_type] || self.class.instance_type
@@ -271,7 +285,9 @@ module Awsborn
271
285
  eu-west-1a eu-west-1b
272
286
  ap-southeast-1a ap-southeast-1b
273
287
  ]
274
- INSTANCE_TYPES = %w[m1.small m1.large m1.xlarge m2.xlarge m2.2xlarge m2.4xlarge c1.medium c1.xlarge]
288
+ INSTANCE_TYPES_32_BIT = %w[m1.small c1.medium t1.micro]
289
+ INSTANCE_TYPES_64_BIT = %w[m1.large m1.xlarge m2.xlarge m2.2xlarge m2.4xlarge c1.xlarge cc1.4xlarge t1.micro]
290
+ INSTANCE_TYPES = (INSTANCE_TYPES_32_BIT + INSTANCE_TYPES_64_BIT).uniq
275
291
  SYMBOL_CONSTANT_MAP = (AVAILABILITY_ZONES + INSTANCE_TYPES).inject({}) { |memo,str| memo[str.tr('-.','_').to_sym] = str; memo }
276
292
 
277
293
  def constant (symbol)
data/spec/server_spec.rb CHANGED
@@ -6,6 +6,11 @@ class SampleServer < Awsborn::Server
6
6
  keys :all
7
7
  end
8
8
 
9
+ class BigAndSmallServer < Awsborn::Server
10
+ instance_type :m1_small
11
+ image_id :x64 => 'ami-big', :i386 => 'ami-small'
12
+ end
13
+
9
14
  describe Awsborn::Server do
10
15
  before(:each) do
11
16
  @server = SampleServer.new :sample, :zone => :eu_west_1a, :disk => {:sdf => "vol-aaaaaaaa"}
@@ -20,11 +25,28 @@ describe Awsborn::Server do
20
25
  end
21
26
  end
22
27
 
23
- # TODO
24
- context "first of all" do
25
- it "should have a connection to the EU service point"
26
-
28
+ describe "image_id" do
29
+ it "should use a given string" do
30
+ @server.image_id.should == 'ami-2fc2e95b'
31
+ end
32
+ it "should use the i386 image for a small server" do
33
+ server = BigAndSmallServer.new :sample, :zone => :eu_west_1a, :disk => {:sdf => "vol-a"}, :instance_type => :m1_small
34
+ server.image_id.should == 'ami-small'
35
+ end
36
+ it "should use the i386 image for a micro server (which could use either)" do
37
+ server = BigAndSmallServer.new :sample, :zone => :eu_west_1a, :disk => {:sdf => "vol-a"}, :instance_type => :t1_micro
38
+ server.image_id.should == 'ami-small'
39
+ end
40
+ it "should use the x64 image for a big server" do
41
+ server = BigAndSmallServer.new :sample, :zone => :eu_west_1a, :disk => {:sdf => "vol-a"}, :instance_type => :m1_large
42
+ server.image_id.should == 'ami-big'
43
+ end
27
44
  end
45
+
46
+ # TODO
47
+ # context "first of all" do
48
+ # it "should have a connection to the EU service point"
49
+ # end
28
50
 
29
51
  context "#launch when not started" do
30
52
  before(:each) do
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
7
+ - 5
8
8
  - 0
9
- version: 0.4.0
9
+ version: 0.5.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - David Vrensk
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-07 00:00:00 +02:00
17
+ date: 2010-09-10 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency