Тестирование BMC: Автоматизировать! Нельзя все руками

61c352ced7be060b347cbcb92b90786d.jpg

Привет, Хабр! Меня зовут Александр Иоффе, в компании Aquarius я руковожу департаментом разработки средств автоматизации и обеспечения качества производимой продукции, такой как сервера, коммутаторы, ноутбуки, мониторы и так далее.

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

И чтобы делиться опытом и учиться новому, мы с командой решили поучаствовать в конференции для тестировщиков Heisenbug этой весной со стендом и докладом об автоматизации тестирования интегрированного ПО.

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

Тестируемый объект

Любая техника — это в первую очередь железо, пусть и высокотехнологичное. Однако для полноценной работы ему необходимо свое программное обеспечение или интегрированный софт. Самый простой пример такого ПО — это BIOS, но существуют и другие.

Главным героем моего доклада был интегрированный софт под названием BMC — Baseboard Management Controller.

f16f1c2deba2623c448ac908f72e76e5.jpg

Вообще BMC — это сам контроллер, но в обиходе, говоря BMC, мы подразумеваем связку контроллера и его прошивки. Контроллер находится на материнской плате и, благодаря прошивке, умеет общаться со всей периферией на этой плате по специальным протоколам, в том числе ее опрашивать и отправлять управляющие сигналы. Он может общаться с внешним устройством, что и позволяет управлять хостом удаленно.

Зачем все это

Наверняка вы используете GitLab или какие-то аналоги для управления кодом, какие-то хранилища артефактов чтобы хранить там результаты своей деятельности, наверняка вы используете что-то, чтобы разворачивать свои приложения, пользуетесь банковскими сервисами или сервисами для обработки данных.

Все это работает на каких-то серверах. А для поддержания гладкой работы и мониторинга этих серверов как раз и используется BMC.

Как пользоваться

У BMC есть простой WebUI, на веб-странице отображается вся информация о состоянии сервера, версии прошивки, можно посмотреть инвенторику, поменять параметры и так далее.

56160e9404d29808423c48044e64d21f.png

Но когда серверов много, WebUI — не очень удобный вариант, если вы хотите автоматизировать работу с серверами. Для таких задач есть два интерфейса командной строки — IPMI, созданный Intel, старый, но все еще использующийся и более новый Redfish, основанный на REST-запросах.

Вот пример использования Redfish через curl:

curl https://my-bmc-01/redfish/v1/Chassis/Self/Sensors
curl https://my-bmc-01/redfish/v1/Managers/Self/NetworkProtocol

Понятно, что автоматизировать работу с сервером через подобные запросы очень легко.

Как тестировать BMC

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

Наша команда имела большой опыт работы в крупных IT-компаниях, таких как Borland, Oracle, Huawei, Deutsche Bank и более 20 лет опыта в IT у лидеров команды. Однако мы автоматизировали тестирование только прикладного ПО, где, на первый взгляд кажется, все совершенно не так. Поэтому очень многое пришлось пробовать в первый раз и придумывать почти с нуля.

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

С этой точки зрения мы имеем систему с тремя протоколами, и для нас теперь они выглядят как обычный софт, который надо протестировать. Соответственно, нужно выбрать язык программирования. Первая мысль — использовать Native Language, но зачем, если вы тестируете со стороны пользователя. Кроме того, так сложилось, что у нас уже были наработки на связке Python + Robot Framework. Python — востребованный и популярный язык программирования, Robot Framework — простой в написании и чтении фреймворк, который позволяет формировать простые понятные отчеты.

Поскольку тестовыми объектами являются физические серверы, а не ПО само по себе, мы ожидали возникновения следующих проблем:

  • Как масштабировать? Ведь взять 1000 серверов не получится;

  • Нельзя просто убить зависший хост и поднять его заново;

  • Как организовать покрытие различных конфигураций, если нужно физически изменить сервер;

  • Нужен физический доступ, если что-то не так.

Вот мы и дошли до самого интересного — подготовка стенда к тестированию.

Подготовка к тестам

Сперва нужно научиться прошивать BMC. Это можно сделать через WebUI, но если нам хочется автоматизировать, то лучше, конечно, сделать скриптом через Redfish. Готовим скрипт и начинаем пробовать. Первый запуск — все хорошо, второй — сюрприз, тестовый объект превратился в кирпич, т.е. BMC просто не отвечает.

58c5e308d7e43a7f61566449ef2fd0c9.png4f83250119172e9071f833161ba2d720.png

Непонятно, что произошло и что с этим делать, однако решение есть. На плате есть специальные пины для дебага BMC. Берем Raspberry Pi и с помощью переходничков подключаем его USB к разъему. Затем подключаемся к RPi по ssh, и оттуда уже выходим на консоль BMC. Так можно посмотреть логи и попробовать вернуть стенд к нормальному состоянию. Например, с помощью простого shutdown -r now.

У нас появились первые штрихи архитектуры:

