Бібліотека liquibase-ddm-ext
🌐 Цей документ доступний українською та англійською мовами. Використовуйте перемикач у правому верхньому куті, щоб змінити версію. |
1. Проблематика
Для створення фізичної моделі даних реєстру для СКБД PostgreSQL використовується Liquibase.
Liquibase за замовчуванням підтримує функціональність для розгортання та версіонування об’єктів в базі даних, тобто створення або видалення таблиць, створення зв’язків між цими таблицями, створення views та налаштування обмежень (constraints) тощо.
Для цього Liquibase має власний набір конструкцій — change types, кожна з яких визначає певну версію змін до БД, а формується набором XML-тегів. Наприклад, <createTable>
, <dropTable>
, тощо.
Оскільки в рамках Платформи реєстрів Liquibase використовується як єдиний інструмент для роботи з фізичною моделлю даних в PostgreSQL, то його стандартної функціональності не достатньо для покриття всіх сценаріїв роботи з регламентом реєстру.
З огляду на це, було розроблено:
-
liquibase-схему
liquibase-ext-schema
, яка розширює набір стандартних liquibase тегів та атрибутів, новими, специфічними для Платформи -
бібліотеку розширень Liquibase
liquibase-ddm-ext
, що містить програмну обробку XML тегів та атрибутів, доданих уliquibase-ext-schema
, а також модифікує чинну поведінку для тегів та атрибутів, що присутні за замовчуванням.
2. Загальний опис
liquibase-ddm-ext - бібліотека, що розширює функціональність Liquibase і відповідальна за обробку XML-тегів та атрибутів, що можуть використовуватись при моделюванні регламенту реєстру
Дана бібліотека додає обробку нових тегів та атрибутів, специфічних саме для Платформи, а також змінює логіку обробки деяких тегів, що присутні у Liquibase за замовчуванням
3. Принципи реалізації
Дане розширення використовує усі основні принципи та поняття, що надаються за замовчуванням розробникам та користувачам Liquibase (детальніше) та використовує механізми, надані розробникам розширень (приклади інших розширень, створених розробниками Liquibase для відкритого використання: https://github.com/orgs/liquibase/repositories)
4. Сценарії використання
Використовується в рамках пайплайну публікації регламенту (registry-regulation-publication-pipeline) на етапі розгортання дата моделі (стейдж create-schema пайпу registry-regulations-data-model) для заповнення схеми реєстрової БД та створення метаданих, необхідних для генерації data-model сервісів
5. Суміжні компоненти
-
registry-regulation-publication-pipeline - безпосередньо викликає Liquibase-утиліту на етапі публікації регламенту
-
dataplatform-jenkins-agent - імпортує дану бібліотеку у pom.xml для подальшого використання пайплайном публікації регламенту
-
liquibase-ext-schema - розширена XSD-схема liquibase тегів та атрибутів, які можуть використовуватись при розробці реєстру Платформи, включається у всі файли регламенту, які обробляються Liquibase з використанням liquibase-ddm-ext
-
service-generation-utility - генерує сервіси registry-model, registry-rest-api, registry-soap-api, використовуючи схему бази даних, яку наповнює Liquibase з використанням liquibase-ddm-ext
6. Перелік наявних розширень
Назва тегу |
Існує у стандартному Liquibase |
Опис |
|
так |
розширює логіку Liquibase-тегу додавання колонки до існуючої таблиці |
|
ні |
надає можливість створити індекс для попередньо створеного view на репліці БД |
|
ні |
для створення аналітичної view на репліці БД |
|
ні |
для створення метаданих, необхідних для генерації у registry-rest-api ендпоінта збереження декількох сутностей в рамках однієї транзакції |
|
ні |
для створення користувацьких типів даних (доменів) |
|
ні |
для створення між таблицями зв’язку many-to-many, що використовуватиметься при збереженні та отриманні даних |
|
ні |
для створення пошукового критерію з БД за певними параметрами |
|
ні |
для створення простого пошукового критерію (пошук за одним полем з однієї таблиці) |
|
так |
розширює логіку Liquibase-тегу створення нової таблиці |
|
ні |
для створення типів даних ENUM |
|
ні |
для створення розподілених таблиць |
|
ні |
для видалення аналітичної view з репліки БД |
|
так |
Не підтримується Платформою. При використанні тегу |
|
ні |
для видалення користувацьких типів даних (доменів) |
|
ні |
для видалення пошукових критеріїв з БД |
|
ні |
для видалення типів даних ENUM |
|
ні |
для створення метаданих, необхідних для генерації у registry-rest-api ендпоінтів пошукових критеріїв, доступних для виклику з зовнішніх систем |
|
ні |
для видачі прав на усі аналітичні view |
|
ні |
для видачі прав на окрему view |
|
ні |
для визначення існуючої таблиці об’єктом (додаються посилання на таблицю subject, що створена попередньо) |
|
так |
розширює логіку Liquibase-тегу зміни типу даних колонки таблиці |
|
ні |
для створення метаданих, необхідних для генерації у registry-rest-api ендпоінтів часткового оновлення сутності у БД (лише деяких визначених колонок) |
|
ні |
для створення метаданих, необхідних для керування доступом до registry-rest-api ендпоінтів для визначених ролей |
|
ні |
для створення reference-таблиці |
|
так |
розширює логіку Liquibase-тегу перейменування колонки таблиці |
|
ні |
для видалення прав на усі аналітичні view |
|
ні |
для видалення прав на окрему view |
|
ні |
для застосування правил Row-Level Security до роботи з даними у таблиці |
|
ні |
для створення метаданих, необхідних для генерації у registry-rest-api коректних запитів на читання даних (з вкладеними сутностями/без і т.д) |
|
ні |
для видалення локальних даних після створення розподіленої таблиці |
|
ні |
для відміни функції розподілення таблиці |
7. Діаграми
У загальному процесі розгортання моделі даних пайплайном публікації регламенту, виконання необхідних Liquibase-скриптів розширенням, відбувається на етапі Створення схеми БД (стейдж create-schema)
Приклад пайпу публікації дата-моделі у Jenkins, liquibase-ddm-ext викликається на етапі create-schema
![data model pipe](../../../_images/architecture/libraries/liquibase-ddm-ext/data-model-pipe.png)
Діаграма, що відображає приблизну структуру пакетів у розширенні, а також основні точки, через які відбувається розширення основної функціональності Liquibase (класи AbstractChange, CreateTableChange і т.д)
8. БД
Окрім створення власне схеми бази даних, liquibase-ddm-ext також заповнює таблиці з метаданими, необхідними для коректної генерації registry-сервісів
Таблиці, в які потрапляють ці метадані: ddm_liquibase-metadata
, ddm_rls_metadata
, ddm_role_permission
.
8.1. ddm_liquibase_metadata
Таблиця для метаданих, що не потребують структури, виділеної в окрему таблицю
8.1.1. Структура таблиці
CREATE TABLE public.ddm_liquibase_metadata (
metadata_id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
change_type TEXT NOT NULL,
change_name TEXT NOT NULL,
attribute_name TEXT NOT NULL,
attribute_value TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL,
CONSTRAINT pk_ddm_liquibase_metadata PRIMARY KEY (metadata_id)
);
8.1.2. Призначення колонок таблиці
Назва колонки |
Призначення |
Приклад |
|
тип метаінформації |
search_condition |
|
до якого об’єкта відноситься метаінформація |
назва критерію пошуку |
|
назву одного атрибуту вказаного change |
pagination |
|
значення для вказаного атрибуту |
limit |
8.2. ddm_rls_metadata
Таблиця, що зберігає інформацію про Row-Level Security правила, що мають застосовуватись до запитів registry-rest-api
8.2.1. Структура таблиці
CREATE TABLE public.ddm_rls_metadata (
rls_id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name TEXT NOT NULL,
type TEXT NOT NULL,
jwt_attribute TEXT NOT NULL,
check_column TEXT NOT NULL,
check_table TEXT NOT NULL,
CONSTRAINT pk_ddm_rls_metadata PRIMARY KEY (rls_id)
);
8.2.2. Призначення колонок таблиці
Назва колонки |
Призначення |
Приклад |
name |
назва зміни правила |
write_rls_katottg |
type |
до якої операції має застосовуватись |
write |
jwt_attribute |
атрибут jwt-токену, в якому знаходиться необхідна для перевірки інформація |
katottg_jwt_attr |
check_table |
таблиця, до якої застосовується RLS |
katottg_table |
check_column |
колонка таблиці, значення з якої будуть перевірятись для RLS |
katottg_value |
8.3. ddm_role_permission
Таблиця, що зберігає інформацію про параметри доступу до даних за RBAC
8.3.1. Структура таблиці
CREATE TABLE public.ddm_role_permission (
permission_id INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
role_name TEXT NOT NULL,
object_name TEXT NOT NULL,
column_name TEXT,
operation TYPE_OPERATION NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() NOT NULL,
CONSTRAINT pk_ddm_role_permission PRIMARY KEY (permission_id)
);
8.3.2. Призначення колонок таблиці
Назва колонки |
Призначення |
Приклад |
role_name |
роль користувача, для якої виконується налаштування |
officer |
object_name |
назва об’єкту, доступ до якого обмежується |
назва таблиці чи критерію пошуку |
column_name |
атрибут об’єкту, доступ до якого обмежується |
колонка таблиці чи критерію пошуку |
operation |
тип операції (читання, запис і т.д) |
S / I / U / D |