API багзиллы для внешних систем
В процессе работ по TN-ERP встала необходимость получения из Bugzilla следующих данных:
Contents
- 1 По набору багов получить ряд полей
- 2 Получить все продукты по имени классификации
- 3 Создать/изменить/удалить задачу WBS
- 4 Изменить привязку задачи WBS к продуктам
- 5 Для заданного продукта и задачи WBS запретить/разрешить изменять баг
- 6 Получить информацию о пользователе/пользователях
- 7 Интерфейс
- 8 Авторизация
По набору багов получить ряд полей
(Имена полей, идентификаторы багов) → (множество значений полей)
Проще всего дёрнуть урл вида:
http://bugs.office.custis.ru/bugs/show_bug.cgi?id=<ID1>&id=<ID2>&ctype=xml&includefield=<FIELD1>&includefield=<FIELD2>&includefield=<FIELD3>
То есть параметры следующие:
- ID багов передаются как id=1&id=2&id=3&…
- Параметр ctype=xml
- Имена полей передаются как includefield=field1&includefield=field2&…
Получить все продукты по имени классификации
Например, «TradeNets». (Имя классификации) → множество (ID продуктов, имена продуктов)
- Метод: Product.get_products_by_classification(classification=Имя_классификации)
- Ответ:
<status>ok</status><products><i><id>ID продукта</id><name>Имя продукта</name></i>...</products>
Создать/изменить/удалить задачу WBS
(Имя задачи, sortkey, add) → статус {ok, alreadyexists}
- Метод: Field.add_value(field=cf_wbs&value=Имя_задачи&sortkey=Сорткей)
- Ответ: <status>ok</status><id>ID созданного значения</id>
- Ответ: <status>value_already_exists</status>
(Старое имя задачи, Новое имя задачи, новый sortkey, update) → статус {ok, notexists}
При переименовании переименовывается значение во всех багах.
- Метод: Field.update_value(field=cf_wbs&old_value=Старое_имя&new_value=Новое_имя&sortkey=Новый_сорткей)
- Ответ: <status>value_not_found</status>
- Ответ: <status>value_already_exists</status> (если то, во что переименовываем, уже существует)
- Ответ: <status>ok</status><id>ID обновлённого значения</id>
(Имя задачи, delete) → статус {ok, notexists, hasbugs}
Удаление разрешается только если нет багов с этой задачей.
- Метод: Field.update_value(field=cf_wbs&old_value=Старое_имя&new_value=Новое_имя&sortkey=Новый_сорткей)
- Ответ: <status>value_not_found</status>
- Ответ: <status>fieldvalue_still_has_bugs</status> (если ещё есть баги с этой задачей)
- Ответ: <status>ok</status>
Изменить привязку задачи WBS к продуктам
Добавить/удалить задачу WBS к продукту
(Имя задачи, ID продуктов) → статус {ok, wbsnotexists, productnotexists, nochanges}
То есть ok=добавлена/удалена, nochanges=уже добавлена/удалена, wbsnotexists=задачи нет, productnotexists=продукта нет
- Метод: Field.set_visibility_values(field=cf_wbs&value=Имя_задачи&ids=ID_продукта&ids=ID_продукта&…)
- Ответ: <status>value_not_found</status>
- Ответ: <status>ok</status><ids><i>Установленный в результате ID продукта</i><i>ещё ID</i>...</ids>
Для заданного продукта и задачи WBS запретить/разрешить изменять баг
(ID продукта, имя задачи, действие = {permit, deny}) → статус {ok, wbsnotexists, productnotexists, nochanges}
Получить информацию о пользователе/пользователях
- (ID пользователя) → (ID пользователя, Login, Имя),
- (Login пользователя) → (ID пользователя, Login, Имя).
- Метод: User.get(ids=ID1&ids=ID2&… или names=Емайл1&names=Емайл2&…)
- Ответ:
<status>ok</status> <users> <i> <real_name>Фомин Стас</real_name> <email>stas@custis.ru</email> <email_enabled>1</email_enabled> <name>stas@custis.ru</name> <id>2</id> <can_login>1</can_login> <login_denied_text /> </i> ... </users>
Интерфейс
Интерфейс выбран REST (просто параметры запроса) в сторону Bugzilla, простой ответный XML-формат обратно. XML-RPC, уже присутствовавший в Bugzilla, отвергнут из-за проблем с обработкой ошибок — сделать нормально можно, но полностью ломается совместимость со штатным XML-RPC, что нехорошо (его у нас используют). Запрос отправляется на URL http://bugs.office.custis.ru/bugs/xml.cgi?method=Сервис.метод. Формат ответа:
- Корневой элемент <response>, содержать может всё что угодно, но как минимум содержит элемент <status> со строковым значением (статус операции).
- В случае любой ошибкий status принимает значение, соответствующее её названию.
- Все значения передаются внутри элементов с соответствующим именем.
- Если значение — хеш (ключ => значение), то в XML это будет последовательность элементов вида <ключ>значение</ключ>.
- Если значение — массив, то в XML это будет последовательность элементов вида <i>значение</i>.
- Если значение — не дай бог, объект (хотя такого в основном встречаться не должно) — то это хеш (поля объекта и их значения), заключённый в элемент <object class="Класс::Объекта">...</object>
- Соответственно все вложенные значения сериализуются так же.
Авторизация
TN-ERP будет ходить под своим пользователем, и будет должна сохранять и в последующих запросах передавать Cookie, устанавливаемую в ответ на запрос:
- Метод: User.login( login=Емайл&password=Пароль&remember=1 )
- Ответ: <status>ok</status><id>ID текущего пользователя</id>
Также надо будет встроиться в систему единой авторизации.
- Глобальная авторизация в веб-системах, URL сервера авторизации Bugzilla http://bugs.office.custis.ru/bugs/globalauth.cgi.
Статья реплицируется в Wiki4IntraNet.