lib/torpedo/compute/servers.rb in torpedo-1.0.9 vs lib/torpedo/compute/servers.rb in torpedo-1.0.10
- old
+ new
@@ -1,7 +1,8 @@
require File.dirname(__FILE__) + '/helper'
require 'tempfile'
+require 'net/ssh'
module Torpedo
module Compute
class Servers < Test::Unit::TestCase
@@ -9,42 +10,68 @@
@@images = []
@@image_ref = Helper::get_image_ref(Helper::get_connection)
@@flavor_ref = Helper::get_flavor_ref(Helper::get_connection)
@@flavor_ref_resize = Helper::get_flavor_ref_resize(@conn)
@@server = nil #ref to last created server
+ @@hostname = "torpedo"
def setup
@conn=Helper::get_connection
end
def create_server(server_opts)
@@server = @conn.create_server(server_opts)
@@servers << @@server
+ @@admin_pass = @@server.adminPass #original admin_pass
+ @@host_id = @@server.hostId #original host ID
@@server
end
def create_image(server, image_opts)
image = server.create_image(image_opts)
@@images << image
@@image_ref = image.id
image
end
- def ssh_test(ip_addr)
+ def get_personalities
+ if TEST_ADMIN_PASSWORD then
+ tmp_file=Tempfile.new "server_tests"
+ tmp_file.write("yo")
+ tmp_file.flush
+ {tmp_file.path => "/tmp/foo/bar"}
+ else
+ # NOTE: if admin_pass is disabled we inject the public key so we still
+ # can still login. This would only matter if KEYPAIR was disabled as well.
+ {SSH_PUBLIC_KEY => "/root/.ssh/authorized_keys"}
+ end
+ end
+
+ def ssh_test(ip_addr, test_cmd="hostname", test_output=@@hostname, admin_pass=@@admin_pass)
+
+ ssh_opts = {}
+ if TEST_ADMIN_PASSWORD then
+ ssh_opts.store(:password, admin_pass)
+ else
+ ssh_identity=SSH_PRIVATE_KEY
+ if KEYPAIR and not KEYPAIR.empty? then
+ ssh_identity=KEYPAIR
+ end
+ ssh_opts.store(:keys, ssh_identity)
+ end
+
begin
Timeout::timeout(SSH_TIMEOUT) do
-
while(1) do
- ssh_identity=SSH_PRIVATE_KEY
- if KEYPAIR and not KEYPAIR.empty? then
- ssh_identity=KEYPAIR
+ begin
+ Net::SSH.start(ip_addr, 'root', ssh_opts) do |ssh|
+ return ssh.exec!(test_cmd) == test_output
+ end
+ rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::SSH::Exception
+ next
end
- if system("ssh -o StrictHostKeyChecking=no -i #{ssh_identity} root@#{ip_addr} /bin/true > /dev/null 2>&1") then
- return true
- end
end
-
end
rescue Timeout::Error => te
fail("Timeout trying to ssh to server: #{ip_addr}")
end
@@ -74,11 +101,11 @@
def check_server(server, image_ref, flavor_ref, check_status="ACTIVE")
assert_not_nil(server.hostId)
assert_equal(flavor_ref, server.flavor['id'])
assert_equal(image_ref.to_s, server.image['id'])
- assert_equal('test1', server.name)
+ assert_equal(@@hostname, server.name)
server = @conn.server(server.id)
begin
timeout(SERVER_BUILD_TIMEOUT) do
until server.status == check_status do
@@ -94,30 +121,31 @@
end
# lookup the first IPv4 address and use that for verification
v4_addresses = server.addresses[:public].reject {|addr| addr.version != 4}
ping_test(v4_addresses[0].address) if TEST_PING
- ssh_test(v4_addresses[0].address) if TEST_SSH
+ if TEST_SSH
+ if TEST_ADMIN_PASSWORD
+ ssh_test(v4_addresses[0].address, "cat /tmp/foo/bar", "yo")
+ else
+ ssh_test(v4_addresses[0].address)
+ end
+ end
server
end
def test_001_create_server
- # NOTE: When using AMI style images we rely on keypairs for SSH access.
-
- # NOTE: injecting two or more files doesn't work for now due to XenStore
- # limitations
- personalities={SSH_PUBLIC_KEY => "/root/.ssh/authorized_keys"}
metadata={ "key1" => "value1", "key2" => "value2" }
- options = {:name => "test1", :imageRef => @@image_ref, :flavorRef => @@flavor_ref, :personality => personalities, :metadata => metadata}
+ options = {:name => @@hostname, :imageRef => @@image_ref, :flavorRef => @@flavor_ref, :personality => get_personalities, :metadata => metadata}
if KEYNAME and not KEYNAME.empty? then
options[:key_name] = KEYNAME
end
server = create_server(options)
- assert_not_nil(@@server.adminPass)
+ assert_not_nil(server.adminPass)
#boot a server and check it
check_server(server, @@image_ref, @@flavor_ref)
assert_equal "value1", @@server.metadata['key1']
@@ -228,23 +256,54 @@
# Overwrite image_ref to make all subsequent tests use this snapshot
@@image_ref = image.id.to_s
end if TEST_CREATE_IMAGE
-
def test_030_rebuild
- # make sure our snapshot boots
- personalities={SSH_PUBLIC_KEY => "/root/.ssh/authorized_keys"}
- @@server.rebuild!(:imageRef => @@image_ref, :personality => personalities)
+ # NOTE: this will use the snapshot if TEST_CREATE_IMAGE is enabled
+ @@server.rebuild!(:adminPass => @@admin_pass, :imageRef => @@image_ref, :personality => get_personalities)
server = @conn.server(@@server.id)
sleep 15 # sleep a couple seconds until rebuild starts
check_server(server, @@image_ref, @@flavor_ref)
end if TEST_REBUILD_SERVER
- def test_040_resize
+ def test_035_soft_reboot
+ # make sure our snapshot boots
+ @@server.reboot(type='SOFT')
+ server = @conn.server(@@server.id)
+ assert_equal('REBOOT', server.status)
+ check_server(server, @@image_ref, @@flavor_ref)
+ end if TEST_SOFT_REBOOT_SERVER
+ def test_036_hard_reboot
+ # make sure our snapshot boots
+ @@server.reboot(type='HARD')
+ server = @conn.server(@@server.id)
+ assert_equal('HARD_REBOOT', server.status)
+ check_server(server, @@image_ref, @@flavor_ref)
+ end if TEST_HARD_REBOOT_SERVER
+
+ def test_037_change_password
+ @@admin_pass = "AnGrYbIrD$"
+ @@server.change_password!(@@admin_pass)
+ server = @conn.server(@@server.id)
+ begin
+ timeout(60) do
+ until server.status == 'ACTIVE' do
+ server = @conn.server(server.id)
+ sleep 1
+ end
+ end
+ rescue Timeout::Error => te
+ fail('Timeout changing server password.')
+ end
+ check_server(server, @@image_ref, @@flavor_ref)
+ end if TEST_ADMIN_PASSWORD
+
+ def test_040_resize_revert
+
@@server.resize!(@@flavor_ref_resize)
server = @conn.server(@@server.id)
assert_equal('RESIZE', server.status)
begin
@@ -261,12 +320,53 @@
fail('Timeout resizing server.')
end
check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
+ @@server.revert_resize!
+ server = @conn.server(@@server.id)
+ begin
+ timeout(60) do
+ until server.status == 'ACTIVE' do
+ server = @conn.server(server.id)
+ sleep 1
+ end
+ end
+ rescue Timeout::Error => te
+ fail('Timeout waiting for revert resize.')
+ end
+
+ check_server(server, @@image_ref, @@flavor_ref)
+ assert_equal(server.hostId, @@host_id)
+
+ end if TEST_REVERT_RESIZE_SERVER
+
+ def test_041_resize
+
+ @@server.resize!(@@flavor_ref_resize)
+ server = @conn.server(@@server.id)
+ assert_equal('RESIZE', server.status)
+
+ begin
+ timeout(SERVER_BUILD_TIMEOUT) do
+ until server.status == 'VERIFY_RESIZE' do
+ if server.status == "ERROR" then
+ fail('Server ERROR state detected when resizing server!')
+ end
+ server = @conn.server(server.id)
+ sleep 1
+ end
+ end
+ rescue Timeout::Error => te
+ fail('Timeout resizing server.')
+ end
+
+ check_server(server, @@image_ref, @@flavor_ref_resize, 'VERIFY_RESIZE')
+ assert_not_equal(server.hostId, @@host_id) if TEST_HOSTID_ON_RESIZE
+
end if TEST_RESIZE_SERVER
- def test_041_resize_confirm
+ def test_042_resize_confirm
@@server.confirm_resize!
server = @conn.server(@@server.id)
assert_equal('ACTIVE', server.status)