Documentation
¶
Index ¶
Constants ¶
const ( // Table creation QueryInitSourcesTable = "InitSourcesTable" QueryInitSinksTable = "InitSinksTable" QueryInitUsersTable = "InitUsersTable" QueryInitVHostsTable = "InitVHostsTable" QueryInitVHostSecretsTable = "InitVHostSecretsTable" QueryInitMLModelsTable = "InitMLModelsTable" QueryInitMLScriptsTable = "InitMLScriptsTable" QueryInitMLBlobsTable = "InitMLBlobsTable" QueryInitMLQuotasTable = "InitMLQuotasTable" QueryInitMLPredictionLogsTable = "InitMLPredictionLogsTable" QueryInitMLSchedulesTable = "InitMLSchedulesTable" QueryInitMLFeedbackTable = "InitMLFeedbackTable" QueryInitMLJobsTable = "InitMLJobsTable" QueryInitMLJobResultsTable = "InitMLJobResultsTable" QueryInitAIBudgetsTable = "InitAIBudgetsTable" QueryInitAIUsageTable = "InitAIUsageTable" QueryInitWorkersTable = "InitWorkersTable" QueryInitLogsTable = "InitLogsTable" QueryInitWorkflowsTable = "InitWorkflowsTable" QueryInitWorkflowNodeStatesTable = "InitWorkflowNodeStatesTable" QueryInitWebhookRequestsTable = "InitWebhookRequestsTable" QueryInitSettingsTable = "InitSettingsTable" QueryInitAuditLogsTable = "InitAuditLogsTable" QueryInitSchemasTable = "InitSchemasTable" QueryInitMessageTraceStepsTable = "InitMessageTraceStepsTable" QueryInitWorkflowVersionsTable = "InitWorkflowVersionsTable" QueryInitOutboxTable = "InitOutboxTable" QueryInitWorkspacesTable = "InitWorkspacesTable" QueryInitPluginsTable = "InitPluginsTable" QueryInitApprovalsTable = "InitApprovalsTable" // Upserts QueryUpdateNodeState = "UpdateNodeState" QuerySaveSetting = "SaveSetting" // Sources QueryListSources = "ListSources" QueryCountSources = "CountSources" QueryCreateSource = "CreateSource" QueryUpdateSource = "UpdateSource" QueryUpdateSourceStatus = "UpdateSourceStatus" QueryUpdateSourceState = "UpdateSourceState" QueryUpdateSourceSample = "UpdateSourceSample" QueryDeleteSource = "DeleteSource" QueryGetSource = "GetSource" // Sinks QueryListSinks = "ListSinks" QueryCountSinks = "CountSinks" QueryCreateSink = "CreateSink" QueryUpdateSink = "UpdateSink" QueryUpdateSinkStatus = "UpdateSinkStatus" QueryDeleteSink = "DeleteSink" QueryGetSink = "GetSink" // Users QueryListUsers = "ListUsers" QueryCountUsers = "CountUsers" QueryCreateUser = "CreateUser" QueryUpdateUser = "UpdateUser" QueryUpdateUserNoPassword = "UpdateUserNoPassword" QueryDeleteUser = "DeleteUser" QueryGetUser = "GetUser" QueryGetUserByUsername = "GetUserByUsername" QueryGetUserByEmail = "GetUserByEmail" // VHosts QueryListVHosts = "ListVHosts" QueryCountVHosts = "CountVHosts" QueryCreateVHost = "CreateVHost" QueryUpdateVHost = "UpdateVHost" QueryDeleteVHost = "DeleteVHost" QueryGetVHost = "GetVHost" // VHost secrets. These are names of queries, not credentials: gosec's G101 // goes by the word "Secret" in the identifier. QueryListVHostSecrets = "ListVHostSecrets" QueryGetVHostSecret = "GetVHostSecret" QueryInsertVHostSecret = "InsertVHostSecret" //nolint:gosec // G101: a query name QueryUpdateVHostSecret = "UpdateVHostSecret" //nolint:gosec // G101: a query name QueryDeleteVHostSecret = "DeleteVHostSecret" //nolint:gosec // G101: a query name QueryDeleteVHostSecrets = "DeleteVHostSecrets" //nolint:gosec // G101: a query name QueryListMLModels = "ListMLModels" QueryGetMLModel = "GetMLModel" QueryInsertMLModel = "InsertMLModel" QueryUpdateMLModel = "UpdateMLModel" QuerySetMLModelServingKey = "SetMLModelServingKey" QueryDeleteMLModel = "DeleteMLModel" QueryDeleteMLModelsOfVHost = "DeleteMLModelsOfVHost" QueryGetMLQuotas = "GetMLQuotas" QueryInsertMLQuotas = "InsertMLQuotas" QueryUpdateMLQuotas = "UpdateMLQuotas" QueryDeleteMLQuotas = "DeleteMLQuotas" QueryListMLSchedules = "ListMLSchedules" QueryGetMLSchedule = "GetMLSchedule" QueryInsertMLSchedule = "InsertMLSchedule" QueryUpdateMLSchedule = "UpdateMLSchedule" QueryDeleteMLSchedule = "DeleteMLSchedule" QuerySetMLScheduleRun = "SetMLScheduleRun" QueryClaimMLSchedule = "ClaimMLSchedule" QueryReleaseMLSchedule = "ReleaseMLSchedule" QueryDeleteMLSchedulesOfVHost = "DeleteMLSchedulesOfVHost" QueryInsertMLFeedback = "InsertMLFeedback" QueryCountMLFeedback = "CountMLFeedback" QueryDeleteMLFeedbackOfModel = "DeleteMLFeedbackOfModel" QueryDeleteMLFeedbackOfVHost = "DeleteMLFeedbackOfVHost" QueryInsertMLPredictionLog = "InsertMLPredictionLog" QueryListMLPredictionLogs = "ListMLPredictionLogs" QueryPurgeMLPredictionLogsOfModel = "PurgeMLPredictionLogsOfModel" QueryPurgeMLPredictionLogsOfVHost = "PurgeMLPredictionLogsOfVHost" QueryPurgeMLPredictionLogs = "PurgeMLPredictionLogs" QueryDeleteMLPredictionLogsOfModel = "DeleteMLPredictionLogsOfModel" QueryDeleteMLPredictionLogsOfVHost = "DeleteMLPredictionLogsOfVHost" QueryGetAIBudget = "GetAIBudget" QueryInsertAIBudget = "InsertAIBudget" QueryUpdateAIBudget = "UpdateAIBudget" QueryDeleteAIBudget = "DeleteAIBudget" QueryAddAIUsage = "AddAIUsage" QueryInsertAIUsage = "InsertAIUsage" QueryGetAIUsage = "GetAIUsage" QueryListAIUsage = "ListAIUsage" QueryMarkAIUsageTokensWarned = "MarkAIUsageTokensWarned" QueryMarkAIUsageCostWarned = "MarkAIUsageCostWarned" QueryDeleteAIUsageOfVHost = "DeleteAIUsageOfVHost" QueryListRetrainingMLModels = "ListRetrainingMLModels" QuerySetMLModelRetrain = "SetMLModelRetrain" QuerySetMLModelRetrainStatus = "SetMLModelRetrainStatus" QueryClaimMLModelTraining = "ClaimMLModelTraining" QuerySetMLModelScoring = "SetMLModelScoring" QueryReleaseMLModelTraining = "ReleaseMLModelTraining" QueryListMLScripts = "ListMLScripts" QueryListMLScriptVersions = "ListMLScriptVersions" QueryGetLatestMLScript = "GetLatestMLScript" QueryInsertMLScript = "InsertMLScript" QueryDeleteMLScript = "DeleteMLScript" QueryDeleteMLScriptsOfVHost = "DeleteMLScriptsOfVHost" // The built-in ML engine's blobs QueryInsertMLBlobChunk = "InsertMLBlobChunk" QueryDeleteMLBlob = "DeleteMLBlob" QueryCountMLBlob = "CountMLBlob" QueryGetMLBlob = "GetMLBlob" QueryListMLBlobs = "ListMLBlobs" QueryListMLBlobsData = "ListMLBlobsData" QueryCountMLBlobs = "CountMLBlobs" QueryDeleteMLBlobs = "DeleteMLBlobs" // ML jobs QueryInsertMLJob = "InsertMLJob" QueryGetMLJob = "GetMLJob" QueryGetMLJobVHost = "GetMLJobVHost" QueryGetMLJobCallbackURL = "GetMLJobCallbackURL" QueryListMLJobs = "ListMLJobs" QueryCountMLJobs = "CountMLJobs" QueryMLJobClaimCandidates = "MLJobClaimCandidates" QueryClaimMLJob = "ClaimMLJob" QueryUpdateMLJobProgress = "UpdateMLJobProgress" QueryMLJobCancelRequested = "MLJobCancelRequested" QueryFinishMLJob = "FinishMLJob" QueryCancelQueuedMLJob = "CancelQueuedMLJob" QueryRequestMLJobCancel = "RequestMLJobCancel" QueryMLJobCallbackCandidates = "MLJobCallbackCandidates" QueryClaimMLJobCallback = "ClaimMLJobCallback" QueryRecordMLJobCallback = "RecordMLJobCallback" QueryInsertMLJobResult = "InsertMLJobResult" QueryGetMLJobResult = "GetMLJobResult" QueryDeleteMLJobResult = "DeleteMLJobResult" QueryDeleteExpiredMLJobs = "DeleteExpiredMLJobs" QueryDeleteExpiredMLResults = "DeleteExpiredMLJobResults" QueryDeleteMLJobsOfVHost = "DeleteMLJobsOfVHost" QueryDeleteMLResultsOfVHost = "DeleteMLJobResultsOfVHost" // Workflows QueryListWorkflows = "ListWorkflows" QueryCountWorkflows = "CountWorkflows" QueryCreateWorkflow = "CreateWorkflow" QueryUpdateWorkflow = "UpdateWorkflow" QueryUpdateWorkflowStatus = "UpdateWorkflowStatus" QueryUpdateWorkflowStats = "UpdateWorkflowStats" QueryDeleteWorkflow = "DeleteWorkflow" QueryGetWorkflow = "GetWorkflow" QueryAcquireLease = "AcquireLease" QueryRenewLease = "RenewLease" QueryReleaseLease = "ReleaseLease" // Workspaces QueryListWorkspaces = "ListWorkspaces" QueryCreateWorkspace = "CreateWorkspace" QueryUpdateWorkspace = "UpdateWorkspace" QueryDeleteWorkspace = "DeleteWorkspace" QueryGetWorkspace = "GetWorkspace" // Clearing membership is three statements because workspace_id lives on // three tables; there is no FK to cascade from. QueryClearWorkflowWorkspace = "ClearWorkflowWorkspace" QueryClearSourceWorkspace = "ClearSourceWorkspace" QueryClearSinkWorkspace = "ClearSinkWorkspace" // Workers QueryListWorkers = "ListWorkers" QueryCountWorkers = "CountWorkers" QueryCreateWorker = "CreateWorker" QueryUpdateWorker = "UpdateWorker" QueryUpdateHeartbeat = "UpdateHeartbeat" QueryDeleteWorker = "DeleteWorker" QueryGetWorker = "GetWorker" // Logs QueryListLogs = "ListLogs" QueryCountLogs = "CountLogs" QueryCreateLog = "CreateLog" QueryDeleteLogs = "DeleteLogs" // Settings QueryGetSetting = "GetSetting" // Audit Logs QueryCreateAuditLog = "CreateAuditLog" QueryListAuditLogs = "ListAuditLogs" QueryCountAuditLogs = "CountAuditLogs" QueryPurgeAuditLogs = "PurgeAuditLogs" QueryPurgeMessageTraces = "PurgeMessageTraces" QueryPurgeWorkflowTraceSteps = "PurgeWorkflowTraceSteps" QueryPurgeWorkflowTraceParents = "PurgeWorkflowTraceParents" QueryDeleteWorkflowTraceSteps = "DeleteWorkflowTraceSteps" QueryDeleteWorkflowTraceParents = "DeleteWorkflowTraceParents" QueryDistinctTraceWorkflows = "DistinctTraceWorkflows" // Webhook Requests QueryCreateWebhookRequest = "CreateWebhookRequest" QueryListWebhookRequests = "ListWebhookRequests" QueryCountWebhookRequests = "CountWebhookRequests" QueryGetWebhookRequest = "GetWebhookRequest" QueryDeleteWebhookRequests = "DeleteWebhookRequests" // Form Submissions QueryInitFormSubmissionsTable = "InitFormSubmissionsTable" QueryCreateFormSubmission = "CreateFormSubmission" QueryListFormSubmissions = "ListFormSubmissions" QueryCountFormSubmissions = "CountFormSubmissions" QueryGetFormSubmission = "GetFormSubmission" QueryUpdateFormSubmissionStatus = "UpdateFormSubmissionStatus" QueryDeleteFormSubmissions = "DeleteFormSubmissions" // Schemas QueryListSchemas = "ListSchemas" QueryListAllSchemas = "ListAllSchemas" QueryGetSchema = "GetSchema" QueryGetLatestSchema = "GetLatestSchema" QueryCreateSchema = "CreateSchema" // Tracing QueryRecordTraceStep = "RecordTraceStep" QueryGetMessageTrace = "GetMessageTrace" // Workflow Versioning QueryCreateWorkflowVersion = "CreateWorkflowVersion" QueryListWorkflowVersions = "ListWorkflowVersions" QueryGetWorkflowVersion = "GetWorkflowVersion" // Outbox QueryCreateOutboxItem = "CreateOutboxItem" QueryListOutboxItems = "ListOutboxItems" QueryDeleteOutboxItem = "DeleteOutboxItem" QueryUpdateOutboxItem = "UpdateOutboxItem" // Marketplace QueryListPlugins = "ListPlugins" QueryGetPlugin = "GetPlugin" QueryCreatePlugin = "CreatePlugin" QueryUpdatePlugin = "UpdatePlugin" QueryInstallPlugin = "InstallPlugin" QueryUninstallPlugin = "UninstallPlugin" // Approvals QueryListApprovals = "ListApprovals" QueryCountApprovals = "CountApprovals" QueryCreateApproval = "CreateApproval" QueryGetApproval = "GetApproval" QueryUpdateApprovalStatus = "UpdateApprovalStatus" QueryDeleteApproval = "DeleteApproval" QueryInitSuspendedMessagesTable = "InitSuspendedMessagesTable" QueryCreateSuspendedMessage = "CreateSuspendedMessage" QueryListSuspendedMessages = "ListSuspendedMessages" QueryDeleteSuspendedMessage = "DeleteSuspendedMessage" QueryInitMessageTracesTable = "InitMessageTracesTable" QueryUpsertMessageTrace = "UpsertMessageTrace" QueryListMessageTracesKeyset = "ListMessageTracesKeyset" QueryListMessageTracesOffset = "ListMessageTracesOffset" QueryPurgeMessageTraceParents = "PurgeMessageTraceParents" QueryRecordTraceStepLegacyID = "RecordTraceStepLegacyID" QueryInitDashboardHistoryTable = "InitDashboardHistoryTable" QueryRecordDashboardSample = "RecordDashboardSample" QueryGetDashboardHistory = "GetDashboardHistory" QueryPurgeDashboardHistory = "PurgeDashboardHistory" )
const ( // SchemaFingerprintKey names the settings row holding the applied schema. SchemaFingerprintKey = "hermod.schema_fingerprint" // SchemaAppliedAtKey names the settings row holding when it was applied. SchemaAppliedAtKey = "hermod.schema_applied_at" // SchemaVersionKey names the settings row holding the schema version. SchemaVersionKey = "hermod.schema_version" )
Recording which schema a database is running.
There is no versioned migration system here: Init creates the tables it knows about and autoMigrate adds any columns that are missing. That is a deliberate simplification, but it left "does this database match this binary?" with no answer at all — and a schema left half-applied by a failed migration indistinguishable from a complete one.
So a fingerprint of the expected schema is written after a run that fully succeeds, and only then. Three questions become answerable from the database itself:
SELECT value FROM settings WHERE key = 'hermod.schema_fingerprint';
- what last applied a schema here, by comparing it with SchemaFingerprint()
- whether the binary has been downgraded, because the values differ
- whether the last upgrade finished, because a failed migration leaves the
previous value in place
It is a fingerprint rather than a version number because there is nothing to number: no migration files, no ordering, and no down migrations. What it can honestly report is "the same schema" or "a different one".
Variables ¶
var ErrSchemaFromTheFuture = errors.New("metadata schema is newer than this binary understands")
ErrSchemaFromTheFuture is returned when the database was migrated by a release newer than this binary.
Functions ¶
func SchemaFingerprint ¶
func SchemaFingerprint() string
SchemaFingerprint returns a stable digest of the schema this binary expects.
It covers every CREATE TABLE the code defines, which is the same set autoMigrate reconciles, so adding a table or a column changes it. The statements are sorted first because Go iterates maps in a random order, and a fingerprint that varied between two runs of the same binary would report a schema change on every restart.
Types ¶
This section is empty.