judo 0.2.1 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.markdown CHANGED
@@ -5,6 +5,14 @@ to get going and powerful.
5
5
 
6
6
  ## CONCEPTS
7
7
 
8
+ Servers and Groups. Servers are identified by a naked string. Groups always
9
+ have a colon prefix.
10
+
11
+ $ judo restart my_server_1 ## this restarts my_server_1
12
+ $ judo restart my_server_1 other_server ## this restarts my_server_1 and other_server
13
+ $ judo restart :default ## this restarts all servers in the :default group
14
+ $ judo restart sammy :default :db ## this restarts all servers in the :default group, the :db group, and a server named sammy
15
+
8
16
  Config Repo: Judo keeps it configuration for each server group in a git repo.
9
17
 
10
18
  State Database: Judo keeps cloud state and information on specific servers in SimpleDB.
@@ -22,36 +30,38 @@ Setting up a new judo repo named "my_cloud" would look like this:
22
30
 
23
31
  $ mkdir my_cloud
24
32
  $ cd my_cloud
25
- $ git init
26
- $ judo init
33
+ $ judo setup --accessid AWS_ACCESS_ID --secret AWS_KEY --bucket BUCKET
34
+
35
+ Note: you can use the AWS_SECRET_ACCESS_KEY, AWS_ACCESS_KEY_ID and JUDO_BUCKET
36
+ enviornment variables instead of the command line switches.
27
37
 
28
- The 'judo init' command will make a .judo folder to store your EC2 keys and S3
38
+ The 'judo setup' command will make a .judo folder to store your EC2 keys and S3
29
39
  bucket. It will also make a folder named "default" to hold the default server
30
40
  config.
31
41
 
32
42
  To view all of the groups and servers running in those group you can type:
33
43
 
34
- $ judo list
35
- SERVER GROUPS
36
- default 0 servers
44
+ $ judo groups
37
45
 
38
- To launch a default server you need to cd into the default folder:
46
+ To launch a default server you create it
39
47
 
40
- $ cd default
41
- $ judo create my_server_1
48
+ $ judo create my_server_1:default
42
49
  ---> Creating server my_server_1... done (0.6s)
43
50
  $ judo list
44
- SERVER IN GROUP my_server_1
45
- my_server_1 m1.small ami-bb709dd2 0 volumes
51
+ SERVERS
52
+ --------------------------------------------------------------------------------
53
+ my_server_1 default v12 m1.small ebs:0
46
54
  $ judo start my_server_1
47
- No config has been committed yet, type 'judo commit'
55
+ ---> Starting server my_server_1... done (2.3s)
56
+ $ judo list
57
+ SERVERS
58
+ --------------------------------------------------------------------------------
59
+ my_server_1 default v1 i-6fdf8d09 m1.small running ebs:0
48
60
 
49
- The server has now been created but cannot be launched because the config has
50
- not been committed. Committing the config loads the config.json and all of the
51
- scripts and packages it needs to run into your S3 bucket. The config probably
52
- looks something like this:
61
+ You can examine a groups config by looking in the group folder in the repo. The
62
+ default group will look something like this.
53
63
 
54
- $ cat config.json
64
+ $ cat default/config.json
55
65
  {
56
66
  "key_name":"judo14",
57
67
  "instance_size":"m1.small",
@@ -62,44 +72,28 @@ looks something like this:
62
72
  "availability_zone":"us-east-1d"
63
73
  }
64
74
 
65
- The default config uses the public ubuntu 9.10 ami's. It runs in the judo
66
- security group and a judo key pair (which were made during the init process).
67
- The user parameter is the user the 'judo ssh' command attempts to ssh in using
68
- the keypair. Other debian based distros can be used assuming they have current
69
- enough installations of ruby (1.8.7) and rubygems (1.3.5).
75
+ Any changes you make to these files does not stick until you've committed them.
76
+ To commit a group do the following.
70
77
 
71
- $ judo commit
72
- Compiling version 1
73
- a default
74
- a default/config.json
75
- Uploading to s3...
76
- $ judo start my_server_1
77
- ---> Starting server my_server_1... done (2.3s)
78
- ---> Acquire hostname... ec2-1-2-3-4.compute-1.amazonaws.com (49.8s)
79
- ---> Wait for ssh... done (9.8s)
80
- $ judo list
81
- SERVER IN GROUP default
82
- my_server_1 v1 i-80000000 m1.small ami-bb709dd2 running 0 volumes ec2-1-2-3-4.compute-1.amazonaws.com
78
+ $ judo commit :default
79
+ Compiling version 2... done (1.2s)
83
80
 
