torpedo 1.0.19 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +9 -0
- data/LICENSE.txt +2 -1
- data/README.md +3 -3
- data/Rakefile +6 -5
- data/VERSION +1 -1
- data/bin/torpedo +0 -1
- data/lib/torpedo.rb +131 -22
- data/lib/torpedo/cleanup.rb +74 -0
- data/lib/torpedo/compute/flavors.rb +22 -22
- data/lib/torpedo/compute/helper.rb +79 -85
- data/lib/torpedo/compute/images.rb +23 -23
- data/lib/torpedo/compute/keypairs.rb +36 -0
- data/lib/torpedo/compute/limits.rb +15 -10
- data/lib/torpedo/compute/servers.rb +458 -382
- data/lib/torpedo/metering/helper.rb +43 -0
- data/lib/torpedo/metering/meters.rb +67 -0
- data/lib/torpedo/net_util.rb +66 -0
- data/lib/torpedo/orchestration/helper.rb +43 -0
- data/lib/torpedo/orchestration/stacks.rb +117 -0
- data/lib/torpedo/orchestration/test_server.hot +31 -0
- data/lib/torpedo/volume/helper.rb +43 -0
- data/lib/torpedo/volume/volumes.rb +114 -0
- data/torpedo.gemspec +30 -19
- metadata +44 -18
@@ -1,35 +1,35 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
3
|
module Torpedo
|
4
|
-
module Compute
|
5
|
-
class Images < Test::Unit::TestCase
|
4
|
+
module Compute
|
5
|
+
class Images < Test::Unit::TestCase
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def setup
|
8
|
+
@conn=Helper::get_connection
|
9
|
+
@image_id = Helper::get_image_ref(@conn)
|
10
|
+
end
|
11
11
|
|
12
|
-
|
12
|
+
def test_list
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
14
|
+
@conn.images.each do |image|
|
15
|
+
assert_not_nil(image.id)
|
16
|
+
assert_not_nil(image.name)
|
17
|
+
assert_not_nil(image.status)
|
18
|
+
end
|
19
19
|
|
20
|
-
|
20
|
+
end
|
21
21
|
|
22
|
-
|
22
|
+
def test_get
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
image=@conn.images.get(@image_id)
|
25
|
+
assert_equal(@image_id, image.id.to_s)
|
26
|
+
assert_not_nil(image.name)
|
27
|
+
assert_not_nil(image.updated_at)
|
28
|
+
assert_not_nil(image.created_at)
|
29
|
+
assert_not_nil(image.status)
|
30
30
|
|
31
|
-
|
31
|
+
end
|
32
32
|
|
33
|
-
end
|
34
|
-
end
|
33
|
+
end
|
34
|
+
end
|
35
35
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper'
|
2
|
+
|
3
|
+
module Torpedo
|
4
|
+
module Compute
|
5
|
+
class Keypairs < Test::Unit::TestCase
|
6
|
+
|
7
|
+
@@key_pairs = []
|
8
|
+
@@key_pair = nil #ref to last created key_pair
|
9
|
+
@@key_pair_name = 'torpedo' #ref to last created key_pair
|
10
|
+
|
11
|
+
# public access to the key_pair ref
|
12
|
+
def self.key_pair
|
13
|
+
@@key_pair
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup
|
17
|
+
@conn=Helper::get_connection
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_key_pair(options)
|
21
|
+
@@key_pair = @conn.key_pairs.create(options)
|
22
|
+
@@key_pairs << @@key_pair
|
23
|
+
@@key_pair
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_001_create_key_pair
|
27
|
+
public_key = IO.read(SSH_PUBLIC_KEY)
|
28
|
+
options = {:public_key => public_key, :name => @@key_pair_name}
|
29
|
+
key_pair = create_key_pair(options)
|
30
|
+
assert_equal(@@key_pair_name, key_pair.name)
|
31
|
+
assert_equal(public_key, key_pair.public_key)
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,19 +1,24 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/helper'
|
2
2
|
|
3
3
|
module Torpedo
|
4
|
-
module Compute
|
5
|
-
class Limits < Test::Unit::TestCase
|
4
|
+
module Compute
|
6
5
|
|
7
|
-
|
8
|
-
@conn=Helper::get_connection
|
9
|
-
end
|
6
|
+
class Limits < Test::Unit::TestCase
|
10
7
|
|
11
|
-
|
8
|
+
def setup
|
9
|
+
@conn=Helper::get_connection
|
10
|
+
end
|
12
11
|
|
13
|
-
|
12
|
+
def test_list
|
14
13
|
|
15
|
-
|
14
|
+
limits = @conn.get_limits.body['limits']
|
15
|
+
assert_not_nil limits
|
16
|
+
assert_not_nil limits['rate']
|
17
|
+
assert_not_nil limits['absolute']
|
16
18
|
|
17
|
-
end if TEST_LIMITS
|
18
|
-
|
19
|
+
end if TEST_LIMITS
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
19
24
|
end
|
@@ -1,492 +1,568 @@
|
|
1
1
|
require 'torpedo/compute/helper'
|
2
|
+
require 'torpedo/compute/keypairs'
|
3
|
+
require 'torpedo/volume/helper'
|
4
|
+
require 'torpedo/net_util'
|
2
5
|
require 'tempfile'
|
3
|
-
require 'net/ssh'
|
4
6
|
|
5
7
|
module Torpedo
|
6
|
-
module Compute
|
7
|
-
class Servers < Test::Unit::TestCase
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def create_server(server_opts)
|
23
|
-
@@server = @conn.create_server(server_opts)
|
24
|
-
@@servers << @@server
|
25
|
-
@@admin_pass = @@server.adminPass #original admin_pass
|
26
|
-
@@server
|
27
|
-
end
|
28
|
-
|
29
|
-
def create_image(server, image_opts)
|
30
|
-
image = server.create_image(image_opts)
|
31
|
-
@@images << image
|
32
|
-
@@image_ref = image.id
|
33
|
-
image
|
34
|
-
end
|
8
|
+
module Compute
|
9
|
+
class Servers < Test::Unit::TestCase
|
10
|
+
|
11
|
+
@@servers = []
|
12
|
+
@@images = []
|
13
|
+
@@image_ref = nil
|
14
|
+
@@flavor_ref = nil
|
15
|
+
@@flavor_ref_resize = nil
|
16
|
+
@@server = nil #ref to last created server
|
17
|
+
@@hostname = "torpedo"
|
18
|
+
@@host_id = nil
|
19
|
+
|
20
|
+
# public access to the server ref
|
21
|
+
def self.server
|
22
|
+
@@server
|
23
|
+
end
|
35
24
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
25
|
+
# public access to the image ref
|
26
|
+
def self.image_ref
|
27
|
+
@@image_ref
|
28
|
+
end
|
48
29
|
|
49
|
-
|
30
|
+
# public access to the flavor ref
|
31
|
+
def self.flavor_ref
|
32
|
+
@@flavor_ref
|
33
|
+
end
|
50
34
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
if KEYPAIR and not KEYPAIR.empty? then
|
57
|
-
ssh_identity=KEYPAIR
|
35
|
+
def setup
|
36
|
+
@conn=Helper::get_connection
|
37
|
+
if VOLUME_ENABLED then
|
38
|
+
@volume_conn=Torpedo::Volume::Helper::get_connection
|
39
|
+
end
|
58
40
|
end
|
59
|
-
ssh_opts.store(:keys, ssh_identity)
|
60
|
-
end
|
61
41
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
42
|
+
def create_server(options)
|
43
|
+
if ORCHESTRATION_ENABLED then
|
44
|
+
#if heat is enabled we re-use the server from the stack
|
45
|
+
@conn.servers.each do |server|
|
46
|
+
if server.name == 'torpedo'
|
47
|
+
@@server = @conn.servers.get(server.id)
|
68
48
|
end
|
69
|
-
|
70
|
-
|
49
|
+
#NOTE: When using Heat we use keypairs... so just stub this out
|
50
|
+
@@admin_pass = 'Not Available'
|
71
51
|
end
|
52
|
+
else
|
53
|
+
@@server = @conn.servers.create(options)
|
54
|
+
@@servers << @@server
|
55
|
+
@@admin_pass = @@server.password #original admin_pass
|
56
|
+
assert_not_nil(@@admin_pass)
|
72
57
|
end
|
58
|
+
@@server
|
73
59
|
end
|
74
|
-
rescue Timeout::Error => te
|
75
|
-
fail("Timeout trying to ssh to server: #{ip_addr}")
|
76
|
-
end
|
77
60
|
|
78
|
-
|
61
|
+
def create_image(server, name, metadata)
|
62
|
+
image_raw = @conn.create_image(server.id, name, metadata).body['image']
|
63
|
+
image_raw[:service] = @conn
|
64
|
+
image = Fog::Compute::OpenStack::Image.new(image_raw)
|
65
|
+
@@images << image
|
66
|
+
@@image_ref = image_raw['id']
|
67
|
+
image
|
68
|
+
end
|
79
69
|
|
80
|
-
|
70
|
+
def get_personalities
|
71
|
+
if TEST_ADMIN_PASSWORD or Keypairs.key_pair then
|
72
|
+
[{'contents' => 'yo', 'path' => '/tmp/foo.bar'}]
|
73
|
+
else
|
74
|
+
# NOTE: if admin_pass and keypairs are disabled we inject the public
|
75
|
+
# key so we can still login.
|
76
|
+
[{'contents' => IO.read(SSH_PUBLIC_KEY), 'path' => '/root/.ssh/authorized_keys'}]
|
77
|
+
end
|
78
|
+
end
|
81
79
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
80
|
+
def find_ip(server)
|
81
|
+
# lookup the first public IP address and use that for verification
|
82
|
+
if server.addresses[NETWORK_LABEL].nil?
|
83
|
+
fail("No address found for network label #{NETWORK_LABEL}. Addresses: #{server.addresses}")
|
84
|
+
end
|
85
|
+
addresses = server.addresses[NETWORK_LABEL].select {|a| a['version'] == TEST_IP_TYPE}
|
86
|
+
address = addresses[0]['addr']
|
87
|
+
if address.nil? or address.empty? then
|
88
|
+
fail("No address found for network label #{NETWORK_LABEL}. Addresses: #{server.addresses}")
|
89
89
|
end
|
90
|
+
address
|
90
91
|
end
|
91
|
-
rescue Timeout::Error => te
|
92
|
-
fail("Timeout pinging server: #{ping_command}")
|
93
|
-
end
|
94
92
|
|
95
|
-
|
93
|
+
def check_server(server, image_ref, flavor_ref, check_status="ACTIVE")
|
96
94
|
|
97
|
-
|
95
|
+
server_flavor = server.flavor_ref || server.flavor['id']
|
96
|
+
server_image = server.image_ref || server.image['id']
|
97
|
+
|
98
|
+
assert_equal(flavor_ref, server_flavor)
|
99
|
+
assert_equal(image_ref.to_s, server_image)
|
100
|
+
assert_equal(@@hostname, server.name)
|
101
|
+
server = @conn.servers.get(server.id)
|
98
102
|
|
99
|
-
|
103
|
+
begin
|
104
|
+
timeout(SERVER_BUILD_TIMEOUT) do
|
105
|
+
until server.state == check_status do
|
106
|
+
if server.state == "ERROR" then
|
107
|
+
fail('Server ERROR state detected when booting server!')
|
108
|
+
end
|
109
|
+
server = @conn.servers.get(server.id)
|
110
|
+
sleep 1
|
111
|
+
end
|
112
|
+
end
|
113
|
+
rescue Timeout::Error => te
|
114
|
+
fail('Timeout creating server.')
|
115
|
+
end
|
100
116
|
|
101
|
-
|
102
|
-
assert_equal(flavor_ref, server.flavor['id'])
|
103
|
-
assert_equal(image_ref.to_s, server.image['id'])
|
104
|
-
assert_equal(@@hostname, server.name)
|
105
|
-
server = @conn.server(server.id)
|
117
|
+
assert_not_nil(server.host_id)
|
106
118
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
if
|
111
|
-
|
119
|
+
address = find_ip(server)
|
120
|
+
Torpedo::NetUtil.ping_test(address, NETWORK_NAMESPACE) if TEST_PING
|
121
|
+
if TEST_SSH
|
122
|
+
if TEST_ADMIN_PASSWORD or Keypairs.key_pair then
|
123
|
+
Torpedo::NetUtil.ssh_test(address, NETWORK_NAMESPACE, "cat /tmp/foo.bar", "yo", @@admin_pass)
|
124
|
+
else
|
125
|
+
Torpedo::NetUtil.ssh_test(address, NETWORK_NAMESPACE, "hostname", @@hostname, @@admin_pass)
|
112
126
|
end
|
113
|
-
server = @conn.server(server.id)
|
114
|
-
sleep 1
|
115
127
|
end
|
128
|
+
|
129
|
+
server
|
130
|
+
|
116
131
|
end
|
117
|
-
rescue Timeout::Error => te
|
118
|
-
fail('Timeout creating server.')
|
119
|
-
end
|
120
132
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
133
|
+
def test_000_setup
|
134
|
+
begin
|
135
|
+
@@image_ref = Helper::get_image_ref(Helper::get_connection)
|
136
|
+
rescue Exception => e
|
137
|
+
fail("Failed get image ref: #{e.message}")
|
138
|
+
end
|
139
|
+
begin
|
140
|
+
@@flavor_ref = Helper::get_flavor_ref(Helper::get_connection)
|
141
|
+
rescue Exception => e
|
142
|
+
fail("Failed get flavor ref: #{e.message}")
|
143
|
+
end
|
144
|
+
begin
|
145
|
+
@@flavor_ref_resize = Helper::get_flavor_ref_resize(@conn)
|
146
|
+
rescue Exception => e
|
147
|
+
fail("Failed get flavor ref resize: #{e.message}")
|
148
|
+
end
|
130
149
|
end
|
131
|
-
end
|
132
150
|
|
133
|
-
|
151
|
+
def test_001_create_server
|
134
152
|
|
135
|
-
|
153
|
+
metadata={ "key1" => "value1", "key2" => "value2" }
|
154
|
+
options = {:name => @@hostname, :image_ref => @@image_ref, :flavor_ref => @@flavor_ref, :personality => get_personalities, :metadata => metadata}
|
155
|
+
if Keypairs.key_pair then
|
156
|
+
options['key_name'] = Keypairs.key_pair.name
|
157
|
+
end
|
158
|
+
server = create_server(options)
|
136
159
|
|
137
|
-
|
138
|
-
|
139
|
-
@@image_ref = Helper::get_image_ref(Helper::get_connection)
|
140
|
-
rescue Exception => e
|
141
|
-
fail("Failed get image ref: #{e.message}")
|
142
|
-
end
|
143
|
-
begin
|
144
|
-
@@flavor_ref = Helper::get_flavor_ref(Helper::get_connection)
|
145
|
-
rescue Exception => e
|
146
|
-
fail("Failed get flavor ref: #{e.message}")
|
147
|
-
end
|
148
|
-
begin
|
149
|
-
@@flavor_ref_resize = Helper::get_flavor_ref_resize(@conn)
|
150
|
-
rescue Exception => e
|
151
|
-
fail("Failed get flavor ref resize: #{e.message}")
|
152
|
-
end
|
153
|
-
end
|
160
|
+
#boot a server and check it
|
161
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
154
162
|
|
155
|
-
|
163
|
+
assert_equal "value1", @@server.metadata.get('key1').value
|
164
|
+
assert_equal "value2", @@server.metadata.get('key2').value
|
165
|
+
assert_equal 2, @@server.metadata.size
|
156
166
|
|
157
|
-
|
158
|
-
options = {:name => @@hostname, :imageRef => @@image_ref, :flavorRef => @@flavor_ref, :personality => get_personalities, :metadata => metadata}
|
159
|
-
if KEYNAME and not KEYNAME.empty? then
|
160
|
-
options[:key_name] = KEYNAME
|
161
|
-
end
|
162
|
-
server = create_server(options)
|
163
|
-
assert_not_nil(server.adminPass)
|
167
|
+
end
|
164
168
|
|
165
|
-
|
166
|
-
check_server(server, @@image_ref, @@flavor_ref)
|
169
|
+
def test_002_delete_server_metadata_items
|
167
170
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
+
@@metadata = Fog::Compute::OpenStack::Metadata.new({
|
172
|
+
:service => @conn,
|
173
|
+
:parent => @@server
|
174
|
+
})
|
175
|
+
assert_equal 2, @@metadata.size
|
171
176
|
|
172
|
-
|
177
|
+
@@metadata.each do |meta|
|
178
|
+
assert meta.destroy
|
179
|
+
end
|
173
180
|
|
174
|
-
|
181
|
+
#refresh the metadata
|
182
|
+
@@metadata = Fog::Compute::OpenStack::Metadata.new({
|
183
|
+
:service => @conn,
|
184
|
+
:parent => @@server
|
185
|
+
})
|
186
|
+
assert_equal 0, @@metadata.size
|
175
187
|
|
176
|
-
|
177
|
-
metadata.each_pair do |key, value|
|
178
|
-
assert metadata.delete!(key)
|
179
|
-
end
|
180
|
-
|
181
|
-
metadata.refresh
|
188
|
+
end
|
182
189
|
|
183
|
-
|
190
|
+
def test_003_update_one_server_metadata_item
|
184
191
|
|
185
|
-
|
192
|
+
datum = Fog::Compute::OpenStack::Metadatum.new({
|
193
|
+
:service => @conn,
|
194
|
+
:parent => @@server
|
195
|
+
})
|
196
|
+
datum.key = 'foo0'
|
197
|
+
datum.value = 'bar0'
|
198
|
+
datum.save
|
186
199
|
|
187
|
-
|
200
|
+
#refresh the metadata
|
201
|
+
@@metadata = Fog::Compute::OpenStack::Metadata.new({
|
202
|
+
:service => @conn,
|
203
|
+
:parent => @@server
|
204
|
+
})
|
205
|
+
assert_equal 1, @@metadata.size
|
188
206
|
|
189
|
-
|
190
|
-
|
191
|
-
|
207
|
+
datum = @@metadata[0]
|
208
|
+
assert_equal 'foo0', datum.key
|
209
|
+
assert_equal 'bar0', datum.value
|
192
210
|
|
193
|
-
|
211
|
+
end
|
194
212
|
|
195
|
-
assert_equal 'bar0', metadata['foo0']
|
196
213
|
|
197
|
-
|
198
|
-
|
199
|
-
end
|
214
|
+
def test_004_update_some_server_metadata_items
|
200
215
|
|
201
|
-
|
216
|
+
metadata = {}
|
217
|
+
metadata['foo1'] = 'bar1'
|
218
|
+
metadata['foo2'] = 'bar2'
|
219
|
+
@conn.update_metadata('servers', @@server.id, metadata)
|
202
220
|
|
203
|
-
|
204
|
-
metadata.clear
|
205
|
-
metadata['foo1'] = 'bar1'
|
206
|
-
metadata['foo2'] = 'bar2'
|
207
|
-
assert metadata.update()
|
221
|
+
metadata = @conn.list_metadata('servers', @@server.id).body['metadata']
|
208
222
|
|
209
|
-
|
223
|
+
assert_equal 3, metadata.size
|
210
224
|
|
211
|
-
|
212
|
-
|
213
|
-
|
225
|
+
assert_equal 'bar0', metadata['foo0']
|
226
|
+
assert_equal 'bar1', metadata['foo1']
|
227
|
+
assert_equal 'bar2', metadata['foo2']
|
214
228
|
|
215
|
-
|
216
|
-
|
217
|
-
end
|
229
|
+
end
|
218
230
|
|
219
|
-
def test_005_set_server_metadata_items
|
220
231
|
|
221
|
-
|
222
|
-
metadata.clear
|
223
|
-
metadata['foo1'] = 'better'
|
224
|
-
metadata['foo2'] = 'watch'
|
225
|
-
metadata['foo3'] = 'out!'
|
226
|
-
assert metadata.save
|
232
|
+
def test_005_set_server_metadata_items
|
227
233
|
|
228
|
-
|
234
|
+
metadata = {}
|
235
|
+
metadata['foo1'] = 'better'
|
236
|
+
metadata['foo2'] = 'watch'
|
237
|
+
metadata['foo3'] = 'out!'
|
238
|
+
metadata['foo4'] = 'DELETE FROM instance_metadata;'
|
239
|
+
@conn.set_metadata('servers', @@server.id, metadata)
|
229
240
|
|
230
|
-
|
231
|
-
assert_equal 'watch', metadata['foo2']
|
232
|
-
assert_equal 'out!', metadata['foo3']
|
241
|
+
metadata = @conn.list_metadata('servers', @@server.id).body['metadata']
|
233
242
|
|
234
|
-
|
235
|
-
|
236
|
-
|
243
|
+
assert_equal 'better', metadata['foo1']
|
244
|
+
assert_equal 'watch', metadata['foo2']
|
245
|
+
assert_equal 'out!', metadata['foo3']
|
246
|
+
assert_equal 'DELETE FROM instance_metadata;', metadata['foo4']
|
237
247
|
|
238
|
-
|
248
|
+
assert_equal 4, metadata.size
|
249
|
+
|
250
|
+
end
|
239
251
|
|
240
|
-
|
241
|
-
assert metadata.clear!
|
252
|
+
def test_006_clear_server_metadata
|
242
253
|
|
243
|
-
|
254
|
+
metadata = {}
|
255
|
+
@conn.set_metadata('servers', @@server.id, metadata)
|
244
256
|
|
245
|
-
|
257
|
+
metadata = @conn.list_metadata('servers', @@server.id).body['metadata']
|
258
|
+
assert_equal 0, metadata.size
|
246
259
|
|
247
|
-
end
|
248
|
-
|
249
|
-
def test_020_create_image
|
250
|
-
|
251
|
-
#snapshot the image
|
252
|
-
image = create_image(@@server, :name => "torpedo", :metadata => {"key1" => "value1"})
|
253
|
-
assert_equal('SAVING', image.status)
|
254
|
-
assert_equal('torpedo', image.name)
|
255
|
-
assert_equal(25, image.progress)
|
256
|
-
#FIXME: server id should be a uuid string
|
257
|
-
assert_equal(@@server.id.to_s, image.server['id'])
|
258
|
-
assert_not_nil(image.created)
|
259
|
-
assert_not_nil(image.id)
|
260
|
-
assert_equal('value1', image.metadata['key1'])
|
261
|
-
|
262
|
-
begin
|
263
|
-
timeout(SERVER_BUILD_TIMEOUT) do
|
264
|
-
until image.status == 'ACTIVE' do
|
265
|
-
image = @conn.image(image.id)
|
266
|
-
sleep 1
|
267
|
-
end
|
268
260
|
end
|
269
|
-
rescue Timeout::Error => te
|
270
|
-
fail('Timeout creating image snapshot.')
|
271
|
-
end
|
272
261
|
|
273
|
-
sleep SLEEP_AFTER_IMAGE_CREATE
|
274
|
-
|
275
|
-
# Overwrite image_ref to make all subsequent tests use this snapshot
|
276
|
-
@@image_ref = image.id.to_s
|
277
|
-
|
278
|
-
end if TEST_CREATE_IMAGE
|
279
|
-
|
280
|
-
def test_030_rebuild
|
281
|
-
# NOTE: this will use the snapshot if TEST_CREATE_IMAGE is enabled
|
282
|
-
@@server.rebuild!(:adminPass => @@admin_pass, :imageRef => @@image_ref, :personality => get_personalities)
|
283
|
-
server = @conn.server(@@server.id)
|
284
|
-
sleep 15 # sleep a couple seconds until rebuild starts
|
285
|
-
check_server(server, @@image_ref, @@flavor_ref)
|
286
|
-
|
287
|
-
end if TEST_REBUILD_SERVER
|
288
|
-
|
289
|
-
def test_035_soft_reboot
|
290
|
-
# make sure our snapshot boots
|
291
|
-
@@server.reboot(type='SOFT')
|
292
|
-
server = @conn.server(@@server.id)
|
293
|
-
assert_equal('REBOOT', server.status)
|
294
|
-
check_server(server, @@image_ref, @@flavor_ref)
|
295
|
-
end if TEST_SOFT_REBOOT_SERVER
|
296
|
-
|
297
|
-
def test_036_hard_reboot
|
298
|
-
# make sure our snapshot boots
|
299
|
-
@@server.reboot(type='HARD')
|
300
|
-
server = @conn.server(@@server.id)
|
301
|
-
assert_equal('HARD_REBOOT', server.status)
|
302
|
-
check_server(server, @@image_ref, @@flavor_ref)
|
303
|
-
end if TEST_HARD_REBOOT_SERVER
|
304
|
-
|
305
|
-
def test_037_change_password
|
306
|
-
@@admin_pass = "AnGrYbIrD$"
|
307
|
-
@@server.change_password!(@@admin_pass)
|
308
|
-
server = @conn.server(@@server.id)
|
309
|
-
begin
|
310
|
-
timeout(60) do
|
311
|
-
until server.status == 'ACTIVE' do
|
312
|
-
server = @conn.server(server.id)
|
313
|
-
sleep 1
|
314
|
-
end
|
315
|
-
end
|
316
|
-
rescue Timeout::Error => te
|
317
|
-
fail('Timeout changing server password.')
|
318
|
-
end
|
319
|
-
check_server(server, @@image_ref, @@flavor_ref)
|
320
|
-
end if TEST_ADMIN_PASSWORD
|
321
262
|
|
322
|
-
|
263
|
+
def test_020_create_image
|
323
264
|
|
324
|
-
|
325
|
-
|
326
|
-
@@host_id = server.hostId #original host ID
|
265
|
+
#snapshot the image
|
266
|
+
image = create_image(@@server, "torpedo", {"key1" => "value1"})
|
327
267
|
|
328
|
-
|
329
|
-
|
330
|
-
|
268
|
+
assert_equal('SAVING', image.status)
|
269
|
+
assert_equal('torpedo', image.name)
|
270
|
+
assert_equal(25, image.progress)
|
271
|
+
#FIXME: server id should be a uuid string
|
272
|
+
assert_equal(@@server.id, image.server['id'])
|
273
|
+
assert_not_nil(image.created_at)
|
274
|
+
assert_not_nil(image.id)
|
275
|
+
assert_equal "value1", image.metadata.get('key1').value
|
331
276
|
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
277
|
+
begin
|
278
|
+
timeout(SERVER_BUILD_TIMEOUT) do
|
279
|
+
until image.status == 'ACTIVE' do
|
280
|
+
image = @conn.images.get(image.id)
|
281
|
+
sleep 1
|
282
|
+
end
|
337
283
|
end
|
338
|
-
|
339
|
-
|
284
|
+
rescue Timeout::Error => te
|
285
|
+
fail('Timeout creating image snapshot.')
|
340
286
|
end
|
341
|
-
end
|
342
|
-
rescue Timeout::Error => te
|
343
|
-
fail('Timeout resizing server.')
|
344
|
-
end
|
345
|
-
|
346
|
-
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
|
347
|
-
|
348
|
-
@@server.revert_resize!
|
349
|
-
server = @conn.server(@@server.id)
|
350
|
-
begin
|
351
|
-
timeout(60) do
|
352
|
-
until server.status == 'ACTIVE' do
|
353
|
-
server = @conn.server(server.id)
|
354
|
-
sleep 1
|
355
|
-
end
|
356
|
-
end
|
357
|
-
rescue Timeout::Error => te
|
358
|
-
fail('Timeout waiting for revert resize.')
|
359
|
-
end
|
360
287
|
|
361
|
-
|
362
|
-
|
288
|
+
sleep SLEEP_AFTER_IMAGE_CREATE
|
289
|
+
|
290
|
+
# Overwrite image_ref to make all subsequent tests use this snapshot
|
291
|
+
@@image_ref = image.id.to_s
|
363
292
|
|
364
|
-
|
293
|
+
end if TEST_CREATE_IMAGE
|
365
294
|
|
366
|
-
def test_041_resize
|
367
295
|
|
368
|
-
|
369
|
-
|
370
|
-
|
296
|
+
def test_030_rebuild
|
297
|
+
# NOTE: this will use the snapshot if TEST_CREATE_IMAGE is enabled
|
298
|
+
metadata={ "dr." => "evil", "big" => "boy" }
|
299
|
+
@conn.rebuild_server(@@server.id, @@image_ref, "torpedo", admin_pass=@@admin_pass, metadata=metadata, personality=get_personalities)
|
371
300
|
|
372
|
-
|
373
|
-
|
374
|
-
assert_equal('RESIZE', server.status)
|
301
|
+
server = @conn.servers.get(@@server.id)
|
302
|
+
assert_equal('REBUILD', server.state)
|
375
303
|
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
304
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
305
|
+
|
306
|
+
end if TEST_REBUILD_SERVER
|
307
|
+
|
308
|
+
def test_035_soft_reboot
|
309
|
+
# make sure our snapshot boots
|
310
|
+
@@server.reboot(type='SOFT')
|
311
|
+
server = @conn.servers.get(@@server.id)
|
312
|
+
assert_equal('REBOOT', server.state)
|
313
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
314
|
+
end if TEST_SOFT_REBOOT_SERVER
|
315
|
+
|
316
|
+
|
317
|
+
def test_036_hard_reboot
|
318
|
+
# make sure our snapshot boots
|
319
|
+
@@server.reboot(type='HARD')
|
320
|
+
server = @conn.servers.get(@@server.id)
|
321
|
+
assert_equal('HARD_REBOOT', server.state)
|
322
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
323
|
+
end if TEST_HARD_REBOOT_SERVER
|
324
|
+
|
325
|
+
def test_037_change_password
|
326
|
+
@@admin_pass = "AnGrYbIrD$"
|
327
|
+
@@server.change_password(@@admin_pass)
|
328
|
+
server = @conn.servers.get(@@server.id)
|
329
|
+
begin
|
330
|
+
timeout(60) do
|
331
|
+
until server.state == 'ACTIVE' do
|
332
|
+
server = @conn.servers.get(@@server.id)
|
333
|
+
sleep 1
|
334
|
+
end
|
381
335
|
end
|
382
|
-
|
383
|
-
|
336
|
+
rescue Timeout::Error => te
|
337
|
+
fail('Timeout changing server password.')
|
338
|
+
end
|
339
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
340
|
+
end if TEST_ADMIN_PASSWORD
|
341
|
+
|
342
|
+
def test_040_resize_revert
|
343
|
+
|
344
|
+
# before resizing obtain host_id
|
345
|
+
server = @conn.servers.get(@@server.id)
|
346
|
+
@@host_id = server.host_id #original host ID
|
347
|
+
|
348
|
+
@@server.resize(@@flavor_ref_resize)
|
349
|
+
server = @conn.servers.get(@@server.id)
|
350
|
+
assert_equal('RESIZE', server.state)
|
351
|
+
|
352
|
+
begin
|
353
|
+
timeout(SERVER_BUILD_TIMEOUT) do
|
354
|
+
until server.state == 'VERIFY_RESIZE' do
|
355
|
+
if server.state == "ERROR" then
|
356
|
+
fail('Server ERROR state detected when resizing server!')
|
357
|
+
end
|
358
|
+
server = @conn.servers.get(@@server.id)
|
359
|
+
sleep 1
|
360
|
+
end
|
361
|
+
end
|
362
|
+
rescue Timeout::Error => te
|
363
|
+
fail('Timeout resizing server.')
|
384
364
|
end
|
385
|
-
end
|
386
|
-
rescue Timeout::Error => te
|
387
|
-
fail('Timeout resizing server.')
|
388
|
-
end
|
389
365
|
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
366
|
+
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
|
367
|
+
|
368
|
+
@@server.revert_resize
|
369
|
+
server = @conn.servers.get(@@server.id)
|
370
|
+
begin
|
371
|
+
timeout(60) do
|
372
|
+
until server.state == 'ACTIVE' do
|
373
|
+
server = @conn.servers.get(@@server.id)
|
374
|
+
sleep 1
|
375
|
+
end
|
376
|
+
end
|
377
|
+
rescue Timeout::Error => te
|
378
|
+
fail('Timeout waiting for revert resize.')
|
379
|
+
end
|
394
380
|
|
395
|
-
|
381
|
+
check_server(server, @@image_ref, @@flavor_ref)
|
382
|
+
assert_equal(@@host_id, server.host_id)
|
396
383
|
|
397
|
-
|
398
|
-
server = @conn.server(@@server.id)
|
399
|
-
assert_equal('ACTIVE', server.status)
|
384
|
+
end if TEST_REVERT_RESIZE_SERVER
|
400
385
|
|
401
|
-
|
386
|
+
def test_041_resize
|
402
387
|
|
403
|
-
|
388
|
+
# before resizing obtain host_id
|
389
|
+
server = @conn.servers.get(@@server.id)
|
390
|
+
@@host_id = server.host_id #original host ID
|
404
391
|
|
405
|
-
|
392
|
+
@@server.resize(@@flavor_ref_resize)
|
393
|
+
server = @conn.servers.get(@@server.id)
|
394
|
+
assert_equal('RESIZE', server.state)
|
406
395
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
396
|
+
begin
|
397
|
+
timeout(SERVER_BUILD_TIMEOUT) do
|
398
|
+
until server.state == 'VERIFY_RESIZE' do
|
399
|
+
if server.state == "ERROR" then
|
400
|
+
fail('Server ERROR state detected when resizing server!')
|
401
|
+
end
|
402
|
+
server = @conn.servers.get(@@server.id)
|
403
|
+
sleep 1
|
404
|
+
end
|
405
|
+
end
|
406
|
+
rescue Timeout::Error => te
|
407
|
+
fail('Timeout resizing server.')
|
408
|
+
end
|
411
409
|
|
412
|
-
|
410
|
+
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
|
411
|
+
assert_not_equal(@@host_id, server.host_id) if TEST_HOSTID_ON_RESIZE
|
412
|
+
|
413
|
+
end if TEST_RESIZE_SERVER
|
414
|
+
|
415
|
+
def test_042_resize_confirm
|
413
416
|
|
414
|
-
|
417
|
+
@@server.confirm_resize
|
418
|
+
server = @conn.servers.get(@@server.id)
|
419
|
+
begin
|
420
|
+
timeout(60) do
|
421
|
+
until server.state == 'ACTIVE' do
|
422
|
+
server = @conn.servers.get(@@server.id)
|
423
|
+
sleep 1
|
424
|
+
end
|
425
|
+
end
|
426
|
+
rescue Timeout::Error => te
|
427
|
+
fail('Timeout waiting for ACTIVE state after resize confirm.')
|
428
|
+
end
|
415
429
|
|
416
|
-
|
430
|
+
check_server(server, @@image_ref, @@flavor_ref_resize)
|
417
431
|
|
418
|
-
|
432
|
+
end if TEST_RESIZE_SERVER
|
419
433
|
|
420
|
-
|
421
|
-
metadata['foo1'] = 'bar1'
|
422
|
-
assert metadata.update('foo1')
|
434
|
+
def test_051_delete_image_metadata_items
|
423
435
|
|
424
|
-
|
436
|
+
#refresh the metadata
|
437
|
+
metadata = Fog::Compute::OpenStack::Metadata.new({
|
438
|
+
:service => @conn,
|
439
|
+
:parent => @@images.last
|
440
|
+
})
|
425
441
|
|
426
|
-
|
442
|
+
metadata.each do |meta|
|
443
|
+
assert meta.destroy
|
444
|
+
end
|
427
445
|
|
428
|
-
|
446
|
+
#refresh the metadata
|
447
|
+
metadata = Fog::Compute::OpenStack::Metadata.new({
|
448
|
+
:service => @conn,
|
449
|
+
:parent => @@images.last
|
450
|
+
})
|
451
|
+
assert_equal 0, metadata.size
|
452
|
+
|
453
|
+
end if TEST_CREATE_IMAGE
|
454
|
+
|
455
|
+
def test_052_update_one_image_metadata_item
|
456
|
+
datum = Fog::Compute::OpenStack::Metadatum.new({
|
457
|
+
:service => @conn,
|
458
|
+
:parent => @@images.last
|
459
|
+
})
|
460
|
+
datum.key = 'foo0'
|
461
|
+
datum.value = 'bar0'
|
462
|
+
datum.save
|
463
|
+
|
464
|
+
#refresh the metadata
|
465
|
+
metadata = Fog::Compute::OpenStack::Metadata.new({
|
466
|
+
:service => @conn,
|
467
|
+
:parent => @@images.last
|
468
|
+
})
|
469
|
+
assert_equal 1, metadata.size
|
470
|
+
|
471
|
+
datum = metadata[0]
|
472
|
+
assert_equal 'foo0', datum.key
|
473
|
+
assert_equal 'bar0', datum.value
|
474
|
+
end if TEST_CREATE_IMAGE
|
475
|
+
|
476
|
+
def test_053_update_some_image_metadata_items
|
477
|
+
|
478
|
+
metadata = {}
|
479
|
+
metadata['foo0'] = 'barz'
|
480
|
+
metadata['foo1'] = 'bar1'
|
481
|
+
metadata['foo2'] = 'bar2'
|
482
|
+
@conn.update_metadata('images', @@images.last.id, metadata)
|
483
|
+
|
484
|
+
metadata = @conn.list_metadata('images', @@images.last.id).body['metadata']
|
485
|
+
|
486
|
+
assert_equal 3, metadata.size
|
487
|
+
|
488
|
+
assert_equal 'barz', metadata['foo0']
|
489
|
+
assert_equal 'bar1', metadata['foo1']
|
490
|
+
assert_equal 'bar2', metadata['foo2']
|
429
491
|
|
430
|
-
|
492
|
+
end if TEST_CREATE_IMAGE
|
431
493
|
|
432
|
-
|
494
|
+
def test_054_set_image_metadata_items
|
433
495
|
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
496
|
+
metadata = {}
|
497
|
+
metadata['foo1'] = 'that'
|
498
|
+
metadata['foo2'] = 'silly'
|
499
|
+
metadata['foo3'] = 'rabbit'
|
500
|
+
metadata['foo4'] = 'DELETE FROM images;'
|
501
|
+
@conn.set_metadata('images', @@images.last.id, metadata)
|
438
502
|
|
439
|
-
|
503
|
+
metadata = @conn.list_metadata('images', @@images.last.id).body['metadata']
|
440
504
|
|
441
|
-
|
442
|
-
|
505
|
+
assert_equal 'that', metadata['foo1']
|
506
|
+
assert_equal 'silly', metadata['foo2']
|
507
|
+
assert_equal 'rabbit', metadata['foo3']
|
508
|
+
assert_equal 'DELETE FROM images;', metadata['foo4']
|
443
509
|
|
444
|
-
|
510
|
+
assert_equal 4, metadata.size
|
445
511
|
|
446
|
-
|
512
|
+
end if TEST_CREATE_IMAGE
|
447
513
|
|
448
|
-
|
514
|
+
def test_055_clear_image_metadata
|
449
515
|
|
450
|
-
|
451
|
-
|
452
|
-
metadata['foo2'] = 'silly'
|
453
|
-
metadata['foo3'] = 'rabbit'
|
454
|
-
assert metadata.save
|
516
|
+
metadata = {}
|
517
|
+
@conn.set_metadata('images', @@images.last.id, metadata)
|
455
518
|
|
456
|
-
|
457
|
-
|
458
|
-
assert_equal 'that', metadata['foo1']
|
459
|
-
assert_equal 'silly', metadata['foo2']
|
460
|
-
assert_equal 'rabbit', metadata['foo3']
|
461
|
-
|
462
|
-
assert_equal 3, metadata.size
|
519
|
+
metadata = @conn.list_metadata('images', @@images.last.id).body['metadata']
|
520
|
+
assert_equal 0, metadata.size
|
463
521
|
|
464
|
-
|
522
|
+
end if TEST_CREATE_IMAGE
|
523
|
+
|
524
|
+
def test_060_attach_volume
|
525
|
+
volume = Torpedo::Volume::Volumes.volume
|
526
|
+
assert(@@server.attach_volume(volume.id, "/dev/vdb"))
|
527
|
+
|
528
|
+
begin
|
529
|
+
timeout(VOLUME_BUILD_TIMEOUT) do
|
530
|
+
until volume.status == 'in-use' do
|
531
|
+
if volume.status == "error" then
|
532
|
+
fail('ERROR status detected when attaching volume!')
|
533
|
+
end
|
534
|
+
volume = @volume_conn.volumes.get(volume.id)
|
535
|
+
sleep 1
|
536
|
+
end
|
537
|
+
end
|
538
|
+
rescue Timeout::Error => te
|
539
|
+
fail('Timeout attaching volume.')
|
540
|
+
end
|
465
541
|
|
466
|
-
|
542
|
+
end if VOLUME_ENABLED
|
467
543
|
|
468
|
-
|
469
|
-
assert metadata.clear!
|
544
|
+
def test_061_detach_volume
|
470
545
|
|
471
|
-
|
546
|
+
volume = Torpedo::Volume::Volumes.volume
|
547
|
+
assert(@@server.detach_volume(volume.id))
|
472
548
|
|
473
|
-
|
474
|
-
|
475
|
-
|
549
|
+
volume = @volume_conn.volumes.get(volume.id)
|
550
|
+
begin
|
551
|
+
timeout(VOLUME_BUILD_TIMEOUT) do
|
552
|
+
until volume.status == 'available' do
|
553
|
+
if volume.status == "error" then
|
554
|
+
fail('ERROR status detected when detaching volume!')
|
555
|
+
end
|
556
|
+
volume = @volume_conn.volumes.get(volume.id)
|
557
|
+
sleep 1
|
558
|
+
end
|
559
|
+
end
|
560
|
+
rescue Timeout::Error => te
|
561
|
+
fail('Timeout detaching volume.')
|
562
|
+
end
|
563
|
+
|
564
|
+
end if VOLUME_ENABLED
|
476
565
|
|
477
|
-
def test_999_teardown
|
478
|
-
if CLEAN_UP_SERVERS
|
479
|
-
@@servers.each do |server|
|
480
|
-
assert_equal(true, server.delete!)
|
481
|
-
end
|
482
|
-
end
|
483
|
-
if CLEAN_UP_IMAGES
|
484
|
-
@@images.each do |image|
|
485
|
-
assert_equal(true, image.delete!)
|
486
|
-
end
|
487
566
|
end
|
488
567
|
end
|
489
|
-
|
490
|
-
end
|
491
|
-
end
|
492
568
|
end
|