rudy 0.8.1 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/CHANGES.txt +21 -8
  2. data/README.rdoc +43 -1
  3. data/Rudyfile +28 -27
  4. data/bin/rudy +8 -15
  5. data/lib/rudy.rb +2 -2
  6. data/lib/rudy/cli/routines.rb +4 -20
  7. data/lib/rudy/config.rb +1 -0
  8. data/lib/rudy/config/objects.rb +29 -33
  9. data/lib/rudy/huxtable.rb +9 -1
  10. data/lib/rudy/routines.rb +113 -96
  11. data/lib/rudy/routines/helper.rb +3 -3
  12. data/lib/rudy/routines/helpers/dependshelper.rb +1 -1
  13. data/lib/rudy/routines/helpers/diskhelper.rb +3 -3
  14. data/lib/rudy/routines/helpers/scripthelper.rb +41 -39
  15. data/lib/rudy/routines/helpers/userhelper.rb +5 -5
  16. data/lib/rudy/routines/passthrough.rb +11 -11
  17. data/lib/rudy/routines/startup.rb +1 -1
  18. data/rudy.gemspec +4 -37
  19. metadata +5 -38
  20. data/examples/README.md +0 -10
  21. data/examples/debian-sinatra-passenger/commands.rb +0 -19
  22. data/examples/debian-sinatra-passenger/machines.rb +0 -32
  23. data/examples/debian-sinatra-passenger/routines.rb +0 -30
  24. data/examples/debian-sinatra-thin/commands.rb +0 -17
  25. data/examples/debian-sinatra-thin/machines.rb +0 -35
  26. data/examples/debian-sinatra-thin/routines.rb +0 -72
  27. data/lib/rudy/routines/helpers/scmhelper.rb +0 -39
  28. data/lib/rudy/routines/release.rb +0 -48
  29. data/lib/rudy/scm.rb +0 -75
  30. data/lib/rudy/scm/git.rb +0 -217
  31. data/lib/rudy/scm/svn.rb +0 -110
  32. data/test/01_mixins/10_hash_test.rb +0 -25
  33. data/test/10_config/00_setup_test.rb +0 -20
  34. data/test/10_config/30_machines_test.rb +0 -69
  35. data/test/15_scm/00_setup_test.rb +0 -20
  36. data/test/15_scm/20_git_test.rb +0 -61
  37. data/test/20_sdb/00_setup_test.rb +0 -16
  38. data/test/20_sdb/10_domains_test.rb +0 -115
  39. data/test/25_ec2/00_setup_test.rb +0 -29
  40. data/test/25_ec2/10_keypairs_test.rb +0 -41
  41. data/test/25_ec2/20_groups_test.rb +0 -131
  42. data/test/25_ec2/30_addresses_test.rb +0 -38
  43. data/test/25_ec2/40_volumes_test.rb +0 -49
  44. data/test/25_ec2/50_snapshots_test.rb +0 -74
  45. data/test/26_ec2_instances/00_setup_test.rb +0 -28
  46. data/test/26_ec2_instances/10_instances_test.rb +0 -83
  47. data/test/26_ec2_instances/50_images_test.rb +0 -13
  48. data/test/30_sdb_metadata/00_setup_test.rb +0 -21
  49. data/test/30_sdb_metadata/10_disks_test.rb +0 -109
  50. data/test/30_sdb_metadata/20_backups_test.rb +0 -102
  51. data/test/coverage.txt +0 -51
  52. data/test/helper.rb +0 -36
data/CHANGES.txt CHANGED
@@ -1,11 +1,25 @@
1
1
  RUDY, CHANGES
2
2
 
3
3
 
