rudy 0.8.5 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (132) hide show
  1. data/CHANGES.txt +110 -18
  2. data/README.rdoc +40 -44
  3. data/Rudyfile +35 -50
  4. data/bin/rudy +88 -57
  5. data/bin/rudy-ec2 +2 -16
  6. data/bin/rudy-s3 +0 -10
  7. data/bin/rudy-sdb +11 -12
  8. data/lib/rudy.rb +59 -91
  9. data/lib/rudy/aws.rb +4 -45
  10. data/lib/rudy/aws/ec2.rb +57 -20
  11. data/lib/rudy/aws/ec2/address.rb +10 -11
  12. data/lib/rudy/aws/ec2/group.rb +10 -9
  13. data/lib/rudy/aws/ec2/image.rb +8 -8
  14. data/lib/rudy/aws/ec2/instance.rb +18 -19
  15. data/lib/rudy/aws/ec2/keypair.rb +14 -19
  16. data/lib/rudy/aws/ec2/snapshot.rb +16 -9
  17. data/lib/rudy/aws/ec2/volume.rb +39 -26
  18. data/lib/rudy/aws/ec2/zone.rb +5 -4
  19. data/lib/rudy/aws/s3.rb +2 -1
  20. data/lib/rudy/aws/sdb.rb +35 -86
  21. data/lib/rudy/backups.rb +24 -0
  22. data/lib/rudy/cli.rb +5 -131
  23. data/lib/rudy/cli/aws/ec2/addresses.rb +19 -27
  24. data/lib/rudy/cli/aws/ec2/candy.rb +45 -20
  25. data/lib/rudy/cli/aws/ec2/groups.rb +9 -13
  26. data/lib/rudy/cli/aws/ec2/images.rb +5 -133
  27. data/lib/rudy/cli/aws/ec2/instances.rb +25 -25
  28. data/lib/rudy/cli/aws/ec2/keypairs.rb +7 -11
  29. data/lib/rudy/cli/aws/ec2/snapshots.rb +5 -9
  30. data/lib/rudy/cli/aws/ec2/volumes.rb +22 -23
  31. data/lib/rudy/cli/aws/ec2/zones.rb +2 -3
  32. data/lib/rudy/cli/aws/sdb/domains.rb +5 -6
  33. data/lib/rudy/cli/aws/sdb/objects.rb +33 -0
  34. data/lib/rudy/cli/aws/sdb/select.rb +23 -0
  35. data/lib/rudy/cli/backups.rb +38 -0
  36. data/lib/rudy/cli/base.rb +104 -0
  37. data/lib/rudy/cli/candy.rb +1 -2
  38. data/lib/rudy/cli/config.rb +20 -7
  39. data/lib/rudy/cli/disks.rb +7 -9
  40. data/lib/rudy/cli/execbase.rb +56 -0
  41. data/lib/rudy/cli/machines.rb +242 -45
  42. data/lib/rudy/cli/metadata.rb +24 -10
  43. data/lib/rudy/cli/networks.rb +34 -0
  44. data/lib/rudy/cli/routines.rb +32 -6
  45. data/lib/rudy/cli/status.rb +60 -0
  46. data/lib/rudy/config.rb +55 -32
  47. data/lib/rudy/config/objects.rb +44 -30
  48. data/lib/rudy/disks.rb +25 -0
  49. data/lib/rudy/exceptions.rb +99 -0
  50. data/lib/rudy/global.rb +67 -28
  51. data/lib/rudy/guidelines.rb +3 -2
  52. data/lib/rudy/huxtable.rb +67 -58
  53. data/lib/rudy/machines.rb +41 -263
  54. data/lib/rudy/metadata.rb +212 -38
  55. data/lib/rudy/metadata/backup.rb +123 -78
  56. data/lib/rudy/metadata/disk.rb +153 -170
  57. data/lib/rudy/metadata/machine.rb +179 -0
  58. data/lib/rudy/mixins.rb +2 -1
  59. data/lib/rudy/mixins/hash.rb +3 -1
  60. data/lib/rudy/mixins/symbol.rb +8 -0
  61. data/lib/rudy/routines.rb +127 -344
  62. data/lib/rudy/routines/base.rb +229 -0
  63. data/lib/rudy/routines/handlers/base.rb +48 -0
  64. data/lib/rudy/routines/handlers/depends.rb +49 -0
  65. data/lib/rudy/routines/handlers/disks.rb +249 -0
  66. data/lib/rudy/routines/handlers/group.rb +44 -0
  67. data/lib/rudy/routines/handlers/host.rb +70 -0
  68. data/lib/rudy/routines/handlers/keypair.rb +70 -0
  69. data/lib/rudy/routines/handlers/machines.rb +15 -0
  70. data/lib/rudy/routines/handlers/script.rb +85 -0
  71. data/lib/rudy/routines/handlers/user.rb +45 -0
  72. data/lib/rudy/routines/passthrough.rb +19 -23
  73. data/lib/rudy/routines/reboot.rb +98 -50
  74. data/lib/rudy/routines/shutdown.rb +65 -14
  75. data/lib/rudy/routines/startup.rb +112 -17
  76. data/lib/rudy/utils.rb +35 -68
  77. data/rudy.gemspec +82 -25
  78. data/tryouts/01_mixins/01_hash_tryouts.rb +20 -0
  79. data/tryouts/10_require_time/10_rudy_tryouts.rb +33 -0
  80. data/tryouts/10_require_time/15_global_tryouts.rb +58 -0
  81. data/tryouts/12_config/10_load_config_tryouts.rb +43 -0
  82. data/tryouts/12_config/20_defaults_tryouts.rb +16 -0
  83. data/tryouts/12_config/30_accounts_tryouts.rb +17 -0
  84. data/tryouts/12_config/40_machines_tryouts.rb +53 -0
  85. data/tryouts/12_config/50_commands_tryouts.rb +17 -0
  86. data/tryouts/12_config/60_routines_tryouts.rb +16 -0
  87. data/tryouts/15_huxtable/10_huxtable_tryouts.rb +47 -0
  88. data/tryouts/15_huxtable/20_user_tryouts.rb +47 -0
  89. data/tryouts/20_simpledb/10_domains_tryouts.rb +36 -0
  90. data/tryouts/20_simpledb/20_objects_tryouts.rb +56 -0
  91. data/tryouts/25_ec2/10_keypairs_tryouts.rb +54 -0
  92. data/tryouts/25_ec2/20_groups_tryouts.rb +56 -0
  93. data/tryouts/25_ec2/21_groups_authorize_address_tryouts.rb +53 -0
  94. data/tryouts/25_ec2/22_groups_authorize_account_tryouts.rb +54 -0
  95. data/tryouts/25_ec2/30_addresses_tryouts.rb +42 -0
  96. data/tryouts/25_ec2/40_volumes_tryouts.rb +53 -0
  97. data/tryouts/25_ec2/50_snapshots_tryouts.rb +75 -0
  98. data/tryouts/26_ec2_instances/10_instance_tryouts.rb +107 -0
  99. data/tryouts/26_ec2_instances/50_images_tryouts.rb +7 -0
  100. data/tryouts/30_metadata/10_include_tryouts.rb +45 -0
  101. data/tryouts/30_metadata/13_object_tryouts.rb +19 -0
  102. data/tryouts/30_metadata/50_disk_tryouts.rb +115 -0
  103. data/tryouts/30_metadata/51_disk_digest_tryouts.rb +24 -0
  104. data/tryouts/30_metadata/53_disk_list_tryouts.rb +35 -0
  105. data/tryouts/30_metadata/56_disk_volume_tryouts.rb +68 -0
  106. data/tryouts/30_metadata/60_backup_tryouts.rb +101 -0
  107. data/tryouts/30_metadata/63_backup_list_tryouts.rb +38 -0
  108. data/tryouts/30_metadata/64_backup_disk_tryouts.rb +65 -0
  109. data/tryouts/30_metadata/66_backup_snapshot_tryouts.rb +76 -0
  110. data/tryouts/30_metadata/70_machine_tryouts.rb +85 -0
  111. data/tryouts/30_metadata/73_machine_list_tryouts.rb +58 -0
  112. data/tryouts/30_metadata/76_machine_instance_tryouts.rb +64 -0
  113. data/tryouts/30_metadata/77_machines_tryouts.rb +45 -0
  114. data/tryouts/40_routines/10_keypair_handler_tryouts.rb +52 -0
  115. data/tryouts/40_routines/11_group_handler_tryouts.rb +36 -0
  116. data/tryouts/80_cli/10_rudyec2_tryouts.rb +8 -0
  117. data/tryouts/80_cli/60_rudy_tryouts.rb +41 -0
  118. data/tryouts/exploration/console.rb +91 -0
  119. data/tryouts/exploration/machine.rb +23 -0
  120. data/tryouts/failer +6 -0
  121. metadata +116 -32
  122. data/bin/ird +0 -153
  123. data/lib/rudy/metadata/backups.rb +0 -67
  124. data/lib/rudy/metadata/debug.rb +0 -38
  125. data/lib/rudy/metadata/disks.rb +0 -67
  126. data/lib/rudy/metadata/objectbase.rb +0 -108
  127. data/lib/rudy/routines/helper.rb +0 -76
  128. data/lib/rudy/routines/helpers/dependshelper.rb +0 -34
  129. data/lib/rudy/routines/helpers/diskhelper.rb +0 -403
  130. data/lib/rudy/routines/helpers/scripthelper.rb +0 -197
  131. data/lib/rudy/routines/helpers/userhelper.rb +0 -37
  132. data/support/rudy-ec2-startup +0 -200
