Использование REST в ENM Ericsson на Python

?v=1

Здравствуйте. Не так давно Ericsson выпустил новую систему управления Ericsson Network Manager (ENM), которая уже успела появится у некоторых операторов сотовой связи. Было бы интересно разобрать некоторые вопросы по работе с ней и, в этой статье, коснёмся вопроса работы с не встречавшимся ранее (в OSS-RC) Northbound Interface, а именно RESTful API. Использовать будем python и библиотеку requests.
Через REST интерфейс доступны такие функции как: администрирование пользователей, CM Bulk Import/Export, Virtual Network Function, управление коллекциями, управление сотами и прочее. В документации ALEX есть достаточно подробные описания возможностей данного API без привязки к языку программирования. В качестве примера попробуем подключиться к NBI Cell Management используя библиотеку requests для python. Описание интерфейса доступно в библиотеке ALEX «Configuration Tasks — CM Cell Management REST Northbound Interface».

Указанный функционал позволяет управлять конфигурацией сот, соседствами между ними, частотными соседствами на узлах LTE, WCDMA и GSM внутри одного ENM. Также возможно управление хэндоверами как в сторону соседних ENM, так и в сторону OSS-RC.
RESTful интерфейс доступен по следующему адресу:

https:///configuration-tasks/v1/tasks


Структура JSON запроса имеет вид:

  • Request URL: «configuration-tasks/v1/tasks»
  • Request Type: POST
  • Content Type: application/json
  • Body: в соответствии с документацией для выбранной команды.


В python воспользуемся объектом Session из библиотеки requests.

import requests
import json
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from requests import Session
from requests.exceptions import HTTPError

class enmRestSession(Session):


Обвешаем его требуемой ENM авторизацией и некоторыми «настройками по-умолчанию».

    def __init__(self, enm, login, password):
        super().__init__()
       # добавляем / если забыли его указать при создании объекта
        self.enm = enm if enm[-1] == "/" else f"{enm}/"
        # устанавливаем заголовки
        self.headers.update({"Content-Type": "application/json"})
        # отключаем проверку https сертификата
        self.verify = False
        # отключаем предупреждения безопасности
        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
        # авторизуем сессию на ENM
        login_str = f"{enm}login?IDToken1={login}&IDToken2={password}"
        rest_response = self.post(login_str)
        # при неудачной авторизации поднимаем исключение
        if rest_response.status_code != requests.codes.ok:
            raise HTTPError()


Оформим метод отправки REST запроса.

    # в качестве параметра передаём в функцию словарь request_body
    def send_configuration_task(self, request_body):
        url = f"{self.enm}configuration-tasks/v1/tasks"
        # отправляем запрос методом POST используя сформированный выше URL 
        resp = self.post(url, data=json.dumps(request_body))
        return resp


Добавим автоматическое закрытие сессии в ENM при использовании контекстного менеджера.

    def __exit__(self, exc_type, exc_val, exc_tb):
        try:
            # для закрытия сессии достаточно послать logout
            self.get(f"{self.enm}logout")
        finally:
            super().__exit__(self, exc_type, exc_val, exc_tb)


Получившуюся небольшую надстройку можно использовать в скриптах для своих нужд. Например получение всех сот узла RNC.

def main():
    param = {"name": "readCells", "fdn": "NetworkElement=RNC01"}
    with enmRestSession(
                        "https://iegtbl8030-7.gtoss.eng.ericsson.se/",
                        "login",
                        "pass"
                       ) as s:
        print(s.send_configuration_task(param).json())


Описание всех возможный запросов есть в указанной выше библиотеке ALEX. Не думаю что могу опубликовать её где-нибудь, но на какие-то вопросы постараюсь ответить. Полный код доступен на GitHub. Спасибо всем кто прочитал.

© Habrahabr.ru