Files
proxmox-api-simulator/app/db/migrations/004_domain_model.sql
T
2026-07-13 01:13:26 +03:00

205 lines
7.6 KiB
SQL

CREATE TABLE clusters (
id uuid PRIMARY KEY,
external_id text NOT NULL UNIQUE,
name text NOT NULL,
version integer NOT NULL DEFAULT 1,
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now()
);
INSERT INTO clusters(id, external_id, name)
VALUES ('dc760c47-d8d7-57e6-9404-f0c6f2395d8f', 'default', 'pve-simulator');
ALTER TABLE nodes
ADD COLUMN cluster_id uuid NOT NULL DEFAULT 'dc760c47-d8d7-57e6-9404-f0c6f2395d8f'
REFERENCES clusters(id) ON DELETE CASCADE,
ADD COLUMN version integer NOT NULL DEFAULT 1,
ADD COLUMN metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN created_at timestamptz NOT NULL DEFAULT now(),
ADD COLUMN updated_at timestamptz NOT NULL DEFAULT now();
ALTER TABLE resources
ADD COLUMN cluster_id uuid NOT NULL DEFAULT 'dc760c47-d8d7-57e6-9404-f0c6f2395d8f'
REFERENCES clusters(id) ON DELETE CASCADE,
ADD COLUMN version integer NOT NULL DEFAULT 1,
ADD COLUMN metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
ADD COLUMN created_at timestamptz NOT NULL DEFAULT now(),
ADD COLUMN updated_at timestamptz NOT NULL DEFAULT now();
CREATE UNIQUE INDEX resources_cluster_vmid_idx
ON resources(cluster_id, external_id) WHERE kind IN ('qemu', 'lxc');
CREATE TABLE virtual_machines (
resource_id uuid PRIMARY KEY REFERENCES resources(id) ON DELETE CASCADE,
cluster_id uuid NOT NULL REFERENCES clusters(id) ON DELETE CASCADE,
vmid integer NOT NULL CHECK (vmid BETWEEN 100 AND 999999999),
config jsonb NOT NULL DEFAULT '{}'::jsonb,
lock text,
template boolean NOT NULL DEFAULT false,
UNIQUE (cluster_id, vmid)
);
CREATE TABLE containers (
resource_id uuid PRIMARY KEY REFERENCES resources(id) ON DELETE CASCADE,
cluster_id uuid NOT NULL REFERENCES clusters(id) ON DELETE CASCADE,
vmid integer NOT NULL CHECK (vmid BETWEEN 100 AND 999999999),
config jsonb NOT NULL DEFAULT '{}'::jsonb,
lock text,
template boolean NOT NULL DEFAULT false,
UNIQUE (cluster_id, vmid)
);
CREATE TABLE vm_disks (
id uuid PRIMARY KEY,
resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
device text NOT NULL,
storage_id text NOT NULL,
size_bytes bigint NOT NULL CHECK (size_bytes >= 0),
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
UNIQUE (resource_id, device)
);
CREATE TABLE vm_network_interfaces (
id uuid PRIMARY KEY,
resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
device text NOT NULL,
config jsonb NOT NULL DEFAULT '{}'::jsonb,
UNIQUE (resource_id, device)
);
CREATE TABLE storages (
resource_id uuid PRIMARY KEY REFERENCES resources(id) ON DELETE CASCADE,
cluster_id uuid NOT NULL REFERENCES clusters(id) ON DELETE CASCADE,
storage_id text NOT NULL,
storage_type text NOT NULL,
shared boolean NOT NULL DEFAULT false,
capacity_bytes bigint CHECK (capacity_bytes >= 0),
used_bytes bigint CHECK (used_bytes >= 0),
config jsonb NOT NULL DEFAULT '{}'::jsonb,
UNIQUE (cluster_id, storage_id)
);
CREATE TABLE storage_contents (
id uuid PRIMARY KEY,
storage_resource_id uuid NOT NULL REFERENCES storages(resource_id) ON DELETE CASCADE,
volume_id text NOT NULL,
content_type text NOT NULL,
size_bytes bigint NOT NULL DEFAULT 0 CHECK (size_bytes >= 0),
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (storage_resource_id, volume_id)
);
CREATE TABLE snapshots (
id uuid PRIMARY KEY,
resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
name text NOT NULL,
parent_name text,
description text,
state jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (resource_id, name)
);
CREATE TABLE backups (
id uuid PRIMARY KEY,
resource_id uuid REFERENCES resources(id) ON DELETE SET NULL,
storage_resource_id uuid NOT NULL REFERENCES storages(resource_id) ON DELETE CASCADE,
volume_id text NOT NULL,
size_bytes bigint NOT NULL DEFAULT 0 CHECK (size_bytes >= 0),
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (storage_resource_id, volume_id)
);
CREATE TABLE pools (
id uuid PRIMARY KEY,
cluster_id uuid NOT NULL REFERENCES clusters(id) ON DELETE CASCADE,
pool_id text NOT NULL,
comment text,
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
UNIQUE (cluster_id, pool_id)
);
CREATE TABLE pool_members (
pool_id uuid NOT NULL REFERENCES pools(id) ON DELETE CASCADE,
resource_id uuid NOT NULL REFERENCES resources(id) ON DELETE CASCADE,
PRIMARY KEY (pool_id, resource_id)
);
CREATE TABLE identity_groups (
id uuid PRIMARY KEY,
group_id text NOT NULL UNIQUE,
comment text,
metadata jsonb NOT NULL DEFAULT '{}'::jsonb
);
CREATE TABLE identity_group_members (
group_id uuid NOT NULL REFERENCES identity_groups(id) ON DELETE CASCADE,
principal_id uuid NOT NULL REFERENCES principals(id) ON DELETE CASCADE,
PRIMARY KEY (group_id, principal_id)
);
CREATE TABLE auth_tickets (
id uuid PRIMARY KEY,
principal_id uuid NOT NULL REFERENCES principals(id) ON DELETE CASCADE,
ticket_hash text NOT NULL UNIQUE,
issued_at timestamptz NOT NULL,
expires_at timestamptz NOT NULL,
revoked_at timestamptz
);
CREATE INDEX auth_tickets_expiry_idx ON auth_tickets(expires_at) WHERE revoked_at IS NULL;
CREATE TABLE contract_paths (
snapshot_checksum text NOT NULL REFERENCES contract_snapshots(checksum) ON DELETE CASCADE,
path text NOT NULL,
document jsonb NOT NULL,
PRIMARY KEY (snapshot_checksum, path)
);
CREATE TABLE contract_methods (
snapshot_checksum text NOT NULL,
path text NOT NULL,
verb text NOT NULL,
fingerprint text NOT NULL,
document jsonb NOT NULL,
PRIMARY KEY (snapshot_checksum, path, verb),
FOREIGN KEY (snapshot_checksum, path)
REFERENCES contract_paths(snapshot_checksum, path) ON DELETE CASCADE
);
CREATE TABLE contract_parameters (
snapshot_checksum text NOT NULL,
path text NOT NULL,
verb text NOT NULL,
name text NOT NULL,
location text NOT NULL,
document jsonb NOT NULL,
PRIMARY KEY (snapshot_checksum, path, verb, name, location),
FOREIGN KEY (snapshot_checksum, path, verb)
REFERENCES contract_methods(snapshot_checksum, path, verb) ON DELETE CASCADE
);
CREATE TABLE contract_schema_fragments (
id uuid PRIMARY KEY,
snapshot_checksum text NOT NULL REFERENCES contract_snapshots(checksum) ON DELETE CASCADE,
fingerprint text NOT NULL,
document jsonb NOT NULL,
UNIQUE (snapshot_checksum, fingerprint)
);
CREATE TABLE observed_contracts (
id uuid PRIMARY KEY,
source_version text NOT NULL,
method_fingerprint text NOT NULL,
observation jsonb NOT NULL,
observed_at timestamptz NOT NULL,
UNIQUE (source_version, method_fingerprint, observed_at)
);
CREATE TABLE scenario_rules (
id uuid PRIMARY KEY,
scenario_id uuid NOT NULL REFERENCES scenarios(id) ON DELETE CASCADE,
priority integer NOT NULL DEFAULT 0,
matcher jsonb NOT NULL,
action jsonb NOT NULL,
enabled boolean NOT NULL DEFAULT true
);
CREATE INDEX scenario_rules_scenario_priority_idx ON scenario_rules(scenario_id, priority DESC);
CREATE TABLE fault_injections (
id uuid PRIMARY KEY,
scenario_id uuid REFERENCES scenarios(id) ON DELETE CASCADE,
fault_type text NOT NULL,
matcher jsonb NOT NULL,
parameters jsonb NOT NULL DEFAULT '{}'::jsonb,
active_from timestamptz,
active_until timestamptz,
enabled boolean NOT NULL DEFAULT true
);