mirror of https://github.com/apache/kafka.git
				
				
				
			KAFKA-6694: The Trogdor Coordinator should support filtering task responses (#4741)
This commit is contained in:
		
							parent
							
								
									9f8c3167eb
								
							
						
					
					
						commit
						63642d6051
					
				|  | @ -31,6 +31,7 @@ import org.apache.kafka.trogdor.rest.CreateTaskResponse; | ||||||
| import org.apache.kafka.trogdor.rest.JsonRestServer; | import org.apache.kafka.trogdor.rest.JsonRestServer; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskRequest; | import org.apache.kafka.trogdor.rest.StopTaskRequest; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskResponse; | import org.apache.kafka.trogdor.rest.StopTaskResponse; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TasksResponse; | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||||
|  | @ -94,8 +95,8 @@ public final class Coordinator { | ||||||
|         return new StopTaskResponse(taskManager.stopTask(request.id())); |         return new StopTaskResponse(taskManager.stopTask(request.id())); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public TasksResponse tasks() throws Exception { |     public TasksResponse tasks(TasksRequest request) throws Exception { | ||||||
|         return taskManager.tasks(); |         return taskManager.tasks(request); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void beginShutdown(boolean stopAgents) throws Exception { |     public void beginShutdown(boolean stopAgents) throws Exception { | ||||||
|  |  | ||||||
|  | @ -33,10 +33,13 @@ import org.apache.kafka.trogdor.rest.JsonRestServer; | ||||||
| import org.apache.kafka.trogdor.rest.JsonRestServer.HttpResponse; | import org.apache.kafka.trogdor.rest.JsonRestServer.HttpResponse; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskRequest; | import org.apache.kafka.trogdor.rest.StopTaskRequest; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskResponse; | import org.apache.kafka.trogdor.rest.StopTaskResponse; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TasksResponse; | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||||
| 
 | 
 | ||||||
|  | import javax.ws.rs.core.UriBuilder; | ||||||
|  | 
 | ||||||
| import static net.sourceforge.argparse4j.impl.Arguments.store; | import static net.sourceforge.argparse4j.impl.Arguments.store; | ||||||
| import static net.sourceforge.argparse4j.impl.Arguments.storeTrue; | import static net.sourceforge.argparse4j.impl.Arguments.storeTrue; | ||||||
| 
 | 
 | ||||||
|  | @ -127,9 +130,15 @@ public class CoordinatorClient { | ||||||
|         return resp.body(); |         return resp.body(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public TasksResponse tasks() throws Exception { |     public TasksResponse tasks(TasksRequest request) throws Exception { | ||||||
|  |         UriBuilder uriBuilder = UriBuilder.fromPath(url("/coordinator/tasks")); | ||||||
|  |         uriBuilder.queryParam("taskId", request.taskIds().toArray(new String[0])); | ||||||
|  |         uriBuilder.queryParam("firstStartMs", request.firstStartMs()); | ||||||
|  |         uriBuilder.queryParam("lastStartMs", request.lastStartMs()); | ||||||
|  |         uriBuilder.queryParam("firstEndMs", request.firstEndMs()); | ||||||
|  |         uriBuilder.queryParam("lastEndMs", request.lastEndMs()); | ||||||
|         HttpResponse<TasksResponse> resp = |         HttpResponse<TasksResponse> resp = | ||||||
|             JsonRestServer.<TasksResponse>httpRequest(log, url("/coordinator/tasks"), "GET", |             JsonRestServer.<TasksResponse>httpRequest(log, uriBuilder.build().toString(), "GET", | ||||||
|                 null, new TypeReference<TasksResponse>() { }, maxTries); |                 null, new TypeReference<TasksResponse>() { }, maxTries); | ||||||
|         return resp.body(); |         return resp.body(); | ||||||
|     } |     } | ||||||
|  | @ -204,7 +213,8 @@ public class CoordinatorClient { | ||||||
|                 JsonUtil.toPrettyJsonString(client.status())); |                 JsonUtil.toPrettyJsonString(client.status())); | ||||||
|         } else if (res.getBoolean("show_tasks")) { |         } else if (res.getBoolean("show_tasks")) { | ||||||
|             System.out.println("Got coordinator tasks: " + |             System.out.println("Got coordinator tasks: " + | ||||||
|                 JsonUtil.toPrettyJsonString(client.tasks())); |                 JsonUtil.toPrettyJsonString(client.tasks( | ||||||
|  |                     new TasksRequest(null, 0, 0, 0, 0)))); | ||||||
|         } else if (res.getString("create_task") != null) { |         } else if (res.getString("create_task") != null) { | ||||||
|             client.createTask(JsonUtil.JSON_SERDE.readValue(res.getString("create_task"), |             client.createTask(JsonUtil.JSON_SERDE.readValue(res.getString("create_task"), | ||||||
|                 CreateTaskRequest.class)); |                 CreateTaskRequest.class)); | ||||||
|  |  | ||||||
|  | @ -23,16 +23,20 @@ import org.apache.kafka.trogdor.rest.CreateTaskResponse; | ||||||
| import org.apache.kafka.trogdor.rest.Empty; | import org.apache.kafka.trogdor.rest.Empty; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskRequest; | import org.apache.kafka.trogdor.rest.StopTaskRequest; | ||||||
| import org.apache.kafka.trogdor.rest.StopTaskResponse; | import org.apache.kafka.trogdor.rest.StopTaskResponse; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TasksResponse; | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| 
 | 
 | ||||||
| import javax.servlet.ServletContext; | import javax.servlet.ServletContext; | ||||||
| import javax.ws.rs.Consumes; | import javax.ws.rs.Consumes; | ||||||
|  | import javax.ws.rs.DefaultValue; | ||||||
| import javax.ws.rs.GET; | import javax.ws.rs.GET; | ||||||
| import javax.ws.rs.POST; | import javax.ws.rs.POST; | ||||||
| import javax.ws.rs.PUT; | import javax.ws.rs.PUT; | ||||||
| import javax.ws.rs.Path; | import javax.ws.rs.Path; | ||||||
| import javax.ws.rs.Produces; | import javax.ws.rs.Produces; | ||||||
|  | import javax.ws.rs.QueryParam; | ||||||
| import javax.ws.rs.core.MediaType; | import javax.ws.rs.core.MediaType; | ||||||
|  | import java.util.List; | ||||||
| import java.util.concurrent.atomic.AtomicReference; | import java.util.concurrent.atomic.AtomicReference; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -69,8 +73,12 @@ public class CoordinatorRestResource { | ||||||
| 
 | 
 | ||||||
|     @GET |     @GET | ||||||
|     @Path("/tasks") |     @Path("/tasks") | ||||||
|     public TasksResponse tasks() throws Throwable { |     public TasksResponse tasks(@QueryParam("taskId") List<String> taskId, | ||||||
|         return coordinator().tasks(); |             @DefaultValue("0") @QueryParam("firstStartMs") int firstStartMs, | ||||||
|  |             @DefaultValue("0") @QueryParam("lastStartMs") int lastStartMs, | ||||||
|  |             @DefaultValue("0") @QueryParam("firstEndMs") int firstEndMs, | ||||||
|  |             @DefaultValue("0") @QueryParam("lastEndMs") int lastEndMs) throws Throwable { | ||||||
|  |         return coordinator().tasks(new TasksRequest(taskId, firstStartMs, lastStartMs, firstEndMs, lastEndMs)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @PUT |     @PUT | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ import org.apache.kafka.trogdor.rest.TaskPending; | ||||||
| import org.apache.kafka.trogdor.rest.TaskRunning; | import org.apache.kafka.trogdor.rest.TaskRunning; | ||||||
| import org.apache.kafka.trogdor.rest.TaskState; | import org.apache.kafka.trogdor.rest.TaskState; | ||||||
| import org.apache.kafka.trogdor.rest.TaskStopping; | import org.apache.kafka.trogdor.rest.TaskStopping; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TasksResponse; | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| import org.apache.kafka.trogdor.task.TaskController; | import org.apache.kafka.trogdor.task.TaskController; | ||||||
| import org.apache.kafka.trogdor.task.TaskSpec; | import org.apache.kafka.trogdor.task.TaskSpec; | ||||||
|  | @ -483,16 +484,24 @@ public final class TaskManager { | ||||||
|     /** |     /** | ||||||
|      * Get information about the tasks being managed. |      * Get information about the tasks being managed. | ||||||
|      */ |      */ | ||||||
|     public TasksResponse tasks() throws ExecutionException, InterruptedException { |     public TasksResponse tasks(TasksRequest request) throws ExecutionException, InterruptedException { | ||||||
|         return executor.submit(new GetTasksResponse()).get(); |         return executor.submit(new GetTasksResponse(request)).get(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     class GetTasksResponse implements Callable<TasksResponse> { |     class GetTasksResponse implements Callable<TasksResponse> { | ||||||
|  |         private final TasksRequest request; | ||||||
|  | 
 | ||||||
|  |         GetTasksResponse(TasksRequest request) { | ||||||
|  |             this.request = request; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         @Override |         @Override | ||||||
|         public TasksResponse call() throws Exception { |         public TasksResponse call() throws Exception { | ||||||
|             TreeMap<String, TaskState> states = new TreeMap<>(); |             TreeMap<String, TaskState> states = new TreeMap<>(); | ||||||
|             for (ManagedTask task : tasks.values()) { |             for (ManagedTask task : tasks.values()) { | ||||||
|                 states.put(task.id, task.taskState()); |                 if (request.matches(task.id, task.startedMs, task.doneMs)) { | ||||||
|  |                     states.put(task.id, task.taskState()); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|             return new TasksResponse(states); |             return new TasksResponse(states); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,123 @@ | ||||||
|  | /* | ||||||
|  |  * Licensed to the Apache Software Foundation (ASF) under one or more | ||||||
|  |  * contributor license agreements. See the NOTICE file distributed with | ||||||
|  |  * this work for additional information regarding copyright ownership. | ||||||
|  |  * The ASF licenses this file to You under the Apache License, Version 2.0 | ||||||
|  |  * (the "License"); you may not use this file except in compliance with | ||||||
|  |  * the License. You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *    http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  |  * | ||||||
|  |  * Unless required by applicable law or agreed to in writing, software | ||||||
|  |  * distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  * See the License for the specific language governing permissions and | ||||||
|  |  * limitations under the License. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.apache.kafka.trogdor.rest; | ||||||
|  | 
 | ||||||
|  | import com.fasterxml.jackson.annotation.JsonCreator; | ||||||
|  | import com.fasterxml.jackson.annotation.JsonProperty; | ||||||
|  | 
 | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.Set; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The request to /coordinator/tasks | ||||||
|  |  */ | ||||||
|  | public class TasksRequest extends Message { | ||||||
|  |     /** | ||||||
|  |      * The task IDs to list. | ||||||
|  |      * An empty set of task IDs indicates that we should list all task IDs. | ||||||
|  |      */ | ||||||
|  |     private final Set<String> taskIds; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * If this is non-zero, only tasks with a startMs at or after this time will be listed. | ||||||
|  |      */ | ||||||
|  |     private final long firstStartMs; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * If this is non-zero, only tasks with a startMs at or before this time will be listed. | ||||||
|  |      */ | ||||||
|  |     private final long lastStartMs; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * If this is non-zero, only tasks with an endMs at or after this time will be listed. | ||||||
|  |      */ | ||||||
|  |     private final long firstEndMs; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * If this is non-zero, only tasks with an endMs at or before this time will be listed. | ||||||
|  |      */ | ||||||
|  |     private final long lastEndMs; | ||||||
|  | 
 | ||||||
|  |     @JsonCreator | ||||||
|  |     public TasksRequest(@JsonProperty("taskIds") Collection<String> taskIds, | ||||||
|  |             @JsonProperty("firstStartMs") long firstStartMs, | ||||||
|  |             @JsonProperty("lastStartMs") long lastStartMs, | ||||||
|  |             @JsonProperty("firstEndMs") long firstEndMs, | ||||||
|  |             @JsonProperty("lastEndMs") long lastEndMs) { | ||||||
|  |         this.taskIds = Collections.unmodifiableSet((taskIds == null) ? | ||||||
|  |             new HashSet<String>() : new HashSet<>(taskIds)); | ||||||
|  |         this.firstStartMs = Math.max(0, firstStartMs); | ||||||
|  |         this.lastStartMs = Math.max(0, lastStartMs); | ||||||
|  |         this.firstEndMs = Math.max(0, firstEndMs); | ||||||
|  |         this.lastEndMs = Math.max(0, lastEndMs); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @JsonProperty | ||||||
|  |     public Collection<String> taskIds() { | ||||||
|  |         return taskIds; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @JsonProperty | ||||||
|  |     public long firstStartMs() { | ||||||
|  |         return firstStartMs; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @JsonProperty | ||||||
|  |     public long lastStartMs() { | ||||||
|  |         return lastStartMs; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @JsonProperty | ||||||
|  |     public long firstEndMs() { | ||||||
|  |         return firstEndMs; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @JsonProperty | ||||||
|  |     public long lastEndMs() { | ||||||
|  |         return lastEndMs; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Determine if this TaskRequest should return a particular task. | ||||||
|  |      * | ||||||
|  |      * @param taskId    The task ID. | ||||||
|  |      * @param startMs   The task start time, or -1 if the task hasn't started. | ||||||
|  |      * @param endMs     The task end time, or -1 if the task hasn't ended. | ||||||
|  |      * @return          True if information about the task should be returned. | ||||||
|  |      */ | ||||||
|  |     public boolean matches(String taskId, long startMs, long endMs) { | ||||||
|  |         if ((!taskIds.isEmpty()) && (!taskIds.contains(taskId))) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if ((firstStartMs > 0) && (startMs < firstStartMs)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if ((lastStartMs > 0) && ((startMs < 0) || (startMs > lastStartMs))) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if ((firstEndMs > 0) && (endMs < firstEndMs)) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         if ((lastEndMs > 0) && ((endMs < 0) || (endMs > lastEndMs))) { | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -25,6 +25,7 @@ import org.apache.kafka.trogdor.agent.AgentClient; | ||||||
| import org.apache.kafka.trogdor.coordinator.CoordinatorClient; | import org.apache.kafka.trogdor.coordinator.CoordinatorClient; | ||||||
| import org.apache.kafka.trogdor.rest.AgentStatusResponse; | import org.apache.kafka.trogdor.rest.AgentStatusResponse; | ||||||
| import org.apache.kafka.trogdor.rest.TaskState; | import org.apache.kafka.trogdor.rest.TaskState; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TasksResponse; | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| import org.apache.kafka.trogdor.rest.WorkerState; | import org.apache.kafka.trogdor.rest.WorkerState; | ||||||
| import org.apache.kafka.trogdor.task.TaskSpec; | import org.apache.kafka.trogdor.task.TaskSpec; | ||||||
|  | @ -144,7 +145,7 @@ public class ExpectedTasks { | ||||||
|             public boolean conditionMet() { |             public boolean conditionMet() { | ||||||
|                 TasksResponse tasks = null; |                 TasksResponse tasks = null; | ||||||
|                 try { |                 try { | ||||||
|                     tasks = client.tasks(); |                     tasks = client.tasks(new TasksRequest(null, 0, 0, 0, 0)); | ||||||
|                 } catch (Exception e) { |                 } catch (Exception e) { | ||||||
|                     log.info("Unable to get coordinator tasks", e); |                     log.info("Unable to get coordinator tasks", e); | ||||||
|                     throw new RuntimeException(e); |                     throw new RuntimeException(e); | ||||||
|  |  | ||||||
|  | @ -36,6 +36,8 @@ import org.apache.kafka.trogdor.rest.StopTaskRequest; | ||||||
| import org.apache.kafka.trogdor.rest.TaskDone; | import org.apache.kafka.trogdor.rest.TaskDone; | ||||||
| import org.apache.kafka.trogdor.rest.TaskPending; | import org.apache.kafka.trogdor.rest.TaskPending; | ||||||
| import org.apache.kafka.trogdor.rest.TaskRunning; | import org.apache.kafka.trogdor.rest.TaskRunning; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksRequest; | ||||||
|  | import org.apache.kafka.trogdor.rest.TasksResponse; | ||||||
| import org.apache.kafka.trogdor.rest.WorkerDone; | import org.apache.kafka.trogdor.rest.WorkerDone; | ||||||
| import org.apache.kafka.trogdor.rest.WorkerRunning; | import org.apache.kafka.trogdor.rest.WorkerRunning; | ||||||
| import org.apache.kafka.trogdor.task.NoOpTaskSpec; | import org.apache.kafka.trogdor.task.NoOpTaskSpec; | ||||||
|  | @ -50,6 +52,8 @@ import java.util.Arrays; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||||
|  | import static org.junit.Assert.assertFalse; | ||||||
|  | import static org.junit.Assert.assertTrue; | ||||||
| 
 | 
 | ||||||
| public class CoordinatorTest { | public class CoordinatorTest { | ||||||
|     private static final Logger log = LoggerFactory.getLogger(CoordinatorTest.class); |     private static final Logger log = LoggerFactory.getLogger(CoordinatorTest.class); | ||||||
|  | @ -302,4 +306,92 @@ public class CoordinatorTest { | ||||||
|                 "-m comment --comment node02"). |                 "-m comment --comment node02"). | ||||||
|             waitFor("node03", runner); |             waitFor("node03", runner); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void testTasksRequestMatches() throws Exception { | ||||||
|  |         TasksRequest req1 = new TasksRequest(null, 0, 0, 0, 0); | ||||||
|  |         assertTrue(req1.matches("foo1", -1, -1)); | ||||||
|  |         assertTrue(req1.matches("bar1", 100, 200)); | ||||||
|  |         assertTrue(req1.matches("baz1", 100, -1)); | ||||||
|  | 
 | ||||||
|  |         TasksRequest req2 = new TasksRequest(null, 100, 0, 0, 0); | ||||||
|  |         assertFalse(req2.matches("foo1", -1, -1)); | ||||||
|  |         assertTrue(req2.matches("bar1", 100, 200)); | ||||||
|  |         assertFalse(req2.matches("bar1", 99, 200)); | ||||||
|  |         assertFalse(req2.matches("baz1", 99, -1)); | ||||||
|  | 
 | ||||||
|  |         TasksRequest req3 = new TasksRequest(null, 200, 900, 200, 900); | ||||||
|  |         assertFalse(req3.matches("foo1", -1, -1)); | ||||||
|  |         assertFalse(req3.matches("bar1", 100, 200)); | ||||||
|  |         assertFalse(req3.matches("bar1", 200, 1000)); | ||||||
|  |         assertTrue(req3.matches("bar1", 200, 700)); | ||||||
|  |         assertFalse(req3.matches("baz1", 101, -1)); | ||||||
|  | 
 | ||||||
|  |         List<String> taskIds = new ArrayList<>(); | ||||||
|  |         taskIds.add("foo1"); | ||||||
|  |         taskIds.add("bar1"); | ||||||
|  |         taskIds.add("baz1"); | ||||||
|  |         TasksRequest req4 = new TasksRequest(taskIds, 1000, -1, -1, -1); | ||||||
|  |         assertFalse(req4.matches("foo1", -1, -1)); | ||||||
|  |         assertTrue(req4.matches("foo1", 1000, -1)); | ||||||
|  |         assertFalse(req4.matches("foo1", 900, -1)); | ||||||
|  |         assertFalse(req4.matches("baz2", 2000, -1)); | ||||||
|  |         assertFalse(req4.matches("baz2", -1, -1)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test | ||||||
|  |     public void testTasksRequest() throws Exception { | ||||||
|  |         MockTime time = new MockTime(0, 0, 0); | ||||||
|  |         Scheduler scheduler = new MockScheduler(time); | ||||||
|  |         try (MiniTrogdorCluster cluster = new MiniTrogdorCluster.Builder(). | ||||||
|  |             addCoordinator("node01"). | ||||||
|  |             addAgent("node02"). | ||||||
|  |             scheduler(scheduler). | ||||||
|  |             build()) { | ||||||
|  |             CoordinatorClient coordinatorClient = cluster.coordinatorClient(); | ||||||
|  |             new ExpectedTasks().waitFor(coordinatorClient); | ||||||
|  | 
 | ||||||
|  |             NoOpTaskSpec fooSpec = new NoOpTaskSpec(1, 10); | ||||||
|  |             NoOpTaskSpec barSpec = new NoOpTaskSpec(3, 1); | ||||||
|  |             coordinatorClient.createTask(new CreateTaskRequest("foo", fooSpec)); | ||||||
|  |             coordinatorClient.createTask(new CreateTaskRequest("bar", barSpec)); | ||||||
|  |             new ExpectedTasks(). | ||||||
|  |                 addTask(new ExpectedTaskBuilder("foo"). | ||||||
|  |                     taskState(new TaskPending(fooSpec)). | ||||||
|  |                     build()). | ||||||
|  |                 addTask(new ExpectedTaskBuilder("bar"). | ||||||
|  |                     taskState(new TaskPending(barSpec)). | ||||||
|  |                     build()). | ||||||
|  |                 waitFor(coordinatorClient); | ||||||
|  | 
 | ||||||
|  |             assertEquals(0, coordinatorClient.tasks( | ||||||
|  |                 new TasksRequest(null, 10, 0, 10, 0)).tasks().size()); | ||||||
|  |             TasksResponse resp1 = coordinatorClient.tasks( | ||||||
|  |                 new TasksRequest(Arrays.asList(new String[] {"foo", "baz" }), 0, 0, 0, 0)); | ||||||
|  |             assertTrue(resp1.tasks().containsKey("foo")); | ||||||
|  |             assertFalse(resp1.tasks().containsKey("bar")); | ||||||
|  |             assertEquals(1, resp1.tasks().size()); | ||||||
|  | 
 | ||||||
|  |             time.sleep(2); | ||||||
|  |             new ExpectedTasks(). | ||||||
|  |                 addTask(new ExpectedTaskBuilder("foo"). | ||||||
|  |                     taskState(new TaskRunning(fooSpec, 2)). | ||||||
|  |                     workerState(new WorkerRunning(fooSpec, 2, "")). | ||||||
|  |                     build()). | ||||||
|  |                 addTask(new ExpectedTaskBuilder("bar"). | ||||||
|  |                     taskState(new TaskPending(barSpec)). | ||||||
|  |                     build()). | ||||||
|  |                 waitFor(coordinatorClient). | ||||||
|  |                 waitFor(cluster.agentClient("node02")); | ||||||
|  | 
 | ||||||
|  |             TasksResponse resp2 = coordinatorClient.tasks( | ||||||
|  |                 new TasksRequest(null, 1, 0, 0, 0)); | ||||||
|  |             assertTrue(resp2.tasks().containsKey("foo")); | ||||||
|  |             assertFalse(resp2.tasks().containsKey("bar")); | ||||||
|  |             assertEquals(1, resp2.tasks().size()); | ||||||
|  | 
 | ||||||
|  |             assertEquals(0, coordinatorClient.tasks( | ||||||
|  |                 new TasksRequest(null, 3, 0, 0, 0)).tasks().size()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue