{"record":{"id":"35154e931ac91f37","repo":"apache/druid","slug":"pod-template-task-adapter-requires-a-base-pod-temp","errorCode":null,"errorMessage":"Pod template task adapter requires a base pod template to be specified under druid.indexer.runner.k8s.podTemplate.base","messagePattern":"Pod template task adapter requires a base pod template to be specified under druid\\.indexer\\.runner\\.k8s\\.podTemplate\\.base","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/DynamicConfigPodTemplateSelector.java","lineNumber":69,"sourceCode":"  private final KubernetesTaskRunnerEffectiveConfig effectiveConfig;\n  // Supplier allows Overlord to read the most recent pod template file without calling initializeTemplatesFromFileSystem() again.\n  private HashMap<String, Supplier<PodTemplate>> podTemplates;\n\n  public DynamicConfigPodTemplateSelector(\n      Properties properties,\n      KubernetesTaskRunnerEffectiveConfig effectiveConfig\n  )\n  {\n    this.properties = properties;\n    this.effectiveConfig = effectiveConfig;\n    initializeTemplatesFromFileSystem();\n  }\n\n  private void initializeTemplatesFromFileSystem() throws IAE\n  {\n    Set<String> taskAdapterTemplateKeys = getTaskAdapterTemplatesKeys(properties);\n    if (!taskAdapterTemplateKeys.contains(\"base\")) {\n      throw new IAE(\n          \"Pod template task adapter requires a base pod template to be specified under druid.indexer.runner.k8s.podTemplate.base\");\n    }\n\n    HashMap<String, Supplier<PodTemplate>> podTemplateMap = new HashMap<>();\n    for (String taskAdapterTemplateKey : taskAdapterTemplateKeys) {\n      Supplier<PodTemplate> templateSupplier = () -> loadPodTemplate(taskAdapterTemplateKey, properties);\n      validateTemplateSupplier(templateSupplier);\n      podTemplateMap.put(taskAdapterTemplateKey, templateSupplier);\n    }\n\n    podTemplates = podTemplateMap;\n  }\n\n  private Set<String> getTaskAdapterTemplatesKeys(Properties properties)\n  {\n    Set<String> taskAdapterTemplates = new HashSet<>();\n\n    for (String runtimeProperty : properties.stringPropertyNames()) {","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/DynamicConfigPodTemplateSelector.java#L51-L87","documentation":"Thrown by DynamicConfigPodTemplateSelector.initializeTemplatesFromFileSystem when the podTemplate task adapter is used with dynamic pod template selection but no 'base' pod template file is configured. The selector builds a map of pod templates from druid.indexer.runner.k8s.podTemplate.<key> properties and requires a mandatory 'base' key (druid.indexer.runner.k8s.podTemplate.base) from which other templates derive.","triggerScenarios":"Initializing DynamicConfigPodTemplateSelector with a Properties object that contains podTemplate entries for task adapters but no podTemplate.base property; typically the operator added specific templates (e.g. podTemplate.batch) but skipped the required base.","commonSituations":"Migrating to the podTemplate adapter from singleContainer/multiContainer and only copying partial template config; renaming the base property key by mistake; documentation examples showing only non-base templates.","solutions":["Add the base template property: druid.indexer.runner.k8s.podTemplate.base=/path/to/base-pod-template.yaml","Verify the property key is exactly podTemplate.base (lowercase, no typos)","Create a minimal valid base Pod YAML file if one does not yet exist"],"exampleFix":"// before\n# only specific templates present\ndruid.indexer.runner.k8s.podTemplate.batch=/etc/druid/k8s/batch.yaml\n\n// after\ndruid.indexer.runner.k8s.podTemplate.base=/etc/druid/k8s/base.yaml\ndruid.indexer.runner.k8s.podTemplate.batch=/etc/druid/k8s/batch.yaml","handlingStrategy":"validation","validationCode":"Properties props = ...;\nboolean hasBase = props.stringPropertyNames().stream()\n    .anyMatch(p -> p.startsWith(\"druid.indexer.runner.k8s.podTemplate.\"));\nif (hasBase && props.getProperty(\"druid.indexer.runner.k8s.podTemplate.base\") == null) {\n    throw new IllegalArgumentException(\n        \"druid.indexer.runner.k8s.podTemplate.base is required when using podTemplate keys\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always define podTemplate.base first, then add derived templates","Keep all podTemplate.* properties in a single shared config snippet across Overlords","Run a config smoke test of DynamicConfigPodTemplateSelector in CI before deploying"],"tags":["kubernetes","pod-template","configuration","druid-overlord"],"backgroundTag":"missing-required-config-field","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}