84
81
  We can now see that 'my_server_1' is running and running with version 1 of the
85
82
  config. We can create and start a server in one step with the launch command.
86
83
 
87
- $ judo launch my_server_2
84
+ $ judo launch my_server_2:default
88
85
  ---> Creating server my_server_2... done (0.6s)
89
86
  ---> Starting server my_server_2... done (1.6s)
90
- ---> Acquire hostname... ec2-1-2-3-5.compute-1.amazonaws.com (31.1s)
91
- ---> Wait for ssh... done (6.1s)
92
87
 
93
88
  This will create and start two servers. One named 'my_server_1' and one named
94
89
  'my_server_2'. You can ssh into 'my_server_1' you can type:
95
90
 
96
91
  $ judo ssh my_server_1
97
92
 
98
- You can stop all the servers with:
93
+ You can stop all the servers in the :default group with:
99
94
 
100
- $ judo stop
95
+ $ judo stop :default
101
96
 
102
- Note that since no name was specified it will stop all servers in the group.
103
97
  You could also have typed:
104
98
 
105
99
  $ judo stop my_server_1 my_server_2
@@ -115,7 +109,7 @@ operation is run on all servers. For instance:
115
109
 
116
110
  This will restart only the servers named 'primary_db' and 'backup_db'. Where as
117
111
 
118
- $ judo restart
112
+ $ judo restart :db
119
113
 
120
114
  will restart all servers in the group.
121
115
 
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ Jeweler::Tasks.new do |s|
10
10
  s.rubyforge_project = "judo"
11
11
  s.files = FileList["[A-Z]*", "{bin,lib,spec}/**/*"]
12
12
  s.executables = %w(judo)
13
- s.add_dependency "aws", [">= 2.3.5"]
13
+ s.add_dependency "aws", [">= 2.3.8"]
14
14
  s.add_dependency "json"
15
15
  end
16
16
 
data/TODO CHANGED
@@ -1,23 +1,30 @@
1
1
  ### NEEDED for new gem launch
2
2
 
3
- ### [ ] snapshot complete in do_snapshots()
3
+ ### [ ] ubuntu 10.04
4
+ ### [ ] allocate elastic_ip first
5
+ ### [ ] snapshot percent complete in do_snapshots()
4
6
  ### [ ] judo swap (x) (y) -> swaps elastic IP's and name
5
7
  ### [ ] snapshots/init/virgin
8
+ ### [ ] bind kuzushi gem version version
9
+ ### [ ] should be able to do ALL actions except commit without the repo!
10
+ ### [ ] ssh - put pem into s3
11
+ ### [ ] store s3 bucket in config
12
+ ### [ ] store things in s3 by sha1sum
13
+ ### [ ] ebs backed root disk
14
+ ### [ ] clone from ebs snapshot on start
15
+ ### [ ] implement start/stop
16
+
17
+ ### [ ] implement auto security_group creation and setup (6 hrs)
6
18
 
7
19
  ### [ ] judo does not work with ruby 1.8.6 - :(
8
20
  ### [ ] saw a timeout on volume allocation - make sure we build in re-tries - need to allocate the server all together as much as possible
9
- ### [ ] there is a feature to allow for using that block_mapping feature - faster startup
10
21
 
11
22
  ### [ ] two phase delete (1 hr)
12
23
  ### [-] refactor availability_zone (2 hrs)
13
24
  ### [ ] pick availability zone from config "X":"Y" or "X":["Y","Z"]
14
25
  ### [ ] assign to state on creation ( could delay till volume creation )
15
- ### [ ] implement auto security_group creation and setup (6 hrs)
16
- ### [ ] bind kuzushi gem version version
17
26
 
18
- ### [ ] should be able to do ALL actions except commit without the repo!
19
27
  ### [ ] store git commit hash with commit to block a judo commit if there is newer material stored
20
- ### [ ] remove the tarball - store files a sha hashes in the bucket - makes for faster commits if the files have not changed
21
28
 
