Описание настроек сервера выполнения задач taskServer.json

Описание

В ALEPIZ можно создавать задачи, которые состоят из последовательности действий и планировать их выполнение в том числе и в зависимости от определенных условий. Условием для выполнения задач может быть возвращаемое счетчиком значение, которое при преобразовании в тип Boolean интерпретируется как true. Для того, чтобы можно было установить зависимость выполнения задачи от возвращаемого счетчиком значения, в действии Counter settings для этого счетчика необходимо включить флажок Condition for task.

Например, можно создать счетчик Start of maintenance period (Начало периода обслуживания), который будет принимать значение true после того, как сервис остановится, система ротации логов упакует лог файлы и система резервного копирования скопирует необходимые данные. От этого счетчика можно устанавливать зависимость для задачи по обновлению сервиса, которая скопирует новые исполняемые файлы и исправит файл конфигурации сервиса в соответствии с правилами для новой версии сервиса.

Для отслеживания условий запуска задач, служит сервер выполнения задач. Он запускается в отдельном потоке, получает по сети данные от сервера Counter processor и, при выполнении условий, запускает задачи на выполнение. Подробнее о задачах можно почитать в справке к действию Task maker.

Настройки сервера

  • disable (true|false) - с помощью этой настройки можно отключить сервер задач, например для распределения нагрузки между несколькими экземплярами ALEPIZ. По умолчанию false.
  • localAddress - IP адрес к которому будет привязан сервер задач. По умолчанию 127.0.0.1.
  • serverAddress - IP адрес, к которому будут подключаться потоки сервера Counter processor. По умолчанию 127.0.0.1.
  • serverPort - TCP порт, который будет слушать сервер и к которому будут подключаться потоки сервера Counter processor. Например, 10166.
  • waitingConditionsTime - интервал времени в миллисекундах, который определяет, как часто будут проверяться условия для запуска задач в зависимости от исторического значения каунтера. По умолчанию - 30000. Можно менять интервал без перезапуска ALEPIZ.
  • dataFile - файл с условиями для выполнения задач. Файл формируется при изменении задачи и загружается при запуске ALEPIZ. По умолчанию taskConditions.json.
  • rolesPriority - массив, в котором перечислены группы пользователей по приоритету в рабочем процессе. При выборе рабочего процесса для пользователя, будет выбрана группа, у которой приоритет выше.
  • workflow - объект для настройки рабочего процесса. Описание настройки рабочего процесса ниже.

Настройка рабочего процесса (workflow)

Настройка рабочего процесса выполняется через файл конфигурации taskServer.json. Использование workflow позволяет организовать оповещение участников рабочего процесса о смене состояния задачи. Это может потребоваться, например, для своевременного подтверждения задачи администраторами, без чего задача не будет выполнена. Кроме того, с помощью workflow можно организовать процесс перемещения задачи между группами для организации рабочего процесса.

Например, подразделение, отвечающее за изменение конфигурации сервисов по запросам от клиентов, формирует новую задачу и сохраняет ее. В соответствии с настройками workflow, задача попадает в группу для проверки и сотрудники получают оповещение о том, что задача ожидает их действий. После проверки, в соответствии с настройками workflow, задача попадает в группу для подтверждения администраторами. Администратор проверяет корректность задачи со своей стороны и подтверждает возможность ее выполнения. Оповещение об этом получают сотрудники, создавшие задачу. После выполнения, подразделения получают оповещение о том, что задача выполнена.

Если настроен переход между задачами с помощью функций workflow, в действии Task maker будет последовательно выполняться поиск группы, в которой присутствуют задачи. Например, если в настройках workflow есть этапы рабочего процесса, в которых описан переход между группами Default group => Task for validation и Task for validation => Business task, то при запуске Task maker сначала будет искать задачи в Default group. Если их там не окажется, он перейдет в группу Task for validation. И если там тоже не окажется задач, перейдет в группу Business task и отобразит ее содержимое.

