/** * Creates a DAG (directed acyclic graph) of tasks to execute in order to perform the cluster job. * * @return Task dag for the cluster operation. */ TaskDag createTaskDag() { long start = System.currentTimeMillis(); TaskDag taskDag = new TaskDag(); List<ProvisionerAction> actionOrder = actions.getActionOrder().get(clusterAction); for (Node node : nodeMap.values()) { if (!shouldPlanNode(node.getId())) { continue; } for (Service service : node.getServices()) { if (!shouldPlanService(service.getName())) { continue; } addDependencies(taskDag, actionOrder, service, node); } } long dur = System.currentTimeMillis() - start; LOG.debug("took {} ms to create action plan.", dur); return taskDag; }
@Test public void testNoEdgeNodesInDag() { Service s1 = Service.builder().setName("s1").build(); Node node1 = new Node("node1", "1", ImmutableSet.<Service>of(s1), NodeProperties.builder().setHostname("host1").addIPAddress("access_v4", "ip1").build()); Node node2 = new Node("node2", "1", ImmutableSet.<Service>of(s1), NodeProperties.builder().setHostname("host2").addIPAddress("access_v4", "ip2").build()); Set<Node> clusterNodes = ImmutableSet.of(node1, node2); TaskDag expected = new TaskDag(); TaskNode taskNode1 = new TaskNode(node1.getId(), ProvisionerAction.DELETE.name(), ""); TaskNode taskNode2 = new TaskNode(node2.getId(), ProvisionerAction.DELETE.name(), ""); expected.addTaskNode(taskNode1); expected.addTaskNode(taskNode2); ClusterJob job = new ClusterJob(JobId.fromString("123-001"), ClusterAction.CLUSTER_DELETE); JobPlanner planner = new JobPlanner(job, clusterNodes); TaskDag actual = planner.createTaskDag(); Assert.assertEquals(expected, actual); List<Set<TaskNode>> linearizedTasks = actual.linearize(); Assert.assertEquals(1, linearizedTasks.size()); Assert.assertEquals(2, linearizedTasks.get(0).size()); Assert.assertTrue(linearizedTasks.get(0).contains(taskNode1)); Assert.assertTrue(linearizedTasks.get(0).contains(taskNode2)); }
@Test public void testDagSingleHost() { TaskDag taskDag = new TaskDag();
ImmutableSet.<String>of(s3.getName()), null); JobPlanner planner = new JobPlanner(job, clusterNodes); TaskDag expected = new TaskDag();
TaskDag expected = new TaskDag();
@Test public void testDagMultipleHosts() { TaskDag taskDag = new TaskDag();
@Test(expected = IllegalStateException.class) public void testNoDag() { TaskDag taskDag = new TaskDag(); taskDag.addDependency(new TaskNode("1", "provision", ""), new TaskNode("1", "bootstrap", "")); taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "install", "datanode")); taskDag.addDependency(new TaskNode("1", "install", "datanode"), new TaskNode("1", "configure", "datanode")); taskDag.addDependency(new TaskNode("1", "configure", "datanode"), new TaskNode("1", "start", "datanode")); taskDag.addDependency(new TaskNode("1", "provision", ""), new TaskNode("1", "bootstrap", "")); taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "bootstrap", "")); // cycle taskDag.addDependency(new TaskNode("1", "bootstrap", ""), new TaskNode("1", "install", "region_server")); taskDag.addDependency(new TaskNode("1", "install", "region_server"), new TaskNode("1", "configure", "region_server")); taskDag.addDependency(new TaskNode("1", "start", "datanode"), new TaskNode("1", "configure", "region_server")); // cross dependency taskDag.addDependency(new TaskNode("1", "configure", "region_server"), new TaskNode("1", "start", "region_server")); taskDag.linearize(); // Should throw exception as there is a cycle. }
ImmutableSet.<String>of(s1.getName()), null); JobPlanner planner = new JobPlanner(job, clusterNodes); TaskDag expected = new TaskDag(); ImmutableSet.<String>of(s2.getName(), s3.getName()), ImmutableSet.<String>of(node2.getId())); planner = new JobPlanner(job, clusterNodes); expected = new TaskDag();
TaskDag expected = new TaskDag();
TaskDag expected = new TaskDag();
TaskDag expected = new TaskDag();