Files
qinglong/packages/ql3-cluster-postgres/src/migrations/pg-0014-cluster-scheduler-admission.ts
T

111 lines
4.2 KiB
TypeScript

import { definePostgresSqlMigration } from './sqlMigration';
export const pg0014ClusterSchedulerAdmissionMigration =
definePostgresSqlMigration({
id: 'pg-0014-cluster-scheduler-admission',
statements: [
`
ALTER TABLE "ql3"."runs"
ALTER COLUMN trigger_id TYPE varchar(128)
`.trim(),
`
CREATE TABLE "ql3"."trigger_schedules" (
project_id varchar(128) NOT NULL,
trigger_id varchar(128) NOT NULL,
trigger_revision integer NOT NULL,
next_fire_at_ms bigint,
last_scheduled_at_ms bigint,
state_version integer NOT NULL,
claim_owner varchar(128),
claim_token uuid,
claim_version integer NOT NULL,
claim_expires_at_ms bigint,
updated_at_ms bigint NOT NULL,
CONSTRAINT trigger_schedules_pkey PRIMARY KEY (project_id, trigger_id),
CONSTRAINT ql3_trigger_schedules_revision_fk
FOREIGN KEY (project_id, trigger_id, trigger_revision)
REFERENCES "ql3"."trigger_revisions" (project_id, trigger_id, revision)
ON DELETE RESTRICT,
CONSTRAINT ql3_trigger_schedules_revision_check
CHECK (trigger_revision BETWEEN 1 AND 2147483647),
CONSTRAINT ql3_trigger_schedules_cursor_check CHECK (
next_fire_at_ms IS NULL OR next_fire_at_ms >= 0
),
CONSTRAINT ql3_trigger_schedules_last_check CHECK (
last_scheduled_at_ms IS NULL OR last_scheduled_at_ms >= 0
),
CONSTRAINT ql3_trigger_schedules_version_check CHECK (
state_version BETWEEN 0 AND 2147483647
AND claim_version BETWEEN 0 AND 2147483647
),
CONSTRAINT ql3_trigger_schedules_claim_owner_check CHECK (
claim_owner IS NULL
OR (
char_length(claim_owner) BETWEEN 1 AND 128
AND claim_owner ~ '^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$'
)
),
CONSTRAINT ql3_trigger_schedules_claim_shape_check CHECK (
(
claim_owner IS NULL
AND claim_token IS NULL
AND claim_expires_at_ms IS NULL
)
OR (
claim_owner IS NOT NULL
AND claim_token IS NOT NULL
AND claim_version >= 1
AND claim_expires_at_ms IS NOT NULL
AND claim_expires_at_ms > updated_at_ms
)
),
CONSTRAINT ql3_trigger_schedules_updated_check CHECK (updated_at_ms >= 0)
)
`.trim(),
`
INSERT INTO "ql3"."trigger_schedules" (
project_id, trigger_id, trigger_revision, next_fire_at_ms,
last_scheduled_at_ms, state_version, claim_owner, claim_token,
claim_version, claim_expires_at_ms, updated_at_ms
)
SELECT
project_id, trigger_id, current_revision, NULL, NULL, 0,
NULL, NULL, 0, NULL, updated_at_ms
FROM "ql3"."triggers"
`.trim(),
`
CREATE INDEX ql3_trigger_schedules_due_idx
ON "ql3"."trigger_schedules"
(next_fire_at_ms NULLS FIRST, claim_expires_at_ms, project_id, trigger_id)
`.trim(),
`
CREATE INDEX ql3_trigger_schedules_claim_expiry_idx
ON "ql3"."trigger_schedules"
(claim_expires_at_ms, project_id, trigger_id)
WHERE claim_token IS NOT NULL
`.trim(),
`
DO $ql3$
BEGIN
UPDATE "ql3"."schema_capabilities"
SET contract_version = 13,
migration_id = 'pg-0014-cluster-scheduler-admission',
capabilities = '{"api_credential":1,"api_credential_admin":1,"api_credential_pepper_binding":1,"cluster_execution_revision":1,"cluster_recovery":1,"cluster_recovery_claim":1,"cluster_scheduler_admission":1,"identity_admin":1,"project_policy":1,"run_core":1,"run_dispatch_lease":1,"run_retry_policy":1,"security_audit":1,"security_audit_query":1,"task_definition":1,"trigger_definition":1,"worker_attestation":1,"worker_credential":1,"worker_session":1}'::jsonb,
updated_at_ms = floor(
extract(epoch FROM transaction_timestamp()) * 1000
)::bigint
WHERE contract_name = 'control-core'
AND contract_version = 12
AND migration_id = 'pg-0013-task-execution-revisions'
AND capabilities = '{"api_credential":1,"api_credential_admin":1,"api_credential_pepper_binding":1,"cluster_execution_revision":1,"cluster_recovery":1,"cluster_recovery_claim":1,"identity_admin":1,"project_policy":1,"run_core":1,"run_dispatch_lease":1,"run_retry_policy":1,"security_audit":1,"security_audit_query":1,"task_definition":1,"trigger_definition":1,"worker_attestation":1,"worker_credential":1,"worker_session":1}'::jsonb;
IF NOT FOUND THEN
RAISE EXCEPTION 'control-core capability is not at version 12'
USING ERRCODE = 'check_violation';
END IF;
END
$ql3$
`.trim(),
],
});