4.4. Руководство по инсталляции адаптеров

4.4.1. Назначение и общий функционал работы с адаптерами

Адаптер
Представляет собой веб-сервис доступа к данным приложения или базы данных, связанных с Системой.

Для работы с Системой необходимо установить следующие адаптеры:

  • Адаптер БД.

Следующий список адаптеров является опциональным и может быть установлен в случае необходимости:

  • Адаптер Remedy.
  • Адаптер LDAP.
  • Адаптер полнотекстового поиска Solr.
  • Адаптер CMDB.

Использование адаптеров в системе лицензируется. Установка лицензии описана в Раздел 4.3 Руководства по инсталляции.

4.4.2. Установка адаптера

Примечание

Можно установить и настроить несколько экземпляров одного адаптера. Подробнее см. Установка и настройка нескольких экземпляров одного адаптера.

Для установки адаптера необходимо сначала установить Docker и Vault.

Подробнее об установке и настройке Docker можно посмотреть здесь: https://docs.docker.com/get-started/.

Подробнее об установке и настройке Vault см. Руководство по инсталляции сервиса системных настроек Vault.

Если реестр Docker, содержащий образ соответствующего адаптера, недоступен или отсутствует, тогда необходимо скачать образ соответствующего адаптера из архивного файла, выполнив в командной строке команду:

docker load -i /path/to/image.tar.gz

Здесь:

/path/to/image.tar.gz
Пример пути к архиву с образом соответствующего адаптера.

Если реестр Docker, содержащий образ соответствующего адаптера, доступен, тогда для установки адаптера сначала нужно войти в реестр Docker, выполнив в командной строке команду:

docker login registry.igtel.ru:6443

При входе необходимо ввести логин и пароль.

После этого нужно скачать образ соответствующего адаптера:

registry.igtel.ru:6443/sgate/integration
Образ адаптера Remedy.
registry.igtel.ru:6443/sgate/integration_ldap
Образ адаптера LDAP.
registry.igtel.ru:6443/sgate/integration_db
Образ адаптера БД.
registry.igtel.ru:6443/sgate/integration-solr
Образ адаптера полнотекстового поиска (Solr).
registry.igtel.ru:6443/sgate/integration_cmdb
Образ адаптера CMDB.

Например, для того, чтобы скачать образ адаптера Remedy необходимо выполнить в командной строке команду:

docker pull registry.igtel.ru:6443/sgate/integration

После того как образ скачан (из архивного файла или из реестра Docker), необходимо запустить контейнер, выполнив в командной строке команду в многострочном формате (после символа

\

должен быть перенос строки без пробелов и других символов):

docker run -d \
--env sgate.server.host=0.0.0.0 \
--env sgate.server.port=8082 \
--env sgate.vault.url=http://devops.igtel.ru:8200 \
--env sgate.vault.token=s.xRYEe6FCAHn1DAdOAqodkz4Z \
--env sgate.vault.engine=sgate \
--env sgate.vault.version=2 \
--env sgate.vault.sources="common remedy" \
-p 8082:8082 --name sgate_integration \
registry.igtel.ru:6443/sgate/integration

Здесь:

sgate.server.host
Хост сервиса в контейнере.
sgate.server.port
Порт сервиса в контейнере. Можно выбрать любой свободный порт в Системе.
sgate.vault.url
URL сервиса Vault с конфигурацией сервиса.
sgate.vault.token
Токен для логина в Vault.
sgate.vault.engine
Название Vault engine, где хранятся настройки.
sgate.vault.version
Версия хранилища Vault.
sgate.vault.sources
Список секретов (secrets), которые будут использоваться сервисом. В примере это секреты «common» и «remedy». Cекреты в списке разделяются пробелом. Секреты подгружаются в порядке, указанном в списке. Если секреты содержат одинаковые ключи, то значение для ключа берется из последнего секрета, в котором найден ключ. Таким образом, можно выделить общие настройки и переопределять их для нужных сервисов.
8082:8082
Указываются номер порта на сервере и номер порта в контейнере (порт на сервере маппится на порт в контейнере).
name
Указывается название контейнера, для использования этого названия при обращении (вместо идентификатора). В примере это «sgate_remedy».
registry.igtel.ru:6443/sgate/integration
Образ соответствующего адаптера. В примере это образ адаптера Remedy.

