Execute Automation in Any Language

Break free from DSL hell. Dimensigon orchestrations speak your language: Shell, Python, HTTP/REST, or nested workflows. One engine. Every language.

Real-World Use Case: Multi-Environment Deployment Pipeline

A financial services company needs to deploy applications across dev, staging, and production environments with language-agnostic workflows.

1. Hybrid Shell & Python Workflows

orchestration.json
{
  "name": "deploy-financial-app",
  "steps": [
    {
      "name": "validate-deployment",
      "action_type": "SHELL",
      "code": "docker pull myapp:latest && docker inspect myapp:latest | jq '.RepoTags'",
      "target": "prod-servers",
      "expected_rc": 0,
      "id": "1",
      "undo": false,
      "parent_step_ids": []
    },
    {
      "name": "check-compliance",
      "action_type": "SHELL",
      "code": "python3.9 - '{{input.binary_path}}' '{{input.expected_hash}}' <<'PY'\nimport hashlib\nimport sys\nwith open(sys.argv[1], 'rb') as binary:\n    digest = hashlib.sha256(binary.read()).hexdigest()\nassert digest == sys.argv[2], 'Binary mismatch!'\nprint('Binary verified')\nPY",
      "system_kwargs": {
        "timeout": 30
      },
      "expected_rc": 0,
      "id": "2",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "1"
      ],
      "schema": {
        "input": {
          "binary_path": {
            "type": "string",
            "pattern": "^/[A-Za-z0-9_./-]+$"
          },
          "expected_hash": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "binary_path",
          "expected_hash"
        ]
      }
    },
    {
      "name": "notify-audit",
      "action_type": "REQUEST",
      "code": "{\"method\": \"POST\", \"url\": \"https://audit.internal/api/v1/deployments\", \"headers\": {\"Authorization\": \"Bearer {{vault.audit_token}}\"}, \"json\": {\"environment\": \"production\", \"version\": \"{{vault.app_version}}\", \"timestamp\": \"2025-02-20T06:00:00Z\"}}",
      "expected_rc": 200,
      "id": "3",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "2"
      ]
    }
  ]
}

Why This Works

  • Step 1 - Native shell for Docker validation with real-time image inspection
  • Step 2 - Python via SHELL for cryptographic compliance checking against declared binary_path and expected_hash inputs
  • Step 3 - HTTP for external audit logging with Bearer token from vault

Dimensigon 0.3.5 uses SHELL to launch Python; native PYTHON has no execution factory. Provision Python 3.9 on each selected lab node, supply the declared inputs, and review Docker, API and credential dependencies before use. Python here is not sandboxed.

2. Nested Orchestrations for Reusable Workflows

Building Blocks Approach

Define base orchestrations, then compose them into complex workflows without duplication:

  • health-check.json - Generic health check across any service
  • deploy-service.json - Deploy + health check + rollback
  • full-pipeline.json - Multi-service orchestration calling the above

Orchestra 10 services with 3 nested calls instead of 100 steps.

Nested Composition
[
  {
    "name": "health-check",
    "steps": [
      {
        "code": "curl -sf {{service_url}}/health",
        "action_type": "SHELL",
        "expected_rc": 0,
        "id": "1",
        "undo": false,
        "target": "all",
        "parent_step_ids": []
      }
    ]
  },
  {
    "name": "deploy-all",
    "steps": [
      {
        "name": "deploy-web",
        "action_type": "ORCHESTRATION",
        "schema": {
          "input": {
            "orchestration": {
              "type": "string"
            },
            "hosts": {
              "type": [
                "string",
                "array",
                "object"
              ]
            },
            "service": {
              "type": "string"
            }
          },
          "required": [
            "orchestration",
            "hosts"
          ]
        },
        "code": "{}",
        "expected_rc": 0,
        "id": "1",
        "undo": false,
        "target": "all",
        "parent_step_ids": []
      },
      {
        "name": "deploy-worker",
        "action_type": "ORCHESTRATION",
        "schema": {
          "input": {
            "orchestration": {
              "type": "string"
            },
            "hosts": {
              "type": [
                "string",
                "array",
                "object"
              ]
            },
            "service": {
              "type": "string"
            }
          },
          "required": [
            "orchestration",
            "hosts"
          ]
        },
        "code": "{}",
        "expected_rc": 0,
        "id": "2",
        "undo": false,
        "target": "all",
        "parent_step_ids": [
          "1"
        ]
      }
    ]
  }
]

3. Data Processing with Multiple Languages

ETL Pipeline
{
  "name": "etl-pipeline",
  "steps": [
    {
      "name": "extract-data",
      "action_type": "SHELL",
      "code": "aws s3 sync s3://data-lake /tmp/data --profile prod",
      "expected_rc": 0,
      "id": "1",
      "undo": false,
      "target": "all",
      "parent_step_ids": []
    },
    {
      "name": "transform",
      "action_type": "SHELL",
      "code": "python3.9 - <<'PY'\nimport pandas as pd\ndf = pd.read_csv('/tmp/data/raw.csv')\ndf['timestamp'] = pd.to_datetime(df['timestamp'])\ndf.to_parquet('/tmp/data/transformed.parquet')\nPY",
      "expected_rc": 0,
      "id": "2",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "1"
      ]
    },
    {
      "name": "load",
      "action_type": "SHELL",
      "code": "python3.9 - <<'PY'\nimport requests\nwith open('/tmp/data/transformed.parquet', 'rb') as incoming:\n    response = requests.post('https://dw.internal/api/ingest', files={'data': incoming}, timeout=10)\n    response.raise_for_status()\nPY",
      "expected_rc": 0,
      "id": "3",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "2"
      ]
    }
  ]
}

