Pull to refresh
0

Использование продуктов Acronis в автоматизации тестирования

Reading time 6 min
Views 12K
Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом (“deployment”).

Весь комплекс автоматизированного тестирования выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins»; через него мы задаём параметры автоматического прогона теста:

— на каком сервере или машине мы будем запускать наш тест;
— как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски;
— какую операционную систему поставить
— какие продукты необходимо установить на этот сервер для прогона тестового сценария.

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

В качестве того, что будет грузить PXE, мы выбрали нашу Acronis Bootable Media, т. к. с её помощью можно выполнить всё, что нам нужно. Acronis Bootable Media — это урезанная версия Linux’a (BusyBox) с исполняемыми файлами нашего продукта, упакованная в ramdisk. Рамдиск нашей медии можно получить, установив из дистрибутива Acronis Backup компонент Agent For Windows. Рамдиск будет находиться в папке с установленным продуктом:

C:\Program Files (x86)\Common Files\Acronis\BackupAndRecoveryAgent\

и будет называться agent_ramdisk.dat для 32х битной медии и agent_ramdisk64.dat – для 64х битной.

image
Внешний вид загруженной из рамдиска медии

В загруженной медии мы выполним все скрипты по подготовке рейд-контролера, и через неё восстановим образ той или иной операционной системы – поверх только что настроенного железа. Первый шаг – настройка рейд-контроллера. Для конфигурации дисков мы используем утилиту storcli, которую предварительно запаковываем в ramdisk.

Вот пример shell’овского скрипта, который запаковывает нужные нам файлы в ramdisk:

# Распаковка ramdisk.
extract_ramdisk() {
            rm -rf .ramdisk
            mkdir .ramdisk
            pushd .ramdisk
            gzip -dc < $1 | cpio -i -d --no-absolute-filenames
            popd
}
# Подкладывание нужных файлов в Acronis Media. 
copy_extra_files() {
            mkdir -p .ramdisk/tmp/root/.ssh
            cp -f files/id_rsa .ramdisk/tmp/root/.ssh
            cp -f files/autostart.sh .ramdisk/bin/autostart_dbg
            cp -f files/libstorelibir-2.so.14.07-0 .ramdisk/bin
            cp -f files/storcli64 .ramdisk/bin
}
# Запаковка ramdisk’a.
pack_ramdisk() {
            mkdir -p out
            pushd .ramdisk
            /cygdrive/c/cygwin/bin/find . | cpio -H newc -o > ../out/agent_ramdisk_echo.dat.initrd
            popd
            gzip -c9 out/agent_ramdisk_echo.dat.initrd > out/ramdisk.dat
            rm -f out/agent_ramdisk_echo.dat.initrd
            rm -rf .ramdisk
}
# Вызов методов.
echo Extracting ramdisk...
extract_ramdisk $1
echo Copying extra files...
copy_extra_files
echo Packing ramdisk...
pack_ramdisk

После того, как мы запаковали утилиту в ramdisk, её можно использовать в загруженной Acronis медии. Для загрузки через кастомный ramdisk из-под PXE, нужно создать корректный конфигурационный файл для загружающей машины. В качестве PXE-сервера мы используем ту же самую машину, которой Jenkins передаёт управление. На ней же у нас стоит DHCP сервер. Все тестовые машины держим в своей собственной виртуальной сети, чтобы не мешать другим работникам компании.

Процесс деплоймента начинается с подготовки конфигурационного файла для PXE: который генерируется по имени машины. Поскольку этот же сервер также выполняет функцию DHCP, имени нам достаточно, чтобы узнать её mac-адрес, создать правильный файл конфигурации и положить его в /var/lib/tftpboot. Пример файла конфигурации загрузки приведен ниже. После этого мы перезагружаем машину через IPMI (если у машины он есть).

После того как машина загрузится из ramdisk, в медии начнёт выполняться скрипт autostart.sh. Сначала мы прописываем в нем, как через storcli сконфигурировать диски, а затем задаём параметры восстановления того или иного образа операционной системы на машину через наш продукт. Эти образы сделаны нашим же продуктом Acronis

Backup представляют собой *.tib файлы и лежат на шаре в этой же сети.

Вот пример скрипта autostart.sh:

configureRaidDisk() {
    conf_id=$(cat /proc/cmdline | grep -o 'raid_configuration_number=[^ ]*' | sed 's/\(^raid_configuration_number=\)\(.*\)/\2/')
    echo Raid configuration: $conf_id
    # Default value not to reconfigure raid controller disk state.
    if [ "$conf_id" == "0" ]; then
        return
    elif [ "$conf_id" == "1" ]; then
        (/bin/storcli64 /c1/vall delete force && echo Delete all virtual drives.) || exit 1
        (/bin/storcli64 /c1 add vd type=raid0 drives=252:3 wt nora direct strip=64 && echo Create system partition.) || exit 1
        (/bin/storcli64 /c1 add vd type=raid0 drives=252:0,252:1,252:2 wt nora direct strip=64 && echo Create first virtual drive.)  || exit 1
        (/bin/storcli64 /c1 add vd type=raid0 drives=252:4,252:5,252:6 wt nora direct strip=64 && echo Create second virtual drive.)  || exit 1
        (/bin/storcli64 /c1 add vd type=raid0 drives=252:7 wt nora direct strip=64 && echo Create third virtual drive.)  || exit 1
        (/bin/storcli64 /c1/v0 set bootdrive=on && echo Set system disk as bootable.)  || exit 1
    fi
}