4.4.3. Общая настройка всех сервисов

Общая настройка всех сервисов заключается в добавлении общих для всех сервисов ключей и их значений в соответствующий секрет Vault.

Описание общих ключей см. Общая настройка всех сервисов.

4.4.4. Настройка адаптеров

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

4.4.4.1. Настройка адаптера Remedy

Для адаптера Remedy необходимо добавить следующие ключи в секрет/секреты Vault:

remedy.area.secret
Токен для аутентификации в Remedy.
remedy.area.with-salt
Использовать «соль» при формировании токена.
remedy.uri
URL для подключения к Remedy.
user-info.cache.initial-capacity
Начальный размер кеша UserInfo (шт)
user-info.cache.maximum-size
Максимальный размер кеша UserInfo (шт)
user-info.cache.reload-period
Период обновления кеша

Пример заполнения ключей для адаптера Remedy:

{
"remedy.area.secret": "passwd",
"remedy.area.with-salt": "true",
"remedy.uri": "remedy://appadmin:appadmin@example.ru:5555",
"user-info.cache.initial-capacity": "32",
"user-info.cache.maximum-size": "1024",
"user-info.cache.reload-period": "PT15M"
}

4.4.4.2. Настройка адаптера LDAP

Для адаптера LDAP необходимо добавить следующие ключи в секрет/секреты Vault:

ldap.connections
Количество параллельных подключений.
ldap.url
URL LDAP.
ldap.customers
настройка групп пользователей (из разных тенантов) с соответствующими им настройками
expirationDate (ldap.customers)
срок действия соли (unixtime в секундах)
salt (ldap.customers)
соль для проверки токена
tenant (ldap.customers)
название тенанта
ldap.customers.cache
настройки кеширования пользователей
ldap.customers.cache.initial-capacity
Начальный размер кеша
ldap.customers.cache.maximum-size
Максимальный размер кеша
ldap.customers.cache.reload-period
Период обновления данных в кеше
roles
маппинг ролей пользователя портала на логин/пароль пользователя ldap.

Пример заполнения ключей для адаптера LDAP:

{
"ldap.connections": "10",
"ldap.url": "ldap.example.ru:389",
"ldap.customers": [
  {
    "expirationDate": 1693515600,
    "roles": [
      {
        "role": "any",
        "username": "%ldap_user_name%",
        "password": "%ldap_password%"
      }
    ],
    "salt": "...",
    "tenant": "default"
  }
],
"ldap.customers.cache.initial-capacity": "32",
"ldap.customers.cache.maximum-size": "256",
"ldap.customers.cache.reload-period": "PT15M"
}

4.4.4.3. Настройка адаптера БД

Для адаптера БД необходимо добавить следующие ключи в секрет/секреты Vault:

cache.concurrency-level
Настройка параллельного доступа к кэшу для операций обновления. Подробнее: https://guava.dev/releases/18.0/api/docs/com/google/common/cache/CacheBuilder.html#concurrencyLevel(int).
cache.expire-after-write
Время жизни кэша в формате ISO 8601.
cache.initial-capacity
Начальный размер кэша.
cache.maximum-size
Максимальный размер кэша.
datasource.access-handler
Класс обработчика доступа к БД.
datasource.default-generator
Определяет способ генерации ID записи.
datasource.dialect
Класс диалекта БД.
datasource.driver
Класс драйвера БД.
datasource.jdbc-url
JDBC URL БД.
datasource.username
Логин к БД.
datasource.password
Пароль к БД.
schema.prefix
Префикс названия таблиц для генерации схемы.
schema-api.datasource.driver
Драйвер БД метаданных для управляемых схем.
schema-api.datasource.jdbc-url
URL БД метаданных для управляемых схем.
schema-api.datasource.username
Имя пользователя БД метаданных для управляемых схем.
schema-api.datasource.password
Пароль пользователя БД метаданных для управляемых схем.
schema-api.enabled
Параметр позволяет включать (true) и отключать (false) поддержку создания схем по метаданным

