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

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

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

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

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

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

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

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

Зачем все это

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

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

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

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

Но когда серверов много, 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 просто не отвечает.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Продолжаем креативить. Во-первых, это доставляет удовольствие, во-вторых, это приносит результат.

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

Комментарии (5)


  1. maxsaf
    01.08.2024 21:05
    +1

    Что делать, если диски подключены через PCI-E RAID, и не видны в BMC?


    1. aioffe Автор
      01.08.2024 21:05

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


  1. kt97679
    01.08.2024 21:05

    У dell-а есть доступ к BMC по ssh. У серверов, с которыми вы работали, такой возможности не было?


    1. citizen7
      01.08.2024 21:05

      Если он пингуется, то по SSH тоже не подключиться


      1. aioffe Автор
        01.08.2024 21:05

        Да, действительно, SSH не поможет в случае если BMC уже не пингуется.
        Он мог бы быть полезен для работы и есть некий его заменитель.
        Полноценный SSH не реализован, но он вряд ли и нужен.
        Насколько я знаю большим спросом не пользуется.
        Не уверен, что у Dell был прямо полный ssh, но можно попробовать уточнить.