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)