How to create a pipeline condition

Pipeline Conditions

Each pipeline has at least one condition, which implements the TechDivision\ProcessPipelines\Api\PipelineConditionInterface interface.

Existing Conditions

There are some ready-to-use conditions.

TechDivision\ProcessPipelines\Helper\Condition\Pipeline\NoAutoSpawn

Disables auto spawning of given pipeline. Pipelines, which use this condition can not be spawned by heartbeat.

TechDivision\ProcessPipelines\Helper\Condition\Pipeline\NoSiblingInProgress

Disable spawning of the given pipeline, while this pipeline is already in progress.

Usage

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:TechDivision/ProcessPipelines/etc/pipeline.xsd">
    <pipeline name="example_pipeline" description="Example pipeline">
        <conditions>
            <pipeline_condition type="TechDivision\ProcessPipelines\Helper\Condition\Pipeline\NoAutoSpawn" description="Disable auto spawning"/>
        </conditions>
        ...
    </pipeline>
</config>

Provide arguments from condition to steps

Since version 1.1.0 there is an additional interface (TechDivision\ProcessPipelines\Api\ArgumentProviderInterface) for conditions, which enables you to provide arguments from the pipeline condition all pipeline steps.

Reasons

Imagine you have a condition, which checks the file system for a specific file pattern. If the file is present, you need to run a new pipeline for exactly this file. Therefore you need to provide the information to your steps, which should handle the file.

Usage Examples

<?php

use TechDivision\ProcessPipelines\Api\PipelineConditionInterface;
use TechDivision\ProcessPipelines\Api\ArgumentProviderInterface;

class FileExistsCondition implements PipelineConditionInterface, ArgumentProviderInterface
{
    const SOME_MAGIC_FILE_PATTERN = '...';

    public function isReady(array $pipelineConfiguration)
    {
        $this->searchForFiles(self::SOME_MAGIC_FILE_PATTERN);
        return $this->hasFiles();
    }

    public function getArguments()
    {
        return $this->getFiles();
    }
}

Virtual Conditions

By using the virtualType feature of Magento’s DI it is easy to create new conditions with some new params. Therefore there are some "template" conditions.

TechDivision\ProcessPipelines\Helper\Condition\Pipeline\CronExpression

Defines execution time for a pipeline using regular cron expression.

TechDivision\ProcessPipelines\Helper\Condition\Pipeline\ConfigurableCronExpression

Defines execution time for a pipeline using regular cron expression, while this expression can be configured in Magento admin.

Usage

Create virtual spawn conditions using di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    ...
    <virtualType name="MyCompany\MyModule\Virtual\Condition\EveryNight" type="TechDivision\ProcessPipelines\Helper\Condition\Pipeline\CronExpression">
        <arguments>
            <argument name="data" xsi:type="array">
                <item name="cron_expression" xsi:type="string">0 2 * * *</item>
            </argument>
        </arguments>
    </virtualType>
    <virtualType name="MyCompany\MyModule\Virtual\Condition\FullImport" type="TechDivision\ProcessPipelines\Helper\Condition\Pipeline\ConfigurableCronExpression">
        <arguments>
            <argument name="data" xsi:type="array">
                <item name="config_path" xsi:type="string">my_module/crontab/full_import</item>
            </argument>
        </arguments>
    </virtualType>
    ...
</config>

Use the virtual condition in pipeline.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:TechDivision/ProcessPipelines/etc/pipeline.xsd">
    <pipeline name="example_pipeline" description="Some example pipeline">
        <conditions>
            <pipeline_condition type="MyCompany\MyModule\Virtual\Condition\EveryNight" description="Run once in the night"/>
        </conditions>
        ...
    </pipeline>
    <pipeline name="another_example_pipeline" description="Some example pipeline">
        <conditions>
            <pipeline_condition type="MyCompany\MyModule\Virtual\Condition\FullImport" description="Customer defined cron expression"/>
        </conditions>
        ...
    </pipeline>
</config>