Общие сведения

ВступлениеПодготовка к запускуАрхитектура платформы TestoПорядок запускаПолитика запуска тестов

Обучающие материалы по Testo для Hyper-V

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Доступ в Интернет из виртуальной машиныЧасть 4. Гостевые дополненияЧасть 5. ПараметрыЧасть 6. КешированиеЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. Циклы

Обучающие материалы по Testo для QEMU

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Гостевые дополненияЧасть 4. ПараметрыЧасть 5. КешированиеЧасть 6. Доступ в Интернет из виртуальной машиныЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. ЦиклыЧасть 16. Макросы с объявлениями

Спецификация языка

Общая структура скриптовых файловБазовые конструкции языкаOбъявление виртуальной машиныОбъявление виртуального флеш-накопителяОбъявление виртуальной сетиПараметрыОбъявление тестовМакросыДействия с виртуальными машинамиДействия с мышкойПоиск изображений на экранеДействия с виртуальными флеш-накопителямиУсловияЦиклыСписок идентификаторов клавиш

Запросы на языке Javascript

Общая концепция построения JS-селекторовВстроенные глобальные функции JavascriptИсключенияКласс TextTensorКласс ImgTensorКласс Point

Часть 7. Связываем две машины по сети

С чем Вы познакомитесь

В этой части вы:

  1. Познакомитесь с управлением несколькими виртуальными машинами в одном тесте.
  2. Узнаете еще несколько атрибутов сетевых адаптеров в объявлении виртуальных машин.
  3. Завершите ознакомление с виртуальными сетями.

Начальные условия

  1. Платформа Testo установлена.
  2. Гипервизор Hyper-V установлен.
  3. Имеется установочный образ Ubuntu server 16.04 с расположением C:\iso\ubuntu_server.iso. Местоположение и название установочного файла может быть другим, в этом случае нужно будет соответствующим образом поправить параметр ISO_DIR, передаваемый через командную строку во время запуска тестов.
  4. Имеется образ с гостевыми дополнениями Testo для Hyper-V в одной папке с установочным образом Ubuntu.
  5. Хост имеет доступ в Интернет.
  6. (Рекомендовано) Настроена подсветка синтаксиса Testo-lang в Sublime Text 3.
  7. (Рекомендовано) Проделаны шаги из шестой части.

Вступление

В третьей части мы познакомились с одним из возможных применений виртуальных сетей - получение доступа в Интернет. Но, конечно же, виртуальные сети также можно (и нужно) применять для соединения нескольких виртуальных машин между собой. Именно этим мы и займёмся в этом уроке и попутно познакомимся с несколькими небольшими уловками, чтобы сделать тесты более удобными и читаемыми.

В конце этого урока мы сможем воспроизвести такой стенд.

С чего начать

С этого момента в наших тестовых сценариях появятся две виртуальных машины, которые будут условно играть роль клиента и сервера. Для того, чтобы наши тестовые сценарии остались читаемыми, нам нужно провести небольшой рефакторинг:

  1. Переименовать машину my_ubuntu в server;
  2. Переименовать параметры hostname, login, password в server_hostname, server_login и default_password соответственно и подправить все места, где к ним происходит обращение;
  3. Переименовать тесты ubuntu_installation, ubuntu_prepare и ubuntu_install_guest_additions в server_install_ubuntu, server_prepare и server_install_guest_additions соответственно;
  4. Удалить тест ubuntu_guest_additions_demo.

В итоге должен получиться такой скрипт:


network internet {
	mode: "nat"
}

machine server {
	cpus: 1
	ram: 512Mb
	disk main: {
		size: 5Gb
	}
	iso: "${ISO_DIR}\ubuntu_server.iso"

	nic nat: {
		attached_to: "internet"
	}
}

param server_hostname "server"
param server_login "server-login"
param default_password "1111"