579d8ea5a759af1dfb58cdaf330386b6.png

Преодолели первую проблему и начинаем запускать тесты. И снова после нескольких запусков стенд превратился в кирпич, а тесты висят. Подключаемся к BMC через RPi — в консоли сыпятся нули, набрать команду не удается…
Начинаем разбираться по порядку:

1. Зависшие тесты.
Половина тестов пробежала, а половина зависла. Нам бы хотелось получить результаты тех тестов, которые все-таки пробежали. Для этого разделяем тесты на «вежливые» и те, которые могут сделать стенд недоступным. «Вежливые» пускаем в первую очередь, а остальные — во вторую.
2. Кирпич вместо тестового объекта.
Существует программатор, берем его в руки, вынимаем сервер из стойки, вскрываем, подключаемся к разъемам, перепрошиваем BMC и стенд снова живой.
3. Критический баг.
Мы написали тесты, эмулирующие действия пользователя, и привели стенд к состоянию кирпича. То есть мы имеем критический баг, но как его исследовать? Пока непонятно, и оказывается, его сложно воспроизвести. Решение такое: для будущих исследований сохраняем логи из консоли BMC и отправляем в базу данных Elastic.
Тем самым получаем возможность отслеживать все логи и анализировать поведение BMC.

b399d9b5ff58a18488fb2d9b6a13336c.png

Продолжаем наши приключения

Запускаем все больше тестовых прогонов и выясняется, что соединение raspberry pi и BMC нестабильное. Например, соединение рвется, если кто-то заходит по тому же каналу на BMC. Можно написать скрипт, восстанавливающий соединение, или запретить заходить так руками, но это уже ненадежно. К тому же портов на raspberry pi четыре, а серверов в какой-то момент станет пять, а потом и больше, ведь мы хотим увеличивать количество тестовых стендов. Уже видна сложность для масштабирования. И снова есть решение — конвертер портов, на котором двадцать четыре порта, превращающий их в telnet. То есть можно масштабировать инфраструктуру и теперь соединение не будет рваться при подключении к консоли BMC.
Ну и параллельно решаем вторую задачу — чтобы следить за стендами, мы написали Test Object Monitor. Его основная задача — сообщать о неготовности стенда до того, как туда пойдут тесты и экономить нам время и нервы. Кроме того, он умеет показывать разную техническую информацию.

62dbfa4c98b220404195527f4044f28d.png

А наша структура растет и теперь схематично выглядит вот так:

66cd599f62c982d654c3968cb5eb7f63.png

Снова пускаем тесты, выделяем группы тестов — и выясняется, что закончились стенды. Найти новый сервер не так просто — его из кармана не достанешь. Идем за помощью к коллегам и оказывается, есть виртуализация BMC на QEMU. Решение не полноценное, но оно есть, его можно автоматизировать, а тесты разделить на те, которые можно запускать на виртуалке и те, которые нельзя, и настроить запуски на QEMU. В итоге мы получаем настоящий CI, а Test Object Monitor превращается в Test Object Manager (TOM), так как он уже не только следит за готовыми стендами, но обслуживает очередь запусков тестов и может поднять для них QEMU, если им подходит виртуалка, а может отдать физический стенд. Кроме того, теперь можно решить проблему разных окружений и TOM будет автоматически пускать тесты на стендах с тем оборудованием, которое попросил создатель тест плана. А для анализа результатов мы используем Report portal (https://reportportal.io/), позволяющий сравнивать разные прогоны и автоматически отделять новые падения тестов от уже известных. Хороший инструмент. Не единственный такой на рынке, и нам еще предстоит выбрать лучший, но это впереди, о чем обязательно потом расскажу.

А как насчет разнообразия тестирования?

Пока мы имеем только системное тестирование, а ведь подходы бывают разные. Поэтому в наших планах заняться увеличением разнообразия тестирования в будущем.
И вот что точно мы будем пробовать:

  • Автоматизация окружений:

    • Что не требует физического доступа, в теории можно автоматизировать;

    • Что требует, то надо постараться привести в такое состояние, чтобы не требовало.

  • Эмуляция всего, что можно:

    • Backend для WebUI — точно можно;

    • BIOS? Пока не знаем, но кажется, что частично можно;

    • Железо? Ведь железо общается между собой и с BMC тоже по каким-то протоколам;

    • Ошибочные состояния? Мы точно знаем, что есть возможность эмулировать сигнал об ошибочном состоянии железа, а значит это надо делать.

Что можно сказать в заключение

Аналогии — мощный инструмент. Оказалось, что многие подходы из мира обычного софта с некоторой адаптацией отлично работают в мире Hardware. Собственно, мы знали это и раньше, а сейчас лишний раз убедились. Поэтому будем искать дальше…
Продолжаем креативить. Во-первых, это доставляет удовольствие, во-вторых, это приносит результат.

Делитесь в комментариях своими мыслями про этот рассказ и идеями по автоматизации тестирования!

© Habrahabr.ru