rudy 0.8.5 → 0.9.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.
- data/CHANGES.txt +110 -18
- data/README.rdoc +40 -44
- data/Rudyfile +35 -50
- data/bin/rudy +88 -57
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +59 -91
- data/lib/rudy/aws.rb +4 -45
- data/lib/rudy/aws/ec2.rb +57 -20
- data/lib/rudy/aws/ec2/address.rb +10 -11
- data/lib/rudy/aws/ec2/group.rb +10 -9
- data/lib/rudy/aws/ec2/image.rb +8 -8
- data/lib/rudy/aws/ec2/instance.rb +18 -19
- data/lib/rudy/aws/ec2/keypair.rb +14 -19
- data/lib/rudy/aws/ec2/snapshot.rb +16 -9
- data/lib/rudy/aws/ec2/volume.rb +39 -26
- data/lib/rudy/aws/ec2/zone.rb +5 -4
- data/lib/rudy/aws/s3.rb +2 -1
- data/lib/rudy/aws/sdb.rb +35 -86
- data/lib/rudy/backups.rb +24 -0
- data/lib/rudy/cli.rb +5 -131
- data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
- data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
- data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
- data/lib/rudy/cli/aws/ec2/images.rb +5 -133
- data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
- data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
- data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
- data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
- data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
- data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
- data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
- data/lib/rudy/cli/aws/sdb/select.rb +23 -0
- data/lib/rudy/cli/backups.rb +38 -0
- data/lib/rudy/cli/base.rb +104 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +20 -7
- data/lib/rudy/cli/disks.rb +7 -9
- data/lib/rudy/cli/execbase.rb +56 -0
- data/lib/rudy/cli/machines.rb +242 -45
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/networks.rb +34 -0
- data/lib/rudy/cli/routines.rb +32 -6
- data/lib/rudy/cli/status.rb +60 -0
- data/lib/rudy/config.rb +55 -32
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +99 -0
- data/lib/rudy/global.rb +67 -28
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +67 -58
- data/lib/rudy/machines.rb +41 -263
- data/lib/rudy/metadata.rb +212 -38
- data/lib/rudy/metadata/backup.rb +123 -78
- data/lib/rudy/metadata/disk.rb +153 -170
- data/lib/rudy/metadata/machine.rb +179 -0
- data/lib/rudy/mixins.rb +2 -1
- data/lib/rudy/mixins/hash.rb +3 -1
- data/lib/rudy/mixins/symbol.rb +8 -0
- data/lib/rudy/routines.rb +127 -344
- data/lib/rudy/routines/base.rb +229 -0
- data/lib/rudy/routines/handlers/base.rb +48 -0
- data/lib/rudy/routines/handlers/depends.rb +49 -0
- data/lib/rudy/routines/handlers/disks.rb +249 -0
- data/lib/rudy/routines/handlers/group.rb +44 -0
- data/lib/rudy/routines/handlers/host.rb +70 -0
- data/lib/rudy/routines/handlers/keypair.rb +70 -0
- data/lib/rudy/routines/handlers/machines.rb +15 -0
- data/lib/rudy/routines/handlers/script.rb +85 -0
- data/lib/rudy/routines/handlers/user.rb +45 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +98 -50
- data/lib/rudy/routines/shutdown.rb +65 -14
- data/lib/rudy/routines/startup.rb +112 -17
- data/lib/rudy/utils.rb +35 -68
- data/rudy.gemspec +82 -25
- data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
- data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
- data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
- data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
- data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
- data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
- data/tryouts/12_config/40_machines_tryouts.rb +53 -0
- data/tryouts/12_config/50_commands_tryouts.rb +17 -0
- data/tryouts/12_config/60_routines_tryouts.rb +16 -0
- data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
- data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
- data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
- data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
- data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
- data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
- data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
- data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
- data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
- data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
- data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
- data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
- data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
- data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
- data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
- data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
- data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
- data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
- data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
- data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
- data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
- data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
- data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
- data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
- data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
- data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
- data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
- data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
- data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
- data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
- data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
- data/tryouts/exploration/console.rb +91 -0
- data/tryouts/exploration/machine.rb +23 -0
- data/tryouts/failer +6 -0
- metadata +116 -32
- data/bin/ird +0 -153
- data/lib/rudy/metadata/backups.rb +0 -67
- data/lib/rudy/metadata/debug.rb +0 -38
- data/lib/rudy/metadata/disks.rb +0 -67
- data/lib/rudy/metadata/objectbase.rb +0 -108
- data/lib/rudy/routines/helper.rb +0 -76
- data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
- data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
- data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
- data/lib/rudy/routines/helpers/userhelper.rb +0 -37
- data/support/rudy-ec2-startup +0 -200
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
module Rudy; module Routines; module Handlers;
|
3
|
+
module Group
|
4
|
+
include Rudy::Routines::Handlers::Base
|
5
|
+
extend self
|
6
|
+
|
7
|
+
##Rudy::Routines.add_handler :machines, self
|
8
|
+
|
9
|
+
|
10
|
+
def raise_early_exceptions(name=nil)
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def create(name=nil)
|
15
|
+
name ||= current_group_name
|
16
|
+
return if exists? name
|
17
|
+
li "Creating group: #{name}"
|
18
|
+
Rudy::AWS::EC2::Groups.create name
|
19
|
+
end
|
20
|
+
|
21
|
+
def authorize(name=nil, addresses=nil, ports=nil)
|
22
|
+
name ||= current_group_name
|
23
|
+
addresses ||= [Rudy::Utils::external_ip_address]
|
24
|
+
if ports.nil?
|
25
|
+
ports = current_machine_os.to_s == 'win32' ? [[3389,3389]] : [[22,22]]
|
26
|
+
end
|
27
|
+
li "Authorizing ports #{ports.inspect} access for: #{addresses.join(', ')}"
|
28
|
+
Rudy::AWS::EC2::Groups.authorize(name, addresses, ports)
|
29
|
+
end
|
30
|
+
|
31
|
+
def exists?(name=nil)
|
32
|
+
name ||= current_group_name
|
33
|
+
Rudy::AWS::EC2::Groups.exists? name
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy(name=nil)
|
37
|
+
name ||= current_group_name
|
38
|
+
return unless exists? name
|
39
|
+
li "Destroying group: #{name}"
|
40
|
+
Rudy::AWS::EC2::Groups.destroy name
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end; end; end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
module Rudy; module Routines; module Handlers;
|
3
|
+
module Host
|
4
|
+
include Rudy::Routines::Handlers::Base
|
5
|
+
extend self
|
6
|
+
|
7
|
+
## NOTE: This handler doesn't use Rudy::Routines.add_handler
|
8
|
+
|
9
|
+
def is_running?(rset)
|
10
|
+
raise NoMachines if rset.boxes.empty?
|
11
|
+
rset.boxes.each do |rbox|
|
12
|
+
msg = "Waiting for #{rbox.nickname} to boot..."
|
13
|
+
Rudy::Utils.waiter(3, 240, Rudy::Huxtable.logger, msg, 0) {
|
14
|
+
inst = rbox.stash.get_instance
|
15
|
+
inst && inst.running?
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Add instance info to machine and save it. This is really important
|
21
|
+
# for the initial startup so the metadata is updated right away. But
|
22
|
+
# it's also important to call here because if a routine was executed
|
23
|
+
# and an unexpected exception occurs before this update is executed
|
24
|
+
# the machine metadata won't contain the DNS information. Calling it
|
25
|
+
# here ensure that the metadata is always up-to-date.
|
26
|
+
# Each Rye:Box instance has a Rudy::Machine instance in its stash so
|
27
|
+
# rbox.stash.refresh! == machine.refresh!
|
28
|
+
def update_dns(rset)
|
29
|
+
raise NoMachines if rset.boxes.empty?
|
30
|
+
rset.boxes.each do |rbox|
|
31
|
+
rbox.stash.refresh!
|
32
|
+
rbox.host = rbox.stash.dns_public
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def is_available?(rset, port=22)
|
37
|
+
raise NoMachines if rset.boxes.empty?
|
38
|
+
rset.boxes.each do |rbox|
|
39
|
+
unless (rbox.stash.os || '').to_s == 'win32' # No SSH daemon in windows
|
40
|
+
msg = "Waiting for SSH (#{port}) on #{rbox.nickname} ..."
|
41
|
+
Rudy::Utils.waiter(2, 60, STDOUT, msg, 0) {
|
42
|
+
Rudy::Utils.service_available?(rbox.stash.dns_public, port)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_hostname(rset)
|
49
|
+
raise NoMachines if rset.boxes.empty?
|
50
|
+
original_user = rset.user
|
51
|
+
rset.switch_user 'root'
|
52
|
+
rset.add_key user_keypairpath('root')
|
53
|
+
# Set the hostname if specified in the machines config.
|
54
|
+
# :rudy -> change to Rudy's machine name
|
55
|
+
# :default -> leave the hostname as it is
|
56
|
+
# Anything else other than nil -> change to that value
|
57
|
+
# NOTE: This will set hostname every time a routine is
|
58
|
+
# run so we may want to make this an explicit action.
|
59
|
+
type = current_machine_hostname || :rudy
|
60
|
+
rset.batch(type) do |hn|
|
61
|
+
if hn != :default
|
62
|
+
hn = self.stash.name if hn == :rudy
|
63
|
+
self.quietly { hostname(hn) }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
rset.switch_user original_user
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end; end; end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
|
2
|
+
module Rudy; module Routines; module Handlers;
|
3
|
+
module Keypair
|
4
|
+
include Rudy::Routines::Handlers::Base
|
5
|
+
extend self
|
6
|
+
|
7
|
+
##Rudy::Routines.add_handler :machines, self
|
8
|
+
|
9
|
+
|
10
|
+
def raise_early_exceptions(name=:root)
|
11
|
+
keyname = user_keypairname name
|
12
|
+
kp_file = pkey name
|
13
|
+
if registered? keyname
|
14
|
+
# This means no keypair file can be found
|
15
|
+
raise PrivateKeyNotFound, keyname if kp_file.nil?
|
16
|
+
# This means we found a keypair in the config but we cannot find the private key file.
|
17
|
+
raise PrivateKeyNotFound, kp_file if !File.exists?(kp_file)
|
18
|
+
else
|
19
|
+
raise PrivateKeyFileExists, kp_file if File.exists?(kp_file)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def create(name=:root)
|
24
|
+
keyname = user_keypairname name
|
25
|
+
kp_file = pkey name
|
26
|
+
kp = nil
|
27
|
+
if registered? keyname
|
28
|
+
raise PrivateKeyNotFound, keyname if kp_file.nil?
|
29
|
+
raise PrivateKeyNotFound, kp_file if !File.exists?(kp_file)
|
30
|
+
else
|
31
|
+
raise PrivateKeyFileExists, kp_file if File.exists?(kp_file)
|
32
|
+
li "Creating keypair: #{keyname}"
|
33
|
+
kp = Rudy::AWS::EC2::Keypairs.create(keyname)
|
34
|
+
li "Saving #{kp_file}"
|
35
|
+
Rudy::Utils.write_to_file(kp_file, kp.private_key, 'w', 0600)
|
36
|
+
end
|
37
|
+
kp
|
38
|
+
end
|
39
|
+
|
40
|
+
def unregister(name=:root)
|
41
|
+
keyname = user_keypairname name
|
42
|
+
raise "Keypair not registered: #{keyname}" unless registered?(name)
|
43
|
+
Rudy::AWS::EC2::Keypairs.destroy keyname
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_pkey(name=:root)
|
47
|
+
kp_file = pkey name
|
48
|
+
raise PrivateKeyNotFound, kp_file unless pkey?(name)
|
49
|
+
File.unlink kp_file
|
50
|
+
end
|
51
|
+
|
52
|
+
def exists?(name=:root)
|
53
|
+
registered?(name) && pkey?(name)
|
54
|
+
end
|
55
|
+
|
56
|
+
def registered?(name=:root)
|
57
|
+
keyname = user_keypairname name
|
58
|
+
Rudy::AWS::EC2::Keypairs.exists?( keyname) rescue false
|
59
|
+
end
|
60
|
+
|
61
|
+
def pkey(name=:root)
|
62
|
+
user_keypairpath name
|
63
|
+
end
|
64
|
+
|
65
|
+
def pkey?(name=:root)
|
66
|
+
File.exists? pkey(name)
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end; end; end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy; module Routines; module Handlers;
|
4
|
+
module Script
|
5
|
+
include Rudy::Routines::Handlers::Base
|
6
|
+
extend self
|
7
|
+
|
8
|
+
Rudy::Routines.add_handler :local, self
|
9
|
+
Rudy::Routines.add_handler :remote, self
|
10
|
+
|
11
|
+
Rudy::Routines.add_handler :xlocal, self
|
12
|
+
Rudy::Routines.add_handler :xremote, self
|
13
|
+
|
14
|
+
def raise_early_exceptions(type, batch, rset, lbox, argv=nil)
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def execute(type, batch, rset, lbox, argv=nil)
|
19
|
+
if type.to_s =~ /\Ax/ # (e.g. xremote, xlocal)
|
20
|
+
# do nothing
|
21
|
+
|
22
|
+
# It's important this stay a regex rather than a literal comparison
|
23
|
+
elsif type.to_s =~ /local/
|
24
|
+
lbox.cd Dir.pwd
|
25
|
+
batch = { lbox.user => batch } if batch.is_a?(Proc)
|
26
|
+
execute_command(batch, lbox, argv)
|
27
|
+
else
|
28
|
+
batch = { rset.user => batch } if batch.is_a?(Proc)
|
29
|
+
raise NoMachines if rset.boxes.empty?
|
30
|
+
execute_command(batch, rset, argv)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
# * +batch+ a single routine hash (startup, shutdown, etc...)
|
38
|
+
# * +robj+ an instance of Rye::Set or Rye::Box
|
39
|
+
# * +argv+ command line args
|
40
|
+
def execute_command(batch, robj, argv=nil)
|
41
|
+
|
42
|
+
original_user = robj.user
|
43
|
+
original_dir = robj.current_working_directory
|
44
|
+
|
45
|
+
batch.each_pair do |user, proc|
|
46
|
+
|
47
|
+
# The error doesn't apply to the local Rye::Box instance
|
48
|
+
if robj.is_a?(Rye::Set) && !File.exists?(user_keypairpath(user) || '')
|
49
|
+
le "Cannot find key for #{user}: #{user_keypairpath(user)}"
|
50
|
+
end
|
51
|
+
|
52
|
+
if user.to_s != robj.user
|
53
|
+
begin
|
54
|
+
ld "Switching user to: #{user} (was: #{robj.user})"
|
55
|
+
ld "(key: #{user_keypairpath(user)})"
|
56
|
+
|
57
|
+
robj.add_key user_keypairpath(user)
|
58
|
+
robj.switch_user user
|
59
|
+
|
60
|
+
rescue Net::SSH::AuthenticationFailed, Net::SSH::HostKeyMismatch => ex
|
61
|
+
STDERR.puts "Error connecting: #{ex.message}".color(:red)
|
62
|
+
STDERR.puts "Skipping user #{user}".color(:red)
|
63
|
+
next
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
### EXECUTE THE COMMANDS BLOCK
|
68
|
+
begin
|
69
|
+
robj.batch(argv, &proc)
|
70
|
+
ensure
|
71
|
+
robj.enable_safe_mode # In case it was disabled
|
72
|
+
robj.switch_user original_user # Return to the user it was provided with
|
73
|
+
robj.cd # reset to home dir
|
74
|
+
robj.cd original_dir # return to previous directory
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end;end;end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
|
2
|
+
module Rudy; module Routines; module Handlers;
|
3
|
+
module User
|
4
|
+
include Rudy::Routines::Handlers::Base
|
5
|
+
extend self
|
6
|
+
|
7
|
+
Rudy::Routines.add_handler :adduser, self
|
8
|
+
Rudy::Routines.add_handler :authorize, self
|
9
|
+
|
10
|
+
def raise_early_exceptions(type, user, rset, lbox, argv=nil)
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
def execute(type, user, rset, lbox, argv=nil)
|
15
|
+
raise NoMachines if rset.boxes.empty?
|
16
|
+
send(type, user, rset)
|
17
|
+
end
|
18
|
+
|
19
|
+
def adduser(user, robj)
|
20
|
+
|
21
|
+
# On Solaris, the user's home directory needs to be specified
|
22
|
+
# explicitly so we do it for linux too for fun.
|
23
|
+
homedir = robj.guess_user_home(user.to_s)
|
24
|
+
|
25
|
+
# When more than one machine is running, this will be an Array
|
26
|
+
homedir = homedir.first if homedir.kind_of?(Array)
|
27
|
+
|
28
|
+
args = [:m, :d, homedir, :s, '/bin/bash', user.to_s]
|
29
|
+
|
30
|
+
# NOTE: We'll may to use platform specific code here.
|
31
|
+
# Linux has adduser and useradd commands:
|
32
|
+
# adduser can prompt for info which we don't want.
|
33
|
+
# useradd does not prompt (on Debian/Ubuntu at least).
|
34
|
+
# We need to specify bash b/c the default is /bin/sh
|
35
|
+
robj.useradd(args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def authorize(user, robj)
|
39
|
+
robj.authorize_keys_remote(user.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
end; end; end
|
@@ -1,36 +1,32 @@
|
|
1
1
|
|
2
|
-
|
3
2
|
module Rudy; module Routines;
|
4
3
|
class Passthrough < Rudy::Routines::Base
|
5
4
|
|
6
5
|
def init(*args)
|
7
|
-
@
|
6
|
+
@machines = Rudy::Machines.list || []
|
7
|
+
@@rset = create_rye_set @machines unless defined?(@@rset)
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
puts $/ #, "[routine: #{@cmdname}]"
|
18
|
-
machines << machine
|
19
|
-
end
|
20
|
-
machines
|
10
|
+
def execute
|
11
|
+
ld "Executing routine: #{@name}"
|
12
|
+
return @machines unless run?
|
13
|
+
Rudy::Routines::Handlers::Depends.execute_all @before
|
14
|
+
Rudy::Routines.runner(@routine, @@rset, @@lbox, @argv)
|
15
|
+
Rudy::Routines::Handlers::Depends.execute_all @after
|
16
|
+
@machines
|
21
17
|
end
|
22
|
-
|
18
|
+
|
23
19
|
# Called by generic_machine_runner
|
24
20
|
def raise_early_exceptions
|
25
|
-
raise Rudy::Error, "No routine name" unless @
|
26
|
-
raise NoRoutine, @
|
27
|
-
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
21
|
+
raise Rudy::Error, "No routine name" unless @name
|
22
|
+
raise NoRoutine, @name unless @routine
|
23
|
+
##raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
24
|
+
# Call raise_early_exceptions for each handler used in the routine
|
25
|
+
@routine.each_pair do |action,definition|
|
26
|
+
raise NoHandler, action unless Rudy::Routines.has_handler?(action)
|
27
|
+
handler = Rudy::Routines.get_handler action
|
28
|
+
handler.raise_early_exceptions(action, definition, @@rset, @@lbox, @argv)
|
29
|
+
end
|
34
30
|
end
|
35
31
|
|
36
32
|
end
|
data/lib/rudy/routines/reboot.rb
CHANGED
@@ -3,73 +3,121 @@
|
|
3
3
|
module Rudy; module Routines;
|
4
4
|
class Reboot < Rudy::Routines::Base
|
5
5
|
|
6
|
+
Rudy::Routines.add_routine :reboot, self
|
7
|
+
|
8
|
+
@@allowed_actions = [:before, :disks, :adduser, :authorize,
|
9
|
+
:before_local, :before_remote,
|
10
|
+
:local, :remote, :after]
|
11
|
+
|
6
12
|
def init(*args)
|
7
|
-
@routine
|
13
|
+
@routine ||= {}
|
14
|
+
@machines = Rudy::Machines.list
|
15
|
+
@@rset = create_rye_set @machines unless defined?(@@rset)
|
8
16
|
end
|
9
17
|
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
puts $/, "Rebooting...", $/
|
22
|
-
rbox.disconnect unless rbox.nil?
|
23
|
-
machine.restart
|
24
|
-
sleep 4
|
25
|
-
msg = preliminary_separator("Checking if instance is running...")
|
26
|
-
Rudy::Utils.waiter(3, 120, STDOUT, msg, 0) {
|
27
|
-
machine.running?
|
28
|
-
}
|
18
|
+
# Startup routines run in the following order:
|
19
|
+
# * before_local (if present)
|
20
|
+
# * before_remote (if present)
|
21
|
+
# * Reboot instances
|
22
|
+
# * Set hostname
|
23
|
+
# * before dependencies
|
24
|
+
# * all other actions
|
25
|
+
# * after dependencies
|
26
|
+
def execute
|
27
|
+
ld "Executing routine: #{@name}"
|
28
|
+
ld "[this is a generic routine]" if @routine.empty?
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
# and an unexpected exception occurs before this update is executed
|
34
|
-
# the machine metadata won't contain the DNS information. Calling it
|
35
|
-
# here ensure that the metadata is always up-to-date.
|
36
|
-
machine.update
|
37
|
-
|
38
|
-
sleep 4
|
39
|
-
|
40
|
-
msg = preliminary_separator("Waiting for SSH daemon...")
|
41
|
-
Rudy::Utils.waiter(3, 120, STDOUT, msg, 0) {
|
42
|
-
Rudy::Utils.service_available?(machine.dns_public, 22)
|
30
|
+
if run?
|
31
|
+
Rudy::Routines.rescue {
|
32
|
+
Rudy::Routines::Handlers::Group.authorize rescue nil
|
43
33
|
}
|
44
34
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
35
|
+
if @routine.has_key? :before_local
|
36
|
+
handler = Rudy::Routines.get_handler :local
|
37
|
+
Rudy::Routines.rescue {
|
38
|
+
handler.execute(:local, @routine.delete(:before_local), nil, @@lbox, @argv)
|
39
|
+
}
|
40
|
+
end
|
49
41
|
|
50
|
-
if
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
Rudy::Routines::DiskHelper.execute(@routine, machine, rbox)
|
56
|
-
end
|
42
|
+
if @routine.has_key? :before_remote
|
43
|
+
handler = Rudy::Routines.get_handler :remote
|
44
|
+
Rudy::Routines.rescue {
|
45
|
+
handler.execute(:remote, @routine.delete(:before_remote), @@rset, @@lbox, @argv)
|
46
|
+
}
|
57
47
|
end
|
58
|
-
|
59
|
-
machines << machine
|
60
48
|
end
|
61
|
-
|
49
|
+
|
50
|
+
Rudy::Routines.rescue {
|
51
|
+
if Rudy::Routines::Handlers::Disks.mount? @routine
|
52
|
+
fake = Hash[:umount => @routine.disks[:mount]]
|
53
|
+
Rudy::Routines::Handlers::Disks.execute :umount, fake, @@rset, @@lbox, @argv
|
54
|
+
end
|
55
|
+
}
|
56
|
+
|
57
|
+
li "Rebooting #{current_group_name}..."
|
58
|
+
@machines.each { |m| m.restart } if run?
|
59
|
+
|
60
|
+
15.times { print '.'; Kernel.sleep 2 }; puts $/ # Wait for 30 seconds
|
61
|
+
|
62
|
+
Rudy::Routines.rescue {
|
63
|
+
if !Rudy::Routines::Handlers::Host.is_running? @@rset
|
64
|
+
a = @@rset.boxes.select { |box| !box.stash.instance_running? }
|
65
|
+
raise GroupNotRunning, a
|
66
|
+
end
|
67
|
+
}
|
68
|
+
|
69
|
+
# This is important b/c the machines will not
|
70
|
+
# have DNS info until after they are running.
|
71
|
+
Rudy::Routines.rescue { Rudy::Routines::Handlers::Host.update_dns @@rset }
|
72
|
+
|
73
|
+
Rudy::Routines.rescue {
|
74
|
+
if !Rudy::Routines::Handlers::Host.is_available? @@rset
|
75
|
+
a = @@rset.boxes.select { |box| !box.stash.instance_available? }
|
76
|
+
raise GroupNotAvailable, a
|
77
|
+
end
|
78
|
+
}
|
79
|
+
Rudy::Routines.rescue {
|
80
|
+
Rudy::Routines::Handlers::Host.set_hostname @@rset
|
81
|
+
}
|
82
|
+
|
83
|
+
if run?
|
84
|
+
# This is the meat of the sandwich
|
85
|
+
Rudy::Routines.runner @routine, @@rset, @@lbox, @argv
|
86
|
+
|
87
|
+
Rudy::Routines.rescue {
|
88
|
+
Rudy::Routines::Handlers::Depends.execute_all @after
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
@machines
|
62
93
|
end
|
63
94
|
|
64
95
|
# Called by generic_machine_runner
|
65
96
|
def raise_early_exceptions
|
66
|
-
|
97
|
+
raise NoMachinesConfig unless @@config.machines
|
67
98
|
# There's no keypair check here because Rudy::Machines will attempt
|
68
99
|
# to create one.
|
69
100
|
raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
70
|
-
|
101
|
+
|
102
|
+
# If this is a test run we don't care if the group is running
|
103
|
+
if run?
|
104
|
+
raise MachineGroupNotRunning, current_machine_group unless Rudy::Machines.running?
|
105
|
+
end
|
106
|
+
|
107
|
+
if @routine
|
108
|
+
bad = @routine.keys - @@allowed_actions
|
109
|
+
raise UnsupportedActions.new(@name, bad) unless bad.empty?
|
110
|
+
end
|
111
|
+
|
112
|
+
if @machines
|
113
|
+
down = @@rset.boxes.select { |box| !box.stash.instance_running? }
|
114
|
+
raise GroupNotAvailable, down unless down.empty?
|
115
|
+
end
|
116
|
+
|
71
117
|
end
|
72
118
|
|
73
119
|
end
|
74
120
|
|
75
|
-
end; end
|
121
|
+
end; end
|
122
|
+
|
123
|
+
|