179 lines
12 KiB
YAML
179 lines
12 KiB
YAML
{
|
|
"apiVersion": "v1",
|
|
"kind": "List",
|
|
"items": [
|
|
{
|
|
"apiVersion": "v1",
|
|
"kind": "ConfigMap",
|
|
"metadata": {
|
|
"name": "hwlab-v02-postgres-init",
|
|
"namespace": "hwlab-v02",
|
|
"labels": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres",
|
|
"app.kubernetes.io/part-of": "hwlab",
|
|
"hwlab.pikastech.local/environment": "v02",
|
|
"hwlab.pikastech.local/gitops-target": "v02",
|
|
"hwlab.pikastech.local/profile": "v02",
|
|
"hwlab.pikastech.local/source-commit": "f315cf4c3417e0cf42ac0d2497bd3651c1e34054"
|
|
}
|
|
},
|
|
"data": {
|
|
"0001_cloud_core_skeleton.sql": "-- HWLAB L1 Cloud Core schema skeleton.\n-- This file is source schema only; applying it to DEV/PROD is a separate\n-- operator action and is not performed by source tests or smokes.\n\nCREATE TABLE IF NOT EXISTS projects (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL DEFAULT '',\n status TEXT NOT NULL DEFAULT 'pending',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS users (\n id TEXT PRIMARY KEY,\n username TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL DEFAULT '',\n role TEXT NOT NULL CHECK (role IN ('admin', 'user')),\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled')),\n password_hash TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS user_sessions (\n id TEXT PRIMARY KEY,\n user_id TEXT NOT NULL REFERENCES users(id),\n session_token_hash TEXT NOT NULL UNIQUE,\n created_at TEXT NOT NULL,\n last_seen_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n revoked_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS gateway_sessions (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n gateway_service_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n started_at TEXT,\n ended_at TEXT,\n gateway_session_json TEXT NOT NULL DEFAULT '{}'\n);\n\nCREATE TABLE IF NOT EXISTS box_resources (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n gateway_session_id TEXT,\n resource_state TEXT NOT NULL DEFAULT 'available',\n labels_json TEXT NOT NULL DEFAULT '{}',\n resource_json TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS box_capabilities (\n id TEXT PRIMARY KEY,\n box_resource_id TEXT NOT NULL,\n capability_type TEXT NOT NULL,\n capability_json TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS wiring_configs (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n wiring_json TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'pending',\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS patch_panel_status (\n id TEXT PRIMARY KEY,\n gateway_session_id TEXT,\n wiring_config_id TEXT,\n status_json TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS hardware_operations (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n requested_by TEXT,\n operation_type TEXT NOT NULL,\n operation_json TEXT NOT NULL DEFAULT '{}',\n status TEXT NOT NULL DEFAULT 'requested',\n requested_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS audit_events (\n id TEXT PRIMARY KEY,\n request_id TEXT NOT NULL,\n actor TEXT NOT NULL,\n source TEXT NOT NULL,\n operation TEXT NOT NULL,\n target TEXT NOT NULL,\n result TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n event_json TEXT NOT NULL DEFAULT '{}'\n);\n\nCREATE TABLE IF NOT EXISTS agent_sessions (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n agent_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n started_at TEXT,\n ended_at TEXT,\n owner_user_id TEXT REFERENCES users(id),\n conversation_id TEXT,\n thread_id TEXT,\n last_trace_id TEXT,\n session_json TEXT NOT NULL DEFAULT '{}',\n updated_at TEXT\n);\n\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS owner_user_id TEXT REFERENCES users(id);\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS conversation_id TEXT;\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS thread_id TEXT;\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS last_trace_id TEXT;\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS session_json TEXT NOT NULL DEFAULT '{}';\nALTER TABLE agent_sessions ADD COLUMN IF NOT EXISTS updated_at TEXT;\nCREATE INDEX IF NOT EXISTS idx_agent_sessions_owner ON agent_sessions(owner_user_id);\nCREATE INDEX IF NOT EXISTS idx_agent_sessions_conversation ON agent_sessions(conversation_id);\n\nCREATE TABLE IF NOT EXISTS worker_sessions (\n id TEXT PRIMARY KEY,\n agent_session_id TEXT,\n worker_id TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'pending',\n started_at TEXT,\n ended_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS agent_trace_events (\n id TEXT PRIMARY KEY,\n trace_id TEXT NOT NULL,\n agent_session_id TEXT,\n worker_session_id TEXT,\n level TEXT NOT NULL DEFAULT 'info',\n message TEXT NOT NULL DEFAULT '',\n event_json TEXT NOT NULL DEFAULT '{}',\n occurred_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS evidence_records (\n id TEXT PRIMARY KEY,\n project_id TEXT,\n operation_id TEXT,\n evidence_type TEXT NOT NULL,\n uri TEXT NOT NULL DEFAULT '',\n metadata_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS device_pods (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL DEFAULT '',\n status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'disabled')),\n profile_json TEXT NOT NULL DEFAULT '{}',\n profile_hash TEXT NOT NULL DEFAULT '',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS device_pod_grants (\n device_pod_id TEXT NOT NULL REFERENCES device_pods(id) ON DELETE CASCADE,\n user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,\n created_by_admin_id TEXT NOT NULL REFERENCES users(id),\n created_at TEXT NOT NULL,\n PRIMARY KEY (device_pod_id, user_id)\n);\n\nCREATE TABLE IF NOT EXISTS device_leases (\n device_pod_id TEXT PRIMARY KEY REFERENCES device_pods(id) ON DELETE CASCADE,\n holder_session_id TEXT NOT NULL REFERENCES agent_sessions(id) ON DELETE CASCADE,\n holder_user_id TEXT NOT NULL REFERENCES users(id),\n lease_token_hash TEXT NOT NULL UNIQUE,\n created_at TEXT NOT NULL,\n expires_at TEXT NOT NULL,\n released_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS device_pod_jobs (\n id TEXT PRIMARY KEY,\n device_pod_id TEXT NOT NULL REFERENCES device_pods(id) ON DELETE CASCADE,\n owner_user_id TEXT NOT NULL REFERENCES users(id),\n status TEXT NOT NULL,\n intent TEXT NOT NULL,\n args_json TEXT NOT NULL DEFAULT '{}',\n reason TEXT NOT NULL DEFAULT '',\n trace_id TEXT NOT NULL,\n operation_id TEXT NOT NULL,\n output_json TEXT NOT NULL DEFAULT '{}',\n blocker_json TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n completed_at TEXT\n);\n\nCREATE TABLE IF NOT EXISTS hwlab_schema_migrations (\n id TEXT PRIMARY KEY,\n schema_version TEXT NOT NULL,\n applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,\n migration_json TEXT NOT NULL DEFAULT '{}'\n);\n\nINSERT INTO hwlab_schema_migrations (id, schema_version, applied_at, migration_json)\nVALUES (\n '0001_cloud_core_skeleton',\n 'runtime-durable-postgres-v2',\n CURRENT_TIMESTAMP,\n '{\"path\":\"internal/db/migrations/0001_cloud_core_skeleton.sql\",\"runtime\":\"cloud-api\"}'\n)\nON CONFLICT (id) DO UPDATE SET\n schema_version = EXCLUDED.schema_version,\n migration_json = EXCLUDED.migration_json;\n"
|
|
}
|
|
},
|
|
{
|
|
"apiVersion": "v1",
|
|
"kind": "Service",
|
|
"metadata": {
|
|
"name": "hwlab-v02-postgres",
|
|
"namespace": "hwlab-v02",
|
|
"labels": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres",
|
|
"app.kubernetes.io/part-of": "hwlab",
|
|
"hwlab.pikastech.local/environment": "v02",
|
|
"hwlab.pikastech.local/gitops-target": "v02",
|
|
"hwlab.pikastech.local/profile": "v02",
|
|
"hwlab.pikastech.local/source-commit": "f315cf4c3417e0cf42ac0d2497bd3651c1e34054"
|
|
}
|
|
},
|
|
"spec": {
|
|
"type": "ClusterIP",
|
|
"selector": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres"
|
|
},
|
|
"ports": [
|
|
{
|
|
"name": "postgres",
|
|
"port": 5432,
|
|
"targetPort": "postgres"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"apiVersion": "apps/v1",
|
|
"kind": "StatefulSet",
|
|
"metadata": {
|
|
"name": "hwlab-v02-postgres",
|
|
"namespace": "hwlab-v02",
|
|
"labels": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres",
|
|
"app.kubernetes.io/part-of": "hwlab",
|
|
"hwlab.pikastech.local/environment": "v02",
|
|
"hwlab.pikastech.local/gitops-target": "v02",
|
|
"hwlab.pikastech.local/profile": "v02",
|
|
"hwlab.pikastech.local/source-commit": "f315cf4c3417e0cf42ac0d2497bd3651c1e34054"
|
|
}
|
|
},
|
|
"spec": {
|
|
"serviceName": "hwlab-v02-postgres",
|
|
"replicas": 1,
|
|
"selector": {
|
|
"matchLabels": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres"
|
|
}
|
|
},
|
|
"template": {
|
|
"metadata": {
|
|
"labels": {
|
|
"app.kubernetes.io/name": "hwlab-v02-postgres",
|
|
"app.kubernetes.io/part-of": "hwlab",
|
|
"hwlab.pikastech.local/environment": "v02",
|
|
"hwlab.pikastech.local/gitops-target": "v02",
|
|
"hwlab.pikastech.local/profile": "v02",
|
|
"hwlab.pikastech.local/migration-sha256": "0a5e51d416d73c26"
|
|
},
|
|
"annotations": {
|
|
"hwlab.pikastech.local/migration-sha256": "0a5e51d416d73c26aecac82a5b15a798fac09cf4e5cc8de7e8f53ac7ea26d7df"
|
|
}
|
|
},
|
|
"spec": {
|
|
"containers": [
|
|
{
|
|
"name": "postgres",
|
|
"image": "127.0.0.1:5000/hwlab/postgres:16-alpine",
|
|
"imagePullPolicy": "IfNotPresent",
|
|
"env": [
|
|
{
|
|
"name": "POSTGRES_DB",
|
|
"value": "hwlab_v02"
|
|
},
|
|
{
|
|
"name": "POSTGRES_USER",
|
|
"value": "hwlab_v02"
|
|
},
|
|
{
|
|
"name": "POSTGRES_PASSWORD",
|
|
"valueFrom": {
|
|
"secretKeyRef": {
|
|
"name": "hwlab-v02-postgres",
|
|
"key": "POSTGRES_PASSWORD"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"ports": [
|
|
{
|
|
"name": "postgres",
|
|
"containerPort": 5432
|
|
}
|
|
],
|
|
"readinessProbe": {
|
|
"tcpSocket": {
|
|
"port": "postgres"
|
|
},
|
|
"initialDelaySeconds": 5,
|
|
"periodSeconds": 10
|
|
},
|
|
"livenessProbe": {
|
|
"tcpSocket": {
|
|
"port": "postgres"
|
|
},
|
|
"initialDelaySeconds": 30,
|
|
"periodSeconds": 20
|
|
},
|
|
"volumeMounts": [
|
|
{
|
|
"name": "data",
|
|
"mountPath": "/var/lib/postgresql/data"
|
|
},
|
|
{
|
|
"name": "init",
|
|
"mountPath": "/docker-entrypoint-initdb.d",
|
|
"readOnly": true
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"volumes": [
|
|
{
|
|
"name": "init",
|
|
"configMap": {
|
|
"name": "hwlab-v02-postgres-init"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"volumeClaimTemplates": [
|
|
{
|
|
"metadata": {
|
|
"name": "data"
|
|
},
|
|
"spec": {
|
|
"accessModes": [
|
|
"ReadWriteOnce"
|
|
],
|
|
"resources": {
|
|
"requests": {
|
|
"storage": "8Gi"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|