test server_install_ubuntu {
	server {
		start
		# The actions can be separated with a newline
		# or a semicolon
		wait "Install Ubuntu Server"; press Enter;
		wait "Choose the language";	press Enter
		wait "Select your location"; press Enter
		wait "Detect keyboard layout?";	press Enter
		wait "Country of origin for the keyboard"; press Enter
		wait "Keyboard layout"; press Enter
		#wait "No network interfaces detected" timeout 5m; press Enter
		wait "Hostname:" timeout 5m; press Backspace*36; type "${server_hostname}"; press Enter
		wait "Full name for the new user"; type "${server_login}"; press Enter
		wait "Username for your account"; press Enter
		wait "Choose a password for the new user"; type "${default_password}"; press Enter
		wait "Re-enter password to verify"; type "${default_password}"; press Enter
		wait "Use weak password?"; press Left, Enter
		wait "Encrypt your home directory?"; press Enter

		wait "Is this time zone correct?" timeout 2m; press Enter
		wait "Partitioning method"; press Enter
		wait "Select disk to partition"; press Enter
		wait "Write the changes to disks and configure LVM?"; press Left, Enter
		wait "Amount of volume group to use for guided partitioning"; press Enter
		wait "Force UEFI installation?"; press Left, Enter
		wait "Write the changes to disks?"; press Left, Enter
		wait "HTTP proxy information" timeout 3m; press Enter
		wait "How do you want to manage upgrades" timeout 6m; press Enter
		wait "Choose software to install"; press Enter
		wait "Installation complete" timeout 30m;

		unplug dvd; press Enter
		wait "login:" timeout 2m; type "${server_login}"; press Enter
		wait "Password:"; type "${default_password}"; press Enter
		wait "Welcome to Ubuntu"
	}
}

test server_prepare: server_install_ubuntu {
	server {
		# Enter sudo mode
		type "sudo su"; press Enter
		wait "password for ${server_login}"; type "${default_password}"; press Enter
		wait "root@${server_hostname}"

		# Reset the eth0 NIC to prevent any issues with it after the rollback
		type "dhclient -r eth0 && dhclient eth0 && echo Result is $?"; press Enter

		# Check that apt is OK
		type "clear && apt update && echo Result is $?"; press Enter
		wait "Result is 0"

		# Install linux-azure package
		type "clear && apt install -y linux-azure && echo Result is $?"; press Enter
		wait "Result is 0" timeout 15m		

		# Reboot and login
		type "reboot"; press Enter

		wait "login:" timeout 2m; type "${server_login}"; press Enter
		wait "Password:"; type "${default_password}"; press Enter
		wait "Welcome to Ubuntu"

		# Enter sudo once more
		type "sudo su"; press Enter;
		wait "password for ${server_login}"; type "${default_password}"; press Enter
		wait "root@${server_hostname}"

		# Load the hv_sock module
		type "clear && modprobe hv_sock && echo Result is $?"; press Enter;
		wait "Result is 0"

		type "clear && lsmod | grep hv"; press Enter
		wait "hv_sock"
	}
}

param guest_additions_pkg "testo-guest-additions.deb"

test server_install_guest_additions: server_prepare {
	server {
		plug dvd "${ISO_DIR}\testo-guest-additions-hyperv.iso"

		type "mount /dev/cdrom /media"; press Enter
		wait "mounting read-only"
		type "clear && dpkg -i /media/${guest_additions_pkg} && echo Result is $?"; press Enter;
		wait "Result is 0"
		type "clear && umount /media && echo Result is $?"; press Enter;
		wait "Result is 0"
		sleep 2s
		unplug dvd
	}
}

Т.к. мы переименовали виртуальную машину в server, то для Testo эта машина выглядит как абсолютно новая сущность, и в итоге весь тестовый процесс будет пройден заново, в том числе и создание виртуальной машины.

При этом старая виртуальная машина, my_ubuntu, никуда сама по себе не денется. Платформа Testo будет считать, что эта машина еще может вам когда-нибудь пригодиться и удалять её не нужно. Но т.к. мы понимаем, что нам эта машина больше не нужна, давайте мы ее сами удалим.

C:\Users\Testo> testo clean
Testo is about to erase the following entities:
Virtual networks:
- internet
Virtual machines:
- my_ubuntu

Do you confirm erasing these entities? [y/N]: y
Deleted network internet
Deleted virtual machine my_ubuntu
C:\Users\Testo>

Можно заметить, что помимо виртуальной машины была также удалена виртуальная сеть internet, которой мы пользовались.

Теперь, прежде, чем продолжать что-то изменять, хорошо было бы убедиться, что мы своими изменениями ничего не сломали.

