Skip to content

WorkOrder

DRP implements an extension to the workflow system that allows for execution of sets of tasks as a unit after the initial provisioning of the machine. These WorkOrder objects can scheduled or triggered to run.

To simplify building work orders, a blueprint can be created to allow for easy replication of work orders across machines.

Fields

Field Definition
Archived Archived indicates whether the complete log for the async action can be
retrieved via the API. If Archived is true, then the log cannot
be retrieved.

required: true
Blueprint Blueprint defines the tasks and base parameters for this action
required: true
Context Contexts contains the name of the current execution context.
An empty string indicates that an agent running on a Machine should be executing tasks,
and any other value means that an agent running with its context set for this value should
be executing tasks.
CreateTime CreateTime is the time the work order was created. This is
distinct from StartTime, as there may be a significant delay before
the workorder starts running.
CurrentTask The index into the Tasks list for the task that is currently
running (if a task is running) or the next task that will run (if
no task is currently running). If -1, then the first task will
run next, and if it is equal to the length of the Tasks list then
all the tasks have finished running.

required: true
EndTime EndTime The time the async action failed or finished or cancelled.
Filter Filter is a list filter for this WorkOrder
JobExitState The final disposition of the current job.
Can be one of "reboot","poweroff","stop", or "complete"
Other substates may be added as time goes on
JobResultErrors ResultErrors is a list of error from the task. This is filled in by the
task if it is written to do so. This tracks results without requiring
job logs.
JobState The state the current job is in. Must be one of "created", "failed", "finished", "incomplete"
Machine Machine is the key of the machine running the WorkOrder
swagger:strfmt uuid
Meta Meta contains the meta data of the object.

The type of this field is a key / value map/dictionary.
The key type is string.
The value type is also string.

The general content of the field is undefined and can be an arbritary store.
There are some common known keys:

color - The color the UX uses when displaying
icon - The icon the UX uses when displaying
* title - The UX uses this for additional display information. Often the source of the object.

Specific Object types use additional meta data fields. These are described at:
https://docs.rackn.io/stable/redirect/?ref=rs_object_metadata
Params Params that have been directly set on the Machine.
Profiles Profiles An array of profiles to apply to this machine in order when looking
for a parameter during rendering.
Runnable Runnable indicates that this is Runnable.
Stage The stage that this is currently in.
StartTime StartTime The time the async action started running.
State State The state the async action is in. Must be one of "created", "running", "failed", "finished", "cancelled"
required: true
Status Status is a short text snippet for humans explaining the current state.
TaskErrorStacks This list of previous task lists and current tasks to handle errors.
Upon completing the list, the previous task list will be executed.

This will be capped to a depth of 1. Error failures can not be handled.
TaskErrorStacks/CurrentJob CurrentJob is the job that presents this task stack
swagger:strfmt uuid
TaskErrorStacks/CurrentTask CurrentTask is the index in the task list in a previous errored task.
TaskErrorStacks/TaskList TaskList is the task list from a previous errored task.
Tasks The current tasks that are being processed.
Uuid Uuid is the key of this particular WorkOrder.
required: true
swagger:strfmt uuid

Work Orders

The work order connects a set of tasks, parameters, and profiles to a machine.

When created, the work order is associated with a machine. If the machine is in work order mode, the runner on that machine will pick up the work order and execute the task list on that work order. As the runner executes the tasks, the system accumulates job objects to track the results.

If a task fails, the work order fails. Work orders are not intended to be restarted. They can be cloned and rerun. These are intended to be trackable, results-oriented actions.

Currently, each runner will run one work order at a time, but this is not required and may change in the future.

The task list on a work order can initially contain stages by prepending stage:<name of stage> and should not contain bootenv changes or context changes.

State

The WorkOrder has a state and can only be operated based upon a state.

Field Description
created This is the starting state for a created work order. This means the work order is on the machine, but not started yet.
running The WorkOrder has been picked up by a runner and is running.
failed This WorkOrder has a failed task and has stopped.
finished This WorkOrder has completed all tasks successfully.
cancelled This WorkOrder was cancelled before completion of the tasks.

