test/integration/vm/VM_Create_test.rb in azure-0.6.0 vs test/integration/vm/VM_Create_test.rb in azure-0.6.1

- old
+ new

@@ -1,235 +1,213 @@ -#------------------------------------------------------------------------- -# Copyright 2013 Microsoft Open Technologies, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -require "integration/test_helper" - -describe Azure::VirtualMachineManagementService do - subject { Azure::VirtualMachineManagementService.new } - let(:cloud_service) { Azure::CloudServiceManagementService.new } - let(:names) { VirtualMachineNameHelper.name } - let(:virtual_machine_name) { names.first } - let(:cloud_service_name) { names.last } - let(:storage_account_name) { StorageAccountName } - let(:username) { 'adminuser' } - let(:password) { 'Admin123' } - let(:certificate) { Fixtures["certificate.pem"] } - let(:private_key) { Fixtures["privatekey.key"] } - let(:params){ - { - :vm_name => virtual_machine_name, - :vm_user => username, - :image => LinuxImage.name, - :password => password, - :location => LinuxImageLocation - } - } - - let(:windows_params){ - { - :vm_name => virtual_machine_name, - :vm_user => username, - :image => WindowsImage.name, - :password => password, - :location => WindowsImageLocation - } - } - - let(:in_vnet_name) { 'integration-test-virtual-network' } - - let(:options){ - { - :storage_account_name => storage_account_name, - :virtual_network_name => in_vnet_name, - :subnet_name => 'Subnet-1' - } - } - - let(:default_options) { - { - :storage_account_name => storage_account_name, - :cloud_service_name => cloud_service_name - } - } - - let(:in_affinity_name) { 'test-affinity-group' } - let(:in_address_space) { ['172.16.0.0/12'] } - inputoptions = { - :subnet => [{ :name => 'Subnet-1', :ip_address => '172.16.0.0', :cidr => 12 }], - :dns => [{ :name => 'DNS', :ip_address => '1.2.3.4' }] - } - - before{ - Loggerx.expects(:puts).returns(nil).at_least(0) - - affinity_group_service = Azure::BaseManagementService.new - affinity_group_service.create_affinity_group(in_affinity_name, WindowsImageLocation, 'Label') rescue nil - - virtual_network_service = Azure::VirtualNetworkManagementService.new - virtual_network_service.set_network_configuration(in_vnet_name, in_affinity_name, in_address_space, inputoptions) - } - - describe "#deployment" do - - it "should set options hash with valid cloud_service_name, deployment_name, storage_account_name and virtual network" do - subject.create_virtual_machine(params, options) - cloud_name = options[:cloud_service_name] - virtual_machine = subject.get_virtual_machine(virtual_machine_name, cloud_name) - virtual_machine.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - virtual_machine.cloud_service_name.wont_be_nil - virtual_machine.vm_name.must_equal virtual_machine_name - virtual_machine.deployment_name.wont_be_nil - virtual_machine.deployment_name.must_equal virtual_machine.cloud_service_name - virtual_machine.os_type.must_equal 'Linux' - options[:storage_account_name].wont_be_nil - assert_match(/^#{params[:vm_name]+'-service'}*/, cloud_name) - virtual_machine.virtual_network_name.must_equal in_vnet_name - virtual_machine.virtual_network.must_be_kind_of Azure::VirtualNetworkManagement::VirtualNetwork - end - - it "should creates http and https enabled winrm virtual machine without certificate." do - default_options.merge!(:winrm_transport => ['https','http']) - subject.create_virtual_machine(windows_params, default_options) - result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) - result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - assert_equal(result.os_type, 'Windows',"Error in the OS type of VI created") - tcp_endpoints_names = [] - result.tcp_endpoints.each do |tcp_endpoint| - tcp_endpoints_names << tcp_endpoint["Name"] - end - tcp_endpoints_names.must_include "WinRm-Https" - tcp_endpoints_names.must_include "WinRm-Http" - sleep 30 - end - - it "should creates https enabled winrm virtual machine using certificate." do - default_options.merge!(:winrm_transport => ['https'], :private_key_file => private_key, :certificate_file => certificate) - subject.create_virtual_machine(windows_params, default_options) - result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) - result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - assert_equal(result.os_type, 'Windows',"Error in the OS type of VI created") - tcp_endpoints_names = [] - result.tcp_endpoints.each do |tcp_endpoint| - tcp_endpoints_names << tcp_endpoint["Name"] - end - tcp_endpoints_names.must_include "WinRm-Https" - end - - it "should creates windows virtual machine without winrm." do - default_options.merge!(:winrm_transport => ['none']) - subject.create_virtual_machine(windows_params, default_options) - result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) - result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - assert_equal(result.os_type, 'Windows',"Error in the OS type of VI created") - tcp_endpoints_names = [] - result.tcp_endpoints.each do |tcp_endpoint| - tcp_endpoints_names << tcp_endpoint["Name"] - end - assert (not tcp_endpoints_names.include? "WinRm-Https") - assert (not tcp_endpoints_names.include? "WinRm-Http") - end - - it "created linux virtual machine should be accessible using password and certificate" do - default_options.merge!(:private_key_file => private_key, :certificate_file => certificate) - subject.create_virtual_machine(params, default_options) - result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) - result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - assert_equal(result.os_type, 'Linux',"Error in the OS type of VI created") - end - - it "ssh should be accessible using certificate on different port and virtual machine size should be Medium" do - params.delete(:password) - default_options.merge!(:ssh_port => '2222', :vm_size => 'Medium', :private_key_file => private_key, :certificate_file => certificate) - subject.create_virtual_machine(params, default_options) - result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) - result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine - endpoints = {} - result.tcp_endpoints.each do |tcp_endpoint| - endpoints[tcp_endpoint["Name"]] = - { - "PublicPort" => tcp_endpoint["PublicPort"], - "LocalPort" => tcp_endpoint["LocalPort"] - } - end - endpoints.keys.must_include "SSH" - assert_equal(endpoints["SSH"]["PublicPort"], "2222") - assert_equal(endpoints["SSH"]["LocalPort"], "22") - assert_equal(result.role_size, 'Medium') - end - - it "throws Runtime error as port value is beyond or less than actual range" do - default_options.merge!(:tcp_endpoints => '80,166535:166535') - msg = subject.create_virtual_machine(params, default_options) - assert_match(/invalid. Allowed values are 'a number between 1 to 65535'./i, msg) - - default_options.merge!(:tcp_endpoints => '80,0:0') - msg = subject.create_virtual_machine(params, default_options) - assert_match(/invalid. Allowed values are 'a number between 1 to 65535'./i, msg) - - cloud_service.delete_cloud_service(cloud_service_name) - end - - it "throws error when multiple VMs created under same DNS" do - subject.create_virtual_machine(params, default_options) - msg = subject.create_virtual_machine(windows_params, default_options) - assert_match(/The specified deployment slot Production is occupied./i,msg) - end - - it "throws SystemExit error when vm_user not provided" do - params.delete(:vm_user) - msg = subject.create_virtual_machine(params) - assert_match(/You did not provide a valid 'vm_user' value./i, msg) - end - - it "throws Runtime error when image not provide" do - params.delete(:image) - msg = subject.create_virtual_machine(params) - assert_match(/The virtual machine image source is not valid/i, msg) - end - - it "error thrown when invalid storage account name is given" do - default_options.merge!(:storage_account_name=>'storageuse_91') - msg = subject.create_virtual_machine(params, default_options) - assert_match(/The name is not a valid storage account name./i, msg) - cloud_service.delete_cloud_service(cloud_service_name) - end - - it "error thrown when invalid cloud name is given" do - default_options.merge!(:cloud_service_name => 'cloud-server-test_91') - msg = subject.create_virtual_machine(params, default_options) - assert_match(/The hosted service name is invalid/i, msg) - end - - it "error thrown when invalid deployment name provided" do - default_options.merge!(:deployment_name => 'instance_B') - msg = subject.create_virtual_machine(params, default_options) - assert_match(/The deployment name is invalid/i, msg) - cloud_service.delete_cloud_service(cloud_service_name) - end - - it "error thrown when invalid Virtual Machine name for Windows OS provided" do - windows_params.merge!(:vm_name => "MSServerInstnce01") - msg = subject.create_virtual_machine(windows_params, default_options) - assert_match(/The computer name cannot be more than 15 characters long, be entirely numeric, or contain the following characters/i, msg) - cloud_service.delete_cloud_service(cloud_service_name) - end - - it "error thrown when blank password for Windows OS provided" do - windows_params.delete(:password) - msg = subject.create_virtual_machine(windows_params, default_options) - assert_match(/You did not provide a valid 'password' value./i, msg) - end - - end #deployment - -end +#------------------------------------------------------------------------- +# Copyright 2013 Microsoft Open Technologies, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +require 'integration/test_helper' + +describe Azure::VirtualMachineManagementService do + subject { Azure::VirtualMachineManagementService.new } + let(:cloud_service) { Azure::CloudServiceManagementService.new } + let(:names) { VirtualMachineNameHelper.name } + let(:virtual_machine_name) { names.first } + let(:cloud_service_name) { names.last } + let(:storage_account_name) { StorageAccountName } + let(:username) { 'adminuser' } + let(:password) { 'Admin123' } + let(:certificate) { Fixtures['certificate.pem'] } + let(:private_key) { Fixtures['privatekey.key'] } + + let(:params)do + { + vm_name: virtual_machine_name, + vm_user: username, + image: LinuxImage.name, + password: password, + location: LinuxImageLocation + } + end + + let(:windows_params)do + { + vm_name: virtual_machine_name, + vm_user: username, + image: WindowsImage.name, + password: password, + location: WindowsImageLocation + } + end + + let(:options)do + { + storage_account_name: storage_account_name, + cloud_service_name: cloud_service_name, + vm_size: 'Small' + } + end + + let(:default_options) do + { + storage_account_name: storage_account_name, + cloud_service_name: cloud_service_name + } + end + + + before do + Loggerx.expects(:puts).returns(nil).at_least(0) + + end + + describe '#deployment' do + + it 'should set options hash with valid cloud_service_name, deployment_name, storage_account_name and virtual network' do + cloud_name = options[:cloud_service_name] + options[:availability_set_name] = 'aval-set-test' + subject.create_virtual_machine(params, options, false) + virtual_machine = subject.get_virtual_machine(virtual_machine_name, cloud_name) + virtual_machine.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine + virtual_machine.cloud_service_name.wont_be_nil + virtual_machine.vm_name.must_equal virtual_machine_name + virtual_machine.deployment_name.wont_be_nil + virtual_machine.deployment_name.must_equal virtual_machine.cloud_service_name + virtual_machine.os_type.must_equal 'Linux' + virtual_machine.role_size.must_equal 'Small' + virtual_machine.availability_set_name.must_equal 'aval-set-test' + options[:storage_account_name].wont_be_nil + assert_match(/^#{params[:vm_name] + '-service'}*/, cloud_name) + # Test for add role + params[:vm_name] = 'test-add-role-vm' + options[:ssh_port] = 2222 + vm = subject.create_virtual_machine(params, options, true) + vm.cloud_service_name.must_equal cloud_name + vm.vm_name.must_equal params[:vm_name] + virtual_machine.deployment_name.wont_be_nil + virtual_machine.os_type.must_equal 'Linux' + end + + it 'should creates http and https enabled winrm virtual machine without certificate.' do + default_options.merge!(winrm_transport: %w(https http)) + subject.create_virtual_machine(windows_params, default_options) + result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) + result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine + assert_equal(result.os_type, 'Windows', 'Error in the OS type of VI created') + tcp_endpoints_names = [] + result.tcp_endpoints.each do |tcp_endpoint| + tcp_endpoints_names << tcp_endpoint['Name'] + end + tcp_endpoints_names.must_include 'WinRm-Https' + tcp_endpoints_names.must_include 'WinRm-Http' + sleep 30 + end + + it 'should creates https enabled winrm virtual machine using certificate.' do + default_options.merge!(winrm_transport: ['https'], private_key_file: private_key, certificate_file: certificate) + subject.create_virtual_machine(windows_params, default_options) + result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) + result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine + assert_equal(result.os_type, 'Windows', 'Error in the OS type of VI created') + tcp_endpoints_names = [] + result.tcp_endpoints.each do |tcp_endpoint| + tcp_endpoints_names << tcp_endpoint['Name'] + end + tcp_endpoints_names.must_include 'WinRm-Https' + end + + it 'should creates windows virtual machine without winrm.' do + default_options.merge!(winrm_transport: ['none']) + subject.create_virtual_machine(windows_params, default_options) + result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) + result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine + assert_equal(result.os_type, 'Windows', 'Error in the OS type of VI created') + tcp_endpoints_names = [] + result.tcp_endpoints.each do |tcp_endpoint| + tcp_endpoints_names << tcp_endpoint['Name'] + end + assert (!tcp_endpoints_names.include? 'WinRm-Https') + assert (!tcp_endpoints_names.include? 'WinRm-Http') + end + + it 'created linux virtual machine should be accessible using password and certificate' do + default_options.merge!(private_key_file: private_key, certificate_file: certificate) + subject.create_virtual_machine(params, default_options) + result = subject.get_virtual_machine(virtual_machine_name, cloud_service_name) + result.must_be_kind_of Azure::VirtualMachineManagement::VirtualMachine + assert_equal(result.os_type, 'Linux', 'Error in the OS type of VI created') + sleep 30 + end + + it 'throws Runtime error as port value is beyond or less than actual range' do + default_options.merge!(tcp_endpoints: '80,166535:166535') + msg = subject.create_virtual_machine(params, default_options) + assert_match(/invalid. Allowed values are 'a number between 1 to 65535'./i, msg) + + default_options.merge!(tcp_endpoints: '80,0:0') + msg = subject.create_virtual_machine(params, default_options) + assert_match(/invalid. Allowed values are 'a number between 1 to 65535'./i, msg) + + cloud_service.delete_cloud_service(cloud_service_name) + end + + it 'throws error when multiple VMs created under same DNS' do + subject.create_virtual_machine(params, default_options) + msg = subject.create_virtual_machine(windows_params, default_options) + assert_match(/The specified deployment slot Production is occupied./i, msg) + end + + it 'throws SystemExit error when vm_user not provided' do + params.delete(:vm_user) + msg = subject.create_virtual_machine(params) + assert_match(/You did not provide a valid 'vm_user' value./i, msg) + end + + it 'throws Runtime error when image not provide' do + params.delete(:image) + msg = subject.create_virtual_machine(params) + assert_match(/The virtual machine image source is not valid/i, msg) + end + + it 'error thrown when invalid storage account name is given' do + default_options.merge!(storage_account_name: 'storageuse_91') + msg = subject.create_virtual_machine(params, default_options) + assert_match(/The name is not a valid storage account name./i, msg) + cloud_service.delete_cloud_service(cloud_service_name) + end + + it 'error thrown when invalid cloud name is given' do + default_options.merge!(cloud_service_name: 'cloud-server-test_91') + msg = subject.create_virtual_machine(params, default_options) + assert_match(/The hosted service name is invalid/i, msg) + end + + it 'error thrown when invalid deployment name provided' do + default_options.merge!(deployment_name: 'instance_B') + msg = subject.create_virtual_machine(params, default_options) + assert_match(/The deployment name is invalid/i, msg) + cloud_service.delete_cloud_service(cloud_service_name) + end + + it 'error thrown when invalid Virtual Machine name for Windows OS provided' do + windows_params.merge!(vm_name: 'MSServerInstnce01') + msg = subject.create_virtual_machine(windows_params, default_options) + assert_match(/The computer name cannot be more than 15 characters long, be entirely numeric, or contain the following characters/i, msg) + cloud_service.delete_cloud_service(cloud_service_name) + end + + it 'error thrown when blank password for Windows OS provided' do + windows_params.delete(:password) + msg = subject.create_virtual_machine(windows_params, default_options) + assert_match(/You did not provide a valid 'password' value./i, msg) + end + + end # deployment + +end