this.reversedRuntimeServiceDependencies = reverseDependencies(runtimeServiceDependencies); this.clusterDependencies = HashMultimap.create(); Set<Actions.Dependency> serviceActionDependencies = actions.getActionDependencies();
ProvisionerAction retryAction = actions.getRetryAction().get(task.getTaskName()); List<ProvisionerAction> taskOrder = actions.getActionOrder().get(task.getClusterAction()); if (taskOrder == null) { throw new IllegalStateException("Not able to get task order for action " + task.getClusterAction());
/** * Get the rollback task that should run if the given task fails. * * @param task Task that needs to get rolled back. * @return Cluster task that will roll back the given failed task. */ private ClusterTask getRollbackTask(ClusterTask task) { ProvisionerAction rollback = actions.getRollbackActions().get(task.getTaskName()); if (rollback == null) { return null; } TaskId rollbackTaskId = idService.getNewTaskId(JobId.fromString(task.getJobId())); ClusterTask rollbackTask = new ClusterTask(rollback, rollbackTaskId, task.getNodeId(), task.getService(), task.getClusterAction(), task.getClusterTemplateName(), task.getAccount()); return rollbackTask; }
@Test public void testServiceUsesDependency() { ServiceAction sAction = new ServiceAction("shell", TestHelper.actionMapOf(null, null)); Map<ProvisionerAction, ServiceAction> installActions = ImmutableMap.of(ProvisionerAction.INSTALL, sAction); Service s1 = Service.builder().setName("s1").setProvisionerActions(installActions).build(); Service s2 = Service.builder() .setName("s2") .setDependencies( ServiceDependencies.builder().setInstallDependencies( new ServiceStageDependencies(null, ImmutableSet.<String>of("s1", "s3"))).build()) .setProvisionerActions(installActions) .build(); Map<String, Service> serviceMap = Maps.newHashMap(); serviceMap.put(s1.getName(), s1); serviceMap.put(s2.getName(), s2); SetMultimap<ActionOnService, ActionOnService> expected = HashMultimap.create(); // s2 depends on s1 expected.put(new ActionOnService(ProvisionerAction.INSTALL, "s2"), new ActionOnService(ProvisionerAction.INSTALL, "s1")); ServiceDependencyResolver resolver = new ServiceDependencyResolver(Actions.getInstance(), serviceMap); SetMultimap<ActionOnService, ActionOnService> actual = resolver.getClusterDependencies(); Assert.assertEquals(expected, actual); } }
/** * 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; }
expected.put("s5", "s3"); expected.put("s5", "s4"); ServiceDependencyResolver resolver = new ServiceDependencyResolver(Actions.getInstance(), serviceMap); SetMultimap<String, String> actual = resolver.getRuntimeServiceDependencies(); Assert.assertEquals(expected, actual);
try { List<ProvisionerAction> actionOrder = actions.getActionOrder().get(clusterAction); if (actionOrder == null) { LOG.error("Cluster action {} does not have any provisioner actions defined", clusterAction);
expected.put("s3", "s2-v1"); expected.put("s3", "s2-v2"); ServiceDependencyResolver resolver = new ServiceDependencyResolver(Actions.getInstance(), serviceMap); SetMultimap<String, String> actual = resolver.getRuntimeServiceDependencies(); Assert.assertEquals(expected, actual);
new ActionOnService(ProvisionerAction.START, "s5")); ServiceDependencyResolver resolver = new ServiceDependencyResolver(Actions.getInstance(), serviceMap); SetMultimap<ActionOnService, ActionOnService> actual = resolver.getClusterDependencies(); Assert.assertEquals(expected, actual);
new ActionOnService(ProvisionerAction.INSTALL, "s5")); ServiceDependencyResolver resolver = new ServiceDependencyResolver(Actions.getInstance(), serviceMap); SetMultimap<ActionOnService, ActionOnService> actual = resolver.getClusterDependencies(); Assert.assertEquals(expected, actual);