Вы можете добавить в DCImanager 6 собственный обработчик PDU. Для этого создайте код обработчика и загрузите его в платформу.
Подготовка окружения
Обработчик PDU должен быть написан на языке Python. Рекомендуем использовать версию Python 3.9.
Вы можете создать обработчик на основе существующего проекта. Чтобы скопировать проект, подключитесь к серверу-локации DCImanager 6 по SSH и выполните команду:
docker cp eservice_handler:/opt/ispsystem/equip_handler ./При создании обработчика могут быть полезны директории проекта:
- /common — общие вспомогательные классы и функции;
- /pdu_common — вспомогательные классы и функции для работы с PDU;
- /pdu_common/handlers — обработчики PDU.
Требуемые библиотеки Python и их версии вы можете посмотреть в файле проекта requirements.txt. Чтобы установить нужные библиотеки, выполните команду:
pip3 install -r requirements.txtДля проверки типов данных в проекте рекомендуем использовать анализатор mypy.
Создание обработчика
Класс для работы с PDU
Класс PDU наследуется от класса:
- BaseSnmpPdu — для устройств, работающих через протокол SNMP;
- BasePdu — для остальных устройств.
Класс BaseSnmpPdu содержит методы взаимодействия с PDU по протоколу SNMP:
- snmp_get — выполнить запрос чтения по определённому OID;
- snmp_set — выполнить модифицирующий запрос по определённому OID;
- snmp_walk — выполнить запрос, результатом которого будет список.
class ExampleHandlerSnmp(BaseSnmpPdu):
"""Example handler class."""
def __init__(self, pdu_data: PduSnmpData):
"""__init__.
Args:
pdu_data (PduSnmpData): pdu connection data
"""
super().__init__(pdu_data)Чтобы получить данные для подключения к PDU, используйте метод self.pdu_data:
self.pdu_data.snmp_params[“community”]Примеры SNMP-запросов к PDU:
result = self.snmp_get("1.3.6.1.2.1.1.5.0")
print(result.value)self.snmp_set("1.3.6.1.2.1.1.5.0", "test.pdu")for elem in self.snmp_walk("1.3.6.1.2.1.1"):
print(elem.value)Каждый файл-обработчик должен содержать функцию make_handler. Эта функция создаёт объект обработчика:
def make_handler(pdu_data: pduSnmpData) -> BaseSnmpPdu:
"""Create pdu handler object.
Args:
pdu_data (PduSnmpData): pdu connection data
for selected protocol.
Returns:
BasePdu: Initialized pdu handler object
"""
return ExampleHandlerSnmp(pdu_data)При переопределении методов укажите требуемый формат запросов и возвращаемых значений. Все вспомогательные представления описаны в файле проекта /pdu_common/helper.py.
Методы для работы с PDU
Чтобы DCImanager 6 мог взаимодействовать с PDU, переопределите методы класса BasePdu:
- status — опрос PDU;
- port_up — включение порта;
- port_down — выключение порта;
- statistic — сбор статистики.
Для каждого метода существуют типы аргументов и возвращаемые значения, которые ожидает платформа. Сервис работы с оборудованием при взаимодействии с PDU использует не "сырые" json-данные, а их объектное представление. Например, для включения порта методом port_up в качестве параметра передаётся объект класса PduPortView cо свойствами:
- identify — идентификатор порта PDU;
- power_status — состояние порта PDU в DCImanager 6.
В ответе ожидается объект того же класса с текущим состоянием порта в свойстве power_status.
Методы для обработки статистики потребляемой мощности порта
Чтобы обработчик работал со статистикой потребляемой мощности порта PDU, вы можете использовать один из двух вариантов метода PduPortStatisticView:
- текущую потребляемую мощность порта в кВт·ч:
PduPortStatisticView( port_identity=port.oid_index, port_consumption=port.value_float, ) - потребляемую мощность порта в кВт·ч, значение которой увеличивается со временем:
PduPortStatisticView( port_identity=port.oid_index, port_consumption_incr=port_energy.value_float, )
Для получения общей суммы потребляемой мощности всех портов используйте методы:
- для обработчиков с
consumption:
pdu_statistic.total_consumption = pdu_statistic.sum_ports_consumption() - для обработчиков с
consumption_incr:
pdu_statistic.total_consumption_incr = pdu_statistic.sum_ports_consumption()
Пример кода обработчика
Загрузка обработчика в платформу
Чтобы загрузить обработчик в платформу:
-
Создайте директорию со следующей структурой:
handler_dir/ ├── __init__.py └── my_handler.pyПояснения -
Создайте архив tar.gz с этой директорией:
tar -czvf custom_handler.tar.gz handler_dirПояснения к команде -
Авторизуйтесь в DCImanager 6 с правами администратора:
curl -o- -k https://example.com/api/auth/v4/public/token \ -H "isp-box-instance: true" \ -d '{ "email": "<admin_email>", "password": "<admin_pass>" }'Пояснения к командеВ ответ придёт сообщение вида:
{"id":"24","token":"24-cee181d2-ccaa-4b64-a229-234aa7a25db6"}Сохраните из полученного ответа значение параметра token — токена авторизации.
-
Создайте описание для обработчика:
curl -o- -k https://example.com/api/eservice/v3/custom_equipment \ -H "isp-box-instance: true" \ -H "x-xsrf-token: <token>" \ -d '{ "device_type": "<device>", "handler": "<internal_handler_name>", "name": "<handler_name>", "protocol": ["<handler_protocol>"], "features": [] }'Пояснения к командеОтвет будет содержать id созданного разработчика. Сохраните это значение.
Пример ответа{"id": 1} -
Загрузите архив с обработчиком в платформу:
curl -o- -k https://example.com/api/eservice/v3/custom_equipment/<handler_id>/content \ -H "isp-box-instance: true" \ -H "x-xsrf-token: <token>" \ -F "data=@custom_handler.tar.gz" \ -F "handler_import=<import_path>"Пояснения к командеВы также можете использовать эту команду для загрузки новых версий обработчика в платформу.
Связанные статьи: