Repository: aurora Updated Branches: refs/heads/master 31a538f19 -> c5f94e05f
Adding non-role-exclusive dedicated constraint support Reviewed at https://reviews.apache.org/r/44602/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/c5f94e05 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/c5f94e05 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/c5f94e05 Branch: refs/heads/master Commit: c5f94e05f61778ec11fcce5b1f07dd69c5f843d1 Parents: 31a538f Author: Maxim Khutornenko <[email protected]> Authored: Thu Mar 10 12:19:58 2016 -0800 Committer: Maxim Khutornenko <[email protected]> Committed: Thu Mar 10 12:19:58 2016 -0800 ---------------------------------------------------------------------- NEWS | 3 ++ docs/deploying-aurora-scheduler.md | 11 +++++- .../configuration/ConfigurationManager.java | 2 +- .../configuration/ConfigurationManagerTest.java | 36 +++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/c5f94e05/NEWS ---------------------------------------------------------------------- diff --git a/NEWS b/NEWS index 0aa7f5e..da3e4ce 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,9 @@ New/updated: - Upgraded Mesos to 0.26.0 - Added a new `aurora job add` client command to scale out an existing job. - Upgraded the scheduler ZooKeeper client from 3.4.6 to 3.4.8. +- Added support for dedicated constraints not exclusive to a particular role. + See https://github.com/apache/aurora/blob/master/docs/deploying-aurora-scheduler.md#dedicated-attribute + for more details. Deprecations and removals: http://git-wip-us.apache.org/repos/asf/aurora/blob/c5f94e05/docs/deploying-aurora-scheduler.md ---------------------------------------------------------------------- diff --git a/docs/deploying-aurora-scheduler.md b/docs/deploying-aurora-scheduler.md index 10952ef..03ee360 100644 --- a/docs/deploying-aurora-scheduler.md +++ b/docs/deploying-aurora-scheduler.md @@ -279,7 +279,16 @@ The dedicated attribute has semantic meaning. The format is `$role(/.*)?`. When the scheduler requires that the `$role` component matches the `role` field in the job configuration, and will reject the job creation otherwise. The remainder of the attribute is free-form. We've developed the idiom of formatting this attribute as `$role/$job`, but do not -enforce this. +enforce this. For example: a job `devcluster/www-data/prod/hello` with a dedicated constraint set as +`www-data/web.multi` will have its tasks scheduled only on Mesos slaves configured with: +`--attributes=dedicated:www-data/web.multi`. + +A wildcard (`*`) may be used for the role portion of the dedicated attribute, which will allow any +owner to elect for a job to run on the host(s). For example: tasks from both +`devcluster/www-data/prod/hello` and `devcluster/vagrant/test/hello` with a dedicated constraint +formatted as `*/web.multi` will be scheduled only on Mesos slaves configured with +`--attributes=dedicated:*/web.multi`. This may be useful when assembling a virtual cluster of +machines sharing the same set of traits or requirements. ##### Example Consider the following slave command line: http://git-wip-us.apache.org/repos/asf/aurora/blob/c5f94e05/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java b/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java index 6300e5f..e700fa3 100644 --- a/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java +++ b/src/main/java/org/apache/aurora/scheduler/configuration/ConfigurationManager.java @@ -224,7 +224,7 @@ public class ConfigurationManager { } String dedicatedRole = getRole(valueConstraint); - if (!config.getJob().getRole().equals(dedicatedRole)) { + if (!("*".equals(dedicatedRole) || config.getJob().getRole().equals(dedicatedRole))) { throw new TaskDescriptionException( "Only " + dedicatedRole + " may use hosts dedicated for that role."); } http://git-wip-us.apache.org/repos/asf/aurora/blob/c5f94e05/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java b/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java index d2789d0..11062e3 100644 --- a/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java +++ b/src/test/java/org/apache/aurora/scheduler/configuration/ConfigurationManagerTest.java @@ -60,13 +60,15 @@ public class ConfigurationManagerTest { private static final ImmutableSet<Container._Fields> ALL_CONTAINER_TYPES = ImmutableSet.of(Container._Fields.DOCKER, Container._Fields.MESOS); + private static final JobKey JOB_KEY = new JobKey("owner-role", "devel", "email_stats"); private static final JobConfiguration UNSANITIZED_JOB_CONFIGURATION = new JobConfiguration() - .setKey(new JobKey("owner-role", "devel", "email_stats")) + .setKey(JOB_KEY) .setCronSchedule("0 2 * * *") .setCronCollisionPolicy(CronCollisionPolicy.KILL_EXISTING) .setInstanceCount(1) .setTaskConfig( new TaskConfig() + .setJob(JOB_KEY) .setIsService(false) .setTaskLinks(ImmutableMap.of()) .setExecutorConfig(new ExecutorConfig("aurora", "config")) @@ -180,6 +182,38 @@ public class ConfigurationManagerTest { assertThat(params, is(ImmutableList.of(IDockerParameter.build(userParameter)))); } + @Test + public void testExclusiveDedicatedRoleAllowed() throws Exception { + TaskConfig builder = UNSANITIZED_JOB_CONFIGURATION.deepCopy().getTaskConfig(); + builder.setConstraints(ImmutableSet.of(new Constraint() + .setName(DEDICATED_ATTRIBUTE) + .setConstraint(TaskConstraint.value( + new ValueConstraint(false, ImmutableSet.of(JOB_KEY.getRole() + "/f")))))); + + configurationManager.validateAndPopulate(ITaskConfig.build(builder)); + } + + @Test + public void testNonExclusiveDedicatedAllowed() throws Exception { + TaskConfig builder = UNSANITIZED_JOB_CONFIGURATION.deepCopy().getTaskConfig(); + builder.setConstraints(ImmutableSet.of(new Constraint() + .setName(DEDICATED_ATTRIBUTE) + .setConstraint(TaskConstraint.value(new ValueConstraint(false, ImmutableSet.of("*/f")))))); + + configurationManager.validateAndPopulate(ITaskConfig.build(builder)); + } + + @Test + public void testExclusiveDedicatedRoleMismatch() throws Exception { + TaskConfig builder = UNSANITIZED_JOB_CONFIGURATION.deepCopy().getTaskConfig(); + builder.setConstraints(ImmutableSet.of(new Constraint() + .setName(DEDICATED_ATTRIBUTE) + .setConstraint(TaskConstraint.value(new ValueConstraint(false, ImmutableSet.of("r/f")))))); + + expectTaskDescriptionException("Only r may use hosts dedicated for that role."); + configurationManager.validateAndPopulate(ITaskConfig.build(builder)); + } + private void expectTaskDescriptionException(String message) { expectedException.expect(TaskDescriptionException.class); expectedException.expectMessage(message);