Для настройки рабочего процесса в файле конфигурации taskServer.json создается объект workflow, который включает себя объекты - соответствующие названиям групп пользователей. Для каждой группы пользователей можно настроить свой рабочий процесс. Если пользователь входит в несколько групп, в файле конфигурации можно создать массив rolesPriority, в котором перечислить группы пользователей по приоритету. Тогда для определения рабочего процесса пользователя будет выбрана группа, у которой приоритет выше.

  • settings Пример настройки рабочего процесса для группы Administrators (нажмите для того, чтобы развернуть)
    "rolesPriority": ["Administrators", "Businesses", "Watchers", "Guests"],
    "workflow": {
        "Administrators": [{
            "action": "change",
            "changeGroup": "Default group, Business tasks",
            "actionDescription": "Submit a task for review to administrators in the Business tasks group"
            "message": {
                "priority": 20,
                "rcpt": "Administrators",
                "configID": "createTask"
            }
        }, {
            "action":"approve",
            "actionDescription": "Task approved",
            "message": {
                "priority": 20,
                "rcpt": "Administrators, Businesses",
                "configID": "approveTask"
            }
        }]
    }
    

Для каждой группы пользователей формируется массив, элементы которого описывают этапы рабочего процесса. Каждый элемент рабочего процесса должен содержать объекты типа "action" и "message"

Параметр Action

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

  1. approve - происходит, когда администратор одобрил выполнение задачи
  2. change - происходит, когда в задачу вносятся изменения и задача сохраняется с помощью действия Task Maker.
  3. execute - происходит когда задача выполнена
  4. remove - происходит, когда задача удалена
  5. cancel - происходит, когда разрешенная к выполнению задача отменяется администратором.
  6. check - происходит при выполнении проверки задачи в действии Audit

Если для одной группы пользователей настроено несколько параметров action с одинаковыми значениями, производится последовательный перебор всех параметров и поиск среди них подходящего параметра changeGroup, в котором первой присутствует группа, в которой на момент выполнения действия находится задача.

Если при переборе параметров встретится секция без параметра changeGroup, то она будет выполнена и дальнейший поиск прекратится.

Параметр actionDescription

Предназначен для использования в сообщениях. Параметр описывает действие, которое было выполнено над задачей.

Параметр changeGroup

В качестве значения указывается через запятую группа, в которой сейчас находится задача и группа, в которую необходимо перенести задачу после выполнения действия над задачей. Например, для значения "<group1>, <group2>" - задача будет перемещена из группы <group1> в группу <group2>. Для действия remove этот параметр не имеет смысла.

Объект message

Служит для настройки отправки сообщения при выполнении какого-то действия. Если объект отсутствует, сообщение не будет отправлено. Формат объекта message полностью соответствует объекту param (не message), описанному в функции communication.send(param, callback). В шаблоне сообщения можно использовать переменные, которые принимают значения в зависимости от настроек задачи:

  • TASK_ID - идентификатор задачи
  • TASK_NAME - название задачи
  • TASK_CREATOR - Создатель задачи - логическое имя
  • TASK_CREATOR_FULL_NAME - Создатель задачи - полное имя
  • TASK_OBJECTS список объектов, для которых выполняется задача, разделенные HTML тегом <br/>
  • EXECUTE_CONDITION - условие выполнения задачи
  • ACTION - описание действия, которое выполняется над задачей (actionDescription) и текст ошибки, которая произошла во время выполнения задачи
  • ACTIONS_DESCRIPTION - текстовое описание действий, используемых в задаче
  • ACTIONS_DESCRIPTION_HTML - описание действий, используемых в задаче в формате HTML
  • CHECKER_COMMENT - комментарий, отправленный при проверке выполненной задачи в действии Audit
  • settings ACTIONS_DESCRIPTION формируется как: (нажмите для того, чтобы развернуть)
    1. <Название действия 1>:
    <Описание действия 1>
    
    2. <Название действия 2>:
    <Описание действия 2>
    
    ....
    
  • settings ACTIONS_DESCRIPTION_HTML формируется как: (нажмите для того, чтобы развернуть)
    <ol class="task-actions-description">
        <li>
            <span class="task-action">
                <span class="task-action-name">
                    Название действия 1
                </span>
                <span class="task-action-startup" data-startup-option="<условие выполнения задачи>">
                    &nbsp;
                </span>
                <span class="task-action-description">
                    Описание действия 1
                </span>
            </span>
        </li>
        ....
    </ol>