data/lib/rudy/disks.rb ADDED
@@ -0,0 +1,25 @@
1
+
2
+
3
+ module Rudy
4
+
5
+ module Disks
6
+ RTYPE = 'disk'.freeze
7
+
8
+ extend self
9
+ extend Rudy::Metadata::ClassMethods
10
+ include Rudy::Huxtable
11
+ extend Rudy::Huxtable
12
+
13
+ def get(path)
14
+ tmp = Rudy::Disk.new path
15
+ record = Rudy::Metadata.get tmp.name
16
+ return nil unless record.is_a?(Hash)
17
+ tmp.from_hash record
18
+ end
19
+
20
+ def from_hash(h)
21
+ Rudy::Disk.from_hash h
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,99 @@
1
+ module Rudy
2
+
3
+ class Error < RuntimeError
4
+ def initialize(obj=nil); @obj = obj; end
5
+ def message; "#{self.class}: #{@obj}"; end
6
+ end
7
+ class InsecureKeyPermissions < Rudy::Error
8
+ def message
9
+ lines = ["Insecure file permissions for #{@obj}"]
10
+ lines << "Try: chmod 600 #{@obj}"
11
+ lines.join($/)
12
+ end
13
+ end
14
+
15
+ #--
16
+ # TODO: Update exception Syntax based on:
17
+ # http://blog.rubybestpractices.com/posts/gregory/anonymous_class_hacks.html
18
+ #++
19
+
20
+ class NoConfig < Rudy::Error
21
+ def message; "No configuration found!"; end
22
+ end
23
+ class NoGlobal < Rudy::Error
24
+ def message; "No globals defined!"; end
25
+ end
26
+ class NoMachinesConfig < Rudy::Error
27
+ def message; "No machines configuration. Check your configs!"; end
28
+ end
29
+ class NoRoutinesConfig < Rudy::Error
30
+ def message; "No routines configuration. Check your configs!"; end
31
+ end
32
+ class ServiceUnavailable < Rudy::Error
33
+ def message; "#{@obj} is not available. Check your internets!"; end
34
+ end
35
+ class MachineGroupAlreadyRunning < Rudy::Error
36
+ def message; "Machine group #{@obj} is already running."; end
37
+ end
38
+ class MachineGroupNotRunning < Rudy::Error
39
+ def message; "Machine group #{@obj} is not running."; end
40
+ end
41
+ class MachineGroupMetadataExists < Rudy::Error
42
+ def message; "Machine group #{@obj} has existing metadata."; end
43
+ end
44
+ class MachineAlreadyRunning < Rudy::Error
45
+ def message; "Machine #{@obj} is already running."; end
46
+ end
47
+ class MachineNotRunning < Rudy::Error
48
+ def message; "Machine #{@obj} is not running."; end
49
+ end
50
+ class NoMachines < Rudy::Error;
51
+ def message
52
+ msg = "No machines running "
53
+ msg << "in #{@obj}" if @obj
54
+ msg
55
+ end
56
+ end
57
+ class MachineGroupNotDefined < Rudy::Error
58
+ def message; "#{@obj} is not defined in machines config."; end
59
+ end
60
+ class PrivateKeyFileExists < Rudy::Error
61
+ def message; "Private key #{@obj} already exists."; end
62
+ end
63
+ class PrivateKeyNotFound < Rudy::Error
64
+ def message; "Private key file #{@obj} not found."; end
65
+ end
66
+ class UnsupportedOS < Rudy::Error; end
67
+
68
+
69
+ class NotImplemented < Rudy::Error; end
70
+
71
+
72
+ module Metadata
73
+ class UnknownRecordType < Rudy::Error
74
+ def message; "Unknown record type: #{@obj}"; end
75
+ end
76
+ class UnknownObject < Rudy::Error
77
+ def message; "Unknown object: #{@obj}"; end
78
+ end
79
+ # Raised when trying to save a record with a key that already exists
80
+ class DuplicateRecord < Rudy::Error; end
81
+
82
+ end
83
+
84
+ module Disks
85
+ class NotAttached < Rudy::Error; end
86
+ class NotFormatted < Rudy::Error; end
87
+ class AlreadyFormatted < Rudy::Error; end
88
+ class AlreadyMounted < Rudy::Error; end
89
+ class AlreadyAttached < Rudy::Error; end
90
+ class NotMounted < Rudy::Error; end
91
+ class InUse < Rudy::Error; end
92
+ end
93
+
94
+ module Backups
95
+ class NoDisk < Rudy::Error; end
96
+ class NoBackup < Rudy::Error; end
97
+ end
98
+
99
+ end
data/lib/rudy/global.rb CHANGED
@@ -22,19 +22,23 @@ module Rudy
22
22
  field :verbose
