This is an automated email from the ASF dual-hosted git repository.

suneet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 4e0ea7823b1 Update docs for K8s TaskRunner Dynamic Config (#16600)
4e0ea7823b1 is described below

commit 4e0ea7823b128cc214df8dc774d370b306b91461
Author: Suneet Saldanha <sun...@apache.org>
AuthorDate: Fri Jun 21 06:01:59 2024 -0700

    Update docs for K8s TaskRunner Dynamic Config (#16600)
    
    * Update docs for K8s TaskRunner Dynamic Config
    
    * touchups
    
    * code review
    
    * npe
    
    * oopsies
---
 docs/development/extensions-contrib/k8s-jobs.md    | 409 +++++++++++++++++++--
 .../execution/PodTemplateSelectStrategy.java       |   6 +-
 .../SelectorBasedPodTemplateSelectStrategy.java    |  23 +-
 .../taskadapter/PodTemplateTaskAdapter.java        |   5 -
 .../KubernetesTaskRunnerDynamicConfigTest.java     |   3 +-
 ...SelectorBasedPodTemplateSelectStrategyTest.java |  20 +-
 .../taskadapter/PodTemplateTaskAdapterTest.java    |   2 +-
 7 files changed, 384 insertions(+), 84 deletions(-)

diff --git a/docs/development/extensions-contrib/k8s-jobs.md 
b/docs/development/extensions-contrib/k8s-jobs.md
index 1d75e2b7efe..082b8735349 100644
--- a/docs/development/extensions-contrib/k8s-jobs.md
+++ b/docs/development/extensions-contrib/k8s-jobs.md
@@ -40,7 +40,280 @@ The extension uses `druid.indexer.runner.capacity` to limit 
the number of k8s jo
 Other configurations required are:
 `druid.indexer.runner.type: k8s` and `druid.indexer.task.encapsulatedTask: 
true`
 
-## Pod Adapters
+### Dynamic config
+
+Druid operators can dynamically tune certain features within this extension. 
You don't need to restart the Overlord
+service for these changes to take effect.
+
+Druid can dynamically tune [pod template selection](#pod-template-selection), 
which allows you to configure the pod 
+template based on the task to be run. To enable dynamic pod template 
selection, first configure the 
+[custom template pod adapter](#custom-template-pod-adapter).
+
+Use the following APIs to view and update the dynamic configuration for the 
Kubernetes task runner.
+
+To use these APIs, ensure you have read and write permissions for the CONFIG 
resource type with the resource name
+"CONFIG". For more information on permissions, see 
+[User authentication and 
authorization](../../operations/security-user-auth.md#config).
+
+#### Get dynamic configuration
+
+Retrieves the current dynamic execution config for the Kubernetes task runner. 
+Returns a JSON object with the dynamic configuration properties.
+
+##### URL
+
+`GET` `/druid/indexer/v1/k8s/taskRunner/executionConfig`
+
+##### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully retrieved dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+##### Sample request
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+```shell
+curl 
"http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/k8s/taskRunner/executionConfig";
+```
+</TabItem>
+
+<TabItem value="3" label="HTTP">
+
+```HTTP
+GET /druid/indexer/v1/k8s/taskRunner/executionConfig HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+##### Sample response
+
+<details>
+<summary>View the response</summary>
+
+```json
+{
+  "type": "default",
+  "podTemplateSelectStrategy":
+  {
+    "type": "selectorBased",
+    "selectors": [
+      {
+        "selectionKey": "podSpec1",
+        "context.tags": {
+          "userProvidedTag": ["tag1", "tag2"]
+        },
+        "dataSource": ["wikipedia"]
+      },
+      {
+        "selectionKey": "podSpec2",
+        "type": ["index_kafka"]
+      }
+    ]
+  }
+}
+```
+</details>
+
+#### Update dynamic configuration
+
+Updates the dynamic configuration for the Kubernetes Task Runner
+
+##### URL
+
+`POST` `/druid/indexer/v1/k8s/taskRunner/executionConfig`
+
+##### Header parameters
+
+The endpoint supports the following optional header parameters to populate the 
`author` and `comment` fields in the configuration history.
+
+* `X-Druid-Author`
+  * Type: String
+  * Author of the configuration change.
+* `X-Druid-Comment`
+  * Type: String
+  * Description for the update.
+
+##### Responses
+
+<Tabs>
+
+<TabItem value="4" label="200 SUCCESS">
+
+
+*Successfully updated dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+##### Sample request
+
+<Tabs>
+
+<TabItem value="5" label="cURL">
+
+
+```shell
+curl 
"http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/k8s/taskRunner/executionConfig"; \
+--header 'Content-Type: application/json' \
+--data '{
+  "type": "default",
+  "podTemplateSelectStrategy":
+  {
+    "type": "selectorBased",
+    "selectors": [
+      {
+        "selectionKey": "podSpec1",
+        "context.tags":
+        {
+          "userProvidedTag": ["tag1", "tag2"]
+        },
+        "dataSource": ["wikipedia"]
+      },
+      {
+        "selectionKey": "podSpec2",
+        "type": ["index_kafka"]
+      }
+    ]
+  }
+}'
+```
+
+</TabItem>
+<TabItem value="6" label="HTTP">
+
+
+```HTTP
+POST /druid/indexer/v1/k8s/taskRunner/executionConfig HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+Content-Type: application/json
+
+{
+  "type": "default",
+  "podTemplateSelectStrategy":
+  {
+    "type": "selectorBased",
+    "selectors": [
+      {
+        "selectionKey": "podSpec1",
+        "context.tags":
+        {
+          "userProvidedTag": ["tag1", "tag2"]
+        },
+        "dataSource": ["wikipedia"]
+      },
+      {
+        "selectionKey": "podSpec2",
+        "type": ["index_kafka"]
+      }
+    ]
+  }
+}
+```
+
+</TabItem>
+</Tabs>
+
+##### Sample response
+
+A successful request returns an HTTP `200 OK` message code and an empty 
response body.
+
+#### Get dynamic configuration history
+
+Retrieves the history of changes to Kubernetes task runner's dynamic execution 
config over an interval of time. Returns 
+an empty array if there are no history records available.
+
+##### URL
+
+`GET` `/druid/indexer/v1/k8s/taskRunner/executionConfig/history`
+
+##### Query parameters
+
+The endpoint supports the following optional query parameters to filter 
results.
+
+* `interval`
+  * Type: String
+  * Limit the results to the specified time interval in ISO 8601 format 
delimited with `/`. For example, `2023-07-13/2023-07-19`. The default interval 
is one week. You can change this period by setting 
`druid.audit.manager.auditHistoryMillis` in the `runtime.properties` file for 
the Coordinator.
+
+* `count`
+  * Type: Integer
+  * Limit the number of results to the last `n` entries.
+
+##### Responses
+
+<Tabs>
+
+<TabItem value="1" label="200 SUCCESS">
+
+
+*Successfully retrieved dynamic configuration*
+
+</TabItem>
+</Tabs>
+
+---
+
+##### Sample request
+
+<Tabs>
+
+<TabItem value="2" label="cURL">
+
+
+```shell
+curl 
"http://ROUTER_IP:ROUTER_PORT/druid/indexer/v1/k8s/taskRunner/executionConfig/history";
+```
+
+</TabItem>
+<TabItem value="3" label="HTTP">
+
+
+```HTTP
+GET /druid/indexer/v1/k8s/taskRunner/executionConfig/history HTTP/1.1
+Host: http://ROUTER_IP:ROUTER_PORT
+```
+
+</TabItem>
+</Tabs>
+
+##### Sample response
+
+<details>
+<summary>View the response</summary>
+
+```json
+[
+  {
+    "key": "k8s.taskrunner.config",
+    "type": "k8s.taskrunner.config",
+    "auditInfo": {
+      "author": "",
+      "comment": "",
+      "ip": "127.0.0.1"
+    },
+    "payload": "{\"type\": 
\"default\",\"podTemplateSelectStrategy\":{\"type\": \"taskType\"}",
+    "auditTime": "2024-06-13T20:59:51.622Z"
+  }
+]
+```
+</details>
+
+## Pod adapters
 The logic defining how the pod template is built for your Kubernetes Job 
depends on which pod adapter you have specified.
 
 ### Overlord Single Container Pod Adapter/Overlord Multi Container Pod Adapter
@@ -65,7 +338,7 @@ and in your sidecar specs:
 That will not work, because we cannot decipher what your command is, the 
extension needs to know it explicitly.
 **Even for sidecars like Istio which are dynamically created by the service 
mesh, this needs to happen.*
 
-Instead do the following:
+Instead, do the following:
 You can keep your Dockerfile the same but you must have a sidecar spec like so:
 ``` container:
         name: foo
@@ -90,13 +363,10 @@ The custom template pod adapter allows you to specify a 
pod template file per ta
 
 The base pod template must be specified as the runtime property 
`druid.indexer.runner.k8s.podTemplate.base: /path/to/basePodSpec.yaml`
 
-Task specific pod templates can be specified as the runtime property 
`druid.indexer.runner.k8s.podTemplate.{taskType}: 
/path/to/taskSpecificPodSpec.yaml` where {taskType} is the name of the task 
type i.e `index_parallel`.
-
-If you are trying to use the default image's environment variable parsing 
feature to set runtime properties, you need to add a extra escape underscore 
when specifying pod templates.
-e.g. set the environment variable 
`druid_indexer_runner_k8s_podTemplate_index__parallel` when setting 
`druid.indxer.runner.k8s.podTemplate.index_parallel`
+<details>
+<summary>Example Pod Template that uses the regular druid docker 
image</summary>
 
-The following is an example Pod Template that uses the regular druid docker 
image.
-```
+```yaml
 apiVersion: "v1"
 kind: "PodTemplate"
 template:
@@ -164,6 +434,7 @@ template:
     - emptyDir: {}
       name: deepstorage-volume
 ```
+</details>
 
 The below runtime properties need to be passed to the Job's peon process.
 
@@ -177,6 +448,10 @@ druid.indexer.task.encapsulatedTask=true
 ```
 
 Any runtime property or JVM config used by the peon process can also be 
passed. E.G. below is a example of a ConfigMap that can be used to generate the 
`nodetype-config-volume` mount in the above template.
+
+<details>
+<summary>Example ConfigMap</summary>
+
 ```
 kind: ConfigMap
 metadata:
@@ -217,59 +492,112 @@ data:
         druid.peon.mode=remote
         druid.indexer.task.encapsulatedTask=true
 ```
-#### Dynamic Pod Template Selection Config
-The Dynamic Pod Template Selection feature enhances the K8s extension by 
enabling more flexible and dynamic selection of pod templates based on task 
properties. This process is governed by the `PodTemplateSelectStrategy`. Below 
are the two strategies implemented:
+</details>
 
-|Property|Description|Default|
-|--------|-----------|-------|
-|`TaskTypePodTemplateSelectStrategy`| This strategy selects pod templates 
based on task type for execution purposes, implementing the behavior that maps 
templates to specific task types. | true |
-|`SelectorBasedPodTemplateSelectStrategy`| This strategy evaluates a series of 
selectors, known as `selectors`, which are aligned with potential task 
properties. | false |
+#### Pod template selection
+ 
+The pod template adapter can select which pod template should be used for a 
task using the [task runner execution config](#dynamic-config)
 
-`SelectorBasedPodTemplateSelectStrategy`, the strategy implementing this new 
feature, is based on conditional `selectors` that match against top-level keys 
from the task payload. Currently, it supports matching based on task context 
tags, task type, and dataSource. These selectors are ordered in the dynamic 
configuration, with the first selector given the highest priority during the 
evaluation process. This means that the selection process uses these ordered 
conditions to determine a tas [...]
+##### Select based on task type
 
-Example Configuration:
+The `TaskTypePodTemplateSelectStrategy` strategy selects pod templates based 
on task type for execution purposes,
+implementing the behavior that maps templates to specific task types. This is 
the default pod template selection
+strategy. To explicitly select this strategy, set the 
`podTemplateSelectStrategy` in the dynamic execution config to
+
+```json
+{ "type": "default" }
+```
+
+Task specific pod templates can be specified as the runtime property 
+`druid.indexer.runner.k8s.podTemplate.{taskType}: 
/path/to/taskSpecificPodSpec.yaml` where {taskType} is the name of the
+task type. For example, `index_parallel`.
+
+If you are trying to use the default image's environment variable parsing 
feature to set runtime properties, you need to add a extra escape underscore 
when specifying pod templates.
+For example, set the environment variable 
`druid_indexer_runner_k8s_podTemplate_index__kafka` when you set the runtime 
property `druid.indexer.runner.k8s.podTemplate.index_kafka`
 
-We define two template keys in the configuration—`low-throughput` and 
`medium-throughput`—each associated with specific task conditions and arranged 
in a priority order.
 
-- Low Throughput Template: This is the first template evaluated and has the 
highest priority. Tasks that have a context tag 
`billingCategory=streaming_ingestion` and a datasource of `wikipedia` will be 
classified under the `low-throughput` template. This classification directs 
such tasks to utilize a predefined pod template optimized for low throughput 
requirements.
+The following example shows a configuration for task-based pod template 
selection:
 
-- Medium Throughput Template: If a task does not meet the low-throughput 
criteria, the system will then evaluate it against the next selector in order. 
In this example, if the task type is index_kafka, it will fall into the 
`medium-throughput` template.
+```properties
+druid.indexer.runner.k8s.podTemplate.base=/path/to/basePodSpec.yaml
+druid.indexer.runner.k8s.podTemplate.index_kafka=/path/to/kafkaPodSpec.yaml
 ```
+
+##### Select based on one or more conditions
+
+The `SelectorBasedPodTemplateSelectStrategy` strategy evaluates a series of 
criteria within `selectors` to determine
+which pod template to use to run the task. Pod  templates are configured in 
the runtime properties like
+`druid.indexer.runner.k8s.podTemplate.<selectionKey>=...`.
+
+```json
+{
+  "type": "selectorBased",
+  "selectors": [
+    {
+      "selectionKey": "podSpec1", 
+      "context.tags":
+      {
+        "userProvidedTag": ["tag1", "tag2"]
+      },
+      "dataSource": ["wikipedia"]
+    },
+    {
+      "selectionKey": "podSpec2",
+      "type": ["index_kafka"]
+    }
+  ]
+}
+```
+
+Selectors are processed in order. Druid selects the template based on the 
first matching selector. If a  task does not
+match any selector in the list, it will use the `base` pod template.
+
+For a task to match a selector, all the conditions within the selector must 
match. A selector can match on
+- `type`: Type of the task
+- `dataSource`: Destination datasource of the task.
+- `context.tags`: Tags passed in the task's context.
+
+##### Example
+
+Set the following runtime properties to define the pod specs that can be used 
by Druid.
+
+```properties
+druid.indexer.runner.k8s.podTemplate.base=/path/to/basePodSpec.yaml
+druid.indexer.runner.k8s.podTemplate.podSpec1=/path/to/podSpecWithHighMemRequests.yaml
+druid.indexer.runner.k8s.podTemplate.podSpec2=/path/to/podSpecWithLowCpuRequests.yaml
+```
+
+Set the dynamic execution config to define the pod template selection strategy.
+
+```json
 {
   "type": "default",
-  "podTemplateSelectStrategy":
-  {
+  "podTemplateSelectStrategy": {
     "type": "selectorBased",
     "selectors": [
       {
-        "selectionKey": "low-throughput",
-        "context.tags":
-        {
-          "billingCategory": ["streaming_ingestion"]
-        },
+        "selectionKey": "podSpec1",
+        "context.tags": { "userProvidedTag": ["tag1", "tag2"] },
         "dataSource": ["wikipedia"]
       },
       {
-        "selectionKey": "medium-throughput",
+        "selectionKey": "podSpec2",
         "type": ["index_kafka"]
       }
-    ],
-    "defaultKey"" "base"
+    ]
   }
 }
 ```
-Task specific pod templates can be specified as the runtime property 
`druid.indexer.runner.k8s.podTemplate.{template}: 
/path/to/taskSpecificPodSpec.yaml` where {template} is the matched 
`selectionKey` of the `podTemplateSelectStrategy` i.e low-throughput.
 
-Similar to Overlord dynamic configuration, the following API endpoints are 
defined to retrieve and manage dynamic configurations of Pod Template Selection 
config:
+Druid selects the pod templates as follows: 
+1. Use `podSpecWithHighMemRequests.yaml` when both of the following conditions 
are met:
+   1. The task context contains a tag with the key `userProvidedTag` that has 
the value `tag1` or `tag2`.
+   2. The task targets the `wikipedia` datasource.
+2. Use `podSpecWithLowCpuRequests.yaml` when the task type is `index_kafka`.
+3. Use the `basePodSpec.yaml` for all other tasks.
 
-- Get dynamic configuration:
-`POST` `/druid/indexer/v1/k8s/taskRunner/executionConfig`
-
-- Update dynamic configuration:
-`GET` `/druid/indexer/v1/k8s/taskRunner/executionConfig`
-
-- Get dynamic configuration history:
-`GET` `/druid/indexer/v1/k8s/taskRunner/executionConfig/history`
+In this example, if there is an `index_kafka` task for the `wikipedia` 
datasource with the tag `userProvidedTag: tag1`,
+Druid selects the pod template `podSpecWithHighMemRequests.yaml`.
 
 ### Properties
 |Property| Possible Values | Description                                       
                                                                                
                                                                                
                               |Default|required|
@@ -302,7 +630,8 @@ Similar to Overlord dynamic configuration, the following 
API endpoints are defin
 - All Druid Pods belonging to one Druid cluster must be inside the same 
Kubernetes namespace.
 
 - You must have a role binding for the overlord's service account that 
provides the needed permissions for interacting with Kubernetes. An example 
spec could be:
-```
+
+```yaml
 kind: Role
 apiVersion: rbac.authorization.k8s.io/v1
 metadata:
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/PodTemplateSelectStrategy.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/PodTemplateSelectStrategy.java
index 1b8d57419d2..ae7869707fc 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/PodTemplateSelectStrategy.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/PodTemplateSelectStrategy.java
@@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import io.fabric8.kubernetes.api.model.PodTemplate;
 import org.apache.druid.indexing.common.task.Task;
 
+import javax.validation.constraints.NotNull;
 import java.util.Map;
 
 /**
@@ -41,8 +42,7 @@ public interface PodTemplateSelectStrategy
    * allows for customized resource allocation and management tailored to the 
task's specific requirements.
    *
    * @param task The task for which the Pod template is determined.
-   * @return The selected Pod template. If no matching template is found,
-   *         the method falls back to a base template.
+   * @return The pod template that should be used to run the task.
    */
-  PodTemplate getPodTemplateForTask(Task task, Map<String, PodTemplate> 
templates);
+  @NotNull PodTemplate getPodTemplateForTask(Task task, Map<String, 
PodTemplate> templates);
 }
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategy.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategy.java
index 938ed04e6a6..4c2d01b5218 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategy.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategy.java
@@ -25,7 +25,6 @@ import com.google.common.base.Preconditions;
 import io.fabric8.kubernetes.api.model.PodTemplate;
 import org.apache.druid.indexing.common.task.Task;
 
-import javax.annotation.Nullable;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -36,19 +35,15 @@ import java.util.Objects;
  */
 public class SelectorBasedPodTemplateSelectStrategy implements 
PodTemplateSelectStrategy
 {
-  @Nullable
-  private String defaultKey;
-  private List<Selector> selectors;
+  private final List<Selector> selectors;
 
   @JsonCreator
   public SelectorBasedPodTemplateSelectStrategy(
-      @JsonProperty("selectors") List<Selector> selectors,
-      @JsonProperty("defaultKey") @Nullable String defaultKey
+      @JsonProperty("selectors") List<Selector> selectors
   )
   {
     Preconditions.checkNotNull(selectors, "selectors");
     this.selectors = selectors;
-    this.defaultKey = defaultKey;
   }
 
   /**
@@ -64,7 +59,7 @@ public class SelectorBasedPodTemplateSelectStrategy 
implements PodTemplateSelect
                                   .filter(selector -> selector.evaluate(task))
                                   .findFirst()
                                   .map(Selector::getSelectionKey)
-                                  .orElse(defaultKey);
+                                  .orElse("base");
 
     return templates.getOrDefault(templateKey, templates.get("base"));
   }
@@ -75,13 +70,6 @@ public class SelectorBasedPodTemplateSelectStrategy 
implements PodTemplateSelect
     return selectors;
   }
 
-  @Nullable
-  @JsonProperty
-  public String getDefaultKey()
-  {
-    return defaultKey;
-  }
-
   @Override
   public boolean equals(Object o)
   {
@@ -92,13 +80,13 @@ public class SelectorBasedPodTemplateSelectStrategy 
implements PodTemplateSelect
       return false;
     }
     SelectorBasedPodTemplateSelectStrategy that = 
(SelectorBasedPodTemplateSelectStrategy) o;
-    return Objects.equals(defaultKey, that.defaultKey) && 
Objects.equals(selectors, that.selectors);
+    return Objects.equals(selectors, that.selectors);
   }
 
   @Override
   public int hashCode()
   {
-    return Objects.hash(defaultKey, selectors);
+    return Objects.hash(selectors);
   }
 
   @Override
@@ -106,7 +94,6 @@ public class SelectorBasedPodTemplateSelectStrategy 
implements PodTemplateSelect
   {
     return "SelectorBasedPodTemplateSelectStrategy{" +
            "selectors=" + selectors +
-           ", defaultKey=" + defaultKey +
            '}';
   }
 }
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapter.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapter.java
index 8e3788e31e1..19cc788b3ee 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapter.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/main/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapter.java
@@ -39,7 +39,6 @@ import org.apache.druid.guice.IndexingServiceModuleHelper;
 import org.apache.druid.indexing.common.config.TaskConfig;
 import org.apache.druid.indexing.common.task.Task;
 import org.apache.druid.java.util.common.IAE;
-import org.apache.druid.java.util.common.ISE;
 import org.apache.druid.java.util.common.StringUtils;
 import org.apache.druid.java.util.common.logger.Logger;
 import org.apache.druid.k8s.overlord.KubernetesTaskRunnerConfig;
@@ -141,10 +140,6 @@ public class PodTemplateTaskAdapter implements TaskAdapter
 
     PodTemplate podTemplate = 
podTemplateSelectStrategy.getPodTemplateForTask(task, templates);
 
-    if (podTemplate == null) {
-      throw new ISE("Pod template spec not found for task type [%s]", 
task.getType());
-    }
-
     return new JobBuilder()
         .withNewMetadata()
         .withName(new K8sTaskId(task).getK8sJobName())
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskRunnerDynamicConfigTest.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskRunnerDynamicConfigTest.java
index 6236794d366..77a819dde9c 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskRunnerDynamicConfigTest.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/KubernetesTaskRunnerDynamicConfigTest.java
@@ -64,8 +64,7 @@ public class KubernetesTaskRunnerDynamicConfigTest
            + "        \"selectionKey\": \"medium-throughput\",\n"
            + "        \"type\": [\"index_kafka\"]\n"
            + "      }\n"
-           + "    ],\n"
-           + "    \"defaultKey\": \"base\"\n"
+           + "    ]\n"
            + "  }\n"
            + "}";
 
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategyTest.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategyTest.java
index 9aa1376a515..a82bb076855 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategyTest.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/execution/SelectorBasedPodTemplateSelectStrategyTest.java
@@ -88,14 +88,14 @@ public class SelectorBasedPodTemplateSelectStrategyTest
   @Test(expected = NullPointerException.class)
   public void shouldThrowNullPointerExceptionWhenSelectorsAreNull()
   {
-    new SelectorBasedPodTemplateSelectStrategy(null, null);
+    new SelectorBasedPodTemplateSelectStrategy(null);
   }
 
   @Test
   public void testGetPodTemplate_ForTask_emptySelectorsFallbackToBaseTemplate()
   {
     List<Selector> emptySelectors = Collections.emptyList();
-    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(emptySelectors, null);
+    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(emptySelectors);
     Task task = NoopTask.create();
     Assert.assertEquals("base", strategy.getPodTemplateForTask(task, 
templates).getMetadata().getName());
   }
@@ -105,21 +105,11 @@ public class SelectorBasedPodTemplateSelectStrategyTest
   {
     Selector noMatchSelector = new MockSelector(false, "mock");
     List<Selector> selectors = Collections.singletonList(noMatchSelector);
-    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(selectors, null);
+    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(selectors);
     Task task = NoopTask.create();
     Assert.assertEquals("base", strategy.getPodTemplateForTask(task, 
templates).getMetadata().getName());
   }
 
-  @Test
-  public void 
testGetPodTemplate_ForTask_noMatchSelectorsFallbackToDefaultKeyTemplate()
-  {
-    Selector noMatchSelector = new MockSelector(false, "mock");
-    List<Selector> selectors = Collections.singletonList(noMatchSelector);
-    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(selectors, "match");
-    Task task = NoopTask.create();
-    Assert.assertEquals("match", strategy.getPodTemplateForTask(task, 
templates).getMetadata().getName());
-  }
-
   @Test
   public void testGetPodTemplate_ForTask_withMatchSelectors()
   {
@@ -132,7 +122,7 @@ public class SelectorBasedPodTemplateSelectStrategyTest
         noMatchSelector,
         matchSelector
     );
-    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(selectors, null);
+    SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(selectors);
     Task task = NoopTask.create();
     Assert.assertEquals("match", strategy.getPodTemplateForTask(task, 
templates).getMetadata().getName());
   }
@@ -152,7 +142,7 @@ public class SelectorBasedPodTemplateSelectStrategyTest
     );
 
     SelectorBasedPodTemplateSelectStrategy strategy = new 
SelectorBasedPodTemplateSelectStrategy(
-        Collections.singletonList(selector), "default");
+        Collections.singletonList(selector));
 
     SelectorBasedPodTemplateSelectStrategy strategy2 = objectMapper.readValue(
         objectMapper.writeValueAsBytes(strategy),
diff --git 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapterTest.java
 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapterTest.java
index 36fc77631a1..4aad419007e 100644
--- 
a/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapterTest.java
+++ 
b/extensions-contrib/kubernetes-overlord-extensions/src/test/java/org/apache/druid/k8s/overlord/taskadapter/PodTemplateTaskAdapterTest.java
@@ -620,7 +620,7 @@ public class PodTemplateTaskAdapterTest
     dynamicConfigRef = () -> new DefaultKubernetesTaskRunnerDynamicConfig(new 
SelectorBasedPodTemplateSelectStrategy(
         Collections.singletonList(
             new Selector("lowThrougput", null, null, Sets.newSet(dataSource)
-            )), null));
+            ))));
 
     PodTemplateTaskAdapter adapter = new PodTemplateTaskAdapter(
         taskRunnerConfig,


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org
For additional commands, e-mail: commits-h...@druid.apache.org

Reply via email to