C:\Users\Testo> testo run ping.testo --stop_on_fail --param ISO_DIR C:\iso
TESTS TO RUN:
server_install_ubuntu
server_prepare
server_install_guest_additions
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Restoring snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Starting virtual machine server
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine server
[ 0%] Pressing key BACKSPACE 36 times in virtual machine server
[ 0%] Typing "server" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Full name for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Username for your account" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose a password for the new user" for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Re-enter password to verify" for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Use weak password?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Encrypt your home directory?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Is this time zone correct?" for 2m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Partitioning method" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select disk to partition" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Write the changes to disks and configure LVM?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Amount of volume group to use for guided partitioning" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Force UEFI installation?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Write the changes to disks?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key LEFT in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "HTTP proxy information" for 3m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "How do you want to manage upgrades" for 6m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose software to install" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Installation complete" for 30m with interval 1s in virtual machine server
[ 0%] Unplugging dvd from virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "login:" for 2m with interval 1s in virtual machine server
[ 0%] Typing "server-login" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Password:" for 1m with interval 1s in virtual machine server
[ 0%] Typing "1111" with interval 30ms in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine server
[ 0%] Taking snapshot server_install_ubuntu for virtual machine server
[ 33%] Test server_install_ubuntu PASSED in 0h:7m:6s
[ 33%] Preparing the environment for test server_prepare
[ 33%] Running test server_prepare
[ 33%] Typing "sudo su" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "password for server-login" for 1m with interval 1s in virtual machine server
[ 33%] Typing "1111" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "root@server" for 1m with interval 1s in virtual machine server
[ 33%] Typing "dhclient -r eth0 && dhclient eth0 && echo Result is $?" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Typing "clear && apt update && echo Result is $?" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "Result is 0" for 1m with interval 1s in virtual machine server
[ 33%] Typing "clear && apt install -y linux-azure && echo Result is $?" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "Result is 0" for 15m with interval 1s in virtual machine server
[ 33%] Typing "reboot" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "login:" for 2m with interval 1s in virtual machine server
[ 33%] Typing "server-login" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "Password:" for 1m with interval 1s in virtual machine server
[ 33%] Typing "1111" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "Welcome to Ubuntu" for 1m with interval 1s in virtual machine server
[ 33%] Typing "sudo su" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "password for server-login" for 1m with interval 1s in virtual machine server
[ 33%] Typing "1111" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "root@server" for 1m with interval 1s in virtual machine server
[ 33%] Typing "clear && modprobe hv_sock && echo Result is $?" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "Result is 0" for 1m with interval 1s in virtual machine server
[ 33%] Typing "clear && lsmod | grep hv" with interval 30ms in virtual machine server
[ 33%] Pressing key ENTER in virtual machine server
[ 33%] Waiting "hv_sock" for 1m with interval 1s in virtual machine server
[ 33%] Taking snapshot server_prepare for virtual machine server
[ 67%] Test server_prepare PASSED in 0h:5m:45s
[ 67%] Preparing the environment for test server_install_guest_additions
[ 67%] Running test server_install_guest_additions
[ 67%] Plugging dvd C:/iso/testo-guest-additions-hyperv.iso into virtual machine server
[ 67%] Typing "mount /dev/cdrom /media" with interval 30ms in virtual machine server
[ 67%] Pressing key ENTER in virtual machine server
[ 67%] Waiting "mounting read-only" for 1m with interval 1s in virtual machine server
[ 67%] Typing "clear && dpkg -i /media/testo-guest-additions.deb && echo Result is $?" with interval 30ms in virtual machine server
[ 67%] Pressing key ENTER in virtual machine server
[ 67%] Waiting "Result is 0" for 1m with interval 1s in virtual machine server
[ 67%] Typing "clear && umount /media && echo Result is $?" with interval 30ms in virtual machine server
[ 67%] Pressing key ENTER in virtual machine server
[ 67%] Waiting "Result is 0" for 1m with interval 1s in virtual machine server
[ 67%] Sleeping in virtual machine server for 2s
[ 67%] Unplugging dvd from virtual machine server
[ 67%] Taking snapshot server_install_guest_additions for virtual machine server
[100%] Test server_install_guest_additions PASSED in 0h:0m:15s
PROCESSED TOTAL 3 TESTS IN 0h:13m:7s
UP-TO-DATE: 0
RUN SUCCESSFULLY: 3
FAILED: 0
C:\Users\Testo>