23
23
  field :format
24
24
  field :print_header
25
- field :yes
25
+ field :auto
26
+ field :force
26
27
 
27
28
  field :accesskey
28
29
  field :secretkey
29
30
  field :accountnum
30
31
  field :accountname # TODO: use this. And accounttype (aws)
31
32
  field :cert
32
- field :privatekey
33
+ field :pkey
33
34
 
34
- field :local_user
35
- field :local_hostname
35
+ field :localhost
36
+ field :parallel
37
+ field :identity
36
38
 
39
+ field :testrun
37
40
  field :offline
41
+ field :bucket
38
42
 
39
43
  field :config => String
40
44
 
@@ -46,45 +50,61 @@ module Rudy
46
50
  @verbose ||= 0
47
51
  @nocolor = true unless @nocolor == "false" || @nocolor == false
48
52
  @quiet ||= false
53
+ @parallel ||= false
54
+ @force ||= false
49
55
  @format ||= :string # as in, to_s
50
56
  @print_header = true if @print_header == nil
51
- @yes = false if @yes.nil?
52
57
  end
53
58
 
54
59
  def apply_config(config)
60
+
55
61
  return unless config.is_a?(Rudy::Config)
62
+ clear_system_defaults # temporarily unapply default values
63
+
56
64
  if config.defaults?
