{"record":{"id":"990d2c6be2bcf71d","repo":"Tencent/WeKnora","slug":"errunsupportedsandboxtype","errorCode":"ErrUnsupportedSandboxType","errorMessage":"%w %q","messagePattern":"%w %q","errorType":"validation","errorClass":"ErrUnsupportedSandboxType","httpStatus":null,"severity":"error","filePath":"internal/sandbox/tenant_config.go","lineNumber":236,"sourceCode":"// a sentinel so callers can classify it as bad input without matching on the\n// message text.\nvar ErrUnsupportedSandboxType = errors.New(\"sandbox: unsupported sandbox type\")\n\n// ParseSandboxType maps a stored string onto a SandboxType. Unknown values are\n// rejected so a typo surfaces when the admin saves the config, instead of\n// silently disabling that tenant's sandbox at first use.\nfunc ParseSandboxType(raw string) (SandboxType, error) {\n\tswitch SandboxType(raw) {\n\tcase SandboxTypeCube:\n\t\treturn SandboxTypeCube, nil\n\tcase SandboxTypeE2B:\n\t\treturn SandboxTypeE2B, nil\n\tcase SandboxTypeDocker:\n\t\treturn SandboxTypeDocker, nil\n\tcase SandboxTypeDisabled:\n\t\treturn SandboxTypeDisabled, nil\n\tdefault:\n\t\treturn \"\", fmt.Errorf(\"%w %q\", ErrUnsupportedSandboxType, raw)\n\t}\n}\n\n// EffectiveTemplateID returns the template the given provider will use.\nfunc EffectiveTemplateID(cfg *Config) string {\n\tif cfg == nil {\n\t\treturn \"\"\n\t}\n\tswitch cfg.Type {\n\tcase SandboxTypeCube:\n\t\treturn cfg.CubeTemplate\n\tcase SandboxTypeE2B:\n\t\treturn cfg.E2BTemplate\n\tcase SandboxTypeDocker:\n\t\t// The image is what a template ID is for the MicroVM backends: the\n\t\t// pre-baked filesystem a sandbox starts from.\n\t\treturn cfg.DockerImage\n\tdefault:","sourceCodeStart":218,"sourceCodeEnd":254,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/sandbox/tenant_config.go#L218-L254","documentation":"ParseSandboxType converts a tenant's raw sandbox-type string into the known SandboxType constants (e2b, docker, disabled). Any other value yields this sentinel-wrapped error (ErrUnsupportedSandboxType), because the resolver cannot build a provider request for an unknown sandbox backend.","triggerScenarios":"SanitizeSandboxConfig or ResolveEffectiveConfig encountering a Config whose sandbox type string is not one of SandboxTypeE2B, SandboxTypeDocker, SandboxTypeDisabled — e.g. a typo like \"E2B \" (whitespace/case mismatch if not normalized), \"local\", or \"firecracker\".","commonSituations":"Hand-edited tenant config in the database; renamed enum values across library versions; provisioning scripts writing a provider name the library doesn't know.","solutions":["Set the sandbox type to one of the supported values: \"e2b\", \"docker\", or \"disabled\".","Check errors.Is(err, sandbox.ErrUnsupportedSandboxType) and log/report the offending raw value from the error text.","After a library upgrade, re-validate stored tenant configs against the current enum before use."],"exampleFix":"// before\n\"sandbox_type\": \"firecracker\"\n// after\n\"sandbox_type\": \"docker\"","handlingStrategy":"validation","validationCode":"valid := map[string]bool{\"e2b\": true, \"docker\": true, \"disabled\": true}\nif !valid[strings.TrimSpace(strings.ToLower(cfg.SandboxType))] {\n    return fmt.Errorf(\"unsupported sandbox type %q\", cfg.SandboxType)\n}","typeGuard":"func knownSandboxType(s string) bool {\n    switch sandbox.SandboxType(strings.TrimSpace(strings.ToLower(s))) {\n    case sandbox.SandboxTypeE2B, sandbox.SandboxTypeDocker, sandbox.SandboxTypeDisabled:\n        return true\n    }\n    return false\n}","tryCatchPattern":"t, err := sandbox.ParseSandboxType(raw)\nif errors.Is(err, sandbox.ErrUnsupportedSandboxType) {\n    return fmt.Errorf(\"config error: sandbox type %q not supported; use e2b|docker|disabled\", raw)\n}","preventionTips":["Constrain tenant config UIs to a dropdown of the three supported values.","Add a startup validation pass over stored tenant configs.","Compare raw values case-insensitively and trimmed before persisting."],"tags":["configuration","validation","sandbox"],"backgroundTag":"unsupported-config-value","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}