-- Формат 3.0: в нём есть test_dependencies — зависимости проверок, -- которые не ставятся тому, кто берёт пакет для дела. rockspec_format = '3.0' package = 'tnt-ops' version = 'scm-1' source = { url = 'git+https://github.com/tnt-skein/tnt-ops.git', branch = 'main', } description = { summary = 'Действия оператора над кластером Tarantool и их результат по узлам', detailed = [[ Перечитать конфигурацию, перезапустить репликацию, вывести узел из эксплуатации — действия, которые оператор запускает на многих узлах сразу. Тело действия живёт на узле глобальной функцией, а право вызвать его выдаётся конфигурацией кластера, поэтому ни произвольного Lua, ни миграции ради нового действия не нужно. Операция на весь кластер удаётся частично чаще, чем целиком, — поэтому результат всегда карта «узел → что с ним», сводка для человека и признак полноты. Сводка дополняет карту, а не заменяет её: иначе повторить операцию по неудавшимся узлам уже нельзя. Отказ узла — ответ false или пара nil, err — хранит свою причину. Опасные операции выполняются по шагам с откатом, и перед последним, необратимым шагом обстановка проверяется заново: между началом операции и её серединой мир изменился. Бросок шага — такой же отказ, и сделанное откатывается. Вывод узла из эксплуатации — пометка с причиной в хранилище решений (etcd): её видят все узлы, и она обратима. Клиент хранилища приходит аргументом. Контекст действия — опознаватель запроса оператора — едет на узлы последним аргументом вызова, а опубликованные действия его принимают: записи узла связаны с кнопкой, которую нажали. Покрытие строк и убитых мутантов — 100 %. ]], homepage = 'https://github.com/tnt-skein/tnt-ops', issues_url = 'https://github.com/tnt-skein/tnt-ops/issues', maintainer = 'tnt-skein', license = 'MIT', labels = { 'tarantool', 'operations', 'cluster', 'replication', 'etcd', 'rollback' }, } dependencies = { 'lua >= 5.1', -- Перенос контекста действия на узлы последним аргументом вызова. 'tnt-context', -- Обращения к box.cfg внешней зависимостью: проверки подменяют их своими. 'tnt-external', } -- Настоящий клиент нужен только проверкам: сам пакет получает -- его аргументом, а не через require. test_dependencies = { 'tnt-etcd-client', } build = { type = 'builtin', modules = { ['tnt.ops.outcome'] = 'tnt/ops/outcome.lua', ['tnt.ops.actions'] = 'tnt/ops/actions.lua', ['tnt.ops.roster'] = 'tnt/ops/roster.lua', }, }