solutious-rudy 0.8.5 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +55 -14
- data/README.rdoc +26 -34
- data/Rudyfile +27 -32
- data/bin/rudy +47 -27
- data/bin/rudy-ec2 +2 -16
- data/bin/rudy-s3 +0 -10
- data/bin/rudy-sdb +11 -12
- data/lib/rudy.rb +49 -89
- data/lib/rudy/aws.rb +2 -43
- 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 +15 -16
- 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 +37 -24
- 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 +32 -7
- 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 +98 -0
- data/lib/rudy/cli/candy.rb +1 -2
- data/lib/rudy/cli/config.rb +7 -4
- data/lib/rudy/cli/disks.rb +6 -8
- data/lib/rudy/cli/execbase.rb +53 -0
- data/lib/rudy/cli/machines.rb +14 -18
- data/lib/rudy/cli/metadata.rb +24 -10
- data/lib/rudy/cli/routines.rb +31 -5
- data/lib/rudy/config.rb +17 -22
- data/lib/rudy/config/objects.rb +44 -30
- data/lib/rudy/disks.rb +25 -0
- data/lib/rudy/exceptions.rb +95 -0
- data/lib/rudy/global.rb +46 -23
- data/lib/rudy/guidelines.rb +3 -2
- data/lib/rudy/huxtable.rb +66 -57
- 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 +152 -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 +226 -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 +239 -0
- data/lib/rudy/routines/handlers/group.rb +42 -0
- data/lib/rudy/routines/handlers/host.rb +72 -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 +41 -0
- data/lib/rudy/routines/passthrough.rb +19 -23
- data/lib/rudy/routines/reboot.rb +82 -51
- data/lib/rudy/routines/shutdown.rb +61 -14
- data/lib/rudy/routines/startup.rb +111 -17
- data/lib/rudy/utils.rb +12 -59
- data/rudy.gemspec +85 -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/failer +6 -0
- data/tryouts/misc/console_tryout.rb +91 -0
- data/tryouts/misc/disks_tryout.rb +48 -0
- data/tryouts/misc/drydock_tryout.rb +48 -0
- data/tryouts/misc/nested_methods.rb +103 -0
- data/tryouts/misc/session_tryout.rb +46 -0
- data/tryouts/misc/tryouts.rb +33 -0
- data/tryouts/misc/usage_tryout.rb +23 -0
- metadata +119 -31
- 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,42 @@
|
|
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
|
+
ports ||= [[22,22]]
|
25
|
+
li "Authorizing group: #{addresses.inspect} (#{ports.inspect})"
|
26
|
+
Rudy::AWS::EC2::Groups.authorize(name, addresses, ports)
|
27
|
+
end
|
28
|
+
|
29
|
+
def exists?(name=nil)
|
30
|
+
name ||= current_group_name
|
31
|
+
Rudy::AWS::EC2::Groups.exists? name
|
32
|
+
end
|
33
|
+
|
34
|
+
def destroy(name=nil)
|
35
|
+
name ||= current_group_name
|
36
|
+
return unless exists? name
|
37
|
+
li "Destroying group: #{name}"
|
38
|
+
Rudy::AWS::EC2::Groups.destroy name
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end; end; end
|
@@ -0,0 +1,72 @@
|
|
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.batch(rset.parallel) do |parallel|
|
12
|
+
msg = "Starting #{self.nickname}..."
|
13
|
+
output = parallel ? nil : Rudy::Huxtable.logger
|
14
|
+
Rudy::Utils.waiter(3, 120, output, msg, 0) {
|
15
|
+
inst = self.stash.get_instance
|
16
|
+
inst && inst.running?
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Add instance info to machine and save it. This is really important
|
22
|
+
# for the initial startup so the metadata is updated right away. But
|
23
|
+
# it's also important to call here because if a routine was executed
|
24
|
+
# and an unexpected exception occurs before this update is executed
|
25
|
+
# the machine metadata won't contain the DNS information. Calling it
|
26
|
+
# here ensure that the metadata is always up-to-date.
|
27
|
+
# Each Rye:Box instance has a Rudy::Machine instance in its stash so
|
28
|
+
# self.stash.update == machine.update
|
29
|
+
def update_dns(rset)
|
30
|
+
raise NoMachines if rset.boxes.empty?
|
31
|
+
rset.batch do
|
32
|
+
self.stash.refresh!
|
33
|
+
self.host = self.stash.dns_public
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_available?(rset, port=22)
|
38
|
+
raise NoMachines if rset.boxes.empty?
|
39
|
+
rset.batch(rset.parallel, port) do |parallel,p|
|
40
|
+
# Windows machines do not have an SSH daemon
|
41
|
+
unless (self.stash.os || '').to_s == 'win32'
|
42
|
+
msg = parallel ? nil : "Waiting for SSH on port #{p}..."
|
43
|
+
Rudy::Utils.waiter(2, 30, STDOUT, msg, 0) {
|
44
|
+
Rudy::Utils.service_available?(self.stash.dns_public, p)
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def set_hostname(rset)
|
51
|
+
raise NoMachines if rset.boxes.empty?
|
52
|
+
original_user = rset.user
|
53
|
+
rset.add_key user_keypairpath('root')
|
54
|
+
rset.switch_user 'root'
|
55
|
+
# Set the hostname if specified in the machines config.
|
56
|
+
# :rudy -> change to Rudy's machine name
|
57
|
+
# :default -> leave the hostname as it is
|
58
|
+
# Anything else other than nil -> change to that value
|
59
|
+
# NOTE: This will set hostname every time a routine is
|
60
|
+
# run so we may want to make this an explicit action.
|
61
|
+
type = current_machine_hostname || :rudy
|
62
|
+
rset.batch(type) do |hn|
|
63
|
+
if hn != :default
|
64
|
+
hn = self.stash.name if hn == :rudy
|
65
|
+
self.quietly { hostname(hn) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
rset.switch_user original_user
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
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/
|
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,41 @@
|
|
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
|
+
args = [:m, :d, homedir, :s, '/bin/bash', user.to_s]
|
25
|
+
|
26
|
+
# NOTE: We'll may to use platform specific code here.
|
27
|
+
# Linux has adduser and useradd commands:
|
28
|
+
# adduser can prompt for info which we don't want.
|
29
|
+
# useradd does not prompt (on Debian/Ubuntu at least).
|
30
|
+
# We need to specify bash b/c the default is /bin/sh
|
31
|
+
robj.useradd(args)
|
32
|
+
end
|
33
|
+
|
34
|
+
def authorize(user, robj)
|
35
|
+
robj.authorize_keys_remote(user.to_s)
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
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,104 @@
|
|
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 ||= {}
|
8
14
|
end
|
9
15
|
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
# Startup routines run in the following order:
|
17
|
+
# * before_local (if present)
|
18
|
+
# * before_remote (if present)
|
19
|
+
# * Reboot instances
|
20
|
+
# * Set hostname
|
21
|
+
# * before dependencies
|
22
|
+
# * all other actions
|
23
|
+
# * after dependencies
|
24
|
+
def execute
|
25
|
+
ld "Executing routine: #{@name}"
|
26
|
+
ld "[this is a generic routine]" if @routine.empty?
|
27
|
+
|
28
|
+
|
29
|
+
# If this is a testrun we won't create new instances
|
30
|
+
# we'll just grab the list of machines in this group.
|
31
|
+
# NOTE: Expect errors if there are no machines.
|
32
|
+
@machines = run? ? Rudy::Machines.restart : Rudy::Machines.list
|
33
|
+
@@rset = create_rye_set @machines unless defined?(@@rset)
|
34
|
+
|
35
|
+
if run?
|
36
|
+
if @routine.has_key? :before_local
|
37
|
+
handler = Rudy::Routines.get_handler :local
|
38
|
+
Rudy::Routines.rescue {
|
39
|
+
handler.execute(:local, @routine.delete(:before_local), nil, @@lbox, @argv)
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
if @routine.has_key? :before_remote
|
44
|
+
handler = Rudy::Routines.get_handler :remote
|
45
|
+
Rudy::Routines.rescue {
|
46
|
+
handler.execute(:remote, @routine.delete(:before_remote), @@rset, @@lbox, @argv)
|
47
|
+
}
|
48
|
+
end
|
18
49
|
end
|
19
|
-
machines = []
|
20
|
-
generic_machine_runner(:list) do |machine,rbox|
|
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
|
-
}
|
29
50
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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)
|
43
|
-
}
|
44
|
-
|
45
|
-
# NOTE: THIS IS INCOMPLETE
|
46
|
-
|
47
|
-
sleep 1 # Avoid IOError: closed stream on SSH
|
48
|
-
|
51
|
+
Rudy::Routines.rescue {
|
52
|
+
if !Rudy::Routines::Handlers::Host.is_running? @@rset
|
53
|
+
a = @@rset.boxes.select { |box| !box.stash.running? }
|
54
|
+
raise GroupNotRunning, a
|
55
|
+
end
|
56
|
+
}
|
57
|
+
|
58
|
+
# This is important b/c the machines will not
|
59
|
+
# have DNS info until after they are running.
|
60
|
+
Rudy::Routines.rescue { Rudy::Routines::Handlers::Host.update_dns @@rset }
|
49
61
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
else
|
55
|
-
Rudy::Routines::DiskHelper.execute(@routine, machine, rbox)
|
56
|
-
end
|
62
|
+
Rudy::Routines.rescue {
|
63
|
+
if !Rudy::Routines::Handlers::Host.is_available? @@rset
|
64
|
+
a = @@rset.boxes.select { |box| !box.stash.available? }
|
65
|
+
raise GroupNotAvailable, a
|
57
66
|
end
|
58
|
-
|
59
|
-
|
67
|
+
}
|
68
|
+
Rudy::Routines.rescue {
|
69
|
+
Rudy::Routines::Handlers::Host.set_hostname @@rset
|
70
|
+
}
|
71
|
+
|
72
|
+
if run?
|
73
|
+
# This is the meat of the sandwich
|
74
|
+
Rudy::Routines.runner @routine, @@rset, @@lbox, @argv
|
75
|
+
|
76
|
+
Rudy::Routines.rescue {
|
77
|
+
Rudy::Routines::Handlers::Depends.execute_all @after
|
78
|
+
}
|
60
79
|
end
|
61
|
-
|
80
|
+
|
81
|
+
@machines
|
62
82
|
end
|
63
83
|
|
64
84
|
# Called by generic_machine_runner
|
65
85
|
def raise_early_exceptions
|
66
|
-
|
86
|
+
raise NoMachinesConfig unless @@config.machines
|
67
87
|
# There's no keypair check here because Rudy::Machines will attempt
|
68
88
|
# to create one.
|
69
89
|
raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
70
|
-
|
90
|
+
|
91
|
+
# If this is a test run we don't care if the group is running
|
92
|
+
if run?
|
93
|
+
raise MachineGroupNotRunning, current_machine_group unless Rudy::Machines.running?
|
94
|
+
end
|
95
|
+
|
96
|
+
if @routine
|
97
|
+
bad = @routine.keys - @@allowed_actions
|
98
|
+
raise UnsupportedActions.new(@name, bad) unless bad.empty?
|
99
|
+
end
|
71
100
|
end
|
72
101
|
|
73
102
|
end
|
74
103
|
|
75
|
-
end; end
|
104
|
+
end; end
|
105
|
+
|
106
|
+
|