22
29
  ### [ ] use a logger service (1 hr)
23
30
  ### [ ] write specs (5 hr)
@@ -28,13 +35,9 @@
28
35
 
29
36
  ### Do Later
30
37
  ### [ ] use amazon's new conditional write tools so we never have problems from concurrent updates
31
- ### [ ] is thor really what we want to use here?
32
- ### [ ] need to be able to pin a config to a version of kuzushi - gem updates can/will break a lot of things
33
38
  ### [ ] I want a "judo monitor" command that will make start servers if they go down, and poke a listed port to make sure a service is listening, would be cool if it also detects wrong ami, wrong secuirity group, missing/extra volumes, missing/extra elastic_ip - might not want to force a reboot quite yet in these cases
34
- ### [ ] Implement "judo snapshot [NAME]" to take a snapshot of the ebs's blocks
35
39
  ### [ ] ruby 1.9.1 support
36
40
  ### [ ] find a good way to set the hostname or prompt to :name
37
- ### [ ] remove fog/s3 dependancy
38
41
  ### [ ] enforce template files end in .erb to make room for other possible templates as defined by the extensions
39
42
  ### [ ] zerigo integration for automatic DNS setup
40
43
  ### [ ] How cool would it be if this was all reimplemented in eventmachine and could start lots of boxes in parallel? Would need to evented AWS api calls... Never seen a library to do that - would have to write our own... "Fog Machine?"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.1
1
+ 0.2.3
data/bin/judo CHANGED
@@ -93,10 +93,11 @@ end
93
93
  optparse.parse!
94
94
 
95
95
  judo = Judo::Base.new(defaults.merge(options))
96
- judo.check_version
96
+ judo.check_version if action != "setup"
97
97
 
98
98
  begin
99
99
  case action
100
+ when "setup" then judo.setup
100
101
  when "ips" then do_ips(judo)
101
102
  when "volumes" then do_volumes(judo)
102
103
  when "list" then do_list(judo, ARGV)
data/lib/judo/base.rb CHANGED
@@ -60,6 +60,10 @@ module Judo
60
60
  end
61
61
  end
62
62
 
63
+ def self.domain
64
+ "judo_config"
65
+ end
66
+
63
67
  def self.default_options(pwd, dir = find_judo_dir(pwd))
64
68
  config = YAML.load File.read("#{dir}/config.yml")
65
69
  repo_dir = config["repo"] || File.dirname(dir)
@@ -207,7 +211,7 @@ module Judo
207
211
  end
208
212
 
209
213
  def bucket
210
- @bucket ||= s3.bucket(bucket_name)
214
+ @bucket ||= s3.bucket(bucket_name, true)
211
215
  end
212
216
 
213
217
  def s3_url(k)
@@ -247,7 +251,12 @@ module Judo
247
251
  def upgrade_db
248
252
  case get_db_version
249
253
  when 0
250
- raise JudoError, "Your db appears to be unititialized. You will need to do a judo init"
254
+ task("Upgrading Judo: Creating Snapshots SDB Domain") do
255
+ sdb.create_domain(Judo::Server.domain)
256
+ sdb.create_domain(Judo::Snapshot.domain)
257
+ sdb.create_domain(Judo::Snapshot.domain)
258
+ set_db_version(2)
259
+ end
251
260
  when 1
252
261
  task("Upgrading Judo: Creating Snapshots SDB Domain") do
253
262
  sdb.create_domain(Judo::Snapshot.domain)
@@ -270,5 +279,81 @@ module Judo
270
279
  def check_version
271
280
  upgrade_db if get_db_version != db_version
272
281
  end
