solutious-rudy 0.4.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.
@@ -0,0 +1,75 @@
1
+ RUDY, CHANGES
2
+
3
+ TODO: Look into RubyGems error
4
+ /Library/Ruby/Gems/1.8/gems/rake-0.8.3/lib/rake/gempackagetask.rb:13:Warning: Gem::manage_gems is deprecated and will be removed on or after March 2009.
5
+ rake aborted!
6
+ RubyGem version error: rdoc(2.4.0 not ~> 2.3.0)
7
+
8
+ TODO: Remove aws_swb
9
+
10
+
11
+ #### 0.4.1 (2009-03-??) ###############################
12
+
13
+ * CHANGE: Recommend keypair config to be in ~/.rudy/config
14
+ * FIX: Rudy now checks for user keys specified by env-role, env, and global
15
+ * FIX: gemspec dependency net-ssh-multi
16
+ * NEW: rerelease command
17
+
18
+ #### 0.4 (2009-03-12) ###############################
19
+
20
+ NOTE: This is a significant re-write from 0.3
21
+
22
+ * CHANGE: Mostly re-written bin/ruby, moving validation to Command classes
23
+ * CHANGE: upgrade to Drydock 0.5
24
+ * CHANGE: Moved generic EC2 commands to bin/rudy-ec2
25
+ * CHANGE: Removed ambiguity of pluralized command names.
26
+ * OLD: backups, disks, configs
27
+ * NEW: backup, disk, config
28
+ * NEW: ssh and scp commands for connecting to and copying files to/from machines
29
+ * NEW: New dependencies (trying out net-ssh)
30
+ * NEW: Domain specific language for configuration
31
+ * NEW: "Routines" for handling common actions. Starting, stopping, releasing, deploying.
32
+ * NEW: "rudy release" will create a release from the current working copy, start an instance,
33
+ checkout the release, run routines. It needs some work still, but this already functions as
34
+ a single command release process.
35
+ * NEW: "rudy start|destroy|restart|update|status". Routines allow us to have generic commands
36
+ that can be used for any machine group. These commands relate to starting new instances.
37
+ * NEW: Extra caution when running destructive commands
38
+ * NEW: Default ~/.rudy/config created if it doesn't exist.
39
+
40
+
41
+ #### 0.3 (2009-02-26) ###############################
42
+
43
+ NOTE: This is a significant re-write from 0.2
44
+
45
+ * CHANGE: Re-written support/rudy-ec2-startup
46
+ * CHANGE: upgrade to Drydock 0.4
47
+ * NEW: More functionality for disks and backups
48
+ * NEW: config commands
49
+ * NEW: Per machine configuration (via ~/.rudy)
50
+
51
+
52
+ #### 0.2 (2009-02-23) ###############################
53
+
54
+ NOTE: This is a complete re-write from 0.1
55
+
56
+ * CHANGE: Added Environment variables
57
+ * CHANGE: upgrade to drydock 0.3.3
58
+ * NEW: All time references are converted to UTC
59
+ * NEW: Safer "Are you sure?". Number of characters to enter is
60
+ commiserate with amount of danger.
61
+ * NEW: Commands: myaddress, addresses, images, instances,
62
+ disks, connect, copy, stage, backups, volumes
63
+ * NEW: Metadata storage to SimpleDB for disks, backups
64
+ * NEW: Creates EBS volumes based on startup from metadata
65
+ * NEW: Automated release process
66
+ * NEW: Automated creation of machine images
67
+ * NEW: Partial support for regions and zones
68
+ * NEW: Manage system based on security groups.
69
+ * NEW: "rudy groups" overhaul. Display, creates, destroys groups.
70
+
71
+
72
+
73
+ #### 0.1 (2009-02-06) ###############################
74
+
75
+ * Initial public release
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2009 Solutious Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ = Rudy - v0.4 ALPHA!
2
+
3
+ Rudy is a handy staging and deployment tool for EC2.
4
+
5
+ NOTE: Rudy will be ready for general consumption in Q2 2009.
6
+
7
+ == Installation
8
+
9
+ * Soon!
10
+ * ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' (See net/ssh docs)
11
+
12
+ == More Info
13
+
14
+ * GitHub[http://github.com/solutious/rudy]
15
+ * RubyForge[http://rubyforge.org/projects/rudy]
16
+ * Inspiration[http://www.youtube.com/watch?v=CgaiIW5Rzes]
17
+
18
+
19
+ == Credits
20
+
21
+ * Delano Mandelbaum (delano@solutious.com)
22
+ * Keshia Knight Pulliam (rudy@solutious.com)
23
+
24
+
25
+ == Thanks
26
+
27
+ * The Rilli.com team -- for the initial use case, the ongoing feedback and support, and the good times!
28
+ * Adam Bognar
29
+ * Andrew Simpson
30
+ * Caleb Buxton
31
+ * Colin Brumelle
32
+
33
+
34
+ == License
35
+
36
+ See: LICENSE.txt
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'rake/clean'
3
+ require 'rake/gempackagetask'
4
+ require 'hanna/rdoctask'
5
+ require 'fileutils'
6
+ include FileUtils
7
+
8
+ task :default => :package
9
+
10
+ # SPECS ===============================================================
11
+
12
+ # None-yet!
13
+
14
+ # PACKAGE =============================================================
15
+
16
+ name = "rudy"
17
+ load "#{name}.gemspec"
18
+
19
+ version = @spec.version
20
+
21
+ Rake::GemPackageTask.new(@spec) do |p|
22
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
23
+ end
24
+
25
+ task :release => [ :rdoc, :package ]
26
+
27
+ task :install => [ :rdoc, :package ] do
28
+ sh %{sudo gem install pkg/#{name}-#{version}.gem}
29
+ end
30
+
31
+ task :uninstall => [ :clean ] do
32
+ sh %{sudo gem uninstall #{name}}
33
+ end
34
+
35
+
36
+ # Rubyforge Release / Publish Tasks ==================================
37
+
38
+ desc 'Publish website to rubyforge'
39
+ task 'publish:rdoc' => 'doc/index.html' do
40
+ sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
41
+ end
42
+
43
+ desc 'Public release to rubyforge'
44
+ task 'publish:gem' => [:package] do |t|
45
+ sh <<-end
46
+ rubyforge add_release -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
47
+ rubyforge add_file -o Any -a CHANGES.txt -f -n README.rdoc #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
48
+ end
49
+ end
50
+
51
+
52
+ Rake::RDocTask.new do |t|
53
+ t.rdoc_dir = 'doc'
54
+ t.title = @spec.summary
55
+ t.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
56
+ t.options << '--charset' << 'utf-8'
57
+ t.rdoc_files.include('LICENSE.txt')
58
+ t.rdoc_files.include('README.rdoc')
59
+ t.rdoc_files.include('CHANGES.txt')
60
+ t.rdoc_files.include('bin/*')
61
+ t.rdoc_files.include('lib/*.rb')
62
+ t.rdoc_files.include('lib/**/*.rb')
63
+ end
64
+
65
+ CLEAN.include [ 'pkg', '*.gem', '.config', 'doc' ]
66
+
67
+
68
+
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Rudy -- Your friend in staging and deploying to EC2
4
+ #
5
+ # See rudy -h for usage
6
+ #
7
+
8
+ RUDY_HOME = File.join(File.dirname(__FILE__), '..')
9
+ RUDY_LIB = File.join(RUDY_HOME, 'lib')
10
+ $:.unshift RUDY_LIB # Put our local lib in first place
11
+
12
+ require 'rubygems' if RUBY_VERSION < "1.9"
13
+ require 'date'
14
+ require 'drydock'
15
+ extend Drydock
16
+
17
+ project "Rudy" # This also runs require 'ruby'
18
+
19
+ global :A, :accesskey, String, "AWS Access Key"
20
+ global :S, :secretkey, String, "AWS Secret Access Key"
21
+ #global :R, :region, String, "Connect to a specific EC2 region (ie: #{Rudy::DEFAULT_REGION})"
22
+ global :f, :config, String, "Specify another configuration file to read (ie: #{Rudy::RUDY_CONFIG_FILE})"
23
+ global :z, :zone, String, "Connect to a specific EC2 zone (ie: #{Rudy::DEFAULT_ZONE})"
24
+ global :e, :environment, String, "Connect to the specified environment (ie: #{Rudy::DEFAULT_ENVIRONMENT})"
25
+ global :r, :role, String, "Connect to a machine with the specified role (ie: #{Rudy::DEFAULT_ROLE})"
26
+ global :p, :position, String, "Position in the machine in its group (ie: #{Rudy::DEFAULT_POSITION})"
27
+ global :u, :user, String, "Provide a username (ie: #{Rudy::DEFAULT_USER})"
28
+ global :q, :quiet, "Run with less output"
29
+ global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
30
+ @verbose ||= 0
31
+ @verbose += 1
32
+ end
33
+ global :V, :version, "Display version number" do
34
+ puts "Rudy version: #{Rudy::VERSION}"
35
+ exit 0
36
+ end
37
+
38
+ #desc "Run this the first time you use Rudy (it's immutable so running it again does no harm)."
39
+ #command :setup => Rudy::Command::Metadata
40
+
41
+
42
+ # ------------------------------------ RUDY INFO COMMANDS --------
43
+ # ------------------------------------------------------------------
44
+
45
+ #usage "rudy info"
46
+ #desc "Displays info about the current Rudy configuration"
47
+ #command :info => Rudy::Command::Metadata
48
+
49
+ usage "rudy [-f config-file] config [param-name]"
50
+ desc "Check Rudy configuration."
51
+ option :l, :all, "Display config settings for all machines"
52
+ option :d, :defaults, "Display the default value for the supplied parameter"
53
+ argv :name
54
+ command :config => Rudy::Command::Config
55
+
56
+ usage "rudy myaddress [-i] [-e]"
57
+ desc "Displays you current internal and external IP addresses"
58
+ option :e, :external, "Display only external IP address"
59
+ option :i, :internal, "Display only internal IP address"
60
+ command :myaddress do |obj|
61
+ ea = Rudy::Utils::external_ip_address || ''
62
+ ia = Rudy::Utils::internal_ip_address || ''
63
+ if obj.global.quiet
64
+ puts ia unless obj.option.external && !obj.option.internal
65
+ puts ea unless obj.option.internal && !obj.option.external
66
+ else
67
+ puts "%10s: %s" % ['Internal', ia] unless obj.option.external && !obj.option.internal
68
+ puts "%10s: %s" % ['External', ea] unless obj.option.internal && !obj.option.external
69
+ end
70
+ end
71
+
72
+
73
+
74
+ # ----------------------------- RUDY MAINTENANCE COMMANDS --------
75
+ # ------------------------------------------------------------------
76
+
77
+ usage "#{$/} [global options] disks [-C -p path -d device -s size] [-A] [-D] [disk name]"
78
+ desc "Manage Disks"
79
+ option :l, :all, "Display all disk definitions"
80
+ option :p, :path, String, "The filesystem path to use as the mount point"
81
+ option :d, :device, String, "The device id (default: /dev/sdh)"
82
+ option :s, :size, Integer, "The size of disk (in GB)"
83
+ action :C, :create, "Create a disk definition"
84
+ action :D, :destroy, "Destroy a disk definition"
85
+ action :A, :attach, "Attach a disk"
86
+ action :N, :unattach, "Unattach a disk"
87
+ argv :diskname
88
+ command :disk => Rudy::Command::Disks
89
+
90
+
91
+ usage "rudy [global options] backups [-C] [disk name]"
92
+ desc "Manage Backups"
93
+ option :s, :snapshot, String, "Create a backup entry from an existing snapshot"
94
+ action :Z, :sync, "Check for and delete backup metadata with no snapshot. DOES NOT delete snapshots."
95
+ #action :T, :tidy, "Tidy existing backups"
96
+ action :D, :destroy, "Destroy a backup and DELETE its snapshots."
97
+ action :C, :create, "Create a backup"
98
+ argv :disk
99
+ command :'backup' => Rudy::Command::Backups
100
+ command_alias :backup, :bu
101
+
102
+
103
+ usage "rudy [global options] metadata instance-ID"
104
+ desc "Display Rudy metadata."
105
+ command :metadata => Rudy::Command::Metadata
106
+ command_alias :metadata, :md
107
+
108
+
109
+ desc "Machine Group Status"
110
+ command :status => Rudy::Command::Machines
111
+
112
+
113
+ desc "Update a Machine Group with the current version of Rudy"
114
+ command :update => Rudy::Command::Machines
115
+
116
+
117
+ usage "rudy [-e env] [-u user] connect [-p] [cmd]"
118
+ desc "Open an SSH connection"
119
+ option :p, :print, "Only print the SSH command, don't connect"
120
+ argv :cmd
121
+ command :connect => Rudy::Command::Environment
122
+ command_alias :connect, :ssh
123
+
124
+ usage "rudy [-e env] [-u user] copy [-p] -r [from path] [to path]"
125
+ desc "Copy files to or from machines. NOTE: You must use quotes when using a tilda for your remote dir ('~/')."
126
+ option :r, :remote, "Copy FROM the remote machine to the local machine"
127
+ option :p, :print, "Only print the SSH command, don't connect"
128
+ argv :from, :to
129
+ command :copy => Rudy::Command::Environment
130
+ command_alias :copy, :scp
131
+ command_alias :copy, :upload
132
+ command_alias :copy, :download
133
+
134
+
135
+ # -------------------------------- RUDY ROUTINES COMMANDS --------
136
+ # ------------------------------------------------------------------
137
+
138
+ desc "Shutdown a Machine Group"
139
+ command :shutdown => Rudy::Command::Machines
140
+
141
+ desc "Start a Machine Group"
142
+ option :i, :image, String, "EC2 image ID (AMI)"
143
+ command :startup => Rudy::Command::Machines
144
+ command_alias :startup, :start
145
+
146
+ desc "Restart a Machine Group"
147
+ command :restart => Rudy::Command::Machines
148
+
149
+ desc "Release to a machine group"
150
+ option :s, :switch, "Switch to the release branch/tag"
151
+ option :m, :msg, String, "A short release note"
152
+ command :release => Rudy::Command::Release
153
+
154
+ desc "Update the release currently running in a machine group"
155
+ command :rerelease => Rudy::Command::Release
156
+ command_alias :rerelease, :rere
157
+
158
+ #desc "Deploy disk snapshots from one machine to another"
159
+ #command :deploy => Rudy::Command::Deploy
160
+
161
+
162
+
163
+
164
+ # ------------------------------------------- UGLY STUFFS --------
165
+ # ------------------------------------------------------------------
166
+ debug :on
167
+ capture :stderr
168
+ before do
169
+ @start = Time.now
170
+ end
171
+ after do
172
+ @elapsed = Time.now - @start
173
+ puts $/, "Elapsed: %.2f seconds" % @elapsed.to_f if @elapsed > 0.1
174
+ end
175
+
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/ruby
2
+
3
+ # Rudy -- Your friend in staging and deploying to EC2
4
+ #
5
+ # See rudy -h for usage
6
+ #
7
+
8
+ #
9
+ # No Ruby 1.9.1 support. Only 1.8.x for now :[
10
+ unless RUBY_VERSION < "1.9"
11
+ puts "Sorry! We're using the right_aws gem and it doesn't support Ruby 1.9 (md5 error)."
12
+ exit 1
13
+ else
14
+ require 'rubygems'
15
+ end
16
+
17
+ RUDY_HOME = File.join(File.dirname(__FILE__), '..')
18
+ RUDY_LIB = File.join(RUDY_HOME, 'lib')
19
+ $:.unshift RUDY_LIB # Put our local lib in first place
20
+
21
+ require 'drydock'
22
+ extend Drydock
23
+
24
+ project "Rudy" # This also runs require 'ruby'
25
+
26
+ debug :on
27
+
28
+ capture :stderr
29
+
30
+ global :A, :accesskey, String, "AWS Access Key"
31
+ global :S, :secretkey, String, "AWS Secret Access Key"
32
+ global :R, :region, String, "Connect to a specific EC2 region (default: #{Rudy::DEFAULT_REGION})"
33
+ global :z, :zone, String, "Connect to a specific EC2 zone (default: #{Rudy::DEFAULT_ZONE})"
34
+ global :q, :quiet, "Run with less output"
35
+ global :v, :verbose, "Increase verbosity of output (i.e. -v or -vv or -vvv)" do
36
+ @verbose ||= 0
37
+ @verbose += 1
38
+ end
39
+ global :V, :version, "Display version number" do
40
+ puts "Rudy version: #{Rudy::VERSION}"
41
+ exit 0
42
+ end
43
+
44
+
45
+
46
+
47
+
48
+ # ----------------------------------- AMAZON EC2 COMMANDS --------
49
+ # ------------------------------------------------------------------
50
+
51
+ usage "rudy [global options] addresses [-A address instance ID]"
52
+ desc "Manage Amazon Elastic IP addresses"
53
+ argv :address, :instanceid
54
+ action :A, :associate, "Associate an address to a running instance"
55
+ command :addresses => Rudy::Command::Addresses
56
+ command_alias :addresses, :address
57
+
58
+
59
+ usage "rudy images [-C -i name [-b bucket -a account]] [-D AMI-ID]"
60
+ desc "Manage EC2 Machine Images (AMIs)"
61
+ option :a, :account, String, "Your Amazon Account Number"
62
+ option :i, :image_name, String, "The name of the image"
63
+ option :p, :print, "Print-only (don't execute commands)"
64
+ option :b, :bucket_name, String, "The name of the bucket that will store the image"
65
+ action :C, :create, "Create an image"
66
+ #action :P, :prepare, "Prepare a running instance to be used as an image"
67
+ action :D, :destroy, "Deregister an image (currently _does not_ remove images files from S3)"
68
+ argv :ami
69
+ command :images => Rudy::Command::Images
70
+ command_alias :images, :image
71
+
72
+
73
+ desc "Manage EC2 Volumes"
74
+ action :D, :destroy, "Destroy a volume"
75
+ argv :vol
76
+ command :volumes => Rudy::Command::Volumes
77
+ command_alias :volumes, :volume
78
+
79
+
80
+ usage "rudy [global options] instances [-D] [-S -i image ID] [instance ID OR group name]"
81
+ desc "Manage EC2 Instances"
82
+ option :all, "Display all instances"
83
+ option :a, :address, String, "Amazon elastic IP"
84
+ option :i, :image, String, "Amazon machine image ID (ami)"
85
+ #option :v, :volume, String, "Amazon volume ID"
86
+ action :D, :destroy, "Destroy the given instance IDs. All data will be lost!"
87
+ #action :S, :start, "Start an instance"
88
+ #action :R, :restart, "Restart an instance"
89
+ argv :filter
90
+ command :instances => Rudy::Command::Instances
91
+ command_alias :instances, :instance
92
+
93
+
94
+ usage "rudy [global options] groups [-C] [-a IP addresses] [-p ports] [group name]"
95
+ desc "Manage EC2 Security Groups"
96
+ option :all, "Display all security groups"
97
+ option :r, :protocols, Array, "Comma-separated list of protocols. One of: tcp (default), udp, icmp"
98
+ option :p, :ports, Array, "List of comma-separated ports to authorize (default: 22,80,443)"
99
+ option :a, :addresses, Array, "List of comma-separated IP addresses to authorize (default: your external IP)"
100
+ action :C, :create, "Create a security group"
101
+ action :D, :destroy, "Destroy a security group"
102
+ action :M, :modify, "Modify a security group"
103
+ argv :group
104
+ command :groups => Rudy::Command::Groups
105
+ command_alias :groups, :group
106
+
107
+
108
+