Шаблон тестирования интеграции Azure IoT Edge Integration Test — Часть.1


Резюме

Это часть цикла статей, посвященных шаблону интеграции Azure IoT Edge — azure-iot-edge-integration-test-template. В этой части.1 я объясню весь конвейер, включая Infrastructure as Code и интеграционный тест. В части.2 будет представлена информация о каждом модуле IoT Edge, а в части.3 я расскажу о генераторе манифеста IoT Edge.

  • Шаблон интеграционного теста Azure IoT Edge — часть.2
  • Шаблон интеграционного теста Azure IoT Edge — часть.3

TOC

  • Обзор
  • Архитектура
  • Этапы тестирования
  • Развертывание инфраструктуры
    • Группа сетевой безопасности — входящий порт 22
    • Метка доменного имени виртуальной машины
    • Группа потребителей концентратора IoT
  • Настройка и установка
    • Подключение службы ВМ
    • Роль контрибьютора блобов
  • Развертывание кода и выполнение тестов
    • edge-module.yml
    • test-prep.yml
    • test-execution.yml
    • test-cleanup.yml

Обзор

Когда у вас есть несколько модулей Azure IoT Edge на граничном устройстве и вы хотите обновить код одного из этих модулей, вы можете убедиться в качестве кода путем внедрения линтерных и модульных тестов, но трудно проверить связь между модулями. Поэтому при каждом обновлении программного обеспечения необходимо выполнять интеграционные тесты.

В этом шаблоне вы можете выполнить интеграционные тесты модулей Azure IoT Edge в тестовой среде на виртуальной машине Azure. Вся процедура тестирования автоматизирована с помощью Azure Pipelines. Используя этот шаблон, вы развертываете и выполняете интеграционные тесты перед развертыванием кода на граничном устройстве.

Архитектура

Этот шаблон включает шесть образцов модулей IoT Edge — FileGenerator, FileUpdater, FileUploader, IothubConnector, WeatherObserver и LocalBlobStorage. Подробности о модулях IoT Edge описаны в Azure IoT Edge Integration Test template — Part.2.

Шаги тестирования

Вам необходимо выполнить три шага: 1) развертывание инфраструктуры, 2) настройка и установка и 3) развертывание кода и выполнение теста. Все, что нужно знать для запуска этого шаблона, описано в разделе Getting-started, но я расскажу о деталях и важных моментах для этих конвейеров.

Развертывание инфраструктуры

Ресурсы Azure, необходимые для этого шаблона, определены в файле main.bicep, и вы можете запустить конвейер IaC (Infrastructure as Code) из файла iac.yml в Azure Pipelines.

Группа сетевой безопасности — входящий порт 22

В файле main.bicep определено входящее правило Network Security Group, которое открывает порт 22. Это необходимо для доступа к ВМ через SSH при установке Azure IoT Edge на следующем шаге и для того, чтобы агент Azure Pipelines настроил каталог ВМ и предоставил разрешения на доступ к каталогу в test-prep.yml.

