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

    Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом (“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

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

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

    А как вы автоматизируете тестирование и подготовку окружения для него?
    Acronis
    Компания

    Комментарии 3

      +2
      У нас для этого используются заранее подготовленные виртуальные машины, которые при необходимости откатываются на снепшот с чистой системой. Процесс автоматизируется самописными скриптами, которые используют VMware vSphere Perl SDK.
        0
        данный кейс (у акрониса) хорошо бы наверное подошел для специфичного тестирования какого нибудь железа (когда виртуалки не помогут)
          +1
          В других командах у нас тоже есть сценарии для виртуальных машин. Как заметил NavY, в рамках данной задачи нас интересуют именно тесты на конкретном железе. Может кого-то интересует железо на котором мы работаем? Могу добавить конфигурацию оборудования в пост.

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

        Самое читаемое