Пример заполнения ключей для адаптера БД:

{
"cache.concurrency-level": "8",
"cache.expire-after-write": "PT30S",
"cache.initial-capacity": "32",
"cache.maximum-size": "1024",
"datasource.access-handler": "ru.igtel.sgate.adapter.db.accessHandlers.DBAccessHandler",
"datasource.dialect": "ru.igtel.ms.camel.sql.DBHelper",
"datasource.driver": "org.dbsql.Driver",
"datasource.jdbc-url": "jdbc:dbsql://db.example.ru:5432/sgate_db",
"datasource.password": "passwd",
"datasource.username": "login",
"schema.prefix": "custom",
"schema-api.datasource.driver": "org.postgresql.Driver",
"schema-api.datasource.jdbc-url": "jdbc:postgresql://ci.igtel.ru:5432/sgate_db",
"schema-api.datasource.username": "username",
"schema-api.datasource.password": "password",
"schema-api.enabled": "true"
}

4.4.4.4. Настройка адаптера полнотекстового поиска

Для адаптера полнотекстового поиска необходимо добавить следующие ключи в секрет/секреты Vault:

security.adapter.username
Логин к адаптеру Remedy.
security.adapter.password
Пароль к адаптеру Remedy.
security.adapter.url
URL к адаптеру Remedy.
security.salt.period
Период кеширования «соли» к адаптеру Remedy в формате ISO 8601.
solr.username
Логин к Solr.
solr.password
Пароль к Solr.
solr.url
URL к серверу Solr.

Пример заполнения ключей для адаптера полнотекстового поиска:

{
"security.adapter.password": "passwd",
"security.adapter.url": "http://integration.example.ru:8082",
"security.adapter.username": "login",
"security.salt.period": "PT5H",
"solr.password": "SolrRocks",
"solr.uri": "http://solr.example.ru:8983/solr",
"solr.username": "solr"
}

4.4.4.5. Настройка адаптера CMDB

Для адаптера CMDB необходимо добавить следующие ключи в секрет/секреты Vault:

graph.ci.name
Поле CMDB, в котором хранится название Базы знаний.
graph.cluster-conf
Конфигурация кластера Gremlin-сервера. Подробнее см. http://tinkerpop.apache.org/docs/current/reference/#_configuration.
graph.database.conf
Конфигурация подключения к OrientDB с помощью Gremlin. Подробнее см. https://orientdb.com/docs/3.0.x/tinkerpop3/OrientDB-TinkerPop3.html.
graph.database.entry-prefix
Префикс названий вершин и граней в графе CMDB.
graph.identifier
Поле CMDB, в котором хранится идентификатор Базы знаний.
graph.traversal-label
Название переменной для обхода графа в скриптах.

Пример заполнения ключей для адаптера CMDB:

{
"graph.ci.name": "Instance Name",
"graph.cluster-conf": {
    "hosts": [
    "localhost"
    ],
    "password": "passwd",
    "port": "8182",
    "username": "login"
},
"graph.database.conf": {
    "gremlin.graph": "org.apache.tinkerpop.gremlin.orientdb.OrientFactory",
    "orient-pass": "passwd",
    "orient-transactional": "true",
    "orient-url": "remote:cmdb.example.ru/cmdb",
    "orient-user": "login"
},
"graph.database.entry-prefix": "",
"graph.identifier": "UUID",
"graph.traversal-label": "g"
}

4.4.5. Установка и настройка нескольких экземпляров одного адаптера

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

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

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

Все экземпляры адаптера устанавливаются аналогично (см. Установка адаптера). Для каждого экземпляра адаптера будет создан свой контейнер. Для каждого экземпляра адаптера нужно выполнить настройку: в зависимости от целей создания дополнительного экземпляра адаптера для него необходимо создать новые секреты в Vault или использовать уже существующие.

4.4.5.1. Установка и настройка нескольких экземпляров адаптера с одинаковым набором настроек

