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.
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