где "условие выполнения задачи" может быть 0, 1, 2 или 3:

  • 0 - Run if previous action completed without errors;
  • 1 - Run if someone of previous actions executed with an errors;
  • 2 - Run and don't wait until the previous action will be completed
  • 3 - Run anyway

Пример настройки шаблона сообщения workflow для email:

Ниже представлен шаблон approveTask, который будет использоваться в соответствии с настройкой workflow, объектом message, в котором установлен параметр "configID": "approveTask". Настройка шаблона производится в communication/email/config.json с помощью Media editor.:

  • settings шаблон approveTask (нажмите для того, чтобы развернуть)
    "approveTask": {
            "transport": "default",
            "message": {
                "subject": "Re: #%:TASK_ID:%: %:TASK_NAME:%",
                "messageId": "<%:TASK_ID:%.approveTask@alepiz.com>",
                "inReplyTo": "<%:TASK_ID:%.checkTask@alepiz.com>",
                "references": "<%:TASK_ID:%.createTask@alepiz.com> <%:TASK_ID:%.checkTask@alepiz.com>",
                "replyTo": "root@domain.com",
                "text": {
                    "path": "templates/newTask.txt"
                },
                "html": {
                    "path": "templates/replayTask.html"
                }
            }
        }
  • settings Шаблон текстового сообщения templates/newTask.txt (нажмите для того, чтобы развернуть)
    Task status: %:ACTION:%
    Created by: %:TASK_CREATOR_FULL_NAME:%
    Condition: %:EXECUTE_CONDITION:%
    
    %:ACTIONS_DESCRIPTION:%
    
  • settings Шаблон сообщения templates/replayTask.html в формате HTML (нажмите для того, чтобы развернуть)
    <html lang="ru">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Create a new task</title>
        <style>
            html {
                line-height: 1.5;
                font-family: Roboto, Oxygen-Sans, Ubuntu, Helvetica, sans-serif;
                font-weight: normal;
                color: rgba(0, 0, 0, 0.87);
                font-size: 15px;
            }
            p {
                line-height: 1.5em;
                margin: 0;
                padding: 0;
            }
            .bold {
                font-weight: bold;
            }
            .task-action-name {
                font-weight: bold;
                display:block;
                float:left;
            }
            .task-action-name {
                font-weight: bold;
                display:inline-block;
            }
            .task-action-startup {
                font-style:italic;
                display:inline-block;
            }
            .task-action-startup[data-startup-option="0"]::after {
                content: "(Run if previous action completed without errors):";
            }
            .task-action-startup[data-startup-option="1"]::after {
                content: "(Run if someone of previous actions executed with an errors):";
            }
            .task-action-startup[data-startup-option="2"]::after {
                content: "(Run and don't wait until the previous action will be completed):";
            }
            .task-action-description {
                display:block;
                margin: 20px 0;
                padding-left: 1.5rem;
                border-left: 2px solid #ee6e73;
            }
            .quoted {
                display:block;
                margin: 20px 0;
                padding: 0.5rem 0 1rem 1rem;
                border-left: 2px solid blue;
            }
        </style>
    </head>
    <body>
    <p><span class="bold">Action</span>: %:ACTION:%</p>
    
    <div class="quoted">
    <h3>%:TASK_NAME:%</h3>
    %:ACTIONS_DESCRIPTION_HTML:%
    
    <hr/>
    <p><span class="bold">Created by:</span> %:TASK_CREATOR_FULL_NAME:%</p>
    <p><span class="bold">Condition:</span> %:EXECUTE_CONDITION:%</p>
    </div>
    </body>
    </html>