282
+
283
+ def setup
284
+ ## no need to setup bucket
285
+
286
+ @repo ||= "." ## use cwd as default repo dir
287
+
288
+ setup_sdb
289
+ setup_security_group
290
+ setup_judo_config
291
+ setup_repo
292
+ get_group("default").compile
293
+ end
294
+
295
+ def setup_sdb
296
+ task("Trying to connect to SimpleDB") do
297
+ sdb.create_domain(Judo::Base.domain)
298
+ end
299
+ end
300
+
301
+ def setup_security_group
302
+ begin
303
+ ec2.create_security_group('judo', 'Judo')
304
+ ec2.authorize_security_group_IP_ingress("judo", 22, 22,'tcp','0.0.0.0/0')
305
+ rescue Aws::AwsError => e
306
+ raise unless e.message =~ /InvalidGroup.Duplicate/
307
+ end
308
+ end
309
+
310
+ def setup_judo_config
311
+ if judo_dir and File.exists?("#{judo_dir}/config.yml")
312
+ puts "config already exists [#{judo_dir}/config.yml]"
313
+ return
314
+ end
315
+ raise JudoError, "You must specify a repo dir" unless repo
316
+ task("writing .judo/config.yml") do
317
+ Dir.chdir(repo) do
318
+ system "mkdir .judo"
319
+ File.open(".judo/config.yml","w") do |f|
320
+ f.write({ "access_id" => @aws_access_id, "access_secret" => @aws_secret_key, "s3_bucket" => @s3_bucket }.to_yaml)
321
+ end
322
+ end
323
+ end
324
+ end
325
+
326
+ def setup_repo
327
+ if File.exists?("#{repo}/default")
328
+ puts "default group already exists [#{repo}/default]"
329
+ return
330
+ end
331
+ task("Setting up default group") do
332
+ Dir.chdir(repo) do
333
+ system "mkdir -p default/keypairs"
334
+
335
+ @keypair = "judo#{ec2.describe_key_pairs.map { |k| k[:aws_key_name] }.map { |k| k =~ /^judo(\d*)/; $1.to_i }.sort.last.to_i + 1}"
336
+ material = ec2.create_key_pair(@keypair)[:aws_material]
337
+
338
+ File.open("default/keypairs/#{@keypair}.pem", 'w') { |f| f.write material }
339
+ File.chmod 0600, "default/keypairs/#{@keypair}.pem"
340
+ File.open("default/config.json","w") { |f| f.write default_config }
341
+ end
342
+ end
343
+ end
344
+
345
+ def default_config
346
+ <<DEFAULT
347
+ {
348
+ "key_name":"#{@keypair}",
349
+ "instance_size":"m1.small",
350
+ "ami32":"ami-bb709dd2", // public ubuntu 9.10 ami - 32 bit
351
+ "ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
352
+ "user":"ubuntu",
353
+ "security_group":"judo",
354
+ "availability_zone":"us-east-1d"
355
+ }
356
+ DEFAULT
357
+ end
273
358
  end
274
359
  end
@@ -125,7 +125,7 @@ module JudoCommandLineHelpers
125
125
  printf "%s\n", ("-" * 80)
126
126
  judo.snapshots.each do |snapshot|
127
127
  next if args and not servers.detect { |s| s == snapshot.server }
128
- printf "%-15s %-25s %-15s %-10s %s\n", snapshot.name, snapshot.server_name, snapshot.group_name, snapshot.version_desc, "#{snapshot.ec2_ids.size}v"
128
+ printf "%-15s %-25s %-15s %-10s %s\n", snapshot.name, snapshot.server_name, snapshot.group_name, snapshot.version_desc, "ebs:#{snapshot.ec2_ids.size}"
129
129
  end
130
130
  end
131
131
 
@@ -134,7 +134,7 @@ module JudoCommandLineHelpers
134
134
  printf " SERVERS\n"
135
135
  printf "%s\n", ("-" * 80)
136
136
  servers.sort.each do |s|
137
- printf "%-32s %-12s %-7s %-11s %-11s %-10s %-3s %s\n", s.name, s.group.name, s.version_desc, s.state["instance_id"], s.size_desc, s.ec2_state, "#{s.volumes.keys.size}v", s.has_ip? ? "ip" : ""
137
+ printf "%-32s %-12s %-7s %-11s %-11s %-10s %-3s %s\n", s.name, s.group.name, s.version_desc, s.state["instance_id"], s.size_desc, s.ec2_state, "ebs:#{s.volumes.keys.size}", s.has_ip? ? "ip" : ""
138
138
  end
139
139
  end
140
140
 
data/lib/judo/group.rb CHANGED
@@ -36,31 +36,32 @@ module Judo
36
36
 
37
37
  def compile
38
38
  tmpdir = "/tmp/kuzushi/#{name}"