57
65
  # Apply the "color" default before "nocolor" so nocolor has presedence
58
66
  @nocolor = !config.defaults.color unless config.defaults.color.nil?
59
- %w[region zone environment role position user nocolor quiet yes].each do |name|
60
- val = config.defaults.send(name)
61
- self.send("#{name}=", val) unless val.nil?
67
+ # WARNING: Don't add user to this list. The global value should return
68
+ # the value specified on the command line or nil. If it is nil, we can
69
+ # check the value from the machines config. If that is nil, we use the
70
+ # value from the defaults config.
71
+ # WARNING: Don't add bucket either or any machines configuration param
72
+ # TODO: investigate removing this apply_config method
73
+ %w[region zone environment role position
74
+ localhost nocolor quiet auto force parallel].each do |name|
75
+ curval, defval = self.send(name), config.defaults.send(name)
76
+ if curval.nil? && !defval.nil?
77
+ # Don't use the accessors. These are defaults so no Region magic.
78
+ self.instance_variable_set("@#{name}", defval)
79
+ end
62
80
  end
63
81
  end
64
82
 
65
83
  if config.accounts? && config.accounts.aws
66
- %w[accesskey secretkey accountnum cert privatekey].each do |name|
84
+ %w[accesskey secretkey accountnum cert pkey].each do |name|
67
85
  val = config.accounts.aws.send(name)
