solutious-rudy 0.5.0 → 0.5.1
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/CHANGES.txt +36 -29
- data/README.rdoc +37 -23
- data/Rakefile +1 -2
- data/bin/ird +131 -121
- data/bin/rudy +326 -326
- data/lib/rudy.rb +1 -1
- data/lib/rudy/config.rb +1 -0
- data/lib/rudy/huxtable.rb +3 -1
- data/lib/tryouts.rb +6 -13
- data/rudy.gemspec +1 -1
- data/test/helper.rb +1 -2
- data/tryouts/session_tryout.rb +0 -2
- metadata +1 -1
data/CHANGES.txt
CHANGED
@@ -1,18 +1,25 @@
|
|
1
1
|
RUDY, CHANGES
|
2
2
|
|
3
|
-
TODO: Remove aws_sdb
|
4
3
|
|
4
|
+
#### 0.5.1 (2009-04-10) ###############################
|
5
5
|
|
6
|
-
|
6
|
+
* CHANGE: Removed require 'rubygems'
|
7
|
+
* FIXED: Resolved Drydock namespace issue for rudy and ird
|
8
|
+
|
9
|
+
|
10
|
+
#### 0.5.0 (2009-04-09) ###############################
|
11
|
+
|
12
|
+
NOTE: This is a significant re-write from 0.4
|
7
13
|
|
8
14
|
* CHANGE: Recommend keypair config to be in ~/.rudy/config
|
9
15
|
* FIX: Rudy now checks for user keys specified by env-role, env, and global
|
10
16
|
* FIX: gemspec dependency net-ssh-multi
|
11
|
-
*
|
12
|
-
*
|
13
|
-
*
|
14
|
-
*
|
15
|
-
|
17
|
+
* ADDED: --nocolor option
|
18
|
+
* ADDED: Ruby API
|
19
|
+
* ADDED: Tests with 55% coverage
|
20
|
+
* ADDED: Ruby API (Rudy::Instances, etc...)
|
21
|
+
* ADDED: ird, a REPL (experimental)
|
22
|
+
* ADDED: Now uses Rye 0.4.1
|
16
23
|
|
17
24
|
#### 0.4 (2009-03-12) ###############################
|
18
25
|
|
@@ -23,18 +30,18 @@ NOTE: This is a significant re-write from 0.3
|
|
23
30
|
* CHANGE: Moved generic EC2 commands to bin/rudy-ec2
|
24
31
|
* CHANGE: Removed ambiguity of pluralized command names.
|
25
32
|
* OLD: backups, disks, configs
|
26
|
-
*
|
27
|
-
*
|
28
|
-
*
|
29
|
-
*
|
30
|
-
*
|
31
|
-
*
|
33
|
+
* ADDED: backup, disk, config
|
34
|
+
* ADDED: ssh and scp commands for connecting to and copying files to/from machines
|
35
|
+
* ADDED: New dependencies (trying out net-ssh)
|
36
|
+
* ADDED: Domain specific language for configuration
|
37
|
+
* ADDED: "Routines" for handling common actions. Starting, stopping, releasing, deploying.
|
38
|
+
* ADDED: "rudy release" will create a release from the current working copy, start an instance,
|
32
39
|
checkout the release, run routines. It needs some work still, but this already functions as
|
33
40
|
a single command release process.
|
34
|
-
*
|
41
|
+
* ADDED: "rudy start|destroy|restart|update|status". Routines allow us to have generic commands
|
35
42
|
that can be used for any machine group. These commands relate to starting new instances.
|
36
|
-
*
|
37
|
-
*
|
43
|
+
* ADDED: Extra caution when running destructive commands
|
44
|
+
* ADDED: Default ~/.rudy/config created if it doesn't exist.
|
38
45
|
|
39
46
|
|
40
47
|
#### 0.3 (2009-02-26) ###############################
|
@@ -43,9 +50,9 @@ NOTE: This is a significant re-write from 0.2
|
|
43
50
|
|
44
51
|
* CHANGE: Re-written support/rudy-ec2-startup
|
45
52
|
* CHANGE: upgrade to Drydock 0.4
|
46
|
-
*
|
47
|
-
*
|
48
|
-
*
|
53
|
+
* ADDED: More functionality for disks and backups
|
54
|
+
* ADDED: config commands
|
55
|
+
* ADDED: Per machine configuration (via ~/.rudy)
|
49
56
|
|
50
57
|
|
51
58
|
#### 0.2 (2009-02-23) ###############################
|
@@ -54,18 +61,18 @@ NOTE: This is a complete re-write from 0.1
|
|
54
61
|
|
55
62
|
* CHANGE: Added Environment variables
|
56
63
|
* CHANGE: upgrade to drydock 0.3.3
|
57
|
-
*
|
58
|
-
*
|
64
|
+
* ADDED: All time references are converted to UTC
|
65
|
+
* ADDED: Safer "Are you sure?". Number of characters to enter is
|
59
66
|
commiserate with amount of danger.
|
60
|
-
*
|
67
|
+
* ADDED: CLIs: myaddress, addresses, images, instances,
|
61
68
|
disks, connect, copy, stage, backups, volumes
|
62
|
-
*
|
63
|
-
*
|
64
|
-
*
|
65
|
-
*
|
66
|
-
*
|
67
|
-
*
|
68
|
-
*
|
69
|
+
* ADDED: Metadata storage to SimpleDB for disks, backups
|
70
|
+
* ADDED: Creates EBS volumes based on startup from metadata
|
71
|
+
* ADDED: Automated release process
|
72
|
+
* ADDED: Automated creation of machine images
|
73
|
+
* ADDED: Partial support for regions and zones
|
74
|
+
* ADDED: Manage system based on security groups.
|
75
|
+
* ADDED: "rudy groups" overhaul. Display, creates, destroys groups.
|
69
76
|
|
70
77
|
|
71
78
|
|
data/README.rdoc
CHANGED
@@ -4,27 +4,37 @@ Rudy is a development and deployment tool for Amazon EC2. It's both a command-li
|
|
4
4
|
|
5
5
|
$ rudy group --create
|
6
6
|
|
7
|
+
OR
|
8
|
+
|
7
9
|
rgroup = Rudy::Groups.new
|
8
10
|
rgroup.create
|
9
11
|
|
10
|
-
Rudy is a bit different from other EC2 libraries in several ways.
|
11
|
-
|
12
12
|
|
13
13
|
== Installation
|
14
14
|
|
15
|
-
Step 1 (
|
15
|
+
=== Step 1 (get Rudy on to your machine):
|
16
|
+
|
17
|
+
Via Rubygems, one of:
|
18
|
+
|
19
|
+
$ sudo gem install rudy
|
20
|
+
$ sudo gem install solutious-rudy --source http://gems.github.com/
|
21
|
+
|
22
|
+
Via GitHub:
|
23
|
+
$ git clone git://github.com/solutious/rudy.git
|
16
24
|
|
17
|
-
|
18
|
-
|
19
|
-
|
25
|
+
Via download:
|
26
|
+
* rudy-0.5.1.tar.gz[http://github.com/solutious/rudy/tarball/rudy-0.5.1]
|
27
|
+
* rudy-0.5.1.zip[http://github.com/solutious/rudy/zipball/rudy-0.5.1]
|
20
28
|
|
21
|
-
|
29
|
+
NOTE: If your are not installing via RubyGems, you will need to make sure the Ruby dependencies (see below) are installed and in your LOAD_PATH.
|
30
|
+
|
31
|
+
=== Step 2 (initialize your configuration):
|
22
32
|
|
23
33
|
$ rudy generate-config
|
24
34
|
[modify ~/.rudy/config]
|
25
35
|
$ rudy init
|
26
36
|
|
27
|
-
Step 3 (
|
37
|
+
=== Step 3 (start working with EC2):
|
28
38
|
|
29
39
|
$ rudy group --create
|
30
40
|
$ rudy keypair --create
|
@@ -33,22 +43,25 @@ Step 3 (get to work with EC2):
|
|
33
43
|
|
34
44
|
== Dependencies:
|
35
45
|
|
36
|
-
* OpenSSH
|
37
|
-
* Net::SSH
|
38
|
-
* Net::SCP
|
39
|
-
* amazon-ec2
|
40
|
-
* aws_sdb
|
41
|
-
* Drydock
|
42
|
-
* Caesars
|
43
|
-
* Rye
|
46
|
+
* OpenSSH[http://www.openssh.com/]
|
47
|
+
* Net::SSH[http://net-ssh.rubyforge.org/]
|
48
|
+
* Net::SCP[http://net-ssh.rubyforge.org/]
|
49
|
+
* amazon-ec2[http://github.com/grempe/amazon-ec2]
|
50
|
+
* aws_sdb[http://rubyforge.org/projects/aws-sdb/]
|
51
|
+
* Drydock[http://github.com/delano/drydock]
|
52
|
+
* Caesars[http://github.com/delano/caesars]
|
53
|
+
* Rye[http://github.com/delano/rye]
|
44
54
|
|
45
55
|
|
46
56
|
== Common Errors
|
47
57
|
|
48
|
-
*
|
58
|
+
* <tt>`require': no such file to load -- amazon-ec2 (LoadError)</tt>
|
59
|
+
* You're probably running a mix of Rubygem and non-Rubygem libraries. Ryan Tomayko has you covered: http://gist.github.com/54177
|
60
|
+
|
61
|
+
* <tt>The request signature we calculated does not match the signature you provided.</tt>
|
49
62
|
* Check that your Amazon Web Service access key and secret key are correct
|
50
63
|
|
51
|
-
*
|
64
|
+
* <tt>AWS was not able to validate the provided access credentials</tt>
|
52
65
|
* If it's a new Amazon Accounts, you need to sign up for EC2, SDB, and S3.
|
53
66
|
|
54
67
|
|
@@ -58,11 +71,6 @@ Step 3 (get to work with EC2):
|
|
58
71
|
* RubyForge[http://rubyforge.org/projects/rudy]
|
59
72
|
* Inspiration[http://www.youtube.com/watch?v=CgaiIW5Rzes]
|
60
73
|
|
61
|
-
== Credits
|
62
|
-
|
63
|
-
* Delano Mandelbaum (delano@solutious.com)
|
64
|
-
* Keshia Knight Pulliam (rudy@solutious.com)
|
65
|
-
|
66
74
|
|
67
75
|
== Thanks
|
68
76
|
|
@@ -72,6 +80,12 @@ Step 3 (get to work with EC2):
|
|
72
80
|
* Caleb Buxton
|
73
81
|
* Colin Brumelle
|
74
82
|
|
83
|
+
|
84
|
+
== Credits
|
85
|
+
|
86
|
+
* Delano Mandelbaum (delano@solutious.com)
|
87
|
+
* Keshia Knight Pulliam (rudy@solutious.com)
|
88
|
+
|
75
89
|
== License
|
76
90
|
|
77
91
|
See: LICENSE.txt
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
require 'rake/clean'
|
3
3
|
require 'rake/gempackagetask'
|
4
4
|
require 'hanna/rdoctask'
|
@@ -76,7 +76,6 @@ namespace :shoulda do
|
|
76
76
|
$LOAD_PATH.unshift("test")
|
77
77
|
|
78
78
|
require 'test/unit'
|
79
|
-
require 'rubygems'
|
80
79
|
require 'active_support'
|
81
80
|
|
82
81
|
# bug in test unit. Set to true to stop from running.
|
data/bin/ird
CHANGED
@@ -9,8 +9,6 @@
|
|
9
9
|
|
10
10
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') # Put our local lib in first place
|
11
11
|
|
12
|
-
require 'rubygems' unless defined?(Gem)
|
13
|
-
|
14
12
|
# SEE: http://github.com/rubyspec/matzruby/blob/a34130eb7c4ecc164115a59aa1b76c643bd98202/lib/irb/xmp.rb
|
15
13
|
# SEE: http://github.com/blackwinter/wirble/tree/master
|
16
14
|
require "irb"
|
@@ -20,142 +18,154 @@ require 'rudy'
|
|
20
18
|
require 'drydock'
|
21
19
|
require 'rudy/cli'
|
22
20
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
global :
|
31
|
-
global :
|
32
|
-
global :
|
33
|
-
global :
|
34
|
-
global :
|
35
|
-
global :
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
#
|
40
|
-
#
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
21
|
+
|
22
|
+
module CLI
|
23
|
+
extend self
|
24
|
+
extend Drydock
|
25
|
+
include Readline
|
26
|
+
|
27
|
+
global :A, :accesskey, String, "AWS Access Key"
|
28
|
+
global :S, :secretkey, String, "AWS Secret Access Key"
|
29
|
+
#global :R, :region, String, "Connect to a specific EC2 region (ie: #{Rudy::DEFAULT_REGION})"
|
30
|
+
#global :n, :nocolor, "Disable output colors"
|
31
|
+
global :f, :config, String, "Specify another configuration file to read (ie: #{Rudy::RUDY_CONFIG_FILE})"
|
32
|
+
global :z, :zone, String, "Connect to a specific EC2 zone (ie: #{Rudy::DEFAULT_ZONE})"
|
33
|
+
global :e, :environment, String, "Connect to the specified environment (ie: #{Rudy::DEFAULT_ENVIRONMENT})"
|
34
|
+
global :r, :role, String, "Connect to a machine with the specified role (ie: #{Rudy::DEFAULT_ROLE})"
|
35
|
+
global :p, :position, String, "Position in the machine in its group (ie: #{Rudy::DEFAULT_POSITION})"
|
36
|
+
global :u, :user, String, "Provide a username (ie: #{Rudy::DEFAULT_USER})"
|
37
|
+
#global :q, :quiet, "Run with less output"
|
38
|
+
#global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
|
39
|
+
# @verbose ||= 0
|
40
|
+
# @verbose += 1
|
41
|
+
#end
|
42
|
+
global :V, :version, "Display version number" do
|
43
|
+
puts "Rudy version: #{Rudy::VERSION}"
|
44
|
+
exit 0
|
45
|
+
end
|
45
46
|
|
46
47
|
|
47
|
-
default :interactive
|
48
|
-
debug :
|
49
|
-
desc "An interactive REPL for Rudy."
|
50
|
-
usage "#{$0} [global options]"
|
51
|
-
command :interactive do |obj|
|
48
|
+
default :interactive
|
49
|
+
debug :on
|
50
|
+
desc "An interactive REPL for Rudy."
|
51
|
+
usage "#{$0} [global options]"
|
52
|
+
command :interactive do |obj|
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
@@rmach = Rudy::Instances.new(:global => obj.global)
|
55
|
+
@@rkey = Rudy::KeyPairs.new(:global => obj.global)
|
56
|
+
@@rgrp = Rudy::Groups.new(:global => obj.global)
|
57
|
+
@@rvol = Rudy::Volumes.new(:global => obj.global)
|
58
|
+
@@radd = Rudy::Addresses.new(:global => obj.global)
|
58
59
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
60
|
+
puts Rudy::CLI.generate_header(@@rmach.global, @@rmach.config)
|
61
|
+
puts Rudy::Utils.without_indent(%Q`
|
62
|
+
------------------------------------------------------------
|
63
|
+
Welcome Interactive Rudy! (EXPERIMENTAL)
|
64
|
+
------------------------------------------------------------
|
64
65
|
|
65
|
-
|
66
|
-
|
66
|
+
`)
|
67
|
+
h
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
IRB.start(__FILE__)
|
72
|
-
else
|
73
|
-
# check -e option
|
74
|
-
if /^-e$/ =~ $0
|
69
|
+
# What's the deal with this error message when defining a help method?
|
70
|
+
# => rb: warn: can't alias help from irb_help
|
71
|
+
if __FILE__ == $0
|
75
72
|
IRB.start(__FILE__)
|
76
73
|
else
|
77
|
-
|
74
|
+
# check -e option
|
75
|
+
if /^-e$/ =~ $0
|
76
|
+
IRB.start(__FILE__)
|
77
|
+
else
|
78
|
+
IRB.start(__FILE__)
|
79
|
+
end
|
78
80
|
end
|
81
|
+
|
79
82
|
end
|
80
83
|
|
81
|
-
end
|
82
|
-
|
83
|
-
def h;
|
84
|
-
puts (%Q`
|
85
|
-
HELP
|
86
84
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
Start an EC2 instance from scratch.
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
>> m.create
|
112
|
-
Instance: i-228def51
|
113
|
-
Waiting for the instance to startup
|
114
|
-
........It's up!
|
115
|
-
|
116
|
-
# Login to the new instance
|
117
|
-
>> ssh
|
118
|
-
|
119
|
-
All commands in Rudy refer to the global defaults unless
|
120
|
-
otherwise specified. "stage" is the default environment and
|
121
|
-
"app" is the default role. You can change these with command
|
122
|
-
line arguments or by modifying the defaults in your Rudy
|
123
|
-
config file: #{@rmach.config_dirname}
|
124
|
-
|
125
|
-
You can also specify your own names by providing
|
126
|
-
one as the first argument: g.create 'group5000'.
|
127
|
-
|
128
|
-
# List instances in stage-app
|
129
|
-
>> m.list :running
|
130
|
-
=> [#<Rudy::AWS::EC2::Instance:0x18c5888 ...>]
|
131
|
-
|
132
|
-
# Print the instance in a human readable way
|
133
|
-
>> puts m.list.first.to_s
|
134
|
-
|
135
|
-
# Print instance system console output
|
136
|
-
>> puts m.console
|
137
|
-
|
138
|
-
# Destroy ALL INSTANCES in stage-app
|
139
|
-
>> m.destroy
|
140
|
-
`)
|
141
|
-
end
|
85
|
+
|
86
|
+
|
87
|
+
def h;
|
88
|
+
puts (%Q`
|
89
|
+
HELP
|
90
|
+
|
91
|
+
h Help (this screen)
|
92
|
+
m Rudy::Machines instance
|
93
|
+
g Rudy::Groups instance
|
94
|
+
k Rudy::KeyPairs instance
|
95
|
+
v Rudy::Volumes instance
|
96
|
+
a Rudy::Addresses instance
|
97
|
+
ssh [GROUP] Connect to a machine
|
98
|
+
example Start an EC2 instance from scratch.
|
99
|
+
`)
|
100
|
+
end
|
101
|
+
def example
|
102
|
+
puts (%Q`
|
103
|
+
EXAMPLE
|
104
|
+
Start an EC2 instance from scratch.
|
105
|
+
|
106
|
+
# Create a security group
|
107
|
+
>> g.create
|
108
|
+
=> #<Rudy::AWS::EC2::Group @name="stage-app" ...>
|
142
109
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
def v; @rvol; end
|
147
|
-
def a; @radd; end
|
110
|
+
# Create a keypair (used to login as root)
|
111
|
+
>> k.create
|
112
|
+
=> #<Rudy::AWS::EC2::KeyPair @name="key-stage-app" ...>
|
148
113
|
|
149
|
-
#
|
150
|
-
|
114
|
+
# Start an EC2 machine instance:
|
115
|
+
>> m.create
|
116
|
+
Instance: i-228def51
|
117
|
+
Waiting for the instance to startup
|
118
|
+
........It's up!
|
151
119
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
120
|
+
# Login to the new instance
|
121
|
+
>> ssh
|
122
|
+
|
123
|
+
All commands in Rudy refer to the global defaults unless
|
124
|
+
otherwise specified. "stage" is the default environment and
|
125
|
+
"app" is the default role. You can change these with command
|
126
|
+
line arguments or by modifying the defaults in your Rudy
|
127
|
+
config file: #{@@rmach.config_dirname}
|
128
|
+
|
129
|
+
You can also specify your own names by providing
|
130
|
+
one as the first argument: g.create 'group5000'.
|
131
|
+
|
132
|
+
# List instances in stage-app
|
133
|
+
>> m.list :running
|
134
|
+
=> [#<Rudy::AWS::EC2::Instance:0x18c5888 ...>]
|
135
|
+
|
136
|
+
# Print the instance in a human readable way
|
137
|
+
>> puts m.list.first.to_s
|
138
|
+
|
139
|
+
# Print instance system console output
|
140
|
+
>> puts m.console
|
141
|
+
|
142
|
+
# Destroy ALL INSTANCES in stage-app
|
143
|
+
>> m.destroy
|
144
|
+
`)
|
145
|
+
end
|
146
|
+
|
147
|
+
def m; @@rmach; end
|
148
|
+
def k; @@rkey; end
|
149
|
+
def g; @@rgrp; end
|
150
|
+
def v; @@rvol; end
|
151
|
+
def a; @@radd; end
|
152
|
+
|
153
|
+
# Change Group
|
154
|
+
#def cg(name); end
|
155
|
+
|
156
|
+
def ssh(*args)
|
157
|
+
@@rmach.switch_user :root
|
158
|
+
@@rmach.connect(*args)
|
159
|
+
@@rmach.switch_user # back to previous user
|
160
|
+
nil
|
161
|
+
end
|
162
|
+
|
163
|
+
|
157
164
|
end
|
158
165
|
|
166
|
+
include CLI # So we don't have to say CLI.example in the REPL.
|
167
|
+
|
168
|
+
|
159
169
|
__END__
|
160
170
|
#@rbox = Rye::Box.new('ec2-174-129-173-3.compute-1.amazonaws.com', 'root')
|
161
171
|
#@rbox2 = Rye::Box.new('ec2-174-129-173-3.compute-1.amazonaws.com', 'root')
|
data/bin/rudy
CHANGED
@@ -9,12 +9,10 @@
|
|
9
9
|
|
10
10
|
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib') # Put our local lib in first place
|
11
11
|
|
12
|
-
require 'rubygems' unless defined? Gem
|
13
12
|
require 'date'
|
14
13
|
require 'drydock'
|
15
14
|
require 'rudy'
|
16
15
|
require 'rudy/cli'
|
17
|
-
extend Drydock
|
18
16
|
|
19
17
|
# Is there a bug in Ruby 1.9 open-uri?
|
20
18
|
#$ /usr/local/bin/ruby bin/rudy myaddress
|
@@ -22,348 +20,350 @@ extend Drydock
|
|
22
20
|
#$SAFE = 2
|
23
21
|
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
global :
|
30
|
-
global :
|
31
|
-
global :
|
32
|
-
global :
|
33
|
-
global :
|
34
|
-
global :
|
35
|
-
global :
|
36
|
-
global :
|
37
|
-
global :
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
23
|
+
module RudyCLI
|
24
|
+
extend Drydock
|
25
|
+
|
26
|
+
global :A, :accesskey, String, "AWS Access Key"
|
27
|
+
global :S, :secretkey, String, "AWS Secret Access Key"
|
28
|
+
#global :R, :region, String, "Connect to a specific EC2 region (ie: #{Rudy::DEFAULT_REGION})"
|
29
|
+
global :n, :nocolor, "Disable output colors"
|
30
|
+
global :f, :config, String, "Specify another configuration file to read (ie: #{Rudy::RUDY_CONFIG_FILE})"
|
31
|
+
global :z, :zone, String, "Connect to a specific EC2 zone (ie: #{Rudy::DEFAULT_ZONE})"
|
32
|
+
global :e, :environment, String, "Connect to the specified environment (ie: #{Rudy::DEFAULT_ENVIRONMENT})"
|
33
|
+
global :r, :role, String, "Connect to a machine with the specified role (ie: #{Rudy::DEFAULT_ROLE})"
|
34
|
+
global :p, :position, String, "Position in the machine in its group (ie: #{Rudy::DEFAULT_POSITION})"
|
35
|
+
global :u, :user, String, "Provide a username (ie: #{Rudy::DEFAULT_USER})"
|
36
|
+
global :q, :quiet, "Run with less output"
|
37
|
+
global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
|
38
|
+
@verbose ||= 0
|
39
|
+
@verbose += 1
|
40
|
+
end
|
41
|
+
global :V, :version, "Display version number" do
|
42
|
+
puts "Rudy version: #{Rudy::VERSION}"
|
43
|
+
exit 0
|
44
|
+
end
|
45
45
|
|
46
46
|
|
47
|
-
# --------------------------------- RUDY MACHINE COMMANDS --------
|
48
|
-
# ------------------------------------------------------------------
|
49
|
-
|
50
|
-
|
51
|
-
desc "Machine Status"
|
52
|
-
usage "rudy [global options] status [-g group-name] [-s state] [--all] [instance-ID]"
|
53
|
-
option :g, :group, String, "A security group name"
|
54
|
-
option :s, :state, String, "Machine state. One of: running (default), pending, terminated"
|
55
|
-
option :l, :all, "Show all machines in this group, regardless of state."
|
56
|
-
argv :awsid
|
57
|
-
command :status => Rudy::CLI::Instances
|
58
|
-
|
59
|
-
usage "rudy [global options] connect [-g group-name] [-i instance-ID] [cmd]"
|
60
|
-
desc "Open an SSH connection"
|
61
|
-
option :print, "Only print the SSH command, don't connect"
|
62
|
-
option :g, :group, String, "A security group name"
|
63
|
-
option :i, :awsid, String, "An instance ID"
|
64
|
-
argv :cmd
|
65
|
-
command :connect => Rudy::CLI::Instances
|
66
|
-
command_alias :connect, :ssh
|
67
|
-
|
68
|
-
usage "rudy [global options] copy [-p] [-r] source target"
|
69
|
-
desc "Copy files to or from machines. NOTE: You must use quotes when using a tilda for your remote dir ('~/')."
|
70
|
-
option :r, :recursive, "Recursively copy entire directories"
|
71
|
-
option :p, :preserve, "Preserve atimes and ctimes."
|
72
|
-
option :d, :download, "Download FROM the remote machine to the local machine"
|
73
|
-
option :print, "Only print the SSH command, don't connect"
|
74
|
-
option :g, :group, String, "A security group name"
|
75
|
-
option :i, :awsid, String, "An instance ID"
|
76
|
-
command :copy => Rudy::CLI::Instances
|
77
|
-
command_alias :copy, :scp
|
78
|
-
command_alias :copy, :upload
|
79
|
-
command_alias :copy, :download
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
# ----------------------------------- AMAZON EC2 COMMANDS --------
|
84
|
-
# ------------------------------------------------------------------
|
85
|
-
|
86
|
-
usage "rudy [global options] addresses [-A address instance ID]"
|
87
|
-
desc "Manage Amazon Elastic IP addresses"
|
88
|
-
argv :ipaddress, :instid
|
89
|
-
action :A, :associate, "Associate an IP address to a running instance"
|
90
|
-
action :C, :create, "Create an IP address"
|
91
|
-
action :D, :destroy, "Destroy an IP address"
|
92
|
-
command :addresses => Rudy::CLI::Addresses
|
93
|
-
command_alias :addresses, :address
|
94
|
-
|
95
|
-
usage "rudy [global options] groups [-C -R -A] [-a IP addresses] [-p ports] [group name]"
|
96
|
-
usage "rudy groups -C (create a group)"
|
97
|
-
usage "rudy -e prod groups (list groups in the prod environment)"
|
98
|
-
usage "rudy groups -A -p 81,82,83 (open ports to a group from this machine)"
|
99
|
-
desc "Manage EC2 Security Groups"
|
100
|
-
option :all, "Display all security groups"
|
101
|
-
option :r, :protocols, Array, "Comma-separated list of protocols. One of: tcp (default), udp, icmp"
|
102
|
-
option :p, :ports, Array, "List of comma-separated port ranges in the form FROM:TO (default: 22,80,443)"
|
103
|
-
option :a, :addresses, Array, "List of comma-separated IP addresses (default: your current external IP)"
|
104
|
-
option :g, :group, String, "A group name to authorize or revoke network rule. Must also supply -o!"
|
105
|
-
option :o, :owner, String, "A group owner ID (account number). Must also supply -g!"
|
106
|
-
action :C, :create, "Create a security group"
|
107
|
-
action :D, :destroy, "Destroy a security group"
|
108
|
-
action :A, :authorize, "Authorize a rule for a security group"
|
109
|
-
action :R, :revoke, "Revoke a rule for a security group"
|
110
|
-
argv :name
|
111
|
-
command :group => Rudy::CLI::Groups
|
112
|
-
command_alias :group, :groups
|
113
|
-
|
114
|
-
desc "Manage EC2 Volumes"
|
115
|
-
usage "rudy volumes"
|
116
|
-
usage "rudy volume -C -s size [-d device-path]"
|
117
|
-
usage "rudy volume -A volume-id instance-id"
|
118
|
-
usage "rudy volume -N volume-id"
|
119
|
-
usage "rudy volume -D volume-id"
|
120
|
-
option :s, :size, String, "Size (in GB)"
|
121
|
-
option :d, :device, String, "Device path (default: /dev/sdh)"
|
122
|
-
action :D, :destroy, "Destroy a volume"
|
123
|
-
action :C, :create, "Create a volume"
|
124
|
-
action :A, :attach, "Attach a volume to a running instance"
|
125
|
-
action :N, :detach, "Detach a volume from an instance"
|
126
|
-
argv :volid, :insid
|
127
|
-
command :volume => Rudy::CLI::Volumes
|
128
|
-
command_alias :volume, :volumes
|
129
|
-
|
130
|
-
desc "Manage KeyPairs"
|
131
|
-
usage "rudy keypairs [-C] [-D] [name]"
|
132
|
-
action :D, :destroy, "Destroy KeyPair"
|
133
|
-
action :C, :create, "Create KeyPair"
|
134
|
-
argv :kpname
|
135
|
-
command :keypair => Rudy::CLI::KeyPairs
|
136
|
-
command_alias :keypair, :keypairs
|
137
|
-
|
138
|
-
usage "rudy console [-g group] [instance ID]"
|
139
|
-
desc "Displays system console output for given instance(s)"
|
140
|
-
option :g, :group, String, "A group name to authorize or revoke network rule. Must also supply -o!"
|
141
|
-
argv :awsid
|
142
|
-
command :console => Rudy::CLI::Instances
|
143
|
-
|
144
|
-
desc "Manage Machines"
|
145
|
-
usage "rudy [global options] machines [-g group-name] [-s state] [instance-ID]"
|
146
|
-
option :g, :group, String, "The security group name"
|
147
|
-
option :i, :ami, String, "The machine image ID (ami-)"
|
148
|
-
option :t, :itype, String, "The instance type (default: m1.small)"
|
149
|
-
option :k, :keypair, String, "The SSH keypair to use for launch"
|
150
|
-
option :a, :address, String, "The IP address to associate"
|
151
|
-
action :C, :create, "Create a machine instance"
|
152
|
-
action :D, :destroy, "Destroy a machine instance"
|
153
|
-
argv :awsid
|
154
|
-
command :instance => Rudy::CLI::Instances
|
155
|
-
command_alias :instance, :instances
|
156
|
-
|
157
|
-
#usage "rudy images [-C -i name [-b bucket -a account]] [-D AMI-ID]"
|
158
|
-
#desc "Manage EC2 Machine Images (AMIs)"
|
159
|
-
#option :a, :account, String, "Your Amazon Account Number"
|
160
|
-
#option :i, :image_name, String, "The name of the image" # TODO: change to --ami
|
161
|
-
#option :p, :print, "Print-only (don't execute commands)"
|
162
|
-
#option :b, :bucket_name, String, "The name of the bucket that will store the image"
|
163
|
-
#action :C, :create, "Create an image"
|
164
|
-
##action :P, :prepare, "Prepare a running instance to be used as an image"
|
165
|
-
#action :D, :destroy, "Deregister an image (currently _does not_ remove images files from S3)"
|
166
|
-
#argv :ami
|
167
|
-
#command :images => Rudy::CLI::Images
|
168
|
-
#command_alias :images, :image
|
169
|
-
|
170
|
-
|
171
|
-
# -------------------------------- MISCELLANEOUS COMMANDS --------
|
172
|
-
# ------------------------------------------------------------------
|
173
|
-
|
174
|
-
usage "rudy [-f config-file] config [param-name]"
|
175
|
-
desc "Check Rudy configuration."
|
176
|
-
option :l, :all, "Display configs for all machines"
|
177
|
-
option :d, :defaults, "Display the default value for the supplied parameter"
|
178
|
-
option :g, :group, String, "Display configuration for a specific group"
|
179
|
-
argv :name
|
180
|
-
command :config => Rudy::CLI::Config
|
181
|
-
|
182
|
-
usage "rudy myaddress [-i] [-e]"
|
183
|
-
desc "Displays you current internal and external IP addresses"
|
184
|
-
option :e, :external, "Display only external IP address"
|
185
|
-
option :i, :internal, "Display only internal IP address"
|
186
|
-
command :myaddress do |obj|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
47
|
+
# --------------------------------- RUDY MACHINE COMMANDS --------
|
48
|
+
# ------------------------------------------------------------------
|
49
|
+
|
50
|
+
|
51
|
+
desc "Machine Status"
|
52
|
+
usage "rudy [global options] status [-g group-name] [-s state] [--all] [instance-ID]"
|
53
|
+
option :g, :group, String, "A security group name"
|
54
|
+
option :s, :state, String, "Machine state. One of: running (default), pending, terminated"
|
55
|
+
option :l, :all, "Show all machines in this group, regardless of state."
|
56
|
+
argv :awsid
|
57
|
+
command :status => Rudy::CLI::Instances
|
58
|
+
|
59
|
+
usage "rudy [global options] connect [-g group-name] [-i instance-ID] [cmd]"
|
60
|
+
desc "Open an SSH connection"
|
61
|
+
option :print, "Only print the SSH command, don't connect"
|
62
|
+
option :g, :group, String, "A security group name"
|
63
|
+
option :i, :awsid, String, "An instance ID"
|
64
|
+
argv :cmd
|
65
|
+
command :connect => Rudy::CLI::Instances
|
66
|
+
command_alias :connect, :ssh
|
67
|
+
|
68
|
+
usage "rudy [global options] copy [-p] [-r] source target"
|
69
|
+
desc "Copy files to or from machines. NOTE: You must use quotes when using a tilda for your remote dir ('~/')."
|
70
|
+
option :r, :recursive, "Recursively copy entire directories"
|
71
|
+
option :p, :preserve, "Preserve atimes and ctimes."
|
72
|
+
option :d, :download, "Download FROM the remote machine to the local machine"
|
73
|
+
option :print, "Only print the SSH command, don't connect"
|
74
|
+
option :g, :group, String, "A security group name"
|
75
|
+
option :i, :awsid, String, "An instance ID"
|
76
|
+
command :copy => Rudy::CLI::Instances
|
77
|
+
command_alias :copy, :scp
|
78
|
+
command_alias :copy, :upload
|
79
|
+
command_alias :copy, :download
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
# ----------------------------------- AMAZON EC2 COMMANDS --------
|
84
|
+
# ------------------------------------------------------------------
|
85
|
+
|
86
|
+
usage "rudy [global options] addresses [-A address instance ID]"
|
87
|
+
desc "Manage Amazon Elastic IP addresses"
|
88
|
+
argv :ipaddress, :instid
|
89
|
+
action :A, :associate, "Associate an IP address to a running instance"
|
90
|
+
action :C, :create, "Create an IP address"
|
91
|
+
action :D, :destroy, "Destroy an IP address"
|
92
|
+
command :addresses => Rudy::CLI::Addresses
|
93
|
+
command_alias :addresses, :address
|
94
|
+
|
95
|
+
usage "rudy [global options] groups [-C -R -A] [-a IP addresses] [-p ports] [group name]"
|
96
|
+
usage "rudy groups -C (create a group)"
|
97
|
+
usage "rudy -e prod groups (list groups in the prod environment)"
|
98
|
+
usage "rudy groups -A -p 81,82,83 (open ports to a group from this machine)"
|
99
|
+
desc "Manage EC2 Security Groups"
|
100
|
+
option :all, "Display all security groups"
|
101
|
+
option :r, :protocols, Array, "Comma-separated list of protocols. One of: tcp (default), udp, icmp"
|
102
|
+
option :p, :ports, Array, "List of comma-separated port ranges in the form FROM:TO (default: 22,80,443)"
|
103
|
+
option :a, :addresses, Array, "List of comma-separated IP addresses (default: your current external IP)"
|
104
|
+
option :g, :group, String, "A group name to authorize or revoke network rule. Must also supply -o!"
|
105
|
+
option :o, :owner, String, "A group owner ID (account number). Must also supply -g!"
|
106
|
+
action :C, :create, "Create a security group"
|
107
|
+
action :D, :destroy, "Destroy a security group"
|
108
|
+
action :A, :authorize, "Authorize a rule for a security group"
|
109
|
+
action :R, :revoke, "Revoke a rule for a security group"
|
110
|
+
argv :name
|
111
|
+
command :group => Rudy::CLI::Groups
|
112
|
+
command_alias :group, :groups
|
113
|
+
|
114
|
+
desc "Manage EC2 Volumes"
|
115
|
+
usage "rudy volumes"
|
116
|
+
usage "rudy volume -C -s size [-d device-path]"
|
117
|
+
usage "rudy volume -A volume-id instance-id"
|
118
|
+
usage "rudy volume -N volume-id"
|
119
|
+
usage "rudy volume -D volume-id"
|
120
|
+
option :s, :size, String, "Size (in GB)"
|
121
|
+
option :d, :device, String, "Device path (default: /dev/sdh)"
|
122
|
+
action :D, :destroy, "Destroy a volume"
|
123
|
+
action :C, :create, "Create a volume"
|
124
|
+
action :A, :attach, "Attach a volume to a running instance"
|
125
|
+
action :N, :detach, "Detach a volume from an instance"
|
126
|
+
argv :volid, :insid
|
127
|
+
command :volume => Rudy::CLI::Volumes
|
128
|
+
command_alias :volume, :volumes
|
129
|
+
|
130
|
+
desc "Manage KeyPairs"
|
131
|
+
usage "rudy keypairs [-C] [-D] [name]"
|
132
|
+
action :D, :destroy, "Destroy KeyPair"
|
133
|
+
action :C, :create, "Create KeyPair"
|
134
|
+
argv :kpname
|
135
|
+
command :keypair => Rudy::CLI::KeyPairs
|
136
|
+
command_alias :keypair, :keypairs
|
137
|
+
|
138
|
+
usage "rudy console [-g group] [instance ID]"
|
139
|
+
desc "Displays system console output for given instance(s)"
|
140
|
+
option :g, :group, String, "A group name to authorize or revoke network rule. Must also supply -o!"
|
141
|
+
argv :awsid
|
142
|
+
command :console => Rudy::CLI::Instances
|
143
|
+
|
144
|
+
desc "Manage Machines"
|
145
|
+
usage "rudy [global options] machines [-g group-name] [-s state] [instance-ID]"
|
146
|
+
option :g, :group, String, "The security group name"
|
147
|
+
option :i, :ami, String, "The machine image ID (ami-)"
|
148
|
+
option :t, :itype, String, "The instance type (default: m1.small)"
|
149
|
+
option :k, :keypair, String, "The SSH keypair to use for launch"
|
150
|
+
option :a, :address, String, "The IP address to associate"
|
151
|
+
action :C, :create, "Create a machine instance"
|
152
|
+
action :D, :destroy, "Destroy a machine instance"
|
153
|
+
argv :awsid
|
154
|
+
command :instance => Rudy::CLI::Instances
|
155
|
+
command_alias :instance, :instances
|
156
|
+
|
157
|
+
#usage "rudy images [-C -i name [-b bucket -a account]] [-D AMI-ID]"
|
158
|
+
#desc "Manage EC2 Machine Images (AMIs)"
|
159
|
+
#option :a, :account, String, "Your Amazon Account Number"
|
160
|
+
#option :i, :image_name, String, "The name of the image" # TODO: change to --ami
|
161
|
+
#option :p, :print, "Print-only (don't execute commands)"
|
162
|
+
#option :b, :bucket_name, String, "The name of the bucket that will store the image"
|
163
|
+
#action :C, :create, "Create an image"
|
164
|
+
##action :P, :prepare, "Prepare a running instance to be used as an image"
|
165
|
+
#action :D, :destroy, "Deregister an image (currently _does not_ remove images files from S3)"
|
166
|
+
#argv :ami
|
167
|
+
#command :images => Rudy::CLI::Images
|
168
|
+
#command_alias :images, :image
|
169
|
+
|
170
|
+
|
171
|
+
# -------------------------------- MISCELLANEOUS COMMANDS --------
|
172
|
+
# ------------------------------------------------------------------
|
173
|
+
|
174
|
+
usage "rudy [-f config-file] config [param-name]"
|
175
|
+
desc "Check Rudy configuration."
|
176
|
+
option :l, :all, "Display configs for all machines"
|
177
|
+
option :d, :defaults, "Display the default value for the supplied parameter"
|
178
|
+
option :g, :group, String, "Display configuration for a specific group"
|
179
|
+
argv :name
|
180
|
+
command :config => Rudy::CLI::Config
|
181
|
+
|
182
|
+
usage "rudy myaddress [-i] [-e]"
|
183
|
+
desc "Displays you current internal and external IP addresses"
|
184
|
+
option :e, :external, "Display only external IP address"
|
185
|
+
option :i, :internal, "Display only internal IP address"
|
186
|
+
command :myaddress do |obj|
|
187
|
+
ea = Rudy::Utils::external_ip_address || ''
|
188
|
+
ia = Rudy::Utils::internal_ip_address || ''
|
189
|
+
if obj.global.quiet
|
190
|
+
puts ia unless obj.option.external && !obj.option.internal
|
191
|
+
puts ea unless obj.option.internal && !obj.option.external
|
192
|
+
else
|
193
|
+
puts "%10s: %s" % ['Internal', ia] unless obj.option.external && !obj.option.internal
|
194
|
+
puts "%10s: %s" % ['External', ea] unless obj.option.internal && !obj.option.external
|
195
|
+
end
|
195
196
|
end
|
196
|
-
end
|
197
197
|
|
198
|
-
usage "rudy [global options] annoy [-h -m -l] [-e]"
|
199
|
-
desc "Play around with Rudy's annoying challenges"
|
200
|
-
option :s, :string, "A numeric challenge"
|
201
|
-
option :n, :numeric, "A numeric challenge"
|
202
|
-
option :i, :insane, "Insane annoyance factor"
|
203
|
-
option :h, :high, "High annoyance factor"
|
204
|
-
option :m, :medium, "Medium annoyance factor"
|
205
|
-
option :l, :low, "Low annoyance factor"
|
206
|
-
option :r, :rand, "Random challenge type"
|
207
|
-
command :annoy do |obj|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
end
|
198
|
+
usage "rudy [global options] annoy [-h -m -l] [-e]"
|
199
|
+
desc "Play around with Rudy's annoying challenges"
|
200
|
+
option :s, :string, "A numeric challenge"
|
201
|
+
option :n, :numeric, "A numeric challenge"
|
202
|
+
option :i, :insane, "Insane annoyance factor"
|
203
|
+
option :h, :high, "High annoyance factor"
|
204
|
+
option :m, :medium, "Medium annoyance factor"
|
205
|
+
option :l, :low, "Low annoyance factor"
|
206
|
+
option :r, :rand, "Random challenge type"
|
207
|
+
command :annoy do |obj|
|
208
|
+
srand(Time.now.to_f)
|
209
|
+
flavor = [:numeric, :string, :rand].detect { |v| obj.option.send(v) } || :string
|
210
|
+
factor = [:insane, :high, :medium, :low].detect { |v| obj.option.send(v) } || :medium
|
211
|
+
success = Annoy.challenge?("Is this annoying?", factor, flavor)
|
212
|
+
puts (success ? "Correct!" : "WRONG!").bright
|
213
|
+
end
|
214
214
|
|
215
|
-
desc "Display the current Rudy slogan"
|
216
|
-
command :slogan do
|
217
|
-
|
218
|
-
end
|
215
|
+
desc "Display the current Rudy slogan"
|
216
|
+
command :slogan do
|
217
|
+
puts "Rudy: Not your grandparent's deployment tool!"
|
218
|
+
end
|
219
219
|
|
220
|
-
desc "Generates a configuration template to #{Rudy::RUDY_CONFIG_FILE}"
|
221
|
-
command :generate_config do |obj|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
220
|
+
desc "Generates a configuration template to #{Rudy::RUDY_CONFIG_FILE}"
|
221
|
+
command :generate_config do |obj|
|
222
|
+
unless File.exists?(Rudy::RUDY_CONFIG_FILE)
|
223
|
+
Rudy::Config.init_config_dir
|
224
|
+
puts "Add your AWS credentials to #{Rudy::RUDY_CONFIG_FILE}"
|
225
|
+
else
|
226
|
+
puts "#{Rudy::RUDY_CONFIG_FILE} already exists"
|
227
|
+
end
|
227
228
|
end
|
228
|
-
end
|
229
229
|
|
230
230
|
|
231
|
-
desc "Initialize Rudy configuration"
|
232
|
-
command :init do |obj|
|
231
|
+
desc "Initialize Rudy configuration"
|
232
|
+
command :init do |obj|
|
233
233
|
|
234
|
-
|
235
|
-
|
236
|
-
|
234
|
+
unless File.exists?(Rudy::RUDY_CONFIG_FILE)
|
235
|
+
Rudy::Config.init_config_dir
|
236
|
+
end
|
237
237
|
|
238
|
-
|
239
|
-
|
238
|
+
begin
|
239
|
+
rdom = Rudy::Domains.new(:global => obj.global)
|
240
240
|
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
241
|
+
unless rdom.exists?
|
242
|
+
puts "Creating SimpleDB domain #{rdom.name}"
|
243
|
+
rdom.create
|
244
|
+
puts "Initialized"
|
245
|
+
else
|
246
|
+
puts "Already Initialized"
|
247
|
+
end
|
248
248
|
|
249
249
|
|
250
|
-
|
250
|
+
exit 0 # a quick hack to not print elapsed time
|
251
251
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
252
|
+
rescue Rudy::NoConfig => ex
|
253
|
+
puts "AWS credentials must be configured to continue."
|
254
|
+
puts "You can modify these in #{Rudy::RUDY_CONFIG_FILE}"
|
255
|
+
exit 1
|
256
|
+
end
|
257
257
|
|
258
258
|
|
259
259
|
|
260
|
-
end
|
261
|
-
|
262
|
-
desc "Displays the SimpleDB domains associated to your account"
|
263
|
-
command :domains => Rudy::CLI::Domains
|
264
|
-
|
265
|
-
|
266
|
-
# --------------------------------- RUDY MANAGER COMMANDS --------
|
267
|
-
# ------------------------------------------------------------------
|
268
|
-
|
269
|
-
#usage "rudy init"
|
270
|
-
#desc "Run this the first time you use Rudy (it's immutable so running it again does no harm)."
|
271
|
-
#command :create_domain => Rudy::CLI::Manager
|
272
|
-
#
|
273
|
-
#usage "rudy info"
|
274
|
-
#desc "Displays info about the current Rudy configuration"
|
275
|
-
#command :info => Rudy::CLI::Manager
|
276
|
-
|
277
|
-
#desc "Update a Machine Group with the current version of Rudy"
|
278
|
-
#option :g, :group, String, "A security group name"
|
279
|
-
#command :update => Rudy::CLI::Manager
|
280
|
-
|
281
|
-
|
282
|
-
#usage "#{$/} [global options] disks [-C -p path -d device -s size] [-A] [-D] [path]"
|
283
|
-
#desc "Manage Disks"
|
284
|
-
#option :l, :all, "Display all disk definitions"
|
285
|
-
#option :i, :awsid, String, "EC2 Instance ID"
|
286
|
-
#option :g, :group, String, "Machine group name"
|
287
|
-
#option :p, :path, String, "The filesystem path to use as the mount point"
|
288
|
-
#option :d, :device, String, "The device id (default: /dev/sdh)"
|
289
|
-
#option :s, :size, Integer, "The size of disk (in GB)"
|
290
|
-
#action :C, :create, "Create a disk definition"
|
291
|
-
#action :D, :destroy, "Destroy a disk definition"
|
292
|
-
#action :A, :attach, "Attach a disk"
|
293
|
-
#action :N, :unattach, "Unattach a disk"
|
294
|
-
#argv :diskname
|
295
|
-
#command :disk => Rudy::CLI::Disks
|
296
|
-
#command_alias :disk, :disks
|
297
|
-
|
298
|
-
|
299
|
-
#usage "rudy [global options] backups [-C] [disk name]"
|
300
|
-
#desc "Manage Backups"
|
301
|
-
#option :s, :snapshot, String, "Create a backup entry from an existing snapshot"
|
302
|
-
#action :Z, :sync, "Check for and delete backup metadata with no snapshot. DOES NOT delete snapshots."
|
303
|
-
##action :T, :tidy, "Tidy existing backups"
|
304
|
-
#action :D, :destroy, "Destroy a backup and DELETE its snapshots."
|
305
|
-
#action :C, :create, "Create a backup"
|
306
|
-
#argv :disk
|
307
|
-
#command :'backup' => Rudy::CLI::Backups
|
308
|
-
#command_alias :backup, :bu
|
309
|
-
|
310
|
-
#usage "rudy [global options] metadata instance-ID"
|
311
|
-
#desc "Display Rudy metadata."
|
312
|
-
#command :metadata => Rudy::CLI::Manager
|
313
|
-
#command_alias :metadata, :md
|
314
|
-
|
315
|
-
|
316
|
-
# -------------------------- RUDY RELEASE/DEPLOY COMMANDS --------
|
317
|
-
# ------------------------------------------------------------------
|
318
|
-
|
319
|
-
#desc "Release to a Machine Group"
|
320
|
-
#option :g, :group, String, "A security group name"
|
321
|
-
#option :s, :switch, "Switch to the release branch/tag"
|
322
|
-
#option :m, :msg, String, "A short release note"
|
323
|
-
#command :release => Rudy::CLI::Release
|
324
|
-
|
325
|
-
#desc "Update the release currently running in a machine group"
|
326
|
-
#command :rerelease => Rudy::CLI::Release
|
327
|
-
#command_alias :rerelease, :rere
|
328
|
-
|
329
|
-
#desc "Deploy disk snapshots from one machine to another"
|
330
|
-
#command :deploy => Rudy::CLI::Deploy
|
331
|
-
|
332
|
-
|
333
|
-
#desc "Shutdown a Machine Group"
|
334
|
-
#usage "rudy [global options] shutdown [-g group-name] [instance-ID]"
|
335
|
-
#option :g, :group, String, "A security group name"
|
336
|
-
#argv :awsid
|
337
|
-
#command :shutdown => Rudy::CLI::Routines
|
338
|
-
#
|
339
|
-
#
|
340
|
-
#desc "Start a Machine Group"
|
341
|
-
#usage "rudy [global options] startup [-g group-name] [-i image-ID]"
|
342
|
-
#option :ami, String, "EC2 image ID (AMI)"
|
343
|
-
#option :g, :group, String, "A security group name"
|
344
|
-
#command :startup => Rudy::CLI::Routines
|
345
|
-
#command_alias :startup, :start
|
346
|
-
|
347
|
-
#desc "Restart a Machine Group"
|
348
|
-
#option :g, :group, String, "A security group name"
|
349
|
-
#argv :awsid
|
350
|
-
#command :restart => Rudy::CLI::Routines
|
351
|
-
#
|
352
|
-
|
353
|
-
|
260
|
+
end
|
354
261
|
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
#
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
262
|
+
desc "Displays the SimpleDB domains associated to your account"
|
263
|
+
command :domains => Rudy::CLI::Domains
|
264
|
+
|
265
|
+
|
266
|
+
# --------------------------------- RUDY MANAGER COMMANDS --------
|
267
|
+
# ------------------------------------------------------------------
|
268
|
+
|
269
|
+
#usage "rudy init"
|
270
|
+
#desc "Run this the first time you use Rudy (it's immutable so running it again does no harm)."
|
271
|
+
#command :create_domain => Rudy::CLI::Manager
|
272
|
+
#
|
273
|
+
#usage "rudy info"
|
274
|
+
#desc "Displays info about the current Rudy configuration"
|
275
|
+
#command :info => Rudy::CLI::Manager
|
276
|
+
|
277
|
+
#desc "Update a Machine Group with the current version of Rudy"
|
278
|
+
#option :g, :group, String, "A security group name"
|
279
|
+
#command :update => Rudy::CLI::Manager
|
280
|
+
|
281
|
+
|
282
|
+
#usage "#{$/} [global options] disks [-C -p path -d device -s size] [-A] [-D] [path]"
|
283
|
+
#desc "Manage Disks"
|
284
|
+
#option :l, :all, "Display all disk definitions"
|
285
|
+
#option :i, :awsid, String, "EC2 Instance ID"
|
286
|
+
#option :g, :group, String, "Machine group name"
|
287
|
+
#option :p, :path, String, "The filesystem path to use as the mount point"
|
288
|
+
#option :d, :device, String, "The device id (default: /dev/sdh)"
|
289
|
+
#option :s, :size, Integer, "The size of disk (in GB)"
|
290
|
+
#action :C, :create, "Create a disk definition"
|
291
|
+
#action :D, :destroy, "Destroy a disk definition"
|
292
|
+
#action :A, :attach, "Attach a disk"
|
293
|
+
#action :N, :unattach, "Unattach a disk"
|
294
|
+
#argv :diskname
|
295
|
+
#command :disk => Rudy::CLI::Disks
|
296
|
+
#command_alias :disk, :disks
|
297
|
+
|
298
|
+
|
299
|
+
#usage "rudy [global options] backups [-C] [disk name]"
|
300
|
+
#desc "Manage Backups"
|
301
|
+
#option :s, :snapshot, String, "Create a backup entry from an existing snapshot"
|
302
|
+
#action :Z, :sync, "Check for and delete backup metadata with no snapshot. DOES NOT delete snapshots."
|
303
|
+
##action :T, :tidy, "Tidy existing backups"
|
304
|
+
#action :D, :destroy, "Destroy a backup and DELETE its snapshots."
|
305
|
+
#action :C, :create, "Create a backup"
|
306
|
+
#argv :disk
|
307
|
+
#command :'backup' => Rudy::CLI::Backups
|
308
|
+
#command_alias :backup, :bu
|
309
|
+
|
310
|
+
#usage "rudy [global options] metadata instance-ID"
|
311
|
+
#desc "Display Rudy metadata."
|
312
|
+
#command :metadata => Rudy::CLI::Manager
|
313
|
+
#command_alias :metadata, :md
|
314
|
+
|
315
|
+
|
316
|
+
# -------------------------- RUDY RELEASE/DEPLOY COMMANDS --------
|
317
|
+
# ------------------------------------------------------------------
|
318
|
+
|
319
|
+
#desc "Release to a Machine Group"
|
320
|
+
#option :g, :group, String, "A security group name"
|
321
|
+
#option :s, :switch, "Switch to the release branch/tag"
|
322
|
+
#option :m, :msg, String, "A short release note"
|
323
|
+
#command :release => Rudy::CLI::Release
|
324
|
+
|
325
|
+
#desc "Update the release currently running in a machine group"
|
326
|
+
#command :rerelease => Rudy::CLI::Release
|
327
|
+
#command_alias :rerelease, :rere
|
328
|
+
|
329
|
+
#desc "Deploy disk snapshots from one machine to another"
|
330
|
+
#command :deploy => Rudy::CLI::Deploy
|
331
|
+
|
332
|
+
|
333
|
+
#desc "Shutdown a Machine Group"
|
334
|
+
#usage "rudy [global options] shutdown [-g group-name] [instance-ID]"
|
335
|
+
#option :g, :group, String, "A security group name"
|
336
|
+
#argv :awsid
|
337
|
+
#command :shutdown => Rudy::CLI::Routines
|
338
|
+
#
|
339
|
+
#
|
340
|
+
#desc "Start a Machine Group"
|
341
|
+
#usage "rudy [global options] startup [-g group-name] [-i image-ID]"
|
342
|
+
#option :ami, String, "EC2 image ID (AMI)"
|
343
|
+
#option :g, :group, String, "A security group name"
|
344
|
+
#command :startup => Rudy::CLI::Routines
|
345
|
+
#command_alias :startup, :start
|
346
|
+
|
347
|
+
#desc "Restart a Machine Group"
|
348
|
+
#option :g, :group, String, "A security group name"
|
349
|
+
#argv :awsid
|
350
|
+
#command :restart => Rudy::CLI::Routines
|
351
|
+
#
|
352
|
+
|
353
|
+
|
354
|
+
|
355
|
+
# ------------------------------------------- UGLY STUFFS --------
|
356
|
+
# ------------------------------------------------------------------
|
357
|
+
debug :off
|
358
|
+
default :status
|
359
|
+
#capture :stderr
|
360
|
+
before do
|
361
|
+
@start = Time.now
|
362
|
+
end
|
363
|
+
after do |obj|
|
364
|
+
unless obj.global.quiet
|
365
|
+
@elapsed = Time.now - @start
|
366
|
+
puts $/, "Elapsed: %.2f seconds" % @elapsed.to_f if @elapsed > 0.1
|
367
|
+
end
|
367
368
|
end
|
368
369
|
end
|
369
|
-
|
data/lib/rudy.rb
CHANGED
data/lib/rudy/config.rb
CHANGED
data/lib/rudy/huxtable.rb
CHANGED
@@ -5,6 +5,8 @@ module Rudy
|
|
5
5
|
module Huxtable
|
6
6
|
include Rudy::AWS
|
7
7
|
|
8
|
+
# TODO: investigate @@debug bug. When this is true, Caesars.debug? returns true
|
9
|
+
# too. It's probably some include thing.
|
8
10
|
@@debug = false
|
9
11
|
|
10
12
|
attr_accessor :config
|
@@ -90,7 +92,7 @@ module Rudy
|
|
90
92
|
Rudy.enable_quiet if @global.quiet
|
91
93
|
end
|
92
94
|
|
93
|
-
def debug?; @@debug
|
95
|
+
def debug?; @@debug == true; end
|
94
96
|
|
95
97
|
def check_keys
|
96
98
|
raise "No EC2 .pem keys provided" unless has_pem_keys?
|
data/lib/tryouts.rb
CHANGED
@@ -3,25 +3,20 @@ require 'ostruct'
|
|
3
3
|
|
4
4
|
module Tryouts
|
5
5
|
|
6
|
-
def before(&b)
|
7
|
-
b.call
|
8
|
-
end
|
9
|
-
def after(&b)
|
10
|
-
at_exit &b
|
11
|
-
end
|
12
|
-
|
13
|
-
|
14
6
|
# tryout :name do
|
15
7
|
# ...
|
16
8
|
# end
|
17
9
|
def tryout(name, &b)
|
10
|
+
puts '-'*50
|
18
11
|
puts "Running#{@poop}: #{name}"
|
19
12
|
begin
|
20
13
|
b.call
|
21
|
-
|
22
|
-
sleep 1
|
14
|
+
sleep 0.1
|
23
15
|
rescue Interrupt
|
24
|
-
|
16
|
+
rescue => ex
|
17
|
+
STDERR.puts "Tryout error: #{ex.message}"
|
18
|
+
end
|
19
|
+
puts $/*2
|
25
20
|
end
|
26
21
|
|
27
22
|
# Ignore everything
|
@@ -36,5 +31,3 @@ module Tryouts
|
|
36
31
|
end
|
37
32
|
|
38
33
|
end
|
39
|
-
|
40
|
-
include Tryouts
|
data/rudy.gemspec
CHANGED
data/test/helper.rb
CHANGED
data/tryouts/session_tryout.rb
CHANGED