Work orders must me moved to one of the final three states to delete or remove the work order.

Additionally, the WorkOrder Status field contains information about what is going on with the WorkOrder. This is generally a failure message.

Jobs

A job is used to track the execution history of tasks against a specific machine. The job object contains a reference to the owning machine and the owning work order. This allows for searching and filtering by machine and work order.

Blueprint

The blueprint defines a set of tasks, parameters, and profiles that act as the basis for a work order.

When a work order is created that reference a blueprint, the Params and Profiles fields are added to the machine's template render process. These are used before the machine's parameters, but after the work order's own params and profiles.

The blueprint has a task list that will get expanded when the work order is picked up to start execution. The task list on a blueprint may additionally include stages by prepending stage:<stage name>. The task list should not include bootenv changes.

TriggerProvider

A trigger provider defines a trigger type. The object defines the required and optional parameters for using the trigger. The trigger provider defines is it is a URL-based trigger. If the NoURL field is set to true, the trigger provider is an internal DRP trigger. The Method field, if specified, defines the HTTP request type of the trigger. If unspecified, anything is allowed and the trigger will decide if the method is allowed.

The triggers plugin provides many webhook triggers. For a trigger provider that doesn't have NoURL set to true, the system will create the following URL, https://IP:APIPORT/webhooks/\<TriggerProviderName>. By default, all methods are allow. The URL-based trigger is assumed to be handled by a plugin action on the system object. The plugin providing the trigger provider support should provide an action on the system object named the same as the trigger provider.

The trigger provider has profiles and parameters associated with it. These are used to define the trigger operations and customization. They are not applied to the work order.

There are two embedded trigger providers:

CronTrigger

This defines a trigger type that will generate a trigger bounded by a cron tab string.

The cron-trigger/time-string parameter defines a crontab, 5-element string that defines when the trigger will fire.

EventTrigger

This defines a trigger type that will generate a trigger based upon a matching event.

The event-trigger/event-match parameter defines an event matcher that follows the scope, action, specific format of the event. This is the dot separated with comma separated elements. e.g. machines.update,create,save.* would match any machine event that is of action create, update, or save.

The event-trigger/event-object-match parameters optionally defines an await drpcli-style string that will allow for matching on the object field of the event. Await allows for And / Or / Not logical operators along with the Eq function to create a complex test structure. This example would match if the state of the event was finished, failed, or cancelled.

Trigger

A trigger defines the specific details of how the trigger operates and the resulting set of work orders that result from the trigger. Additionally, the trigger can assign work orders immediately to a specific set of machines, or the machine assignment can be deferred until the machines are ready to accept new work.

There are three parts to a trigger:

Trigger Definition

The first part is the trigger definition. The following fields define how the trigger operates:

Field Definition
Name Defines the trigger\'s key in the DRP data system.
TriggerProvider Defines the type of Trigger
Enabled Defines if the trigger is enabled
Params Defines a set of parameters that alter what triggers. E.g. the crontab string for the CronTrigger
Profiles Defines a list of profiles that also can be used to define parameters for the trigger

These parameters control how the trigger works. For example, the event-trigger provider uses the event-trigger/event-match parameter to define which events will invoke the trigger. These parameters are placed in the Params field or in a profile attached to the trigger.

Triggers are often delivered in content packs as read-only objects. This makes turning the on and off impossible with the Enabled field. The Enabled field represents the default state of the trigger. This can be overridden by the global parameters trigger/<name-of-trigger>-enabled or trigger/<name-of-trigger>-disabled. The disabled parameter is higher precedence than the enabled parameter. Either parameter overrides the Enabled field. These parameters can only be specified in the global profile and not in sub-profiles or parameter defaults.

Trigger Scope