68
86
  self.send("#{name}=", val) unless val.nil?
69
87
  end
70
88
  end
71
-
72
89
  postprocess
73
90
  end
74
91
 
75
-
76
92
  def update(ghash={})
77
- ghash = ghash.marshal_dump if ghash.is_a?(OpenStruct)
78
-
79
- if ghash.is_a?(Hash)
80
- ghash.each_pair { |n,v| self.send("#{n}=", v) }
81
- else
82
- raise "Unexpected #{ghash.class.to_s}"
83
- end
84
-
93
+ ghash = ghash.marshal_dump if ghash.is_a?(OpenStruct)
94
+ ghash.each_pair { |n,v| self.send("#{n}=", v) }
85
95
  postprocess
86
96
  end
87
97
 
98
+ def zone=(z)
99
+ @zone = z
100
+ @region = @zone.to_s.gsub(/[a-z]$/, '').to_sym
101
+ end
102
+
103
+ def region=(r)
104
+ @region = r
105
+ @zone = "#{@region}b".to_sym
106
+ end
107
+
88
108
  def to_s(*args)
89
109
  super()
90
110
  end
@@ -97,11 +117,12 @@ module Rudy
97
117
  apply_system_defaults
98
118
  @nocolor = !@color unless @color.nil?
99
119
  @cert &&= File.expand_path(@cert)
100
- @privatekey &&= File.expand_path(@privatekey)
120
+ @pkey &&= File.expand_path(@pkey)
101
121
  @position &&= @position.to_s.rjust(2, '0')
102
122
  @format &&= @format.to_sym rescue nil
103
123
  @quiet ? Rudy.enable_quiet : Rudy.disable_quiet
104
- @yes ? Rudy.enable_yes : Rudy.disable_yes
124
+ @auto ? Rudy.enable_auto : Rudy.disable_auto
125
+
105
126
  end
106
127
 
107
128
  def apply_environment_variables
@@ -109,18 +130,36 @@ module Rudy
109
130
  @secretkey ||= ENV['AWS_SECRET_KEY'] || ENV['AWS_SECRET_ACCESS_KEY']
110
131
  @accountnum ||= ENV['AWS_ACCOUNT_NUMBER']
111
132
  @cert ||= ENV['EC2_CERT']
112
- @privatekey ||= ENV['EC2_PRIVATE_KEY']
113
- @local_user = ENV['USER'] || :rudy
114
- @local_hostname = Socket.gethostname || :localhost
133
+ @pkey ||= ENV['EC2_PRIVATE_KEY']
115
134
  end
116
135
 
136
+ # Apply defaults for parameters that must have values
117
137
  def apply_system_defaults
118
- @region ||= Rudy::DEFAULT_REGION
119
- @zone ||= Rudy::DEFAULT_ZONE
138
+ if @region.nil? && @zone.nil?
139
+ @region, @zone = Rudy::DEFAULT_REGION, Rudy::DEFAULT_ZONE
140
+ elsif @region.nil?
141
+ @region = @zone.to_s.gsub(/[a-z]$/, '').to_sym
142
+ elsif @zone.nil?
143
+ @zone = "#{@region}b".to_sym
144
+ end
145
+
120
146
  @environment ||= Rudy::DEFAULT_ENVIRONMENT
121
147
  @role ||= Rudy::DEFAULT_ROLE
