@shipfox/api-runners 4.0.0 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +83 -0
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +53 -6
- package/dist/config.js.map +1 -1
- package/dist/core/capacity-assignments.d.ts +7 -0
- package/dist/core/capacity-assignments.d.ts.map +1 -0
- package/dist/core/capacity-assignments.js +6 -0
- package/dist/core/capacity-assignments.js.map +1 -0
- package/dist/core/demand.d.ts +6 -6
- package/dist/core/demand.d.ts.map +1 -1
- package/dist/core/demand.js +10 -10
- package/dist/core/demand.js.map +1 -1
- package/dist/core/entities/capacity-assignment.d.ts +9 -0
- package/dist/core/entities/capacity-assignment.d.ts.map +1 -0
- package/dist/core/entities/capacity-assignment.js +3 -0
- package/dist/core/entities/capacity-assignment.js.map +1 -0
- package/dist/core/entities/ephemeral-registration-token.d.ts +1 -1
- package/dist/core/entities/ephemeral-registration-token.d.ts.map +1 -1
- package/dist/core/entities/ephemeral-registration-token.js.map +1 -1
- package/dist/core/entities/provisioner-capability-snapshot.d.ts +13 -0
- package/dist/core/entities/provisioner-capability-snapshot.d.ts.map +1 -0
- package/dist/core/entities/provisioner-capability-snapshot.js +3 -0
- package/dist/core/entities/provisioner-capability-snapshot.js.map +1 -0
- package/dist/core/entities/provisioner-token.d.ts +10 -2
- package/dist/core/entities/provisioner-token.d.ts.map +1 -1
- package/dist/core/entities/provisioner-token.js.map +1 -1
- package/dist/core/entities/{provisioned-runner.d.ts → runner-instance.d.ts} +6 -6
- package/dist/core/entities/runner-instance.d.ts.map +1 -0
- package/dist/core/entities/runner-instance.js +3 -0
- package/dist/core/entities/runner-instance.js.map +1 -0
- package/dist/core/entities/runner-session.d.ts +4 -2
- package/dist/core/entities/runner-session.d.ts.map +1 -1
- package/dist/core/entities/runner-session.js.map +1 -1
- package/dist/core/ephemeral-registration-tokens.d.ts +5 -5
- package/dist/core/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/core/ephemeral-registration-tokens.js +12 -12
- package/dist/core/ephemeral-registration-tokens.js.map +1 -1
- package/dist/core/errors.d.ts +16 -4
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +22 -4
- package/dist/core/errors.js.map +1 -1
- package/dist/core/index.d.ts +10 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/job-executions.d.ts +2 -0
- package/dist/core/job-executions.d.ts.map +1 -1
- package/dist/core/job-executions.js +1 -2
- package/dist/core/job-executions.js.map +1 -1
- package/dist/core/maintenance.d.ts +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +5 -5
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/provisioner-capability-snapshots.d.ts +5 -0
- package/dist/core/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/core/provisioner-capability-snapshots.js +10 -0
- package/dist/core/provisioner-capability-snapshots.js.map +1 -0
- package/dist/core/provisioner-tokens.d.ts +10 -0
- package/dist/core/provisioner-tokens.d.ts.map +1 -1
- package/dist/core/provisioner-tokens.js +23 -1
- package/dist/core/provisioner-tokens.js.map +1 -1
- package/dist/core/rate-limit.d.ts.map +1 -1
- package/dist/core/rate-limit.js +2 -7
- package/dist/core/rate-limit.js.map +1 -1
- package/dist/core/runner-activation.d.ts +13 -0
- package/dist/core/runner-activation.d.ts.map +1 -0
- package/dist/core/runner-activation.js +36 -0
- package/dist/core/runner-activation.js.map +1 -0
- package/dist/core/runner-control-sessions.d.ts +46 -0
- package/dist/core/runner-control-sessions.d.ts.map +1 -0
- package/dist/core/runner-control-sessions.js +121 -0
- package/dist/core/runner-control-sessions.js.map +1 -0
- package/dist/core/runner-instances.d.ts +79 -0
- package/dist/core/runner-instances.d.ts.map +1 -0
- package/dist/core/runner-instances.js +168 -0
- package/dist/core/runner-instances.js.map +1 -0
- package/dist/core/runner-sessions.d.ts +8 -2
- package/dist/core/runner-sessions.d.ts.map +1 -1
- package/dist/core/runner-sessions.js +8 -5
- package/dist/core/runner-sessions.js.map +1 -1
- package/dist/db/capacity-assignments.d.ts +7 -0
- package/dist/db/capacity-assignments.d.ts.map +1 -0
- package/dist/db/capacity-assignments.js +72 -0
- package/dist/db/capacity-assignments.js.map +1 -0
- package/dist/db/db.d.ts +2837 -1009
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +11 -2
- package/dist/db/db.js.map +1 -1
- package/dist/db/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/ephemeral-registration-tokens.d.ts.map +1 -1
- package/dist/db/ephemeral-registration-tokens.js +21 -21
- package/dist/db/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/index.d.ts +7 -4
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +5 -2
- package/dist/db/index.js.map +1 -1
- package/dist/db/job-executions.d.ts +6 -6
- package/dist/db/job-executions.d.ts.map +1 -1
- package/dist/db/job-executions.js +20 -19
- package/dist/db/job-executions.js.map +1 -1
- package/dist/db/provisioner-capability-snapshots.d.ts +21 -0
- package/dist/db/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/provisioner-capability-snapshots.js +57 -0
- package/dist/db/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/provisioner-tokens.d.ts +7 -2
- package/dist/db/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/provisioner-tokens.js +59 -10
- package/dist/db/provisioner-tokens.js.map +1 -1
- package/dist/db/reservations.d.ts +18 -0
- package/dist/db/reservations.d.ts.map +1 -1
- package/dist/db/reservations.js +88 -1
- package/dist/db/reservations.js.map +1 -1
- package/dist/db/runner-instances.d.ts +91 -0
- package/dist/db/runner-instances.d.ts.map +1 -0
- package/dist/db/runner-instances.js +511 -0
- package/dist/db/runner-instances.js.map +1 -0
- package/dist/db/runner-sessions.d.ts +5 -0
- package/dist/db/runner-sessions.d.ts.map +1 -1
- package/dist/db/runner-sessions.js +48 -2
- package/dist/db/runner-sessions.js.map +1 -1
- package/dist/db/schema/capacity-assignments.d.ts +113 -0
- package/dist/db/schema/capacity-assignments.d.ts.map +1 -0
- package/dist/db/schema/capacity-assignments.js +29 -0
- package/dist/db/schema/capacity-assignments.js.map +1 -0
- package/dist/db/schema/ephemeral-registration-tokens.d.ts +2 -2
- package/dist/db/schema/ephemeral-registration-tokens.js +3 -3
- package/dist/db/schema/ephemeral-registration-tokens.js.map +1 -1
- package/dist/db/schema/provisioner-capability-snapshots.d.ts +207 -0
- package/dist/db/schema/provisioner-capability-snapshots.d.ts.map +1 -0
- package/dist/db/schema/provisioner-capability-snapshots.js +38 -0
- package/dist/db/schema/provisioner-capability-snapshots.js.map +1 -0
- package/dist/db/schema/provisioner-tokens.d.ts +19 -1
- package/dist/db/schema/provisioner-tokens.d.ts.map +1 -1
- package/dist/db/schema/provisioner-tokens.js +29 -3
- package/dist/db/schema/provisioner-tokens.js.map +1 -1
- package/dist/db/schema/runner-activation-tokens.d.ts +161 -0
- package/dist/db/schema/runner-activation-tokens.d.ts.map +1 -0
- package/dist/db/schema/runner-activation-tokens.js +27 -0
- package/dist/db/schema/runner-activation-tokens.js.map +1 -0
- package/dist/db/schema/runner-control-sessions.d.ts +338 -0
- package/dist/db/schema/runner-control-sessions.d.ts.map +1 -0
- package/dist/db/schema/runner-control-sessions.js +52 -0
- package/dist/db/schema/runner-control-sessions.js.map +1 -0
- package/dist/db/schema/{provisioned-runners.d.ts → runner-instances.d.ts} +88 -34
- package/dist/db/schema/runner-instances.d.ts.map +1 -0
- package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +19 -14
- package/dist/db/schema/runner-instances.js.map +1 -0
- package/dist/db/schema/runner-sessions.d.ts +39 -5
- package/dist/db/schema/runner-sessions.d.ts.map +1 -1
- package/dist/db/schema/runner-sessions.js +13 -6
- package/dist/db/schema/runner-sessions.js.map +1 -1
- package/dist/db/schema/running-job-executions.d.ts +2 -2
- package/dist/db/schema/running-job-executions.js +4 -4
- package/dist/db/schema/running-job-executions.js.map +1 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -38
- package/dist/index.js.map +1 -1
- package/dist/installation-provisioning.d.ts +14 -0
- package/dist/installation-provisioning.d.ts.map +1 -0
- package/dist/installation-provisioning.js +7 -0
- package/dist/installation-provisioning.js.map +1 -0
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -1
- package/dist/metrics/index.js.map +1 -1
- package/dist/metrics/instance.d.ts +11 -7
- package/dist/metrics/instance.d.ts.map +1 -1
- package/dist/metrics/instance.js +13 -7
- package/dist/metrics/instance.js.map +1 -1
- package/dist/presentation/auth/index.d.ts +1 -0
- package/dist/presentation/auth/index.d.ts.map +1 -1
- package/dist/presentation/auth/index.js +1 -0
- package/dist/presentation/auth/index.js.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/provisioner-token-auth.js +5 -1
- package/dist/presentation/auth/provisioner-token-auth.js.map +1 -1
- package/dist/presentation/auth/runner-control-session-auth.d.ts +4 -0
- package/dist/presentation/auth/runner-control-session-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-control-session-auth.js +29 -0
- package/dist/presentation/auth/runner-control-session-auth.js.map +1 -0
- package/dist/presentation/auth/runner-registration-token-auth.d.ts +5 -1
- package/dist/presentation/auth/runner-registration-token-auth.d.ts.map +1 -1
- package/dist/presentation/auth/runner-registration-token-auth.js +21 -1
- package/dist/presentation/auth/runner-registration-token-auth.js.map +1 -1
- package/dist/presentation/dto/index.d.ts +2 -2
- package/dist/presentation/dto/index.d.ts.map +1 -1
- package/dist/presentation/dto/index.js +2 -2
- package/dist/presentation/dto/index.js.map +1 -1
- package/dist/presentation/dto/mint-registration-tokens.d.ts +5 -3
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +1 -1
- package/dist/presentation/dto/mint-registration-tokens.js +4 -4
- package/dist/presentation/dto/mint-registration-tokens.js.map +1 -1
- package/dist/presentation/dto/poll-demand.d.ts.map +1 -1
- package/dist/presentation/dto/poll-demand.js +7 -1
- package/dist/presentation/dto/poll-demand.js.map +1 -1
- package/dist/presentation/dto/provisioner-token.d.ts +1 -0
- package/dist/presentation/dto/provisioner-token.d.ts.map +1 -1
- package/dist/presentation/dto/provisioner-token.js +5 -1
- package/dist/presentation/dto/provisioner-token.js.map +1 -1
- package/dist/presentation/dto/{provisioned-runners.d.ts → runner-instances.d.ts} +9 -9
- package/dist/presentation/dto/runner-instances.d.ts.map +1 -0
- package/dist/presentation/dto/{provisioned-runners.js → runner-instances.js} +6 -6
- package/dist/presentation/dto/runner-instances.js.map +1 -0
- package/dist/presentation/index.d.ts +2 -2
- package/dist/presentation/index.d.ts.map +1 -1
- package/dist/presentation/index.js +2 -2
- package/dist/presentation/index.js.map +1 -1
- package/dist/presentation/inter-module.d.ts +5 -0
- package/dist/presentation/inter-module.d.ts.map +1 -0
- package/dist/presentation/inter-module.js +43 -0
- package/dist/presentation/inter-module.js.map +1 -0
- package/dist/presentation/routes/assign-capacity.d.ts +2 -0
- package/dist/presentation/routes/assign-capacity.d.ts.map +1 -0
- package/dist/presentation/routes/assign-capacity.js +44 -0
- package/dist/presentation/routes/assign-capacity.js.map +1 -0
- package/dist/presentation/routes/get-provisioner-me.d.ts.map +1 -1
- package/dist/presentation/routes/get-provisioner-me.js +5 -1
- package/dist/presentation/routes/get-provisioner-me.js.map +1 -1
- package/dist/presentation/routes/heartbeat.d.ts +2 -1
- package/dist/presentation/routes/heartbeat.d.ts.map +1 -1
- package/dist/presentation/routes/heartbeat.js +60 -50
- package/dist/presentation/routes/heartbeat.js.map +1 -1
- package/dist/presentation/routes/index.d.ts +3 -1
- package/dist/presentation/routes/index.d.ts.map +1 -1
- package/dist/presentation/routes/index.js +83 -50
- package/dist/presentation/routes/index.js.map +1 -1
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +1 -1
- package/dist/presentation/routes/mint-registration-tokens.js +5 -5
- package/dist/presentation/routes/mint-registration-tokens.js.map +1 -1
- package/dist/presentation/routes/planned-capacity.d.ts +3 -0
- package/dist/presentation/routes/planned-capacity.d.ts.map +1 -0
- package/dist/presentation/routes/planned-capacity.js +54 -0
- package/dist/presentation/routes/planned-capacity.js.map +1 -0
- package/dist/presentation/routes/poll-demand.d.ts +2 -0
- package/dist/presentation/routes/poll-demand.d.ts.map +1 -1
- package/dist/presentation/routes/poll-demand.js +86 -45
- package/dist/presentation/routes/poll-demand.js.map +1 -1
- package/dist/presentation/routes/reconcile-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/reconcile-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/reconcile-runner-instances.js +27 -0
- package/dist/presentation/routes/reconcile-runner-instances.js.map +1 -0
- package/dist/presentation/routes/register.d.ts +2 -1
- package/dist/presentation/routes/register.d.ts.map +1 -1
- package/dist/presentation/routes/register.js +55 -52
- package/dist/presentation/routes/register.js.map +1 -1
- package/dist/presentation/routes/report-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/report-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/report-runner-instances.js +37 -0
- package/dist/presentation/routes/report-runner-instances.js.map +1 -0
- package/dist/presentation/routes/request-job.d.ts +2 -1
- package/dist/presentation/routes/request-job.d.ts.map +1 -1
- package/dist/presentation/routes/request-job.js +39 -36
- package/dist/presentation/routes/request-job.js.map +1 -1
- package/dist/presentation/routes/runner-enrollment.d.ts +7 -0
- package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
- package/dist/presentation/routes/runner-enrollment.js +185 -0
- package/dist/presentation/routes/runner-enrollment.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +2 -2
- package/dist/temporal/activities/index.d.ts.map +1 -1
- package/dist/temporal/activities/index.js +2 -2
- package/dist/temporal/activities/index.js.map +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts +1 -1
- package/dist/temporal/activities/maintenance-activities.d.ts.map +1 -1
- package/dist/temporal/activities/maintenance-activities.js +3 -3
- package/dist/temporal/activities/maintenance-activities.js.map +1 -1
- package/dist/temporal/workflows/index.bundle.js +3 -3
- package/dist/temporal/workflows/stuck-job-detector.js +2 -2
- package/dist/temporal/workflows/stuck-job-detector.js.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/drizzle/0000_initial.sql +102 -24
- package/drizzle/meta/0000_snapshot.json +483 -63
- package/package.json +31 -36
- package/src/config.test.ts +0 -26
- package/src/config.ts +47 -6
- package/src/core/capacity-assignments.ts +10 -0
- package/src/core/demand.test.ts +29 -29
- package/src/core/demand.ts +22 -22
- package/src/core/entities/capacity-assignment.ts +8 -0
- package/src/core/entities/ephemeral-registration-token.ts +1 -1
- package/src/core/entities/provisioner-capability-snapshot.ts +12 -0
- package/src/core/entities/provisioner-token.ts +8 -2
- package/src/core/entities/{provisioned-runner.ts → runner-instance.ts} +5 -5
- package/src/core/entities/runner-session.ts +4 -2
- package/src/core/ephemeral-registration-tokens.test.ts +11 -11
- package/src/core/ephemeral-registration-tokens.ts +18 -20
- package/src/core/errors.ts +23 -4
- package/src/core/index.ts +39 -17
- package/src/core/job-executions.ts +3 -2
- package/src/core/maintenance.test.ts +13 -17
- package/src/core/maintenance.ts +5 -5
- package/src/core/provisioner-capability-snapshots.test.ts +35 -0
- package/src/core/provisioner-capability-snapshots.ts +12 -0
- package/src/core/provisioner-tokens.test.ts +20 -0
- package/src/core/provisioner-tokens.ts +33 -0
- package/src/core/rate-limit.test.ts +11 -27
- package/src/core/rate-limit.ts +3 -11
- package/src/core/runner-activation.ts +72 -0
- package/src/core/runner-control-sessions.ts +190 -0
- package/src/core/{provisioned-runners.test.ts → runner-instances.test.ts} +24 -24
- package/src/core/runner-instances.ts +310 -0
- package/src/core/runner-sessions.test.ts +112 -22
- package/src/core/runner-sessions.ts +25 -14
- package/src/db/capacity-assignments.test.ts +159 -0
- package/src/db/capacity-assignments.ts +116 -0
- package/src/db/db.ts +11 -2
- package/src/db/ephemeral-registration-tokens.test.ts +9 -9
- package/src/db/ephemeral-registration-tokens.ts +26 -26
- package/src/db/index.ts +31 -21
- package/src/db/job-executions.test.ts +13 -11
- package/src/db/job-executions.ts +33 -27
- package/src/db/provisioner-capability-snapshots.test.ts +175 -0
- package/src/db/provisioner-capability-snapshots.ts +130 -0
- package/src/db/provisioner-tokens.test.ts +139 -2
- package/src/db/provisioner-tokens.ts +123 -15
- package/src/db/reservations.test.ts +49 -0
- package/src/db/reservations.ts +146 -1
- package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +429 -353
- package/src/db/runner-instances.ts +942 -0
- package/src/db/runner-sessions.test.ts +19 -6
- package/src/db/runner-sessions.ts +78 -2
- package/src/db/schema/capacity-assignments.ts +34 -0
- package/src/db/schema/ephemeral-registration-tokens.ts +4 -4
- package/src/db/schema/provisioner-capability-snapshots.ts +46 -0
- package/src/db/schema/provisioner-tokens.ts +33 -2
- package/src/db/schema/runner-activation-tokens.ts +22 -0
- package/src/db/schema/runner-control-sessions.ts +46 -0
- package/src/db/schema/{provisioned-runners.ts → runner-instances.ts} +26 -27
- package/src/db/schema/runner-sessions.ts +11 -7
- package/src/db/schema/running-job-executions.ts +5 -5
- package/src/index.test.ts +26 -0
- package/src/index.ts +39 -19
- package/src/installation-provisioning.ts +14 -0
- package/src/metrics/index.ts +5 -5
- package/src/metrics/instance.ts +25 -14
- package/src/presentation/auth/index.ts +4 -0
- package/src/presentation/auth/provisioner-token-auth.ts +8 -4
- package/src/presentation/auth/runner-control-session-auth.ts +31 -0
- package/src/presentation/auth/runner-registration-token-auth.ts +39 -3
- package/src/presentation/dto/index.ts +5 -5
- package/src/presentation/dto/mint-registration-tokens.ts +8 -15
- package/src/presentation/dto/poll-demand.ts +3 -1
- package/src/presentation/dto/provisioner-token.ts +5 -0
- package/src/presentation/dto/{provisioned-runners.ts → runner-instances.ts} +13 -15
- package/src/presentation/index.ts +2 -1
- package/src/presentation/inter-module.test.ts +15 -0
- package/src/presentation/inter-module.ts +53 -0
- package/src/presentation/routes/assign-capacity.ts +48 -0
- package/src/presentation/routes/get-provisioner-me.ts +3 -4
- package/src/presentation/routes/heartbeat.test.ts +4 -3
- package/src/presentation/routes/heartbeat.ts +67 -64
- package/src/presentation/routes/index.ts +93 -43
- package/src/presentation/routes/list-active-runners.test.ts +23 -23
- package/src/presentation/routes/manual-registration-tokens.test.ts +4 -3
- package/src/presentation/routes/mint-registration-tokens.test.ts +12 -12
- package/src/presentation/routes/mint-registration-tokens.ts +5 -7
- package/src/presentation/routes/planned-capacity.ts +49 -0
- package/src/presentation/routes/poll-demand-release.test.ts +4 -4
- package/src/presentation/routes/poll-demand.test.ts +161 -22
- package/src/presentation/routes/poll-demand.ts +105 -45
- package/src/presentation/routes/provisioner-me.test.ts +37 -3
- package/src/presentation/routes/{reconcile-provisioned-runners.test.ts → reconcile-runner-instances.test.ts} +66 -61
- package/src/presentation/routes/reconcile-runner-instances.ts +30 -0
- package/src/presentation/routes/register.test.ts +9 -5
- package/src/presentation/routes/register.ts +61 -57
- package/src/presentation/routes/{report-provisioned-runners.test.ts → report-runner-instances.test.ts} +28 -28
- package/src/presentation/routes/{report-provisioned-runners.ts → report-runner-instances.ts} +14 -14
- package/src/presentation/routes/request-job.test.ts +5 -3
- package/src/presentation/routes/request-job.ts +41 -37
- package/src/presentation/routes/runner-enrollment.test.ts +259 -0
- package/src/presentation/routes/runner-enrollment.ts +174 -0
- package/src/temporal/activities/index.ts +2 -2
- package/src/temporal/activities/maintenance-activities.test.ts +7 -7
- package/src/temporal/activities/maintenance-activities.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.test.ts +3 -3
- package/src/temporal/workflows/stuck-job-detector.ts +2 -2
- package/test/env.ts +1 -3
- package/test/factories/ephemeral-registration-token.ts +2 -2
- package/test/factories/provisioner-token.ts +3 -1
- package/test/factories/runner-instance.ts +57 -0
- package/test/factories/runner-session.ts +3 -1
- package/test/fixtures/auth-inter-module.ts +30 -0
- package/test/globalSetup.ts +5 -1
- package/test/index.ts +2 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/core/entities/provisioned-runner.d.ts.map +0 -1
- package/dist/core/entities/provisioned-runner.js +0 -3
- package/dist/core/entities/provisioned-runner.js.map +0 -1
- package/dist/core/provisioned-runners.d.ts +0 -67
- package/dist/core/provisioned-runners.d.ts.map +0 -1
- package/dist/core/provisioned-runners.js +0 -162
- package/dist/core/provisioned-runners.js.map +0 -1
- package/dist/db/provisioned-runners.d.ts +0 -79
- package/dist/db/provisioned-runners.d.ts.map +0 -1
- package/dist/db/provisioned-runners.js +0 -466
- package/dist/db/provisioned-runners.js.map +0 -1
- package/dist/db/schema/provisioned-runners.d.ts.map +0 -1
- package/dist/db/schema/provisioned-runners.js.map +0 -1
- package/dist/presentation/dto/provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/dto/provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/reconcile-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/reconcile-provisioned-runners.js +0 -27
- package/dist/presentation/routes/reconcile-provisioned-runners.js.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.d.ts +0 -2
- package/dist/presentation/routes/report-provisioned-runners.d.ts.map +0 -1
- package/dist/presentation/routes/report-provisioned-runners.js +0 -37
- package/dist/presentation/routes/report-provisioned-runners.js.map +0 -1
- package/src/core/provisioned-runners.ts +0 -301
- package/src/db/provisioned-runners.ts +0 -886
- package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
- package/test/factories/provisioned-runner.ts +0 -78
|
@@ -1,466 +0,0 @@
|
|
|
1
|
-
import { logger } from '@shipfox/node-opentelemetry';
|
|
2
|
-
import { canonicalizeLabels } from '@shipfox/runner-labels';
|
|
3
|
-
import { and, asc, desc, eq, exists, gt, inArray, isNotNull, isNull, lt, notExists, notInArray, or, sql } from 'drizzle-orm';
|
|
4
|
-
import { alias } from 'drizzle-orm/pg-core';
|
|
5
|
-
import { db } from './db.js';
|
|
6
|
-
import { listRunningJobExecutionsByProvisionedRunnerTx } from './job-executions.js';
|
|
7
|
-
import { releaseReservationUnits } from './reservations.js';
|
|
8
|
-
import { ephemeralRegistrationTokens } from './schema/ephemeral-registration-tokens.js';
|
|
9
|
-
import { provisionedRunners, toProvisionedRunner } from './schema/provisioned-runners.js';
|
|
10
|
-
import { provisionerTokens } from './schema/provisioner-tokens.js';
|
|
11
|
-
import { runnerSessions } from './schema/runner-sessions.js';
|
|
12
|
-
import { runningJobExecutions } from './schema/running-job-executions.js';
|
|
13
|
-
export const terminalStates = [
|
|
14
|
-
'stopped',
|
|
15
|
-
'failed',
|
|
16
|
-
'terminated'
|
|
17
|
-
];
|
|
18
|
-
export const activeStates = [
|
|
19
|
-
'starting',
|
|
20
|
-
'running',
|
|
21
|
-
'stopping'
|
|
22
|
-
];
|
|
23
|
-
export const divergenceCountStates = [
|
|
24
|
-
'starting',
|
|
25
|
-
'running'
|
|
26
|
-
];
|
|
27
|
-
export async function reportProvisionedRunners(params) {
|
|
28
|
-
if (params.events.length === 0) return {
|
|
29
|
-
accepted: 0,
|
|
30
|
-
reservationsReleased: 0,
|
|
31
|
-
terminateIntentsHonored: []
|
|
32
|
-
};
|
|
33
|
-
return await db().transaction(async (tx)=>{
|
|
34
|
-
const receivedAt = new Date();
|
|
35
|
-
const aggregatedEvents = aggregateEvents(params.events, receivedAt);
|
|
36
|
-
const hasTerminalEvent = aggregatedEvents.some((event)=>isTerminalState(event.state));
|
|
37
|
-
if (hasTerminalEvent) {
|
|
38
|
-
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);
|
|
39
|
-
}
|
|
40
|
-
const events = await hydrateRunnerSessionIdsFromConsumedTokens(tx, params, aggregatedEvents);
|
|
41
|
-
const terminateIntentsHonored = await listTerminateIntentsHonoredByTerminatedReportsTx(tx, params, events);
|
|
42
|
-
const values = events.map((event)=>({
|
|
43
|
-
workspaceId: params.workspaceId,
|
|
44
|
-
provisionerId: params.provisionerId,
|
|
45
|
-
provisionedRunnerId: event.provisionedRunnerId,
|
|
46
|
-
reservationId: event.reservationId,
|
|
47
|
-
templateKey: event.templateKey,
|
|
48
|
-
labels: [
|
|
49
|
-
...canonicalizeLabels(event.labels)
|
|
50
|
-
],
|
|
51
|
-
state: event.state,
|
|
52
|
-
reason: event.reason,
|
|
53
|
-
runnerSessionId: event.runnerSessionId,
|
|
54
|
-
providerKind: event.providerKind,
|
|
55
|
-
reportedAt: event.reportedAt > receivedAt ? receivedAt : event.reportedAt,
|
|
56
|
-
startedAt: event.startedAt,
|
|
57
|
-
stoppingAt: event.stoppingAt,
|
|
58
|
-
stoppedAt: event.stoppedAt,
|
|
59
|
-
failedAt: event.failedAt,
|
|
60
|
-
terminatedAt: event.terminatedAt
|
|
61
|
-
}));
|
|
62
|
-
await tx.insert(provisionedRunners).values(values).onConflictDoUpdate({
|
|
63
|
-
target: [
|
|
64
|
-
provisionedRunners.workspaceId,
|
|
65
|
-
provisionedRunners.provisionerId,
|
|
66
|
-
provisionedRunners.provisionedRunnerId
|
|
67
|
-
],
|
|
68
|
-
set: {
|
|
69
|
-
reservationId: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.reservation_id, ${provisionedRunners.reservationId}) ELSE ${provisionedRunners.reservationId} END`,
|
|
70
|
-
templateKey: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.template_key, ${provisionedRunners.templateKey}) ELSE ${provisionedRunners.templateKey} END`,
|
|
71
|
-
labels: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.labels ELSE ${provisionedRunners.labels} END`,
|
|
72
|
-
state: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.state ELSE ${provisionedRunners.state} END`,
|
|
73
|
-
reason: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.reason ELSE ${provisionedRunners.reason} END`,
|
|
74
|
-
runnerSessionId: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(${provisionedRunners.runnerSessionId}, excluded.runner_session_id) ELSE ${provisionedRunners.runnerSessionId} END`,
|
|
75
|
-
providerKind: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.provider_kind, ${provisionedRunners.providerKind}) ELSE ${provisionedRunners.providerKind} END`,
|
|
76
|
-
reportedAt: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.reported_at ELSE ${provisionedRunners.reportedAt} END`,
|
|
77
|
-
startedAt: firstObservedAt(provisionedRunners.startedAt, sql`excluded.started_at`),
|
|
78
|
-
stoppingAt: firstObservedAt(provisionedRunners.stoppingAt, sql`excluded.stopping_at`),
|
|
79
|
-
stoppedAt: firstObservedAt(provisionedRunners.stoppedAt, sql`excluded.stopped_at`),
|
|
80
|
-
failedAt: firstObservedAt(provisionedRunners.failedAt, sql`excluded.failed_at`),
|
|
81
|
-
terminatedAt: firstObservedAt(provisionedRunners.terminatedAt, sql`excluded.terminated_at`),
|
|
82
|
-
updatedAt: sql`now()`
|
|
83
|
-
},
|
|
84
|
-
setWhere: sql`
|
|
85
|
-
${provisionedRunnerProjectionUpdateCondition()}
|
|
86
|
-
OR ${provisionedRunnerMilestoneUpdateCondition()}
|
|
87
|
-
`
|
|
88
|
-
});
|
|
89
|
-
const reservationsReleased = hasTerminalEvent ? await releaseTerminalProvisionedRunnerReservations(tx, params, events) : 0;
|
|
90
|
-
return {
|
|
91
|
-
accepted: events.length,
|
|
92
|
-
reservationsReleased,
|
|
93
|
-
terminateIntentsHonored
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
export async function listActiveProvisionedRunnerCountsByTemplateTx(tx, params) {
|
|
98
|
-
const rows = await tx.select({
|
|
99
|
-
templateKey: provisionedRunners.templateKey,
|
|
100
|
-
state: provisionedRunners.state,
|
|
101
|
-
count: sql`count(*)::int`
|
|
102
|
-
}).from(provisionedRunners).where(and(eq(provisionedRunners.workspaceId, params.workspaceId), eq(provisionedRunners.provisionerId, params.provisionerId), inArray(provisionedRunners.state, divergenceCountStates), isNotNull(provisionedRunners.templateKey))).groupBy(provisionedRunners.templateKey, provisionedRunners.state);
|
|
103
|
-
return rows.flatMap((row)=>row.templateKey && isDivergenceCountState(row.state) ? [
|
|
104
|
-
{
|
|
105
|
-
templateKey: row.templateKey,
|
|
106
|
-
state: row.state,
|
|
107
|
-
count: row.count
|
|
108
|
-
}
|
|
109
|
-
] : []);
|
|
110
|
-
}
|
|
111
|
-
export async function listActiveProvisionedRunners(params) {
|
|
112
|
-
const rows = await db().select().from(provisionedRunners).where(and(eq(provisionedRunners.workspaceId, params.workspaceId), inArray(provisionedRunners.state, activeStates), sql`${provisionedRunners.updatedAt} > now() - (${params.windowSeconds} || ' seconds')::interval`)).orderBy(desc(provisionedRunners.updatedAt), desc(provisionedRunners.id)).limit(params.limit ?? 1000);
|
|
113
|
-
return rows.map(toProvisionedRunner);
|
|
114
|
-
}
|
|
115
|
-
export async function listProvisionerTerminateIntents(params) {
|
|
116
|
-
return await db().transaction(async (tx)=>{
|
|
117
|
-
const rows = await listProvisionerTerminateIntentRowsTx(tx, params);
|
|
118
|
-
return rows.map((row)=>row.provisionedRunnerId);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
export async function listProvisionerTerminateIntentRowsTx(tx, params) {
|
|
122
|
-
const rows = await provisionerTerminateIntentsQuery(tx, params).orderBy(asc(provisionedRunners.provisionedRunnerId)).limit(params.limit + 1);
|
|
123
|
-
const truncated = rows.length > params.limit;
|
|
124
|
-
const returnedRows = truncated ? rows.slice(0, params.limit) : rows;
|
|
125
|
-
if (truncated) {
|
|
126
|
-
logger().warn({
|
|
127
|
-
workspaceId: params.workspaceId,
|
|
128
|
-
provisionerId: params.provisionerId,
|
|
129
|
-
limit: params.limit,
|
|
130
|
-
returnedCount: returnedRows.length
|
|
131
|
-
}, 'provisioner terminate intents truncated by poll-demand limit');
|
|
132
|
-
}
|
|
133
|
-
return returnedRows;
|
|
134
|
-
}
|
|
135
|
-
function provisionerTerminateIntentsQuery(tx, params) {
|
|
136
|
-
const newerRunningJobExecutions = alias(runningJobExecutions, 'newer_running_jobs');
|
|
137
|
-
return tx.select({
|
|
138
|
-
provisionedRunnerId: provisionedRunners.provisionedRunnerId,
|
|
139
|
-
reason: sql`'job-cancelled'`
|
|
140
|
-
}).from(runningJobExecutions).innerJoin(provisionedRunners, and(eq(provisionedRunners.workspaceId, runningJobExecutions.workspaceId), eq(provisionedRunners.provisionerId, runningJobExecutions.provisionerId), eq(provisionedRunners.provisionedRunnerId, runningJobExecutions.provisionedRunnerId))).where(and(eq(runningJobExecutions.workspaceId, params.workspaceId), eq(runningJobExecutions.provisionerId, params.provisionerId), isNotNull(runningJobExecutions.cancellationRequestedAt), inArray(provisionedRunners.state, activeStates), params.provisionedRunnerIds && params.provisionedRunnerIds.length > 0 ? inArray(provisionedRunners.provisionedRunnerId, params.provisionedRunnerIds) : undefined, notExists(tx.select({
|
|
141
|
-
id: newerRunningJobExecutions.id
|
|
142
|
-
}).from(newerRunningJobExecutions).where(and(eq(newerRunningJobExecutions.workspaceId, runningJobExecutions.workspaceId), eq(newerRunningJobExecutions.provisionerId, runningJobExecutions.provisionerId), eq(newerRunningJobExecutions.provisionedRunnerId, runningJobExecutions.provisionedRunnerId), or(gt(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt), and(eq(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt), gt(newerRunningJobExecutions.jobExecutionId, runningJobExecutions.jobExecutionId)))))))).groupBy(provisionedRunners.provisionedRunnerId);
|
|
143
|
-
}
|
|
144
|
-
async function listTerminateIntentsHonoredByTerminatedReportsTx(tx, params, events) {
|
|
145
|
-
const terminatedProvisionedRunnerIds = [
|
|
146
|
-
...new Set(events.filter((event)=>event.state === 'terminated').map((event)=>event.provisionedRunnerId))
|
|
147
|
-
];
|
|
148
|
-
if (terminatedProvisionedRunnerIds.length === 0) return [];
|
|
149
|
-
return await provisionerTerminateIntentsQuery(tx, {
|
|
150
|
-
workspaceId: params.workspaceId,
|
|
151
|
-
provisionerId: params.provisionerId,
|
|
152
|
-
provisionedRunnerIds: terminatedProvisionedRunnerIds
|
|
153
|
-
}).orderBy(asc(provisionedRunners.provisionedRunnerId));
|
|
154
|
-
}
|
|
155
|
-
export async function reconcileProvisionedRunners(params) {
|
|
156
|
-
const observedProvisionedRunnerIds = [
|
|
157
|
-
...new Set(params.observedProvisionedRunnerIds)
|
|
158
|
-
];
|
|
159
|
-
return await db().transaction(async (tx)=>{
|
|
160
|
-
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);
|
|
161
|
-
let absentIds = [];
|
|
162
|
-
let reservationsReleased = 0;
|
|
163
|
-
if (observedProvisionedRunnerIds.length > 0) {
|
|
164
|
-
const staleAbsentRows = await tx.select({
|
|
165
|
-
id: provisionedRunners.id,
|
|
166
|
-
provisionedRunnerId: provisionedRunners.provisionedRunnerId
|
|
167
|
-
}).from(provisionedRunners).where(and(eq(provisionedRunners.workspaceId, params.workspaceId), eq(provisionedRunners.provisionerId, params.provisionerId), inArray(provisionedRunners.state, activeStates), lt(provisionedRunners.reportedAt, sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`), notInArray(provisionedRunners.provisionedRunnerId, observedProvisionedRunnerIds)));
|
|
168
|
-
if (staleAbsentRows.length > 0) {
|
|
169
|
-
const updated = await tx.update(provisionedRunners).set({
|
|
170
|
-
state: 'terminated',
|
|
171
|
-
terminatedAt: sql`coalesce(${provisionedRunners.terminatedAt}, now())`,
|
|
172
|
-
updatedAt: sql`now()`
|
|
173
|
-
}).where(and(inArray(provisionedRunners.id, staleAbsentRows.map((row)=>row.id)), inArray(provisionedRunners.state, activeStates), lt(provisionedRunners.reportedAt, sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`))).returning({
|
|
174
|
-
provisionedRunnerId: provisionedRunners.provisionedRunnerId
|
|
175
|
-
});
|
|
176
|
-
absentIds = updated.map((row)=>row.provisionedRunnerId);
|
|
177
|
-
reservationsReleased = await releaseTerminalProvisionedRunnerReservationsByIds(tx, {
|
|
178
|
-
workspaceId: params.workspaceId,
|
|
179
|
-
provisionerId: params.provisionerId,
|
|
180
|
-
provisionedRunnerIds: absentIds
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
const observedRows = observedProvisionedRunnerIds.length === 0 ? [] : (await tx.select().from(provisionedRunners).where(and(eq(provisionedRunners.workspaceId, params.workspaceId), eq(provisionedRunners.provisionerId, params.provisionerId), inArray(provisionedRunners.provisionedRunnerId, observedProvisionedRunnerIds)))).map(toProvisionedRunner);
|
|
185
|
-
const boundJobExecutions = await listRunningJobExecutionsByProvisionedRunnerTx(tx, {
|
|
186
|
-
workspaceId: params.workspaceId,
|
|
187
|
-
provisionerId: params.provisionerId,
|
|
188
|
-
provisionedRunnerIds: observedProvisionedRunnerIds
|
|
189
|
-
});
|
|
190
|
-
return {
|
|
191
|
-
observedRows,
|
|
192
|
-
boundJobExecutionsByProvisionedRunnerId: new Map(boundJobExecutions.map((jobExecution)=>[
|
|
193
|
-
jobExecution.provisionedRunnerId,
|
|
194
|
-
jobExecution
|
|
195
|
-
])),
|
|
196
|
-
absentIds,
|
|
197
|
-
reservationsReleased
|
|
198
|
-
};
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
export async function reapStaleProvisionedRunners(params) {
|
|
202
|
-
const cutoff = staleProvisionedRunnerCutoff(params.thresholdSeconds);
|
|
203
|
-
return await db().transaction(async (tx)=>{
|
|
204
|
-
const candidateRows = await tx.select({
|
|
205
|
-
id: provisionedRunners.id,
|
|
206
|
-
workspaceId: provisionedRunners.workspaceId,
|
|
207
|
-
provisionerId: provisionedRunners.provisionerId,
|
|
208
|
-
provisionedRunnerId: provisionedRunners.provisionedRunnerId
|
|
209
|
-
}).from(provisionedRunners).where(staleProvisionedRunnerWhere(tx, cutoff)).orderBy(asc(provisionedRunners.updatedAt), asc(provisionedRunners.id)).limit(params.limit);
|
|
210
|
-
if (candidateRows.length === 0) return {
|
|
211
|
-
reaped: 0,
|
|
212
|
-
reservationsReleased: 0
|
|
213
|
-
};
|
|
214
|
-
const workspaceIds = [
|
|
215
|
-
...new Set(candidateRows.map((row)=>row.workspaceId))
|
|
216
|
-
].sort();
|
|
217
|
-
for (const workspaceId of workspaceIds){
|
|
218
|
-
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workspaceId}))`);
|
|
219
|
-
}
|
|
220
|
-
const updatedRows = await tx.update(provisionedRunners).set({
|
|
221
|
-
state: 'failed',
|
|
222
|
-
reason: 'stale-provisioner',
|
|
223
|
-
failedAt: sql`coalesce(${provisionedRunners.failedAt}, now())`,
|
|
224
|
-
updatedAt: sql`now()`
|
|
225
|
-
}).where(and(inArray(provisionedRunners.id, candidateRows.map((row)=>row.id)), staleProvisionedRunnerWhere(tx, cutoff))).returning({
|
|
226
|
-
workspaceId: provisionedRunners.workspaceId,
|
|
227
|
-
provisionerId: provisionedRunners.provisionerId,
|
|
228
|
-
provisionedRunnerId: provisionedRunners.provisionedRunnerId
|
|
229
|
-
});
|
|
230
|
-
let reservationsReleased = 0;
|
|
231
|
-
for (const group of groupProvisionedRunnerIds(updatedRows)){
|
|
232
|
-
reservationsReleased += await releaseTerminalProvisionedRunnerReservationsByIds(tx, {
|
|
233
|
-
workspaceId: group.workspaceId,
|
|
234
|
-
provisionerId: group.provisionerId,
|
|
235
|
-
provisionedRunnerIds: group.provisionedRunnerIds,
|
|
236
|
-
requireUnlinkedSession: false
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
return {
|
|
240
|
-
reaped: updatedRows.length,
|
|
241
|
-
reservationsReleased
|
|
242
|
-
};
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
async function releaseTerminalProvisionedRunnerReservations(tx, params, events) {
|
|
246
|
-
const terminalEvents = events.filter((event)=>isTerminalState(event.state));
|
|
247
|
-
if (terminalEvents.length === 0) return 0;
|
|
248
|
-
return await releaseTerminalProvisionedRunnerReservationsByIds(tx, {
|
|
249
|
-
workspaceId: params.workspaceId,
|
|
250
|
-
provisionerId: params.provisionerId,
|
|
251
|
-
provisionedRunnerIds: terminalEvents.map((event)=>event.provisionedRunnerId)
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
async function releaseTerminalProvisionedRunnerReservationsByIds(tx, params) {
|
|
255
|
-
if (params.provisionedRunnerIds.length === 0) return 0;
|
|
256
|
-
const rows = await tx.select({
|
|
257
|
-
id: provisionedRunners.id,
|
|
258
|
-
reservationId: provisionedRunners.reservationId
|
|
259
|
-
}).from(provisionedRunners).where(and(eq(provisionedRunners.workspaceId, params.workspaceId), eq(provisionedRunners.provisionerId, params.provisionerId), inArray(provisionedRunners.provisionedRunnerId, params.provisionedRunnerIds), inArray(provisionedRunners.state, terminalStates), isNotNull(provisionedRunners.reservationId), params.requireUnlinkedSession === false ? undefined : isNull(provisionedRunners.runnerSessionId), isNull(provisionedRunners.reservationReleasedAt)));
|
|
260
|
-
if (rows.length === 0) return 0;
|
|
261
|
-
const updated = await tx.update(provisionedRunners).set({
|
|
262
|
-
reservationReleasedAt: sql`now()`,
|
|
263
|
-
updatedAt: sql`now()`
|
|
264
|
-
}).where(and(inArray(provisionedRunners.id, rows.map((row)=>row.id)), params.requireUnlinkedSession === false ? undefined : isNull(provisionedRunners.runnerSessionId), isNull(provisionedRunners.reservationReleasedAt))).returning({
|
|
265
|
-
reservationId: provisionedRunners.reservationId
|
|
266
|
-
});
|
|
267
|
-
const releasesByReservationId = new Map();
|
|
268
|
-
for (const row of updated){
|
|
269
|
-
if (!row.reservationId) continue;
|
|
270
|
-
releasesByReservationId.set(row.reservationId, (releasesByReservationId.get(row.reservationId) ?? 0) + 1);
|
|
271
|
-
}
|
|
272
|
-
if (releasesByReservationId.size === 0) return 0;
|
|
273
|
-
return await releaseReservationUnits(tx, {
|
|
274
|
-
workspaceId: params.workspaceId,
|
|
275
|
-
provisionerId: params.provisionerId,
|
|
276
|
-
releases: [
|
|
277
|
-
...releasesByReservationId
|
|
278
|
-
].map(([reservationId, count])=>({
|
|
279
|
-
reservationId,
|
|
280
|
-
count
|
|
281
|
-
}))
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
function staleProvisionedRunnerCutoff(thresholdSeconds) {
|
|
285
|
-
return sql`now() - (${thresholdSeconds} || ' seconds')::interval`;
|
|
286
|
-
}
|
|
287
|
-
function staleProvisionedRunnerWhere(tx, cutoff) {
|
|
288
|
-
return and(inArray(provisionedRunners.state, activeStates), lt(provisionedRunners.reportedAt, cutoff), lt(provisionedRunners.updatedAt, cutoff), exists(tx.select({
|
|
289
|
-
id: provisionerTokens.id
|
|
290
|
-
}).from(provisionerTokens).where(and(eq(provisionerTokens.id, provisionedRunners.provisionerId), eq(provisionerTokens.workspaceId, provisionedRunners.workspaceId), or(isNull(provisionerTokens.lastSeenAt), lt(provisionerTokens.lastSeenAt, cutoff))))), notExists(tx.select({
|
|
291
|
-
id: runningJobExecutions.id
|
|
292
|
-
}).from(runningJobExecutions).where(and(eq(runningJobExecutions.workspaceId, provisionedRunners.workspaceId), eq(runningJobExecutions.provisionerId, provisionedRunners.provisionerId), eq(runningJobExecutions.provisionedRunnerId, provisionedRunners.provisionedRunnerId)))), notExists(tx.select({
|
|
293
|
-
id: runnerSessions.id
|
|
294
|
-
}).from(runnerSessions).where(and(eq(runnerSessions.workspaceId, provisionedRunners.workspaceId), eq(runnerSessions.provisionerId, provisionedRunners.provisionerId), eq(runnerSessions.provisionedRunnerId, provisionedRunners.provisionedRunnerId), sql`${runnerSessions.updatedAt} >= ${cutoff}`))));
|
|
295
|
-
}
|
|
296
|
-
function groupProvisionedRunnerIds(rows) {
|
|
297
|
-
const groups = new Map();
|
|
298
|
-
for (const row of rows){
|
|
299
|
-
const key = `${row.workspaceId}:${row.provisionerId}`;
|
|
300
|
-
const group = groups.get(key) ?? {
|
|
301
|
-
workspaceId: row.workspaceId,
|
|
302
|
-
provisionerId: row.provisionerId,
|
|
303
|
-
provisionedRunnerIds: []
|
|
304
|
-
};
|
|
305
|
-
group.provisionedRunnerIds.push(row.provisionedRunnerId);
|
|
306
|
-
groups.set(key, group);
|
|
307
|
-
}
|
|
308
|
-
return [
|
|
309
|
-
...groups.values()
|
|
310
|
-
];
|
|
311
|
-
}
|
|
312
|
-
async function hydrateRunnerSessionIdsFromConsumedTokens(tx, params, events) {
|
|
313
|
-
const provisionedRunnerIds = [
|
|
314
|
-
...new Set(events.map((event)=>event.provisionedRunnerId))
|
|
315
|
-
];
|
|
316
|
-
if (provisionedRunnerIds.length === 0) return events;
|
|
317
|
-
const tokenRows = await tx.select({
|
|
318
|
-
provisionedRunnerId: ephemeralRegistrationTokens.provisionedRunnerId,
|
|
319
|
-
consumedSessionId: ephemeralRegistrationTokens.consumedSessionId
|
|
320
|
-
}).from(ephemeralRegistrationTokens).where(and(eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId), eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId), inArray(ephemeralRegistrationTokens.provisionedRunnerId, provisionedRunnerIds), isNotNull(ephemeralRegistrationTokens.consumedSessionId))).orderBy(desc(ephemeralRegistrationTokens.consumedAt), desc(ephemeralRegistrationTokens.createdAt));
|
|
321
|
-
const consumedSessionIdsByProvisionedRunnerId = new Map();
|
|
322
|
-
for (const row of tokenRows){
|
|
323
|
-
if (!row.consumedSessionId) continue;
|
|
324
|
-
if (consumedSessionIdsByProvisionedRunnerId.has(row.provisionedRunnerId)) continue;
|
|
325
|
-
consumedSessionIdsByProvisionedRunnerId.set(row.provisionedRunnerId, row.consumedSessionId);
|
|
326
|
-
}
|
|
327
|
-
if (consumedSessionIdsByProvisionedRunnerId.size === 0) return events;
|
|
328
|
-
return events.map((event)=>{
|
|
329
|
-
const consumedSessionId = consumedSessionIdsByProvisionedRunnerId.get(event.provisionedRunnerId);
|
|
330
|
-
if (!consumedSessionId || event.runnerSessionId === consumedSessionId) return event;
|
|
331
|
-
return {
|
|
332
|
-
...event,
|
|
333
|
-
runnerSessionId: consumedSessionId
|
|
334
|
-
};
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
function aggregateEvents(events, receivedAt) {
|
|
338
|
-
const byProvisionedRunnerId = new Map();
|
|
339
|
-
for (const rawEvent of events){
|
|
340
|
-
const event = toProvisionedRunnerReportRow(rawEvent, receivedAt);
|
|
341
|
-
const existing = byProvisionedRunnerId.get(event.provisionedRunnerId);
|
|
342
|
-
if (existing) mergeMilestones(existing, event);
|
|
343
|
-
if (!existing || compareProvisionedRunnerReportEvents(event, existing) > 0) {
|
|
344
|
-
byProvisionedRunnerId.set(event.provisionedRunnerId, existing ? mergeProjectionMetadata(event, existing) : event);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return [
|
|
348
|
-
...byProvisionedRunnerId.values()
|
|
349
|
-
];
|
|
350
|
-
}
|
|
351
|
-
function toProvisionedRunnerReportRow(event, receivedAt) {
|
|
352
|
-
const reportedAt = event.reportedAt > receivedAt ? receivedAt : event.reportedAt;
|
|
353
|
-
return {
|
|
354
|
-
...event,
|
|
355
|
-
reportedAt,
|
|
356
|
-
startedAt: event.state === 'running' ? reportedAt : null,
|
|
357
|
-
stoppingAt: event.state === 'stopping' ? reportedAt : null,
|
|
358
|
-
stoppedAt: event.state === 'stopped' ? reportedAt : null,
|
|
359
|
-
failedAt: event.state === 'failed' ? reportedAt : null,
|
|
360
|
-
terminatedAt: event.state === 'terminated' ? reportedAt : null
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
function mergeMilestones(target, source) {
|
|
364
|
-
target.startedAt = earliestDate(target.startedAt, source.startedAt);
|
|
365
|
-
target.stoppingAt = earliestDate(target.stoppingAt, source.stoppingAt);
|
|
366
|
-
target.stoppedAt = earliestDate(target.stoppedAt, source.stoppedAt);
|
|
367
|
-
target.failedAt = earliestDate(target.failedAt, source.failedAt);
|
|
368
|
-
target.terminatedAt = earliestDate(target.terminatedAt, source.terminatedAt);
|
|
369
|
-
}
|
|
370
|
-
function mergeProjectionMetadata(event, existing) {
|
|
371
|
-
return {
|
|
372
|
-
...event,
|
|
373
|
-
reservationId: event.reservationId ?? existing.reservationId,
|
|
374
|
-
templateKey: event.templateKey ?? existing.templateKey,
|
|
375
|
-
runnerSessionId: event.runnerSessionId ?? existing.runnerSessionId,
|
|
376
|
-
providerKind: event.providerKind ?? existing.providerKind,
|
|
377
|
-
...pickMilestones(existing)
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
function pickMilestones(event) {
|
|
381
|
-
return {
|
|
382
|
-
startedAt: event.startedAt,
|
|
383
|
-
stoppingAt: event.stoppingAt,
|
|
384
|
-
stoppedAt: event.stoppedAt,
|
|
385
|
-
failedAt: event.failedAt,
|
|
386
|
-
terminatedAt: event.terminatedAt
|
|
387
|
-
};
|
|
388
|
-
}
|
|
389
|
-
function earliestDate(a, b) {
|
|
390
|
-
if (!a) return b;
|
|
391
|
-
if (!b) return a;
|
|
392
|
-
return a < b ? a : b;
|
|
393
|
-
}
|
|
394
|
-
function compareProvisionedRunnerReportEvents(a, b) {
|
|
395
|
-
const timeDelta = a.reportedAt.getTime() - b.reportedAt.getTime();
|
|
396
|
-
const rankDelta = getProvisionedRunnerStateRank(a.state) - getProvisionedRunnerStateRank(b.state);
|
|
397
|
-
if (rankDelta !== 0) return rankDelta;
|
|
398
|
-
return timeDelta;
|
|
399
|
-
}
|
|
400
|
-
function getProvisionedRunnerStateRank(state) {
|
|
401
|
-
switch(state){
|
|
402
|
-
case 'starting':
|
|
403
|
-
return 1;
|
|
404
|
-
case 'running':
|
|
405
|
-
return 2;
|
|
406
|
-
case 'stopping':
|
|
407
|
-
return 3;
|
|
408
|
-
case 'stopped':
|
|
409
|
-
return 4;
|
|
410
|
-
case 'failed':
|
|
411
|
-
return 5;
|
|
412
|
-
case 'terminated':
|
|
413
|
-
return 6;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
function provisionedRunnerStateRank(state) {
|
|
417
|
-
return sql`
|
|
418
|
-
CASE ${state}
|
|
419
|
-
WHEN 'starting' THEN 1
|
|
420
|
-
WHEN 'running' THEN 2
|
|
421
|
-
WHEN 'stopping' THEN 3
|
|
422
|
-
WHEN 'stopped' THEN 4
|
|
423
|
-
WHEN 'failed' THEN 5
|
|
424
|
-
WHEN 'terminated' THEN 6
|
|
425
|
-
ELSE 0
|
|
426
|
-
END
|
|
427
|
-
`;
|
|
428
|
-
}
|
|
429
|
-
function provisionedRunnerProjectionUpdateCondition() {
|
|
430
|
-
return sql`
|
|
431
|
-
${provisionedRunnerStateRank(sql`excluded.state`)} > ${provisionedRunnerStateRank(provisionedRunners.state)}
|
|
432
|
-
OR (
|
|
433
|
-
${provisionedRunnerStateRank(sql`excluded.state`)} = ${provisionedRunnerStateRank(provisionedRunners.state)}
|
|
434
|
-
AND excluded.reported_at >= ${provisionedRunners.reportedAt}
|
|
435
|
-
)
|
|
436
|
-
`;
|
|
437
|
-
}
|
|
438
|
-
function provisionedRunnerMilestoneUpdateCondition() {
|
|
439
|
-
return sql`
|
|
440
|
-
${milestoneNeedsUpdate(provisionedRunners.startedAt, sql`excluded.started_at`)}
|
|
441
|
-
OR ${milestoneNeedsUpdate(provisionedRunners.stoppingAt, sql`excluded.stopping_at`)}
|
|
442
|
-
OR ${milestoneNeedsUpdate(provisionedRunners.stoppedAt, sql`excluded.stopped_at`)}
|
|
443
|
-
OR ${milestoneNeedsUpdate(provisionedRunners.failedAt, sql`excluded.failed_at`)}
|
|
444
|
-
OR ${milestoneNeedsUpdate(provisionedRunners.terminatedAt, sql`excluded.terminated_at`)}
|
|
445
|
-
`;
|
|
446
|
-
}
|
|
447
|
-
function milestoneNeedsUpdate(current, incoming) {
|
|
448
|
-
return sql`${incoming} IS NOT NULL AND (${current} IS NULL OR ${incoming} < ${current})`;
|
|
449
|
-
}
|
|
450
|
-
function firstObservedAt(current, incoming) {
|
|
451
|
-
return sql`
|
|
452
|
-
CASE
|
|
453
|
-
WHEN ${incoming} IS NULL THEN ${current}
|
|
454
|
-
WHEN ${current} IS NULL THEN ${incoming}
|
|
455
|
-
ELSE least(${current}, ${incoming})
|
|
456
|
-
END
|
|
457
|
-
`;
|
|
458
|
-
}
|
|
459
|
-
export function isTerminalState(state) {
|
|
460
|
-
return terminalStates.includes(state);
|
|
461
|
-
}
|
|
462
|
-
function isDivergenceCountState(state) {
|
|
463
|
-
return divergenceCountStates.includes(state);
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
//# sourceMappingURL=provisioned-runners.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/db/provisioned-runners.ts"],"sourcesContent":["import {logger} from '@shipfox/node-opentelemetry';\nimport {canonicalizeLabels} from '@shipfox/runner-labels';\nimport {\n and,\n asc,\n desc,\n eq,\n exists,\n gt,\n inArray,\n isNotNull,\n isNull,\n lt,\n notExists,\n notInArray,\n or,\n type SQL,\n sql,\n} from 'drizzle-orm';\nimport {alias} from 'drizzle-orm/pg-core';\nimport type {ProvisionedRunner, ProvisionedRunnerState} from '#core/entities/provisioned-runner.js';\nimport type {Tx} from './db.js';\nimport {db} from './db.js';\nimport {\n listRunningJobExecutionsByProvisionedRunnerTx,\n type ProvisionedRunnerBoundJobExecution,\n} from './job-executions.js';\nimport {releaseReservationUnits} from './reservations.js';\nimport {ephemeralRegistrationTokens} from './schema/ephemeral-registration-tokens.js';\nimport {provisionedRunners, toProvisionedRunner} from './schema/provisioned-runners.js';\nimport {provisionerTokens} from './schema/provisioner-tokens.js';\nimport {runnerSessions} from './schema/runner-sessions.js';\nimport {runningJobExecutions} from './schema/running-job-executions.js';\n\nexport const terminalStates = [\n 'stopped',\n 'failed',\n 'terminated',\n] as const satisfies readonly ProvisionedRunnerState[];\nexport const activeStates = [\n 'starting',\n 'running',\n 'stopping',\n] as const satisfies readonly ProvisionedRunnerState[];\nexport const divergenceCountStates = ['starting', 'running'] as const satisfies readonly Extract<\n ProvisionedRunnerState,\n 'starting' | 'running'\n>[];\n\nexport type ProvisionedRunnerTerminateIntentReason = 'job-cancelled';\n\nexport interface ProvisionedRunnerTerminateIntent {\n provisionedRunnerId: string;\n reason: ProvisionedRunnerTerminateIntentReason;\n}\n\nexport interface ActiveProvisionedRunnerTemplateCount {\n templateKey: string;\n state: (typeof divergenceCountStates)[number];\n count: number;\n}\n\nexport interface ProvisionedRunnerReportEvent {\n provisionedRunnerId: string;\n reservationId: string | null;\n templateKey: string | null;\n labels: string[];\n state: ProvisionedRunnerState;\n reason: string | null;\n runnerSessionId: string | null;\n providerKind: string | null;\n reportedAt: Date;\n}\n\nexport interface ReportProvisionedRunnersParams {\n workspaceId: string;\n provisionerId: string;\n events: ProvisionedRunnerReportEvent[];\n}\n\nexport interface ReconcileProvisionedRunnersParams {\n workspaceId: string;\n provisionerId: string;\n observedProvisionedRunnerIds: string[];\n terminateGraceSeconds: number;\n}\n\nexport interface ReconcileProvisionedRunnersDbResult {\n observedRows: ProvisionedRunner[];\n boundJobExecutionsByProvisionedRunnerId: Map<string, ProvisionedRunnerBoundJobExecution>;\n absentIds: string[];\n reservationsReleased: number;\n}\n\nexport interface ReapStaleProvisionedRunnersResult {\n reaped: number;\n reservationsReleased: number;\n}\n\ninterface ProvisionedRunnerReportRow extends ProvisionedRunnerReportEvent {\n startedAt: Date | null;\n stoppingAt: Date | null;\n stoppedAt: Date | null;\n failedAt: Date | null;\n terminatedAt: Date | null;\n}\n\ntype ProvisionedRunnerMilestoneColumn =\n | typeof provisionedRunners.startedAt\n | typeof provisionedRunners.stoppingAt\n | typeof provisionedRunners.stoppedAt\n | typeof provisionedRunners.failedAt\n | typeof provisionedRunners.terminatedAt;\n\nexport async function reportProvisionedRunners(params: ReportProvisionedRunnersParams): Promise<{\n accepted: number;\n reservationsReleased: number;\n terminateIntentsHonored: ProvisionedRunnerTerminateIntent[];\n}> {\n if (params.events.length === 0)\n return {accepted: 0, reservationsReleased: 0, terminateIntentsHonored: []};\n\n return await db().transaction(async (tx) => {\n const receivedAt = new Date();\n const aggregatedEvents = aggregateEvents(params.events, receivedAt);\n const hasTerminalEvent = aggregatedEvents.some((event) => isTerminalState(event.state));\n\n if (hasTerminalEvent) {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n }\n\n const events = await hydrateRunnerSessionIdsFromConsumedTokens(tx, params, aggregatedEvents);\n const terminateIntentsHonored = await listTerminateIntentsHonoredByTerminatedReportsTx(\n tx,\n params,\n events,\n );\n\n const values = events.map((event) => ({\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n provisionedRunnerId: event.provisionedRunnerId,\n reservationId: event.reservationId,\n templateKey: event.templateKey,\n labels: [...canonicalizeLabels(event.labels)],\n state: event.state,\n reason: event.reason,\n runnerSessionId: event.runnerSessionId,\n providerKind: event.providerKind,\n reportedAt: event.reportedAt > receivedAt ? receivedAt : event.reportedAt,\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n }));\n\n await tx\n .insert(provisionedRunners)\n .values(values)\n .onConflictDoUpdate({\n target: [\n provisionedRunners.workspaceId,\n provisionedRunners.provisionerId,\n provisionedRunners.provisionedRunnerId,\n ],\n set: {\n reservationId: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.reservation_id, ${provisionedRunners.reservationId}) ELSE ${provisionedRunners.reservationId} END`,\n templateKey: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.template_key, ${provisionedRunners.templateKey}) ELSE ${provisionedRunners.templateKey} END`,\n labels: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.labels ELSE ${provisionedRunners.labels} END`,\n state: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.state ELSE ${provisionedRunners.state} END`,\n reason: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.reason ELSE ${provisionedRunners.reason} END`,\n runnerSessionId: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(${provisionedRunners.runnerSessionId}, excluded.runner_session_id) ELSE ${provisionedRunners.runnerSessionId} END`,\n providerKind: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN coalesce(excluded.provider_kind, ${provisionedRunners.providerKind}) ELSE ${provisionedRunners.providerKind} END`,\n reportedAt: sql`CASE WHEN ${provisionedRunnerProjectionUpdateCondition()} THEN excluded.reported_at ELSE ${provisionedRunners.reportedAt} END`,\n startedAt: firstObservedAt(provisionedRunners.startedAt, sql`excluded.started_at`),\n stoppingAt: firstObservedAt(provisionedRunners.stoppingAt, sql`excluded.stopping_at`),\n stoppedAt: firstObservedAt(provisionedRunners.stoppedAt, sql`excluded.stopped_at`),\n failedAt: firstObservedAt(provisionedRunners.failedAt, sql`excluded.failed_at`),\n terminatedAt: firstObservedAt(\n provisionedRunners.terminatedAt,\n sql`excluded.terminated_at`,\n ),\n updatedAt: sql`now()`,\n },\n setWhere: sql`\n ${provisionedRunnerProjectionUpdateCondition()}\n OR ${provisionedRunnerMilestoneUpdateCondition()}\n `,\n });\n\n const reservationsReleased = hasTerminalEvent\n ? await releaseTerminalProvisionedRunnerReservations(tx, params, events)\n : 0;\n\n return {accepted: events.length, reservationsReleased, terminateIntentsHonored};\n });\n}\n\nexport async function listActiveProvisionedRunnerCountsByTemplateTx(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string},\n): Promise<ActiveProvisionedRunnerTemplateCount[]> {\n const rows = await tx\n .select({\n templateKey: provisionedRunners.templateKey,\n state: provisionedRunners.state,\n count: sql<number>`count(*)::int`,\n })\n .from(provisionedRunners)\n .where(\n and(\n eq(provisionedRunners.workspaceId, params.workspaceId),\n eq(provisionedRunners.provisionerId, params.provisionerId),\n inArray(provisionedRunners.state, divergenceCountStates),\n isNotNull(provisionedRunners.templateKey),\n ),\n )\n .groupBy(provisionedRunners.templateKey, provisionedRunners.state);\n\n return rows.flatMap((row) =>\n row.templateKey && isDivergenceCountState(row.state)\n ? [{templateKey: row.templateKey, state: row.state, count: row.count}]\n : [],\n );\n}\n\nexport async function listActiveProvisionedRunners(params: {\n workspaceId: string;\n windowSeconds: number;\n limit?: number;\n}): Promise<ProvisionedRunner[]> {\n const rows = await db()\n .select()\n .from(provisionedRunners)\n .where(\n and(\n eq(provisionedRunners.workspaceId, params.workspaceId),\n inArray(provisionedRunners.state, activeStates),\n sql`${provisionedRunners.updatedAt} > now() - (${params.windowSeconds} || ' seconds')::interval`,\n ),\n )\n .orderBy(desc(provisionedRunners.updatedAt), desc(provisionedRunners.id))\n .limit(params.limit ?? 1000);\n\n return rows.map(toProvisionedRunner);\n}\n\nexport async function listProvisionerTerminateIntents(params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n}): Promise<string[]> {\n return await db().transaction(async (tx) => {\n const rows = await listProvisionerTerminateIntentRowsTx(tx, params);\n return rows.map((row) => row.provisionedRunnerId);\n });\n}\n\nexport async function listProvisionerTerminateIntentRowsTx(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n limit: number;\n },\n): Promise<ProvisionedRunnerTerminateIntent[]> {\n const rows = await provisionerTerminateIntentsQuery(tx, params)\n .orderBy(asc(provisionedRunners.provisionedRunnerId))\n .limit(params.limit + 1);\n\n const truncated = rows.length > params.limit;\n const returnedRows = truncated ? rows.slice(0, params.limit) : rows;\n if (truncated) {\n logger().warn(\n {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n limit: params.limit,\n returnedCount: returnedRows.length,\n },\n 'provisioner terminate intents truncated by poll-demand limit',\n );\n }\n\n return returnedRows;\n}\n\nfunction provisionerTerminateIntentsQuery(\n tx: Tx,\n params: {workspaceId: string; provisionerId: string; provisionedRunnerIds?: string[]},\n) {\n const newerRunningJobExecutions = alias(runningJobExecutions, 'newer_running_jobs');\n\n return tx\n .select({\n provisionedRunnerId: provisionedRunners.provisionedRunnerId,\n reason: sql<ProvisionedRunnerTerminateIntentReason>`'job-cancelled'`,\n })\n .from(runningJobExecutions)\n .innerJoin(\n provisionedRunners,\n and(\n eq(provisionedRunners.workspaceId, runningJobExecutions.workspaceId),\n eq(provisionedRunners.provisionerId, runningJobExecutions.provisionerId),\n eq(provisionedRunners.provisionedRunnerId, runningJobExecutions.provisionedRunnerId),\n ),\n )\n .where(\n and(\n eq(runningJobExecutions.workspaceId, params.workspaceId),\n eq(runningJobExecutions.provisionerId, params.provisionerId),\n isNotNull(runningJobExecutions.cancellationRequestedAt),\n inArray(provisionedRunners.state, activeStates),\n params.provisionedRunnerIds && params.provisionedRunnerIds.length > 0\n ? inArray(provisionedRunners.provisionedRunnerId, params.provisionedRunnerIds)\n : undefined,\n notExists(\n tx\n .select({id: newerRunningJobExecutions.id})\n .from(newerRunningJobExecutions)\n .where(\n and(\n eq(newerRunningJobExecutions.workspaceId, runningJobExecutions.workspaceId),\n eq(newerRunningJobExecutions.provisionerId, runningJobExecutions.provisionerId),\n eq(\n newerRunningJobExecutions.provisionedRunnerId,\n runningJobExecutions.provisionedRunnerId,\n ),\n or(\n gt(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n and(\n eq(newerRunningJobExecutions.startedAt, runningJobExecutions.startedAt),\n gt(\n newerRunningJobExecutions.jobExecutionId,\n runningJobExecutions.jobExecutionId,\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n )\n .groupBy(provisionedRunners.provisionedRunnerId);\n}\n\nasync function listTerminateIntentsHonoredByTerminatedReportsTx(\n tx: Tx,\n params: ReportProvisionedRunnersParams,\n events: ProvisionedRunnerReportEvent[],\n): Promise<ProvisionedRunnerTerminateIntent[]> {\n const terminatedProvisionedRunnerIds = [\n ...new Set(\n events\n .filter((event) => event.state === 'terminated')\n .map((event) => event.provisionedRunnerId),\n ),\n ];\n if (terminatedProvisionedRunnerIds.length === 0) return [];\n\n return await provisionerTerminateIntentsQuery(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n provisionedRunnerIds: terminatedProvisionedRunnerIds,\n }).orderBy(asc(provisionedRunners.provisionedRunnerId));\n}\n\nexport async function reconcileProvisionedRunners(\n params: ReconcileProvisionedRunnersParams,\n): Promise<ReconcileProvisionedRunnersDbResult> {\n const observedProvisionedRunnerIds = [...new Set(params.observedProvisionedRunnerIds)];\n\n return await db().transaction(async (tx) => {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${params.workspaceId}))`);\n\n let absentIds: string[] = [];\n let reservationsReleased = 0;\n if (observedProvisionedRunnerIds.length > 0) {\n const staleAbsentRows = await tx\n .select({\n id: provisionedRunners.id,\n provisionedRunnerId: provisionedRunners.provisionedRunnerId,\n })\n .from(provisionedRunners)\n .where(\n and(\n eq(provisionedRunners.workspaceId, params.workspaceId),\n eq(provisionedRunners.provisionerId, params.provisionerId),\n inArray(provisionedRunners.state, activeStates),\n lt(\n provisionedRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n notInArray(provisionedRunners.provisionedRunnerId, observedProvisionedRunnerIds),\n ),\n );\n\n if (staleAbsentRows.length > 0) {\n const updated = await tx\n .update(provisionedRunners)\n .set({\n state: 'terminated',\n terminatedAt: sql`coalesce(${provisionedRunners.terminatedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n provisionedRunners.id,\n staleAbsentRows.map((row) => row.id),\n ),\n inArray(provisionedRunners.state, activeStates),\n lt(\n provisionedRunners.reportedAt,\n sql`now() - (${params.terminateGraceSeconds} || ' seconds')::interval`,\n ),\n ),\n )\n .returning({provisionedRunnerId: provisionedRunners.provisionedRunnerId});\n\n absentIds = updated.map((row) => row.provisionedRunnerId);\n reservationsReleased = await releaseTerminalProvisionedRunnerReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n provisionedRunnerIds: absentIds,\n });\n }\n }\n\n const observedRows =\n observedProvisionedRunnerIds.length === 0\n ? []\n : (\n await tx\n .select()\n .from(provisionedRunners)\n .where(\n and(\n eq(provisionedRunners.workspaceId, params.workspaceId),\n eq(provisionedRunners.provisionerId, params.provisionerId),\n inArray(provisionedRunners.provisionedRunnerId, observedProvisionedRunnerIds),\n ),\n )\n ).map(toProvisionedRunner);\n\n const boundJobExecutions = await listRunningJobExecutionsByProvisionedRunnerTx(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n provisionedRunnerIds: observedProvisionedRunnerIds,\n });\n\n return {\n observedRows,\n boundJobExecutionsByProvisionedRunnerId: new Map(\n boundJobExecutions.map((jobExecution) => [jobExecution.provisionedRunnerId, jobExecution]),\n ),\n absentIds,\n reservationsReleased,\n };\n });\n}\n\nexport async function reapStaleProvisionedRunners(params: {\n thresholdSeconds: number;\n limit: number;\n}): Promise<ReapStaleProvisionedRunnersResult> {\n const cutoff = staleProvisionedRunnerCutoff(params.thresholdSeconds);\n\n return await db().transaction(async (tx) => {\n const candidateRows = await tx\n .select({\n id: provisionedRunners.id,\n workspaceId: provisionedRunners.workspaceId,\n provisionerId: provisionedRunners.provisionerId,\n provisionedRunnerId: provisionedRunners.provisionedRunnerId,\n })\n .from(provisionedRunners)\n .where(staleProvisionedRunnerWhere(tx, cutoff))\n .orderBy(asc(provisionedRunners.updatedAt), asc(provisionedRunners.id))\n .limit(params.limit);\n\n if (candidateRows.length === 0) return {reaped: 0, reservationsReleased: 0};\n\n const workspaceIds = [...new Set(candidateRows.map((row) => row.workspaceId))].sort();\n for (const workspaceId of workspaceIds) {\n await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${workspaceId}))`);\n }\n\n const updatedRows = await tx\n .update(provisionedRunners)\n .set({\n state: 'failed',\n reason: 'stale-provisioner',\n failedAt: sql`coalesce(${provisionedRunners.failedAt}, now())`,\n updatedAt: sql`now()`,\n })\n .where(\n and(\n inArray(\n provisionedRunners.id,\n candidateRows.map((row) => row.id),\n ),\n staleProvisionedRunnerWhere(tx, cutoff),\n ),\n )\n .returning({\n workspaceId: provisionedRunners.workspaceId,\n provisionerId: provisionedRunners.provisionerId,\n provisionedRunnerId: provisionedRunners.provisionedRunnerId,\n });\n\n let reservationsReleased = 0;\n for (const group of groupProvisionedRunnerIds(updatedRows)) {\n reservationsReleased += await releaseTerminalProvisionedRunnerReservationsByIds(tx, {\n workspaceId: group.workspaceId,\n provisionerId: group.provisionerId,\n provisionedRunnerIds: group.provisionedRunnerIds,\n requireUnlinkedSession: false,\n });\n }\n\n return {reaped: updatedRows.length, reservationsReleased};\n });\n}\n\nasync function releaseTerminalProvisionedRunnerReservations(\n tx: Tx,\n params: ReportProvisionedRunnersParams,\n events: ProvisionedRunnerReportEvent[],\n): Promise<number> {\n const terminalEvents = events.filter((event) => isTerminalState(event.state));\n if (terminalEvents.length === 0) return 0;\n\n return await releaseTerminalProvisionedRunnerReservationsByIds(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n provisionedRunnerIds: terminalEvents.map((event) => event.provisionedRunnerId),\n });\n}\n\nasync function releaseTerminalProvisionedRunnerReservationsByIds(\n tx: Tx,\n params: {\n workspaceId: string;\n provisionerId: string;\n provisionedRunnerIds: string[];\n requireUnlinkedSession?: boolean;\n },\n): Promise<number> {\n if (params.provisionedRunnerIds.length === 0) return 0;\n\n const rows = await tx\n .select({\n id: provisionedRunners.id,\n reservationId: provisionedRunners.reservationId,\n })\n .from(provisionedRunners)\n .where(\n and(\n eq(provisionedRunners.workspaceId, params.workspaceId),\n eq(provisionedRunners.provisionerId, params.provisionerId),\n inArray(provisionedRunners.provisionedRunnerId, params.provisionedRunnerIds),\n inArray(provisionedRunners.state, terminalStates),\n isNotNull(provisionedRunners.reservationId),\n params.requireUnlinkedSession === false\n ? undefined\n : isNull(provisionedRunners.runnerSessionId),\n isNull(provisionedRunners.reservationReleasedAt),\n ),\n );\n\n if (rows.length === 0) return 0;\n\n const updated = await tx\n .update(provisionedRunners)\n .set({reservationReleasedAt: sql`now()`, updatedAt: sql`now()`})\n .where(\n and(\n inArray(\n provisionedRunners.id,\n rows.map((row) => row.id),\n ),\n params.requireUnlinkedSession === false\n ? undefined\n : isNull(provisionedRunners.runnerSessionId),\n isNull(provisionedRunners.reservationReleasedAt),\n ),\n )\n .returning({reservationId: provisionedRunners.reservationId});\n\n const releasesByReservationId = new Map<string, number>();\n for (const row of updated) {\n if (!row.reservationId) continue;\n releasesByReservationId.set(\n row.reservationId,\n (releasesByReservationId.get(row.reservationId) ?? 0) + 1,\n );\n }\n\n if (releasesByReservationId.size === 0) return 0;\n\n return await releaseReservationUnits(tx, {\n workspaceId: params.workspaceId,\n provisionerId: params.provisionerId,\n releases: [...releasesByReservationId].map(([reservationId, count]) => ({\n reservationId,\n count,\n })),\n });\n}\n\nfunction staleProvisionedRunnerCutoff(thresholdSeconds: number): SQL {\n return sql`now() - (${thresholdSeconds} || ' seconds')::interval`;\n}\n\nfunction staleProvisionedRunnerWhere(tx: Tx, cutoff: SQL): SQL<boolean> {\n return and(\n inArray(provisionedRunners.state, activeStates),\n lt(provisionedRunners.reportedAt, cutoff),\n lt(provisionedRunners.updatedAt, cutoff),\n exists(\n tx\n .select({id: provisionerTokens.id})\n .from(provisionerTokens)\n .where(\n and(\n eq(provisionerTokens.id, provisionedRunners.provisionerId),\n eq(provisionerTokens.workspaceId, provisionedRunners.workspaceId),\n or(isNull(provisionerTokens.lastSeenAt), lt(provisionerTokens.lastSeenAt, cutoff)),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runningJobExecutions.id})\n .from(runningJobExecutions)\n .where(\n and(\n eq(runningJobExecutions.workspaceId, provisionedRunners.workspaceId),\n eq(runningJobExecutions.provisionerId, provisionedRunners.provisionerId),\n eq(runningJobExecutions.provisionedRunnerId, provisionedRunners.provisionedRunnerId),\n ),\n ),\n ),\n notExists(\n tx\n .select({id: runnerSessions.id})\n .from(runnerSessions)\n .where(\n and(\n eq(runnerSessions.workspaceId, provisionedRunners.workspaceId),\n eq(runnerSessions.provisionerId, provisionedRunners.provisionerId),\n eq(runnerSessions.provisionedRunnerId, provisionedRunners.provisionedRunnerId),\n sql`${runnerSessions.updatedAt} >= ${cutoff}`,\n ),\n ),\n ),\n ) as SQL<boolean>;\n}\n\nfunction groupProvisionedRunnerIds(\n rows: Array<{workspaceId: string; provisionerId: string; provisionedRunnerId: string}>,\n): Array<{workspaceId: string; provisionerId: string; provisionedRunnerIds: string[]}> {\n const groups = new Map<\n string,\n {workspaceId: string; provisionerId: string; provisionedRunnerIds: string[]}\n >();\n for (const row of rows) {\n const key = `${row.workspaceId}:${row.provisionerId}`;\n const group = groups.get(key) ?? {\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n provisionedRunnerIds: [],\n };\n group.provisionedRunnerIds.push(row.provisionedRunnerId);\n groups.set(key, group);\n }\n return [...groups.values()];\n}\n\nasync function hydrateRunnerSessionIdsFromConsumedTokens(\n tx: Tx,\n params: ReportProvisionedRunnersParams,\n events: ProvisionedRunnerReportRow[],\n): Promise<ProvisionedRunnerReportRow[]> {\n const provisionedRunnerIds = [...new Set(events.map((event) => event.provisionedRunnerId))];\n if (provisionedRunnerIds.length === 0) return events;\n\n const tokenRows = await tx\n .select({\n provisionedRunnerId: ephemeralRegistrationTokens.provisionedRunnerId,\n consumedSessionId: ephemeralRegistrationTokens.consumedSessionId,\n })\n .from(ephemeralRegistrationTokens)\n .where(\n and(\n eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),\n eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),\n inArray(ephemeralRegistrationTokens.provisionedRunnerId, provisionedRunnerIds),\n isNotNull(ephemeralRegistrationTokens.consumedSessionId),\n ),\n )\n .orderBy(\n desc(ephemeralRegistrationTokens.consumedAt),\n desc(ephemeralRegistrationTokens.createdAt),\n );\n\n const consumedSessionIdsByProvisionedRunnerId = new Map<string, string>();\n for (const row of tokenRows) {\n if (!row.consumedSessionId) continue;\n if (consumedSessionIdsByProvisionedRunnerId.has(row.provisionedRunnerId)) continue;\n consumedSessionIdsByProvisionedRunnerId.set(row.provisionedRunnerId, row.consumedSessionId);\n }\n\n if (consumedSessionIdsByProvisionedRunnerId.size === 0) return events;\n\n return events.map((event) => {\n const consumedSessionId = consumedSessionIdsByProvisionedRunnerId.get(\n event.provisionedRunnerId,\n );\n if (!consumedSessionId || event.runnerSessionId === consumedSessionId) return event;\n return {...event, runnerSessionId: consumedSessionId};\n });\n}\n\nfunction aggregateEvents(\n events: ProvisionedRunnerReportEvent[],\n receivedAt: Date,\n): ProvisionedRunnerReportRow[] {\n const byProvisionedRunnerId = new Map<string, ProvisionedRunnerReportRow>();\n for (const rawEvent of events) {\n const event = toProvisionedRunnerReportRow(rawEvent, receivedAt);\n const existing = byProvisionedRunnerId.get(event.provisionedRunnerId);\n if (existing) mergeMilestones(existing, event);\n if (!existing || compareProvisionedRunnerReportEvents(event, existing) > 0) {\n byProvisionedRunnerId.set(\n event.provisionedRunnerId,\n existing ? mergeProjectionMetadata(event, existing) : event,\n );\n }\n }\n return [...byProvisionedRunnerId.values()];\n}\n\nfunction toProvisionedRunnerReportRow(\n event: ProvisionedRunnerReportEvent,\n receivedAt: Date,\n): ProvisionedRunnerReportRow {\n const reportedAt = event.reportedAt > receivedAt ? receivedAt : event.reportedAt;\n return {\n ...event,\n reportedAt,\n startedAt: event.state === 'running' ? reportedAt : null,\n stoppingAt: event.state === 'stopping' ? reportedAt : null,\n stoppedAt: event.state === 'stopped' ? reportedAt : null,\n failedAt: event.state === 'failed' ? reportedAt : null,\n terminatedAt: event.state === 'terminated' ? reportedAt : null,\n };\n}\n\nfunction mergeMilestones(target: ProvisionedRunnerReportRow, source: ProvisionedRunnerReportRow) {\n target.startedAt = earliestDate(target.startedAt, source.startedAt);\n target.stoppingAt = earliestDate(target.stoppingAt, source.stoppingAt);\n target.stoppedAt = earliestDate(target.stoppedAt, source.stoppedAt);\n target.failedAt = earliestDate(target.failedAt, source.failedAt);\n target.terminatedAt = earliestDate(target.terminatedAt, source.terminatedAt);\n}\n\nfunction mergeProjectionMetadata(\n event: ProvisionedRunnerReportRow,\n existing: ProvisionedRunnerReportRow,\n): ProvisionedRunnerReportRow {\n return {\n ...event,\n reservationId: event.reservationId ?? existing.reservationId,\n templateKey: event.templateKey ?? existing.templateKey,\n runnerSessionId: event.runnerSessionId ?? existing.runnerSessionId,\n providerKind: event.providerKind ?? existing.providerKind,\n ...pickMilestones(existing),\n };\n}\n\nfunction pickMilestones(event: ProvisionedRunnerReportRow) {\n return {\n startedAt: event.startedAt,\n stoppingAt: event.stoppingAt,\n stoppedAt: event.stoppedAt,\n failedAt: event.failedAt,\n terminatedAt: event.terminatedAt,\n };\n}\n\nfunction earliestDate(a: Date | null, b: Date | null): Date | null {\n if (!a) return b;\n if (!b) return a;\n return a < b ? a : b;\n}\n\nfunction compareProvisionedRunnerReportEvents(\n a: ProvisionedRunnerReportEvent,\n b: ProvisionedRunnerReportEvent,\n): number {\n const timeDelta = a.reportedAt.getTime() - b.reportedAt.getTime();\n const rankDelta = getProvisionedRunnerStateRank(a.state) - getProvisionedRunnerStateRank(b.state);\n if (rankDelta !== 0) return rankDelta;\n return timeDelta;\n}\n\nfunction getProvisionedRunnerStateRank(state: ProvisionedRunnerState): number {\n switch (state) {\n case 'starting':\n return 1;\n case 'running':\n return 2;\n case 'stopping':\n return 3;\n case 'stopped':\n return 4;\n case 'failed':\n return 5;\n case 'terminated':\n return 6;\n }\n}\n\nfunction provisionedRunnerStateRank(state: SQL | typeof provisionedRunners.state): SQL<number> {\n return sql<number>`\n CASE ${state}\n WHEN 'starting' THEN 1\n WHEN 'running' THEN 2\n WHEN 'stopping' THEN 3\n WHEN 'stopped' THEN 4\n WHEN 'failed' THEN 5\n WHEN 'terminated' THEN 6\n ELSE 0\n END\n `;\n}\n\nfunction provisionedRunnerProjectionUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${provisionedRunnerStateRank(sql`excluded.state`)} > ${provisionedRunnerStateRank(provisionedRunners.state)}\n OR (\n ${provisionedRunnerStateRank(sql`excluded.state`)} = ${provisionedRunnerStateRank(provisionedRunners.state)}\n AND excluded.reported_at >= ${provisionedRunners.reportedAt}\n )\n `;\n}\n\nfunction provisionedRunnerMilestoneUpdateCondition(): SQL<boolean> {\n return sql<boolean>`\n ${milestoneNeedsUpdate(provisionedRunners.startedAt, sql`excluded.started_at`)}\n OR ${milestoneNeedsUpdate(provisionedRunners.stoppingAt, sql`excluded.stopping_at`)}\n OR ${milestoneNeedsUpdate(provisionedRunners.stoppedAt, sql`excluded.stopped_at`)}\n OR ${milestoneNeedsUpdate(provisionedRunners.failedAt, sql`excluded.failed_at`)}\n OR ${milestoneNeedsUpdate(provisionedRunners.terminatedAt, sql`excluded.terminated_at`)}\n `;\n}\n\nfunction milestoneNeedsUpdate(\n current: SQL | ProvisionedRunnerMilestoneColumn,\n incoming: SQL,\n): SQL<boolean> {\n return sql<boolean>`${incoming} IS NOT NULL AND (${current} IS NULL OR ${incoming} < ${current})`;\n}\n\nfunction firstObservedAt(current: SQL | ProvisionedRunnerMilestoneColumn, incoming: SQL) {\n return sql`\n CASE\n WHEN ${incoming} IS NULL THEN ${current}\n WHEN ${current} IS NULL THEN ${incoming}\n ELSE least(${current}, ${incoming})\n END\n `;\n}\n\nexport function isTerminalState(state: ProvisionedRunnerState): boolean {\n return terminalStates.includes(state as (typeof terminalStates)[number]);\n}\n\nfunction isDivergenceCountState(\n state: ProvisionedRunnerState,\n): state is (typeof divergenceCountStates)[number] {\n return divergenceCountStates.includes(state as (typeof divergenceCountStates)[number]);\n}\n"],"names":["logger","canonicalizeLabels","and","asc","desc","eq","exists","gt","inArray","isNotNull","isNull","lt","notExists","notInArray","or","sql","alias","db","listRunningJobExecutionsByProvisionedRunnerTx","releaseReservationUnits","ephemeralRegistrationTokens","provisionedRunners","toProvisionedRunner","provisionerTokens","runnerSessions","runningJobExecutions","terminalStates","activeStates","divergenceCountStates","reportProvisionedRunners","params","events","length","accepted","reservationsReleased","terminateIntentsHonored","transaction","tx","receivedAt","Date","aggregatedEvents","aggregateEvents","hasTerminalEvent","some","event","isTerminalState","state","execute","workspaceId","hydrateRunnerSessionIdsFromConsumedTokens","listTerminateIntentsHonoredByTerminatedReportsTx","values","map","provisionerId","provisionedRunnerId","reservationId","templateKey","labels","reason","runnerSessionId","providerKind","reportedAt","startedAt","stoppingAt","stoppedAt","failedAt","terminatedAt","insert","onConflictDoUpdate","target","set","provisionedRunnerProjectionUpdateCondition","firstObservedAt","updatedAt","setWhere","provisionedRunnerMilestoneUpdateCondition","releaseTerminalProvisionedRunnerReservations","listActiveProvisionedRunnerCountsByTemplateTx","rows","select","count","from","where","groupBy","flatMap","row","isDivergenceCountState","listActiveProvisionedRunners","windowSeconds","orderBy","id","limit","listProvisionerTerminateIntents","listProvisionerTerminateIntentRowsTx","provisionerTerminateIntentsQuery","truncated","returnedRows","slice","warn","returnedCount","newerRunningJobExecutions","innerJoin","cancellationRequestedAt","provisionedRunnerIds","undefined","jobExecutionId","terminatedProvisionedRunnerIds","Set","filter","reconcileProvisionedRunners","observedProvisionedRunnerIds","absentIds","staleAbsentRows","terminateGraceSeconds","updated","update","returning","releaseTerminalProvisionedRunnerReservationsByIds","observedRows","boundJobExecutions","boundJobExecutionsByProvisionedRunnerId","Map","jobExecution","reapStaleProvisionedRunners","cutoff","staleProvisionedRunnerCutoff","thresholdSeconds","candidateRows","staleProvisionedRunnerWhere","reaped","workspaceIds","sort","updatedRows","group","groupProvisionedRunnerIds","requireUnlinkedSession","terminalEvents","reservationReleasedAt","releasesByReservationId","get","size","releases","lastSeenAt","groups","key","push","tokenRows","consumedSessionId","consumedAt","createdAt","consumedSessionIdsByProvisionedRunnerId","has","byProvisionedRunnerId","rawEvent","toProvisionedRunnerReportRow","existing","mergeMilestones","compareProvisionedRunnerReportEvents","mergeProjectionMetadata","source","earliestDate","pickMilestones","a","b","timeDelta","getTime","rankDelta","getProvisionedRunnerStateRank","provisionedRunnerStateRank","milestoneNeedsUpdate","current","incoming","includes"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/db/schema/provisioned-runners.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sCAAsC,CAAC;AAG5E,eAAO,MAAM,0BAA0B,8GAOrC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6C9B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAC;AACzE,MAAM,MAAM,yBAAyB,GAAG,OAAO,kBAAkB,CAAC,YAAY,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,mBAAmB,GAAG,iBAAiB,CAuB/E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/db/schema/provisioned-runners.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, pgEnum, text, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {ProvisionedRunner} from '#core/entities/provisioned-runner.js';\nimport {pgTable} from './common.js';\n\nexport const provisionedRunnerStateEnum = pgEnum('runners_provisioned_runner_state', [\n 'starting',\n 'running',\n 'stopping',\n 'stopped',\n 'failed',\n 'terminated',\n]);\n\nexport const provisionedRunners = pgTable(\n 'provisioned_runners',\n {\n id: uuidv7PrimaryKey(),\n workspaceId: uuid('workspace_id').notNull(),\n provisionerId: uuid('provisioner_id').notNull(),\n provisionedRunnerId: text('provisioned_runner_id').notNull(),\n reservationId: uuid('reservation_id'),\n templateKey: text('template_key'),\n labels: text('labels').array().notNull(),\n state: provisionedRunnerStateEnum('state').notNull(),\n reason: text('reason'),\n runnerSessionId: uuid('runner_session_id'),\n providerKind: text('provider_kind'),\n reportedAt: timestamp('reported_at', {withTimezone: true}).notNull(),\n startedAt: timestamp('started_at', {withTimezone: true}),\n stoppingAt: timestamp('stopping_at', {withTimezone: true}),\n stoppedAt: timestamp('stopped_at', {withTimezone: true}),\n failedAt: timestamp('failed_at', {withTimezone: true}),\n terminatedAt: timestamp('terminated_at', {withTimezone: true}),\n reservationReleasedAt: timestamp('reservation_released_at', {withTimezone: true}),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n uniqueIndex('runners_provisioned_runners_workspace_provisioner_runner_unique').on(\n table.workspaceId,\n table.provisionerId,\n table.provisionedRunnerId,\n ),\n index('runners_provisioned_runners_workspace_state_updated_idx').on(\n table.workspaceId,\n table.state,\n table.updatedAt,\n ),\n index('runners_provisioned_runners_stale_reaper_idx').on(\n table.state,\n table.updatedAt,\n table.reportedAt,\n table.workspaceId,\n ),\n index('runners_provisioned_runners_active_template_counts_idx')\n .on(table.workspaceId, table.provisionerId, table.state, table.templateKey)\n .where(sql`\"state\" in ('starting', 'running') and \"template_key\" is not null`),\n ],\n);\n\nexport type ProvisionedRunnerDb = typeof provisionedRunners.$inferSelect;\nexport type ProvisionedRunnerInsertDb = typeof provisionedRunners.$inferInsert;\n\nexport function toProvisionedRunner(row: ProvisionedRunnerDb): ProvisionedRunner {\n return {\n id: row.id,\n workspaceId: row.workspaceId,\n provisionerId: row.provisionerId,\n provisionedRunnerId: row.provisionedRunnerId,\n reservationId: row.reservationId,\n templateKey: row.templateKey,\n labels: row.labels,\n state: row.state,\n reason: row.reason,\n runnerSessionId: row.runnerSessionId,\n providerKind: row.providerKind,\n reportedAt: row.reportedAt,\n startedAt: row.startedAt,\n stoppingAt: row.stoppingAt,\n stoppedAt: row.stoppedAt,\n failedAt: row.failedAt,\n terminatedAt: row.terminatedAt,\n reservationReleasedAt: row.reservationReleasedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","pgEnum","text","timestamp","uniqueIndex","uuid","pgTable","provisionedRunnerStateEnum","provisionedRunners","id","workspaceId","notNull","provisionerId","provisionedRunnerId","reservationId","templateKey","labels","array","state","reason","runnerSessionId","providerKind","reportedAt","withTimezone","startedAt","stoppingAt","stoppedAt","failedAt","terminatedAt","reservationReleasedAt","createdAt","defaultNow","updatedAt","table","on","where","toProvisionedRunner","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAEtF,SAAQC,OAAO,QAAO,cAAc;AAEpC,OAAO,MAAMC,6BAA6BN,OAAO,oCAAoC;IACnF;IACA;IACA;IACA;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMO,qBAAqBF,QAChC,uBACA;IACEG,IAAIX;IACJY,aAAaL,KAAK,gBAAgBM,OAAO;IACzCC,eAAeP,KAAK,kBAAkBM,OAAO;IAC7CE,qBAAqBX,KAAK,yBAAyBS,OAAO;IAC1DG,eAAeT,KAAK;IACpBU,aAAab,KAAK;IAClBc,QAAQd,KAAK,UAAUe,KAAK,GAAGN,OAAO;IACtCO,OAAOX,2BAA2B,SAASI,OAAO;IAClDQ,QAAQjB,KAAK;IACbkB,iBAAiBf,KAAK;IACtBgB,cAAcnB,KAAK;IACnBoB,YAAYnB,UAAU,eAAe;QAACoB,cAAc;IAAI,GAAGZ,OAAO;IAClEa,WAAWrB,UAAU,cAAc;QAACoB,cAAc;IAAI;IACtDE,YAAYtB,UAAU,eAAe;QAACoB,cAAc;IAAI;IACxDG,WAAWvB,UAAU,cAAc;QAACoB,cAAc;IAAI;IACtDI,UAAUxB,UAAU,aAAa;QAACoB,cAAc;IAAI;IACpDK,cAAczB,UAAU,iBAAiB;QAACoB,cAAc;IAAI;IAC5DM,uBAAuB1B,UAAU,2BAA2B;QAACoB,cAAc;IAAI;IAC/EO,WAAW3B,UAAU,cAAc;QAACoB,cAAc;IAAI,GAAGZ,OAAO,GAAGoB,UAAU;IAC7EC,WAAW7B,UAAU,cAAc;QAACoB,cAAc;IAAI,GAAGZ,OAAO,GAAGoB,UAAU;AAC/E,GACA,CAACE,QAAU;QACT7B,YAAY,mEAAmE8B,EAAE,CAC/ED,MAAMvB,WAAW,EACjBuB,MAAMrB,aAAa,EACnBqB,MAAMpB,mBAAmB;QAE3Bb,MAAM,2DAA2DkC,EAAE,CACjED,MAAMvB,WAAW,EACjBuB,MAAMf,KAAK,EACXe,MAAMD,SAAS;QAEjBhC,MAAM,gDAAgDkC,EAAE,CACtDD,MAAMf,KAAK,EACXe,MAAMD,SAAS,EACfC,MAAMX,UAAU,EAChBW,MAAMvB,WAAW;QAEnBV,MAAM,0DACHkC,EAAE,CAACD,MAAMvB,WAAW,EAAEuB,MAAMrB,aAAa,EAAEqB,MAAMf,KAAK,EAAEe,MAAMlB,WAAW,EACzEoB,KAAK,CAACpC,GAAG,CAAC,iEAAiE,CAAC;KAChF,EACD;AAKF,OAAO,SAASqC,oBAAoBC,GAAwB;IAC1D,OAAO;QACL5B,IAAI4B,IAAI5B,EAAE;QACVC,aAAa2B,IAAI3B,WAAW;QAC5BE,eAAeyB,IAAIzB,aAAa;QAChCC,qBAAqBwB,IAAIxB,mBAAmB;QAC5CC,eAAeuB,IAAIvB,aAAa;QAChCC,aAAasB,IAAItB,WAAW;QAC5BC,QAAQqB,IAAIrB,MAAM;QAClBE,OAAOmB,IAAInB,KAAK;QAChBC,QAAQkB,IAAIlB,MAAM;QAClBC,iBAAiBiB,IAAIjB,eAAe;QACpCC,cAAcgB,IAAIhB,YAAY;QAC9BC,YAAYe,IAAIf,UAAU;QAC1BE,WAAWa,IAAIb,SAAS;QACxBC,YAAYY,IAAIZ,UAAU;QAC1BC,WAAWW,IAAIX,SAAS;QACxBC,UAAUU,IAAIV,QAAQ;QACtBC,cAAcS,IAAIT,YAAY;QAC9BC,uBAAuBQ,IAAIR,qBAAqB;QAChDC,WAAWO,IAAIP,SAAS;QACxBE,WAAWK,IAAIL,SAAS;IAC1B;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/provisioned-runners.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,iCAAiC,EACjC,8BAA8B,EAC/B,MAAM,8BAA8B,CAAC;AAEtC,wBAAgB,qCAAqC,CAAC,MAAM,EAAE,8BAA8B,GAAG;IAC7F,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAKA;AAED,wBAAgB,wCAAwC,CACtD,MAAM,EAAE,iCAAiC,GACxC;IACD,OAAO,EAAE,KAAK,CAAC;QACb,qBAAqB,EAAE,MAAM,CAAC;QAC9B,KAAK,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;QACrE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,SAAS,EAAE;YACT,MAAM,EAAE,MAAM,CAAC;YACf,uBAAuB,EAAE,MAAM,CAAC;YAChC,iBAAiB,EAAE,MAAM,CAAC;YAC1B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;SAC1C,GAAG,IAAI,CAAC;QACT,cAAc,EAAE,iCAAiC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;KACvF,CAAC,CAAC;IACH,wCAAwC,EAAE,MAAM,EAAE,CAAC;CACpD,CAoBA;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG;IACnE,OAAO,EAAE,KAAK,CAAC;QACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;QACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC,CAAC;CACJ,CAiBA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/presentation/dto/provisioned-runners.ts"],"sourcesContent":["import type {\n ActiveRunner,\n ReconcileProvisionedRunnersResult,\n ReportProvisionedRunnersResult,\n} from '#core/provisioned-runners.js';\n\nexport function toReportProvisionedRunnersResponseDto(result: ReportProvisionedRunnersResult): {\n accepted: number;\n reservations_released: number;\n} {\n return {\n accepted: result.accepted,\n reservations_released: result.reservationsReleased,\n };\n}\n\nexport function toReconcileProvisionedRunnersResponseDto(\n result: ReconcileProvisionedRunnersResult,\n): {\n runners: Array<{\n provisioned_runner_id: string;\n state: ReconcileProvisionedRunnersResult['runners'][number]['state'];\n reservation_id: string | null;\n runner_session_id: string | null;\n bound_job: {\n job_id: string;\n workflow_run_attempt_id: string;\n last_heartbeat_at: string;\n cancellation_requested_at: string | null;\n } | null;\n desired_intent: ReconcileProvisionedRunnersResult['runners'][number]['desiredIntent'];\n }>;\n terminated_absent_provisioned_runner_ids: string[];\n} {\n return {\n runners: result.runners.map((runner) => ({\n provisioned_runner_id: runner.provisionedRunnerId,\n state: runner.state,\n reservation_id: runner.reservationId,\n runner_session_id: runner.runnerSessionId,\n bound_job: runner.boundJobExecution\n ? {\n job_id: runner.boundJobExecution.jobId,\n workflow_run_attempt_id: runner.boundJobExecution.workflowRunAttemptId,\n last_heartbeat_at: runner.boundJobExecution.lastHeartbeatAt.toISOString(),\n cancellation_requested_at:\n runner.boundJobExecution.cancellationRequestedAt?.toISOString() ?? null,\n }\n : null,\n desired_intent: runner.desiredIntent,\n })),\n terminated_absent_provisioned_runner_ids: result.terminatedAbsentProvisionedRunnerIds,\n };\n}\n\nexport function toActiveRunnersResponseDto(runners: ActiveRunner[]): {\n runners: Array<{\n runner_session_id: string | null;\n provisioned_runner_id: string | null;\n provisioner_id: string | null;\n state: ActiveRunner['state'];\n labels: string[];\n template_key: string | null;\n provider_kind: string | null;\n job_id: string | null;\n workflow_run_attempt_id: string | null;\n project_id: string | null;\n reported_at: string | null;\n last_heartbeat_at: string | null;\n }>;\n} {\n return {\n runners: runners.map((runner) => ({\n runner_session_id: runner.runnerSessionId,\n provisioned_runner_id: runner.provisionedRunnerId,\n provisioner_id: runner.provisionerId,\n state: runner.state,\n labels: runner.labels,\n template_key: runner.templateKey,\n provider_kind: runner.providerKind,\n job_id: runner.jobId,\n workflow_run_attempt_id: runner.workflowRunAttemptId,\n project_id: runner.projectId,\n reported_at: runner.reportedAt?.toISOString() ?? null,\n last_heartbeat_at: runner.lastHeartbeatAt?.toISOString() ?? null,\n })),\n };\n}\n"],"names":["toReportProvisionedRunnersResponseDto","result","accepted","reservations_released","reservationsReleased","toReconcileProvisionedRunnersResponseDto","runners","map","runner","provisioned_runner_id","provisionedRunnerId","state","reservation_id","reservationId","runner_session_id","runnerSessionId","bound_job","boundJobExecution","job_id","jobId","workflow_run_attempt_id","workflowRunAttemptId","last_heartbeat_at","lastHeartbeatAt","toISOString","cancellation_requested_at","cancellationRequestedAt","desired_intent","desiredIntent","terminated_absent_provisioned_runner_ids","terminatedAbsentProvisionedRunnerIds","toActiveRunnersResponseDto","provisioner_id","provisionerId","labels","template_key","templateKey","provider_kind","providerKind","project_id","projectId","reported_at","reportedAt"],"mappings":"AAMA,OAAO,SAASA,sCAAsCC,MAAsC;IAI1F,OAAO;QACLC,UAAUD,OAAOC,QAAQ;QACzBC,uBAAuBF,OAAOG,oBAAoB;IACpD;AACF;AAEA,OAAO,SAASC,yCACdJ,MAAyC;IAiBzC,OAAO;QACLK,SAASL,OAAOK,OAAO,CAACC,GAAG,CAAC,CAACC,SAAY,CAAA;gBACvCC,uBAAuBD,OAAOE,mBAAmB;gBACjDC,OAAOH,OAAOG,KAAK;gBACnBC,gBAAgBJ,OAAOK,aAAa;gBACpCC,mBAAmBN,OAAOO,eAAe;gBACzCC,WAAWR,OAAOS,iBAAiB,GAC/B;oBACEC,QAAQV,OAAOS,iBAAiB,CAACE,KAAK;oBACtCC,yBAAyBZ,OAAOS,iBAAiB,CAACI,oBAAoB;oBACtEC,mBAAmBd,OAAOS,iBAAiB,CAACM,eAAe,CAACC,WAAW;oBACvEC,2BACEjB,OAAOS,iBAAiB,CAACS,uBAAuB,EAAEF,iBAAiB;gBACvE,IACA;gBACJG,gBAAgBnB,OAAOoB,aAAa;YACtC,CAAA;QACAC,0CAA0C5B,OAAO6B,oCAAoC;IACvF;AACF;AAEA,OAAO,SAASC,2BAA2BzB,OAAuB;IAgBhE,OAAO;QACLA,SAASA,QAAQC,GAAG,CAAC,CAACC,SAAY,CAAA;gBAChCM,mBAAmBN,OAAOO,eAAe;gBACzCN,uBAAuBD,OAAOE,mBAAmB;gBACjDsB,gBAAgBxB,OAAOyB,aAAa;gBACpCtB,OAAOH,OAAOG,KAAK;gBACnBuB,QAAQ1B,OAAO0B,MAAM;gBACrBC,cAAc3B,OAAO4B,WAAW;gBAChCC,eAAe7B,OAAO8B,YAAY;gBAClCpB,QAAQV,OAAOW,KAAK;gBACpBC,yBAAyBZ,OAAOa,oBAAoB;gBACpDkB,YAAY/B,OAAOgC,SAAS;gBAC5BC,aAAajC,OAAOkC,UAAU,EAAElB,iBAAiB;gBACjDF,mBAAmBd,OAAOe,eAAe,EAAEC,iBAAiB;YAC9D,CAAA;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reconcile-provisioned-runners.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/reconcile-provisioned-runners.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,gCAAgC,iDAoB3C,CAAC"}
|