Установка и настройка нескольких экземпляров адаптера с одинаковым набором настроек рассмотрена ниже на примере установки и настройки двух экземпляров адаптера БД с одинаковым набором настроек.

Сначала необходимо выполнить общую настройку всех сервисов (в том числе и всех создаваемых экземпляров БД), то есть добавить общие для всех сервисов ключи и их значения в соответствующий секрет Vault.

В примере это секрет «common» с общими настройками:

{
"basic.password": "passwd",
"basic.username": "login",
"jwt.algorithm": "HS512",
"jwt.key": "4bAKMH0ob8d2v4m0yOLuI/18psZgEo45AXnOQ9d9rd5Yzux4CnL5f1POQmrjJLCfg7Pn+8Ohqb8mGjlA/15Ciw==",
"ssl.enabled": "true",
"ssl.store-path": "keystore.jks",
"ssl.store-pass": "storepasswd",
"ssl.key-pass": "keypasswd"
}

Описание общих ключей см. Общая настройка всех сервисов.

Затем необходимо создать секрет в Vault с настройками БД. В примере это секрет «db».

Секрет «db» с настройками БД:

{
"cache.concurrency-level": "8",
"cache.expire-after-write": "PT30S",
"cache.initial-capacity": "32",
"cache.maximum-size": "1024",
"datasource.access-handler": "ru.igtel.sgate.adapter.db.accessHandlers.DBAccessHandler",
"datasource.dialect": "ru.igtel.ms.camel.sql.DBHelper",
"datasource.driver": "org.dbsql.Driver",
"datasource.jdbc-url": "jdbc:dbsql://db.example.ru:5432/sgate_db",
"datasource.password": "passwd",
"datasource.username": "login",
"schema.prefix": "custom"
}

Описание ключей для адаптера БД см. Настройка адаптера БД.

Затем необходимо загрузить образ адаптера БД (см. Установка адаптера).

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

Запуск контейнера с первым адаптером:

docker run -d \
--env sgate.server.host=0.0.0.0 \
--env sgate.server.port=8083 \
--env sgate.vault.url=http://vault.example.ru:8200 \
--env sgate.vault.token=s.xRYEe6FCAHn1DAdOAqodkz4Z \
--env sgate.vault.engine=sgate \
--env sgate.vault.version=2 \
--env sgate.vault.sources="common db" \
-p 8083:8083 --name sgate_db1 \
registry.igtel.ru:6443/sgate/integration_db

Запуск контейнера со вторым адаптером:

docker run -d \
--env sgate.server.host=0.0.0.0 \
--env sgate.server.port=8084 \
--env sgate.vault.url=http://vault.example.ru:8200 \
--env sgate.vault.token=s.xRYEe6FCAHn1DAdOAqodkz4Z \
--env sgate.vault.engine=sgate \
--env sgate.vault.version=2 \
--env sgate.vault.sources="common db" \
-p 8084:8084 --name sgate_db2 \
registry.igtel.ru:6443/sgate/integration_db

В результате будут установлены и настроены два экземпляра адаптера БД с одинаковым набором настроек, которые хранятся в секретах «common» и «db».

4.4.5.2. Установка и настройка нескольких экземпляров адаптера с разным набором настроек

Установка и настройка нескольких экземпляров адаптера с разным набором настроек рассмотрена ниже на примере установки и настройки двух экземпляров адаптера БД с разным набором настроек.

Сначала необходимо выполнить общую настройку всех сервисов (в том числе и всех создаваемых экземпляров БД), то есть добавить общие для всех сервисов ключи и их значения в соответствующий секрет Vault.

В примере это секрет «common» с общими настройками:

{
"basic.password": "passwd",
"basic.username": "login",
"jwt.algorithm": "HS512",
"jwt.key": "4bAKMH0ob8d2v4m0yOLuI/18psZgEo45AXnOQ9d9rd5Yzux4CnL5f1POQmrjJLCfg7Pn+8Ohqb8mGjlA/15Ciw==",
"ssl.enabled": "true",
"ssl.store-path": "keystore.jks",
"ssl.store-pass": "storepasswd",
"ssl.key-pass": "keypasswd"
}