39
- puts "Compiling #{self} version #{version}"
40
- @version = @version + 1
41
- FileUtils.rm_rf(tmpdir)
42
- FileUtils.mkdir_p(tmpdir)
43
- new_config = build_config
44
- Dir.chdir(tmpdir) do |d|
45
- attachments(new_config).each do |to,from|
46
- FileUtils.mkdir_p(File.dirname(to))
47
- if from =~ /^http:\/\//
48
- puts "curl '#{from}'"
49
- system "curl '#{from}' > #{to}"
50
- puts "#{to} is #{File.stat(to).size} bytes"
51
- else
52
- FileUtils.cp(from,to)
39
+ @base.task("Compiling #{self} version #{version + 1}") do
40
+ @version = @version + 1
41
+ FileUtils.rm_rf(tmpdir)
42
+ FileUtils.mkdir_p(tmpdir)
43
+ new_config = build_config
44
+ Dir.chdir(tmpdir) do |d|
45
+ attachments(new_config).each do |to,from|
46
+ FileUtils.mkdir_p(File.dirname(to))
47
+ if from =~ /^http:\/\//
48
+ # puts "curl '#{from}'"
49
+ system "curl '#{from}' > #{to}"
50
+ # puts "#{to} is #{File.stat(to).size} bytes"
51
+ else
52
+ FileUtils.cp(from,to)
53
+ end
54
+ end
55
+ File.open("config.json", "w") { |f| f.write(new_config.to_json) }
56
+ Dir.chdir("..") do
57
+ system "tar czf #{tar_file} #{name}"
58
+ # puts "Uploading to s3..."
59
+ @base.s3_put(tar_file, File.new(tar_file).read)
60
+ @base.s3_put(version_config_file, new_config.to_json)
53
61
  end
54
62
  end
55
- File.open("config.json", "w") { |f| f.write(new_config.to_json) }
56
- Dir.chdir("..") do
57
- system "tar czvf #{tar_file} #{name}"
58
- puts "Uploading to s3..."
59
- @base.s3_put(tar_file, File.new(tar_file))
60
- @base.s3_put(version_config_file, new_config.to_json)
61
- end
63
+ set_version
62
64
  end
63
- set_version
64
65
  end
65
66
 
66
67
  def version_config_file
data/lib/judo/server.rb CHANGED
@@ -315,7 +315,7 @@ module Judo
315
315
  ## EC2 terminate_isntaces
316
316
  task("Terminating instance") { @base.ec2.terminate_instances([ instance_id ]) }
317
317
  force_detach_volumes if force
318
- task("Wait for volumes to detach") { wait_for_volumes_detached } if volumes.size > 0
318
+ wait_for_volumes_detached if volumes.size > 0
319
319
  remove "instance_id"
320
320
  end
321
321
 
@@ -382,14 +382,18 @@ module Judo
382
382
 
383
383
  def wait_for_volumes_detached
384
384
  begin
385
- Timeout::timeout(60) do
386
- loop do
387
- break if ec2_volumes.reject { |v| v[:aws_status] == "available" }.empty?
388
- sleep 2
385
+ task("Wait for volumes to detach") do
386
+ Timeout::timeout(60) do
387
+ loop do
388
+ break if ec2_volumes.reject { |v| v[:aws_status] == "available" }.empty?
389
+ sleep 2
390
+ end
389
391
  end
390
392
  end
391
393
  rescue Timeout::Error
394
+ puts "failed!"
392
395
  force_detach_volumes
396
+ retry
393
397
  end
394
398
  end
395
399
 
@@ -463,29 +467,6 @@ module Judo
463
467
  system "ssh -i #{group.keypair_file} #{config["user"]}@#{hostname}"
464
468
  end
465
469
 
466
- def self.commit
467
- ## FIXME
468
- Config.group_dirs.each do |group_dir|
469
- group = File.basename(group_dir)
470
- next if Config.group and Config.group != group
471
- puts "commiting #{group}"
472
- doc = Config.couchdb.get(group) rescue {}
473
- config = Config.read_config(group)
474
- config['_id'] = group
475
- config['_rev'] = doc['_rev'] if doc.has_key?('_rev')
476
- response = Config.couchdb.save_doc(config)
477
- doc = Config.couchdb.get(response['id'])
478
-
479
- # walk subdirs and save as _attachments
480
- ['files', 'templates', 'packages', 'scripts'].each { |subdir|
481
- Dir["#{group_dir}/#{subdir}/*"].each do |f|
482
- puts "storing attachment #{f}"
483
- doc.put_attachment("#{subdir}/#{File.basename(f)}", File.read(f))
484
- end
485
- }
486
- end
487
- end
488
-
489
470
  def ec2_instance_type
