rudy 0.4.0 → 0.6.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 +54 -30
- data/README.rdoc +100 -12
- data/Rakefile +103 -8
- data/Rudyfile +119 -0
- data/bin/ird +175 -0
- data/bin/rudy +259 -156
- data/bin/rudy-ec2 +228 -95
- data/bin/rudy-s3 +76 -0
- data/bin/rudy-sdb +67 -0
- data/lib/annoy.rb +270 -0
- data/lib/console.rb +30 -9
- data/lib/escape.rb +305 -0
- data/lib/rudy.rb +151 -182
- data/lib/rudy/aws.rb +56 -49
- data/lib/rudy/aws/ec2.rb +47 -292
- data/lib/rudy/aws/ec2/address.rb +157 -0
- data/lib/rudy/aws/ec2/group.rb +301 -0
- data/lib/rudy/aws/ec2/image.rb +168 -0
- data/lib/rudy/aws/ec2/instance.rb +434 -0
- data/lib/rudy/aws/ec2/keypair.rb +104 -0
- data/lib/rudy/aws/ec2/snapshot.rb +98 -0
- data/lib/rudy/aws/ec2/volume.rb +230 -0
- data/lib/rudy/aws/ec2/zone.rb +77 -0
- data/lib/rudy/aws/s3.rb +54 -0
- data/lib/rudy/aws/sdb.rb +298 -0
- data/lib/rudy/aws/sdb/error.rb +46 -0
- data/lib/rudy/{metadata/backup.rb → backup.rb} +26 -51
- data/lib/rudy/cli.rb +157 -0
- data/lib/rudy/cli/aws/ec2/addresses.rb +105 -0
- data/lib/rudy/cli/aws/ec2/candy.rb +208 -0
- data/lib/rudy/cli/aws/ec2/groups.rb +121 -0
- data/lib/rudy/cli/aws/ec2/images.rb +196 -0
- data/lib/rudy/cli/aws/ec2/instances.rb +194 -0
- data/lib/rudy/cli/aws/ec2/keypairs.rb +53 -0
- data/lib/rudy/cli/aws/ec2/snapshots.rb +49 -0
- data/lib/rudy/cli/aws/ec2/volumes.rb +104 -0
- data/lib/rudy/cli/aws/ec2/zones.rb +22 -0
- data/lib/rudy/cli/aws/s3/buckets.rb +50 -0
- data/lib/rudy/cli/aws/s3/store.rb +22 -0
- data/lib/rudy/cli/aws/sdb/domains.rb +41 -0
- data/lib/rudy/cli/candy.rb +8 -0
- data/lib/rudy/{command → cli}/config.rb +34 -24
- data/lib/rudy/cli/disks.rb +35 -0
- data/lib/rudy/cli/machines.rb +94 -0
- data/lib/rudy/cli/routines.rb +57 -0
- data/lib/rudy/config.rb +77 -72
- data/lib/rudy/config/objects.rb +29 -0
- data/lib/rudy/disks.rb +248 -0
- data/lib/rudy/global.rb +121 -0
- data/lib/rudy/huxtable.rb +340 -0
- data/lib/rudy/machines.rb +245 -0
- data/lib/rudy/metadata.rb +123 -13
- data/lib/rudy/routines.rb +47 -0
- data/lib/rudy/routines/helpers/diskhelper.rb +101 -0
- data/lib/rudy/routines/helpers/scripthelper.rb +91 -0
- data/lib/rudy/routines/release.rb +34 -0
- data/lib/rudy/routines/shutdown.rb +57 -0
- data/lib/rudy/routines/startup.rb +58 -0
- data/lib/rudy/scm/svn.rb +1 -1
- data/lib/rudy/utils.rb +322 -4
- data/lib/storable.rb +26 -17
- data/lib/sysinfo.rb +274 -0
- data/lib/tryouts.rb +6 -13
- data/rudy.gemspec +128 -42
- data/support/randomize-root-password +45 -0
- data/support/rudy-ec2-startup +9 -9
- data/support/update-ec2-ami-tools +20 -0
- data/test/05_config/00_setup_test.rb +20 -0
- data/test/05_config/30_machines_test.rb +69 -0
- data/test/20_sdb/00_setup_test.rb +16 -0
- data/test/20_sdb/10_domains_test.rb +115 -0
- data/test/25_ec2/00_setup_test.rb +29 -0
- data/test/25_ec2/10_keypairs_test.rb +41 -0
- data/test/25_ec2/20_groups_test.rb +131 -0
- data/test/25_ec2/30_addresses_test.rb +38 -0
- data/test/25_ec2/40_volumes_test.rb +49 -0
- data/test/25_ec2/50_snapshots_test.rb +74 -0
- data/test/26_ec2_instances/00_setup_test.rb +28 -0
- data/test/26_ec2_instances/10_instances_test.rb +83 -0
- data/test/26_ec2_instances/50_images_test.rb +13 -0
- data/test/30_sdb_metadata/00_setup_test.rb +21 -0
- data/test/30_sdb_metadata/10_disks_test.rb +109 -0
- data/test/30_sdb_metadata/20_backups_test.rb +102 -0
- data/test/coverage.txt +51 -0
- data/test/helper.rb +36 -0
- data/vendor/highline-1.5.1/CHANGELOG +222 -0
- data/vendor/highline-1.5.1/INSTALL +35 -0
- data/vendor/highline-1.5.1/LICENSE +7 -0
- data/vendor/highline-1.5.1/README +63 -0
- data/vendor/highline-1.5.1/Rakefile +82 -0
- data/vendor/highline-1.5.1/TODO +6 -0
- data/vendor/highline-1.5.1/examples/ansi_colors.rb +38 -0
- data/vendor/highline-1.5.1/examples/asking_for_arrays.rb +18 -0
- data/vendor/highline-1.5.1/examples/basic_usage.rb +75 -0
- data/vendor/highline-1.5.1/examples/color_scheme.rb +32 -0
- data/vendor/highline-1.5.1/examples/limit.rb +12 -0
- data/vendor/highline-1.5.1/examples/menus.rb +65 -0
- data/vendor/highline-1.5.1/examples/overwrite.rb +19 -0
- data/vendor/highline-1.5.1/examples/page_and_wrap.rb +322 -0
- data/vendor/highline-1.5.1/examples/password.rb +7 -0
- data/vendor/highline-1.5.1/examples/trapping_eof.rb +22 -0
- data/vendor/highline-1.5.1/examples/using_readline.rb +17 -0
- data/vendor/highline-1.5.1/lib/highline.rb +758 -0
- data/vendor/highline-1.5.1/lib/highline/color_scheme.rb +120 -0
- data/vendor/highline-1.5.1/lib/highline/compatibility.rb +17 -0
- data/vendor/highline-1.5.1/lib/highline/import.rb +43 -0
- data/vendor/highline-1.5.1/lib/highline/menu.rb +395 -0
- data/vendor/highline-1.5.1/lib/highline/question.rb +463 -0
- data/vendor/highline-1.5.1/lib/highline/system_extensions.rb +193 -0
- data/vendor/highline-1.5.1/setup.rb +1360 -0
- data/vendor/highline-1.5.1/test/tc_color_scheme.rb +56 -0
- data/vendor/highline-1.5.1/test/tc_highline.rb +823 -0
- data/vendor/highline-1.5.1/test/tc_import.rb +54 -0
- data/vendor/highline-1.5.1/test/tc_menu.rb +429 -0
- data/vendor/highline-1.5.1/test/ts_all.rb +15 -0
- metadata +141 -38
- data/lib/aws_sdb.rb +0 -3
- data/lib/aws_sdb/error.rb +0 -42
- data/lib/aws_sdb/service.rb +0 -215
- data/lib/rudy/aws/simpledb.rb +0 -53
- data/lib/rudy/command/addresses.rb +0 -46
- data/lib/rudy/command/backups.rb +0 -175
- data/lib/rudy/command/base.rb +0 -841
- data/lib/rudy/command/deploy.rb +0 -12
- data/lib/rudy/command/disks.rb +0 -213
- data/lib/rudy/command/environment.rb +0 -73
- data/lib/rudy/command/groups.rb +0 -61
- data/lib/rudy/command/images.rb +0 -91
- data/lib/rudy/command/instances.rb +0 -85
- data/lib/rudy/command/machines.rb +0 -161
- data/lib/rudy/command/metadata.rb +0 -41
- data/lib/rudy/command/release.rb +0 -174
- data/lib/rudy/command/volumes.rb +0 -66
- data/lib/rudy/metadata/disk.rb +0 -138
- data/tryouts/console_tryout.rb +0 -91
@@ -0,0 +1,245 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
module Rudy
|
5
|
+
class Machine < Storable
|
6
|
+
include Rudy::MetaData::ObjectBase
|
7
|
+
|
8
|
+
field :rtype
|
9
|
+
field :awsid
|
10
|
+
|
11
|
+
field :region
|
12
|
+
field :zone
|
13
|
+
field :environment
|
14
|
+
field :role
|
15
|
+
field :position
|
16
|
+
|
17
|
+
field :created => Time
|
18
|
+
field :started => Time
|
19
|
+
|
20
|
+
field :dns_public
|
21
|
+
field :dns_private
|
22
|
+
field :state
|
23
|
+
|
24
|
+
attr_reader :instance
|
25
|
+
|
26
|
+
def init
|
27
|
+
#@created =
|
28
|
+
@rtype = 'm'
|
29
|
+
@region = @@global.region
|
30
|
+
@zone = @@global.zone
|
31
|
+
@environment = @@global.environment
|
32
|
+
@role = @@global.role
|
33
|
+
@position = find_next_position || '01'
|
34
|
+
@state = 'no-instance'
|
35
|
+
end
|
36
|
+
|
37
|
+
def liner_note
|
38
|
+
update #if !dns_public? && @awsid
|
39
|
+
info = !@dns_public.nil? && !@dns_public.empty? ? @dns_public : "#{@awsid}:#{@state}"
|
40
|
+
"%s %s" % [self.name.bright, info]
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_s(with_title=false)
|
44
|
+
lines = []
|
45
|
+
lines << liner_note
|
46
|
+
#if self.running?
|
47
|
+
# k, g = @keyname || 'no-keypair', self.groups.join(', ')
|
48
|
+
# lines << @@sformat % %w{zone size ami keyname groups} if with_title
|
49
|
+
# lines << @@sformat % [@zone, @size, @ami, k, g]
|
50
|
+
#end
|
51
|
+
lines.join($/)
|
52
|
+
end
|
53
|
+
|
54
|
+
def inspect
|
55
|
+
update #if !dns_public? && @awsid
|
56
|
+
lines = []
|
57
|
+
lines << liner_note
|
58
|
+
field_names.each do |key|
|
59
|
+
next unless self.respond_to?(key)
|
60
|
+
val = self.send(key)
|
61
|
+
lines << sprintf(" %22s: %s", key, (val.is_a?(Array) ? val.join(', ') : val))
|
62
|
+
end
|
63
|
+
lines.join($/)
|
64
|
+
end
|
65
|
+
|
66
|
+
def find_next_position
|
67
|
+
list = @sdb.select(self.to_select(nil, [:position])) || []
|
68
|
+
pos = list.size + 1
|
69
|
+
pos.to_s.rjust(2, '0')
|
70
|
+
end
|
71
|
+
|
72
|
+
def name
|
73
|
+
Machine.generate_name(@zone, @environment, @role, @position)
|
74
|
+
end
|
75
|
+
|
76
|
+
def Machine.generate_name(zon, env, rol, pos)
|
77
|
+
pos = pos.to_s.rjust 2, '0'
|
78
|
+
["m", zon, env, rol, pos].join(Rudy::DELIM)
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_instance
|
82
|
+
@ec2inst.get(@awsid)
|
83
|
+
end
|
84
|
+
|
85
|
+
def update
|
86
|
+
return false unless @awsid
|
87
|
+
@instance = get_instance
|
88
|
+
if @instance.is_a?(Rudy::AWS::EC2::Instance)
|
89
|
+
@dns_public = @instance.dns_public
|
90
|
+
@dns_private = @instance.dns_private
|
91
|
+
@state = @instance.state
|
92
|
+
save
|
93
|
+
elsif @instance.nil?
|
94
|
+
@dns_public = @dns_private = nil
|
95
|
+
@state = 'unknown'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def dns_public?
|
100
|
+
!@dns_public.nil? && !@dns_public.empty?
|
101
|
+
end
|
102
|
+
def dns_private?
|
103
|
+
!@dns_private.nil? && !@dns_private.empty?
|
104
|
+
end
|
105
|
+
|
106
|
+
def start(opts={})
|
107
|
+
raise "#{name} is already running" if running?
|
108
|
+
|
109
|
+
opts = {
|
110
|
+
:min => 1,
|
111
|
+
:size => current_machine_size,
|
112
|
+
:ami => current_machine_image,
|
113
|
+
:group => current_group_name,
|
114
|
+
:keypair => root_keypairname,
|
115
|
+
:zone => @@global.zone.to_s,
|
116
|
+
:address => current_machine_address,
|
117
|
+
:machine_data => Machine.generate_machine_data.to_yaml
|
118
|
+
}.merge(opts)
|
119
|
+
|
120
|
+
@ec2inst.create(opts) do |inst|
|
121
|
+
@awsid = inst.awsid
|
122
|
+
@created = @starts = Time.now
|
123
|
+
@state = inst.state
|
124
|
+
end
|
125
|
+
|
126
|
+
self.save
|
127
|
+
|
128
|
+
self
|
129
|
+
end
|
130
|
+
|
131
|
+
def destroy
|
132
|
+
@ec2inst.destroy(@awsid) if running?
|
133
|
+
super
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
def Machine.generate_machine_data
|
138
|
+
data = { # Give the machine an identity
|
139
|
+
:region => @@global.region.to_s,
|
140
|
+
:zone => @@global.zone.to_s,
|
141
|
+
:environment => @@global.environment.to_s,
|
142
|
+
:role => @@global.role.to_s,
|
143
|
+
:position => @@global.position.to_s,
|
144
|
+
:hosts => { # Add hosts to the /etc/hosts file
|
145
|
+
:dbmaster => "127.0.0.1",
|
146
|
+
}
|
147
|
+
}
|
148
|
+
data
|
149
|
+
end
|
150
|
+
|
151
|
+
def running?
|
152
|
+
return false if @awsid.nil? || @awsid.empty?
|
153
|
+
@ec2inst.running?(@awsid)
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
|
160
|
+
class Machines
|
161
|
+
include Rudy::MetaData
|
162
|
+
|
163
|
+
def create(&each_mach)
|
164
|
+
raise MachineGroupAlreadyRunning, current_machine_group if running?
|
165
|
+
raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
166
|
+
|
167
|
+
unless (1..MAX_INSTANCES).member?(current_machine_count)
|
168
|
+
raise "Instance count must be more than 0, less than #{MAX_INSTANCES}"
|
169
|
+
end
|
170
|
+
|
171
|
+
unless @rgrp.exists?(current_group_name)
|
172
|
+
puts "Creating group: #{current_group_name}"
|
173
|
+
@rgrp.create(current_group_name)
|
174
|
+
end
|
175
|
+
|
176
|
+
unless @rkey.exists?(root_keypairname)
|
177
|
+
kp_file = File.join(Rudy::CONFIG_DIR, root_keypairname)
|
178
|
+
raise PrivateKeyFileExists, kp_file if File.exists?(kp_file)
|
179
|
+
puts "Creating keypair: #{root_keypairname}"
|
180
|
+
kp = @rkey.create(root_keypairname)
|
181
|
+
puts "Saving #{kp_file}"
|
182
|
+
Rudy::Utils.write_to_file(kp_file, kp.private_key, 'w', 0600)
|
183
|
+
else
|
184
|
+
kp_file = root_keypairpath
|
185
|
+
# This means no keypair file can be found
|
186
|
+
raise PrivateKeyNotFound, root_keypairname if kp_file.nil?
|
187
|
+
# This means we found a keypair in the config but we cannot find the private key file.
|
188
|
+
raise PrivateKeyNotFound, kp_file if !File.exists?(kp_file)
|
189
|
+
end
|
190
|
+
|
191
|
+
machines = []
|
192
|
+
current_machine_count.times do |i|
|
193
|
+
machine = Rudy::Machine.new
|
194
|
+
puts "Starting %s" % machine.name
|
195
|
+
machine.start
|
196
|
+
machines << machine
|
197
|
+
end
|
198
|
+
machines.each { |m| each_mach.call(m) } if each_mach
|
199
|
+
machines
|
200
|
+
end
|
201
|
+
|
202
|
+
|
203
|
+
def destroy(&each_mach)
|
204
|
+
raise MachineGroupNotRunning, current_machine_group unless running?
|
205
|
+
raise MachineGroupNotDefined, current_machine_group unless known_machine_group?
|
206
|
+
list.each { |m| each_mach.call(m); } if each_mach
|
207
|
+
list do |mach|
|
208
|
+
puts "Destroying #{mach.name}"
|
209
|
+
mach.destroy
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def list(more=[], less=[], &each_mach)
|
214
|
+
machines = list_as_hash(&each_mach)
|
215
|
+
machines &&= machines.values
|
216
|
+
machines
|
217
|
+
end
|
218
|
+
|
219
|
+
def list_as_hash(more=[], less=[], &each_mach)
|
220
|
+
query = to_select([:rtype, 'm'], less)
|
221
|
+
list = @sdb.select(query) || {}
|
222
|
+
machines = {}
|
223
|
+
list.each_pair do |n,m|
|
224
|
+
machines[n] = Rudy::Machine.from_hash(m)
|
225
|
+
end
|
226
|
+
machines.each_pair { |n,mach| each_mach.call(mach) } if each_mach
|
227
|
+
machines = nil if machines.empty?
|
228
|
+
machines
|
229
|
+
end
|
230
|
+
|
231
|
+
def get(rname=nil)
|
232
|
+
Rudy::Machine.from_hash(@sdb.get(Rudy::DOMAIN, rname)) # Returns nil if empty
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
def running?
|
237
|
+
!list.nil?
|
238
|
+
# TODO: add logic that checks whether the instances are running.
|
239
|
+
end
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
data/lib/rudy/metadata.rb
CHANGED
@@ -1,26 +1,136 @@
|
|
1
1
|
|
2
|
-
require 'aws_sdb'
|
3
2
|
|
4
3
|
module Rudy
|
5
4
|
module MetaData
|
6
|
-
|
7
|
-
|
5
|
+
module ObjectBase
|
6
|
+
include Rudy::Huxtable
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
|
10
|
+
@sdb = Rudy::AWS::SDB.new(a, s, r)
|
11
|
+
@ec2inst = Rudy::AWS::EC2::Instances.new(a, s, r)
|
12
|
+
@rvol = Rudy::AWS::EC2::Volumes.new(a, s, r)
|
13
|
+
init(*args)
|
14
|
+
end
|
15
|
+
|
16
|
+
def init(*args); raise "Must override init"; end
|
17
|
+
|
18
|
+
def valid?; raise "#{self.class} must override 'valid?'"; end
|
19
|
+
|
20
|
+
def to_query(more=[], less=[])
|
21
|
+
Rudy::AWS::SDB.generate_query build_criteria(more, less)
|
22
|
+
end
|
8
23
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
24
|
+
def to_select(more=[], less=[])
|
25
|
+
Rudy::AWS::SDB.generate_select ['*'], Rudy::DOMAIN, build_criteria(more, less)
|
26
|
+
end
|
27
|
+
|
28
|
+
def name(identifier, zon, env, rol, pos, *other)
|
29
|
+
pos = pos.to_s.rjust 2, '0'
|
30
|
+
[identifier, zon, env, rol, pos, *other].flatten.compact.join(Rudy::DELIM)
|
31
|
+
end
|
32
|
+
|
33
|
+
def save(replace=true)
|
34
|
+
replace = true if replace.nil?
|
35
|
+
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
36
|
+
@sdb.put(Rudy::DOMAIN, name, self.to_hash, replace) # Always returns nil
|
37
|
+
true
|
38
|
+
end
|
13
39
|
|
14
|
-
|
15
|
-
|
16
|
-
|
40
|
+
def destroy
|
41
|
+
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
42
|
+
@sdb.destroy(Rudy::DOMAIN, name)
|
43
|
+
true
|
44
|
+
end
|
17
45
|
|
18
|
-
|
19
|
-
|
46
|
+
def refresh
|
47
|
+
@sdb ||= Rudy::AWS::SDB.new(@@global.accesskey, @@global.secretkey, @@global.region)
|
48
|
+
h = @sdb.get(Rudy::DOMAIN, name) || {}
|
49
|
+
from_hash(h)
|
50
|
+
end
|
20
51
|
|
52
|
+
def ==(other)
|
53
|
+
return false unless other.is_a?(self.class)
|
54
|
+
self.name == other.name
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_s
|
58
|
+
str = ""
|
59
|
+
field_names.each do |key|
|
60
|
+
str << sprintf(" %22s: %s#{$/}", key, self.send(key.to_sym))
|
61
|
+
end
|
62
|
+
str
|
63
|
+
end
|
21
64
|
|
22
65
|
|
66
|
+
protected
|
67
|
+
|
68
|
+
# Builds a zipped Array from a list of criteria.
|
69
|
+
# The list of criteria is made up of metadata object attributes.
|
70
|
+
# The list is constructed by taking the adding +more+, and
|
71
|
+
# subtracting +less+ from <tt>:rtype, :region, :zone, :environment, :role, :position</tt>
|
72
|
+
#
|
73
|
+
# Returns [[:rtype, value], [:zone, value], ...]
|
74
|
+
def build_criteria(more=[], less=[])
|
75
|
+
criteria = [:rtype, :region, :zone, :environment, :role, :position, *more].compact
|
76
|
+
criteria -= [*less].flatten.uniq.compact
|
77
|
+
values = criteria.collect do |n|
|
78
|
+
self.send(n.to_sym)
|
79
|
+
end
|
80
|
+
criteria.zip(values)
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
module Rudy
|
90
|
+
module MetaData
|
91
|
+
include Rudy::Huxtable
|
92
|
+
|
93
|
+
def initialize(*args)
|
94
|
+
a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
|
95
|
+
@sdb = Rudy::AWS::SDB.new(a, s, r)
|
96
|
+
@rinst = Rudy::AWS::EC2::Instances.new(a, s, r)
|
97
|
+
@rgrp = Rudy::AWS::EC2::Groups.new(a, s, r)
|
98
|
+
@rkey = Rudy::AWS::EC2::KeyPairs.new(a, s, r)
|
99
|
+
init(*args)
|
100
|
+
end
|
101
|
+
|
102
|
+
def init(*args)
|
103
|
+
end
|
104
|
+
|
105
|
+
# 20090224-1813-36
|
106
|
+
def format_timestamp(dat)
|
107
|
+
mon, day, hour, min, sec = [dat.mon, dat.day, dat.hour, dat.min, dat.sec].collect { |v| v.to_s.rjust(2, "0") }
|
108
|
+
[dat.year, mon, day, Rudy::DELIM, hour, min, Rudy::DELIM, sec].join
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
# Returns a generic zipped Array of metadata
|
114
|
+
# (There is region, zone, environment, role, but no rtype)
|
115
|
+
def build_criteria(more=[], less=[])
|
116
|
+
# TODO: This build_criteria treats "more" differently than the
|
117
|
+
# ObjectBase one. Sort it out! (This way is better)
|
118
|
+
names = [:region, :zone, :environment, :role].compact
|
119
|
+
names -= [*less].flatten.uniq.compact
|
120
|
+
values = names.collect do |n|
|
121
|
+
@@global.send(n.to_sym)
|
122
|
+
end
|
123
|
+
names.zip(values) + more
|
124
|
+
end
|
125
|
+
|
126
|
+
def to_query(more=[], less=[])
|
127
|
+
Rudy::AWS::SDB.generate_query build_criteria(more, less)
|
128
|
+
end
|
129
|
+
|
130
|
+
def to_select(more=[], less=[])
|
131
|
+
Rudy::AWS::SDB.generate_select ['*'], Rudy::DOMAIN, build_criteria(more, less)
|
23
132
|
end
|
24
133
|
|
25
134
|
end
|
26
|
-
end
|
135
|
+
end
|
136
|
+
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy
|
4
|
+
module Routines
|
5
|
+
class Base
|
6
|
+
include Rudy::Huxtable
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
a, s, r = @@global.accesskey, @@global.secretkey, @@global.region
|
10
|
+
@sdb = Rudy::AWS::SDB.new(a, s, r)
|
11
|
+
@rinst = Rudy::AWS::EC2::Instances.new(a, s, r)
|
12
|
+
@rgrp = Rudy::AWS::EC2::Groups.new(a, s, r)
|
13
|
+
@rkey = Rudy::AWS::EC2::KeyPairs.new(a, s, r)
|
14
|
+
@rvol = Rudy::AWS::EC2::Volumes.new(a, s, r)
|
15
|
+
@rsnap = Rudy::AWS::EC2::Snapshots.new(a, s, r)
|
16
|
+
init
|
17
|
+
end
|
18
|
+
|
19
|
+
def init
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def execute
|
24
|
+
raise "Override execute method"
|
25
|
+
end
|
26
|
+
|
27
|
+
def task_separator(title)
|
28
|
+
dashes = 52 - title.size #
|
29
|
+
dashes = 0 if dashes < 1
|
30
|
+
("%s--- %s %s" % [$/, title, '-'*dashes]).bright
|
31
|
+
end
|
32
|
+
|
33
|
+
def machine_separator(title)
|
34
|
+
dashes = 52 - title.size #
|
35
|
+
dashes = 0 if dashes < 1
|
36
|
+
("%s--- %s %s" % [$/, title.bright, '-'*dashes]).bright.color(:blue)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
Rudy::Utils.require_glob(RUDY_LIB, 'rudy', 'routines', 'helpers', '*.rb')
|
45
|
+
Rudy::Utils.require_glob(RUDY_LIB, 'rudy', 'routines', '*.rb')
|
46
|
+
|
47
|
+
|
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rudy; module Routines;
|
4
|
+
module DiskHelper
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def execute(routine, machine, rbox)
|
8
|
+
return unless routine
|
9
|
+
raise "Not a Rudy::Machine" unless machine.is_a?(Rudy::Machine)
|
10
|
+
raise "Not a Rye::Box" unless rbox.is_a?(Rye::Box)
|
11
|
+
|
12
|
+
@machine = machine
|
13
|
+
@rbox = rbox
|
14
|
+
|
15
|
+
(routine.disks || {}).each_pair do |action, disks|
|
16
|
+
unless DiskHelper.respond_to?(action)
|
17
|
+
STDERR.puts %Q(DiskHelper: unknown action "#{action}")
|
18
|
+
next
|
19
|
+
end
|
20
|
+
send(action, disks) # create, copy, destroy, ...
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def create(disks)
|
25
|
+
rdisk = Rudy::Disks.new
|
26
|
+
|
27
|
+
disks.each_pair do |path, props|
|
28
|
+
disk = Rudy::Disk.new(path, props[:size], props[:device], @machine.position)
|
29
|
+
#disk = rdisk.get(disk.name)
|
30
|
+
puts "Creating #{disk.name} "
|
31
|
+
|
32
|
+
print "Creating volume... "
|
33
|
+
disk.create
|
34
|
+
Rudy::Utils.waiter(2, 60, STDOUT, "done", nil) {
|
35
|
+
disk.available?
|
36
|
+
}
|
37
|
+
|
38
|
+
print "Attaching #{disk.awsid} to #{@machine.awsid}... "
|
39
|
+
disk.attach(@machine.awsid)
|
40
|
+
Rudy::Utils.waiter(2, 60, STDOUT, "done", nil) {
|
41
|
+
disk.attached?
|
42
|
+
}
|
43
|
+
|
44
|
+
# The device needs some time.
|
45
|
+
# Otherwise mkfs returns:
|
46
|
+
# "No such file or directory while trying to determine filesystem size"
|
47
|
+
sleep 2
|
48
|
+
|
49
|
+
print "Creating ext3 filesystem for #{disk.device}... "
|
50
|
+
@rbox.mkfs(:t, "ext3", :F, disk.device)
|
51
|
+
@rbox.mkdir(:p, disk.path)
|
52
|
+
puts "done"
|
53
|
+
|
54
|
+
print "Mounting at #{disk.path}... "
|
55
|
+
|
56
|
+
@rbox.mount(:t, 'ext3', disk.device, disk.path)
|
57
|
+
disk.mounted = true
|
58
|
+
disk.save
|
59
|
+
puts "done"
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def destroy(disks)
|
65
|
+
rdisk = Rudy::Disks.new
|
66
|
+
|
67
|
+
disks.each_pair do |path, props|
|
68
|
+
adisk = Rudy::Disk.new(path, props[:size], props[:device], @machine.position)
|
69
|
+
disk = rdisk.get(adisk.name)
|
70
|
+
if disk == nil
|
71
|
+
puts "Not found: #{adisk.name}".color(:red)
|
72
|
+
return
|
73
|
+
end
|
74
|
+
|
75
|
+
puts "Destroying #{disk.name}"
|
76
|
+
|
77
|
+
if disk.mounted?
|
78
|
+
print "Unmounting #{disk.path}... "
|
79
|
+
@rbox.umount(disk.path)
|
80
|
+
sleep 0.5
|
81
|
+
puts "done"
|
82
|
+
end
|
83
|
+
|
84
|
+
if disk.attached?
|
85
|
+
print "Detaching #{disk.awsid}... "
|
86
|
+
disk.detach
|
87
|
+
Rudy::Utils.waiter(2, 60, STDOUT, 'done', nil) {
|
88
|
+
disk.available?
|
89
|
+
}
|
90
|
+
sleep 0.5
|
91
|
+
end
|
92
|
+
|
93
|
+
print "Destroying metadata... "
|
94
|
+
disk.destroy
|
95
|
+
puts "done"
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end;end
|