ETL at Scale

  • Extract - Bash for S3 operations and cloud CLI tools
  • Transform - Python for data manipulation with libraries like Pandas, NumPy, Polars
  • Load - HTTP to push data to data warehouse APIs

Provision aws, Python 3.9, pandas==1.5.3, pyarrow==20.0.0, numpy==1.24.4 and requests==2.25.1 in the selected node’s lab environment. Use a disposable /tmp/data directory and an operator-approved test endpoint; these steps launch Python through SHELL.

Additional Capabilities

πŸ”— Cross-Language State Sharing

On the same lab node, Shell writes a file and a Python subprocess reads it. Use a per-run directory for concurrent workflows. The final HTTP request uses a separately supplied endpoint and vault.state value; file output does not automatically populate the vault.

State Flow
{
  "steps": [
    {
      "action_type": "SHELL",
      "code": "echo 'processed_count=42' > /tmp/state.txt",
      "expected_rc": 0,
      "id": "1",
      "undo": false,
      "target": "all",
      "parent_step_ids": []
    },
    {
      "action_type": "SHELL",
      "code": "python3.9 - <<'PY'\nstate = open('/tmp/state.txt').read(); print(f'Processed: {state}')\nPY",
      "expected_rc": 0,
      "id": "2",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "1"
      ]
    },
    {
      "action_type": "REQUEST",
      "code": "{\"method\": \"GET\", \"url\": \"{{input.endpoint}}\", \"json\": {\"metric\": \"{{vault.state}}\"}}",
      "expected_rc": 200,
      "schema": {
        "input": {
          "endpoint": {
            "type": "string"
          }
        },
        "required": [
          "endpoint"
        ]
      },
      "id": "3",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "2"
      ]
    }
  ],
  "name": "documentation-4-1"
}

⚑ Parallel Language Execution

Run a Shell script and an explicit Python script in parallel on selected lab nodes. Install backup-database.sh and validate-integrity.py on those nodes first; each subprocess uses the node’s privileges.

Parallel Steps
{
  "steps": [
    {
      "action_type": "SHELL",
      "target": "nodes-1-5",
      "code": "backup-database.sh",
      "parent_step_ids": [],
      "expected_rc": 0,
      "id": "1",
      "undo": false
    },
    {
      "action_type": "SHELL",
      "target": "nodes-6-10",
      "code": "python3.9 validate-integrity.py",
      "parent_step_ids": [],
      "expected_rc": 0,
      "id": "2",
      "undo": false
    }
  ],
  "name": "documentation-5-1"
}

πŸŽͺ Conditional Language Switching

Evaluate a declared usage_percent input in a Python subprocess. The named stdout capture supplies proceed to the next shell step, which runs the operator-provided scale-up-cluster.sh only when the threshold is exceeded.

Conditional Flow
{
  "steps": [
    {
      "action_type": "SHELL",
      "name": "check-quota",
      "code": "python3.9 - '{{input.usage_percent}}' <<'PY'\nimport sys\nprint('true' if float(sys.argv[1]) > 80 else 'false')\nPY",
      "expected_rc": 0,
      "id": "1",
      "undo": false,
      "target": "all",
      "parent_step_ids": [],
      "expected_stdout": "^(?P<proceed>true|false)\\n$",
      "schema": {
        "input": {
          "usage_percent": {
            "type": "string",
            "pattern": "^(100|[0-9]{1,2})(\\.[0-9]+)?$"
          }
        },
        "required": [
          "usage_percent"
        ]
      }
    },
    {
      "action_type": "SHELL",
      "code": "if [ \"{{input.proceed}}\" = \"true\" ]; then scale-up-cluster.sh; fi",
      "schema": {
        "input": {
          "proceed": {
            "type": "string",
            "enum": [
              "true",
              "false"
            ]
          }
        },
        "required": [
          "proceed"
        ]
      },
      "expected_rc": 0,
      "id": "2",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "1"
      ]
    }
  ],
  "name": "documentation-6-1"
}

🌍 Multi-Cloud Language Distribution

Route installed cloud CLIs to selected lab nodes and HTTP requests to configured APIs. kubectl is a SHELL command; provision aws and kubectl plus operator-approved test endpoints and identities before using this example.

Multi-Cloud
{
  "steps": [
    {
      "action_type": "SHELL",
      "target": "aws-ec2",
      "code": "aws elbv2 describe-load-balancers",
      "expected_rc": 0,
      "id": "1",
      "undo": false,
      "parent_step_ids": []
    },
    {
      "action_type": "SHELL",
      "target": "gcp-k8s",
      "code": "kubectl get nodes -o json",
      "expected_rc": 0,
      "id": "2",
      "undo": false,
      "parent_step_ids": [
        "1"
      ]
    },
    {
      "action_type": "REQUEST",
      "code": "{\"url\": \"https://api.azure.com/subscriptions/...\", \"method\": \"GET\"}",
      "expected_rc": 200,
      "id": "3",
      "undo": false,
      "target": "all",
      "parent_step_ids": [
        "2"
      ]
    }
  ],
  "name": "documentation-7-1"
}
🎯

Use the Right Tool

Shell for sysadmin, Python for data, HTTP for APIs. No compromises.

πŸ”„

Composable

Build libraries of reusable orchestrations. Compose them at scale.

πŸš€

No Learning Curve

Teams use languages they already know. No DSL to master.

πŸ”’

Vault Integration

All languages get secret injection and variable substitution automatically.