tests for bootstrapping win (winrm/ssh) and linux (ssh) instances

This commit is contained in:
Mukta 2013-04-19 17:04:53 +05:30
Родитель 8df2d4e476
Коммит 8fda0f2b7b
1 изменённых файлов: 151 добавлений и 140 удалений

Просмотреть файл

@ -4,134 +4,42 @@
#
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
require File.expand_path(File.dirname(__FILE__) + '/query_azure_mock')
require 'chef/knife/bootstrap'
require 'chef/knife/bootstrap_windows_winrm'
require 'chef/knife/bootstrap_windows_ssh'
describe Chef::Knife::AzureServerCreate do
include QueryAzureMock
#include AzureSpecHelper
include AzureSpecHelper
before do
setup_query_azure_mock
before do
@server_instance = Chef::Knife::AzureServerCreate.new
{
:azure_subscription_id => 'azure_subscription_id',
:azure_mgmt_cert => 'AzureLinuxCert.pem',
:azure_host_name => 'preview.core.windows-int.net',
:role_name => 'role_name',
:role_name => 'vm01',
:service_location => 'service_location',
:source_image => 'source_image',
:role_size => 'role_size'
:role_size => 'role_size',
:hosted_service_name => 'service001',
:storage_account => 'ka001testeurope'
}.each do |key, value|
Chef::Config[:knife][key] = value
end
#@server_instance.connection = mock(Azure::Connection)
@server_def = {
:hosted_service_name => 'hosted_service_name',
:storage_account => 'storage_account',
:role_name => 'role_name',
:host_name => 'host_name',
:service_location => 'service_location',
:os_disk_name => 'os_disk_name',
:source_image => 'source_image',
:role_size => 'role_size',
:tcp_endpoints => 'tcp_endpoints',
:udp_endpoints => 'udp_endpoints',
:bootstrap_proto => 'winrm'
}
stub_query_azure_mock
@server_instance.stub(:tcp_test_ssh).and_return(true)
@server_instance.stub(:tcp_test_winrm).and_return(true)
@server_instance.initial_sleep_delay = 0
@server_instance.stub(:sleep).and_return(0)
@server_def.stub(:name).and_return('chef_node_name')
#@server_instance.ui.should_not_receive(:error)
@server_instance.stub(:puts)
@server_instance.stub(:print)
end
describe "compalsory parameter test:" do
describe "run:" do
before do
Chef::Config[:knife][:storage_account] = 'storage_account'
@server_instance.connection.deploys = mock()
@server_instance.connection.deploys.stub(:create).and_return(@server_def)
@server_instance.should_receive(:create_server_def).and_return(@server_def)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
end
it "creates azure instance for windows with winrm protocol and bootstraps it" do
Chef::Config[:knife][:bootstrap_protocol] = 'winrm'
@server_def.stub(:winrmipaddress).and_return('winrmipaddress')
@server_def.stub(:winrmport).and_return('winrmport')
@bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
Chef::Knife::BootstrapWindowsWinrm.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
end
it "creates azure instance for windows with ssh protocol and bootstraps it" do
Chef::Config[:knife][:bootstrap_protocol] = 'ssh'
@server_def.stub(:sshipaddress).and_return('sshpaddress')
@server_def.stub(:sshport).and_return('sshport')
@bootstrap = Chef::Knife::BootstrapWindowsSsh.new
Chef::Knife::BootstrapWindowsSsh.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
end
it "creates azure instance for linux with ssh protocol and bootstraps it" do
@server_def.stub(:sshipaddress).and_return('sshipaddress')
@server_def.stub(:sshport).and_return('sshport')
Chef::Config[:knife][:bootstrap_protocol] = 'ssh'
@bootstrap = Chef::Knife::Bootstrap.new
Chef::Knife::Bootstrap.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
end
end
describe "parameter testing:" do
before do
end
it "storage account" do
#If Storage Account is not specified, check if the geographic location has one to re-use
end
it "all server parameters are set correctly - for windows image" do
Chef::Config[:knife][:bootstrap_protocol] = 'winrm'
Chef::Config[:knife][:hosted_service_name] = 'hosted_service_name'
@server_instance.should_receive(:is_image_windows?).and_return(true)
Chef::Config[:knife][:winrm_password] = 'winrm_password'
@server_params = @server_instance.create_server_def
@server_params[:os_type].should == 'Windows'
@server_params[:admin_password].should == 'winrm_password'
@server_params[:bootstrap_proto].should == 'winrm'
@server_params[:hosted_service_name].should == 'hosted_service_name'
end
it "all server parameters are set correctly - for linux image" do
@server_instance.should_receive(:is_image_windows?).and_return(false)
Chef::Config[:knife][:ssh_password] = 'ssh_password'
Chef::Config[:knife][:ssh_user] = 'ssh_user'
Chef::Config[:knife][:hosted_service_name] = 'hosted_service_name'
@server_params = @server_instance.create_server_def
@server_params[:os_type].should == 'Linux'
@server_params[:ssh_password].should == 'ssh_password'
@server_params[:ssh_user].should == 'ssh_user'
@server_params[:bootstrap_proto].should == 'ssh'
@server_params[:hosted_service_name].should == 'hosted_service_name'
end
context "compalsory parameters for windows image -" do
before do
end
it "azure_subscription_id" do
Chef::Config[:knife].delete(:azure_subscription_id)
@server_instance.ui.should_receive(:error)
@ -167,54 +75,157 @@ describe "parameter testing:" do
@server_instance.ui.should_receive(:error)
expect {@server_instance.run}.to raise_error
end
it "setting hosted_service_name correctly from role_name" do
Chef::Config[:knife].delete(:hosted_service_name)
@server_instance.connection.deploys = mock()
@server_instance.connection.deploys.stub(:create).and_return(@server_def)
@server_instance.should_receive(:create_server_def).and_return(@server_def)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
Chef::Config[:knife][:storage_account] = 'storage_account'
@server_def.stub(:winrmipaddress).and_return('winrmipaddress')
@server_def.stub(:winrmport).and_return('winrmport')
end
describe "for bootstrap protocol winrm:" do
before do
Chef::Config[:knife][:bootstrap_protocol] = 'winrm'
Chef::Config[:knife][:winrm_password] = 'winrm_password'
end
it "check if all params are set correctly" do
@server_instance.should_receive(:is_image_windows?).and_return(true)
@server_params = @server_instance.create_server_def
@server_params[:os_type].should == 'Windows'
@server_params[:admin_password].should == 'winrm_password'
@server_params[:bootstrap_proto].should == 'winrm'
@server_params[:hosted_service_name].should == 'service001'
end
context "bootstrap node" do
before do
@bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
Chef::Knife::BootstrapWindowsWinrm.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
@server_instance.config[:hosted_service_name].should match(/\Arolename/)
Chef::Knife::BootstrapWindowsWinrm.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
end
it "setting storage_account correctly 1" do
Chef::Config[:knife].delete(:storage_account)
@server_instance.connection.deploys = mock()
@server_instance.connection.deploys.stub(:create).and_return(@server_def)
@server_instance.connection.storageaccounts = mock()
@server_instance.connection.storageaccounts.stub(:all).and_return(['service_storage_account'])
@server_instance.should_receive(:create_server_def).and_return(@server_def)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
@server_def.stub(:winrmipaddress).and_return('winrmipaddress')
@server_def.stub(:winrmport).and_return('winrmport')
@bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
Chef::Knife::BootstrapWindowsWinrm.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
it "sets param <hosted_service_name> from role_name" do
Chef::Config[:knife].delete(:hosted_service_name)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
@server_instance.run
@server_instance.config[:storage_account].should match(/\Arolename/)
@server_instance.config[:hosted_service_name].should match(/\Avm01/)
end
it "setting storage_account correctly 2" do
it "sets param <storage_account> from role_name" do
Chef::Config[:knife].delete(:storage_account)
@server_instance.connection.deploys = mock()
@server_instance.connection.deploys.stub(:create).and_return(@server_def)
@server_instance.should_receive(:create_server_def).and_return(@server_def)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
Chef::Config[:knife][:storage_account] = 'storage_account'
@server_def.stub(:winrmipaddress).and_return('winrmipaddress')
@server_def.stub(:winrmport).and_return('winrmport')
@bootstrap = Chef::Knife::BootstrapWindowsWinrm.new
Chef::Knife::BootstrapWindowsWinrm.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
#@server_instance.config[:storage_account].should match(/\Arolename/)
@server_instance.config[:storage_account].should match(/\Avm01/)
end
it "sets param <storage_account> from storage name" do
Chef::Config[:knife].delete(:storage_account)
@server_instance.should_receive(:is_image_windows?).at_least(:twice).and_return(true)
Chef::Config[:knife][:service_location] = 'service-location'
@server_instance.run
@server_instance.config[:storage_account].should match(/storage-service-name/)
end
it "successful bootstrap of windows instance" do
@server_instance.should_receive(:is_image_windows?).exactly(3).times.and_return(true)
@server_instance.run
end
end
end
describe "for bootstrap protocol ssh:" do
before do
Chef::Config[:knife][:bootstrap_protocol] = 'ssh'
end
context "windows instance:" do
it "successful bootstrap" do
@server_instance.should_receive(:is_image_windows?).exactly(3).times.and_return(true)
@bootstrap = Chef::Knife::BootstrapWindowsSsh.new
Chef::Knife::BootstrapWindowsSsh.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
end
end
context "linux instance" do
before do
Chef::Config[:knife][:ssh_password] = 'ssh_password'
Chef::Config[:knife][:ssh_user] = 'ssh_user'
end
it "check if all params are set correctly" do
@server_instance.should_receive(:is_image_windows?).and_return(false)
@server_params = @server_instance.create_server_def
@server_params[:os_type].should == 'Linux'
@server_params[:ssh_password].should == 'ssh_password'
@server_params[:ssh_user].should == 'ssh_user'
@server_params[:bootstrap_proto].should == 'ssh'
@server_params[:hosted_service_name].should == 'service001'
end
it "successful bootstrap" do
@server_instance.should_receive(:is_image_windows?).exactly(3).times.and_return(false)
@bootstrap = Chef::Knife::Bootstrap.new
Chef::Knife::Bootstrap.stub(:new).and_return(@bootstrap)
@bootstrap.should_receive(:run)
@server_instance.run
end
end
end
def stub_query_azure_mock
@server_instance.connection.stub(:query_azure) do |name, verb, body|
Chef::Log.info 'calling web service:' + name
if verb == 'get' || verb == nil
retval = ''
if name == 'images'
retval = Nokogiri::XML readFile('list_images.xml')
elsif name == 'disks'
retval = Nokogiri::XML readFile('list_disks.xml')
elsif name == 'hostedservices'
retval = Nokogiri::XML readFile('list_hosts.xml')
elsif name == 'hostedservices/service001/deploymentslots/Production'
retval = Nokogiri::XML readFile('list_deployments_for_service001.xml')
elsif name == 'hostedservices/service002/deploymentslots/Production'
retval = Nokogiri::XML readFile('list_deployments_for_service002.xml')
elsif name == 'hostedservices/service003/deploymentslots/Production'
retval = Nokogiri::XML readFile('list_deployments_for_service003.xml')
elsif name == 'storageservices'
retval = Nokogiri::XML readFile('list_storageaccounts.xml')
else
Chef::Log.warn 'unknown get value:' + name
end
@getname = name
@getverb = verb
@getbody = body
elsif verb == 'post'
if name == 'hostedservices'
retval = Nokogiri::XML readFile('post_success.xml')
@receivedXML = body
elsif name == 'hostedservices/unknown_yet/deployments'
retval = Nokogiri::XML readFile('post_success.xml')
@receivedXML = body
elsif name == 'hostedservices/service001/deployments/deployment001/roles'
retval = Nokogiri::XML readFile('post_success.xml')
@receivedXML = body
elsif name =~ /hostedservices\/vm01.*\/deployments/
retval = Nokogiri::XML readFile('post_success.xml')
@receivedXML = body
else
Chef::Log.warn 'unknown post value:' + name
end
@postname = name
@postverb = verb
@postbody = body
elsif verb == 'delete'
@deletename = name
@deleteverb = verb
@deletebody = body
@deletecount += 1
else
Chef::Log.warn 'unknown verb:' + verb
end
retval
end
end
end