The second part is the Trigger scope. The following fields define what the trigger show act upon:

  • Filter - this is a DRP filter string to limit the scope of machines that should be applied. If the filter is empty, the machines list is [Runnable=true]{.title-ref} and [WorkOrderMode=true]{.title-ref} still applied.
  • AllInFilter - This boolean indicates if all the machines should receive a WorkOrder. Default is false.
  • FilterCount - This defaults to 1. If AllInFilter is not set to true, then this limits the WorkOrders to be created.
  • QueueMode - This boolean indiciates if the WorkOrders should be created without a Machine specifically assigned. This defers assignment until the Machines are ready to handle the work.

The Filter limits the machines to be triggered. Only machines that are Runnable and in WorkOrderMode are eligible for WorkOrders.

The Filter field can also use the rendering system to generate its value. The rendering of the field is restricted to functions that will work against the global profile. See Template for template functions. In general these should be restricted to parameter lookup functions. Here are some example strings.

Using the API or drpcli to test filter matching is useful to determine the scope of the trigger. See Filter Syntax.

Trigger Work Orders #{rs_trigger_work_orders}

The third part is the Trigger Work Order definition. The following fields define what the WorkOrder will look like:

  • Blueprint - This defines the Blueprint object for the WorkOrder.
  • WorkOrderParams - These are parameters that should initialize the WorkOrder\'s Params field.
  • WorkOrderProfiles - These are profiles that should initialize the WorkOrder\'s Profiles field.
  • StoreDataInParameter - If this string parameter is defined, the data of the trigger will be stored on the WorkOrder in that parameter.
  • MergeDataIntoParams - If this boolean parameter is true, the data of the trigger will be merged into the WorkOrder\'s Params field.

The combination of the fields will be used to create WorkOrder for each machine that machines the filter set of parameters.

Execution Models

With the addition of WorkOrders, there are two additional execution models to consider when building and planning infrastructure management.

The initial model revolved around provisioning and building up a machine. This is the traditional execution of DRP with extensions into Cloud infrastructure and logical components like clusters. Switch and storage provisioning through contexts fall into this model as well.

When used with Cluster and Resource Broker, Machine as Service can allow for operating and maintaining specific services.

When used with Context and Trigger Definition, the system can be used to operate a CI/CD pipeline like system.

All execution models can exist at the same time with a single DRP environment.

Machine as Service

Once a Machine, Cluster, or ResourceBroker has been provisioned, that system can be placed in WorkOrderMode. This will cause the system not run workflows anymore and switch the WorkOrder execution mode, only WorkOrders will be processed. The goal is to operate those systems as service with Blueprints acting as defined actions to take through WorkOrders.

For example, a machine that represents a switch might use WorkOrderMode to handle port configuration changes as needed based upon other system\'s needs. A cluster that represents a Kubernetes Cluster might use WorkOrderMode to manage applications and other cluster management functions after initial provisioning. Blueprints could be created with tasks and initial parameters needed to take those actions. WorkOrders would be created against these system that other WorkOrders or Workflows could use to handle configuration/state changes.

In this case, the Machine / Cluster / ResourceBroker objects continue to represent an element in the data center that is being managed.

Orchestrated Tasks

When a Trigger is has QueueMode set to true, the Trigger operates as a deferred WorkOrder queue where the Filter field is the queue definition. This allows these triggers to operate like a pool of runners waiting to do jobs as they arrive. This is subtlely different than the Machine as Server model. The runners, grouped by the filter, are not specifically requested, but operate more anonymously.

CI/CD Pipelines

With the introduction of Triggers and WorkOrders, the DRP environment can now act as a general action execution environment. This model matches a more worker / action model instead of a managed system environment.

In this execution model, a set of worker are started with tags. These worker could be Machines, Clusters, or ResourceBrokers that are backed by physical, virtual, or containers. These specified workers run WorkOrders generated by Triggers to manage the whole set of systems. This is NOT necessarily used to manage infrastructure elements directly.

Some examples:

  • A Blueprint could be written to handle repackaging content based upon a trigger from gitlab to rebuild and redeploy system components.
  • A Blueprint could be written to do heartbeat validation of a machine upon a cron-based trigger to monitor components.