Создаём вторую машину

Пришло время создать вторую виртуальную машину. Как вы уже догадались, называться она будет client и будет, по большей части, копией машины server

machine client {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}\\ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }
}

Но если мы оставим виртуальные машины в таком виде, они не будут связаны между собой. Для того, чтобы добавить между ними связность, нам необходимо объявить новую виртуальную сеть

network LAN {
    mode: "internal"
}

Обратите внимание, что эта сеть работает уже в режиме internal, то есть предназначена для внутреннего взаимодействия между машинами, без доступа во внешнюю среду.

Осталось нам лишь добавить в виртуальные машины сетевые адаптеры, которые будут подлючаться к новой сети LAN:

machine client {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}\\ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }

    nic server_side: {
        attached_to: "LAN"
        mac: "52:54:00:00:00:AA"
    }
}

machine server {
    cpus: 1
    ram: 512Mb
    disk main: {
        size: 5Gb
    }
    iso: "${ISO_DIR}\\ubuntu_server.iso"

    nic nat: {
        attached_to: "internet"
    }

    nic client_side: {
        attached_to: "LAN"
        mac: "52:54:00:00:00:BB"
    }
}

Обратите внимание, что для "внутренних" сетевых адаптеров мы указали еще атрибут mac. Указание точного MAC-адреса позволит нам чуть позже переименовать сетевые интерфейсы так, чтобы в них можно было легко ориентироваться внутри тестовых сценариев.

Что ж, добавим три новых теста уже для машины client: client_install_ubuntu, client_prepare и client_install_guest_additions. Не забудем также добавить несколько новых параметров.

param client_hostname "client"
param client_login "client-login"

test client_install_ubuntu {
    client {
        start
        # The actions can be separated with a newline
        # or a semicolon
        wait "Install Ubuntu Server"; press Enter;
        wait "Choose the language"; press Enter
        wait "Select your location"; press Enter
        wait "Detect keyboard layout?"; press Enter
        wait "Country of origin for the keyboard"; press Enter
        wait "Keyboard layout"; press Enter
        #wait "No network interfaces detected" timeout 5m; press Enter
        wait "Hostname:" timeout 5m; press Backspace*36; type "${client_hostname}"; press Enter
        wait "Full name for the new user"; type "${client_login}"; press Enter
        wait "Username for your account"; press Enter
        wait "Choose a password for the new user"; type "${default_password}"; press Enter
        wait "Re-enter password to verify"; type "${default_password}"; press Enter
        wait "Use weak password?"; press Left, Enter
        wait "Encrypt your home directory?"; press Enter

        wait "Is this time zone correct?" timeout 2m; press Enter
        wait "Partitioning method"; press Enter
        wait "Select disk to partition"; press Enter
        wait "Write the changes to disks and configure LVM?"; press Left, Enter
        wait "Amount of volume group to use for guided partitioning"; press Enter
        wait "Force UEFI installation?"; press Left, Enter
        wait "Write the changes to disks?"; press Left, Enter
        wait "HTTP proxy information" timeout 3m; press Enter
        wait "How do you want to manage upgrades" timeout 6m; press Enter
        wait "Choose software to install"; press Enter
        wait "Installation complete" timeout 30m;

        unplug dvd; press Enter
        wait "login:" timeout 2m; type "${client_login}"; press Enter
        wait "Password:"; type "${default_password}"; press Enter
        wait "Welcome to Ubuntu"
    }
}

test client_prepare: client_install_ubuntu {
    client {
        # Enter sudo mode
        type "sudo su"; press Enter
        wait "password for ${client_login}"; type "${default_password}"; press Enter
        wait "root@${client_hostname}"

        # Reset the eth0 NIC to prevent any issues with it after the rollback
        type "dhclient -r eth0 && dhclient eth0 && echo Result is $?"; press Enter

        # Check that apt is OK
        type "clear && apt update && echo Result is $?"; press Enter
        wait "Result is 0"

        # Install linux-azure package
        type "clear && apt install -y linux-azure && echo Result is $?"; press Enter
        wait "Result is 0" timeout 15m      

        # Reboot and login
        type "reboot"; press Enter

        wait "login:" timeout 2m; type "${client_login}"; press Enter
        wait "Password:"; type "${default_password}"; press Enter
        wait "Welcome to Ubuntu"

        # Enter sudo once more
        type "sudo su"; press Enter;
        wait "password for ${client_login}"; type "${default_password}"; press Enter
        wait "root@${client_hostname}"

        # Load the hv_sock module
        type "clear && modprobe hv_sock && echo Result is $?"; press Enter;
        wait "Result is 0"

        type "clear && lsmod | grep hv"; press Enter
        wait "hv_sock"
    }
}

