{"generated":"2026-08-30T17:00:36Z","clouds":[{"id":"aws","name":"AWS face","product":"lola","repo":"https://git.kainersdorfer.com/raffael-public/lola","commit":"d2e9011","branch":"main","endpoint":"SigV4 on one port; AWS CLI/SDKs/CDK unmodified","docs":"https://git.kainersdorfer.com/raffael-public/lola/src/branch/main/docs/services.md"},{"id":"google","name":"Google face","product":"g-lola","repo":"https://git.kainersdorfer.com/raffael-public/g-lola","commit":"a62e061","branch":"main","endpoint":"https://glola.abot.at — Bearer tokens, Google's JSON envelope","docs":"https://git.kainersdorfer.com/raffael-public/g-lola/src/branch/main/README.md","live":"https://glola.abot.at"},{"id":"cloudflare","name":"Cloudflare face","product":"lola (src/cf)","repo":"https://git.kainersdorfer.com/raffael-public/lola","commit":"d2e9011","branch":"main","endpoint":"/client/v4 on the same port; wrangler with CLOUDFLARE_API_TOKEN=<ak>:<sk>","docs":"https://git.kainersdorfer.com/raffael-public/lola/src/branch/main/notes/cloudflare.md"}],"related":[{"name":"gcp-cloud (the earlier Java cell)","repo":"https://git.kainersdorfer.com/raffael-public/gcp-cloud","commit":""}],"groups":[{"type":"Functions","rows":[{"capability":"Deploy & invoke functions","aws":{"service":"Lambda","status":"full","ops":[{"name":"CreateFunction","src":"src/lambda.rs:96","via":"POST /2015-03-31/functions"},{"name":"ListFunctions","src":"src/lambda.rs:97","via":"GET /2015-03-31/functions"},{"name":"GetFunction","src":"src/lambda.rs:98","via":"GET /2015-03-31/functions/{name}"},{"name":"DeleteFunction","src":"src/lambda.rs:99","via":"DELETE /2015-03-31/functions/{name}"},{"name":"GetFunctionConfiguration","src":"src/lambda.rs:100","via":"GET /2015-03-31/functions/{name}/configuration"},{"name":"Invoke","src":"src/lambda.rs:101","via":"POST /2015-03-31/functions/{name}/invocations"},{"name":"UpdateFunctionCode","src":"src/lambda.rs:102","via":"PUT /2015-03-31/functions/{name}/code"},{"name":"UpdateFunctionConfiguration","src":"src/lambda.rs:103","via":"PUT /2015-03-31/functions/{name}/configuration"},{"name":"PutProvisionedConcurrencyConfig","src":"src/lambda.rs:111","via":"PUT /2015-03-31/functions/{name}/provisioned-concurrency"},{"name":"GetProvisionedConcurrencyConfig","src":"src/lambda.rs:112","via":"GET /2015-03-31/functions/{name}/provisioned-concurrency"},{"name":"DeleteProvisionedConcurrencyConfig","src":"src/lambda.rs:113","via":"DELETE /2015-03-31/functions/{name}/provisioned-concurrency"},{"name":"CreateFunctionUrlConfig","src":"src/lambda.rs:114","via":"POST /2015-03-31/functions/{name}/url"},{"name":"UpdateFunctionUrlConfig","src":"src/lambda.rs:115","via":"PUT /2015-03-31/functions/{name}/url"},{"name":"GetFunctionUrlConfig","src":"src/lambda.rs:116","via":"GET /2015-03-31/functions/{name}/url"},{"name":"DeleteFunctionUrlConfig","src":"src/lambda.rs:117","via":"DELETE /2015-03-31/functions/{name}/url"},{"name":"Lambda Runtime API for the sandbox (/2018-06-01/runtime/invocation/next, /response, /error)","src":"src/runtime.rs:27"}],"note":"Not there: layers, event source mappings (an SQS queue does not drive a function by itself), reserved concurrency as a per-function cap; versions/aliases/permissions exist only as CloudFormation records resolving to $LATEST; get-function returns Code.Location as a path, not a presigned URL; async invoke (Event) is fire-and-forget (lost on restart, no retry, no DLQ); no Ruby or .NET runtime. Container-image functions run --network host. — docs/services.md §Lambda, README 'Known gaps' Runtimes: nodejs22.x, python3.12, java21/25, provided.al2023; PackageType Image; per-function LOLA_SANDBOX=firecracker.","src":"REST /fn-url/, REST /2015-03-31/functions"},"google":{"service":"Cloud Functions (2nd gen) · Cloud Run v2","status":"partial","ops":[{"name":"GET /v2/projects/{p}/locations/{loc}/services","src":"../g-lola/src/run.rs:50","via":"list_services"},{"name":"POST /v2/projects/{p}/locations/{loc}/services","src":"../g-lola/src/run.rs:50","via":"create_service"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"get_service"},{"name":"PATCH /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"patch_service"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"delete_service"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:getIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:setIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:testIamPermissions","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}/revisions","src":"../g-lola/src/run.rs:52","via":"list_revisions"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}/revisions/{r}","src":"../g-lola/src/run.rs:53","via":"get_revision"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/services/{s}/revisions/{r}","src":"../g-lola/src/run.rs:53","via":"delete_revision"},{"name":"GET /v2/projects/{p}/locations/{loc}/operations","src":"../g-lola/src/run.rs:54","via":"list_operations"},{"name":"GET /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"get_operation"},{"name":"POST /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"wait_operation"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"delete_operation"},{"name":"ANY /run/{p}/{loc}/{s}","src":"../g-lola/src/run.rs:56","via":"proxy"},{"name":"ANY /run/{p}/{loc}/{s}/{path…}","src":"../g-lola/src/run.rs:58","via":"proxy"}],"note":"Cloud Functions: g-lola/src/functions.rs is a skeleton with an empty router (README: 'Cloud Functions (skeleton module, no routes)'). Cloud Run v2 (run.rs) is the deploy-code-get-a-URL path: services/revisions/operations; with docker or podman on PATH the revision's container really runs (env, ports, resources, startup probe), otherwise the resource exists and its URI answers 503. traffic[] is honoured: LATEST, REVISION by name, percent splits as a deterministic weighted round-robin, tags at /run/{project}/{loc}/{tag}---{svc}/*; a revision's container runs while it has a share or a tag and is RETIRED otherwise. — g-lola README 'Status'"},"cloudflare":{"service":"Workers","status":"full","ops":[{"name":"GET /client/v4/accounts/{account}/workers/scripts","src":"src/cf/workers.rs:1584"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}","src":"src/cf/workers.rs:1589"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}","src":"src/cf/workers.rs:1590"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/content","src":"src/cf/workers.rs:1590"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/content/v2","src":"src/cf/workers.rs:1590"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/content","src":"src/cf/workers.rs:1593"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/content/v2","src":"src/cf/workers.rs:1593"},{"name":"DELETE /client/v4/accounts/{account}/workers/scripts/{name}","src":"src/cf/workers.rs:1596"},{"name":"DELETE /client/v4/accounts/{account}/workers/services/{name}","src":"src/cf/workers.rs:1596"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/settings","src":"src/cf/workers.rs:1606"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/settings","src":"src/cf/workers.rs:1610"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/script-settings","src":"src/cf/workers.rs:1611"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/script-settings","src":"src/cf/workers.rs:1615"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1627"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1635"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1635"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/secrets-bulk","src":"src/cf/workers.rs:1636"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/secrets/{sname}","src":"src/cf/workers.rs:1637"},{"name":"DELETE /client/v4/accounts/{account}/workers/scripts/{name}/secrets/{sname}","src":"src/cf/workers.rs:1642"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1654"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1658"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1658"},{"name":"DELETE /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1668"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/schedules","src":"src/cf/workers.rs:1672"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/schedules","src":"src/cf/workers.rs:1676"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/usage-model","src":"src/cf/workers.rs:1685"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/usage-model","src":"src/cf/workers.rs:1689"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/versions","src":"src/cf/workers.rs:1696"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/versions","src":"src/cf/workers.rs:1697"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/versions/{vid}","src":"src/cf/workers.rs:1702"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/deployments","src":"src/cf/workers.rs:1707"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/deployments","src":"src/cf/workers.rs:1711"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/deployments/{did}","src":"src/cf/workers.rs:1729"},{"name":"GET /client/v4/accounts/{account}/workers/deployments/by-script/{name}","src":"src/cf/workers.rs:1734"},{"name":"GET /client/v4/accounts/{account}/workers/subdomain","src":"src/cf/workers.rs:1738"},{"name":"PUT /client/v4/accounts/{account}/workers/subdomain","src":"src/cf/workers.rs:1739"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}","src":"src/cf/workers.rs:1752"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}","src":"src/cf/workers.rs:1756"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/settings","src":"src/cf/workers.rs:1760"},{"name":"PATCH /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/settings","src":"src/cf/workers.rs:1764"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/content","src":"src/cf/workers.rs:1765"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/content","src":"src/cf/workers.rs:1769"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/secrets","src":"src/cf/workers.rs:1770"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/secrets","src":"src/cf/workers.rs:1778"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/domains (answers an empty list)","src":"src/cf/workers.rs:1782"},{"name":"GET /client/v4/accounts/{account}/workers/routes (answers an empty list)","src":"src/cf/workers.rs:1782"},{"name":"GET /client/v4/accounts/{account}/workers/dispatch/namespaces (answers an empty list)","src":"src/cf/workers.rs:1782"},{"name":"GET /client/v4/accounts/{account}/workers/durable_objects/namespaces (answers an empty list)","src":"src/cf/workers.rs:1782"},{"name":"GET /client/v4/accounts/{account}/workers/account-settings","src":"src/cf/workers.rs:1783"},{"name":"PUT /client/v4/accounts/{account}/workers/account-settings","src":"src/cf/workers.rs:1784"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/tails (answers an empty list)","src":"src/cf/workers.rs:1785"},{"name":"public host https://<script>.<subdomain>.<LOLA_WORKERS_DOMAIN>/ and path form /cf/{account}/{script}/…","src":"src/cf/workers.rs:323"},{"name":"one workerd process per script, revived at startup, gapless redeploy","src":"src/cf/workers.rs:242"}],"note":"wrangler deploy/redeploy (module + service worker, wasm/text imports, KV/D1/queue/service/version_metadata bindings), secret put|list|delete|bulk, versions upload|list|view|deploy, deployments list|status, triggers deploy, delete — verified with wrangler 4.127.1. Not built: cron triggers (stored and listed, never fire), Durable Objects (namespaces list empty), wrangler tail (POST …/tails), wrangler rollback (one version is kept). — notes/cloudflare.md","src":"REST /client/v4/accounts/{account}/workers/*"}},{"capability":"Public URL for a function","aws":{"service":"Lambda function URLs","status":"full","ops":[{"name":"public function URL on its own host: https://<id>.<LOLA_FN_URL_DOMAIN>/","src":"src/lambda.rs:895","via":"Host: <id>.fn.abot.at"},{"name":"path form /fn-url/{name}/… (no domain needed)","src":"src/lambda.rs:853","via":"GET|POST… /fn-url/{name}/…"},{"name":"AuthType NONE (unsigned) and AWS_IAM (signed)","src":"src/lambda.rs:917"},{"name":"CreateFunctionUrlConfig","src":"src/lambda.rs:114","via":"POST /2015-03-31/functions/{name}/url"},{"name":"UpdateFunctionUrlConfig","src":"src/lambda.rs:115","via":"PUT /2015-03-31/functions/{name}/url"},{"name":"GetFunctionUrlConfig","src":"src/lambda.rs:116","via":"GET /2015-03-31/functions/{name}/url"},{"name":"DeleteFunctionUrlConfig","src":"src/lambda.rs:117","via":"DELETE /2015-03-31/functions/{name}/url"}],"note":"With LOLA_FN_URL_DOMAIN set (metal: fn.abot.at) each URL is https://<id>.<domain>/, the id derived from account and function name; TLS on demand by caddy's *.fn.abot.at block. AuthType NONE and AWS_IAM. — docs/services.md §Lambda"},"google":{"service":"Cloud Run service URI","status":"full","ops":[{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:getIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:setIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:testIamPermissions","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"ANY /run/{p}/{loc}/{s}","src":"../g-lola/src/run.rs:56","via":"proxy"},{"name":"ANY /run/{p}/{loc}/{s}/{path…}","src":"../g-lola/src/run.rs:58","via":"proxy"}],"note":"/run/{project}/{loc}/{svc}/* proxy honouring roles/run.invoker (allUsers = public); a tagged revision at /run/{project}/{loc}/{tag}---{svc}/* (trafficStatuses[].uri); :getIamPolicy/:setIamPolicy/:testIamPermissions per service. — g-lola README"},"cloudflare":{"service":"workers.dev subdomain · routes","status":"full","ops":[{"name":"public host https://<script>.<subdomain>.<LOLA_WORKERS_DOMAIN>/ and path form /cf/{account}/{script}/…","src":"src/cf/workers.rs:323"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1654"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1658"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1658"},{"name":"DELETE /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1668"},{"name":"GET /client/v4/accounts/{account}/workers/subdomain","src":"src/cf/workers.rs:1738"},{"name":"PUT /client/v4/accounts/{account}/workers/subdomain","src":"src/cf/workers.rs:1739"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/domains (answers an empty list)","src":"src/cf/workers.rs:1782"},{"name":"GET /client/v4/accounts/{account}/workers/routes (answers an empty list)","src":"src/cf/workers.rs:1782"}],"note":"LOLA_WORKERS_DOMAIN=workers.abot.at on metal → https://<script>.<subdomain>.workers.abot.at; the path form /cf/{account}/{script}/… needs no domain. Custom domains (…/workers/domains) list empty. — notes/cloudflare.md 'On metal'"}}]},{"type":"Containers & services","rows":[{"capability":"Container services (image in, URL out)","aws":{"service":"ECS · App Runner","status":"full","ops":[{"name":"CreateCluster","src":"src/ecs.rs:2808"},{"name":"DescribeClusters","src":"src/ecs.rs:2816"},{"name":"ListClusters","src":"src/ecs.rs:2832"},{"name":"DeleteCluster","src":"src/ecs.rs:2839"},{"name":"RegisterTaskDefinition","src":"src/ecs.rs:2851"},{"name":"DescribeTaskDefinition","src":"src/ecs.rs:2858"},{"name":"ListTaskDefinitions","src":"src/ecs.rs:2868"},{"name":"ListTaskDefinitionFamilies","src":"src/ecs.rs:2887"},{"name":"DeregisterTaskDefinition","src":"src/ecs.rs:2903"},{"name":"CreateService","src":"src/ecs.rs:2912"},{"name":"UpdateService","src":"src/ecs.rs:2942"},{"name":"DeleteService","src":"src/ecs.rs:3001"},{"name":"DescribeServices","src":"src/ecs.rs:3015"},{"name":"ListServices","src":"src/ecs.rs:3027"},{"name":"RunTask","src":"src/ecs.rs:3042"},{"name":"StopTask","src":"src/ecs.rs:3076"},{"name":"DescribeTasks","src":"src/ecs.rs:3085"},{"name":"ListTasks","src":"src/ecs.rs:3099"},{"name":"TagResource","src":"src/ecs.rs:3123"},{"name":"UntagResource","src":"src/ecs.rs:3123"},{"name":"ListTagsForResource","src":"src/ecs.rs:3123"},{"name":"ListServices","src":"src/services.rs:783"},{"name":"DescribeService","src":"src/services.rs:787"},{"name":"ListOperations","src":"src/services.rs:818"},{"name":"native service API: POST/GET /_lola/api/services (operator console, loopback + token)","src":"src/console.rs:38"},{"name":"DELETE /_lola/api/services/{name}[?purge=true]","src":"src/console.rs:39"},{"name":"GET /_lola/api/services/{name}/logs","src":"src/console.rs:40"},{"name":"service URL on its own host: https://<id>.<LOLA_SERVICE_DOMAIN>/","src":"src/services.rs:715"}],"note":"ECS API: clusters, task-definition families/revisions, services with deployments and events, RunTask with the status walk, awslogs, tags. desiredCount replicas behind one URL, sidecars in one network namespace, healthCheck/essential/dependsOn, a scheduler that replaces a dead or unhealthy task, rolling update-service. App Runner API is read-only (ListServices, DescribeService, ListOperations); AWS::AppRunner::Service in a stack creates. Accepted and ignored: loadBalancers, networkConfiguration, serviceRegistries beyond the Cloud Map URL, Secrets, capacityProviderStrategy, task placement, deploymentCircuitBreaker rollback, enableExecuteCommand. Not there: scale-to-zero, autoscaling, more than one host. — docs/services.md §Containers, notes/ecs.md","src":"X-Amz-Target AmazonEC2ContainerServiceV20141113.*"},"google":{"service":"Cloud Run v2","status":"full","ops":[{"name":"GET /v2/projects/{p}/locations/{loc}/services","src":"../g-lola/src/run.rs:50","via":"list_services"},{"name":"POST /v2/projects/{p}/locations/{loc}/services","src":"../g-lola/src/run.rs:50","via":"create_service"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"get_service"},{"name":"PATCH /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"patch_service"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/services/{s}","src":"../g-lola/src/run.rs:51","via":"delete_service"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:getIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:setIamPolicy","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"POST /v2/projects/{p}/locations/{loc}/services/{s}:testIamPermissions","src":"../g-lola/src/run.rs:51","via":"service_action"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}/revisions","src":"../g-lola/src/run.rs:52","via":"list_revisions"},{"name":"GET /v2/projects/{p}/locations/{loc}/services/{s}/revisions/{r}","src":"../g-lola/src/run.rs:53","via":"get_revision"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/services/{s}/revisions/{r}","src":"../g-lola/src/run.rs:53","via":"delete_revision"},{"name":"GET /v2/projects/{p}/locations/{loc}/operations","src":"../g-lola/src/run.rs:54","via":"list_operations"},{"name":"GET /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"get_operation"},{"name":"POST /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"wait_operation"},{"name":"DELETE /v2/projects/{p}/locations/{loc}/operations/{id}","src":"../g-lola/src/run.rs:55","via":"delete_operation"},{"name":"ANY /run/{p}/{loc}/{s}","src":"../g-lola/src/run.rs:56","via":"proxy"},{"name":"ANY /run/{p}/{loc}/{s}/{path…}","src":"../g-lola/src/run.rs:58","via":"proxy"}],"note":"services/revisions/operations; the revision's container really runs with docker/podman on PATH (host ports from GLOLA_PORT+1000); traffic[] honoured (LATEST, REVISION by name, percent splits served as a weighted round-robin, tag URLs), a revision without a share or tag is RETIRED and restarted from its template when traffic comes back; containers are started again from run/state.json after a restart. Verified with google-cloud-run 0.16.1. — g-lola README"},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Cloudflare has no container product; Workers (Functions) is the compute."}}]},{"type":"Virtual machines","rows":[{"capability":"Virtual machines","aws":{"service":"EC2","status":"partial","ops":[{"name":"RunInstances","src":"src/ec2.rs:104","guard":"only on a host with the VM substrate (vm::available())"},{"name":"DescribeInstances","src":"src/ec2.rs:152","guard":"only on a host with the VM substrate (vm::available())"},{"name":"TerminateInstances","src":"src/ec2.rs:178","guard":"only on a host with the VM substrate (vm::available())"},{"name":"StopInstances","src":"src/ec2.rs:178","guard":"only on a host with the VM substrate (vm::available())"},{"name":"StartInstances","src":"src/ec2.rs:178","guard":"only on a host with the VM substrate (vm::available())"},{"name":"RebootInstances","src":"src/ec2.rs:178","guard":"only on a host with the VM substrate (vm::available())"},{"name":"GetConsoleOutput","src":"src/ec2.rs:213","guard":"only on a host with the VM substrate (vm::available())"},{"name":"DescribeAvailabilityZones","src":"src/ec2.rs:235"}],"note":"Real QEMU/KVM guests only on a host with the VM substrate (vm::available(): KVM, qemu-img, cloud-localds, the lola-vps@ unit, a Debian cloud image — metal is one). RunInstances (UserData → cloud-init, instance types → vCPU/RAM/disk, NAT IPv4 + routed public IPv6), Describe/Stop/Start/Reboot/TerminateInstances, GetConsoleOutput; per-account quotas (LOLA_EC2_*). Inside a cell the instance arms are absent: RunInstances answers UnauthorizedOperation, any other action InvalidAction. DescribeAvailabilityZones always answers; VPCs/subnets/security groups are CloudFormation stubs. No AMIs, volumes, ENIs, key pairs, security-group API. — docs/services.md §EC2","src":"Query protocol Version=2016-11-15"},"google":{"service":"—","status":"none","ops":[],"note":"No Compute Engine in g-lola (not in its service priority list)."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Cloudflare has no VM product."}}]},{"type":"Object storage","rows":[{"capability":"Buckets & objects","aws":{"service":"S3","status":"full","ops":[{"name":"ListBuckets","src":"src/s3.rs:82","via":"GET /"},{"name":"CreateBucket","src":"src/s3.rs:110","via":"PUT /{bucket}"},{"name":"DeleteBucket","src":"src/s3.rs:111","via":"DELETE /{bucket}"},{"name":"HeadBucket","src":"src/s3.rs:112","via":"HEAD /{bucket}"},{"name":"GetBucketLocation","src":"src/s3.rs:113","via":"GET /{bucket}?location"},{"name":"ListObjects / ListObjectsV2","src":"src/s3.rs:117","via":"GET /{bucket}[?list-type=2]"},{"name":"DeleteObjects","src":"src/s3.rs:118","via":"POST /{bucket}?delete"},{"name":"CreateMultipartUpload","src":"src/s3.rs:133","via":"POST /{bucket}/{key}?uploads"},{"name":"UploadPart","src":"src/s3.rs:136","via":"PUT /{bucket}/{key}?uploadId"},{"name":"CompleteMultipartUpload","src":"src/s3.rs:139","via":"POST /{bucket}/{key}?uploadId"},{"name":"AbortMultipartUpload","src":"src/s3.rs:142","via":"DELETE /{bucket}/{key}?uploadId"},{"name":"PutObject","src":"src/s3.rs:145","via":"PUT /{bucket}/{key}"},{"name":"CopyObject","src":"src/s3.rs:620","via":"PUT /{bucket}/{key} + x-amz-copy-source"},{"name":"HeadObject","src":"src/s3.rs:147","via":"HEAD /{bucket}/{key}"},{"name":"DeleteObject","src":"src/s3.rs:148","via":"DELETE /{bucket}/{key}"}],"note":"Not there: object versioning, lifecycle rules, bucket policies, ACLs, tagging, CORS, encryption configuration — these subresources are refused with NotImplemented, not recorded (src/s3.rs: ?versioning, ?versions, ?tagging, ?policy, ?encryption, ?lifecycle, ?cors, ?website, ?replication, ?notification, ?acl, ?object-lock, ?accelerate, ?logging, ?requestPayment, ?publicAccessBlock). Range GETs are not honoured — the whole object comes back. Multipart upload works, aws-chunked is decoded. — docs/services.md §S3"},"google":{"service":"Cloud Storage JSON + XML API","status":"partial","ops":[{"name":"GET /storage/v1/b","src":"../g-lola/src/main.rs:592","via":"list_buckets"},{"name":"POST /storage/v1/b","src":"../g-lola/src/main.rs:592","via":"insert_bucket"},{"name":"GET /storage/v1/b/{name}","src":"../g-lola/src/main.rs:593","via":"get_bucket"},{"name":"DELETE /storage/v1/b/{name}","src":"../g-lola/src/main.rs:593","via":"delete_bucket"},{"name":"GET /storage/v1/b/{bucket}/o","src":"../g-lola/src/main.rs:594","via":"list_objects"},{"name":"GET /storage/v1/b/{bucket}/o/{name…}","src":"../g-lola/src/main.rs:595","via":"get_object"},{"name":"DELETE /storage/v1/b/{bucket}/o/{name…}","src":"../g-lola/src/main.rs:595","via":"delete_object"},{"name":"POST /upload/storage/v1/b/{bucket}/o","src":"../g-lola/src/main.rs:596","via":"upload_object"},{"name":"GET /download/storage/v1/b/{bucket}/o/{name…}","src":"../g-lola/src/main.rs:597","via":"download_object"},{"name":"PUT /{bucket}","src":"../g-lola/src/storage_xml.rs:73","via":"create_bucket"},{"name":"GET /{bucket}","src":"../g-lola/src/storage_xml.rs:73","via":"get_bucket"},{"name":"HEAD /{bucket}","src":"../g-lola/src/storage_xml.rs:73","via":"head_bucket"},{"name":"DELETE /{bucket}","src":"../g-lola/src/storage_xml.rs:73","via":"delete_bucket"},{"name":"PUT /{bucket}/{object…}","src":"../g-lola/src/storage_xml.rs:75","via":"put_object"},{"name":"GET /{bucket}/{object…}","src":"../g-lola/src/storage_xml.rs:75","via":"get_object"},{"name":"HEAD /{bucket}/{object…}","src":"../g-lola/src/storage_xml.rs:75","via":"head_object"},{"name":"DELETE /{bucket}/{object…}","src":"../g-lola/src/storage_xml.rs:75","via":"delete_object"},{"name":"?acl / ?versioning / ?uploads answer 501","src":"../g-lola/src/storage_xml.rs:100"}],"note":"JSON API (main.rs): buckets list/insert/get/delete, objects upload (uploadType=media and multipart, custom metadata), alt=media and /download/storage/v1, delete; object listing by prefix only (no delimiter, no paging); no copy/rewrite/compose/patch (copy is XML-only); no resumable uploads. Both faces resolve buckets through one helper (bucket_for in main.rs): a bucket another project owns is 403 on every JSON and XML route, a ?project= that is not the caller's is 403, a name another project holds is 409 ALREADY_EXISTS on create. XML API (storage_xml.rs): S3-shaped PUT/GET/HEAD/DELETE, listing with prefix/delimiter/paging (marker and list-type=2), server-side copy, x-goog-hash, x-goog-meta-*, Range, If-*/x-goog-if-* preconditions; ?acl/?versioning/?uploads answer 501. Verified with boto3 1.34. — g-lola README"},"cloudflare":{"service":"R2","status":"full","ops":[{"name":"GET /client/v4/accounts/{account}/r2/buckets","src":"src/cf/r2.rs:615"},{"name":"POST /client/v4/accounts/{account}/r2/buckets","src":"src/cf/r2.rs:616"},{"name":"PUT /client/v4/accounts/{account}/r2/buckets/{name}","src":"src/cf/r2.rs:626"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}","src":"src/cf/r2.rs:633"},{"name":"PATCH /client/v4/accounts/{account}/r2/buckets/{name}","src":"src/cf/r2.rs:644"},{"name":"DELETE /client/v4/accounts/{account}/r2/buckets/{name}","src":"src/cf/r2.rs:655"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/cors","src":"src/cf/r2.rs:656"},{"name":"PUT /client/v4/accounts/{account}/r2/buckets/{name}/cors","src":"src/cf/r2.rs:657"},{"name":"DELETE /client/v4/accounts/{account}/r2/buckets/{name}/cors","src":"src/cf/r2.rs:665"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/lifecycle","src":"src/cf/r2.rs:670"},{"name":"PUT /client/v4/accounts/{account}/r2/buckets/{name}/lifecycle","src":"src/cf/r2.rs:671"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/domains/custom","src":"src/cf/r2.rs:679"},{"name":"POST /client/v4/accounts/{account}/r2/buckets/{name}/domains/custom","src":"src/cf/r2.rs:680"},{"name":"ANY /client/v4/accounts/{account}/r2/buckets/{name}/domains/custom/…","src":"src/cf/r2.rs:681"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/domains/managed","src":"src/cf/r2.rs:685"},{"name":"PUT /client/v4/accounts/{account}/r2/buckets/{name}/domains/managed","src":"src/cf/r2.rs:686"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/usage","src":"src/cf/r2.rs:693"},{"name":"GET /client/v4/accounts/{account}/r2/buckets/{name}/objects","src":"src/cf/r2.rs:704"},{"name":"DELETE /client/v4/accounts/{account}/r2/buckets/{name}/objects","src":"src/cf/r2.rs:705"},{"name":"ANY /client/v4/accounts/{account}/r2/buckets/{name}/objects/…","src":"src/cf/r2.rs:706"},{"name":"R2 binding shim (r2Bucket): head","src":"src/cf/r2.rs:1049"},{"name":"R2 binding shim (r2Bucket): get","src":"src/cf/r2.rs:1050"},{"name":"R2 binding shim (r2Bucket): list","src":"src/cf/r2.rs:1051"},{"name":"R2 binding shim (r2Bucket): put","src":"src/cf/r2.rs:1052"},{"name":"R2 binding shim (r2Bucket): delete","src":"src/cf/r2.rs:1053"},{"name":"R2 binding shim (r2Bucket): createMultipartUpload","src":"src/cf/r2.rs:1054"},{"name":"R2 binding shim (r2Bucket): uploadPart","src":"src/cf/r2.rs:1055"},{"name":"R2 binding shim (r2Bucket): completeMultipartUpload","src":"src/cf/r2.rs:1056"},{"name":"R2 binding shim (r2Bucket): abortMultipartUpload","src":"src/cf/r2.rs:1057"},{"name":"an R2 bucket IS an S3 bucket: S3/R2 SDKs point at lola's S3 endpoint with the same credential","src":"src/cf/r2.rs:1463"}],"note":"wrangler r2 bucket create|list|info|delete, cors set|list, lifecycle add|list, domain add|get|list, dev-url enable, object put|get|delete --remote; the r2Bucket binding (put/head/get/list/delete, httpMetadata, customMetadata, md5, range, onlyIf, include, delimiter/cursor paging, multipart). Not built: R2 event notifications, Sippy, bucket locks, jurisdictions; anonymous serving of R2 buckets at their managed/custom domains is recorded only. — notes/cloudflare.md 'Proven: R2'","src":"REST /client/v4/accounts/{account}/r2/buckets/*"}}]},{"type":"Key-value & document stores","rows":[{"capability":"Key-value / document database","aws":{"service":"DynamoDB","status":"full","ops":[{"name":"CreateTable","src":"src/ddb.rs:139"},{"name":"DescribeTable","src":"src/ddb.rs:140"},{"name":"ListTables","src":"src/ddb.rs:141"},{"name":"DeleteTable","src":"src/ddb.rs:142"},{"name":"PutItem","src":"src/ddb.rs:143"},{"name":"GetItem","src":"src/ddb.rs:144"},{"name":"DeleteItem","src":"src/ddb.rs:145"},{"name":"UpdateItem","src":"src/ddb.rs:146"},{"name":"Scan","src":"src/ddb.rs:147"},{"name":"Query","src":"src/ddb.rs:148"},{"name":"BatchWriteItem","src":"src/ddb.rs:149"},{"name":"BatchGetItem","src":"src/ddb.rs:150"}],"note":"Not there (each refused with NotImplementedException): ProjectionExpression, secondary indexes (a CreateTable with a GSI/LSI is refused), transactions, streams, TTL, pagination (LastEvaluatedKey), UpdateExpression on nested document paths. Numbers are IEEE-754 doubles, not decimal128. ConsistentRead is honoured (eventual-lag simulation). — docs/services.md §DynamoDB Conditional writes are genuinely atomic (checked under the table lock).","src":"X-Amz-Target DynamoDB*"},"google":{"service":"Firestore (Native mode)","status":"full","ops":[{"name":"GET /v1/projects/{id}/databases","src":"../g-lola/src/firestore.rs:28","via":"list_databases"},{"name":"GET /v1/projects/{id}/databases/{database}","src":"../g-lola/src/firestore.rs:29","via":"get_database"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:runQuery","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:runAggregationQuery","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:listCollectionIds","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:batchGet","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:commit","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:batchWrite","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:beginTransaction","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/…:rollback","src":"../g-lola/src/firestore.rs:30","via":"dispatch"},{"name":"GET /v1/projects/{id}/databases/{database}/documents/… · list_documents","src":"../g-lola/src/firestore.rs:30","via":"list_documents"},{"name":"POST /v1/projects/{id}/databases/{database}/documents/… · create_document","src":"../g-lola/src/firestore.rs:30","via":"create_document"},{"name":"GET /v1/projects/{id}/databases/{database}/documents/… · get_document","src":"../g-lola/src/firestore.rs:30","via":"get_document"},{"name":"PATCH /v1/projects/{id}/databases/{database}/documents/… · patch_document","src":"../g-lola/src/firestore.rs:30","via":"patch_document"},{"name":"DELETE /v1/projects/{id}/databases/{database}/documents/… · delete_document","src":"../g-lola/src/firestore.rs:30","via":"delete_document"}],"note":"One database (default) per project; documents CRUD with updateMask and preconditions, list/paging, runQuery (field/composite/unary filters, orderBy, select, startAt/endAt, limit/offset), runAggregationQuery, batchGet, commit, batchWrite, transactions, subcollections, listCollectionIds; own store (in-memory map + JSON-lines log). Not yet: listen/write streams, gRPC. Verified with google-cloud-firestore. — g-lola README"},"cloudflare":{"service":"Workers KV","status":"full","ops":[{"name":"GET /client/v4/accounts/{account}/storage/kv/namespaces","src":"src/cf/kv.rs:535"},{"name":"POST /client/v4/accounts/{account}/storage/kv/namespaces","src":"src/cf/kv.rs:536"},{"name":"GET /client/v4/accounts/{account}/storage/kv/namespaces/{id}","src":"src/cf/kv.rs:546"},{"name":"PUT /client/v4/accounts/{account}/storage/kv/namespaces/{id}","src":"src/cf/kv.rs:547"},{"name":"DELETE /client/v4/accounts/{account}/storage/kv/namespaces/{id}","src":"src/cf/kv.rs:548"},{"name":"GET /client/v4/accounts/{account}/storage/kv/namespaces/{id}/keys","src":"src/cf/kv.rs:549"},{"name":"PUT /client/v4/accounts/{account}/storage/kv/namespaces/{id}/bulk","src":"src/cf/kv.rs:550"},{"name":"DELETE /client/v4/accounts/{account}/storage/kv/namespaces/{id}/bulk","src":"src/cf/kv.rs:551"},{"name":"POST /client/v4/accounts/{account}/storage/kv/namespaces/{id}/bulk/delete","src":"src/cf/kv.rs:551"},{"name":"POST /client/v4/accounts/{account}/storage/kv/namespaces/{id}/bulk/get","src":"src/cf/kv.rs:552"},{"name":"GET /client/v4/accounts/{account}/storage/kv/namespaces/{id}/values/{key}","src":"src/cf/kv.rs:553"},{"name":"PUT /client/v4/accounts/{account}/storage/kv/namespaces/{id}/values/{key}","src":"src/cf/kv.rs:553"},{"name":"DELETE /client/v4/accounts/{account}/storage/kv/namespaces/{id}/values/{key}","src":"src/cf/kv.rs:553"},{"name":"KV binding shim: GET /_cf/kv/{account}/{ns} (list)","src":"src/cf/kv.rs:881"},{"name":"KV binding shim: POST /_cf/kv/{account}/{ns}/bulk/get","src":"src/cf/kv.rs:886"},{"name":"KV binding shim: GET /_cf/kv/{account}/{ns}/{key}","src":"src/cf/kv.rs:881"},{"name":"KV binding shim: PUT /_cf/kv/{account}/{ns}/{key}","src":"src/cf/kv.rs:881"},{"name":"KV binding shim: DELETE /_cf/kv/{account}/{ns}/{key}","src":"src/cf/kv.rs:881"}],"note":"Namespaces as records in the reserved SSM namespace, values as files; wrangler kv namespace create, kv key list --remote verified; env.KV.put/get through the shim; bulk get/write/delete, metadata, expiration/expiration_ttl. Values travel in LOLA::Backup::Plan dumps and follow the primary as FilePut/FileDelete. — notes/cloudflare.md","src":"REST /client/v4/accounts/{account}/storage/kv/namespaces/*"}},{"capability":"Caches & document databases (managed engines)","aws":{"service":"ElastiCache · DocumentDB (CloudFormation only)","status":"partial","ops":[{"kind":"AWS::ElastiCache::CacheCluster","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::CacheCluster (real)"},{"kind":"AWS::ElastiCache::ReplicationGroup","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::ReplicationGroup (real)"},{"kind":"AWS::ElastiCache::ServerlessCache","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::ServerlessCache (real)"},{"kind":"AWS::DocDB::DBCluster","tier":"real","src":"src/cfn.rs:2085","name":"AWS::DocDB::DBCluster (real)"}],"note":"AWS::ElastiCache::CacheCluster → a Valkey 8 container (in-memory, delete drops it, optional AuthToken); AWS::DocDB::DBCluster → a Mongo 7 with a retained data volume and a working mongodb:// connection string. No ElastiCache/DocDB Query API. — README service table"},"google":{"service":"—","status":"none","ops":[],"note":"No Memorystore in g-lola."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Durable Objects are not built (durable_objects/namespaces lists empty). — notes/cloudflare.md"}}]},{"type":"Relational & SQL","rows":[{"capability":"Relational databases","aws":{"service":"RDS · Aurora DSQL · sqldb (embedded SQLite)","status":"partial","ops":[{"kind":"AWS::RDS::DBInstance","tier":"real","src":"src/cfn.rs:1779","name":"AWS::RDS::DBInstance (real)"},{"kind":"AWS::DSQL::Cluster","tier":"real","src":"src/cfn.rs:1957","name":"AWS::DSQL::Cluster (real)"},{"name":"query","src":"src/sqldb.rs:438","via":"POST /_lola/sqldb/{cluster}/query"},{"name":"exec","src":"src/sqldb.rs:450","via":"POST /_lola/sqldb/{cluster}/exec"},{"name":"batch","src":"src/sqldb.rs:467","via":"POST /_lola/sqldb/{cluster}/batch"},{"name":"txn","src":"src/sqldb.rs:608","via":"POST /_lola/sqldb/{cluster}/txn"},{"name":"adjudicate","src":"src/sqldb.rs:611","via":"POST /_lola/sqldb/{cluster}/adjudicate"}],"note":"CloudFormation only — there is no RDS Query API. AWS::RDS::DBInstance with Engine postgres (default), mysql/mariadb, pgvector or timescale starts a real database container with its own host port (the canonical port is bridged into each account's Lambda sandbox); Mode: serverless pauses when idle behind a wake-proxy. Engine: sqlite is embedded in lola behind the signed /_lola/sqldb/<cluster>/{query,exec,batch} API (replicated as session changesets); Engine: pglite runs Postgres in WASM. AWS::DSQL::Cluster is a Postgres with TLS, port 5432 and any password accepted (the IAM token is accepted by being ignored); DSQL's economics and restrictions (no FKs/SERIAL) are not modelled. — docs/services.md §RDS, notes/db-portfolio.md","src":"Query protocol Version=2010-05-15 (CloudFormation) · REST /_lola/sqldb/"},"google":{"service":"Cloud SQL","status":"none","ops":[],"note":"Not started (g-lola README service priority row 7: 'Cloud SQL (Postgres) — one API over the same databases')."},"cloudflare":{"service":"D1","status":"full","ops":[{"name":"POST /client/v4/accounts/{account}/d1/database","src":"src/cf/d1.rs:566"},{"name":"GET /client/v4/accounts/{account}/d1/database","src":"src/cf/d1.rs:567"},{"name":"GET /client/v4/accounts/{account}/d1/database/{id}","src":"src/cf/d1.rs:576"},{"name":"DELETE /client/v4/accounts/{account}/d1/database/{id}","src":"src/cf/d1.rs:577"},{"name":"PUT /client/v4/accounts/{account}/d1/database/{id}","src":"src/cf/d1.rs:578"},{"name":"PATCH /client/v4/accounts/{account}/d1/database/{id}","src":"src/cf/d1.rs:578"},{"name":"POST /client/v4/accounts/{account}/d1/database/{id}/query","src":"src/cf/d1.rs:579"},{"name":"POST /client/v4/accounts/{account}/d1/database/{id}/raw","src":"src/cf/d1.rs:580"},{"name":"POST /client/v4/accounts/{account}/d1/database/{id}/export","src":"src/cf/d1.rs:581"},{"name":"POST /client/v4/accounts/{account}/d1/database/{id}/import","src":"src/cf/d1.rs:582"},{"name":"PUT /client/v4/accounts/{account}/d1/database/{id}/import/upload/…","src":"src/cf/d1.rs:583"},{"name":"POST /client/v4/accounts/{account}/d1/database/{id}/import/upload/…","src":"src/cf/d1.rs:583"},{"name":"D1 binding shim: POST /_cf/d1/{account}/{db}/query","src":"src/cf/d1.rs:994"},{"name":"D1 binding shim: POST /_cf/d1/{account}/{db}/execute","src":"src/cf/d1.rs:994"},{"name":"D1 binding shim: POST /_cf/d1/{account}/{db}/dump (refused)","src":"src/cf/d1.rs:1011"}],"note":"Over sqldb (the serverless SQLite). d1 create/list/info/execute --remote (--command, --json, --file)/export --remote/migrations apply|list --remote/delete pass; env.DB prepare().bind().all()/first()/run()/raw(), batch(), exec(), withSession(), BLOB params. Not built: D1 time travel, D1.dump() (the shim refuses it; use the export API). — notes/cloudflare.md 'D1 verified'","src":"REST /client/v4/accounts/{account}/d1/database/*"}}]},{"type":"Secrets & parameters","rows":[{"capability":"Secrets & configuration parameters","aws":{"service":"SSM Parameter Store","status":"full","ops":[{"name":"PutParameter","src":"src/ssm.rs:83"},{"name":"GetParameter","src":"src/ssm.rs:114"},{"name":"GetParameters","src":"src/ssm.rs:139"},{"name":"DeleteParameter","src":"src/ssm.rs:164"},{"name":"DescribeParameters","src":"src/ssm.rs:175"},{"name":"GetParametersByPath","src":"src/ssm.rs:188"}],"note":"put/get/delete-parameter, get-parameters, get-parameters-by-path, describe-parameters; SecureString sealed at rest; /lola/* is reserved. No Secrets Manager API. — docs/services.md 'Also present'","src":"X-Amz-Target AmazonSSM*"},"google":{"service":"Secret Manager","status":"full","ops":[{"name":"GET /v1/projects/{id}/secrets","src":"../g-lola/src/secretmanager.rs:74","via":"list_secrets"},{"name":"POST /v1/projects/{id}/secrets","src":"../g-lola/src/secretmanager.rs:74","via":"create_secret"},{"name":"GET /v1/projects/{id}/secrets/{secret}","src":"../g-lola/src/secretmanager.rs:75","via":"secret_get"},{"name":"GET /v1/projects/{id}/secrets/{secret}:getIamPolicy","src":"../g-lola/src/secretmanager.rs:75","via":"secret_get"},{"name":"POST /v1/projects/{id}/secrets/{secret}:addVersion","src":"../g-lola/src/secretmanager.rs:75","via":"secret_post"},{"name":"POST /v1/projects/{id}/secrets/{secret}:setIamPolicy","src":"../g-lola/src/secretmanager.rs:75","via":"secret_post"},{"name":"POST /v1/projects/{id}/secrets/{secret}:testIamPermissions","src":"../g-lola/src/secretmanager.rs:75","via":"secret_post"},{"name":"PATCH /v1/projects/{id}/secrets/{secret}","src":"../g-lola/src/secretmanager.rs:75","via":"update_secret"},{"name":"DELETE /v1/projects/{id}/secrets/{secret}","src":"../g-lola/src/secretmanager.rs:75","via":"delete_secret"},{"name":"GET /v1/projects/{id}/secrets/{secret}/versions","src":"../g-lola/src/secretmanager.rs:76","via":"list_versions"},{"name":"GET /v1/projects/{id}/secrets/{secret}/versions/{version}","src":"../g-lola/src/secretmanager.rs:77","via":"version_get"},{"name":"GET /v1/projects/{id}/secrets/{secret}/versions/{version}:access","src":"../g-lola/src/secretmanager.rs:77","via":"version_get"},{"name":"POST /v1/projects/{id}/secrets/{secret}/versions/{version}:disable","src":"../g-lola/src/secretmanager.rs:77","via":"version_post"},{"name":"POST /v1/projects/{id}/secrets/{secret}/versions/{version}:enable","src":"../g-lola/src/secretmanager.rs:77","via":"version_post"},{"name":"POST /v1/projects/{id}/secrets/{secret}/versions/{version}:destroy","src":"../g-lola/src/secretmanager.rs:77","via":"version_post"}],"note":"Secrets (labels, annotations, topics, rotation, expireTime/ttl), versions (addVersion with dataCrc32c, :access, enable/disable/destroy, delayed destruction via versionDestroyTtl), versionAliases, latest, IAM policy per secret. Payloads are sealed at rest (ChaCha20-Poly1305, a nonce per version, files mode 0600) under GLOLA_DATA_KEY or data_dir/secretmanager/.key; a malformed key fails closed (500, never plaintext). Verified with google-cloud-secret-manager. — g-lola README"},"cloudflare":{"service":"Worker secrets (secret_text bindings)","status":"full","ops":[{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1627"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1635"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1635"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/secrets-bulk","src":"src/cf/workers.rs:1636"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/secrets/{sname}","src":"src/cf/workers.rs:1637"},{"name":"DELETE /client/v4/accounts/{account}/workers/scripts/{name}/secrets/{sname}","src":"src/cf/workers.rs:1642"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/secrets","src":"src/cf/workers.rs:1770"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/secrets","src":"src/cf/workers.rs:1778"}],"note":"wrangler secret put|list|delete|bulk (PATCH …/secrets-bulk is an RFC 7396 merge patch, one restart per batch); secrets are injected into the script's workerd config. — notes/cloudflare.md 'Verified (workers face)'"}}]},{"type":"Queues","rows":[{"capability":"Message queues","aws":{"service":"SQS","status":"partial","ops":[{"name":"CreateQueue","src":"src/sqs.rs:173"},{"name":"GetQueueUrl","src":"src/sqs.rs:218"},{"name":"ListQueues","src":"src/sqs.rs:225"},{"name":"DeleteQueue","src":"src/sqs.rs:234"},{"name":"SendMessage","src":"src/sqs.rs:243"},{"name":"ReceiveMessage","src":"src/sqs.rs:289"},{"name":"DeleteMessage","src":"src/sqs.rs:293"},{"name":"ChangeMessageVisibility","src":"src/sqs.rs:311"},{"name":"GetQueueAttributes","src":"src/sqs.rs:329"},{"name":"PurgeQueue","src":"src/sqs.rs:357"}],"note":"Visibility timeouts, per-message receive counts, redrive to a dead-letter queue; queues are WAL-durable (each Send/Delete writes the whole queue — O(queue) write amplification). No FIFO queues; no SetQueueAttributes (ReceiveMessageWaitTimeSeconds is set at CreateQueue). Long polling (WaitTimeSeconds ≤ 20) and MessageAttributes/MD5OfMessageAttributes on the wire since build 39. — README 'Known gaps', src/sqs.rs","src":"X-Amz-Target AmazonSQS*"},"google":{"service":"Pub/Sub (pull subscriptions)","status":"full","ops":[{"name":"GET /v1/projects/{project}/topics/{topic}/subscriptions","src":"../g-lola/src/pubsub.rs:1625","via":"topic_subscriptions"},{"name":"GET /v1/projects/{project}/subscriptions","src":"../g-lola/src/pubsub.rs:1626","via":"list_subscriptions"},{"name":"GET /v1/projects/{project}/subscriptions/{subscription}","src":"../g-lola/src/pubsub.rs:1627","via":"get_subscription"},{"name":"GET /v1/projects/{project}/subscriptions/{subscription}:getIamPolicy","src":"../g-lola/src/pubsub.rs:1627","via":"get_subscription"},{"name":"PUT /v1/projects/{project}/subscriptions/{subscription}","src":"../g-lola/src/pubsub.rs:1627","via":"create_subscription"},{"name":"DELETE /v1/projects/{project}/subscriptions/{subscription}","src":"../g-lola/src/pubsub.rs:1627","via":"delete_subscription"},{"name":"PATCH /v1/projects/{project}/subscriptions/{subscription}","src":"../g-lola/src/pubsub.rs:1627","via":"patch_subscription"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:pull","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:acknowledge","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:modifyAckDeadline","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:seek (some inputs answer 501 UNIMPLEMENTED)","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:modifyPushConfig","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:detach","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:setIamPolicy","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"},{"name":"POST /v1/projects/{project}/subscriptions/{subscription}:testIamPermissions","src":"../g-lola/src/pubsub.rs:1627","via":"subscription_verb"}],"note":"pull/ack/modifyAckDeadline, ordering keys, filters, dead-letter topics, retry/expiration policies, seek by time (seek to a snapshot answers 501). Pub/Sub leases are runtime state: after a restart unacked messages are redelivered. Verified with google-cloud-pubsub 2.39. — g-lola README"},"cloudflare":{"service":"Queues","status":"full","ops":[{"name":"GET /client/v4/accounts/{account}/queues","src":"src/cf/queues.rs:534"},{"name":"POST /client/v4/accounts/{account}/queues","src":"src/cf/queues.rs:535"},{"name":"GET /client/v4/accounts/{account}/queues/{id}","src":"src/cf/queues.rs:536"},{"name":"PUT /client/v4/accounts/{account}/queues/{id}","src":"src/cf/queues.rs:540"},{"name":"PATCH /client/v4/accounts/{account}/queues/{id}","src":"src/cf/queues.rs:540"},{"name":"DELETE /client/v4/accounts/{account}/queues/{id}","src":"src/cf/queues.rs:541"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/purge","src":"src/cf/queues.rs:542"},{"name":"GET /client/v4/accounts/{account}/queues/{id}/purge","src":"src/cf/queues.rs:543"},{"name":"GET /client/v4/accounts/{account}/queues/{id}/metrics","src":"src/cf/queues.rs:547"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages","src":"src/cf/queues.rs:551"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/batch","src":"src/cf/queues.rs:552"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/pull","src":"src/cf/queues.rs:553"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/ack","src":"src/cf/queues.rs:554"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/extend","src":"src/cf/queues.rs:555"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/peek","src":"src/cf/queues.rs:556"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/messages/purge","src":"src/cf/queues.rs:563"},{"name":"GET /client/v4/accounts/{account}/queues/{id}/consumers","src":"src/cf/queues.rs:564"},{"name":"POST /client/v4/accounts/{account}/queues/{id}/consumers","src":"src/cf/queues.rs:568"},{"name":"GET /client/v4/accounts/{account}/queues/{id}/consumers/{cid}","src":"src/cf/queues.rs:569"},{"name":"PUT /client/v4/accounts/{account}/queues/{id}/consumers/{cid}","src":"src/cf/queues.rs:576"},{"name":"DELETE /client/v4/accounts/{account}/queues/{id}/consumers/{cid}","src":"src/cf/queues.rs:577"},{"name":"Queues binding shim: POST /_cf/queues/{account}/{queue}/message","src":"src/cf/queues.rs:1029"},{"name":"Queues binding shim: POST /_cf/queues/{account}/{queue}/batch","src":"src/cf/queues.rs:1030"},{"name":"Queues binding shim: GET /_cf/queues/{account}/{queue}/metrics","src":"src/cf/queues.rs:1031"},{"name":"worker consumers: lola's delivery loop posts batches into the consumer worker's workerd (ack/retry/DLQ)","src":"src/cf/queues.rs:83"},{"name":"pull consumers: messages/pull + ack + extend (lease carries the message id)","src":"src/cf/queues.rs:553"}],"note":"Over SQS. wrangler queues create/list/info/update/pause-delivery/resume-delivery/purge/delete, consumer http|worker add/list/remove, deploy consumer sync; send()/sendBatch() with content types and delays; ack/retry/retryAll/ackAll, retries exhaust into the DLQ, pause/resume, exactly-once batches observed. — notes/cloudflare.md 'Queues verified'","src":"REST /client/v4/accounts/{account}/queues/*"}}]},{"type":"Events & pub/sub","rows":[{"capability":"Event bus / topics","aws":{"service":"EventBridge","status":"partial","ops":[{"name":"PutEvents","src":"src/events.rs:434"},{"name":"TestEventPattern","src":"src/events.rs:447"},{"name":"CreateEventBus","src":"src/events.rs:452"},{"name":"DeleteEventBus","src":"src/events.rs:462"},{"name":"DescribeEventBus","src":"src/events.rs:467"},{"name":"ListEventBuses","src":"src/events.rs:475"},{"name":"PutRule","src":"src/events.rs:412"},{"name":"PutTargets","src":"src/events.rs:426"},{"name":"RemoveTargets","src":"src/events.rs:487"},{"name":"ListRules","src":"src/events.rs:503"},{"name":"DescribeRule","src":"src/events.rs:514"},{"name":"ListTargetsByRule","src":"src/events.rs:522"},{"name":"EnableRule","src":"src/events.rs:535"},{"name":"DisableRule","src":"src/events.rs:535"},{"name":"DeleteRule","src":"src/events.rs:547"}],"note":"Event patterns carry AWS's semantics (nested keys, alternatives, prefix/suffix/anything-but/exists/numeric/equals-ignore-case) on the default or a custom bus; targets are Lambda, SQS and a log group. Not built: Scheduler (AWS::Scheduler::Schedule), archives/replay, API destinations, input transformers, dead-letter configs, cross-account buses. No SNS. — notes/hybrid.md, README 'Known gaps'","src":"X-Amz-Target AWSEvents*"},"google":{"service":"Pub/Sub (topics, publish, push)","status":"full","ops":[{"name":"GET /v1/projects/{project}/topics","src":"../g-lola/src/pubsub.rs:1623","via":"list_topics"},{"name":"GET /v1/projects/{project}/topics/{topic}","src":"../g-lola/src/pubsub.rs:1624","via":"get_topic"},{"name":"GET /v1/projects/{project}/topics/{topic}:getIamPolicy","src":"../g-lola/src/pubsub.rs:1624","via":"get_topic"},{"name":"PUT /v1/projects/{project}/topics/{topic}","src":"../g-lola/src/pubsub.rs:1624","via":"create_topic"},{"name":"DELETE /v1/projects/{project}/topics/{topic}","src":"../g-lola/src/pubsub.rs:1624","via":"delete_topic"},{"name":"PATCH /v1/projects/{project}/topics/{topic}","src":"../g-lola/src/pubsub.rs:1624","via":"patch_topic"},{"name":"POST /v1/projects/{project}/topics/{topic}:publish","src":"../g-lola/src/pubsub.rs:1624","via":"topic_verb"},{"name":"POST /v1/projects/{project}/topics/{topic}:setIamPolicy","src":"../g-lola/src/pubsub.rs:1624","via":"topic_verb"},{"name":"POST /v1/projects/{project}/topics/{topic}:testIamPermissions","src":"../g-lola/src/pubsub.rs:1624","via":"topic_verb"}],"note":"Topics, publish, push subscriptions with backoff, IAM policy per topic. Not yet: snapshots, schemas, gRPC. — g-lola README"},"cloudflare":{"service":"—","status":"none","ops":[],"note":"No Cloudflare pub/sub product is modelled; Queues (above) carry the consumer bindings. Durable Objects are not built."}}]},{"type":"Scheduling","rows":[{"capability":"Scheduled jobs","aws":{"service":"EventBridge schedules (rate / cron rules)","status":"partial","ops":[{"name":"rate(n minutes|hours|days) schedules","src":"src/events.rs:164"},{"name":"cron(…) six-field schedules","src":"src/events.rs:169"},{"name":"one process-wide ticker; a follower never fires","src":"src/events.rs:273"},{"name":"PutRule","src":"src/events.rs:412"},{"name":"PutTargets","src":"src/events.rs:426"},{"name":"EnableRule","src":"src/events.rs:535"},{"name":"DisableRule","src":"src/events.rs:535"}],"note":"rate(n minutes) and AWS's six-field cron(...) both fire on one process-wide ticker; a follower never fires. A scheduled invocation goes through the same runtime as an HTTP one. Not built: the EventBridge Scheduler API (AWS::Scheduler::Schedule). — README 'EventBridge'","src":"X-Amz-Target AWSEvents*"},"google":{"service":"Cloud Scheduler","status":"none","ops":[],"note":"Not in g-lola (no module)."},"cloudflare":{"service":"Cron triggers","status":"none","ops":[{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/schedules","src":"src/cf/workers.rs:1672"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/schedules","src":"src/cf/workers.rs:1676"}],"note":"PUT/GET …/scripts/{name}/schedules are accepted (wrangler triggers deploy passes) but nothing fires: 'cron triggers (stored and listed, never fire)'. — notes/cloudflare.md"}}]},{"type":"API gateway & custom domains","rows":[{"capability":"HTTP/WebSocket APIs & custom domains","aws":{"service":"API Gateway v2","status":"full","ops":[{"name":"CreateDomainName","src":"src/apigw.rs:719","via":"POST /v2/domainnames"},{"name":"GetDomainNames","src":"src/apigw.rs:733","via":"GET /v2/domainnames"},{"name":"GetDomainName","src":"src/apigw.rs:742","via":"GET /v2/domainnames/{d}"},{"name":"DeleteDomainName","src":"src/apigw.rs:746","via":"DELETE /v2/domainnames/{d}"},{"name":"CreateApiMapping","src":"src/apigw.rs:751","via":"POST /v2/domainnames/{d}/apimappings"},{"name":"GetApiMappings","src":"src/apigw.rs:767","via":"GET /v2/domainnames/{d}/apimappings"},{"name":"DeleteApiMapping","src":"src/apigw.rs:777","via":"DELETE /v2/domainnames/{d}/apimappings/{_}"},{"name":"CreateApi","src":"src/apigw.rs:785","via":"POST /v2/apis"},{"name":"GetApis","src":"src/apigw.rs:835","via":"GET /v2/apis"},{"name":"GetApi","src":"src/apigw.rs:848","via":"GET /v2/apis/{id}"},{"name":"DeleteApi","src":"src/apigw.rs:853","via":"DELETE /v2/apis/{id}"},{"name":"CreateIntegration","src":"src/apigw.rs:858","via":"POST /v2/apis/{id}/integrations"},{"name":"GetIntegrations","src":"src/apigw.rs:937","via":"GET /v2/apis/{id}/integrations"},{"name":"CreateRoute","src":"src/apigw.rs:961","via":"POST /v2/apis/{id}/routes"},{"name":"UpdateRoute","src":"src/apigw.rs:1005","via":"PATCH /v2/apis/{id}/routes/{route_id}"},{"name":"GetRoutes","src":"src/apigw.rs:1053","via":"GET /v2/apis/{id}/routes"},{"name":"CreateStage","src":"src/apigw.rs:1072","via":"POST /v2/apis/{id}/stages"},{"name":"@connections management: PostToConnection","src":"src/apigw.rs:388","via":"POST /{stage}/@connections/{id}"},{"name":"@connections management: DeleteConnection","src":"src/apigw.rs:388","via":"DELETE …/@connections/{id}"},{"name":"@connections management: GetConnection","src":"src/apigw.rs:388","via":"GET …/@connections/{id}"},{"name":"WebSocket data plane ws://<endpoint>/ws/{apiId}","src":"src/apigw.rs:104"},{"name":"HTTP data plane /http/{apiId}/{path}","src":"src/apigw.rs:1162"},{"name":"custom-domain routing on Host (DomainName + ApiMapping)","src":"src/apigw.rs:1582"}],"note":"HTTP APIs with AWS_PROXY and HTTP_PROXY integrations, ANY/method routes and {proxy+}, create-api --target quick-create, UpdateRoute to flip a route between a function and a container; WebSocket APIs at /ws/{apiId} with the @connections management API; custom domains (DomainName + ApiMapping) routed on Host. Not there: authorizers, stages beyond a name, mapping templates, usage plans; an api id is a global name in the data-plane path. — docs/services.md §API Gateway v2","src":"REST /v2/, REST /http/"},"google":{"service":"—","status":"none","ops":[],"note":"No API Gateway / Cloud Endpoints / custom-domain mapping in g-lola; a Cloud Run service is reached at its /run/… URI."},"cloudflare":{"service":"Workers routes · custom domains","status":"partial","ops":[{"name":"GET /client/v4/zones/{zid}/workers/routes","src":"src/cf/zones.rs:1488"},{"name":"POST /client/v4/zones/{zid}/workers/routes","src":"src/cf/zones.rs:1489"},{"name":"GET /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1490"},{"name":"PUT /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1491"},{"name":"DELETE /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1492"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{_}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/routes (answers an empty list)","src":"src/cf/workers.rs:1782"}],"note":"Zone routes (…/zones/{zid}/workers/routes CRUD, wrangler [routes]) bind a worker to a host pattern served by lola's front door. Custom domains (…/workers/domains) answer an empty list. No API Shield / API gateway product. — src/cf/zones.rs"}}]},{"type":"DNS","rows":[{"capability":"Hosted zones & records","aws":{"service":"Route 53","status":"partial","ops":[{"name":"CreateHostedZone","src":"src/route53.rs:35","via":"POST /2013-04-01/hostedzone"},{"name":"ListHostedZones","src":"src/route53.rs:36","via":"GET /2013-04-01/hostedzone"},{"name":"GetHostedZone","src":"src/route53.rs:37","via":"GET /2013-04-01/hostedzone/{id}"},{"name":"DeleteHostedZone","src":"src/route53.rs:38","via":"DELETE /2013-04-01/hostedzone/{id}"},{"name":"ChangeResourceRecordSets","src":"src/route53.rs:39","via":"POST /2013-04-01/hostedzone/{id}/rrset"},{"name":"ListResourceRecordSets","src":"src/route53.rs:40","via":"GET /2013-04-01/hostedzone/{id}/rrset"},{"name":"CreateHealthCheck","src":"src/route53.rs:42","via":"POST /2013-04-01/healthcheck"},{"name":"ListHealthChecks","src":"src/route53.rs:43","via":"GET /2013-04-01/healthcheck"},{"name":"GetHealthCheck","src":"src/route53.rs:44","via":"GET /2013-04-01/healthcheck/{id}"},{"name":"GetHealthCheckStatus","src":"src/route53.rs:45","via":"GET /2013-04-01/healthcheck/{id}/status"},{"name":"DeleteHealthCheck","src":"src/route53.rs:46","via":"DELETE /2013-04-01/healthcheck/{id}"},{"name":"Failover routing (PRIMARY/SECONDARY with a health check)","src":"src/route53.rs:322"},{"name":"Weighted routing","src":"src/route53.rs:322"},{"name":"zones served authoritatively by knot","src":"src/route53.rs:137"}],"note":"Hosted zones served authoritatively by the host's knot; change-resource-record-sets, list, health checks, failover and weighted steering. ALIAS records are not built; weighted routing is an approximation; both nameservers live on metal. — docs/services.md, notes/hybrid.md 'Limits'","src":"REST /2013-04-01/"},"google":{"service":"Cloud DNS","status":"none","ops":[],"note":"Cloud DNS: g-lola/src/dns.rs is a skeleton — `pub fn router()` returns `Router::new()` with no routes (Cloud DNS (managed zones, record sets, changes).). README: 'not started'."},"cloudflare":{"service":"Zones · DNS records","status":"full","ops":[{"name":"GET /client/v4/zones","src":"src/cf/zones.rs:1471"},{"name":"POST /client/v4/zones","src":"src/cf/zones.rs:1472"},{"name":"GET /client/v4/zones/{zid}","src":"src/cf/zones.rs:1473"},{"name":"PATCH /client/v4/zones/{zid}","src":"src/cf/zones.rs:1477"},{"name":"DELETE /client/v4/zones/{zid}","src":"src/cf/zones.rs:1478"},{"name":"GET /client/v4/zones/{zid}/dns_records","src":"src/cf/zones.rs:1479"},{"name":"POST /client/v4/zones/{zid}/dns_records","src":"src/cf/zones.rs:1480"},{"name":"POST /client/v4/zones/{zid}/dns_records/batch","src":"src/cf/zones.rs:1481"},{"name":"GET /client/v4/zones/{zid}/dns_records/export","src":"src/cf/zones.rs:1482"},{"name":"POST /client/v4/zones/{zid}/dns_records/import","src":"src/cf/zones.rs:1483"},{"name":"GET /client/v4/zones/{zid}/dns_records/{rid}","src":"src/cf/zones.rs:1484"},{"name":"PUT /client/v4/zones/{zid}/dns_records/{rid}","src":"src/cf/zones.rs:1485"},{"name":"PATCH /client/v4/zones/{zid}/dns_records/{rid}","src":"src/cf/zones.rs:1486"},{"name":"DELETE /client/v4/zones/{zid}/dns_records/{rid}","src":"src/cf/zones.rs:1487"}],"note":"Over Route 53 / knot: zones list/create/get/patch/delete, dns_records CRUD, batch, import/export. `proxied` records are stored but nothing proxies. — notes/cloudflare.md","src":"REST /client/v4/zones/*"}}]},{"type":"CDN & edge","rows":[{"capability":"CDN / edge delivery","aws":{"service":"CloudFront","status":"partial","ops":[{"name":"CreateDistribution","src":"src/cloudfront.rs:280","via":"POST /2020-05-31/distribution"},{"name":"ListDistributions","src":"src/cloudfront.rs:281","via":"GET /2020-05-31/distribution"},{"name":"GetDistribution","src":"src/cloudfront.rs:282","via":"GET /2020-05-31/distribution/{id}"},{"name":"GetDistributionConfig","src":"src/cloudfront.rs:283","via":"GET /2020-05-31/distribution/{id}/config"},{"name":"UpdateDistribution","src":"src/cloudfront.rs:284","via":"PUT /2020-05-31/distribution/{id}/config"},{"name":"DeleteDistribution","src":"src/cloudfront.rs:285","via":"DELETE /2020-05-31/distribution/{id}"},{"name":"CreateInvalidation","src":"src/cloudfront.rs:288","via":"POST /2020-05-31/distribution/{id}/invalidation"},{"name":"ListInvalidations (answers an empty list)","src":"src/cloudfront.rs:289","via":"GET /2020-05-31/distribution/{id}/invalidation"},{"name":"CreateOriginAccessControl","src":"src/cloudfront.rs:293","via":"POST /2020-05-31/origin-access-control"},{"name":"DeleteOriginAccessControl","src":"src/cloudfront.rs:306","via":"DELETE /2020-05-31/origin-access-control/{id}"},{"name":"distribution served on <id>.<LOLA_CDN_DOMAIN> (S3 origin the account owns, or a public custom origin)","src":"src/cloudfront.rs:463"}],"note":"Distributions on <id>.<LOLA_CDN_DOMAIN> (metal: cdn.abot.at) serving an S3 bucket the account owns or a public custom origin; invalidations are accepted; origin access controls recorded. No caching tiers, behaviours beyond the default, signed URLs, functions@edge or WAF. — docs/services.md 'Also present'","src":"REST /2020-05-31/"},"google":{"service":"Cloud CDN","status":"none","ops":[],"note":"Not in g-lola."},"cloudflare":{"service":"Edge (workers routes on a zone)","status":"partial","ops":[{"name":"GET /client/v4/zones/{zid}/workers/routes","src":"src/cf/zones.rs:1488"},{"name":"POST /client/v4/zones/{zid}/workers/routes","src":"src/cf/zones.rs:1489"},{"name":"GET /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1490"},{"name":"PUT /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1491"},{"name":"DELETE /client/v4/zones/{zid}/workers/routes/{rid}","src":"src/cf/zones.rs:1492"}],"note":"A route binds a worker to a zone host pattern, served from lola's single front door. Not replicated on one box, by nature: the anycast edge, WAF/DDoS absorption, Argo, caching. — notes/cloudflare.md"}}]},{"type":"Email","rows":[{"capability":"Transactional email","aws":{"service":"SES","status":"partial","ops":[{"name":"SendEmail","src":"src/ses.rs:37"},{"name":"SendRawEmail","src":"src/ses.rs:38"},{"name":"GetSendQuota","src":"src/ses.rs:39"},{"name":"VerifyDomainIdentity","src":"src/ses.rs:51"},{"name":"VerifyDomainDkim","src":"src/ses.rs:51"},{"name":"GetIdentityVerificationAttributes","src":"src/ses.rs:52"},{"name":"GetIdentityDkimAttributes","src":"src/ses.rs:53"},{"name":"ListIdentities","src":"src/ses.rs:54"},{"name":"DeleteIdentity","src":"src/ses.rs:55"},{"name":"VerifyEmailIdentity","src":"src/ses.rs:56"}],"note":"send-email / send-raw-email through the host MTA, domain and email identities, DKIM published into a Route 53 zone that lives here (LOLA_SES_DOMAINS). No templates, configuration sets, receipt rules or sending statistics. — docs/services.md 'Also present'","src":"Query protocol Version=2010-12-01"},"google":{"service":"—","status":"none","ops":[],"note":"Google has no first-party SES equivalent; not in g-lola."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Cloudflare Email Routing / Email Workers are not modelled."}}]},{"type":"Identity & access","rows":[{"capability":"Identity, credentials & policy","aws":{"service":"IAM · STS · Organizations","status":"partial","ops":[{"name":"GetCallerIdentity","src":"src/sts.rs:18"},{"name":"AssumeRole","src":"src/sts.rs:29"},{"name":"GetSessionToken","src":"src/sts.rs:97"},{"name":"CreateRole","src":"src/iam.rs:270"},{"name":"GetRole","src":"src/iam.rs:296"},{"name":"UpdateAssumeRolePolicy","src":"src/iam.rs:321"},{"name":"DeleteRole","src":"src/iam.rs:331"},{"name":"ListRoles","src":"src/iam.rs:335"},{"name":"TagRole","src":"src/iam.rs:348"},{"name":"UntagRole","src":"src/iam.rs:348"},{"name":"PutRolePolicy","src":"src/iam.rs:351"},{"name":"GetRolePolicy","src":"src/iam.rs:362"},{"name":"DeleteRolePolicy","src":"src/iam.rs:378"},{"name":"ListRolePolicies","src":"src/iam.rs:384"},{"name":"AttachRolePolicy","src":"src/iam.rs:396"},{"name":"DetachRolePolicy","src":"src/iam.rs:396"},{"name":"ListAttachedRolePolicies","src":"src/iam.rs:415"},{"name":"CreatePolicy","src":"src/iam.rs:436"},{"name":"GetPolicy","src":"src/iam.rs:456"},{"name":"GetPolicyVersion","src":"src/iam.rs:472"},{"name":"ListPolicies","src":"src/iam.rs:488"},{"name":"DeletePolicy","src":"src/iam.rs:501"},{"name":"CreateUser","src":"src/iam.rs:508"},{"name":"GetUser","src":"src/iam.rs:525"},{"name":"DeleteUser","src":"src/iam.rs:549"},{"name":"PutUserPolicy","src":"src/iam.rs:553"},{"name":"GetUserPolicy","src":"src/iam.rs:564"},{"name":"ListUserPolicies","src":"src/iam.rs:580"},{"name":"DeleteUserPolicy","src":"src/iam.rs:590"},{"name":"ListAttachedUserPolicies","src":"src/iam.rs:596"},{"name":"AttachUserPolicy","src":"src/iam.rs:615"},{"name":"DetachUserPolicy","src":"src/iam.rs:615"},{"name":"CreateInstanceProfile","src":"src/iam.rs:636"},{"name":"DeleteInstanceProfile","src":"src/iam.rs:650"},{"name":"AddRoleToInstanceProfile","src":"src/iam.rs:654"},{"name":"RemoveRoleFromInstanceProfile","src":"src/iam.rs:654"},{"name":"CreateAccount","src":"src/organizations.rs:21"},{"name":"ListAccounts","src":"src/organizations.rs:22"},{"name":"DescribeCreateAccountStatus","src":"src/organizations.rs:23"},{"name":"CloseAccount","src":"src/organizations.rs:24"},{"name":"DeleteAccount","src":"src/organizations.rs:24"}],"note":"IAM users, roles, managed and inline policies, instance profiles recorded with their real documents; policies are enforced only when LOLA_IAM_ENFORCE is set (metal: all) — the account root and the operator always bypass. Coverage: S3, the JSON X-Amz-Target services and the Query-protocol services; IAM itself, /_lola/*, the Cloudflare face and the REST services (Route 53, CloudFront, API Gateway management, data planes) are allowed and logged. STS AssumeRole evaluates the trust policy under enforcement. Organizations CreateAccount/CloseAccount only for root accounts. Engine gaps: policy variables, ForAllValues/ForAnyValue, permission boundaries/SCPs, AWS-managed policy documents. Credential minting is operator-only. — notes/iam-enforcement.md, docs/services.md","src":"Query protocol Version=2010-05-08 · Query protocol Version=2011-06-15 · X-Amz-Target AWSOrganizations*"},"google":{"service":"IAM · service accounts · OAuth2 tokens","status":"partial","ops":[{"name":"POST /v1/projects/{id}:getIamPolicy","src":"../g-lola/src/iam.rs:1831","via":"project_verb"},{"name":"POST /v1/projects/{id}:setIamPolicy","src":"../g-lola/src/iam.rs:1831","via":"project_verb"},{"name":"POST /v1/projects/{id}:testIamPermissions","src":"../g-lola/src/iam.rs:1831","via":"project_verb"},{"name":"POST /v3/projects/{id}:getIamPolicy","src":"../g-lola/src/iam.rs:1833","via":"project_verb"},{"name":"POST /v3/projects/{id}:setIamPolicy","src":"../g-lola/src/iam.rs:1833","via":"project_verb"},{"name":"POST /v3/projects/{id}:testIamPermissions","src":"../g-lola/src/iam.rs:1833","via":"project_verb"},{"name":"POST /v1/roles:queryGrantableRoles","src":"../g-lola/src/iam.rs:1834","via":"v1_query"},{"name":"POST /v1/permissions:queryTestablePermissions","src":"../g-lola/src/iam.rs:1834","via":"v1_query"},{"name":"GET /v1/projects/{id}/serviceAccounts","src":"../g-lola/src/iam.rs:1835","via":"list_sa"},{"name":"POST /v1/projects/{id}/serviceAccounts","src":"../g-lola/src/iam.rs:1835","via":"create_sa"},{"name":"GET /v1/projects/{id}/serviceAccounts/{sa}","src":"../g-lola/src/iam.rs:1836","via":"get_sa"},{"name":"PATCH /v1/projects/{id}/serviceAccounts/{sa}","src":"../g-lola/src/iam.rs:1836","via":"patch_sa"},{"name":"PUT /v1/projects/{id}/serviceAccounts/{sa}","src":"../g-lola/src/iam.rs:1836","via":"patch_sa"},{"name":"DELETE /v1/projects/{id}/serviceAccounts/{sa}","src":"../g-lola/src/iam.rs:1836","via":"delete_sa"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:disable","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:enable","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:getIamPolicy","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:setIamPolicy","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:testIamPermissions","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:generateAccessToken","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:undelete (always answers 404)","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:signBlob (answers 501 UNIMPLEMENTED)","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:signJwt (answers 501 UNIMPLEMENTED)","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}:generateIdToken (answers 501 UNIMPLEMENTED)","src":"../g-lola/src/iam.rs:1836","via":"sa_verb"},{"name":"GET /v1/projects/{id}/serviceAccounts/{sa}/keys","src":"../g-lola/src/iam.rs:1837","via":"list_keys"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}/keys","src":"../g-lola/src/iam.rs:1837","via":"create_key"},{"name":"GET /v1/projects/{id}/serviceAccounts/{sa}/keys/{key}","src":"../g-lola/src/iam.rs:1838","via":"get_key"},{"name":"DELETE /v1/projects/{id}/serviceAccounts/{sa}/keys/{key}","src":"../g-lola/src/iam.rs:1838","via":"delete_key"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}/keys/{key}:disable","src":"../g-lola/src/iam.rs:1838","via":"key_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}/keys/{key}:enable","src":"../g-lola/src/iam.rs:1838","via":"key_verb"},{"name":"POST /v1/projects/{id}/serviceAccounts/{sa}/keys:upload","src":"../g-lola/src/iam.rs:1839","via":"keys_upload"},{"name":"GET /v1/projects/{id}/roles","src":"../g-lola/src/iam.rs:1840","via":"list_roles"},{"name":"POST /v1/projects/{id}/roles","src":"../g-lola/src/iam.rs:1840","via":"create_role"},{"name":"GET /v1/projects/{id}/roles/{role}","src":"../g-lola/src/iam.rs:1841","via":"get_role"},{"name":"PATCH /v1/projects/{id}/roles/{role}","src":"../g-lola/src/iam.rs:1841","via":"patch_role"},{"name":"DELETE /v1/projects/{id}/roles/{role}","src":"../g-lola/src/iam.rs:1841","via":"delete_role"},{"name":"POST /v1/projects/{id}/roles/{role}:undelete","src":"../g-lola/src/iam.rs:1841","via":"role_verb"},{"name":"GET /v1/roles","src":"../g-lola/src/iam.rs:1842","via":"list_predefined"},{"name":"GET /v1/roles/{id}","src":"../g-lola/src/iam.rs:1843","via":"get_predefined"},{"name":"GET /robot/v1/metadata/x509/{email}","src":"../g-lola/src/iam.rs:1844","via":"x509_certs"},{"name":"POST /token","src":"../g-lola/src/iam.rs:1845","via":"token"},{"name":"GET /computeMetadata/v1","src":"../g-lola/src/iam.rs:1846","via":"metadata_root"},{"name":"GET /computeMetadata/v1/{path…}","src":"../g-lola/src/iam.rs:1848","via":"metadata"},{"name":"GET /","src":"../g-lola/src/main.rs:589","via":"root"},{"name":"GET /v1/projects","src":"../g-lola/src/main.rs:590","via":"list_projects"},{"name":"GET /v1/projects/{id}","src":"../g-lola/src/main.rs:591","via":"get_project"}],"note":"Service accounts + keys (Google JSON key files; only the public half is kept), :generateAccessToken, /token (jwt-bearer → access token; refresh_token with a GLOLA_TOKENS token), the metadata-server token endpoint, getIamPolicy/setIamPolicy/testIamPermissions on projects (v1 and the v3 alias) and service accounts, predefined + custom roles, roles:queryGrantableRoles, permissions:queryTestablePermissions. signBlob/signJwt/generateIdToken answer 501. Access tokens are runtime state (re-authenticate after a restart). Verified with google-api-python-client, gapic resourcemanager_v3 + iam_credentials_v1, google-auth. — g-lola README"},"cloudflare":{"service":"API tokens (the tenant's lola credential)","status":"partial","ops":[{"name":"GET /client/v4/user/tokens/verify","src":"src/cf.rs:124"},{"name":"GET /client/v4/accounts (the caller's account)","src":"src/cf.rs:127"},{"name":"GET /client/v4/memberships","src":"src/cf.rs:130"},{"name":"GET /client/v4/user","src":"src/cf.rs:133"},{"name":"Bearer <AccessKeyId>:<SecretAccessKey> (or X-Auth-Email/X-Auth-Key) — the tenant's lola credential","src":"src/cf.rs:77"},{"name":"per-script shim token for workerd → lola binding calls","src":"src/cf.rs:107"}],"note":"Authorization: Bearer <AccessKeyId>:<SecretAccessKey> (or X-Auth-Email/X-Auth-Key) — no second secret; /user/tokens/verify, /accounts, /memberships and /user answer for the caller. No token creation/rotation API, no account members or roles. — notes/cloudflare.md"}}]},{"type":"Observability","rows":[{"capability":"Logs, metrics & alarms","aws":{"service":"CloudWatch Logs · metrics · alarms","status":"partial","ops":[{"name":"PutMetricFilter","src":"src/logs.rs:293"},{"name":"DescribeMetricFilters","src":"src/logs.rs:308"},{"name":"DeleteMetricFilter","src":"src/logs.rs:315"},{"name":"CreateLogGroup","src":"src/logs.rs:323"},{"name":"DeleteLogGroup","src":"src/logs.rs:345"},{"name":"DescribeLogGroups","src":"src/logs.rs:361"},{"name":"PutRetentionPolicy","src":"src/logs.rs:380"},{"name":"CreateLogStream","src":"src/logs.rs:393"},{"name":"DescribeLogStreams","src":"src/logs.rs:411"},{"name":"PutLogEvents","src":"src/logs.rs:435"},{"name":"GetLogEvents","src":"src/logs.rs:447"},{"name":"FilterLogEvents","src":"src/logs.rs:476"},{"name":"PutMetricData","src":"src/cloudwatch.rs:271"},{"name":"ListMetrics","src":"src/cloudwatch.rs:284"},{"name":"GetMetricStatistics","src":"src/cloudwatch.rs:299"},{"name":"GetMetricData","src":"src/cloudwatch.rs:317"},{"name":"PutMetricAlarm","src":"src/cloudwatch.rs:335"},{"name":"DescribeAlarms","src":"src/cloudwatch.rs:339"},{"name":"DeleteAlarms","src":"src/cloudwatch.rs:347"},{"name":"SetAlarmState","src":"src/cloudwatch.rs:351"}],"note":"A function's stdout/stderr land in /aws/lambda/<name>, one stream per execution environment; metric filters (term + JSON-selector patterns); metrics with EMF extraction, PutMetricData/ListMetrics/GetMetricStatistics/GetMetricData on the Query and JSON protocols; alarms with a 30 s evaluator and Lambda/SQS actions. Not built: subscription filters, Logs Insights queries, composite alarms, dashboards, SNS actions, anomaly detection; FilterLogEvents does a term/substring match; retention is recorded but nothing expires; metric datapoints are in memory and gone after a restart. — README 'Known gaps', notes/hybrid.md","src":"X-Amz-Target Logs_* · X-Amz-Target GraniteServiceVersion20100801*, Query protocol Version=2010-08-01"},"google":{"service":"Cloud Logging · Cloud Monitoring","status":"none","ops":[],"note":"Cloud Logging: g-lola/src/logging.rs is a skeleton — `pub fn router()` returns `Router::new()` with no routes (Cloud Logging (entries:write, entries:list, logs).). README: 'not started'. Cloud Monitoring: g-lola/src/monitoring.rs is a skeleton — `pub fn router()` returns `Router::new()` with no routes (Cloud Monitoring (timeSeries create/list, metric descriptors).). README: 'not started'."},"cloudflare":{"service":"wrangler tail","status":"none","ops":[],"note":"GET …/scripts/{name}/tails answers an empty list; POST (what wrangler tail needs) is not built. Worker logs are not exposed. — notes/cloudflare.md"}}]},{"type":"Infrastructure as code","rows":[{"capability":"Declarative deployment","aws":{"service":"CloudFormation · CDK","status":"partial","ops":[{"name":"RollbackStack","src":"src/cfn.rs:2788"},{"name":"ContinueUpdateRollback","src":"src/cfn.rs:2788"},{"name":"CancelUpdateStack","src":"src/cfn.rs:2788"},{"name":"CreateStack","src":"src/cfn.rs:2802"},{"name":"UpdateStack","src":"src/cfn.rs:2802"},{"name":"CreateChangeSet","src":"src/cfn.rs:2908"},{"name":"DescribeChangeSet","src":"src/cfn.rs:2978"},{"name":"ExecuteChangeSet","src":"src/cfn.rs:3030"},{"name":"DeleteChangeSet","src":"src/cfn.rs:3113"},{"name":"DescribeStacks","src":"src/cfn.rs:3126"},{"name":"DescribeStackEvents","src":"src/cfn.rs:3157"},{"name":"DescribeStackResources","src":"src/cfn.rs:3201"},{"name":"ListStackResources","src":"src/cfn.rs:3201"},{"name":"GetTemplate","src":"src/cfn.rs:3246"},{"name":"ListStacks","src":"src/cfn.rs:3264"},{"name":"DeleteStack","src":"src/cfn.rs:3290"},{"name":"GetTemplateSummary","src":"src/cfn.rs:3327"},{"name":"ValidateTemplate","src":"src/cfn.rs:3334"},{"kind":"AWS::S3::Bucket","tier":"real","src":"src/cfn.rs:1013","name":"AWS::S3::Bucket (real)"},{"kind":"AWS::DynamoDB::Table","tier":"real","src":"src/cfn.rs:1041","name":"AWS::DynamoDB::Table (real)"},{"kind":"AWS::DynamoDB::GlobalTable","tier":"real","src":"src/cfn.rs:1041","name":"AWS::DynamoDB::GlobalTable (real)"},{"kind":"AWS::Lambda::Function","tier":"real","src":"src/cfn.rs:1079","name":"AWS::Lambda::Function (real)"},{"kind":"AWS::Lambda::Version","tier":"recorded","src":"src/cfn.rs:1168","note":"CDK publishes a Version and points an Alias at it before it can attach provisioned concurrency. lola has no versioning, so both resolve to $LATEST - recorded so","name":"AWS::Lambda::Version (recorded)"},{"kind":"AWS::Lambda::Alias","tier":"recorded","src":"src/cfn.rs:1185","name":"AWS::Lambda::Alias (recorded)"},{"kind":"AWS::Lambda::Url","tier":"real","src":"src/cfn.rs:1221","name":"AWS::Lambda::Url (real)"},{"kind":"AWS::CloudFront::Distribution","tier":"real","src":"src/cfn.rs:1248","name":"AWS::CloudFront::Distribution (real)"},{"kind":"AWS::CloudFront::OriginAccessControl","tier":"real","src":"src/cfn.rs:1261","name":"AWS::CloudFront::OriginAccessControl (real)"},{"kind":"AWS::CloudFront::CloudFrontOriginAccessIdentity","tier":"real","src":"src/cfn.rs:1271","name":"AWS::CloudFront::CloudFrontOriginAccessIdentity (real)"},{"kind":"LOLA::Backup::Plan","tier":"real","src":"src/cfn.rs:1283","name":"LOLA::Backup::Plan (real)"},{"kind":"AWS::Events::Rule","tier":"real","src":"src/cfn.rs:1300","name":"AWS::Events::Rule (real)"},{"kind":"AWS::Events::EventBus","tier":"real","src":"src/cfn.rs:1315","name":"AWS::Events::EventBus (real)"},{"kind":"AWS::Logs::LogGroup","tier":"real","src":"src/cfn.rs:1323","name":"AWS::Logs::LogGroup (real)"},{"kind":"AWS::Logs::MetricFilter","tier":"real","src":"src/cfn.rs:1330","name":"AWS::Logs::MetricFilter (real)"},{"kind":"AWS::CloudWatch::Alarm","tier":"real","src":"src/cfn.rs:1346","name":"AWS::CloudWatch::Alarm (real)"},{"kind":"AWS::SQS::Queue","tier":"real","src":"src/cfn.rs:1354","name":"AWS::SQS::Queue (real)"},{"kind":"AWS::ApiGatewayV2::DomainName","tier":"real","src":"src/cfn.rs:1368","name":"AWS::ApiGatewayV2::DomainName (real)"},{"kind":"AWS::ApiGatewayV2::ApiMapping","tier":"real","src":"src/cfn.rs:1377","name":"AWS::ApiGatewayV2::ApiMapping (real)"},{"kind":"AWS::Route53::HostedZone","tier":"real","src":"src/cfn.rs:1391","name":"AWS::Route53::HostedZone (real)"},{"kind":"AWS::Route53::HealthCheck","tier":"real","src":"src/cfn.rs:1398","name":"AWS::Route53::HealthCheck (real)"},{"kind":"AWS::Route53::RecordSet","tier":"real","src":"src/cfn.rs:1405","name":"AWS::Route53::RecordSet (real)"},{"kind":"LOLA::Traffic::Policy","tier":"real","src":"src/cfn.rs:1438","name":"LOLA::Traffic::Policy (real)"},{"kind":"LOLA::Mirror","tier":"real","src":"src/cfn.rs:1451","name":"LOLA::Mirror (real)"},{"kind":"Custom::*","tier":"real","src":"src/cfn.rs:1477","note":"invoked synchronously through the provider function","name":"Custom::* (real)"},{"kind":"AWS::CloudFormation::CustomResource","tier":"real","src":"src/cfn.rs:1477","note":"invoked synchronously through the provider function","name":"AWS::CloudFormation::CustomResource (real)"},{"kind":"AWS::ApiGatewayV2::Api","tier":"real","src":"src/cfn.rs:1535","name":"AWS::ApiGatewayV2::Api (real)"},{"kind":"AWS::ApiGatewayV2::Integration","tier":"real","src":"src/cfn.rs:1591","name":"AWS::ApiGatewayV2::Integration (real)"},{"kind":"AWS::ApiGatewayV2::Route","tier":"real","src":"src/cfn.rs:1658","name":"AWS::ApiGatewayV2::Route (real)"},{"kind":"AWS::ApiGatewayV2::Stage","tier":"real","src":"src/cfn.rs:1683","name":"AWS::ApiGatewayV2::Stage (real)"},{"kind":"AWS::Lambda::Permission","tier":"recorded","src":"src/cfn.rs:1697","note":"Recorded, never evaluated - the same position lola takes on IAM. CDK emits one of these for every function URL and every api route, so rejecting it would fail s","name":"AWS::Lambda::Permission (recorded)"},{"kind":"AWS::SSM::Parameter","tier":"real","src":"src/cfn.rs:1702","name":"AWS::SSM::Parameter (real)"},{"kind":"AWS::IAM::Role","tier":"recorded","src":"src/cfn.rs:1716","note":"Recorded, never evaluated. See src/iam.rs for why.","name":"AWS::IAM::Role (recorded)"},{"kind":"AWS::IAM::Policy","tier":"recorded","src":"src/cfn.rs:1728","name":"AWS::IAM::Policy (recorded)"},{"kind":"AWS::IAM::ManagedPolicy","tier":"recorded","src":"src/cfn.rs:1728","name":"AWS::IAM::ManagedPolicy (recorded)"},{"kind":"AWS::AppRunner::Service","tier":"real","src":"src/cfn.rs:1739","name":"AWS::AppRunner::Service (real)"},{"kind":"AWS::RDS::DBInstance","tier":"real","src":"src/cfn.rs:1779","name":"AWS::RDS::DBInstance (real)"},{"kind":"AWS::EC2::Instance","tier":"real","src":"src/cfn.rs:1892","name":"AWS::EC2::Instance (real)"},{"kind":"AWS::DSQL::Cluster","tier":"real","src":"src/cfn.rs:1957","name":"AWS::DSQL::Cluster (real)"},{"kind":"AWS::ElastiCache::CacheCluster","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::CacheCluster (real)"},{"kind":"AWS::ElastiCache::ReplicationGroup","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::ReplicationGroup (real)"},{"kind":"AWS::ElastiCache::ServerlessCache","tier":"real","src":"src/cfn.rs:2044","name":"AWS::ElastiCache::ServerlessCache (real)"},{"kind":"AWS::DocDB::DBCluster","tier":"real","src":"src/cfn.rs:2085","name":"AWS::DocDB::DBCluster (real)"},{"kind":"AWS::ECS::Cluster","tier":"real","src":"src/cfn.rs:2128","name":"AWS::ECS::Cluster (real)"},{"kind":"AWS::ECS::TaskDefinition","tier":"real","src":"src/cfn.rs:2138","name":"AWS::ECS::TaskDefinition (real)"},{"kind":"AWS::ECS::Service","tier":"real","src":"src/cfn.rs:2154","name":"AWS::ECS::Service (real)"},{"kind":"AWS::ServiceDiscovery::PrivateDnsNamespace","tier":"recorded","src":"src/cfn.rs:2229","note":"Cloud Map. lola has one flat network, so a namespace is a label and a service is a name with a stable ARN - what matters is that the ARN is deterministic, becau","name":"AWS::ServiceDiscovery::PrivateDnsNamespace (recorded)"},{"kind":"AWS::ServiceDiscovery::PublicDnsNamespace","tier":"recorded","src":"src/cfn.rs:2229","note":"Cloud Map. lola has one flat network, so a namespace is a label and a service is a name with a stable ARN - what matters is that the ARN is deterministic, becau","name":"AWS::ServiceDiscovery::PublicDnsNamespace (recorded)"},{"kind":"AWS::ServiceDiscovery::HttpNamespace","tier":"recorded","src":"src/cfn.rs:2229","note":"Cloud Map. lola has one flat network, so a namespace is a label and a service is a name with a stable ARN - what matters is that the ARN is deterministic, becau","name":"AWS::ServiceDiscovery::HttpNamespace (recorded)"},{"kind":"AWS::ServiceDiscovery::Service","tier":"recorded","src":"src/cfn.rs:2243","name":"AWS::ServiceDiscovery::Service (recorded)"},{"kind":"AWS::CDK::Metadata","tier":"recorded","src":"src/cfn.rs:2263","note":"CDK puts this in every stack; it carries no resource.","name":"AWS::CDK::Metadata (recorded)"},{"name":"AWS::EC2::VPC (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::Subnet (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::RouteTable (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::Route (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::InternetGateway (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::VPCGatewayAttachment (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::NatGateway (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::EIP (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::EC2::SecurityGroup (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::IAM::User (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::IAM::InstanceProfile (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::S3::BucketPolicy (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::CloudFormation::Stack (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"},{"name":"AWS::KMS::Key (stub — the `other =>` fallback mints an id, nothing behind it)","src":"docs/services.md §CloudFormation"}],"note":"cdk deploy reaches CREATE_COMPLETE and creates every resource; cdk destroy tears down and honours DeletionPolicy Retain/Snapshot; change sets, conditions, Fn::ImportValue, Custom::* invoked synchronously, rollback of a failed create (data-holding resources are skipped and reported). Resource kinds in src/cfn.rs provision(): 40 real, 11 recorded (written down with their document, no behaviour: IAM roles/policies, Lambda versions/aliases/permissions, Cloud Map, CDK::Metadata); everything else is STUBBED by the `other =>` arm (was_stub=true — a physical id exists and Ref resolves; the stack status reason counts them). Not there: drift detection, nested stacks, the full cdk bootstrap toolkit stack (no KMS — ops/cdk-bootstrap.sh seeds what a deploy reads); the CDK CLI may exit with a TypeError after CREATE_COMPLETE. — docs/services.md §CloudFormation, README 'Known gaps'","src":"Query protocol Version=2010-05-15","cfn_tiers":{"real":40,"recorded":11,"stub":0},"cfn_fallback_stub":true},"google":{"service":"— (Terraform / cdktf against a custom endpoint)","status":"none","ops":[],"note":"Deployment Manager is dead; g-lola's IaC path is the Terraform google provider (and cdktf) pointed at a custom endpoint — nothing in g-lola implements an IaC API itself. — g-lola README"},"cloudflare":{"service":"wrangler (the Workers upload/settings API)","status":"full","ops":[{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}","src":"src/cf/workers.rs:1589"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/content","src":"src/cf/workers.rs:1590"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/content/v2","src":"src/cf/workers.rs:1590"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/content","src":"src/cf/workers.rs:1593"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/content/v2","src":"src/cf/workers.rs:1593"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/settings","src":"src/cf/workers.rs:1606"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/settings","src":"src/cf/workers.rs:1610"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/script-settings","src":"src/cf/workers.rs:1611"},{"name":"PATCH /client/v4/accounts/{account}/workers/scripts/{name}/script-settings","src":"src/cf/workers.rs:1615"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/secrets","src":"src/cf/workers.rs:1635"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/subdomain","src":"src/cf/workers.rs:1658"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/schedules","src":"src/cf/workers.rs:1676"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/usage-model","src":"src/cf/workers.rs:1689"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/versions","src":"src/cf/workers.rs:1696"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/versions","src":"src/cf/workers.rs:1697"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/versions/{vid}","src":"src/cf/workers.rs:1702"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/deployments","src":"src/cf/workers.rs:1707"},{"name":"POST /client/v4/accounts/{account}/workers/scripts/{name}/deployments","src":"src/cf/workers.rs:1711"},{"name":"GET /client/v4/accounts/{account}/workers/scripts/{name}/deployments/{did}","src":"src/cf/workers.rs:1729"},{"name":"GET /client/v4/accounts/{account}/workers/deployments/by-script/{name}","src":"src/cf/workers.rs:1734"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/settings","src":"src/cf/workers.rs:1760"},{"name":"PATCH /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/settings","src":"src/cf/workers.rs:1764"},{"name":"GET /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/content","src":"src/cf/workers.rs:1765"},{"name":"PUT /client/v4/accounts/{account}/workers/services/{name}/environments/{env}/content","src":"src/cf/workers.rs:1769"},{"name":"PUT /client/v4/accounts/{account}/workers/scripts/{name}/routes","src":"src/cf/workers.rs:1780"},{"name":"GET /client/v4/accounts/{account}/workers/account-settings","src":"src/cf/workers.rs:1783"},{"name":"PUT /client/v4/accounts/{account}/workers/account-settings","src":"src/cf/workers.rs:1784"}],"note":"wrangler 4.127.1 deploy against CLOUDFLARE_API_BASE_URL=https://<lola>/client/v4 with CLOUDFLARE_API_TOKEN=<ak>:<sk> and CLOUDFLARE_ACCOUNT_ID=<12-digit account>: kv namespace create, d1 create, queues create, r2 bucket create, deploy (bindings auto-provisioned on error 10006), delete. No Terraform cloudflare provider run yet. — notes/cloudflare.md"}}]},{"type":"Container registry","rows":[{"capability":"Image registry","aws":{"service":"ECR","status":"full","ops":[{"name":"CreateRepository","src":"src/ecr.rs:1549"},{"name":"DescribeRepositories","src":"src/ecr.rs:1550"},{"name":"DeleteRepository","src":"src/ecr.rs:1551"},{"name":"DescribeRegistry","src":"src/ecr.rs:1552"},{"name":"GetAuthorizationToken","src":"src/ecr.rs:1553"},{"name":"DescribeImages","src":"src/ecr.rs:1554"},{"name":"ListImages","src":"src/ecr.rs:1555"},{"name":"BatchGetImage","src":"src/ecr.rs:1556"},{"name":"BatchDeleteImage","src":"src/ecr.rs:1557"},{"name":"PutImage","src":"src/ecr.rs:1558"},{"name":"PutImageTagMutability","src":"src/ecr.rs:1559"},{"name":"PutImageScanningConfiguration","src":"src/ecr.rs:1559"},{"name":"GetRepositoryPolicy","src":"src/ecr.rs:1560"},{"name":"SetRepositoryPolicy","src":"src/ecr.rs:1560"},{"name":"DeleteRepositoryPolicy","src":"src/ecr.rs:1560"},{"name":"GetLifecyclePolicy","src":"src/ecr.rs:1561"},{"name":"PutLifecyclePolicy","src":"src/ecr.rs:1561"},{"name":"DeleteLifecyclePolicy","src":"src/ecr.rs:1561"},{"name":"TagResource","src":"src/ecr.rs:1562"},{"name":"UntagResource","src":"src/ecr.rs:1562"},{"name":"ListTagsForResource","src":"src/ecr.rs:1562"},{"name":"docker token endpoint (registry auth)","src":"src/ecr.rs:430","via":"GET /v2/token | /token"},{"name":"manifest guard on push (tag immutability, namespace clip)","src":"src/ecr.rs:1209"}],"note":"A private registry (registry.abot.at; stock registry:2 behind caddy, ops/registry.sh) with lola as its docker token server: every token is clipped to the caller's <account>/… namespace. Not modelled: image scanning (scanOnPush is stored), replication, pull-through caches, lifecycle policy execution, listing untagged images; IMMUTABLE tags are enforced for put-image only — a direct docker push bypasses lola. — docs/services.md §ECR, notes/ecr.md","src":"X-Amz-Target AmazonEC2ContainerRegistry_V20150921.*"},"google":{"service":"Artifact Registry","status":"none","ops":[],"note":"Artifact Registry: g-lola/src/artifactregistry.rs is a skeleton — `pub fn router()` returns `Router::new()` with no routes (Artifact Registry (repositories; docker v2 registry endpoint).). README: 'not started'."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Cloudflare has no container registry."}}]},{"type":"Resource registry, tagging & audit","rows":[{"capability":"Resource inventory, tags & activity","aws":{"service":"Resource Groups Tagging API · CloudTrail · /_lola/registry","status":"partial","ops":[{"name":"GetResources","src":"src/registry.rs:463"},{"name":"TagResources","src":"src/registry.rs:483"},{"name":"UntagResources","src":"src/registry.rs:483"},{"name":"GetTagKeys","src":"src/registry.rs:500"},{"name":"GetTagValues","src":"src/registry.rs:505"},{"name":"LookupEvents","src":"src/registry.rs:519"},{"name":"GET /_lola/registry/resources","src":"src/registry.rs:589"},{"name":"GET /_lola/registry/kinds","src":"src/registry.rs:593"},{"name":"GET /_lola/registry/coverage","src":"src/registry.rs:594"},{"name":"GET /_lola/registry/activity","src":"src/registry.rs:595"}],"note":"Every service registers its resources (AWS::* and CF::* kinds) in the registry behind the Tagging API and CloudTrail LookupEvents; /_lola/registry/{resources,kinds,coverage,activity} adds the backup-coverage report. CloudTrail is LookupEvents only (no trails, no S3 delivery). — notes/registry.md","src":"X-Amz-Target ResourceGroupsTaggingAPI*, X-Amz-Target CloudTrail_*, REST /_lola/registry"},"google":{"service":"—","status":"none","ops":[],"note":"No Cloud Asset Inventory / Audit Logs in g-lola."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"CF::Workers::Script, CF::KV::Namespace, CF::D1::Database, CF::Queues::Queue and CF::Zone register in lola's registry (visible through the AWS Tagging API), but no Cloudflare audit-log API exists. — notes/cloudflare.md"}}]},{"type":"Backup, DR & replication","rows":[{"capability":"Backup, mirroring & standby","aws":{"service":"LOLA::Backup::Plan · LOLA::Mirror · followers","status":"partial","ops":[{"kind":"LOLA::Backup::Plan","tier":"real","src":"src/cfn.rs:1283","name":"LOLA::Backup::Plan (real)"},{"kind":"LOLA::Mirror","tier":"real","src":"src/cfn.rs:1451","name":"LOLA::Mirror (real)"},{"name":"GET /_lola/backup/plans","src":"src/backup.rs:558"},{"name":"GET /_lola/backup/plans/{id}","src":"src/backup.rs:562"},{"name":"POST /_lola/backup/plans/{id}/run","src":"src/backup.rs:566"},{"name":"POST /_lola/backup/import-control","src":"src/backup.rs:579"},{"name":"GET /_lola/backup/export-control","src":"src/backup.rs:583"},{"name":"GET /_lola/backup/export-files","src":"src/backup.rs:587"},{"name":"POST /_lola/backup/import-files","src":"src/backup.rs:621"},{"name":"DELETE /_lola/backup/plans/{id}","src":"src/backup.rs:625"},{"name":"GET /_lola/mirror","src":"src/mirror.rs:466"},{"name":"GET /_lola/mirror/plans","src":"src/mirror.rs:466"},{"name":"GET /_lola/mirror/plans/{id}","src":"src/mirror.rs:480"},{"name":"DELETE /_lola/mirror/plans/{id}","src":"src/mirror.rs:484"},{"name":"POST /_lola/mirror/plans/{id}/run","src":"src/mirror.rs:488"},{"name":"read-only follower tails the WAL over HTTP (--follow)","src":"src/replication.rs:35","via":"GET /_lola/replication/stream?from=<lsn>"},{"name":"object bodies fetched by content hash and verified","src":"src/replication.rs:123"},{"name":"leader election with a witness (--peer, --node-id, --witness)","src":"src/cluster.rs:122"},{"name":"cluster RPC: /_lola/cluster/vote, /heartbeat, /status","src":"src/cluster.rs:253"}],"note":"LOLA::Backup::Plan: tenant-owned restic backups to the tenant's own destination (control dump + file stores; restore and lola↔AWS moves in ops/migrator). LOLA::Mirror converges another lola account or a real AWS account to this one. A read-only follower tails the WAL over HTTP (--follow); leader election with a witness is proven on three VMs — but production runs a single node with manual failover, and cluster logs are not reconciled after an unclean partition. — README 'Known gaps', notes/backup-files.md","src":"REST /_lola/backup/"},"google":{"service":"—","status":"none","ops":[],"note":"No backup/replication API in g-lola; each module persists under data_dir/<service>/ and the host's lola-backup covers the box."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"No Cloudflare API for it; KV values, D1 databases, R2 metadata sidecars and worker modules travel with the account's LOLA::Backup::Plan and follow the primary as FilePut/FileDelete records (CF::Zone is still reported uncovered). — notes/cloudflare.md"}}]},{"type":"Traffic steering & hybrid","rows":[{"capability":"L7 front door & DNS steering","aws":{"service":"LOLA::Traffic::Policy · Route 53 steering","status":"partial","ops":[{"kind":"LOLA::Traffic::Policy","tier":"real","src":"src/cfn.rs:1438","name":"LOLA::Traffic::Policy (real)"},{"name":"GET /_lola/traffic","src":"src/traffic.rs:288"},{"name":"GET /_lola/traffic/policies","src":"src/traffic.rs:288"},{"name":"POST /_lola/traffic/policies","src":"src/traffic.rs:292"},{"name":"PUT /_lola/traffic/policies","src":"src/traffic.rs:292"},{"name":"DELETE /_lola/traffic/policies/{d}","src":"src/traffic.rs:303"},{"name":"Failover routing (PRIMARY/SECONDARY with a health check)","src":"src/route53.rs:322"},{"name":"Weighted routing","src":"src/route53.rs:322"},{"name":"zones served authoritatively by knot","src":"src/route53.rs:137"}],"note":"LOLA::Traffic::Policy programs caddy as the L7 front door (health-checked upstreams, lola + real AWS behind one name); Route 53 failover/weighted records steer at DNS. Limits: both nameservers on metal (no off-metal secondary NS), the SECONDARY is A records of AWS's regional endpoint, ALIAS is not built, weighted routing is an approximation. — notes/hybrid.md","src":"REST /_lola/traffic/"},"google":{"service":"—","status":"none","ops":[],"note":"No Cloud Load Balancing / Traffic Director in g-lola."},"cloudflare":{"service":"—","status":"none","ops":[],"note":"Cloudflare Load Balancing / Argo are not modelled; the hybrid front door can put Cloudflare itself in front when needed. — notes/cloudflare.md"}}]}],"counts":{"groups":21,"rows":23,"ops":{"aws":398,"google":157,"cloudflare":231},"ops_unique":{"aws":374,"google":135,"cloudflare":171},"cfn_kinds":51,"cfn_tiers":{"real":40,"recorded":11,"stub":0}},"skeletons":[{"module":"g-lola/src/functions.rs","routes":0,"doc":"Cloud Functions 2nd gen (source upload → Cloud Run).","skeleton":true},{"module":"g-lola/src/dns.rs","routes":0,"doc":"Cloud DNS (managed zones, record sets, changes).","skeleton":true},{"module":"g-lola/src/logging.rs","routes":0,"doc":"Cloud Logging (entries:write, entries:list, logs).","skeleton":true},{"module":"g-lola/src/monitoring.rs","routes":0,"doc":"Cloud Monitoring (timeSeries create/list, metric descriptors).","skeleton":true},{"module":"g-lola/src/artifactregistry.rs","routes":0,"doc":"Artifact Registry (repositories; docker v2 registry endpoint).","skeleton":true}],"unclassified":["src/main.rs: GET /_lola/health, GET /_lola/metering (per-account bill, AWS on-demand rates), the console API /_lola/api/* (loopback + console token), /_lola/cluster/{vote,heartbeat,status}, /_lola/replication/stream","src/ec2.rs + src/ssm.rs: the `host::enabled()` arms (RunInstances/DescribeInstances/TerminateInstances as unix-user dev sandboxes, SSM SendCommand/GetCommandInvocation) only exist under --enable-sandbox-hosts and are agent tooling, not a cloud capability","src/cf/workers.rs: GET …/workers/{domains,routes,dispatch/namespaces,durable_objects/namespaces} answer empty lists so wrangler proceeds; GET/PUT …/workers/account-settings echo a constant","g-lola/src/main.rs: GET / (service index), GET /v1/projects, GET /v1/projects/{id} (project listing — shown under Identity)","g-lola/src/iam.rs: GET /computeMetadata/v1/* (metadata server), GET /robot/v1/metadata/x509/{email} (shown under Identity)"],"warnings":["probe not found: src/s3.rs 'GetObject' /Method::GET => get_object\\(cx, &bucket, &key, true\\)/"],"legend":{"full":"the operations a typical SDK/CLI/IaC workflow needs are implemented","partial":"usable, with documented gaps listed in the note","none":"absent, or a skeleton module with no routes"}}