Repository: aurora Updated Branches: refs/heads/master 8816d49a4 -> f630bf705
Converting to Range in ConfigGroup thrift. Reviewed at https://reviews.apache.org/r/39150/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/f630bf70 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/f630bf70 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/f630bf70 Branch: refs/heads/master Commit: f630bf705ac8a9de2b7b987858ada3b876f65abf Parents: 8816d49 Author: Maxim Khutornenko <[email protected]> Authored: Fri Oct 9 11:05:11 2015 -0700 Committer: Maxim Khutornenko <[email protected]> Committed: Fri Oct 9 11:05:11 2015 -0700 ---------------------------------------------------------------------- NEWS | 1 + .../thrift/org/apache/aurora/gen/api.thrift | 3 +- .../apache/aurora/scheduler/base/Numbers.java | 15 ++++ .../scheduler/thrift/ReadOnlySchedulerImpl.java | 6 +- .../thrift/SchedulerThriftInterface.java | 18 +++-- .../scheduler/assets/js/controllers.js | 8 +-- .../resources/scheduler/assets/js/services.js | 73 -------------------- .../thrift/ReadOnlySchedulerImplTest.java | 9 ++- 8 files changed, 42 insertions(+), 91 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/NEWS ---------------------------------------------------------------------- diff --git a/NEWS b/NEWS index 2edcea6..7622f9d 100644 --- a/NEWS +++ b/NEWS @@ -14,6 +14,7 @@ https://github.com/apache/mesos/blob/ebcf8cc2f2f6c236f6e9315447c247e6348141e1/docs/getting-started.md for more details on Mesos runtime dependencies. - Resource quota is no longer consumed by production jobs with a dedicated constraint (AURORA-1457). +- Thrift ConfigGroup.instanceIds field has been deprecated. Use ConfigGroup.instances instead. 0.9.0 ----- http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/api/src/main/thrift/org/apache/aurora/gen/api.thrift ---------------------------------------------------------------------- diff --git a/api/src/main/thrift/org/apache/aurora/gen/api.thrift b/api/src/main/thrift/org/apache/aurora/gen/api.thrift index a04e644..f56d7bd 100644 --- a/api/src/main/thrift/org/apache/aurora/gen/api.thrift +++ b/api/src/main/thrift/org/apache/aurora/gen/api.thrift @@ -348,7 +348,8 @@ struct Range { struct ConfigGroup { 1: TaskConfig config - 2: set<i32> instanceIds // TODO(maxim): change it to use list<Range> instead. + 2: set<i32> instanceIds //TODO(maxim): deprecated. Remove in AURORA-1519. + 3: set<Range> instances } struct ConfigSummary { http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/base/Numbers.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java index 5c1bdb4..703ca3b 100644 --- a/src/main/java/org/apache/aurora/scheduler/base/Numbers.java +++ b/src/main/java/org/apache/aurora/scheduler/base/Numbers.java @@ -23,6 +23,7 @@ import com.google.common.collect.PeekingIterator; import com.google.common.collect.Range; import com.google.common.collect.Sets; +import org.apache.aurora.GuavaUtils; import org.apache.aurora.scheduler.storage.entities.IRange; /** @@ -93,4 +94,18 @@ public final class Numbers { return instanceIds.build().asSet(DiscreteDomain.integers()); } + + /** + * Converts set of instance ranges to a set of {@link IRange}. + * + * @param ranges Instance ranges to convert. + * @return A set of {@link IRange}. + */ + public static Set<IRange> convertRanges(Set<Range<Integer>> ranges) { + return ranges.stream() + .map(range -> IRange.build(new org.apache.aurora.gen.Range( + range.lowerEndpoint(), + range.upperEndpoint()))) + .collect(GuavaUtils.toImmutableSet()); + } } http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java b/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java index 13b5c22..c09130b 100644 --- a/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java +++ b/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java @@ -91,12 +91,15 @@ import org.apache.aurora.scheduler.storage.entities.IJobUpdateKey; import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery; import org.apache.aurora.scheduler.storage.entities.IJobUpdateSummary; import org.apache.aurora.scheduler.storage.entities.ILock; +import org.apache.aurora.scheduler.storage.entities.IRange; import org.apache.aurora.scheduler.storage.entities.IScheduledTask; import org.apache.aurora.scheduler.storage.entities.ITaskConfig; import org.apache.thrift.TException; import static java.util.Objects.requireNonNull; +import static org.apache.aurora.scheduler.base.Numbers.convertRanges; +import static org.apache.aurora.scheduler.base.Numbers.toRanges; import static org.apache.aurora.scheduler.thrift.Responses.invalidRequest; import static org.apache.aurora.scheduler.thrift.Responses.ok; @@ -107,7 +110,8 @@ class ReadOnlySchedulerImpl implements ReadOnlyScheduler.Iface { public ConfigGroup apply(Entry<ITaskConfig, Collection<Integer>> input) { return new ConfigGroup( input.getKey().newBuilder(), - ImmutableSet.copyOf(input.getValue())); + ImmutableSet.copyOf(input.getValue()), + IRange.toBuildersSet(convertRanges(toRanges(input.getValue())))); } }; http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java index fd07365..4efcd2c 100644 --- a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java +++ b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java @@ -36,7 +36,6 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Range; -import org.apache.aurora.GuavaUtils; import org.apache.aurora.auth.CapabilityValidator; import org.apache.aurora.auth.CapabilityValidator.AuditCheck; import org.apache.aurora.auth.SessionValidator.AuthFailedException; @@ -119,6 +118,7 @@ import org.apache.aurora.scheduler.storage.entities.IJobUpdateRequest; import org.apache.aurora.scheduler.storage.entities.IJobUpdateSettings; import org.apache.aurora.scheduler.storage.entities.ILock; import org.apache.aurora.scheduler.storage.entities.ILockKey; +import org.apache.aurora.scheduler.storage.entities.IRange; import org.apache.aurora.scheduler.storage.entities.IResourceAggregate; import org.apache.aurora.scheduler.storage.entities.IScheduledTask; import org.apache.aurora.scheduler.storage.entities.ITaskConfig; @@ -146,6 +146,8 @@ import static org.apache.aurora.gen.ResponseCode.INVALID_REQUEST; import static org.apache.aurora.gen.ResponseCode.LOCK_ERROR; import static org.apache.aurora.gen.ResponseCode.OK; import static org.apache.aurora.gen.ResponseCode.WARNING; +import static org.apache.aurora.scheduler.base.Numbers.convertRanges; +import static org.apache.aurora.scheduler.base.Numbers.toRanges; import static org.apache.aurora.scheduler.base.Tasks.ACTIVE_STATES; import static org.apache.aurora.scheduler.quota.QuotaCheckResult.Result.INSUFFICIENT_QUOTA; import static org.apache.aurora.scheduler.thrift.Responses.addMessage; @@ -1069,12 +1071,6 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin { } } - private static Set<org.apache.aurora.gen.Range> convertRanges(Set<Range<Integer>> ranges) { - return ranges.stream() - .map(range -> new org.apache.aurora.gen.Range(range.lowerEndpoint(), range.upperEndpoint())) - .collect(GuavaUtils.toImmutableSet()); - } - private static Set<InstanceTaskConfig> buildInitialState(Map<Integer, ITaskConfig> tasks) { // Translate tasks into instance IDs. Multimap<ITaskConfig, Integer> instancesByConfig = HashMultimap.create(); @@ -1088,7 +1084,7 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin { for (Map.Entry<ITaskConfig, Set<Range<Integer>>> entry : rangesByConfig.entrySet()) { builder.add(new InstanceTaskConfig() .setTask(entry.getKey().newBuilder()) - .setInstances(convertRanges(entry.getValue()))); + .setInstances(IRange.toBuildersSet(convertRanges(entry.getValue())))); } return builder.build(); @@ -1185,11 +1181,13 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin { JobUpdateInstructions instructions = new JobUpdateInstructions() .setSettings(settings.newBuilder()) .setInitialState(buildInitialState(diff.getReplacedInstances())); - if (!diff.getReplacementInstances().isEmpty()) { + + Set<Integer> replacements = diff.getReplacementInstances(); + if (!replacements.isEmpty()) { instructions.setDesiredState( new InstanceTaskConfig() .setTask(request.getTaskConfig().newBuilder()) - .setInstances(convertRanges(Numbers.toRanges(diff.getReplacementInstances())))); + .setInstances(IRange.toBuildersSet(convertRanges(toRanges(replacements))))); } IJobUpdate update = IJobUpdate.build(new JobUpdate() http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/resources/scheduler/assets/js/controllers.js ---------------------------------------------------------------------- diff --git a/src/main/resources/scheduler/assets/js/controllers.js b/src/main/resources/scheduler/assets/js/controllers.js index 85ae8ce..dff6645 100644 --- a/src/main/resources/scheduler/assets/js/controllers.js +++ b/src/main/resources/scheduler/assets/js/controllers.js @@ -401,15 +401,15 @@ ]; var total = _.reduce(response.groups, function (m, n) { - return m + n.instanceIds.length; + return m + updateUtil.instanceCountFromRanges(n.instances); }, 0); $scope.groupSummary = response.groups.map(function (group, i) { - var count = group.instanceIds.length; + var count = updateUtil.instanceCountFromRanges(group.instances); var percentage = (count / total) * 100; - var ranges = taskUtil.toRanges(group.instanceIds).map(function (r) { - return (r.start === r.end) ? r.start : r.start + '-' + r.end; + var ranges = group.instances.map(function (r) { + return (r.first === r.last) ? r.first : r.first + '-' + r.last; }); return { http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/main/resources/scheduler/assets/js/services.js ---------------------------------------------------------------------- diff --git a/src/main/resources/scheduler/assets/js/services.js b/src/main/resources/scheduler/assets/js/services.js index b7699fe..f9e8580 100644 --- a/src/main/resources/scheduler/assets/js/services.js +++ b/src/main/resources/scheduler/assets/js/services.js @@ -272,13 +272,6 @@ JobUpdateAction.INSTANCE_UPDATED ]); - var INSTANCE_TERMINAL = toSet([ - JobUpdateAction.INSTANCE_UPDATED, - JobUpdateAction.INSTANCE_ROLLED_BACK, - JobUpdateAction.INSTANCE_UPDATE_FAILED, - JobUpdateAction.INSTANCE_ROLLBACK_FAILED - ]); - var instanceActionLookup = _.invert(JobUpdateAction); var updateUtil = { @@ -291,9 +284,6 @@ isInstanceSuccessful: function (action) { return INSTANCE_SUCCESSFUL.hasOwnProperty(action); }, - isInstanceTerminal: function (action) { - return INSTANCE_TERMINAL.hasOwnProperty(action); - }, instanceCountFromRanges: function (ranges) { // add the deltas of remaining ranges // note - we don't check for overlapping ranges here @@ -317,18 +307,6 @@ getInProgressQuery: function () { return updateUtil.getStatusQuery(ACTIVE_JOB_UPDATE_STATES); }, - instanceCountFromConfigs: function (instanceTaskConfigs) { - var flattenedRanges = []; - - // get all ranges - instanceTaskConfigs.forEach(function (iTaskConfig) { - iTaskConfig.instances.forEach(function (range) { - flattenedRanges.push(range); - }); - }); - - return updateUtil.instanceCountFromRanges(flattenedRanges); - }, progressFromEvents: function (instanceEvents) { var successful = updateUtil.getLatestInstanceEvents(instanceEvents, function (e) { return updateUtil.isInstanceSuccessful(e.action); @@ -448,39 +426,6 @@ 'taskUtil', function () { var taskUtil = { - // Given a list of tasks, group tasks with identical task configs and belonging to - // contiguous instance ids together. - summarizeActiveTaskConfigs: function (tasks) { - return _.chain(tasks) - .filter(taskUtil.isActiveTask) - .map(function (task) { - return { - instanceId: task.assignedTask.instanceId, - schedulingDetail: taskUtil.configToDetails(task.assignedTask.task) - }; - }) - .groupBy(function (task) { - return JSON.stringify(task.schedulingDetail); - }) - .map(function (tasks) { - // Given a list of tasks with the same task config, group the tasks into ranges where - // each range consists of consecutive task ids along with their task config. - var schedulingDetail = _.first(tasks).schedulingDetail; - var ranges = taskUtil.toRanges(_.pluck(tasks, 'instanceId')); - return _.map(ranges, function (range) { - return { - range: range, - schedulingDetail: schedulingDetail - }; - }); - }) - .flatten(true) - .sortBy(function (scheduleDetail) { - return scheduleDetail.range.start; - }) - .value(); - }, - configToDetails: function (task) { var constraints = _.chain(task.constraints) .sortBy(function (constraint) { @@ -520,24 +465,6 @@ }; }, - // Given a list of instanceIds, group them into contiguous ranges. - toRanges: function (instanceIds) { - instanceIds = _.sortBy(instanceIds); - var ranges = []; - var i = 0; - var start = instanceIds[i]; - while (i < instanceIds.length) { - if ((i + 1 === instanceIds.length) || (instanceIds[i] + 1 !== instanceIds[i + 1])) { - ranges.push({start: start, end: instanceIds[i]}); - i++; - start = instanceIds[i]; - } else { - i++; - } - } - return ranges; - }, - // A function that converts a task constraint into a string formatConstraint: function (constraint) { var taskConstraint = constraint.constraint; http://git-wip-us.apache.org/repos/asf/aurora/blob/f630bf70/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java b/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java index 64cbd5b..82e7330 100644 --- a/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java +++ b/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java @@ -74,6 +74,7 @@ import org.apache.aurora.scheduler.storage.entities.IJobKey; import org.apache.aurora.scheduler.storage.entities.IJobUpdateDetails; import org.apache.aurora.scheduler.storage.entities.IJobUpdateQuery; import org.apache.aurora.scheduler.storage.entities.IJobUpdateSummary; +import org.apache.aurora.scheduler.storage.entities.IRange; import org.apache.aurora.scheduler.storage.entities.IResponse; import org.apache.aurora.scheduler.storage.entities.IScheduledTask; import org.apache.aurora.scheduler.storage.entities.ITaskConfig; @@ -86,6 +87,8 @@ import static org.apache.aurora.scheduler.ResourceAggregates.LARGE; import static org.apache.aurora.scheduler.ResourceAggregates.MEDIUM; import static org.apache.aurora.scheduler.ResourceAggregates.SMALL; import static org.apache.aurora.scheduler.ResourceAggregates.XLARGE; +import static org.apache.aurora.scheduler.base.Numbers.convertRanges; +import static org.apache.aurora.scheduler.base.Numbers.toRanges; import static org.apache.aurora.scheduler.thrift.Fixtures.CRON_SCHEDULE; import static org.apache.aurora.scheduler.thrift.Fixtures.JOB_KEY; import static org.apache.aurora.scheduler.thrift.Fixtures.LOCK; @@ -520,10 +523,12 @@ public class ReadOnlySchedulerImplTest extends EasyMockTest { ConfigGroup group1 = new ConfigGroup() .setConfig(firstGroupTask) - .setInstanceIds(Sets.newHashSet(0, 1)); + .setInstanceIds(Sets.newHashSet(0, 1)) + .setInstances(IRange.toBuildersSet(convertRanges(toRanges(ImmutableSet.of(0, 1))))); ConfigGroup group2 = new ConfigGroup() .setConfig(secondGroupTask) - .setInstanceIds(Sets.newHashSet(2)); + .setInstanceIds(Sets.newHashSet(2)) + .setInstances(IRange.toBuildersSet(convertRanges(toRanges(ImmutableSet.of(2))))); ConfigSummary summary = new ConfigSummary() .setKey(key.newBuilder())