test client_install_guest_additions: client_prepare {
    client {
        plug dvd "${ISO_DIR}\\testo-guest-additions-hyperv.iso"

        type "mount /dev/cdrom /media"; press Enter
        wait "mounting read-only"
        type "clear && dpkg -i /media/${guest_additions_pkg} && echo Result is $?"; press Enter;
        wait "Result is 0"
        type "clear && umount /media && echo Result is $?"; press Enter;
        wait "Result is 0"
        sleep 2s
        unplug dvd
    }
}

Не стоит пока пугаться большого количества дублирующегося кода. В будущем мы познакомимся со способом объединять одинаковые действия в именованные блоки (макросы), и эти сценарии станут намного компактнее.

Теперь попробуем запустить все наши тестовые сценарии.

C:\Users\Testo> testo run ping.testo --stop_on_fail --param ISO_DIR C:\iso
Because of the cache loss, Testo is scheduled to run the following tests:
- server_install_ubuntu
- server_prepare
- server_install_guest_additions
Do you confirm running them? [y/N]: y
TESTS TO RUN:
server_install_ubuntu
server_prepare
server_install_guest_additions
client_install_ubuntu
client_prepare
client_install_guest_additions
[ 0%] Preparing the environment for test server_install_ubuntu
[ 0%] Creating virtual machine server
[ 0%] Taking snapshot initial for virtual machine server
[ 0%] Running test server_install_ubuntu
[ 0%] Starting virtual machine server
[ 0%] Waiting "Install Ubuntu Server" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Choose the language" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Select your location" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Detect keyboard layout?" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Country of origin for the keyboard" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Keyboard layout" for 1m with interval 1s in virtual machine server
[ 0%] Pressing key ENTER in virtual machine server
[ 0%] Waiting "Hostname:" for 5m with interval 1s in virtual machine server
C:/Users/Testo/ping.testo:63:3: Error while performing action wait "Hostname:" timeout 5m on virtual machine server
- Timeout

C:/Users/Testo/ng.testo:29:1: note: the virtual machine server was declared here

[ 17%] Test server_install_ubuntu FAILED in 0h:5m:14s
C:\Users\Testo>

Но у нас сломалась установка Ubuntu. Почему? Потому что мы добавили второй сетевой адаптер в виртуальную машину и теперь у нас появился новый экран, которого мы не ожидали ранее.

Primary NIC

В качестве главного интерфейса нам нужно выбрать первый (то есть нажать Enter). Давайте подправим наш установочный сценарий.

wait "Keyboard layout"; press Enter
#wait "No network interfaces detected" timeout 5m; press Enter
wait "Primary network interface"; press Enter
wait "Hostname:" timeout 5m; press Backspace*36; type "${server_hostname}"; press Enter

После этого можно еще раз запустить тесты и они должны отработать успешно.

Переименовываем сетевые интерфейсы

По умолчанию сетевым адаптерам внутри ОС назначаются довольно неинформативные названия (например, eth0 и eth1) при том, что для нас в тестовых сценариях было бы гораздо удобнее, если бы интерфейсы назывались так же, как мы их назвали в объявлении виртуальной машины: client_side и server_side. Для этого можно переименовать сетевые адаптеры, используя в качестве основы MAC-адрес, который нам заранее известен.

Для этого можно использовать, например, следующий баш-скрипт (ссылка на него будет доступна в конце урока).

#!/bin/bash

set -e

mac=$1

oldname=`ifconfig -a | grep ${mac,,} | awk '{print $1}'`
newname=$2

echo SUBSYSTEM==\"net\", ACTION==\"add\", ATTR{address}==\"$mac\", NAME=\"$newname\", DRIVERS==\"?*\" >> /lib/udev/rules.d/70-test-tools.rules

