solutious-rudy 0.8.2 → 0.8.3

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 CHANGED
@@ -1,13 +1,26 @@
1
1
  RUDY, CHANGES
2
2
 
3
3
 
4
+ #### 0.8.3 (2009-06-03) ###############################
4
5
 
5
- #### 0.8.2 (2009-05-28) ###############################
6
+ * CHANGE: Now requires rye-0.7.3 (disable_safe_mode method)
7
+ * CHANGE: Rye safe-mode is enabled after each routines script block to force disabling it
8
+ explicitly in every block it's needed.
9
+ * CHANGE: Removed grit dependency
10
+
11
+
12
+ #### 0.8.2 (2009-06-01) ###############################
6
13
 
7
14
  * CHANGE: Removed release routine code (it's now a passthrough) and scmhelper. All release stuff should
8
15
  be implemented using the routine blocks.
9
16
  * CHANGE: Passthrough routines no longer check if machine group is running.
10
17
  * CHANGE: Local routines blocks now run from current working directory
18
+ * CHANGE: Removed SCM classes (moved logic to the Arcade)
19
+ * CHANGE: Moved examples to the Arcade (experimental)
20
+ * CHANGE: Command output in routines is now displayed only when verbose is 1 or more.
21
+ * ADDED: Routine blocks now receive command line options and arguments
22
+ * ADDED: Commands configuration now supports inline blocks
23
+ * ADDED: Rudy now looks for ~/.rudy/*.rb config files.
11
24
 
12
25
 
13
26
  #### 0.8.1 (2009-05-18) ###############################
@@ -31,8 +44,9 @@ RUDY, CHANGES
31
44
  #### 0.7.4 (2009-05-10) ###############################
32
45
 
33
46
  * CHANGE: Keypairs now include zone. This was necessary to allow US and EU keypairs to
34
- be stored in the same directory.
35
- * CHANGE: Moved non-rudy specific modules to separate projects (storable, sysinfo, annoy, console -> Drydock, escape -> Rye, tryouts -> tryouts/).
47
+ be stored in the same directory.
48
+ * CHANGE: Moved non-rudy specific modules to separate projects (storable, sysinfo, annoy,
49
+ console -> Drydock, escape -> Rye, tryouts -> tryouts/).
36
50
  * CHANGE: Renamed restart routine to reboot to make it clear it's about the machine
37
51
  * CHANGE: Renamed Rudy::Disk to Rudy::MetaData::Disk
38
52
  * CHANGE: Short alias for rudy-ec2 snapshot is now 's' (instead of 't')
@@ -96,7 +110,7 @@ to maintain consistency in documentation.
96
110
 
97
111
  * ADDED: rudy-ec2 status can now display EU status
98
112
  * FIXED: Fixed bug on instance create. Instance.groups was nil, now it returns
99
- empty Array.
113
+ empty Array.
100
114
 
101
115
  #### 0.6.6 (2009-04-22) ###############################
102
116
 
@@ -185,9 +199,9 @@ NOTE: This is a complete re-write from 0.1
185
199
  * CHANGE: upgrade to drydock 0.3.3
186
200
  * ADDED: All time references are converted to UTC
187
201
  * ADDED: Safer "Are you sure?". Number of characters to enter is
188
- commiserate with amount of danger.
202
+ commiserate with amount of danger.
189
203
  * ADDED: CLIs: myaddress, addresses, images, instances,
190
- disks, connect, copy, stage, backups, volumes
204
+ disks, connect, copy, stage, backups, volumes
191
205
  * ADDED: Metadata storage to SimpleDB for disks, backups
192
206
  * ADDED: Creates EBS volumes based on startup from metadata
193
207
  * ADDED: Automated release process
data/README.rdoc CHANGED
@@ -52,9 +52,9 @@ The routines configuration describes repeatable processes that you can execute o
52
52
  end
53
53
 
54
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
55
+ mkdir :p, "great" # $ mkdir -p great
56
+ touch "great/scott" # $ touch great/scott
57
+ ls :l, :a # $ ls -l -a
58
58
  end
59
59
  end
60
60
 
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,43 +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
-
171
172
  anything do # $ rudy anything
172
- before :display_uptime # Specify a dependency
173
- 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
174
175
  ls :l # can be used in the definitions.
175
176
  end # See: SysInfo gem for more info.
176
177
  end
177
178
 
178
- display_uptime do # $ rudy display-uptime
179
- script :rudy do # NOTE: You can use 'dashes' on the
180
- uptime # command-line instead of underscores
181
- end
182
- end
183
-
184
- git_example do
185
- before_local do
186
- # Store variables using global variables. But be
187
- # aware that the dollar sign variables can be set
188
- # anywhere.
189
- @sha = git 'rev-parse', '--short', 'HEAD'
190
- @tagname = Time.now.strftime("%Y-%m-%d-#{Rudy.sysinfo.user}-#{@sha}")
191
- git 'tag', :a, @tagname, :m, "Another release by Rudy"
192
- end
179
+ uptime do # $ rudy uptime
193
180
  script_local do
194
- echo @tagname
181
+ uptime
195
182
  end
196
183
  end
197
-
198
184
  end
199
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,19 +62,24 @@ 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
85
 
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 = 2.freeze
41
+ TINY = 3.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
data/lib/rudy/huxtable.rb CHANGED
@@ -241,6 +241,7 @@ module Rudy
241
241
  # That's how Rudy knows the current group is defined.
242
242
  def known_machine_group?
243
243
  raise NoConfig unless @@config
244
+ return true if default_machine_group?
244
245
  raise NoMachinesConfig unless @@config.machines
245
246
  return false if !@@config && !@@global
246
247
  zon, env, rol = @@global.zone, @@global.environment, @@global.role
@@ -327,13 +328,20 @@ module Rudy
327
328
  def fetch_machine_param(parameter)
328
329
  raise "No parameter specified" unless parameter
329
330
  raise NoConfig unless @@config
330
- raise NoMachinesConfig unless @@config.machines
331
+ return if !@@config.machines && default_machine_group?
332
+ raise NoMachinesConfig if !@@config.machines
331
333
  raise NoGlobal unless @@global
332
334
  top_level = @@config.machines.find(parameter)
333
335
  mc = fetch_machine_config
334
336
  mc[parameter] || top_level || nil
335
337
  end
336
338
 
339
+ # Returns true if this is the default machine environment and role
340
+ def default_machine_group?
341
+ @@global.environment == @@config.defaults.environment &&
342
+ @@global.role == @@config.defaults.role
343
+ end
344
+
337
345
  def fetch_machine_config
338
346
  raise NoConfig unless @@config
339
347
  raise NoMachinesConfig unless @@config.machines