122
- @position ||= Rudy::DEFAULT_POSITION
123
- @user ||= Rudy::DEFAULT_USER
148
+ @localhost ||= Rudy.sysinfo.hostname || 'localhost'
149
+ @auto = false if @auto.nil?
150
+ end
151
+
152
+ # Unapply defaults for parameters that must have values.
153
+ # This is important when reloading configuration since
154
+ # we don't overwrite existing values. If the default
155
+ # ones remained the configuration would not be applied.
156
+ def clear_system_defaults
157
+ @region = nil if @region == Rudy::DEFAULT_REGION
158
+ @zone = nil if @zone == Rudy::DEFAULT_ZONE
159
+ @environment = nil if @environment == Rudy::DEFAULT_ENVIRONMENT
160
+ @role = nil if @role == Rudy::DEFAULT_ROLE
161
+ @localhost = nil if @localhost == (Rudy.sysinfo.hostname || 'localhost')
162
+ @auto = nil if @auto == false
124
163
  end
125
164
 
126
165
  end
@@ -1,12 +1,13 @@
1
1
 
2
2
 
3
3
  module Rudy
4
- module Guidelines #:nodoc:all
4
+ module Guidelines
5
5
  extend self
6
- AFE = "Always fail early" # [ed: the A's are a work in progress]
6
+ AFE = "Always fail early"
7
7
  ABA = "Always be accurate"
8
8
  CBC = "Consistency before cuteness"
9
9
  UNO = "Ugly's not okay"
10
+ WOC = "Write offensive code"
10
11
  def inspect
11
12
  all = Guidelines.constants
12
13
  g = all.collect { |c| '%s="%s"' % [c, const_get(c)] }
data/lib/rudy/huxtable.rb CHANGED
@@ -20,6 +20,7 @@ module Rudy
20
20
  # end
21
21
  #
22
22
  module Huxtable
23
+ extend self
23
24
 
24
25
  @@config = Rudy::Config.new
25
26
  @@global = Rudy::Global.new
@@ -30,15 +31,13 @@ module Rudy
30
31
  def self.logger; @@logger; end
31
32
 
32
33
  def self.update_config(path=nil)
33
- @@config.verbose = (@@global.verbose > 1)
34
+ @@config.verbose = (@@global.verbose >= 3) # -vvv
34
35
  # nil and bad paths sent to look_and_load are ignored
35
36
  @@config.look_and_load(path || @@global.config)
36
37
  @@global.apply_config(@@config)
37
- # And then update global again b/c some values come from @@config
38
- update_global ## TODO: Check if this can be removed
39
38
  end
40
39
 
41
- def self.update_global(ghash={}); @@global.update(ghash); end
40
+ def self.update_global(ghash); @@global.update(ghash); end
42
41
  def self.update_logger(logger); @@logger = logger; end
43
42
 
44
43
  def self.reset_config; @@config = Rudy::Config.new; end
@@ -58,6 +57,17 @@ module Rudy
58
57
  Rudy::DOMAIN
59
58
  end
60
59
 
60
+ # Puts +msg+ to +@@logger+
61
+ def self.li(*msg); msg.each { |m| @@logger.puts m } if !@@global.quiet; end
62
+ # Puts +msg+ to +@@logger+ if +Rudy.debug?+ returns true
63
+ def self.ld(*msg); msg.each { |m| @@logger.puts "D: #{m}" } if Rudy.debug?; end
64
+ # Puts +msg+ to +@@logger+ with "ERROR: " prepended
65
+ def self.le(*msg); msg.each { |m| @@logger.puts " #{m}" }; end
66
+
67
+ def li(*msg); Rudy::Huxtable.li *msg; end
68
+ def ld(*msg); Rudy::Huxtable.ld *msg; end
69
+ def le(*msg); Rudy::Huxtable.le *msg; end
70
+
61
71
  def config_dirname
62
72
  raise "No config paths defined" unless @@config.is_a?(Rudy::Config) && @@config.paths.is_a?(Array)
63
73
  base_dir = File.dirname @@config.paths.first
@@ -65,21 +75,18 @@ module Rudy
65
75
  base_dir
66
76
  end