Описание общих ключей см. Общая настройка всех сервисов.

Затем необходимо создать два секрета в Vault с настройками БД для двух экземпляров БД. В примере это секреты «db1» и «db2».

Секрет «db1» с настройками БД:

{
"cache.concurrency-level": "8",
"cache.expire-after-write": "PT30S",
"cache.initial-capacity": "32",
"cache.maximum-size": "1024",
"datasource.access-handler": "ru.igtel.sgate.adapter.db.accessHandlers.DBAccessHandler",
"datasource.dialect": "ru.igtel.ms.camel.sql.DBHelper",
"datasource.driver": "org.dbsql.Driver",
"datasource.jdbc-url": "jdbc:dbsql://db1.example.ru:5432/sgate_db",
"datasource.password": "passwd1",
"datasource.username": "login1",
"schema.prefix": "custom"
}

Секрет «db2» с настройками БД:

{
"cache.concurrency-level": "8",
"cache.expire-after-write": "PT30S",
"cache.initial-capacity": "32",
"cache.maximum-size": "1024",
"datasource.access-handler": "ru.igtel.sgate.adapter.db.accessHandlers.DBAccessHandler",
"datasource.dialect": "ru.igtel.ms.camel.sql.DBHelper",
"datasource.driver": "org.dbsql.Driver",
"datasource.jdbc-url": "jdbc:dbsql://db2.example.ru:5432/sgate_db",
"datasource.password": "passwd2",
"datasource.username": "login2",
"schema.prefix": "custom"
}

Описание ключей для адаптера БД см. Настройка адаптера БД.

Затем необходимо загрузить образ адаптера БД (см. Установка адаптера).

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

Запуск контейнера с первым адаптером:

docker run -d \
--env sgate.server.host=0.0.0.0 \
--env sgate.server.port=8083 \
--env sgate.vault.url=http://vault.example.ru:8200 \
--env sgate.vault.token=s.xRYEe6FCAHn1DAdOAqodkz4Z \
--env sgate.vault.engine=sgate \
--env sgate.vault.version=2 \
--env sgate.vault.sources="common db1" \
-p 8083:8083 --name sgate_db1 \
registry.igtel.ru:6443/sgate/integration_db

Запуск контейнера со вторым адаптером:

docker run -d \
--env sgate.server.host=0.0.0.0 \
--env sgate.server.port=8084 \
--env sgate.vault.url=http://vault.example.ru:8200 \
--env sgate.vault.token=s.xRYEe6FCAHn1DAdOAqodkz4Z \
--env sgate.vault.engine=sgate \
--env sgate.vault.version=2 \
--env sgate.vault.sources="common db2" \
-p 8084:8084 --name sgate_db2 \
registry.igtel.ru:6443/sgate/integration_db

В результате будут установлены и настроены два экземпляра адаптера БД с разным набором настроек:

  • У первого экземпляра адаптера БД настройки хранятся в секретах «common» и «db1».
  • У второго экземпляра адаптера БД настройки хранятся в секретах «common» и «db2».

4.4.6. Настройка трансформаций в адаптерах

Трансформация позволяет корректно преобразовывать запросы к адаптеру в запросы к источнику данных и обратно - ответ источника данных в ответ адаптера. С помощью трансформаций можно преобразовать:

  • Название схемы.
  • Названия полей.
  • Типы данных.

Трансформации описываются в формате JSON. Для каждой схемы, требующей трансформации, создается JSON-файл с описанием правил трансформации. Название файла должно быть следующего формата:

%schema_alias%.json

где «%schema_alias%» - это название схемы в Системе (например, incidents.json).

Для добавления JSON-трансформаций нужно подключить папку с JSON-файлами трансформаций на сервере к папке /app/resources/transform в контейнере. Для этого при запуске контейнера из консоли нужно использовать параметр -v:

-v /path/to/transform:/app/resources/transform

После того как адаптер получает запрос, он ищет трансформацию для соответствующей схемы (т.е. в папке /app/resources/transform адаптер ищет JSON-файл, содержащий в своем названии соответствующее название схемы).

