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())

Reply via email to