67
77
 
68
- def has_keypair?(name=nil)
69
- kp = user_keypairpath(name)
70
- (!kp.nil? && File.exists?(kp))
71
- end
72
78
 
73
79
  # Returns the name of the current keypair for the given user.
74
80
  # If there's a private key path in the config this will return
75
- # the basename (it's assumed the Amazon KeyPair has the same
81
+ # the basename (it's assumed the Amazon Keypair has the same
76
82
  # name as the file). Otherwise this returns the Rudy style
77
83
  # name: <tt>key-ZONE-ENV-ROLE-USER</tt>. Or if this the user is
78
84
  # root: <tt>key-ZONE-ENV-ROLE</tt>
79
- def user_keypairname(user)
80
- kp = user_keypairpath(user)
81
- if kp
82
- kp = Huxtable.keypair_path_to_name(kp)
85
+ def user_keypairname(user=nil)
86
+ user ||= current_machine_user
87
+ path = defined_keypairpath user
88
+ if path
89
+ Huxtable.keypair_path_to_name(path)
83
90
  else
84
91
  n = (user.to_s == 'root') ? '' : "-#{user}"
85
92
  "key-%s-%s%s" % [@@global.zone, current_machine_group, n]
@@ -88,50 +95,56 @@ module Rudy
88
95
  def root_keypairname
89
96
  user_keypairname :root
90
97
  end
98
+ def current_user_keypairname
99
+ user_keypairname current_machine_user
100
+ end
91
101
 
92
-
93
- def user_keypairpath(name)
94
- raise Rudy::Error, "No user provided" unless name
95
- raise NoConfig unless @@config
96
- raise NoMachinesConfig unless @@config.machines
97
- raise NoGlobal unless @@global
98
- zon, env, rol = @@global.zone, @@global.environment, @@global.role
99
- #Caesars.enable_debug
100
- path = @@config.machines.find_deferred(zon, env, rol, [:users, name, :keypair])
101
- path ||= @@config.machines.find_deferred(env, rol, [:users, name, :keypair])
102
- path ||= @@config.machines.find_deferred(rol, [:users, name, :keypair])
103
-
104
- # EC2 Keypairs that were created are intended for starting the machine instances.
105
- # These are used as the root SSH keys. If we can find a user defined key, we'll
106
- # check the config path for a generated one.
107
- if !path && name.to_s == 'root'
108
- path = File.join(self.config_dirname, "key-#{@@global.zone}-#{current_machine_group}")
102
+ def user_keypairpath(name=nil)
103
+ name ||= current_machine_user
104
+ path = defined_keypairpath name
105
+ # If we can't find a user defined key, we'll
106
+ # check the config path for a generated one.
107
+ if path
108
+ raise "Private key file not found (#{path})" unless File.exists?(path)
109
+ path = File.expand_path(path)
110
+ else
111
+ ssh_key_dir = @@config.defaults.keydir || Rudy::SSH_KEY_DIR
112
+ path = File.join(ssh_key_dir, user_keypairname(name))
109
113
  end
110
- path = File.expand_path(path) if path && File.exists?(path)
111
114
  path
112
115
  end
113
116
  def root_keypairpath
114
117
  user_keypairpath :root
115
118
  end
116
-
117
- def has_root_keypair?
118
- path = user_keypairpath(:root)
119
- (!path.nil? && !path.empty?)
119
+ def current_user_keypairpath
120
+ user_keypairpath current_machine_user
120
121
  end
121
122
 
122
- def current_user
123
- @@global.user
124
- end
125
- def current_user_keypairpath
126
- user_keypairpath(current_user)
123
+ def defined_keypairpath(name=nil)
124
+ name ||= current_machine_user
125
+ raise Rudy::Error, "No user provided" unless name
126
+ ## NOTE: I think it is more appropriate to return nil here
127
+ ## than raise errors. This stuff should be checked already
128
+ ##raise NoConfig unless @@config
129
+ ##raise NoMachinesConfig unless @@config.machines
130
+ ##raise NoGlobal unless @@global
131
+ return unless @@global && @@config && @@config.machines
132
+ zon, env, rol = @@global.zone, @@global.environment, @@global.role
133
+ path = @@global.identity
134
+ path ||= @@config.machines.find_deferred(zon, env, rol, [:users, name, :keypair])
135
+ path ||= @@config.machines.find_deferred(env, rol, [:users, name, :keypair])
136
+ path ||= @@config.machines.find_deferred(rol, [:users, name, :keypair])
137
+ path ||= @@config.machines.find_deferred(@@global.region, [:users, name, :keypair])
138
+ path
127
139
  end
