torpedo 1.0.9 → 1.0.10
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/CHANGELOG +5 -0
- data/README.md +9 -2
- data/Rakefile +5 -4
- data/VERSION +1 -1
- data/lib/torpedo/compute/servers.rb +124 -24
- data/lib/torpedo.rb +5 -0
- data/torpedo.gemspec +13 -11
- metadata +31 -14
- data/test/test_torpedo.rb +0 -7
data/CHANGELOG
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
* Wed Dec 7 2011 Dan Prince <dan.prince@rackspace.com> - 1.0.10
|
2
|
+
-Add admin password and change password tests.
|
3
|
+
-Add revert resize test.
|
4
|
+
-Add hard and soft reboot tests.
|
5
|
+
|
1
6
|
* Wed Nov 16 2011 Dan Prince <dan.prince@rackspace.com> - 1.0.9
|
2
7
|
-Add options to disable ssh and ping tests.
|
3
8
|
|
data/README.md
CHANGED
@@ -28,6 +28,10 @@ Installation
|
|
28
28
|
test_create_image: false
|
29
29
|
test_rebuild_server: false
|
30
30
|
test_resize_server: false
|
31
|
+
test_revert_resize_server: false
|
32
|
+
test_admin_password: false
|
33
|
+
test_soft_reboot_server: false
|
34
|
+
test_hard_reboot_server: false
|
31
35
|
|
32
36
|
# IMAGES (Set one of the following)
|
33
37
|
image_name: Ubuntu Natty (11.04)
|
@@ -45,7 +49,7 @@ Installation
|
|
45
49
|
#ssh_private_key: <your home dir>/.ssh/id_rsa
|
46
50
|
#ssh_public_key: <your home dir>/.ssh/id_rsa.pub
|
47
51
|
|
48
|
-
# KEYPAIRS (used to verify
|
52
|
+
# KEYPAIRS (used to verify images that support keypairs)
|
49
53
|
#keypair: test.pem
|
50
54
|
#keyname: test
|
51
55
|
EOF_CAT
|
@@ -83,7 +87,7 @@ Payload
|
|
83
87
|
* list images
|
84
88
|
* get image
|
85
89
|
* list limits
|
86
|
-
* create server (ping and ssh test)
|
90
|
+
* create server (ping and ssh test w/ admin password and personality)
|
87
91
|
* delete server metadata items
|
88
92
|
* update one server metadata item
|
89
93
|
* update multiple server metadata items
|
@@ -93,6 +97,9 @@ Payload
|
|
93
97
|
* rebuild server (ping and ssh test)
|
94
98
|
* resize server (ping and ssh test)
|
95
99
|
* resize confirm (ping and ssh test)
|
100
|
+
* resize revert (ping and ssh test)
|
101
|
+
* soft reboot (ping and ssh test)
|
102
|
+
* hard reboot (ping and ssh test)
|
96
103
|
* delete image metadata
|
97
104
|
* update one image metadata item
|
98
105
|
* update multiple image metadata items
|
data/Rakefile
CHANGED
@@ -18,13 +18,14 @@ Jeweler::Tasks.new do |gem|
|
|
18
18
|
gem.executables = "torpedo"
|
19
19
|
gem.homepage = "http://github.com/dprince/torpedo"
|
20
20
|
gem.license = "MIT"
|
21
|
-
gem.summary = %Q{
|
22
|
-
gem.description = %Q{
|
21
|
+
gem.summary = %Q{Fire when ready. Fast Ruby integration tests for OpenStack.}
|
22
|
+
gem.description = %Q{Fast integration tests OpenStack Compute.}
|
23
23
|
gem.email = "dan.prince@rackspace.com"
|
24
24
|
gem.authors = ["Dan Prince"]
|
25
25
|
# dependencies defined in Gemfile
|
26
|
-
gem.add_dependency 'thor'
|
27
|
-
gem.add_dependency 'openstack-compute', '
|
26
|
+
gem.add_dependency 'thor', '~>0.14.6'
|
27
|
+
gem.add_dependency 'openstack-compute', '~>1.1.5'
|
28
|
+
gem.add_dependency('net-ssh', '~>2.2.1')
|
28
29
|
end
|
29
30
|
Jeweler::RubygemsDotOrgTasks.new
|
30
31
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.10
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
require 'tempfile'
|
3
|
+
require 'net/ssh'
|
3
4
|
|
4
5
|
module Torpedo
|
5
6
|
module Compute
|
@@ -11,6 +12,7 @@ class Servers < Test::Unit::TestCase
|
|
11
12
|
@@flavor_ref = Helper::get_flavor_ref(Helper::get_connection)
|
12
13
|
@@flavor_ref_resize = Helper::get_flavor_ref_resize(@conn)
|
13
14
|
@@server = nil #ref to last created server
|
15
|
+
@@hostname = "torpedo"
|
14
16
|
|
15
17
|
def setup
|
16
18
|
@conn=Helper::get_connection
|
@@ -19,6 +21,8 @@ class Servers < Test::Unit::TestCase
|
|
19
21
|
def create_server(server_opts)
|
20
22
|
@@server = @conn.create_server(server_opts)
|
21
23
|
@@servers << @@server
|
24
|
+
@@admin_pass = @@server.adminPass #original admin_pass
|
25
|
+
@@host_id = @@server.hostId #original host ID
|
22
26
|
@@server
|
23
27
|
end
|
24
28
|
|
@@ -29,20 +33,43 @@ class Servers < Test::Unit::TestCase
|
|
29
33
|
image
|
30
34
|
end
|
31
35
|
|
32
|
-
def
|
36
|
+
def get_personalities
|
37
|
+
if TEST_ADMIN_PASSWORD then
|
38
|
+
tmp_file=Tempfile.new "server_tests"
|
39
|
+
tmp_file.write("yo")
|
40
|
+
tmp_file.flush
|
41
|
+
{tmp_file.path => "/tmp/foo/bar"}
|
42
|
+
else
|
43
|
+
# NOTE: if admin_pass is disabled we inject the public key so we still
|
44
|
+
# can still login. This would only matter if KEYPAIR was disabled as well.
|
45
|
+
{SSH_PUBLIC_KEY => "/root/.ssh/authorized_keys"}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def ssh_test(ip_addr, test_cmd="hostname", test_output=@@hostname, admin_pass=@@admin_pass)
|
50
|
+
|
51
|
+
ssh_opts = {}
|
52
|
+
if TEST_ADMIN_PASSWORD then
|
53
|
+
ssh_opts.store(:password, admin_pass)
|
54
|
+
else
|
55
|
+
ssh_identity=SSH_PRIVATE_KEY
|
56
|
+
if KEYPAIR and not KEYPAIR.empty? then
|
57
|
+
ssh_identity=KEYPAIR
|
58
|
+
end
|
59
|
+
ssh_opts.store(:keys, ssh_identity)
|
60
|
+
end
|
61
|
+
|
33
62
|
begin
|
34
63
|
Timeout::timeout(SSH_TIMEOUT) do
|
35
|
-
|
36
64
|
while(1) do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
65
|
+
begin
|
66
|
+
Net::SSH.start(ip_addr, 'root', ssh_opts) do |ssh|
|
67
|
+
return ssh.exec!(test_cmd) == test_output
|
68
|
+
end
|
69
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::SSH::Exception
|
70
|
+
next
|
43
71
|
end
|
44
72
|
end
|
45
|
-
|
46
73
|
end
|
47
74
|
rescue Timeout::Error => te
|
48
75
|
fail("Timeout trying to ssh to server: #{ip_addr}")
|
@@ -76,7 +103,7 @@ class Servers < Test::Unit::TestCase
|
|
76
103
|
assert_not_nil(server.hostId)
|
77
104
|
assert_equal(flavor_ref, server.flavor['id'])
|
78
105
|
assert_equal(image_ref.to_s, server.image['id'])
|
79
|
-
assert_equal(
|
106
|
+
assert_equal(@@hostname, server.name)
|
80
107
|
server = @conn.server(server.id)
|
81
108
|
|
82
109
|
begin
|
@@ -96,7 +123,13 @@ class Servers < Test::Unit::TestCase
|
|
96
123
|
# lookup the first IPv4 address and use that for verification
|
97
124
|
v4_addresses = server.addresses[:public].reject {|addr| addr.version != 4}
|
98
125
|
ping_test(v4_addresses[0].address) if TEST_PING
|
99
|
-
|
126
|
+
if TEST_SSH
|
127
|
+
if TEST_ADMIN_PASSWORD
|
128
|
+
ssh_test(v4_addresses[0].address, "cat /tmp/foo/bar", "yo")
|
129
|
+
else
|
130
|
+
ssh_test(v4_addresses[0].address)
|
131
|
+
end
|
132
|
+
end
|
100
133
|
|
101
134
|
server
|
102
135
|
|
@@ -104,18 +137,13 @@ class Servers < Test::Unit::TestCase
|
|
104
137
|
|
105
138
|
def test_001_create_server
|
106
139
|
|
107
|
-
# NOTE: When using AMI style images we rely on keypairs for SSH access.
|
108
|
-
|
109
|
-
# NOTE: injecting two or more files doesn't work for now due to XenStore
|
110
|
-
# limitations
|
111
|
-
personalities={SSH_PUBLIC_KEY => "/root/.ssh/authorized_keys"}
|
112
140
|
metadata={ "key1" => "value1", "key2" => "value2" }
|
113
|
-
options = {:name =>
|
141
|
+
options = {:name => @@hostname, :imageRef => @@image_ref, :flavorRef => @@flavor_ref, :personality => get_personalities, :metadata => metadata}
|
114
142
|
if KEYNAME and not KEYNAME.empty? then
|
115
143
|
options[:key_name] = KEYNAME
|
116
144
|
end
|
117
145
|
server = create_server(options)
|
118
|
-
assert_not_nil(
|
146
|
+
assert_not_nil(server.adminPass)
|
119
147
|
|
120
148
|
#boot a server and check it
|
121
149
|
check_server(server, @@image_ref, @@flavor_ref)
|
@@ -230,18 +258,89 @@ class Servers < Test::Unit::TestCase
|
|
230
258
|
|
231
259
|
end if TEST_CREATE_IMAGE
|
232
260
|
|
233
|
-
|
234
261
|
def test_030_rebuild
|
235
|
-
#
|
236
|
-
|
237
|
-
@@server.rebuild!(:imageRef => @@image_ref, :personality => personalities)
|
262
|
+
# NOTE: this will use the snapshot if TEST_CREATE_IMAGE is enabled
|
263
|
+
@@server.rebuild!(:adminPass => @@admin_pass, :imageRef => @@image_ref, :personality => get_personalities)
|
238
264
|
server = @conn.server(@@server.id)
|
239
265
|
sleep 15 # sleep a couple seconds until rebuild starts
|
240
266
|
check_server(server, @@image_ref, @@flavor_ref)
|
241
267
|
|
242
268
|
end if TEST_REBUILD_SERVER
|
243
269
|
|
244
|
-
def
|
270
|
+
def test_035_soft_reboot
|
271
|
+
# make sure our snapshot boots
|
272
|
+
@@server.reboot(type='SOFT')
|
273
|
+
server = @conn.server(@@server.id)
|
274
|
+
assert_equal('REBOOT', server.status)
|
275
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
276
|
+
end if TEST_SOFT_REBOOT_SERVER
|
277
|
+
|
278
|
+
def test_036_hard_reboot
|
279
|
+
# make sure our snapshot boots
|
280
|
+
@@server.reboot(type='HARD')
|
281
|
+
server = @conn.server(@@server.id)
|
282
|
+
assert_equal('HARD_REBOOT', server.status)
|
283
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
284
|
+
end if TEST_HARD_REBOOT_SERVER
|
285
|
+
|
286
|
+
def test_037_change_password
|
287
|
+
@@admin_pass = "AnGrYbIrD$"
|
288
|
+
@@server.change_password!(@@admin_pass)
|
289
|
+
server = @conn.server(@@server.id)
|
290
|
+
begin
|
291
|
+
timeout(60) do
|
292
|
+
until server.status == 'ACTIVE' do
|
293
|
+
server = @conn.server(server.id)
|
294
|
+
sleep 1
|
295
|
+
end
|
296
|
+
end
|
297
|
+
rescue Timeout::Error => te
|
298
|
+
fail('Timeout changing server password.')
|
299
|
+
end
|
300
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
301
|
+
end if TEST_ADMIN_PASSWORD
|
302
|
+
|
303
|
+
def test_040_resize_revert
|
304
|
+
|
305
|
+
@@server.resize!(@@flavor_ref_resize)
|
306
|
+
server = @conn.server(@@server.id)
|
307
|
+
assert_equal('RESIZE', server.status)
|
308
|
+
|
309
|
+
begin
|
310
|
+
timeout(SERVER_BUILD_TIMEOUT) do
|
311
|
+
until server.status == 'VERIFY_RESIZE' do
|
312
|
+
if server.status == "ERROR" then
|
313
|
+
fail('Server ERROR state detected when resizing server!')
|
314
|
+
end
|
315
|
+
server = @conn.server(server.id)
|
316
|
+
sleep 1
|
317
|
+
end
|
318
|
+
end
|
319
|
+
rescue Timeout::Error => te
|
320
|
+
fail('Timeout resizing server.')
|
321
|
+
end
|
322
|
+
|
323
|
+
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
|
324
|
+
|
325
|
+
@@server.revert_resize!
|
326
|
+
server = @conn.server(@@server.id)
|
327
|
+
begin
|
328
|
+
timeout(60) do
|
329
|
+
until server.status == 'ACTIVE' do
|
330
|
+
server = @conn.server(server.id)
|
331
|
+
sleep 1
|
332
|
+
end
|
333
|
+
end
|
334
|
+
rescue Timeout::Error => te
|
335
|
+
fail('Timeout waiting for revert resize.')
|
336
|
+
end
|
337
|
+
|
338
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
339
|
+
assert_equal(server.hostId, @@host_id)
|
340
|
+
|
341
|
+
end if TEST_REVERT_RESIZE_SERVER
|
342
|
+
|
343
|
+
def test_041_resize
|
245
344
|
|
246
345
|
@@server.resize!(@@flavor_ref_resize)
|
247
346
|
server = @conn.server(@@server.id)
|
@@ -262,10 +361,11 @@ class Servers < Test::Unit::TestCase
|
|
262
361
|
end
|
263
362
|
|
264
363
|
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
|
364
|
+
assert_not_equal(server.hostId, @@host_id) if TEST_HOSTID_ON_RESIZE
|
265
365
|
|
266
366
|
end if TEST_RESIZE_SERVER
|
267
367
|
|
268
|
-
def
|
368
|
+
def test_042_resize_confirm
|
269
369
|
|
270
370
|
@@server.confirm_resize!
|
271
371
|
server = @conn.server(@@server.id)
|
data/lib/torpedo.rb
CHANGED
@@ -12,7 +12,12 @@ SSH_PRIVATE_KEY=configs['ssh_private_key'] || ENV['HOME'] + "/.ssh/id_rsa"
|
|
12
12
|
SSH_PUBLIC_KEY=configs['ssh_public_key'] || ENV['HOME'] + "/.ssh/id_rsa.pub"
|
13
13
|
TEST_CREATE_IMAGE=configs['test_create_image'] || false
|
14
14
|
TEST_REBUILD_SERVER=configs['test_rebuild_server'] || false
|
15
|
+
TEST_SOFT_REBOOT_SERVER=configs['test_soft_reboot_server'] || false
|
16
|
+
TEST_HARD_REBOOT_SERVER=configs['test_hard_reboot_server'] || false
|
15
17
|
TEST_RESIZE_SERVER=configs['test_resize_server'] || false
|
18
|
+
TEST_REVERT_RESIZE_SERVER=configs['test_revert_resize_server'] || false
|
19
|
+
TEST_ADMIN_PASSWORD=configs['test_admin_password'] || false
|
20
|
+
TEST_HOSTID_ON_RESIZE=configs['test_hostid_on_resize'] || false
|
16
21
|
KEYPAIR=configs['keypair']
|
17
22
|
KEYNAME=configs['keyname']
|
18
23
|
|
data/torpedo.gemspec
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{torpedo}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.10"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Dan Prince"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-12-07}
|
13
13
|
s.default_executable = %q{torpedo}
|
14
|
-
s.description = %q{
|
14
|
+
s.description = %q{Fast integration tests OpenStack Compute.}
|
15
15
|
s.email = %q{dan.prince@rackspace.com}
|
16
16
|
s.executables = ["torpedo"]
|
17
17
|
s.extra_rdoc_files = [
|
@@ -36,14 +36,13 @@ Gem::Specification.new do |s|
|
|
36
36
|
"lib/torpedo/compute/servers.rb",
|
37
37
|
"lib/torpedo/config.rb",
|
38
38
|
"test/helper.rb",
|
39
|
-
"test/test_torpedo.rb",
|
40
39
|
"torpedo.gemspec"
|
41
40
|
]
|
42
41
|
s.homepage = %q{http://github.com/dprince/torpedo}
|
43
42
|
s.licenses = ["MIT"]
|
44
43
|
s.require_paths = ["lib"]
|
45
44
|
s.rubygems_version = %q{1.3.7}
|
46
|
-
s.summary = %q{
|
45
|
+
s.summary = %q{Fire when ready. Fast Ruby integration tests for OpenStack.}
|
47
46
|
|
48
47
|
if s.respond_to? :specification_version then
|
49
48
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
@@ -52,19 +51,22 @@ Gem::Specification.new do |s|
|
|
52
51
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
52
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
54
53
|
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
55
|
-
s.add_runtime_dependency(%q<thor>, ["
|
56
|
-
s.add_runtime_dependency(%q<openstack-compute>, ["
|
54
|
+
s.add_runtime_dependency(%q<thor>, ["~> 0.14.6"])
|
55
|
+
s.add_runtime_dependency(%q<openstack-compute>, ["~> 1.1.5"])
|
56
|
+
s.add_runtime_dependency(%q<net-ssh>, ["~> 2.2.1"])
|
57
57
|
else
|
58
58
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
59
59
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
60
|
-
s.add_dependency(%q<thor>, ["
|
61
|
-
s.add_dependency(%q<openstack-compute>, ["
|
60
|
+
s.add_dependency(%q<thor>, ["~> 0.14.6"])
|
61
|
+
s.add_dependency(%q<openstack-compute>, ["~> 1.1.5"])
|
62
|
+
s.add_dependency(%q<net-ssh>, ["~> 2.2.1"])
|
62
63
|
end
|
63
64
|
else
|
64
65
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
66
|
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
66
|
-
s.add_dependency(%q<thor>, ["
|
67
|
-
s.add_dependency(%q<openstack-compute>, ["
|
67
|
+
s.add_dependency(%q<thor>, ["~> 0.14.6"])
|
68
|
+
s.add_dependency(%q<openstack-compute>, ["~> 1.1.5"])
|
69
|
+
s.add_dependency(%q<net-ssh>, ["~> 2.2.1"])
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torpedo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 10
|
10
|
+
version: 1.0.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dan Prince
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-12-07 00:00:00 -05:00
|
19
19
|
default_executable: torpedo
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -56,12 +56,14 @@ dependencies:
|
|
56
56
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
57
57
|
none: false
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
61
|
+
hash: 43
|
62
62
|
segments:
|
63
63
|
- 0
|
64
|
-
|
64
|
+
- 14
|
65
|
+
- 6
|
66
|
+
version: 0.14.6
|
65
67
|
requirement: *id003
|
66
68
|
type: :runtime
|
67
69
|
- !ruby/object:Gem::Dependency
|
@@ -70,17 +72,33 @@ dependencies:
|
|
70
72
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
71
73
|
none: false
|
72
74
|
requirements:
|
73
|
-
- -
|
75
|
+
- - ~>
|
74
76
|
- !ruby/object:Gem::Version
|
75
|
-
hash:
|
77
|
+
hash: 25
|
76
78
|
segments:
|
77
79
|
- 1
|
78
80
|
- 1
|
79
|
-
-
|
80
|
-
version: 1.1.
|
81
|
+
- 5
|
82
|
+
version: 1.1.5
|
81
83
|
requirement: *id004
|
82
84
|
type: :runtime
|
83
|
-
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
prerelease: false
|
87
|
+
name: net-ssh
|
88
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 5
|
94
|
+
segments:
|
95
|
+
- 2
|
96
|
+
- 2
|
97
|
+
- 1
|
98
|
+
version: 2.2.1
|
99
|
+
requirement: *id005
|
100
|
+
type: :runtime
|
101
|
+
description: Fast integration tests OpenStack Compute.
|
84
102
|
email: dan.prince@rackspace.com
|
85
103
|
executables:
|
86
104
|
- torpedo
|
@@ -107,7 +125,6 @@ files:
|
|
107
125
|
- lib/torpedo/compute/servers.rb
|
108
126
|
- lib/torpedo/config.rb
|
109
127
|
- test/helper.rb
|
110
|
-
- test/test_torpedo.rb
|
111
128
|
- torpedo.gemspec
|
112
129
|
has_rdoc: true
|
113
130
|
homepage: http://github.com/dprince/torpedo
|
@@ -142,6 +159,6 @@ rubyforge_project:
|
|
142
159
|
rubygems_version: 1.3.7
|
143
160
|
signing_key:
|
144
161
|
specification_version: 3
|
145
|
-
summary:
|
162
|
+
summary: Fire when ready. Fast Ruby integration tests for OpenStack.
|
146
163
|
test_files: []
|
147
164
|
|