4
+
5
+ #### 0.8.2 (2009-06-01) ###############################
6
+
7
+ * CHANGE: Removed release routine code (it's now a passthrough) and scmhelper. All release stuff should
8
+ be implemented using the routine blocks.
9
+ * CHANGE: Passthrough routines no longer check if machine group is running.
10
+ * CHANGE: Local routines blocks now run from current working directory
11
+ * CHANGE: Removed SCM classes (moved logic to the Arcade)
12
+ * CHANGE: Moved examples to the Arcade (experimental)
13
+ * CHANGE: Command output in routines is now displayed only when verbose is 1 or more.
14
+ * ADDED: Routine blocks now receive command line options and arguments
15
+ * ADDED: Commands configuration now supports inline blocks
16
+ * ADDED: Rudy now looks for ~/.rudy/*.rb config files.
17
+
18
+
4
19
  #### 0.8.1 (2009-05-18) ###############################
5
20
 
6
21
  * FIXED: The shutdown routine was not working for Windows instances
7
22
 
8
-
9
23
  #### 0.8.0 (2009-05-18) ###############################
10
24
 
11
25
  * ADDED: Better windows instance support during routines
@@ -20,12 +34,12 @@ RUDY, CHANGES
20
34
  * CHANGE: rudy-ec2 console now displays windows password automatically if keypair is supplied.
21
35
  * ADDED: register and destroy commands to rudy-ec2 images
22
36
 
23
-
24
37
  #### 0.7.4 (2009-05-10) ###############################
25
38
 
26
39
  * CHANGE: Keypairs now include zone. This was necessary to allow US and EU keypairs to
27
- be stored in the same directory.
28
- * CHANGE: Moved non-rudy specific modules to separate projects (storable, sysinfo, annoy, console -> Drydock, escape -> Rye, tryouts -> tryouts/).
40
+ be stored in the same directory.
41
+ * CHANGE: Moved non-rudy specific modules to separate projects (storable, sysinfo, annoy,
42
+ console -> Drydock, escape -> Rye, tryouts -> tryouts/).
29
43
  * CHANGE: Renamed restart routine to reboot to make it clear it's about the machine
30
44
  * CHANGE: Renamed Rudy::Disk to Rudy::MetaData::Disk
31
45
  * CHANGE: Short alias for rudy-ec2 snapshot is now 's' (instead of 't')
@@ -44,7 +58,6 @@ be stored in the same directory.
44
58
  * FIXED: Corrected a few minor interface errors in rudy-ec2
45
59
  * ADDED: rudy-ec2 console can now display the decoded admin password for Windows instances.
46
60
 
47
-
48
61
  #### 0.7.2 (2009-05-04) ###############################
49
62
 
50
63
  * FIXED: cli/routine.rb release method wasn't sending command alias (which broke rerelease)
@@ -90,7 +103,7 @@ to maintain consistency in documentation.
90
103
 
91
104
  * ADDED: rudy-ec2 status can now display EU status
92
105
  * FIXED: Fixed bug on instance create. Instance.groups was nil, now it returns
93
- empty Array.
106
+ empty Array.
94
107
 
95
108
  #### 0.6.6 (2009-04-22) ###############################
96
109
 
@@ -179,9 +192,9 @@ NOTE: This is a complete re-write from 0.1
179
192
  * CHANGE: upgrade to drydock 0.3.3
180
193
  * ADDED: All time references are converted to UTC
181
194
  * ADDED: Safer "Are you sure?". Number of characters to enter is
182
- commiserate with amount of danger.
195
+ commiserate with amount of danger.
183
196
  * ADDED: CLIs: myaddress, addresses, images, instances,
184
- disks, connect, copy, stage, backups, volumes
197
+ disks, connect, copy, stage, backups, volumes
185
198
  * ADDED: Metadata storage to SimpleDB for disks, backups
186
199
  * ADDED: Creates EBS volumes based on startup from metadata
187
200
  * ADDED: Automated release process
data/README.rdoc CHANGED
@@ -18,6 +18,48 @@ All configuration is organized into the zones, environments, and roles that you
18
18
 
19
19
  <em>NOTE: This is a BETA release. That means Rudy's not ready for production use! See Project-Status[http://wiki.github.com/solutious/rudy/project-status].</em>
20
20
 
21
+ == Configuration
22
+
23
+ === Machines
24
+
25
+ The machines configuration describes the "physical" characteristics of your infrastructure.
26
+
27
+ env :stage do # Define an environment
28
+ ami 'ami-e348af8a'
29
+
30
+ role :app do # Define a role
31
+ addresses '11.22.33.44' # Use elastic IPs
32
+
33
+ disks do # Create EBS volumes
34
+ path "/rudy/disk1" do
35
+ size 100
36
+ device "/dev/sdr"
37
+ end
38
+ end
39
+ end
40
+ end
41
+
42
+ === Routines
43
+
44
+ The routines configuration describes repeatable processes that you can execute on your machines.
45
+
46
+ startup do # $ rudy startup
47
+ adduser :rudy
48
+ authorize :rudy # Enable passwordless login
49
+
50
+ disks do # Create a disk
51
+ restore "/rudy/disk1" # from a backup
52
+ end
53
+
54
+ after :rudy do # Run remote SSH commands
55
+ mkdir :p, "great" # $ mkdir -p great
56
+ touch "great/scott" # $ touch great/scott
57
+ ls :l, :a # $ ls -l -a
58
+ end
59
+ end
60
+
61
+
62
+
21
63
  == Features
22
64
 
23
65
  * Create complex environments with a single command
@@ -112,7 +154,7 @@ I'm very open to contributions!
112
154
  * Rubber -- http://github.com/wr0ngway/rubber/wikis
113
155
  * Moonshine -- http://github.com/railsmachine/moonshine/tree
114
156
  * Boto -- http://code.google.com/p/boto/
115
-
157
+ * Fabric -- http://www.nongnu.org/fab/
116
158
 
117
159
  == License
118
160
 
data/Rudyfile CHANGED
@@ -6,6 +6,7 @@
6
6
  # ./.rudy/config
7
7
  # ~/.rudy/config
8
8
  #
9
+ # ~/.rudy/*.rb
9
10
  # ./Rudyfile
10
11
  # ./machines.rb, ./routines.rb, ./commands.rb
11
12
  # ./config/rudy/*.rb
@@ -48,9 +49,9 @@ machines do
48
49
  #addresses '11.22.33.44' # Define an elastic IP to reuse
49
50
 
50
51
  disks do # Define EBS volumes
51
- path "/rudy/disk1" do # The paths can be anything but
52
+ path '/rudy/disk1' do # The paths can be anything but
52
53
  size 2 # they must be unique.
53
- device "/dev/sdr" # Devices must be unique too.
54
+ device '/dev/sdr' # Devices must be unique too.
54
55
  end
55
56
  end
56
57
  end
@@ -92,11 +93,12 @@ end
92
93
  #
93
94
  commands do
94
95
  allow :make
95
- allow :gem_install, "/usr/bin/gem", "install", :V, "--no-rdoc", "--no-ri"
96
- allow :apt_get, "/usr/bin/apt-get", :y, :q
96
+ allow :gem_install, '/usr/bin/gem', 'install', :V, '--no-rdoc', '--no-ri'
97
+ allow :apt_get, 'apt-get', :y, :q
98
+ allow :floo, :time, 1 do
99
+ end
97
100
  end
98
101
 
99
-
100
102
  # ----------------------------------------------------------- ROUTINES --------
101
103
  # The routines block describes the repeatable processes for each machine group.
102
104
  # To run a routine, specify its name on the command-line: rudy startup
@@ -104,28 +106,28 @@ routines do
104
106
 
105
107
  env :stage, :prod do # We'll define routines for the stage-app
106
108
  role :app do # and prod-app machine groups
107
-
109
+
108
110
  startup do # $ rudy startup
109
- adduser :rudy # Create a user called "rudy"
111
+ adduser :rudy # Create a user called 'rudy'
110
112
  authorize :rudy # Enable passwordless logins as rudy
111
113
  #
112
114
  disks do # Define EBS volume routines
113
- create "/rudy/disk1" # Create an EBS volume, attach it, give
115
+ create '/rudy/disk1' # Create an EBS volume, attach it, give
114
116
  end # it a filesystem, and mount it.
115
117
  #
116
118
  after :rudy do # Run remote SSH commands after startup
117
- mkdir :p, "great" # $ mkdir -p great
118
- touch "great/scott" # $ touch great/scott
119
- ls :l, :a # $ ls -l -a
119
+ mkdir :p, 'great' # $ mkdir -p great
120
+ touch 'great/scott' # $ touch great/scott
121
+ ls :l, :a, '*' # $ ls -l -a *
120
122
  end
121
123
  end
122
124
 
123
125
  shutdown do # $ rudy shutdown
124
- before :root do # Run remote SSH commands before shutdown
126
+ script :root do # Run remote SSH commands before shutdown
125
127
  uptime
126
128
  end
127
129
  disks do
128
- destroy "/rudy/disk1" # Unmount and destroy the EBS volume
130
+ destroy '/rudy/disk1' # Unmount and destroy the EBS volume
129
131
  end
130
132
  end
131
133
 
@@ -140,14 +142,14 @@ routines do
140
142
 
141
143
  backup do # $ rudy backup
142
144
  disks do # A simple routine that creates an EBS
143
- snapshot "/rudy/disk1" # snapshot of the specified volume.
145
+ snapshot '/rudy/disk1' # snapshot of the specified volume.
144
146
  end
145
147
  end
146
148
 
147
- restore_example do # $ rudy restore_example
149
+ restore do # $ rudy restore
148
150
  disks do # A contrived example of restoring a
149
- destroy "/rudy/disk1" # disk from a backup. NOTE: You'll need
150
- restore "/rudy/disk1" # to run "rudy backup" at least once
151
+ destroy '/rudy/disk1' # disk from a backup. NOTE: You'll need
152
+ restore '/rudy/disk1' # to run 'rudy backup' at least once
151
153
  end # before otherise there are no backups
152
154
  end # to restore from.
153
155
 
@@ -157,28 +159,27 @@ routines do
157
159
  # Define global routines available to all machine groups
158
160
  # This routine will update a basic Debian machine and
159
161
  # install essential libraries.
160
- # See examples/ for more.
162
+ # See http://github.com/rudy/arcade
161
163
  sysupdate do # $ rudy sysupdate
162
164
  before :root do
163
- apt_get "update" # Update debian / ubuntu
164
- apt_get "install", "build-essential", "sqlite3", "libsqlite3-dev"
165
- apt_get "install", "apache2-prefork-dev", "libapr1-dev"
165
+ apt_get 'update' # Update debian / ubuntu
166
+ apt_get 'install', 'build-essential', 'sqlite3', 'libsqlite3-dev'
167
+ apt_get 'install', 'apache2-prefork-dev', 'libapr1-dev'
166
168
  gem_install 'rudy'
167
169
  end
168
170
  end
169
171
 
170
172
  anything do # $ rudy anything
171
- before :display_uptime # Specify a dependency
172
- script :rudy do # This is Ruby, so any valid syntax
173
+ before :uptime # Specify a dependency
174
+ script_local do # This is Ruby, so any valid syntax
173
175
  ls :l # can be used in the definitions.
174
176
  end # See: SysInfo gem for more info.
175
177
  end
176
178
 
177
- display_uptime do # $ rudy display-uptime
178
- script :rudy do # NOTE: You can use 'dashes' on the
179
- uptime # command-line instead of underscores
179
+ uptime do # $ rudy uptime
180
+ script_local do
181
+ uptime
180
182
  end
181
183
  end
182
-
183
184
  end
184
185
 
data/bin/rudy CHANGED
@@ -21,8 +21,8 @@ require 'rudy/cli'
21
21
  class RudyCLI < Rudy::CLI::Base
22
22
 
23
23
  debug :off
24
- default :machines
25
- trawler :passthrough
24
+ default :machines # when no command is provided
25
+ trawler :passthrough # unknown command names will forward here.
26
26
 
27
27
  # ------------------------------------------ RUDY GLOBALS --------
28
28
  # ------------------------------------------------------------------
@@ -62,33 +62,26 @@ class RudyCLI < Rudy::CLI::Base
62
62
 
63
63
  # A "do nothing" routine. Passthrough simply executes a routine
64
64
  # config block. Drydock's trawler uses this for unknown commands.
65
- about "A skeleton routine"
65
+ about "A passthrough for custom routines"
66
+ usage "rudy [custom-routine]"
67
+ option :m, :message, String, "A message"
66
68
  command :passthrough => Rudy::CLI::Routines
67
69
 
68
70
  about "Startup a machine group"
69
71
  usage "rudy startup"
72
+ option :m, :message, String, "A message"
70
73
  command :startup => Rudy::CLI::Routines
71
74
 
72
75
  about "Shutdown a machine group"
73
76
  usage "rudy shutdown"
77
+ option :m, :message, String, "A message"
74
78
  command :shutdown => Rudy::CLI::Routines
75
79
 
76
80
  about "Reboot a machine group"
77
81
  usage "rudy reboot"
82
+ option :m, :message, String, "A message"
78
83
  command :reboot => Rudy::CLI::Routines
79
84
 
80
- about "Create a release"
81
- usage "rudy release"
82
- command :release => Rudy::CLI::Routines
83
- command_alias :release, :rerelease
84
-
85
- #about "Update the release currently running in a machine group"
86
- #command :rerelease => Rudy::CLI::Routines
87
- #command_alias :rerelease, :rere
88
-
89
- #about "Deploy disk snapshots from one machine to another"
90
- #command :deploy => Rudy::CLI::Routines
91
-
92
85
 
93
86
  # ------------------------------------ RUDY MISCELLANEOUS --------
94
87
  # ------------------------------------------------------------------
data/lib/rudy.rb CHANGED
@@ -38,7 +38,7 @@ module Rudy
38
38
  unless defined?(MAJOR)
39
39
  MAJOR = 0.freeze
40
40
  MINOR = 8.freeze
41
- TINY = 1.freeze
41
+ TINY = 2.freeze
42
42
  end
43
43
  def self.to_s; [MAJOR, MINOR, TINY].join('.'); end
44
44
  def self.to_f; self.to_s.to_f; end
@@ -163,6 +163,6 @@ require 'rudy/aws' # is
163
163
  require 'rudy/metadata' # important
164
164
  require 'rudy/machines'
165
165
  require 'rudy/routines'
166
- require 'rudy/scm'
166
+
167
167
 
168
168
 
@@ -4,7 +4,7 @@ module Rudy; module CLI;
4
4
  class Routines < Rudy::CLI::CommandBase
5
5
 
6
6
  def startup_valid?
7
- @rr = Rudy::Routines::Startup.new
7
+ @rr = Rudy::Routines::Startup.new(@alias, @option, @argv)
8
8
  @rr.raise_early_exceptions
9
9
  true
10
10
  end
@@ -17,7 +17,7 @@ module Rudy; module CLI;
17
17
  end
18
18
 
19
19
  def reboot_valid?
20
- @rr = Rudy::Routines::Reboot.new
20
+ @rr = Rudy::Routines::Reboot.new(@alias, @option, @argv)
21
21
  @rr.raise_early_exceptions
22
22
  true
23
23
  end
@@ -29,24 +29,8 @@ module Rudy; module CLI;
29
29
  end
30
30
  end
31
31
 
32
- def release_valid?
33
- @rr = Rudy::Routines::Release.new(@alias) # Important: could be rerelease
34
- @rr.raise_early_exceptions
35
- true
36
- end
37
- def release
38
- machines = @rr.execute
39
-
40
- unless machines.empty?
41
- puts $/, "The following machines were processed:"
42
- machines.each do |machine|
43
- puts machine.to_s
44
- end
45
- end
46
- end
47
-
48
32
  def passthrough_valid?
49
- @rr = Rudy::Routines::Passthrough.new(@alias)
33
+ @rr = Rudy::Routines::Passthrough.new(@alias, @option, @argv)
50
34
  @rr.raise_early_exceptions
51
35
  true
52
36
  end
@@ -76,7 +60,7 @@ module Rudy; module CLI;
76
60
  end
77
61
 
78
62
  def shutdown_valid?
79
- @rr = Rudy::Routines::Shutdown.new
63
+ @rr = Rudy::Routines::Shutdown.new(@alias, @option, @argv)
80
64
  @rr.raise_early_exceptions
81
65
  true
82
66
  end
data/lib/rudy/config.rb CHANGED
@@ -64,6 +64,7 @@ module Rudy
64
64
  typelist = self.keys.collect { |g| "#{g}.rb" }.join(',')
65
65
 
66
66
  # Rudy then looks for the rest of the config in these locations
67
+ @paths += Dir.glob(File.join(Rudy.sysinfo.home, '.rudy', '*.rb')) || []
67
68
  @paths += Dir.glob(File.join(cwd, 'Rudyfile')) || []
68
69
  @paths += Dir.glob(File.join(cwd, 'config', 'rudy', '*.rb')) || []
69
70
  @paths += Dir.glob(File.join(cwd, '.rudy', '*.rb')) || []
@@ -33,11 +33,14 @@ class Rudy::Config
33
33
  @@processed = false
34
34
  forced_array :allow
35
35
  forced_array :deny
36
+ chill :allow
37
+
36
38
  def init
37
39
  # We can't process the Rye::Cmd commands here because the
38
40
  # DSL hasn't been parsed yet so Rudy::Config.postprocess
39
41
  # called the following postprocess method after parsing.
40
42
  end
43
+
41
44
  # Process the directives specified in the commands config.
42
45
  # NOTE: This affects the processing of the routines config
43
46
  # which only works if commands is parsed first. This works
@@ -54,52 +57,45 @@ class Rudy::Config
54
57
  # commands do
55
58
  # allow :kill
56
59
  # allow :custom_script, '/full/path/2/custom_script'
57
- # allow :git_clone, "/usr/bin/git", "clone"
60
+ # allow :git_clone, '/usr/bin/git', 'clone'
58
61
  # end
59
62
  #
60
63
  # * Tells Routines to force_array on the command name.
61
64
  # This is important b/c of the way we parse commands
62
65
  self.allow.each do |cmd|
63
- cmd, path, *args = *cmd
64
-
65
- # If no path was specified, we can assume cmd is in the remote path so
66
- # when we add the method to Rye::Cmd, we'll it the path is "cmd".
67
- path ||= cmd.to_s
68
-
69
- # We cannot allow new commands to be defined that conflict use known
70
- # routines keywords. This is based on keywords in the current config.
71
- # NOTE: We can't check for this right now b/c the routines config
72
- # won't necessarily have been parsed yet. TODO: Figure it out!
73
- #if Caesars.known_symbol_by_glass?(:routines, cmd)
74
- # raise ReservedKeyword.new(:commands, cmd)
75
- #end
66
+ cmd, *args = *cmd
76
67
 
77
68
  # We can allow existing commands to be overridden but we
78
69
  # print a message to STDERR so the user knows what's up.
79
- STDERR.puts "Redefined #{cmd}" if Rye::Cmd.can?(cmd)
80
-
81
- # The second argument if supplied must be a filesystem path
82
- raise PathNotString.new(:commands, cmd) if path && !path.is_a?(String)
70
+ STDERR.puts "Redefining #{cmd}" if Rye::Cmd.can?(cmd)
83
71
 
84
- # Insert hardcoded arguments if any were supplied. These will
85
- # be sent automatically with every call to the new command.
86
- # This loop prepares the hardcoded args to be passed to eval.
87
- args.collect! do |arg|
88
- klass = [Symbol, String] & [arg.class]
89
- raise BadArg.new(:commands, cmd) if klass.empty?
90
- # Symbols sent as Symbols, Strings as Strings
91
- arg.is_a?(Symbol) ? ":#{arg}" : "'#{arg}'"
72
+ if args.last.is_a?(Proc)
73
+ block = args.pop
74
+ Rye::Cmd.add_command(cmd, nil, args, &block)
75
+ else
76
+ # If no path was specified, we can assume cmd is in the remote path so
77
+ # when we add the method to Rye::Cmd, we'll it the path is "cmd".
78
+ path = args.shift || cmd.to_s
79
+
80
+ raise PathNotString.new(:commands, cmd) if path && !path.is_a?(String)
81
+
82
+ Rye::Cmd.add_command cmd, path, args
83
+
92
84
  end
93
- hard_args = args.empty? ? "*args" : "#{args.join(', ')}, *args"
94
-
95
- # TODO: Use define_method
96
- Rye::Cmd.module_eval %Q{
97
- def #{cmd}(*args); cmd(:'#{path}', #{hard_args}); end
98
- }
85
+
86
+
87
+ ## We cannot allow new commands to be defined that conflict use known
88
+ ## routines keywords. This is based on keywords in the current config.
89
+ ## NOTE: We can't check for this right now b/c the routines config
90
+ ## won't necessarily have been parsed yet. TODO: Figure it out!
91
+ ##if Caesars.known_symbol_by_glass?(:routines, cmd)
92
+ ## raise ReservedKeyword.new(:commands, cmd)
93
+ ##end
99
94
 
100
95
  end
96
+
101
97
  ## NOTE: We now process command blocks as Procs rather than individual commands.
102
- # There's currently no need to ForceRefresh here
98
+ ## There's currently no need to ForceRefresh here
103
99
  ##raise Caesars::Config::ForceRefresh.new(:routines)
104
100
  end
105
101
  end