rm -f /etc/network/interfaces
echo source /etc/network/interfaces.d/* >> /etc/network/interfaces
echo auto lo >> /etc/network/interfaces
echo iface lo inet loopback >> /etc/network/interfaces

ip link set $oldname down
ip link set $oldname name $newname
ip link set $newname up

echo "Renaming success"

При сохранении этого скрипта в файл убедитесь, что вы натсроили формат конца строк в стиле Unix (View -> Line Endings)

Давайте сохраним этот скрипт в файл rename_net.sh и сохраним его в ту же папку, что и файл с тестовым сценарием ping.testo.

После этого напишем новый тест для сервера server_prepare:

test server_setup_nic: server_install_guest_additions {
    server {
        copyto ".\\rename_net.sh" "/opt/rename_net.sh"
        exec bash """
            chmod +x /opt/rename_net.sh
            /opt/rename_net.sh 52:54:00:00:00:bb client_side
            ip ad
        """
    }
}
C:\Users\Testo> testo run ping.testo --stop_on_fail --param ISO_DIR C:\iso --test_spec server_setup_nic
UP-TO-DATE TESTS:
server_install_ubuntu
server_prepare
server_install_guest_additions
TESTS TO RUN:
server_setup_nic
[ 75%] Preparing the environment for test server_setup_nic
[ 75%] Restoring snapshot server_install_guest_additions for virtual machine server
[ 75%] Running test server_setup_nic
[ 75%] Copying C:/Users/Testo/rename_net.sh to virtual machine server to destination /opt/rename_net.sh with timeout 10m
[ 75%] Executing bash command in virtual machine server with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:bb client_side
Renaming success
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000

link/ether 00:15:5d:01:25:15 brd ff:ff:ff:ff:ff:ff
inet 172.17.172.120/28 brd 172.17.172.127 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe01:2515/64 scope link
valid_lft forever preferred_lft
forever
3: client_side: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 52:54:00:00:00:bb brd ff:ff:ff:ff:ff:ff
[ 75%] Taking snapshot server_setup_nic for virtual machine server
[100%] Test server_setup_nic PASSED in 0h:0m:4s
PROCESSED TOTAL 4 TESTS IN 0h:0m:4s
UP-TO-DATE: 3
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

В выводе команды ip видно, что теперь наш оставшийся сетевой адаптер называется вполне понятно и лаконично: client_side.

Осталось лишь добавить сетевые настройки в этот сетевой интерфейс.

test server_setup_nic: server_install_guest_additions {
    server {
        copyto ".\\rename_net.sh" "/opt/rename_net.sh"
        exec bash """
            chmod +x /opt/rename_net.sh
            /opt/rename_net.sh 52:54:00:00:00:bb client_side
            ip a a 192.168.1.1/24 dev client_side
            ip l s client_side up
            ip ad
        """
    }
}

И повторяем такие же действия для машины client:

C:\Users\Testo> testo run ping.testo --stop_on_fail --param ISO_DIR C:\iso
Because of the cache loss, Testo is scheduled to run the following tests:
- server_setup_nic
Do you confirm running them? [y/N]: y
UP-TO-DATE TESTS:
server_install_ubuntu
server_prepare
server_install_guest_additions
client_install_ubuntu
client_prepare
client_install_guest_additions
TESTS TO RUN:
server_setup_nic
client_setup_nic
[ 75%] Preparing the environment for test server_setup_nic
[ 75%] Restoring snapshot server_install_guest_additions for virtual machine server
[ 75%] Running test server_setup_nic
[ 75%] Copying C:/Users/Testo/rename_net.sh to virtual machine server to destination /opt/rename_net.sh with timeout 10m
[ 75%] Executing bash command in virtual machine server with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:bb client_side
Renaming success
+ ip a a 192.168.1.1/24 dev client_side
+ ip l s client_side up
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen
1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MU
LTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 00:15:5d:01:25:15 brd ff:ff:ff:ff:ff:ff
inet 172.17.172.120/28 brd 172.17.172.127 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:
fe01:2515/64 scope link
valid_lft forever preferred_lft forever
3: client_side: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 52:54:00:00:00:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24
scope global client_side
valid_lft forever preferred_lft forever
[ 75%] Taking snapshot server_setup_nic for virtual machine server
[ 88%] Test server_setup_nic PASSED in 0h:0m:5s
[ 88%] Preparing the environment for test client_setup_nic
[ 88%] Restoring snapshot client_install_guest_additions for virtual machine client
[ 88%] Running test client_setup_nic
[ 88%] Copying C:/Users/Testo/rename_net.sh to virtual machine client to destination /opt/rename_net.sh with timeout 10m
[ 88%] Executing bash command in virtual machine client with timeout 10m
+ chmod +x /opt/rename_net.sh
+ /opt/rename_net.sh 52:54:00:00:00:aa server_side
Renaming success
+ ip a a 192.168.1.2/24 dev server_side
+ ip l s server_side up
+ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen
1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MU
LTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 00:15:5d:01:25:16 brd ff:ff:ff:ff:ff:ff
inet 172.17.172.116/28 brd 172.17.172.127 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:
fe01:2516/64 scope link
valid_lft forever preferred_lft forever
3: server_side: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether 52:54:00:00:00:aa brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24
scope global server_side
valid_lft forever preferred_lft forever
[ 88%] Taking snapshot client_setup_nic for virtual machine client
[100%] Test client_setup_nic PASSED in 0h:0m:5s
PROCESSED TOTAL 8 TESTS IN 0h:0m:10s
UP-TO-DATE: 6
RUN SUCCESSFULLY: 2
FAILED: 0
C:\Users\Testo>

Пингуем!

Наконец, всё готово и мы можем проверить доступность двух машин друг для друга.

Для этого создаём еще один тест test_ping, который, в отличие от всех предыдущих наших тестов, будет отнаследован сразу от двух родительских тестов, т.к. для проверки пинга нам необходимо, чтобы были выполнены оба теста: client_prepare и server_prepare.

test test_ping: client_setup_nic, server_setup_nic {
    client exec bash "ping 192.168.1.2 -c5"
    server exec bash "ping 192.168.1.1 -c5"
}

Попробуем запустить этот тест.

C:\Users\Testo> testo run ping.testo --stop_on_fail --param ISO_DIR C:\iso --test_spec test_ping
UP-TO-DATE TESTS:
server_install_ubuntu
server_prepare
server_install_guest_additions
server_setup_nic
client_install_ubuntu
client_prepare
client_install_guest_additions
client_setup_nic
TESTS TO RUN:
test_ping
[ 89%] Preparing the environment for test test_ping
[ 89%] Restoring snapshot server_setup_nic for virtual machine server
[ 89%] Restoring snapshot client_setup_nic for virtual machine client
[ 89%] Running test test_ping
[ 89%] Executing bash command in virtual machine client with timeout 10m
+ ping 192.168.1.2 -c5
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.032 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.027 ms
64
bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.029 ms
64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.025 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4093ms
rtt min/avg/max/mdev = 0.023/0.027/0.032/
0.004 ms
[ 89%] Executing bash command in virtual machine server with timeout 10m
+ ping 192.168.1.1 -c5
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.015 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.024 ms
64
bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.031 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=0.030 ms

--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4085ms
rtt min/avg/max/mdev = 0.015/0.025/0.031/
0.008 ms
[ 89%] Taking snapshot test_ping for virtual machine server
[ 89%] Taking snapshot test_ping for virtual machine client
[100%] Test test_ping PASSED in 0h:0m:17s
PROCESSED TOTAL 9 TESTS IN 0h:0m:17s
UP-TO-DATE: 8
RUN SUCCESSFULLY: 1
FAILED: 0
C:\Users\Testo>

Как мы видим, команда ping отлично отработала, а это означает, что мы смогли полноценно настроить соединение между виртуальными машинами!

Итоги

Виртуальные сети позволяют не только связывать виртуальные машины с Интернетом, но и служат для связи машин между собой.

Для удобства ориентирования в сетевых адаптерах внутри тестовых сценариев рекомендуется назначать сетевым адаптерам заранее известный МАС-адрес и с его помощью переименовывать сетевые адаптеры.

Дерево тестов на текущий момент выглядит так:

Итоговый тестовый сценарий и пример скрипта для переименования сетевых интерфейсов можно скачать здесь