Wire SCUM schema probe durable run path
This commit is contained in:
@@ -2,7 +2,6 @@ package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"browser.local/platform/domain"
|
||||
@@ -10,7 +9,7 @@ import (
|
||||
"browser.local/platform/validator"
|
||||
)
|
||||
|
||||
const scumSchemaProbeExecutionKind = "sqlite.schema.probe"
|
||||
const scumSchemaProbeExecutionKind = "sqlite.schema-probe"
|
||||
|
||||
func (svc *CoreService) RequestSCUMSchemaProbeForSession(sessionID, serverInstanceID, idempotencyKey string) (domain.SCUMSchemaProbeRequest, domain.RemoteAdapterResult, error) {
|
||||
idempotencyKey = strings.TrimSpace(idempotencyKey)
|
||||
@@ -65,7 +64,7 @@ func (svc *CoreService) RequestSCUMSchemaProbeForSession(sessionID, serverInstan
|
||||
PluginID: plugin.ID,
|
||||
PluginVersion: plugin.Version,
|
||||
AdapterVersion: adapterVersion,
|
||||
DatabaseIdentity: "logical:" + probe.TargetKey,
|
||||
DatabaseIdentity: scumSchemaProbeDatabaseIdentity(probe.TargetKey),
|
||||
},
|
||||
Bounds: bounds,
|
||||
RequestedAt: svc.now(),
|
||||
@@ -81,9 +80,8 @@ func (svc *CoreService) RequestSCUMSchemaProbeForSession(sessionID, serverInstan
|
||||
TimeoutSeconds: scumSchemaProbeTimeoutSeconds(bounds),
|
||||
MaxAttempts: 1,
|
||||
IdempotencyKey: idempotencyKey,
|
||||
InputRef: "input://scum-schema-probe/" + instance.ID + "/" + idempotencyKey,
|
||||
Inputs: scumSchemaProbeInputs(request, probe.TargetKey),
|
||||
PlatformScheduled: true,
|
||||
SQLiteSchemaProbe: &request,
|
||||
})
|
||||
if err != nil {
|
||||
return domain.SCUMSchemaProbeRequest{}, domain.RemoteAdapterResult{}, err
|
||||
@@ -91,6 +89,11 @@ func (svc *CoreService) RequestSCUMSchemaProbeForSession(sessionID, serverInstan
|
||||
return request, result, nil
|
||||
}
|
||||
|
||||
func scumSchemaProbeDatabaseIdentity(targetKey string) string {
|
||||
trimmed := strings.TrimSpace(targetKey)
|
||||
return strings.TrimPrefix(trimmed, "databases/")
|
||||
}
|
||||
|
||||
func scumSchemaProbeAdapterVersion(manifest domain.SCUMLiveDataManifest) string {
|
||||
for _, gate := range manifest.CapabilityGates {
|
||||
if gate.Capability == domain.SCUMDataCapabilitySchemaProbe {
|
||||
@@ -116,51 +119,18 @@ func scumSchemaProbeTimeoutSeconds(bounds domain.SCUMSchemaProbeBounds) int {
|
||||
return seconds
|
||||
}
|
||||
|
||||
func scumSchemaProbeInputs(request domain.SCUMSchemaProbeRequest, targetKey string) map[string]string {
|
||||
return map[string]string{
|
||||
"requestId": request.RequestID,
|
||||
"jobId": request.JobID,
|
||||
"targetKey": targetKey,
|
||||
"serverInstanceId": request.Binding.ServerInstanceID,
|
||||
"runBindingId": request.Binding.RunBindingID,
|
||||
"runEndpointId": request.Binding.RunEndpointID,
|
||||
"pluginId": request.Binding.PluginID,
|
||||
"pluginVersion": request.Binding.PluginVersion,
|
||||
"adapterVersion": request.Binding.AdapterVersion,
|
||||
"gameVersion": request.Binding.GameVersion,
|
||||
"databaseIdentity": request.Binding.DatabaseIdentity,
|
||||
"maxObjects": strconv.Itoa(request.Bounds.MaxObjects),
|
||||
"maxColumnsPerObject": strconv.Itoa(request.Bounds.MaxColumnsPerObject),
|
||||
"maxIndexesPerObject": strconv.Itoa(request.Bounds.MaxIndexesPerObject),
|
||||
"maxForeignKeys": strconv.Itoa(request.Bounds.MaxForeignKeys),
|
||||
"maxCardinalityReads": strconv.Itoa(request.Bounds.MaxCardinalityReads),
|
||||
"maxSampleRows": strconv.Itoa(request.Bounds.MaxSampleRows),
|
||||
"timeoutMs": strconv.Itoa(request.Bounds.TimeoutMS),
|
||||
"maxResultBytes": strconv.Itoa(request.Bounds.MaxResultBytes),
|
||||
}
|
||||
}
|
||||
|
||||
func scumSchemaProbeBindingFromInputs(inputs map[string]string) domain.SCUMBindingIdentity {
|
||||
return domain.SCUMBindingIdentity{
|
||||
ServerInstanceID: inputs["serverInstanceId"],
|
||||
RunBindingID: inputs["runBindingId"],
|
||||
RunEndpointID: inputs["runEndpointId"],
|
||||
PluginID: inputs["pluginId"],
|
||||
PluginVersion: inputs["pluginVersion"],
|
||||
AdapterVersion: inputs["adapterVersion"],
|
||||
GameVersion: inputs["gameVersion"],
|
||||
DatabaseIdentity: inputs["databaseIdentity"],
|
||||
}
|
||||
}
|
||||
|
||||
func validateSCUMSchemaProbeResultForJob(job domain.Job, result domain.SCUMSchemaProbeResult) error {
|
||||
if err := validator.ValidateSCUMSchemaProbeResult(result); err != nil {
|
||||
return err
|
||||
}
|
||||
if result.JobID != job.ID || result.JobID != job.ExecutionInput.Inputs["jobId"] || result.RequestID != job.ExecutionInput.Inputs["requestId"] {
|
||||
expected := job.ExecutionInput.SQLiteSchemaProbe
|
||||
if expected == nil {
|
||||
return validationError("SQLite schema probe request is missing from leased job")
|
||||
}
|
||||
if result.JobID != job.ID || result.JobID != expected.JobID || result.RequestID != expected.RequestID {
|
||||
return validationError("SQLite schema probe result does not match leased job identity")
|
||||
}
|
||||
if !sameSCUMSchemaProbeBinding(result.Binding, scumSchemaProbeBindingFromInputs(job.ExecutionInput.Inputs)) {
|
||||
if !sameSCUMSchemaProbeBinding(result.Binding, expected.Binding) {
|
||||
return validationError("SQLite schema probe result does not match leased binding identity")
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user