torpedo 1.0.19 → 2.1.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/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
|