execCmd() {
        tmp=$(cat /proc/cmdline | grep -oe acrocmd.*\) )
        cmd=${tmp%%\)} 
        echo Recovering OS image...
        ($cmd >> /dev/null && echo Done.) || exit 1
}

configureRaidDisk
startProduct
execCmd
reboot now

Параметры для этого скрипта мы передаём через /proc/cmdline, который берём конфигурационного файла из PXE. Мы просматриваем, какую конфигурацию рейда нам взять, и зовём уже непосредственно storcli с нужными нам параметрами. Сейчас у нас всё настроено под определённые железки, в дальнейшем есть желание сделать эти операции более умными.

После конфигурации рейда мы запускаем операцию восстановления операционной системы. Для этого опять вычленяем из переданного нам в /proc/cmdline команду для восстановления и выполняем её.

Вот пример конфигурационного файла, сгенерированного для загрузки машины через PXE:

timeout=1
default=media

image=kernel64.dat
        label=media
        initrd=ramdisk64.dat
        append="ramdisk_size=100000 quiet vga=791 recover=(acrocmd recover disk --loc=smb://10.250.114.44/raid/images --credentials=image,qweqweqwe --arc=win7_64srv --disk=1 --target_disk=1) bootfile=root@10.250.114.101:/tmp/uefi/0AFA7218.conf#end raid_configuration_number=1"

Из него мы и задаем, какой архив восстанавливать – как раз то, что в параметре append попадёт затем в proc/cmdline внутри медии.

Рамдиск должен лежать в /var/lib/tftpboot/ на PXE-сервере. В нашем случае он называется ramdisk64.dat. После того, как наша медия отработала, и система восстановлена, мы можем столкнуться с проблемой: после настройки рейда с помощью storcli, тома на виртуальных дисках рейда не создаются. Поэтому в скрипте самого высокого уровня, который подготавливает конфигурацию для загрузки PXE, перезагружает машину и ждет загрузки восстановленной системы, мы добавили выполнение следующего скрипта:

           echo list disk > list.txt
for /f "usebackq tokens=1,2" %%a in (`diskpart /s list.txt ^| findstr /r /c:"Disk [1-99]"`) do (
            echo sel %%a %%b>script.txt
            echo clean>>script.txt
            echo create part primary>>script.txt
            echo format FS=NTFS quick>>script.txt
            echo assign>>script.txt
            echo rescan>>script.txt
            diskpart /s script.txt
)
del list.txt, del script.txt

Он создаёт NTFS-тома на каждом найденном диске (кроме первого). Так как diskpart не может принимать на вход параметры, а может только использовать скрипт, мы генерируем файл с командой для листинга дисков на лету и после форматируем файловую систему, используя диски из листинга.

После восстановления ОС можно приступать к установке продуктов. Запуск скриптов и прочих действий на тестовой машине производится с управляющего сервера через SSH-соединение. Для этого на тестовой машине стоит SSH-сервер, который уже установлен в образе, так что после восстановления машины, мы просто подключаемся к ней по SSH. Установку продукта реализуем копированием на машину нужных нам msi-файлов нашего продукта, которые просто ставим через msiexec. Теперь можно приступать к самому тестированию.

Тесты представляют собой «обертки» на Питоне, выполняющие те или иные операции через командную строку утилиты Acrocmd. Acrocmd позволяет нам выполнять все те же операции, что и через GUI основного продукта.

Запуском этих файлов (реализованных на Python’e) на тестируемой машине занимается специальная система, установленная на другой управляющий сервер. Управляющий сервер по SSH-соединению заливает все скрипты на машину и запускает их, собирает их вывод и объединяет результаты всех тестов в один итоговый отчет. В дальнейшем по нему можно построить красивый отчёт о прогоне тестового сценария. Для этого мы используем несложный веб-сервер, написанный на Python’e, который преобразует результаты в красивые html-странички.

image

Вот пример отчета, который мы получаем в конечном итоге. Сравнение скорости бекапа в трех различных версиях продукта. Ось абсцисс – это номер итерации в прогоне, а ось ординат – это скорость бекапа.

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

А как вы автоматизируете тестирование и подготовку окружения для него?
Tags:
Hubs:
+12
Comments 3
Comments Comments 3

Articles

Information

Website
www.acronis.com
Registered
Founded
Employees
1,001–5,000 employees
Location
Сингапур