properties: {
  securityRules: [
    {
      name: 'SSH'
      properties: {
        protocol: 'Tcp'
        sourcePortRange: '*'
        destinationPortRange: '22'
        sourceAddressPrefix: '*'
        destinationAddressPrefix: '*'
        access: 'Allow'
        priority: 100
        direction: 'Inbound'
      }
    }
  ]
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Метка доменного имени ВМ

Настройка метки доменного имени для ВМ очень важна, поскольку IP-адрес выделяется динамически, а агент Azure Pipelines получает доступ с помощью VM Service Connection, описанного в Create SSH Service Connection.

Имя хоста должно быть edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com, которое определено в main.bicep.

var dns_label = 'edge-${base_name}'

resource PublicIp 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
  name: public_ip_name
  location: location
  sku: {
    name: 'Basic'
  }
  properties: {
    publicIPAllocationMethod: 'Dynamic'
    publicIPAddressVersion: 'IPv4'
    dnsSettings: {
      domainNameLabel: dns_label
    }
    idleTimeoutInMinutes: 4
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Группа потребителей концентратора IoT

Лучше создавать группы потребителей IoT Hub. Если вы хотите потреблять сообщения на IoT Hub через другой инструмент, например Azure IoT Hub Explorer, это приведет к ошибкам интеграционного теста. main.bicep развертывает группу потребителей, которая посвящена агенту Azure Pipelines, выполняющему интеграционные тесты.

param iothub_cg_name string
resource IoTHubConsumerGroup 'Microsoft.Devices/IotHubs/eventHubEndpoints/ConsumerGroups@2021-07-02' = {
  name: '${IoTHub.name}/events/${iothub_cg_name}'
  properties:{
    name: iothub_cg_name
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Настройка и установка

Подключение службы VM

В этом шаблоне используется SSH сервисное подключение. Можно использовать команды bash, например ssh testuser@edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com. Комбинируя retryCountOnTaskFailure задачи Azure Pipelines, вы можете обрабатывать ошибки нестабильного соединения SSH.

Роль контрибьютора блобов

Вам нужно вручную установить Storage Blob Data Contributor из встроенных ролей Azure RBAC, которые привязаны к вашей подписке Azure Subscription, чтобы агент Azure Pipelines мог генерировать SAS-токен для Blob Storage. Вам нужна роль Azure Subscription Owner или User Access Administrator.

az role assignment create `
    --role "Storage Blob Data Contributor" `
    --assignee {Object ID of Azure Service Connection} `
    --scope "/subscriptions/{Azure Subscription ID}/resourceGroups/rg-{BASE_NAME}/providers/Microsoft.Storage/storageAccounts/st{BASE_NAME}"
Вход в полноэкранный режим Выход из полноэкранного режима

Развертывание кода и выполнение тестов

edge-module.yml

  • Вызывайте этот шаблон с каждым модулем IoT Edge. Он создает и размещает образы контейнеров в Azure Container Registry.

  • Используйте не задачу Azure Pipeline Docker, а команды docker, поскольку в этом случае не нужно вручную создавать подключение к службе Docker Registry. Процесс, в ходе которого Azure Pipelines извлекает ключ Azure Container Registry, создает и перемещает контейнерные образы, автоматизирован.

acrkey=$(az acr credential show --name $(ACR_NAME) --query passwords[0].value -o tsv)
cd ${{ parameters.dockerfileDirectory }}
docker login -u $(ACR_NAME) -p $acrkey $(ACR_NAME).azurecr.io
docker build --rm -f Dockerfile -t $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber) .
docker push $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber)
Вход в полноэкранный режим Выход из полноэкранного режима

test-prep.yml

  • Вызовите этот шаблон с модулями IoT Edge в качестве параметров. Параметры используются для итеративных задач, которые проверяют, существуют ли образы модулей в Azure Container Registry и запущен ли каждый модуль на IoT Edge runtime.
- template: ./templates/test-prep.yml
  parameters:
    azureSvcName: $(AZURE_SVC_NAME)
    vmSshSvcName: $(VM_SVC_NAME)
    EdgeImages:
      module1:
        name: IothubConnector
        repository: iothub-connector
        tag: $(Build.BuildNumber)
      module2:
        name: WeatherObserver
        repository: weather-observer
        tag: $(Build.BuildNumber)
      module3:
        name: FileGenerator
        repository: file-generator
        tag: $(Build.BuildNumber)
      module4:
        name: FileUploader
        repository: file-uploader
        tag: $(Build.BuildNumber)
      module5:
        name: FileUpdater
        repository: file-updater
        tag: $(Build.BuildNumber)
Вход в полноэкранный режим Выйти из полноэкранного режима
  • Задача SSH
    • Удалите каталог /edge, чтобы очистить его от остатков прошлых тестов.
    • Предоставьте разрешения на чтение, запись и выполнение каталогу хост-машины. Azure IoT Edge Hub с UID 1000 и Azure IoT Edge local blob storage с user ID 11000 и user group ID 11000.
    • Разрешения хост-системы
    • Предоставление доступа к каталогам пользователю контейнера в Linux
    • Установите команду tree, чтобы она могла показывать каталог хост-машины в журнале.
    • Перезапустите Azure IoT Edge runtime, потому что вы удалили каталог, который текущие модули реализуют bind mount. Чтобы обновить связь между модулями и каталогом, необходимо перезапустить среду выполнения, иначе это приведет к ошибкам.
if [ -d "/edge" ]
then
  sudo rm -r /edge
fi

sudo mkdir -p $(FILE_UPLOADER_DIR)
sudo chown -R 1000 $(FILE_UPLOADER_DIR)
sudo chmod -R 700 $(FILE_UPLOADER_DIR)

sudo mkdir -p $(FILE_UPDATER_DIR)
sudo chown -R 1000 $(FILE_UPDATER_DIR)
sudo chmod -R 700 $(FILE_UPDATER_DIR)

sudo mkdir -p $(LOCAL_BLOB_STORAGE_DIR)
sudo chown -R 11000:11000 $(LOCAL_BLOB_STORAGE_DIR)
sudo chmod -R 700 $(LOCAL_BLOB_STORAGE_DIR)

sudo apt-get install tree
tree /edge

sudo iotedge system restart
Войдите в полноэкранный режим Выйти из полноэкранного режима

test-execution.yml

  • Используйте асинхронный метод bash &, чтобы агент Azure Pipelines отправлял прямой запрос метода на IoT Hub и в то же время слушал сообщения на IoT Hub, отправленные из модулей IoT Edge. --timeout в настоящее время установлен 30 сек. Иногда ответ от IoT Edge медленный, они не отвечают и вызывают ошибки. Вероятно, 30 секунд — это хорошее время для ожидания. Если оно превышает 30 секунд, значит, в модулях Edge что-то идет не так.
az iot hub invoke-module-method --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --method-name request_weather_report --method-payload '{"city": "Tokyo"}' &
testResult=$(az iot hub monitor-events --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --cg $(IOTHUB_CONSUMER_GROUP) --timeout 30 -y)
Вход в полноэкранный режим Выход из полноэкранного режима

test-cleanup.yml

  • Удалите все каталоги, но сохраните контейнер blob weather.
az storage blob directory delete --account-name $(STORAGE_ACCOUNT_NAME) --container-name $(BLOB_CONTAINER_NAME) --directory-path $(TEST_ORGANIZATION_NAME) --recursive
Войдите в полноэкранный режим Выйти из полноэкранного режима

Оцените статью
devanswers.ru
Добавить комментарий