{"record":{"id":"2918cc27a46b9f02","repo":"neondatabase/neon","slug":"config-path-test-only-is-not-set","errorCode":null,"errorMessage":"config_path_test_only is not set","messagePattern":"config_path_test_only is not set","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"compute_tools/src/configurator.rs","lineNumber":97,"sourceCode":"                            Err(e) => {\n                                error!(\"could not parse config file: {}\", e);\n                                Err(anyhow::anyhow!(\"could not parse config file: {}\", e))\n                            }\n                        }\n                    } else {\n                        error!(\n                            \"could not open config file at path: {:?}\",\n                            config_path.to_string_lossy()\n                        );\n                        Err(anyhow::anyhow!(\n                            \"could not open config file at path: {}\",\n                            config_path.to_string_lossy()\n                        ))\n                    }\n                } else if let Some(control_plane_uri) = &compute.params.control_plane_uri {\n                    get_config_from_control_plane(control_plane_uri, &compute.params.compute_id)\n                } else {\n                    Err(anyhow::anyhow!(\"config_path_test_only is not set\"))\n                };\n\n            // Parse any received ComputeSpec and transpose the result into a Result<Option<ParsedSpec>>.\n            let parsed_spec_result: Result<Option<ParsedSpec>> =\n                get_config_result.and_then(|config| {\n                    if let Some(spec) = config.spec {\n                        if let Ok(pspec) = ParsedSpec::try_from(spec) {\n                            Ok(Some(pspec))\n                        } else {\n                            Err(anyhow::anyhow!(\"could not parse spec\"))\n                        }\n                    } else {\n                        Ok(None)\n                    }\n                });\n\n            let new_status: ComputeStatus;\n            match parsed_spec_result {","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/neondatabase/neon/blob/8f60b04da47ffefe0e52bda2440134b42874eb75/compute_tools/src/configurator.rs#L79-L115","documentation":"The configurator needs a source for the ComputeConfig: either the test-only file path or the control plane URI. Neither params.config_path_test_only nor params.control_plane_uri was set, so there is nothing to fetch configuration from and the configurator errors out. The message names only the test flag, but the actual gap is 'no configuration source at all' (the control_plane_uri branch is the last fallback).","triggerScenarios":"compute_ctl launched with neither --control-plane-uri nor the test config path; e.g. a stripped-down dev invocation or a startup script that silently dropped arguments.","commonSituations":"Local experiments invoking compute_ctl run without the cplane URL; env var for the control plane unset so the arg defaulted to None; wrapper scripts losing arguments on refactor.","solutions":["Pass --control-plane-uri (CONTROL_PLANE_URI) pointing at the HCC/cplane in production","For tests, pass the config file path instead (--config-path-test-only /path/config.json)","Audit the startup script/env to see which of the two arguments is being dropped"],"exampleFix":"# before\ncompute_ctl run --pgdata /data\n# after\ncompute_ctl run --pgdata /data --control-plane-uri https://console.example.com/control-plane","handlingStrategy":"validation","validationCode":"// Boot-time assertion of the config source\nif params.config_path_test_only.is_none() && params.control_plane_uri.is_none() {\n    anyhow::bail!(\"must pass either --control-plane-uri or --config-path-test-only\");\n}","typeGuard":"fn has_config_source(params: &ComputeParams) -> bool {\n    params.config_path_test_only.is_some() || params.control_plane_uri.is_some()\n}","tryCatchPattern":null,"preventionTips":["Default --control-plane-uri in the launch wrapper so an omitted flag cannot reach runtime","Add a startup checklist to dev docs: pgdata, spec/config source, extension storage","Unit-test the configurator with both sources absent to keep the failure message accurate"],"tags":["rust","compute-ctl","configuration","startup","control-plane"],"backgroundTag":"missing-configuration","analyzedSha":"8f60b04da47ffefe0e52bda2440134b42874eb75","analyzedAt":"2026-08-16T23:39:28.135Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}