Skip to content

Architecture; TLDR

The architecture of how the orchestrator-core is setup can be split in two sections. The orchestration philosophy of how workflows are setup and run, and how the application can be used to define products that can be subscribed to by customers.

Application architecture

The Application extends a FastAPI application and therefore can make use of all the awesome features of FastAPI, pydantic and asyncio python.

Step Engine

At its core the Orchestrator workflow engine will execute a list of functions in order and store the result of each function to the database. The Orchestrator is able to execute any list of functions that the user envisions so long as they return a dictionary and/or consume variables stored in keys under that dictionary.

@workflow("Name of the workflow", initial_input_form=input_form_generator)
def workflow():
    return (
        init
        >> arbitrary_step_func_1
        >> arbitrary_step_func_2
        >> arbitrary_step_func_3
        >> done
    )

The @workflow decorator converts what the function returns into a StepList which the engine executes sequentially. If and when the step functions raise an exception, the workflow will fail at that step and allow the user to retry.

Products and Subscriptions

The second part of the orchestrator is a product database that allows a developer to define a collection of logically grouped resources, that when filled in create a Subscription, given to a customer. The description of a product is done in the Product, FixedInput, ProductBlock and ResourceType tables. When a workflow creates a subscription for a customer it creates instances of a Product, ProductBlock and ResourceType and stores them as Subscriptions, SubscriptionInstances and `SubscriptionInstanceValues.

It is therefore possible to have N number of Subscriptions to a single product. A workflow is typically executed to manipulate a Subscription and transition it from one lifecycle state to another (Initial, Provisioning, Active, Terminated).