batch

A zero-dependency, in-process fake of AWS Batch. Batch uses the AWS REST-JSON protocol with fixed POST paths under /v1, so the real @aws-sdk/client-batch works against it unchanged.

Port4705
ProtocolAWS REST-JSON (e.g. POST /v1/submitjob, POST /v1/describejobs)
HealthGET /_parlel/health
ResetPOST /_parlel/reset

Default connection

AWS_ENDPOINT_URL=http://127.0.0.1:4705
AWS_ACCESS_KEY_ID=parlel
AWS_SECRET_ACCESS_KEY=parlel
AWS_REGION=us-east-1

Any SigV4 credentials are accepted (auth is not verified).

Implemented operations

OperationRoute
CreateJobQueuePOST /v1/createjobqueue
DescribeJobQueuesPOST /v1/describejobqueues
RegisterJobDefinitionPOST /v1/registerjobdefinition
DescribeJobDefinitionsPOST /v1/describejobdefinitions
SubmitJobPOST /v1/submitjob
DescribeJobsPOST /v1/describejobs
ListJobsPOST /v1/listjobs
CancelJobPOST /v1/canceljob

SDK usage example

import { BatchClient, CreateJobQueueCommand, SubmitJobCommand, DescribeJobsCommand } from "@aws-sdk/client-batch";

const batch = new BatchClient({
  endpoint: "http://127.0.0.1:4705",
  region: "us-east-1",
  credentials: { accessKeyId: "parlel", secretAccessKey: "parlel" },
});

await batch.send(new CreateJobQueueCommand({ jobQueueName: "jq", priority: 1, computeEnvironmentOrder: [] }));
const s = await batch.send(new SubmitJobCommand({ jobName: "myjob", jobQueue: "jq", jobDefinition: "echo:1" }));
const d = await batch.send(new DescribeJobsCommand({ jobs: [s.jobId] }));
console.log(d.jobs[0].status); // "SUCCEEDED"

Access via MCP / preview URL

When running inside a Daytona sandbox, this HTTP service is exposed at an automatically-provisioned preview URL. Point the SDK endpoint at that URL and add the x-daytona-preview-token header on requests.

Surface coverage

This emulator faithfully replicates the API surface most application code and agents exercise. Anything below the supported lines is either an intentional design choice for a fast, zero-cost local emulator (✓ By design) or a candidate for a future release (⟳ Roadmap) — never a silent inaccuracy.

Legend: ✅ fully supported · ◐ accepted (stored, not strictly enforced) · ✓ by design · ⟳ on the roadmap.

AreaStatusNotes
CreateJobQueueRequired fields validated (jobQueueName, priority)
DescribeJobQueuesReturns stored queue data
RegisterJobDefinitionRevisions increment correctly
DescribeJobDefinitionsFilter by name/status works
SubmitJobRequired fields validated (jobName, jobQueue, jobDefinition)
DescribeJobsReturns job details from memory
ListJobsFilter by queue and status
CancelJobSets FAILED status, returns empty object
Execution✓ by designJobs immediately succeed; no container runtime
Compute environments✓ by designQueues reference them opaquely
Dependencies✓ by designdependsOn stored but not enforced
Array / multi-node jobs⟳ roadmapNot modeled
Auth✓ by designSigV4 accepted but not validated
Persistence✓ by designIn-memory; lost on restart/reset
Pagination✓ by designNot implemented (in-memory store)

Error codes & shapes

CodeStatusWhen
ClientException400Missing required field, invalid value, resource not found, unsupported method
ServerException500Internal server error

Error envelope: { "__type": "ClientException", "message": "..." }

Manifest

{
  "name": "batch",
  "version": "0.1",
  "image": "parlel/batch:0.1",
  "size_kb": 80,
  "port": 4705,
  "protocol": "http",
  "healthcheck": "/_parlel/health",
  "startup_time_ms": 100,
  "env_vars": {
    "AWS_ACCESS_KEY_ID": "parlel",
    "AWS_SECRET_ACCESS_KEY": "parlel",
    "AWS_REGION": "us-east-1",
    "AWS_ENDPOINT_URL": "http://127.0.0.1:4705"
  }
}
<!-- parlel:testenv:start -->

Configuration — test.env

Copy these into your test.env (used by the bridge sidecar flow). Tokens are Parlel's seeded test credentials — any non-empty value is accepted by the emulator, so you rarely need to change them. Swap in real credentials only when pointing at the live service in prod.env.

AWS_ACCESS_KEY_ID=parlel
AWS_SECRET_ACCESS_KEY=parlel
AWS_REGION=us-east-1
AWS_ENDPOINT_URL=http://parlel-bridge:4705
<!-- parlel:testenv:end -->