490
471
  ec2_instance[:aws_instance_type] rescue nil
491
472
  end
@@ -505,6 +486,7 @@ module Judo
505
486
 
506
487
  export DEBIAN_FRONTEND="noninteractive"
507
488
  export DEBIAN_PRIORITY="critical"
489
+ export JUDO_ID='#{name}'
508
490
  export SECRET='#{secret}'
509
491
  apt-get update
510
492
  apt-get install ruby rubygems ruby-dev irb libopenssl-ruby libreadline-ruby -y
data/lib/judo.rb CHANGED
@@ -1,9 +1,9 @@
1
- require 'yaml'
2
- require 'socket'
3
- require 'fileutils'
4
-
5
1
  require 'rubygems'
2
+ require 'active_support'
6
3
  require 'right_aws'
4
+ require 'socket'
5
+ require 'fileutils'
6
+ require 'yaml'
7
7
  require 'json'
8
8
  require 'pp'
9
9
 
@@ -13,9 +13,7 @@ class JudoError < RuntimeError ; end
13
13
  class JudoInvalid < RuntimeError ; end
14
14
 
15
15
  require File.dirname(__FILE__) + '/judo/base'
16
- require File.dirname(__FILE__) + '/judo/config'
17
16
  require File.dirname(__FILE__) + '/judo/group'
18
17
  require File.dirname(__FILE__) + '/judo/server'
19
18
  require File.dirname(__FILE__) + '/judo/snapshot'
20
- require File.dirname(__FILE__) + '/judo/setup'
21
19
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 1
9
- version: 0.2.1
8
+ - 3
9
+ version: 0.2.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Orion Henry
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-06 00:00:00 -04:00
17
+ date: 2010-05-13 00:00:00 -04:00
18
18
  default_executable: judo
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -27,8 +27,8 @@ dependencies:
27
27
  segments:
28
28
  - 2
29
29
  - 3
30
- - 5
31
- version: 2.3.5
30
+ - 8
31
+ version: 2.3.8
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
@@ -61,10 +61,8 @@ files:
61
61
  - lib/judo.rb
62
62
  - lib/judo/base.rb
63
63
  - lib/judo/commandline_helpers.rb
64
- - lib/judo/config.rb
65
64
  - lib/judo/group.rb
66
65
  - lib/judo/server.rb
67
- - lib/judo/setup.rb
68
66
  - lib/judo/snapshot.rb
69
67
  - spec/base.rb
70
68
  - spec/base_spec.rb
