В процессе использования vRealize Automation и vRealize Orchestrator круг решаемых ими задач постоянно расширяется. Количество процессов, обеспечивающих выполнение этих задач, растёт ещё быстрее. К счастью, любой процесс – это лишь ещё один объект, работу с которым также можно автоматизировать.
1. Поиск процесса
2. Основные свойства объекта workflow
3. Запуск workflow и передача параметров, токен
4. Ожидание выполнения, получение результатов
5. Action запуска процесса
6. Старт процесса по расписанию
1. Поиск процесса
Поставщиком пакетов и процессов для vRealize Orchestrator может выступать любая компания или даже отдельные разработчики, поэтому в vRO нет запрета на использование одинаковых имен процессов. Значит, поиск процесса правильнее выполнять по его ID, а не по имени:
var myWorkflow = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333");
или
var workflowId = "11111111-aaaa-bbbb-cccc-11112222333"; var myWorkflow = Server.findForType("Workflow", workflowId);
Оба примера вернут Вам один и тот же объект класса Workflow, соответствующий указанному ID.
Получить объект Вашего текущего процесса во время его выполнения можно так:
var myWorkflow = workflow.currentWorkflow; var myWorkflow = workflow.rootWorkflow;
Оба метода идентичны. В данном примере workflow – объект класса WorkflowToken, объект текущего выполнения процесса (execution) или просто токен процесса. Если нужно получить для обработки все процессы на vRO, используйте метод:
var workflows = Server.findAllForType("Workflow");
В vRO есть возможность поиска процесса по его имени:
System.getModule("com.vmware.library.vcac").getWorkflowByName("Test Workflow");
Но если вы посмотрите на реализацию данной функции, то сразу поймёте почему лучше искать процесс по ID. Функция получает полный список процессов, используя Server.findAllForType(“Workflow”), и затем фильтрует полученный список по имени процесса. Если в результате будет найдено более одного процесса, то возвращается ошибка “More than one workflow with name ****”.
2. Основные свойства объекта workflow
Итак, Вы получили объект Workflow. Данный объект содержит полную информацию о процессе, поэтому стоит поближе познакомиться с его основными свойствами:
- attributes – список атрибутов процесса, их типов и значений (массив объектов типа Attribute);
- inParameters – список параметров, принимаемых процессом на входе (массив объектов типа Parameter);
- outParameters – список параметров, возвращаемых процессом (массив объектов типа Parameter);
- executions – список запусков процесса, всех их входных значений и результатов выполнения (массив объектов типа WorkflowToken);
- items – список элементов процесса, блоков на схеме процесса: скрипты, процессы, ветвления и т.д. (массив объектов типа WorkflowItem);
- logEvents – список событий: старт и завершение процесса, сохранение новой версии, ошибки (массив объектов типа LofEvents).
Попробуйте вывести список атрибутов текущего процесса и их начальное значение:
var myWorkflow = workflow.currentWorkflow; for each (item in myWorkflow.attributes) { System.log(item.name + ": " + item.value); }
3. Запуск workflow и передача параметров, токен
Предназначение любого процесса – выполнение определённых действий. Для запуска процесса нужно вызвать метод execute объекта Workflow. Если процессу необходимы входные параметры, то в execute передаётся объект Properties:
var myWorkflow = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333"); // подготовка входных параметров var inputProperties = new Properties(); inputProperties.put("inputVariable1_str", "test"); inputProperties.put("inputVariable2_int", 42); inputProperties.put("inputVariable3_bool", true); var token = myWorkflow.execute(inputProperties);
Метод execute возвращает другой объект – WorkflowToken, который содержит информацию о параметрах выполнения процесса (в примере выше – это переменная token). Метод execute запускает выполнение процесса один раз. Для старта нескольких процессов параллельно можно вызывать execute в цикле, передавая на вход разные параметры. Пример такой параллельной обработки можно найти в процессе “Start workflows in parallel”.
А что если Вы не запускали процесс, но требуется проверить статус его выполнения и получить результаты? Можно получить токен последнего выполнения любого процесса при помощи функции getWorkflowLastToken:
var token = System.getModule("com.vmware.library.vcac").getWorkflowLastToken(myWorkflow);
Или можно последовательно проанализировать все запуски этого процесса:
var myWorkflow = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333"); for each (token in myWorkflow.executions) { if (token.isStillValid) { System.log(token.startDate + ": " + token.state); } }
Здесь в лог выводятся время старта процесса и его текущее состояние. Свойство isStillValid позволяет проверить токен на корректность перед его использованием.
В следующем примере для определения статуса выполнения процесса используется свойство state (более подробное описание и примеры его использования будут ниже).
var myWorkflow = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333"); for each (token in myWorkflow.executions) { if (token.state == "running" || token.state == "waiting-signal") { token.cancel(); System.log("Execution " + token.startDate + " (" + token.id + "): is canceled"); } }
Данный скрипт отменяет все незавершенные запуски процесса.
4. Ожидание выполнения, получение результатов
Получив токен процесса (WorkflowToken) Вы можете:
- Посмотреть переданные процессу параметры (метод getInputParameters):
// вывод входных параметров процесса и их значений var inParams = workflow.getInputParameters(); if (inParams != null){ // вывести все параметны и их значения for each (key in inParams.keys){ System.log(key + ": " + inParams.get(key)); } }
Если этот пример оформить как action, то получится отличный инструмент для отладки, добавьте его в любой процесс и это приведет к записи в лог входных параметров и их значений.
// выборочный вывод параметров и их значений var inParams = workflow.getInputParameters(); if (inParams != null){ // вывести значения отдельных параметров по их имени System.log("inputVariable1: " + inParams.inputVariable1); System.log("inputVariable2: " + inParams["inputVariable2"]); }
- Получить результаты работы процесса (метод getOutputParameters):
// вывод результатов работы процесса var outParams = workflow.getOutputParameters(); if (outParams != null){ // получить все параметны и их значения for each (key in outParams.keys){ System.log(key + ": " + outParams.get(key)); } // вывести значения отдельных параметров по их имени System.log("outputVariable1: " + outParams.outputVariable1); System.log("outputVariable2: " + outParams["outputVariable2"]); }
- Проконтролировать текущий статус выполнения процесса (свойство state). Свойство state может возвращать следующие значения:
- running;
- completed;
- waiting-signal;
- canceled;
- failed;
Значения всех состояний понятны, кроме waiting-signal. Это состояние означает, что процесс выполняется и в данный момент ожидает либо действий пользователя (Waiting for User Interaction), либо события таймера (Waiting for Event or Timer).
// ожидание завершения процесса по его токену while (token.state == "running" || token.state == "waiting-signal") { System.sleep(100); }
Значение задержки в цикле подбирается по ситуации: если процесс не очень длительный и время выполнения критично, то ставьте меньше, если процесс выполняется 10 – 30 минут, то нет смысла проверять его статус 10 раз в секунду. Последовательный запуск workflow (с ожиданием завершения работы) можно посмотреть в процессе “Start workflows in a series”.
5. Action запуска процесса
Теперь Вы готовы объединить вместе предыдущие фрагменты кода: поиск процесса, подготовку входных параметров, запуск и ожидание выполнения, получение результата. Полученный action можно использовать на форме блюпринта vRA или процесса XaaS для проверки/подготовки вводимых значений при помощи вызова дополнительного процесса:
// поиск процесса по ID var workflowToLaunch = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333"); if (workflowToLaunch) { // подготовка входных параметров var inputProperties = new Properties(); inputProperties.put("inputVariable1", "test value"); inputProperties.put("inputVariable2", 42); // запуск процесса token = workflowToLaunch.execute(inputProperties); // ожидание завершения процесса while (token.state == "running" || token.state == "waiting-signal") { System.sleep(100); } // получение и анализ результатов var prop = token.getOutputParameters(); if (prop.outputVariable1) { return prop["outputVariable1"]; } else { return "Error getting parameter"; } } else { return "Workflow not found!"; }
6. Старт процесса по расписанию
Ещё одним важным качеством процессов в vRO является возможность создания задач или запуск по расписанию. Для создания задач вызываются методы schedule и scheduleRecurrently. Метод schedule выполняет отложенный старт и поэтому кроме входных параметров для процесса требует объект типа Date, содержащий дату и время старта:
var myWorkflow = Server.getWorkflowWithId("11111111-aaaa-bbbb-cccc-11112222333"); // подготовка даты и времени выполнения задачи var scheduleDate = new Date(); scheduleDate.setDate(scheduleDate.getDay() + 7); // подготовка входных параметров var inputProperties = new Properties(); inputProperties.put("inputVariable1_str", "test"); inputProperties.put("inputVariable2_int", 42); inputProperties.put("inputVariable3_bool", true); // создание задачи var task = myWorkflow.schedule(inputProperties, scheduleDate);
Запуск повторяющейся задачи потребует немного больше подготовки, см. готовый пример запуска задачи с описанием параметров.
На этом о работе с процессами всё. У Вас есть свои интересные примеры? Делитесь и не забывайте писать замечания и вопросы, если конечно они возникли!