Если трансформация не найдена, то названия полей и схемы используются как есть, а преобразование типов данных выполняется драйвером источника данных. Если трансформация найдена, то запрос и ответ преобразуются в соответствии с правилами трансформации. Названия полей, не описанные в правилах, используются как есть, а типы данных в этих полях преобразуются драйвером источника данных.

4.4.6.1. Пример JSON-файла трансформации

JSON-файл трансформации можно рассмотреть на следующем примере:

{
  "properties": {
   "schema": "incidents",
   "key": "incident_number",
   "generator": "DB_MANAGED"
  },
 "fields": {
   "id": {
    "alias": "incident_number",
   "type": "varchar",
    "type_out": "varchar"
  },
 "created": {
   "alias": "create_date",
   "type": "timestamp"
 },
 "priority": {
   "type": "integer"
 },
 "status": "integer"
}
}

Здесь:

properties
Указываются различные параметры трансформации. На текущий момент доступен только обязательный параметр «schema» - название схемы источника данных.
generator

Указывает способ генерации ID записи. Параметр принимает следующие значения:

  • DB_MANAGED - значение генерируется БД (автоинкремент и др.)
  • UUIDv4 - значение генерируется адаптером в формате UUIDv4
  • DISABLE - генерация запрещена, ID должен быть задан в явном виде клиентом или иным способом

Для индивидуальной настройки генератора в отдельно взятой схеме в свойствах трансформации можно указать используемый тип генератора. Параметр необязателен. По умолчанию в адаптере генерация ID запрещена (DISABLE).

schema
Указывается схема данных маппинга
key
Указывается одно поле источника данных в качестве идентификатора.
Если параметр key не задан, в качестве ключа будет использовано поле с названием id.
fields

В объекте описывается маппинг полей и их типы. Ключами объекта fields являются названия полей источника данных (адаптера), а значениями - объект с описанием поля, где:

  • alias - (необязательное) название поля в Системе. Если не указано, то название поля в системе совпадает с названием в источнике данных.
  • type - тип поля в источнике данных
  • type_out - (необязательное) тип поля в Системе. Если не указан, то тип поля в системе совпадает с типом в источнике данных.

Также возможна упрощенная запись маппинга, когда вместо объекта с описанием поля указывается только тип поля. Например, определение поля:

"status": "integer"

эквивалентно записи в полной форме

"status": {
"alias": "status",
"type": "integer",
"type_out": "integer"
}

4.4.6.2. Поддерживаемые типы данных для БД

Поддерживаются следующие типы данных для БД:

  • Текстовые типы данных:

    • char,
    • varchar,
    • longvarchar.
  • Числовые типы данных:

    • bit,
    • tinyint,
    • smallint,
    • integer,
    • bigint,
    • real,
    • float,
    • double,
    • numeric
    • decimal.
  • Дата/время:

    • date,
    • time,
    • timestamp.
  • Другие типы данных:

    • clob,
    • blob,
    • uuid.

4.4.6.3. Стратегии обработки ошибок при трансформации данных

При применении правил трансформации возможны ошибки. В адаптере БД применяются следующие стратегии обработки ошибок:

  • Стратегии для правил (если правило не найдено):

    • THROW_ERROR - выдавать ошибку (по умолчанию)
    • PASS_THROUGH - пропускать данные без трансформации
  • Стратегии для полей (если поле не определено в конфигурации):

    • KEEP_ORIGINAL - пропускать данное поле без трансформации
    • IGNORE - игнорировать поле и его значение (по умолчанию)
    • THROW_ERROR - выдавать ошибку
  • Стратегии для данных (если трансформация данных завершилась ошибкой):

    • KEEP_ORIGINAL - пропустить значение без трансформации
    • SET_NULL - установить в NULL
    • THROW_ERROR - выдавать ошибку (по умолчанию)
    • STRINGIFY - преобразовать в строку

Применение правил не по умолчанию требует адаптации/доработки адаптера. Осуществляется разработчиком ПО.