data/lib/judo/config.rb DELETED
@@ -1,133 +0,0 @@
1
- module Judo
2
- module Config
3
- extend self
4
-
5
- def db_version
6
- 1
7
- end
8
-
9
- def get_db_version
10
- version = @sdb.get_attributes("judo_config", "judo")[:attributes]["dbversion"]
11
- version and version.first.to_i or db_version
12
- end
13
-
14
- def check_version
15
- abort "judo db is newer than the current gem - upgrade judo and try again" if get_db_version > db_version
16
- end
17
-
18
- def repo_dir
19
- judo_config["repo"] || File.dirname(judo_dir)
20
- end
21
-
22
- def access_id
23
- judo_config["access_id"]
24
- end
25
-
26
- def access_secret
27
- judo_config["access_secret"]
28
- end
29
-
30
- def get_ec2(aws_id, aws_key)
31
- Aws::Ec2.new(aws_id, aws_key, :logger => Logger.new(nil))
32
- end
33
-
34
- def ec2
35
- @ec2 ||= get_ec2(access_id, access_secret)
36
- end
37
-
38
- # def create_security_group
39
- # ## EC2 create_security_group
40
- # ec2.create_security_group('judo', 'Judo')
41
- # ## EC2 authorize_security_group
42
- # ec2.authorize_security_group_IP_ingress("judo", 22, 22,'tcp','0.0.0.0/0')
43
- # rescue Aws::AwsError
44
- # end
45
-
46
- def judo_config
47
- @config ||= read_judo_config
48
- end
49
-
50
- def judo_config_file
51
- "#{judo_dir}/config.yml"
52
- end
53
-
54
- def judo_dir
55
- @judo_dir ||= find_judo_dir(Dir.pwd) || abort("fatal: Not a judo repository (or any of the parent directories): .judo\nrun commands from the judo repository or type 'judo init' to setup the current directory as a new judo repository")
56
- end
57
-
58
- def self.dirs
59
- Dir["#{Judo::Config.repo_dir}/*/config.json"].map { |d| File.dirname(d) }
60
- end
61
-
62
- def self.all
63
- @@all ||= (dirs.map { |d| new(d) })
64
- end
65
-
66
- def self.current
67
- all.detect { |d| Dir.pwd == d.dir or Dir.pwd =~ /^#{d.dir}\// }
68
- end
69
-
70
- def default_options(pwd, dir = find_judo_dir(pwd))
71
- puts "PWD: #{pwd}"
72
- puts "DIR: #{dir}"
73
- config = YAML.load File.read("#{dir}/config.yml")
74
- repo_dir = config["repo"] || File.dirname(dir)
75
- group_config = Dir["#{repo_dir}/*/config.json"].detect { |d| File.dirname(d) == pwd }
76
- {
77
- :judo_dir => dir,
78
- :group => group_config ? File.basename(File.dirname(group_config)) : nil,
79
- :repo => repo_dir,
80
- :bucket => config["s3_bucket"],
81
- :access_id => config["access_id"],
82
- :access_secret => config["access_secret"]
83
- }.delete_if { |key,value| value.nil? }
84
- rescue Object => e
85
- puts e.inspect
86
- {}
87
- end
88
-
89
- def find_judo_dir(check)
90
- if check == "/"
91
- if File.exists?("#{ENV['HOME']}/.judo")
92
- "#{ENV['HOME']}/.judo"
93
- else
94
- nil
95
- end
96
- else
97
- File.exists?(check + "/.judo") ? check + "/.judo" : find_judo_dir(File.dirname(check))
98
- end
99
- end
100
-
101
- def read_judo_config
102
- YAML.load File.read(judo_config_file)
103
- rescue Errno::ENOENT
104
- {}
105
- end
106
-
107
- def get_sdb(aws_id, aws_key)
108
- Aws::SdbInterface.new(aws_id, aws_key, :logger => Logger.new(nil))
109
- end
110
-
111
- def sdb
112
- @sdb ||= get_sdb(access_id, access_secret)
113
- # @version_ok ||= check_version
114
- @sdb
115
- end
116
-
117
- def s3
118
- @s3 ||= Aws::S3.new(access_id, access_secret, :logger => Logger.new(nil))
119
- end
120
-
121
- def s3_bucket
122
- @s3_bucket ||= s3.bucket(judo_config["s3_bucket"])
123
- end
124
-
125
- def s3_url(k)
126
- Aws::S3Generator::Key.new(s3_bucket, k).get
127
- end
128
-
129
- def s3_put(k, file)
130
- s3_bucket.put(k, file)
131
- end
132
- end
133
- end
data/lib/judo/setup.rb DELETED
@@ -1,115 +0,0 @@
1
- module Judo
2
- class Setup
3
- def default_config
4
- <<DEFAULT
5
- {
6
- "key_name":"#{@keypair}",
7
- "instance_size":"m1.small",
8
- "ami32":"ami-bb709dd2", // public ubuntu 9.10 ami - 32 bit
9
- "ami64":"ami-55739e3c", // public ubuntu 9.10 ami - 64 bit
10
- "user":"ubuntu",
11
- "security_group":"judo",
12
- "availability_zone":"us-east-1d"
13
- }
14
- DEFAULT
15
- end
16
-
17
- def getenv(key)
18
- printf "Looking in your environment for #{key}..."
19
- printf "found!" if ENV[key]
20
- printf "\n"
21
- ENV[key]
22
- end
23
-
24
- def request(query, default = "")
25
- printf "#{query} ['#{default}']: "
26
- input = STDIN.readline.strip
27
- input.empty? and default or input
28
- end
29
-
30
- def check_setup
31
- abort "you are already inside a judo repository" if Judo::Config.find_judo_dir(Dir.pwd)
32
- abort "./.git not found - judo configurations must be kept in a git repo. type 'git init' to setup the git repo." unless File.exists? "./.git"
33
- end
34
-
35
- def init
36
- check_setup
37
- @aws_access_id ||= getenv('AWS_ACCESS_KEY_ID')
38
- @aws_access_id ||= getenv('AMAZON_ACCESS_KEY_ID')
39
- @aws_secret_key ||= getenv('AWS_SECRET_ACCESS_KEY')
40
- @aws_secret_key ||= getenv('AMAZON_SECRET_ACCESS_KEY')
41
- @s3_bucket ||= getenv('JUDO_S3_BUCKET')
42
- @s3_bucket ||= "judo_#{rand(2**64).to_s(36)}"
43
- begin
44
- @aws_access_id = request("Please enter your AWS access key", @aws_access_id)
45
- @aws_secret_key = request("Please enter your AWS secret key" , @aws_secret_key)
46
- @s3_bucket = request("Please enter an S3 bucket to use", @s3_bucket)
47
-
48
- setup_default_server_group
49
- setup_default_security_group
50
- setup_bucket
51
- setup_db
52
- setup_judo_config
53
-
54
- rescue *[Interrupt, EOFError]
55
- puts "\nGoodbye!"
56
- exit(0)
57
- rescue Object => e
58
- puts "There was an error: #{e.class}:#{e.message}"
59
- puts "Try again or hit CTRL-C"
60
- retry
61
- end
62
- end
63
-
64
- def setup_db
65
- puts "Trying to connect to SimpleDB with #{@aws_access_id}"
66
- sdb.create_domain(Judo::Server.domain)
67
- sdb.create_domain(Judo::Snapshot.domain)
68
- sdb.create_domain("judo_config")
69
- olddb = sdb.get_attributes("judo_config", "judo")[:attributes]["dbversion"]
70
- abort "There is an existing judo database of a newer version - upgrade judo and try again" if olddb and olddb.first.to_i > Judo::Config.db_version
71
- sdb.put_attributes("judo_config", "judo", { "dbversion" => Judo::Config.db_version }, :replace)
72
- end
73
-
74
- def setup_default_security_group
75
- begin
76
- ec2.create_security_group('judo', 'Judo')
77
- ec2.authorize_security_group_IP_ingress("judo", 22, 22,'tcp','0.0.0.0/0')
78
- rescue Aws::AwsError => e
79
- raise unless e.message =~ /InvalidGroup.Duplicate/
80
- end
81
- end
82
-
83
- def setup_bucket
84
- puts "setting up an s3 bucket"
85
- Aws::S3.new(@aws_access_id, @aws_secret_key, :logger => Logger.new(nil)).bucket(@s3_bucket, true)
86
- end
87
-
88
- def setup_default_server_group
89
- puts "Setting up default group and keypair"
90
- system "mkdir -p default/keypairs"
91
-
92
- @keypair = "judo#{ec2.describe_key_pairs.map { |k| k[:aws_key_name] }.map { |k| k =~ /^judo(\d*)/; $1.to_i }.sort.last.to_i + 1}"
93
- material = ec2.create_key_pair(@keypair)[:aws_material]
94
-
95
- File.open("default/keypairs/#{@keypair}.pem", 'w') { |f| f.write material }
96
- File.chmod 0600, "default/keypairs/#{@keypair}.pem"
97
- File.open("default/config.json","w") { |f| f.write default_config }
98
- end
99
-
100
- def setup_judo_config
101
- puts "setting up an .judo/config.yml"
102
- system "mkdir .judo"
103
- File.open(".judo/config.yml","w") { |f| f.write({ "access_id" => @aws_access_id, "access_secret" => @aws_secret_key, "s3_bucket" => @s3_bucket }.to_yaml) }
104
- end
105
-
106
- def ec2
107
- @ec2 ||= Judo::Config.get_ec2(@aws_access_id, @aws_secret_key)
108
- end
109
-
110
- def sdb
111
- @sdb ||= Judo::Config.get_sdb(@aws_access_id, @aws_secret_key)
112
- end
113
-
114
- end
115
- end