@shipfox/api-runners 5.0.0 → 7.0.1
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 +80 -0
- package/dist/config.d.ts +5 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +54 -7
- package/dist/config.js.map +1 -1
- 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/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} +7 -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 +9 -5
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +6 -3
- 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-assignments.d.ts +6 -0
- package/dist/core/runner-assignments.d.ts.map +1 -0
- package/dist/core/runner-assignments.js +6 -0
- package/dist/core/runner-assignments.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 +72 -0
- package/dist/core/runner-instances.d.ts.map +1 -0
- package/dist/core/runner-instances.js +165 -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/db.d.ts +2698 -1054
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +9 -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-assignments.d.ts +7 -0
- package/dist/db/runner-assignments.d.ts.map +1 -0
- package/dist/db/runner-assignments.js +55 -0
- package/dist/db/runner-assignments.js.map +1 -0
- package/dist/db/runner-instances.d.ts +84 -0
- package/dist/db/runner-instances.d.ts.map +1 -0
- package/dist/db/runner-instances.js +497 -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/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} +105 -34
- package/dist/db/schema/runner-instances.d.ts.map +1 -0
- package/dist/db/schema/{provisioned-runners.js → runner-instances.js} +23 -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 +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +45 -39
- 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 +1 -2
- package/dist/presentation/dto/index.d.ts.map +1 -1
- package/dist/presentation/dto/index.js +1 -2
- package/dist/presentation/dto/index.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-runner-instances.d.ts +2 -0
- package/dist/presentation/routes/assign-runner-instances.d.ts.map +1 -0
- package/dist/presentation/routes/assign-runner-instances.js +40 -0
- package/dist/presentation/routes/assign-runner-instances.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 +80 -51
- package/dist/presentation/routes/index.js.map +1 -1
- 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 +8 -0
- package/dist/presentation/routes/runner-enrollment.d.ts.map +1 -0
- package/dist/presentation/routes/runner-enrollment.js +212 -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 +91 -24
- package/drizzle/meta/0000_snapshot.json +392 -63
- package/package.json +21 -16
- package/src/config.test.ts +0 -26
- package/src/config.ts +48 -7
- package/src/core/demand.test.ts +29 -29
- package/src/core/demand.ts +22 -22
- 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} +6 -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 +37 -22
- 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-assignments.ts +9 -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 +301 -0
- package/src/core/runner-sessions.test.ts +112 -22
- package/src/core/runner-sessions.ts +25 -14
- package/src/db/db.ts +9 -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 +30 -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/runner-assignments.test.ts +163 -0
- package/src/db/runner-assignments.ts +115 -0
- package/src/db/{provisioned-runners.test.ts → runner-instances.test.ts} +442 -353
- package/src/db/runner-instances.ts +922 -0
- package/src/db/runner-sessions.test.ts +19 -6
- package/src/db/runner-sessions.ts +78 -2
- 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} +28 -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 +38 -27
- 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 +4 -8
- 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-runner-instances.ts +49 -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 +91 -44
- 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/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 +319 -0
- package/src/presentation/routes/runner-enrollment.ts +196 -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 +4 -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/mint-registration-tokens.d.ts +0 -5
- package/dist/presentation/dto/mint-registration-tokens.d.ts.map +0 -1
- package/dist/presentation/dto/mint-registration-tokens.js +0 -19
- package/dist/presentation/dto/mint-registration-tokens.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/mint-registration-tokens.d.ts +0 -2
- package/dist/presentation/routes/mint-registration-tokens.d.ts.map +0 -1
- package/dist/presentation/routes/mint-registration-tokens.js +0 -74
- package/dist/presentation/routes/mint-registration-tokens.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/dto/mint-registration-tokens.ts +0 -35
- package/src/presentation/routes/mint-registration-tokens.test.ts +0 -453
- package/src/presentation/routes/mint-registration-tokens.ts +0 -82
- package/src/presentation/routes/reconcile-provisioned-runners.ts +0 -30
- package/test/factories/provisioned-runner.ts +0 -78
|
@@ -44,7 +44,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
expect(result).toHaveLength(2);
|
|
47
|
-
expect(result.map((token) => token.
|
|
47
|
+
expect(result.map((token) => token.providerRunnerId).sort()).toEqual([
|
|
48
48
|
'provisioned-runner-a',
|
|
49
49
|
'provisioned-runner-b',
|
|
50
50
|
]);
|
|
@@ -53,14 +53,14 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
53
53
|
expect(result.every((token) => token.provisionerId === provisionerId)).toBe(true);
|
|
54
54
|
expect(
|
|
55
55
|
await resolveEphemeralRegistrationTokenByHash(hashOpaqueToken(rawTokens[0] ?? '')),
|
|
56
|
-
).toEqual(expect.objectContaining({
|
|
56
|
+
).toEqual(expect.objectContaining({providerRunnerId: 'provisioned-runner-a'}));
|
|
57
57
|
});
|
|
58
58
|
|
|
59
59
|
it('rejects the batch and inserts no rows when any provisioned runner already has an active token', async () => {
|
|
60
60
|
await ephemeralRegistrationTokenFactory.create({
|
|
61
61
|
workspaceId,
|
|
62
62
|
provisionerId,
|
|
63
|
-
|
|
63
|
+
providerRunnerId: 'provisioned-runner-a',
|
|
64
64
|
expiresAt: new Date(Date.now() + 60_000),
|
|
65
65
|
});
|
|
66
66
|
const rawToken = generateOpaqueToken('ephemeralRegistrationToken');
|
|
@@ -85,7 +85,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
85
85
|
),
|
|
86
86
|
);
|
|
87
87
|
expect(rows).toHaveLength(1);
|
|
88
|
-
expect(rows[0]?.
|
|
88
|
+
expect(rows[0]?.providerRunnerId).toBe('provisioned-runner-a');
|
|
89
89
|
});
|
|
90
90
|
|
|
91
91
|
it('allows sequential batches that exactly reach the reservation count', async () => {
|
|
@@ -152,7 +152,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
152
152
|
workspaceId,
|
|
153
153
|
provisionerId,
|
|
154
154
|
reservationId,
|
|
155
|
-
|
|
155
|
+
providerRunnerId: 'provisioned-runner-consumed',
|
|
156
156
|
expiresAt: new Date(Date.now() + 60_000),
|
|
157
157
|
});
|
|
158
158
|
await db()
|
|
@@ -163,7 +163,7 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
163
163
|
workspaceId,
|
|
164
164
|
provisionerId,
|
|
165
165
|
reservationId,
|
|
166
|
-
|
|
166
|
+
providerRunnerId: 'provisioned-runner-expired',
|
|
167
167
|
expiresAt: new Date(Date.now() - 60_000),
|
|
168
168
|
});
|
|
169
169
|
|
|
@@ -209,9 +209,9 @@ describe('createEphemeralRegistrationTokensBatch', () => {
|
|
|
209
209
|
return rows.length;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
-
function row(
|
|
212
|
+
function row(providerRunnerId: string, rawToken: string) {
|
|
213
213
|
return {
|
|
214
|
-
|
|
214
|
+
providerRunnerId,
|
|
215
215
|
hashedToken: hashOpaqueToken(rawToken),
|
|
216
216
|
prefix: extractDisplayPrefix(rawToken),
|
|
217
217
|
};
|
|
@@ -303,7 +303,7 @@ describe('deleteExpiredEphemeralRegistrationTokens', () => {
|
|
|
303
303
|
id,
|
|
304
304
|
workspaceId,
|
|
305
305
|
provisionerId,
|
|
306
|
-
|
|
306
|
+
providerRunnerId: `provisioned-${id}`,
|
|
307
307
|
hashedToken: crypto.randomUUID(),
|
|
308
308
|
prefix: 'sfxr_test',
|
|
309
309
|
expiresAt: params.expiresAt,
|
|
@@ -16,22 +16,22 @@ import {
|
|
|
16
16
|
ephemeralRegistrationTokens,
|
|
17
17
|
toEphemeralRegistrationToken,
|
|
18
18
|
} from './schema/ephemeral-registration-tokens.js';
|
|
19
|
-
import {provisionedRunners} from './schema/provisioned-runners.js';
|
|
20
19
|
import {reservations} from './schema/reservations.js';
|
|
20
|
+
import {providerRunners} from './schema/runner-instances.js';
|
|
21
21
|
import {runnerSessions, toRunnerSession} from './schema/runner-sessions.js';
|
|
22
22
|
|
|
23
23
|
export interface CreateEphemeralRegistrationTokenParams {
|
|
24
24
|
workspaceId: string;
|
|
25
25
|
provisionerId: string;
|
|
26
26
|
reservationId?: string | null | undefined;
|
|
27
|
-
|
|
27
|
+
providerRunnerId: string;
|
|
28
28
|
hashedToken: string;
|
|
29
29
|
prefix: string;
|
|
30
30
|
expiresAt: Date;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export interface CreateEphemeralRegistrationTokensBatchRow {
|
|
34
|
-
|
|
34
|
+
providerRunnerId: string;
|
|
35
35
|
hashedToken: string;
|
|
36
36
|
prefix: string;
|
|
37
37
|
}
|
|
@@ -48,13 +48,13 @@ export async function createEphemeralRegistrationToken(
|
|
|
48
48
|
params: CreateEphemeralRegistrationTokenParams,
|
|
49
49
|
): Promise<EphemeralRegistrationToken> {
|
|
50
50
|
const rows = await db().transaction(async (tx) => {
|
|
51
|
-
const
|
|
51
|
+
const providerRunnerLockKey = [
|
|
52
52
|
'runners_ephemeral_registration_tokens',
|
|
53
53
|
params.workspaceId,
|
|
54
54
|
params.provisionerId,
|
|
55
|
-
params.
|
|
55
|
+
params.providerRunnerId,
|
|
56
56
|
].join(':');
|
|
57
|
-
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${
|
|
57
|
+
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);
|
|
58
58
|
|
|
59
59
|
const [active] = await tx
|
|
60
60
|
.select({id: ephemeralRegistrationTokens.id})
|
|
@@ -63,7 +63,7 @@ export async function createEphemeralRegistrationToken(
|
|
|
63
63
|
and(
|
|
64
64
|
eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),
|
|
65
65
|
eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),
|
|
66
|
-
eq(ephemeralRegistrationTokens.
|
|
66
|
+
eq(ephemeralRegistrationTokens.providerRunnerId, params.providerRunnerId),
|
|
67
67
|
isNull(ephemeralRegistrationTokens.consumedAt),
|
|
68
68
|
gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),
|
|
69
69
|
),
|
|
@@ -74,7 +74,7 @@ export async function createEphemeralRegistrationToken(
|
|
|
74
74
|
throw new ActiveEphemeralRegistrationTokenExistsError(
|
|
75
75
|
params.workspaceId,
|
|
76
76
|
params.provisionerId,
|
|
77
|
-
params.
|
|
77
|
+
params.providerRunnerId,
|
|
78
78
|
);
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -84,7 +84,7 @@ export async function createEphemeralRegistrationToken(
|
|
|
84
84
|
workspaceId: params.workspaceId,
|
|
85
85
|
provisionerId: params.provisionerId,
|
|
86
86
|
reservationId: params.reservationId ?? null,
|
|
87
|
-
|
|
87
|
+
providerRunnerId: params.providerRunnerId,
|
|
88
88
|
hashedToken: params.hashedToken,
|
|
89
89
|
prefix: params.prefix,
|
|
90
90
|
expiresAt: params.expiresAt,
|
|
@@ -107,16 +107,16 @@ export async function createEphemeralRegistrationTokensBatch(
|
|
|
107
107
|
params.provisionerId,
|
|
108
108
|
].join(':');
|
|
109
109
|
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${provisionerLockKey}))`);
|
|
110
|
-
for (const
|
|
111
|
-
...new Set(params.rows.map((row) => row.
|
|
110
|
+
for (const providerRunnerId of [
|
|
111
|
+
...new Set(params.rows.map((row) => row.providerRunnerId)),
|
|
112
112
|
].sort()) {
|
|
113
|
-
const
|
|
113
|
+
const providerRunnerLockKey = [
|
|
114
114
|
'runners_ephemeral_registration_tokens',
|
|
115
115
|
params.workspaceId,
|
|
116
116
|
params.provisionerId,
|
|
117
|
-
|
|
117
|
+
providerRunnerId,
|
|
118
118
|
].join(':');
|
|
119
|
-
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${
|
|
119
|
+
await tx.execute(sql`select pg_advisory_xact_lock(hashtext(${providerRunnerLockKey}))`);
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
const [reservation] = await tx
|
|
@@ -162,15 +162,15 @@ export async function createEphemeralRegistrationTokensBatch(
|
|
|
162
162
|
);
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
-
const
|
|
165
|
+
const providerRunnerIds = params.rows.map((row) => row.providerRunnerId);
|
|
166
166
|
const activeRows = await tx
|
|
167
|
-
.select({
|
|
167
|
+
.select({providerRunnerId: ephemeralRegistrationTokens.providerRunnerId})
|
|
168
168
|
.from(ephemeralRegistrationTokens)
|
|
169
169
|
.where(
|
|
170
170
|
and(
|
|
171
171
|
eq(ephemeralRegistrationTokens.workspaceId, params.workspaceId),
|
|
172
172
|
eq(ephemeralRegistrationTokens.provisionerId, params.provisionerId),
|
|
173
|
-
inArray(ephemeralRegistrationTokens.
|
|
173
|
+
inArray(ephemeralRegistrationTokens.providerRunnerId, providerRunnerIds),
|
|
174
174
|
isNull(ephemeralRegistrationTokens.consumedAt),
|
|
175
175
|
gt(ephemeralRegistrationTokens.expiresAt, sql`now()`),
|
|
176
176
|
),
|
|
@@ -178,7 +178,7 @@ export async function createEphemeralRegistrationTokensBatch(
|
|
|
178
178
|
|
|
179
179
|
if (activeRows.length > 0) {
|
|
180
180
|
throw new ActiveEphemeralRegistrationTokensExistError(
|
|
181
|
-
activeRows.map((row) => row.
|
|
181
|
+
activeRows.map((row) => row.providerRunnerId),
|
|
182
182
|
);
|
|
183
183
|
}
|
|
184
184
|
|
|
@@ -189,7 +189,7 @@ export async function createEphemeralRegistrationTokensBatch(
|
|
|
189
189
|
workspaceId: params.workspaceId,
|
|
190
190
|
provisionerId: params.provisionerId,
|
|
191
191
|
reservationId: params.reservationId,
|
|
192
|
-
|
|
192
|
+
providerRunnerId: row.providerRunnerId,
|
|
193
193
|
hashedToken: row.hashedToken,
|
|
194
194
|
prefix: row.prefix,
|
|
195
195
|
expiresAt: params.expiresAt,
|
|
@@ -277,7 +277,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
|
|
|
277
277
|
.returning({
|
|
278
278
|
id: ephemeralRegistrationTokens.id,
|
|
279
279
|
provisionerId: ephemeralRegistrationTokens.provisionerId,
|
|
280
|
-
|
|
280
|
+
providerRunnerId: ephemeralRegistrationTokens.providerRunnerId,
|
|
281
281
|
});
|
|
282
282
|
|
|
283
283
|
if (!consumed[0]) {
|
|
@@ -315,7 +315,7 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
|
|
|
315
315
|
registrationTokenId: params.ephemeralTokenId,
|
|
316
316
|
registrationTokenKind: 'ephemeral',
|
|
317
317
|
provisionerId: consumed[0].provisionerId,
|
|
318
|
-
|
|
318
|
+
providerRunnerId: consumed[0].providerRunnerId,
|
|
319
319
|
labels: params.labels,
|
|
320
320
|
toolCapabilities: params.toolCapabilities ?? null,
|
|
321
321
|
toolCapabilitiesReportedAt: params.toolCapabilities ? sql`now()` : null,
|
|
@@ -332,14 +332,14 @@ export async function createRunnerSessionConsumingEphemeralToken(params: {
|
|
|
332
332
|
.where(eq(ephemeralRegistrationTokens.id, params.ephemeralTokenId));
|
|
333
333
|
|
|
334
334
|
await tx
|
|
335
|
-
.update(
|
|
335
|
+
.update(providerRunners)
|
|
336
336
|
.set({runnerSessionId: session.id, updatedAt: sql`now()`})
|
|
337
337
|
.where(
|
|
338
338
|
and(
|
|
339
|
-
eq(
|
|
340
|
-
eq(
|
|
341
|
-
eq(
|
|
342
|
-
isNull(
|
|
339
|
+
eq(providerRunners.workspaceId, params.workspaceId),
|
|
340
|
+
eq(providerRunners.provisionerId, consumed[0].provisionerId),
|
|
341
|
+
eq(providerRunners.providerRunnerId, consumed[0].providerRunnerId),
|
|
342
|
+
isNull(providerRunners.reservationReleasedAt),
|
|
343
343
|
),
|
|
344
344
|
);
|
|
345
345
|
|
package/src/db/index.ts
CHANGED
|
@@ -15,7 +15,7 @@ export {
|
|
|
15
15
|
export type {
|
|
16
16
|
ClaimedJobExecution,
|
|
17
17
|
EnqueueJobExecutionParams,
|
|
18
|
-
|
|
18
|
+
RunnerInstanceBoundJobExecution,
|
|
19
19
|
} from './job-executions.js';
|
|
20
20
|
export {
|
|
21
21
|
cancelRunnerJobs,
|
|
@@ -24,7 +24,7 @@ export {
|
|
|
24
24
|
expireStuckJobExecutions,
|
|
25
25
|
isJobLeaseActive,
|
|
26
26
|
listActiveRunningJobExecutions,
|
|
27
|
-
|
|
27
|
+
listRunningJobExecutionsByRunnerInstanceTx,
|
|
28
28
|
recordHeartbeat,
|
|
29
29
|
releaseJobExecution,
|
|
30
30
|
} from './job-executions.js';
|
|
@@ -35,26 +35,12 @@ export {
|
|
|
35
35
|
resolveManualRegistrationTokenByHash,
|
|
36
36
|
revokeManualRegistrationToken,
|
|
37
37
|
} from './manual-registration-tokens.js';
|
|
38
|
-
export type {
|
|
39
|
-
ActiveProvisionedRunnerTemplateCount,
|
|
40
|
-
ProvisionedRunnerReportEvent,
|
|
41
|
-
ProvisionedRunnerTerminateIntent,
|
|
42
|
-
ProvisionedRunnerTerminateIntentReason,
|
|
43
|
-
ReapStaleProvisionedRunnersResult,
|
|
44
|
-
ReconcileProvisionedRunnersDbResult,
|
|
45
|
-
ReconcileProvisionedRunnersParams,
|
|
46
|
-
ReportProvisionedRunnersParams,
|
|
47
|
-
} from './provisioned-runners.js';
|
|
48
38
|
export {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
reapStaleProvisionedRunners,
|
|
55
|
-
reconcileProvisionedRunners,
|
|
56
|
-
reportProvisionedRunners,
|
|
57
|
-
} from './provisioned-runners.js';
|
|
39
|
+
hasActiveWorkspaceProvisionerCapability,
|
|
40
|
+
listActiveWorkspaceProvisionerCapabilitySnapshots,
|
|
41
|
+
listStaleWorkspaceProvisionerCapabilitySnapshots,
|
|
42
|
+
publishWorkspaceProvisionerCapabilitySnapshot,
|
|
43
|
+
} from './provisioner-capability-snapshots.js';
|
|
58
44
|
export type {CreateProvisionerTokenParams} from './provisioner-tokens.js';
|
|
59
45
|
export {
|
|
60
46
|
createProvisionerToken,
|
|
@@ -80,11 +66,34 @@ export {
|
|
|
80
66
|
pollDemandAndReserve,
|
|
81
67
|
releaseReservationUnits,
|
|
82
68
|
} from './reservations.js';
|
|
69
|
+
export {assignRunnerInstances} from './runner-assignments.js';
|
|
70
|
+
export type {
|
|
71
|
+
ActiveRunnerInstanceTemplateCount,
|
|
72
|
+
ReapStaleRunnerInstancesResult,
|
|
73
|
+
ReconcileRunnerInstancesDbResult,
|
|
74
|
+
ReconcileRunnerInstancesParams,
|
|
75
|
+
ReportRunnerInstancesParams,
|
|
76
|
+
RunnerInstanceReportEvent,
|
|
77
|
+
RunnerInstanceTerminateIntent,
|
|
78
|
+
RunnerInstanceTerminateIntentReason,
|
|
79
|
+
} from './runner-instances.js';
|
|
80
|
+
export {
|
|
81
|
+
attachRunnerInstanceProviderId,
|
|
82
|
+
isTerminalState,
|
|
83
|
+
listActiveRunnerInstanceCountsByTemplateTx,
|
|
84
|
+
listActiveRunnerInstances,
|
|
85
|
+
listProvisionerTerminateIntentRowsTx,
|
|
86
|
+
listProvisionerTerminateIntents,
|
|
87
|
+
reapStaleRunnerInstances,
|
|
88
|
+
reconcileRunnerInstances,
|
|
89
|
+
reportRunnerInstances,
|
|
90
|
+
} from './runner-instances.js';
|
|
83
91
|
export type {
|
|
84
92
|
CreateRunnerSessionParams,
|
|
85
93
|
DeleteExpiredRunnerSessionsParams,
|
|
86
94
|
} from './runner-sessions.js';
|
|
87
95
|
export {createRunnerSession, deleteExpiredRunnerSessions} from './runner-sessions.js';
|
|
88
96
|
export {runnersOutbox} from './schema/outbox.js';
|
|
97
|
+
export {runnerBootstrapTokens, runnerControlSessions} from './schema/runner-control-sessions.js';
|
|
89
98
|
|
|
90
99
|
export const migrationsPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../drizzle');
|
|
@@ -8,7 +8,7 @@ import {eq, sql} from 'drizzle-orm';
|
|
|
8
8
|
import {EmptyRequiredLabelsError, RunnerSessionExhaustedError} from '#core/errors.js';
|
|
9
9
|
import {claimJobExecution} from '#core/job-executions.js';
|
|
10
10
|
import {detectAndExpireStuckJobs} from '#core/maintenance.js';
|
|
11
|
-
import {pendingJobFactory, runnerSessionFactory} from '#test/index.js';
|
|
11
|
+
import {pendingJobFactory, runnerSessionFactory, runnersTestAuthClient} from '#test/index.js';
|
|
12
12
|
import {db} from './db.js';
|
|
13
13
|
import {
|
|
14
14
|
cancelRunnerJobs,
|
|
@@ -385,10 +385,10 @@ describe('claimPendingJobExecution', () => {
|
|
|
385
385
|
|
|
386
386
|
it('enforces a non-null session claim cap from the database', async () => {
|
|
387
387
|
const provisionerId = crypto.randomUUID();
|
|
388
|
-
const
|
|
388
|
+
const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
|
|
389
389
|
await db()
|
|
390
390
|
.update(runnerSessions)
|
|
391
|
-
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId,
|
|
391
|
+
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
|
|
392
392
|
.where(eq(runnerSessions.id, runnerSessionId));
|
|
393
393
|
await pendingJobFactory.create({workspaceId});
|
|
394
394
|
await pendingJobFactory.create({workspaceId});
|
|
@@ -403,10 +403,10 @@ describe('claimPendingJobExecution', () => {
|
|
|
403
403
|
|
|
404
404
|
it('does not spend a claim when a capped session polls an empty queue', async () => {
|
|
405
405
|
const provisionerId = crypto.randomUUID();
|
|
406
|
-
const
|
|
406
|
+
const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
|
|
407
407
|
await db()
|
|
408
408
|
.update(runnerSessions)
|
|
409
|
-
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId,
|
|
409
|
+
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
|
|
410
410
|
.where(eq(runnerSessions.id, runnerSessionId));
|
|
411
411
|
|
|
412
412
|
const empty = await claimPendingJobExecution({workspaceId, runnerSessionId, maxClaims: 1});
|
|
@@ -494,15 +494,15 @@ describe('claimPendingJobExecution', () => {
|
|
|
494
494
|
expect(running[0]?.requiredLabels).toEqual(created.requiredLabels);
|
|
495
495
|
expect(running[0]?.runnerLabels).toEqual(sessionLabels);
|
|
496
496
|
expect(running[0]?.provisionerId).toBeNull();
|
|
497
|
-
expect(running[0]?.
|
|
497
|
+
expect(running[0]?.providerRunnerId).toBeNull();
|
|
498
498
|
});
|
|
499
499
|
|
|
500
500
|
it('copies an ephemeral session provisioned-runner link onto the running job', async () => {
|
|
501
501
|
const provisionerId = crypto.randomUUID();
|
|
502
|
-
const
|
|
502
|
+
const providerRunnerId = `provisioned-runner-${crypto.randomUUID()}`;
|
|
503
503
|
await db()
|
|
504
504
|
.update(runnerSessions)
|
|
505
|
-
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId,
|
|
505
|
+
.set({registrationTokenKind: 'ephemeral', maxClaims: 1, provisionerId, providerRunnerId})
|
|
506
506
|
.where(eq(runnerSessions.id, runnerSessionId));
|
|
507
507
|
const created = await pendingJobFactory.create({workspaceId});
|
|
508
508
|
|
|
@@ -513,7 +513,7 @@ describe('claimPendingJobExecution', () => {
|
|
|
513
513
|
.from(runningJobExecutions)
|
|
514
514
|
.where(eq(runningJobExecutions.jobId, created.jobId));
|
|
515
515
|
expect(running?.provisionerId).toBe(provisionerId);
|
|
516
|
-
expect(running?.
|
|
516
|
+
expect(running?.providerRunnerId).toBe(providerRunnerId);
|
|
517
517
|
});
|
|
518
518
|
|
|
519
519
|
it('rejects a running job row with a partial provisioned-runner link', async () => {
|
|
@@ -563,7 +563,7 @@ describe('claimPendingJobExecution', () => {
|
|
|
563
563
|
labels: sessionLabels,
|
|
564
564
|
toolCapabilities: {harnesses: {pi: {tools: ['read']}}},
|
|
565
565
|
});
|
|
566
|
-
const
|
|
566
|
+
const underRunnerInstance = await runnerSessionFactory.create({
|
|
567
567
|
workspaceId,
|
|
568
568
|
labels: sessionLabels,
|
|
569
569
|
toolCapabilities: {harnesses: {pi: {tools: []}}},
|
|
@@ -579,7 +579,7 @@ describe('claimPendingJobExecution', () => {
|
|
|
579
579
|
|
|
580
580
|
const firstClaim = await claimPendingJobExecution({
|
|
581
581
|
workspaceId,
|
|
582
|
-
runnerSessionId:
|
|
582
|
+
runnerSessionId: underRunnerInstance.id,
|
|
583
583
|
});
|
|
584
584
|
const secondClaim = await claimPendingJobExecution({
|
|
585
585
|
workspaceId,
|
|
@@ -758,6 +758,7 @@ describe('claimJobExecution', () => {
|
|
|
758
758
|
const created = await pendingJobFactory.create({workspaceId});
|
|
759
759
|
|
|
760
760
|
const claimed = await claimJobExecution({
|
|
761
|
+
auth: runnersTestAuthClient,
|
|
761
762
|
workspaceId,
|
|
762
763
|
runnerSessionId,
|
|
763
764
|
sessionLabels,
|
|
@@ -781,6 +782,7 @@ describe('claimJobExecution', () => {
|
|
|
781
782
|
|
|
782
783
|
it('returns null and mints no token when the queue is empty', async () => {
|
|
783
784
|
const claimed = await claimJobExecution({
|
|
785
|
+
auth: runnersTestAuthClient,
|
|
784
786
|
workspaceId,
|
|
785
787
|
runnerSessionId,
|
|
786
788
|
sessionLabels,
|
package/src/db/job-executions.ts
CHANGED
|
@@ -110,19 +110,19 @@ export interface ActiveRunningJobExecution {
|
|
|
110
110
|
projectId: string;
|
|
111
111
|
runnerSessionId: string;
|
|
112
112
|
provisionerId: string | null;
|
|
113
|
-
|
|
113
|
+
providerRunnerId: string | null;
|
|
114
114
|
requiredLabels: string[];
|
|
115
115
|
runnerLabels: string[];
|
|
116
116
|
startedAt: Date;
|
|
117
117
|
lastHeartbeatAt: Date;
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
-
export interface
|
|
120
|
+
export interface RunnerInstanceBoundJobExecution {
|
|
121
121
|
workflowRunId: string;
|
|
122
122
|
workflowRunAttemptId: string;
|
|
123
123
|
jobId: string;
|
|
124
124
|
jobExecutionId: string;
|
|
125
|
-
|
|
125
|
+
providerRunnerId: string;
|
|
126
126
|
startedAt: Date;
|
|
127
127
|
lastHeartbeatAt: Date;
|
|
128
128
|
cancellationRequestedAt: Date | null;
|
|
@@ -145,29 +145,35 @@ export async function claimPendingJobExecution(params: {
|
|
|
145
145
|
|
|
146
146
|
return await db().transaction(async (tx) => {
|
|
147
147
|
let provisionerId: string | null = null;
|
|
148
|
-
let
|
|
148
|
+
let providerRunnerId: string | null = null;
|
|
149
149
|
|
|
150
150
|
if (params.maxClaims !== null) {
|
|
151
151
|
const [session] = await tx
|
|
152
152
|
.select({
|
|
153
153
|
maxClaims: runnerSessions.maxClaims,
|
|
154
154
|
claimsUsed: runnerSessions.claimsUsed,
|
|
155
|
+
revokedAt: runnerSessions.revokedAt,
|
|
155
156
|
provisionerId: runnerSessions.provisionerId,
|
|
156
|
-
|
|
157
|
+
providerRunnerId: runnerSessions.providerRunnerId,
|
|
157
158
|
})
|
|
158
159
|
.from(runnerSessions)
|
|
159
160
|
.where(eq(runnerSessions.id, params.runnerSessionId))
|
|
160
161
|
.limit(1)
|
|
161
162
|
.for('update');
|
|
162
163
|
|
|
163
|
-
if (
|
|
164
|
+
if (
|
|
165
|
+
!session ||
|
|
166
|
+
session.revokedAt ||
|
|
167
|
+
session.maxClaims === null ||
|
|
168
|
+
session.claimsUsed >= session.maxClaims
|
|
169
|
+
) {
|
|
164
170
|
throw new RunnerSessionExhaustedError(params.runnerSessionId);
|
|
165
171
|
}
|
|
166
172
|
|
|
167
173
|
// Ephemeral sessions are the only capped sessions, and the DB check keeps
|
|
168
174
|
// their provisioned-runner link present as a pair.
|
|
169
175
|
provisionerId = session.provisionerId;
|
|
170
|
-
|
|
176
|
+
providerRunnerId = session.providerRunnerId;
|
|
171
177
|
}
|
|
172
178
|
|
|
173
179
|
// `id` is a uuidv7 (time-ordered), so it is a deterministic FIFO tiebreaker
|
|
@@ -206,7 +212,7 @@ export async function claimPendingJobExecution(params: {
|
|
|
206
212
|
projectId: row.projectId,
|
|
207
213
|
runnerSessionId: params.runnerSessionId,
|
|
208
214
|
provisionerId,
|
|
209
|
-
|
|
215
|
+
providerRunnerId,
|
|
210
216
|
requiredLabels: row.requiredLabels,
|
|
211
217
|
runnerLabels: params.sessionLabels,
|
|
212
218
|
})
|
|
@@ -409,7 +415,7 @@ export async function listActiveRunningJobExecutions(params: {
|
|
|
409
415
|
projectId: runningJobExecutions.projectId,
|
|
410
416
|
runnerSessionId: runningJobExecutions.runnerSessionId,
|
|
411
417
|
provisionerId: runningJobExecutions.provisionerId,
|
|
412
|
-
|
|
418
|
+
providerRunnerId: runningJobExecutions.providerRunnerId,
|
|
413
419
|
requiredLabels: runningJobExecutions.requiredLabels,
|
|
414
420
|
runnerLabels: runningJobExecutions.runnerLabels,
|
|
415
421
|
startedAt: runningJobExecutions.startedAt,
|
|
@@ -426,19 +432,19 @@ export async function listActiveRunningJobExecutions(params: {
|
|
|
426
432
|
.limit(params.limit ?? 1000);
|
|
427
433
|
}
|
|
428
434
|
|
|
429
|
-
export async function
|
|
435
|
+
export async function listRunningJobExecutionsByRunnerInstanceTx(
|
|
430
436
|
tx: Tx,
|
|
431
437
|
params: {
|
|
432
438
|
workspaceId: string;
|
|
433
439
|
provisionerId: string;
|
|
434
|
-
|
|
440
|
+
providerRunnerIds: string[];
|
|
435
441
|
},
|
|
436
|
-
): Promise<
|
|
437
|
-
if (params.
|
|
442
|
+
): Promise<RunnerInstanceBoundJobExecution[]> {
|
|
443
|
+
if (params.providerRunnerIds.length === 0) return [];
|
|
438
444
|
|
|
439
445
|
const duplicateRows = await tx
|
|
440
446
|
.select({
|
|
441
|
-
|
|
447
|
+
providerRunnerId: runningJobExecutions.providerRunnerId,
|
|
442
448
|
count: count(),
|
|
443
449
|
})
|
|
444
450
|
.from(runningJobExecutions)
|
|
@@ -446,21 +452,21 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
|
|
|
446
452
|
and(
|
|
447
453
|
eq(runningJobExecutions.workspaceId, params.workspaceId),
|
|
448
454
|
eq(runningJobExecutions.provisionerId, params.provisionerId),
|
|
449
|
-
inArray(runningJobExecutions.
|
|
455
|
+
inArray(runningJobExecutions.providerRunnerId, params.providerRunnerIds),
|
|
450
456
|
),
|
|
451
457
|
)
|
|
452
|
-
.groupBy(runningJobExecutions.
|
|
458
|
+
.groupBy(runningJobExecutions.providerRunnerId)
|
|
453
459
|
.having(sql`count(*) > 1`);
|
|
454
460
|
|
|
455
|
-
const
|
|
456
|
-
row.
|
|
461
|
+
const duplicateRunnerInstanceIds = duplicateRows.flatMap((row) =>
|
|
462
|
+
row.providerRunnerId ? [row.providerRunnerId] : [],
|
|
457
463
|
);
|
|
458
|
-
if (
|
|
464
|
+
if (duplicateRunnerInstanceIds.length > 0) {
|
|
459
465
|
logger().warn(
|
|
460
466
|
{
|
|
461
467
|
workspaceId: params.workspaceId,
|
|
462
468
|
provisionerId: params.provisionerId,
|
|
463
|
-
|
|
469
|
+
providerRunnerIds: duplicateRunnerInstanceIds,
|
|
464
470
|
},
|
|
465
471
|
'multiple running job executions are bound to the same provisioned runner',
|
|
466
472
|
);
|
|
@@ -471,17 +477,17 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
|
|
|
471
477
|
workflowRunAttemptId: string;
|
|
472
478
|
jobId: string;
|
|
473
479
|
jobExecutionId: string;
|
|
474
|
-
|
|
480
|
+
providerRunnerId: string;
|
|
475
481
|
startedAt: Date | string;
|
|
476
482
|
lastHeartbeatAt: Date | string;
|
|
477
483
|
cancellationRequestedAt: Date | string | null;
|
|
478
484
|
}>(sql`
|
|
479
|
-
SELECT DISTINCT ON (${runningJobExecutions.
|
|
485
|
+
SELECT DISTINCT ON (${runningJobExecutions.providerRunnerId})
|
|
480
486
|
${runningJobExecutions.workflowRunId} AS "workflowRunId",
|
|
481
487
|
${runningJobExecutions.workflowRunAttemptId} AS "workflowRunAttemptId",
|
|
482
488
|
${runningJobExecutions.jobId} AS "jobId",
|
|
483
489
|
${runningJobExecutions.jobExecutionId} AS "jobExecutionId",
|
|
484
|
-
${runningJobExecutions.
|
|
490
|
+
${runningJobExecutions.providerRunnerId} AS "providerRunnerId",
|
|
485
491
|
${runningJobExecutions.startedAt} AS "startedAt",
|
|
486
492
|
${runningJobExecutions.lastHeartbeatAt} AS "lastHeartbeatAt",
|
|
487
493
|
${runningJobExecutions.cancellationRequestedAt} AS "cancellationRequestedAt"
|
|
@@ -489,11 +495,11 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
|
|
|
489
495
|
WHERE
|
|
490
496
|
${runningJobExecutions.workspaceId} = ${params.workspaceId}
|
|
491
497
|
AND ${runningJobExecutions.provisionerId} = ${params.provisionerId}
|
|
492
|
-
AND ${runningJobExecutions.
|
|
493
|
-
params.
|
|
498
|
+
AND ${runningJobExecutions.providerRunnerId} IN (${sql.join(
|
|
499
|
+
params.providerRunnerIds.map((providerRunnerId) => sql`${providerRunnerId}`),
|
|
494
500
|
sql`, `,
|
|
495
501
|
)})
|
|
496
|
-
ORDER BY ${runningJobExecutions.
|
|
502
|
+
ORDER BY ${runningJobExecutions.providerRunnerId}, ${runningJobExecutions.startedAt} DESC, ${runningJobExecutions.jobExecutionId} DESC
|
|
497
503
|
`);
|
|
498
504
|
|
|
499
505
|
return result.rows.map((row) => ({
|
|
@@ -501,7 +507,7 @@ export async function listRunningJobExecutionsByProvisionedRunnerTx(
|
|
|
501
507
|
workflowRunAttemptId: row.workflowRunAttemptId,
|
|
502
508
|
jobId: row.jobId,
|
|
503
509
|
jobExecutionId: row.jobExecutionId,
|
|
504
|
-
|
|
510
|
+
providerRunnerId: row.providerRunnerId,
|
|
505
511
|
startedAt: toDate(row.startedAt),
|
|
506
512
|
lastHeartbeatAt: toDate(row.lastHeartbeatAt),
|
|
507
513
|
cancellationRequestedAt: row.cancellationRequestedAt
|