Files
qinglong/packages/ql3-cluster-postgres/src/migrations/pg-0012-task-trigger-definitions.ts
T

190 lines
7.3 KiB
TypeScript

import { definePostgresSqlMigration } from './sqlMigration';
export const pg0012TaskTriggerDefinitionsMigration =
definePostgresSqlMigration({
id: 'pg-0012-task-trigger-definitions',
statements: [
`
CREATE TABLE "ql3"."task_definitions" (
project_id varchar(128) NOT NULL,
task_id varchar(128) NOT NULL,
current_revision integer NOT NULL,
created_at_ms bigint NOT NULL,
updated_at_ms bigint NOT NULL,
CONSTRAINT task_definitions_pkey PRIMARY KEY (project_id, task_id),
CONSTRAINT ql3_task_definitions_project_fk
FOREIGN KEY (project_id) REFERENCES "ql3"."projects" (id) ON DELETE RESTRICT,
CONSTRAINT ql3_task_definitions_id_check CHECK (
char_length(project_id) BETWEEN 1 AND 128
AND char_length(task_id) BETWEEN 1 AND 128
AND project_id !~ '[[:cntrl:]]'
AND task_id !~ '[[:cntrl:]]'
),
CONSTRAINT ql3_task_definitions_revision_check
CHECK (current_revision BETWEEN 1 AND 2147483647),
CONSTRAINT ql3_task_definitions_time_check
CHECK (created_at_ms >= 0 AND updated_at_ms >= created_at_ms)
)
`.trim(),
`
CREATE TABLE "ql3"."task_definition_revisions" (
project_id varchar(128) NOT NULL,
task_id varchar(128) NOT NULL,
revision integer NOT NULL,
mutation_id uuid NOT NULL,
name varchar(255) NOT NULL,
description varchar(4096),
kind varchar(16) NOT NULL,
spec_json jsonb NOT NULL,
labels_json jsonb NOT NULL,
enabled boolean NOT NULL,
content_digest char(64) NOT NULL,
created_at_ms bigint NOT NULL,
CONSTRAINT task_definition_revisions_pkey
PRIMARY KEY (project_id, task_id, revision),
CONSTRAINT ql3_task_definition_revisions_head_fk
FOREIGN KEY (project_id, task_id)
REFERENCES "ql3"."task_definitions" (project_id, task_id)
ON DELETE RESTRICT,
CONSTRAINT ql3_task_definition_revisions_revision_check
CHECK (revision BETWEEN 1 AND 2147483647),
CONSTRAINT ql3_task_definition_revisions_name_check CHECK (
char_length(name) BETWEEN 1 AND 255
AND (description IS NULL OR char_length(description) BETWEEN 1 AND 4096)
),
CONSTRAINT ql3_task_definition_revisions_kind_check
CHECK (kind IN ('script', 'command', 'workflow', 'agent', 'tool')),
CONSTRAINT ql3_task_definition_revisions_spec_check CHECK (
jsonb_typeof(spec_json) = 'object'
AND octet_length(spec_json::text) BETWEEN 2 AND 65536
),
CONSTRAINT ql3_task_definition_revisions_labels_check CHECK (
jsonb_typeof(labels_json) = 'object'
AND octet_length(labels_json::text) BETWEEN 2 AND 16384
),
CONSTRAINT ql3_task_definition_revisions_digest_check
CHECK (content_digest ~ '^[0-9a-f]{64}$'),
CONSTRAINT ql3_task_definition_revisions_created_check
CHECK (created_at_ms >= 0)
)
`.trim(),
`
CREATE UNIQUE INDEX ql3_task_definition_revisions_mutation_uidx
ON "ql3"."task_definition_revisions" (mutation_id)
`.trim(),
`
CREATE INDEX ql3_task_definition_revisions_project_kind_idx
ON "ql3"."task_definition_revisions"
(project_id, kind, enabled, task_id, revision)
`.trim(),
`
CREATE TABLE "ql3"."triggers" (
project_id varchar(128) NOT NULL,
trigger_id varchar(128) NOT NULL,
task_id varchar(128) NOT NULL,
current_revision integer NOT NULL,
created_at_ms bigint NOT NULL,
updated_at_ms bigint NOT NULL,
CONSTRAINT triggers_pkey PRIMARY KEY (project_id, trigger_id),
CONSTRAINT ql3_triggers_project_fk
FOREIGN KEY (project_id) REFERENCES "ql3"."projects" (id) ON DELETE RESTRICT,
CONSTRAINT ql3_triggers_task_fk
FOREIGN KEY (project_id, task_id)
REFERENCES "ql3"."task_definitions" (project_id, task_id)
ON DELETE RESTRICT,
CONSTRAINT ql3_triggers_id_check CHECK (
char_length(project_id) BETWEEN 1 AND 128
AND char_length(trigger_id) BETWEEN 1 AND 128
AND char_length(task_id) BETWEEN 1 AND 128
AND project_id !~ '[[:cntrl:]]'
AND trigger_id !~ '[[:cntrl:]]'
AND task_id !~ '[[:cntrl:]]'
),
CONSTRAINT ql3_triggers_revision_check
CHECK (current_revision BETWEEN 1 AND 2147483647),
CONSTRAINT ql3_triggers_time_check
CHECK (created_at_ms >= 0 AND updated_at_ms >= created_at_ms)
)
`.trim(),
`
CREATE UNIQUE INDEX ql3_triggers_task_uidx
ON "ql3"."triggers" (project_id, trigger_id, task_id)
`.trim(),
`
CREATE TABLE "ql3"."trigger_revisions" (
project_id varchar(128) NOT NULL,
trigger_id varchar(128) NOT NULL,
revision integer NOT NULL,
mutation_id uuid NOT NULL,
task_id varchar(128) NOT NULL,
task_revision integer NOT NULL,
task_content_digest char(64) NOT NULL,
spec_json jsonb NOT NULL,
enabled boolean NOT NULL,
content_digest char(64) NOT NULL,
created_at_ms bigint NOT NULL,
CONSTRAINT trigger_revisions_pkey
PRIMARY KEY (project_id, trigger_id, revision),
CONSTRAINT ql3_trigger_revisions_head_fk
FOREIGN KEY (project_id, trigger_id, task_id)
REFERENCES "ql3"."triggers" (project_id, trigger_id, task_id)
ON DELETE RESTRICT,
CONSTRAINT ql3_trigger_revisions_task_revision_fk
FOREIGN KEY (project_id, task_id, task_revision)
REFERENCES "ql3"."task_definition_revisions" (project_id, task_id, revision)
ON DELETE RESTRICT,
CONSTRAINT ql3_trigger_revisions_revision_check CHECK (
revision BETWEEN 1 AND 2147483647
AND task_revision BETWEEN 1 AND 2147483647
),
CONSTRAINT ql3_trigger_revisions_task_digest_check
CHECK (task_content_digest ~ '^[0-9a-f]{64}$'),
CONSTRAINT ql3_trigger_revisions_spec_check CHECK (
jsonb_typeof(spec_json) = 'object'
AND octet_length(spec_json::text) BETWEEN 2 AND 16384
),
CONSTRAINT ql3_trigger_revisions_digest_check
CHECK (content_digest ~ '^[0-9a-f]{64}$'),
CONSTRAINT ql3_trigger_revisions_created_check
CHECK (created_at_ms >= 0)
)
`.trim(),
`
CREATE UNIQUE INDEX ql3_trigger_revisions_mutation_uidx
ON "ql3"."trigger_revisions" (mutation_id)
`.trim(),
`
CREATE INDEX ql3_trigger_revisions_project_enabled_idx
ON "ql3"."trigger_revisions"
(project_id, enabled, trigger_id, revision)
`.trim(),
`
CREATE INDEX ql3_trigger_revisions_task_idx
ON "ql3"."trigger_revisions"
(project_id, task_id, task_revision, trigger_id, revision)
`.trim(),
`
DO $ql3$
BEGIN
UPDATE "ql3"."schema_capabilities"
SET contract_version = 11,
migration_id = 'pg-0012-task-trigger-definitions',
capabilities = '{"api_credential":1,"api_credential_admin":1,"api_credential_pepper_binding":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,
updated_at_ms = floor(
extract(epoch FROM transaction_timestamp()) * 1000
)::bigint
WHERE contract_name = 'control-core'
AND contract_version = 10
AND migration_id = 'pg-0011-api-credential-pepper-binding'
AND capabilities = '{"api_credential":1,"api_credential_admin":1,"api_credential_pepper_binding":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,"worker_attestation":1,"worker_credential":1,"worker_session":1}'::jsonb;
IF NOT FOUND THEN
RAISE EXCEPTION 'control-core capability is not at version 10'
USING ERRCODE = 'check_violation';
END IF;
END
$ql3$
`.trim(),
],
});