128
140
 
141
+
129
142
  def current_machine_group
130
143
  [@@global.environment, @@global.role].join(Rudy::DELIM)
131
144
  end
132
145
 
133
146
  def current_group_name
134
- "g-#{current_machine_group}"
147
+ "grp-#{@@global.zone}-#{current_machine_group}"
135
148
  end
136
149
 
137
150
  def current_machine_count
@@ -175,20 +188,13 @@ module Rudy
175
188
  def current_machine_name
176
189
  [@@global.zone, current_machine_group, @@global.position].join(Rudy::DELIM)
177
190
  end
178
-
179
- # +name+ the name of the remote user to use for the remainder of the command
180
- # (or until switched again). If no name is provided, the user will be revert
181
- # to whatever it was before the previous switch.
182
- # TODO: deprecate
183
- def switch_user(name=nil)
184
- if name == nil && @switch_user_previous
185
- @@global.user = @switch_user_previous
186
- elsif @@global.user != name
187
- raise "No root keypair defined for #{name}!" unless has_keypair?(name)
188
- @@logger.puts "Remote commands will be run as #{name} user"
189
- @switch_user_previous = @@global.user
190
- @@global.user = name
191
- end
191
+
192
+ def current_machine_user
193
+ @@global.user || fetch_machine_param(:user) || @@config.defaults.user || Rudy.sysinfo.user
194
+ end
195
+
196
+ def current_machine_bucket
197
+ @@global.bucket || fetch_machine_param(:bucket) || nil
192
198
  end
193
199
 
194
200
  def self.keypair_path_to_name(kp)
@@ -247,7 +253,7 @@ module Rudy
247
253
  raise NoRoutinesConfig unless @@config.routines
248
254
  raise NoGlobal unless @@global
249
255
 
250
- action = action.to_s.tr('-', '_')
256
+ action = action.to_s.tr('-:', '_')
251
257
 
252
258
  zon, env, rol = @@global.zone, @@global.environment, @@global.role
253
259
 
@@ -264,12 +270,12 @@ module Rudy
264
270
 
265
271
  routine.disks.each_pair do |raction,disks|
266
272
  unless disks.kind_of?(Hash)
267
- @@logger.puts "#{raction} is not defined. Check your #{action} routines config.".color(:red)
273
+ li "#{raction} is not defined. Check your #{action} routines config.".color(:red)
268
274
  next
269
275
  end
270
276
  disks.each_pair do |path, props|
271
277
  unless disk_defs.has_key?(path)
272
- @@logger.puts "#{path} is not defined. Check your #{action} machines config.".color(:red)
278
+ li "#{path} is not defined. Check your #{action} machines config.".color(:red)
273
279
  routine.disks[raction].delete(path)
274
280
  next
275
281
  end
@@ -311,12 +317,15 @@ module Rudy
311
317
  raise NoGlobal unless @@global
312
318
  zon, env, rol = @@global.zone, @@global.environment, @@global.role
313
319
  hashes = []
320
+ # This is fucked!
314
321
  hashes << @@config.machines.find(env, rol)
315
322
  hashes << @@config.machines.find(zon, env, rol)
316
323
  hashes << @@config.machines.find(zon, [env, rol])
317
324
  hashes << @@config.machines.find(zon, env)
318
325
  hashes << @@config.machines.find(env)
319
326
  hashes << @@config.machines.find(zon)
327
+ hashes << @@config.machines.find(rol)
328
+ hashes << @@config.machines.find(@@global.region)
320
329
  compilation = {}
321
330
  hashes.reverse.each do |conf|
322
331
  compilation.merge! conf if conf