You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ma...@apache.org on 2013/12/13 01:40:53 UTC

[1/5] git commit: Added getRoleSummary call to thrift api.

Updated Branches:
  refs/heads/skarumuri/MESOS-4679_api_jobs_by_role [created] 8badb0f2d


Added getRoleSummary call to thrift api.


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/dd21cb61
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/dd21cb61
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/dd21cb61

Branch: refs/heads/skarumuri/MESOS-4679_api_jobs_by_role
Commit: dd21cb61412b8c0f6818f0eaf48f4150dda8abf1
Parents: b283dc3
Author: Suman Karumuri <sk...@twitter.com>
Authored: Mon Nov 25 16:04:15 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Mon Nov 25 16:04:15 2013 -0800

----------------------------------------------------------------------
 .../thrift/SchedulerThriftInterface.java        | 23 ++++++++++++++++++++
 .../thrift/com/twitter/aurora/gen/api.thrift    | 23 +++++++++++++++++++-
 .../scheduler/thrift/aop/ForwardingThrift.java  |  5 +++++
 3 files changed, 50 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/dd21cb61/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
index 5237a6e..ca90e74 100644
--- a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -369,6 +369,29 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
     return response;
   }
 
+
+  public Response getRoleSummary() {
+//    LoadingCache<String, Role> owners =
+//        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE));
+//
+//    // TODO(William Farner): Render this page without an expensive query.
+//    Set<IScheduledTask> tasks =
+//        Storage.Util.weaklyConsistentFetchTasks(storage, Query.unscoped());
+//    for (ITaskConfig task : Iterables.transform(tasks, Tasks.SCHEDULED_TO_INFO)) {
+//      owners.getUnchecked(task.getOwner().getRole()).accumulate(task);
+//    }
+//
+//    // Add cron job counts for each role.
+//    for (IJobConfiguration job : cronScheduler.getJobs()) {
+//      owners.getUnchecked(job.getOwner().getRole()).accumulate(job);
+//    }
+//
+//    template.setAttribute(
+//        "owners",
+//        DisplayUtils.ROLE_ORDERING.sortedCopy(owners.asMap().values()));
+    return null;
+  }
+
   @Override
   public Response getJobs(@Nullable String maybeNullRole) {
     Optional<String> ownerRole = Optional.fromNullable(maybeNullRole);

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/dd21cb61/src/main/thrift/com/twitter/aurora/gen/api.thrift
----------------------------------------------------------------------
diff --git a/src/main/thrift/com/twitter/aurora/gen/api.thrift b/src/main/thrift/com/twitter/aurora/gen/api.thrift
index 3f8d61d..c7012f8 100644
--- a/src/main/thrift/com/twitter/aurora/gen/api.thrift
+++ b/src/main/thrift/com/twitter/aurora/gen/api.thrift
@@ -356,6 +356,12 @@ struct HostStatus {
   2: MaintenanceMode mode
 }
 
+struct RoleSummary {
+  1: string role
+  2: i32 jobCount
+  3: i32 cronJobCount
+}
+
 struct Hosts {
   1: set<string> hostNames
 }
@@ -384,6 +390,10 @@ struct EndMaintenanceResult {
   1: set<HostStatus> statuses
 }
 
+struct RoleSummaryResult {
+  1: set<RoleSummary> summaries
+}
+
 // Specifies validation level for the populateJobConfig.
 enum JobConfigValidation {
   NONE              = 0   // No additional job config validation would be performed (only parsing).
@@ -403,6 +413,7 @@ union Result {
   11: EndMaintenanceResult endMaintenanceResult
   15: APIVersion getVersionResult
   16: AcquireLockResult acquireLockResult
+  17: RoleSummaryResult roleSummaryResult
 }
 
 struct Response {
@@ -412,10 +423,16 @@ struct Response {
   3: optional Result result
 }
 
+// A service that provides all the read only calls to the Aurora scheduler.
+service ReadOnlyScheduler {
+  // Returns a summary of the jobs grouped by role.
+  Response getRoleSummary()
+}
+
 // Due to assumptions in the client all authenticated RPCs must have a SessionKey as their
 // last argument. Note that the order in this file is what matters, and message numbers should still
 // never be reused.
-service AuroraSchedulerManager {
+service AuroraSchedulerManager extends ReadOnlyScheduler {
   // Creates a new job.  The request will be denied if a job with the provided
   // name already exists in the cluster.
   Response createJob(1: JobConfiguration description, 3: Lock lock, 2: SessionKey session)
@@ -431,9 +448,11 @@ service AuroraSchedulerManager {
   // Restarts a batch of shards.
   Response restartShards(5: JobKey job, 3: set<i32> shardIds, 6: Lock lock 4: SessionKey session)
 
+  // TODO(Suman Karumuri): Move this call into read only api
   // Fetches the status of tasks.
   Response getTasksStatus(1: TaskQuery query)
 
+  // TODO(Suman Karumuri): Move this call into the read only api
   // Fetches the status of jobs.
   // ownerRole is optional, in which case all jobs are returned.
   Response getJobs(1: string ownerRole)
@@ -441,9 +460,11 @@ service AuroraSchedulerManager {
   // Initiates a kill on tasks.
   Response killTasks(1: TaskQuery query, 3: Lock lock, 2: SessionKey session)
 
+  // TODO(Suman Karumuri): Move this call into the read only api
   // Fetches the quota allocated for a user.
   Response getQuota(1: string ownerRole)
 
+  // TODO(Suman Karumuri): Move this call into the read only api
   // Returns the current version of the API implementation
   Response getVersion()
 

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/dd21cb61/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java b/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
index 7c5100b..b76c92b 100644
--- a/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
+++ b/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
@@ -107,6 +107,11 @@ abstract class ForwardingThrift implements AuroraAdmin.Iface {
   }
 
   @Override
+  public Response getRoleSummary() throws TException {
+    return delegate.getRoleSummary();
+  }
+
+  @Override
   public Response createJob(JobConfiguration description, Lock lock, SessionKey session)
       throws TException {
 


[5/5] git commit: Renamed getRoleSummary to getJobSummary.

Posted by ma...@apache.org.
Renamed getRoleSummary to getJobSummary.


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/8badb0f2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/8badb0f2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/8badb0f2

Branch: refs/heads/skarumuri/MESOS-4679_api_jobs_by_role
Commit: 8badb0f2d950f638faa4c737e2ed24e9f25e0b24
Parents: 80dd60d
Author: Suman Karumuri <sk...@twitter.com>
Authored: Wed Dec 4 17:31:29 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Wed Dec 4 17:50:27 2013 -0800

----------------------------------------------------------------------
 .../thrift/SchedulerThriftInterface.java        | 45 ++++++++++----------
 .../thrift/com/twitter/aurora/gen/api.thrift    | 10 ++---
 .../thrift/SchedulerThriftInterfaceTest.java    | 14 +++---
 .../scheduler/thrift/aop/ForwardingThrift.java  |  4 +-
 4 files changed, 36 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/8badb0f2/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
index d6af11f..705a926 100644
--- a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -66,6 +66,8 @@ import com.twitter.aurora.gen.JobConfigRewrite;
 import com.twitter.aurora.gen.JobConfigValidation;
 import com.twitter.aurora.gen.JobConfiguration;
 import com.twitter.aurora.gen.JobKey;
+import com.twitter.aurora.gen.JobSummary;
+import com.twitter.aurora.gen.JobSummaryResult;
 import com.twitter.aurora.gen.ListBackupsResult;
 import com.twitter.aurora.gen.Lock;
 import com.twitter.aurora.gen.LockKey;
@@ -78,8 +80,6 @@ import com.twitter.aurora.gen.Response;
 import com.twitter.aurora.gen.ResponseCode;
 import com.twitter.aurora.gen.Result;
 import com.twitter.aurora.gen.RewriteConfigsRequest;
-import com.twitter.aurora.gen.RoleSummary;
-import com.twitter.aurora.gen.RoleSummaryResult;
 import com.twitter.aurora.gen.ScheduleStatus;
 import com.twitter.aurora.gen.ScheduleStatusResult;
 import com.twitter.aurora.gen.SessionKey;
@@ -376,45 +376,44 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
   }
 
   @Override
-  public Response getRoleSummary() {
-    final Function<String, RoleSummary> CREATE_ROLE_SUMMARY = new Function<String, RoleSummary>() {
-      @Override public RoleSummary apply(String ownerRole) {
-        RoleSummary role = new RoleSummary();
-        role.setRole(ownerRole);
-        role.setCronJobCount(0);
-        role.setJobCount(0);
-        return role;
+  public Response getJobSummary() {
+    final Function<String, JobSummary> CREATE_JOB_SUMMARY = new Function<String, JobSummary>() {
+      @Override public JobSummary apply(String ownerRole) {
+        JobSummary summary = new JobSummary();
+        summary.setRole(ownerRole);
+        summary.setCronJobCount(0);
+        summary.setJobCount(0);
+        return summary;
       }
     };
 
-    final Ordering<RoleSummary> ROLE_ORDERING = Ordering.natural().onResultOf(
-        new Function<RoleSummary, String>() {
-          @Override public String apply(RoleSummary role) {
-            return role.getRole();
+    final Ordering<JobSummary> JOB_ORDERING = Ordering.natural().onResultOf(
+        new Function<JobSummary, String>() {
+          @Override public String apply(JobSummary jobSummary) {
+            return jobSummary.getRole();
           }
         });
 
     // TODO(Suman Karumuri): Respond to this request without an expensive query.
-    LoadingCache<String, RoleSummary> roleSummaries =
-        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE_SUMMARY));
+    LoadingCache<String, JobSummary> jobSummaries =
+        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_JOB_SUMMARY));
 
     Set<IScheduledTask> tasks =
         Storage.Util.weaklyConsistentFetchTasks(storage, Query.unscoped());
     for (ITaskConfig task : Iterables.transform(tasks, Tasks.SCHEDULED_TO_INFO)) {
-      RoleSummary roleSummary = roleSummaries.getUnchecked(task.getOwner().getRole());
-      roleSummary.setJobCount(roleSummary.getJobCount() + 1);
+      JobSummary jobSummary = jobSummaries.getUnchecked(task.getOwner().getRole());
+      jobSummary.setJobCount(jobSummary.getJobCount() + 1);
     }
 
-    // Add cron job counts for each role.
     for (IJobConfiguration job : cronJobManager.getJobs()) {
-      RoleSummary roleSummary = roleSummaries.getUnchecked(job.getOwner().getRole());
-      roleSummary.setCronJobCount(roleSummary.getCronJobCount() + 1);
+      JobSummary jobSummary = jobSummaries.getUnchecked(job.getOwner().getRole());
+      jobSummary.setCronJobCount(jobSummary.getCronJobCount() + 1);
     }
 
     return new Response()
         .setResponseCode(OK)
-        .setResult(Result.roleSummaryResult(
-            new RoleSummaryResult(ROLE_ORDERING.sortedCopy(roleSummaries.asMap().values()))));
+        .setResult(Result.jobSummaryResult(
+            new JobSummaryResult(JOB_ORDERING.sortedCopy(jobSummaries.asMap().values()))));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/8badb0f2/src/main/thrift/com/twitter/aurora/gen/api.thrift
----------------------------------------------------------------------
diff --git a/src/main/thrift/com/twitter/aurora/gen/api.thrift b/src/main/thrift/com/twitter/aurora/gen/api.thrift
index 5d6532c..836e38b 100644
--- a/src/main/thrift/com/twitter/aurora/gen/api.thrift
+++ b/src/main/thrift/com/twitter/aurora/gen/api.thrift
@@ -356,7 +356,7 @@ struct HostStatus {
   2: MaintenanceMode mode
 }
 
-struct RoleSummary {
+struct JobSummary {
   1: string role
   2: i32 jobCount
   3: i32 cronJobCount
@@ -390,8 +390,8 @@ struct EndMaintenanceResult {
   1: set<HostStatus> statuses
 }
 
-struct RoleSummaryResult {
-  1: list<RoleSummary> summaries
+struct JobSummaryResult {
+  1: list<JobSummary> summaries
 }
 
 // Specifies validation level for the populateJobConfig.
@@ -413,7 +413,7 @@ union Result {
   11: EndMaintenanceResult endMaintenanceResult
   15: APIVersion getVersionResult
   16: AcquireLockResult acquireLockResult
-  17: RoleSummaryResult roleSummaryResult
+  17: JobSummaryResult jobSummaryResult
 }
 
 struct Response {
@@ -426,7 +426,7 @@ struct Response {
 // A service that provides all the read only calls to the Aurora scheduler.
 service ReadOnlyScheduler {
   // Returns a summary of the jobs grouped by role.
-  Response getRoleSummary()
+  Response getJobSummary()
 }
 
 // Due to assumptions in the client all authenticated RPCs must have a SessionKey as their

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/8badb0f2/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
index 30a3969..826f1a9 100644
--- a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
+++ b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
@@ -50,6 +50,8 @@ import com.twitter.aurora.gen.JobConfigRewrite;
 import com.twitter.aurora.gen.JobConfigValidation;
 import com.twitter.aurora.gen.JobConfiguration;
 import com.twitter.aurora.gen.JobKey;
+import com.twitter.aurora.gen.JobSummary;
+import com.twitter.aurora.gen.JobSummaryResult;
 import com.twitter.aurora.gen.LimitConstraint;
 import com.twitter.aurora.gen.Lock;
 import com.twitter.aurora.gen.LockKey;
@@ -57,8 +59,6 @@ import com.twitter.aurora.gen.Quota;
 import com.twitter.aurora.gen.Response;
 import com.twitter.aurora.gen.ResponseCode;
 import com.twitter.aurora.gen.RewriteConfigsRequest;
-import com.twitter.aurora.gen.RoleSummary;
-import com.twitter.aurora.gen.RoleSummaryResult;
 import com.twitter.aurora.gen.ScheduleStatus;
 import com.twitter.aurora.gen.ScheduledTask;
 import com.twitter.aurora.gen.SessionKey;
@@ -1082,17 +1082,17 @@ public class SchedulerThriftInterfaceTest extends EasyMockTest {
     storageUtil.expectTaskFetch(Query.unscoped(), immediateTask, immediateTaskTwo);
     expect(cronJobManager.getJobs()).andReturn(IJobConfiguration.setFromBuilders(crons));
 
-    RoleSummaryResult expectedResult = new RoleSummaryResult();
+    JobSummaryResult expectedResult = new JobSummaryResult();
     expectedResult.addToSummaries(
-        new RoleSummary().setRole(ROLE).setCronJobCount(2).setJobCount(1));
+        new JobSummary().setRole(ROLE).setCronJobCount(2).setJobCount(1));
     expectedResult.addToSummaries(
-        new RoleSummary().setRole(BAZ_ROLE).setCronJobCount(1).setJobCount(1));
+        new JobSummary().setRole(BAZ_ROLE).setCronJobCount(1).setJobCount(1));
 
     control.replay();
 
-    Response response = thrift.getRoleSummary();
+    Response response = thrift.getJobSummary();
     assertEquals(ResponseCode.OK, response.getResponseCode());
-    assertEquals(expectedResult, response.getResult().getRoleSummaryResult());
+    assertEquals(expectedResult, response.getResult().getJobSummaryResult());
   }
 
   @Test

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/8badb0f2/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java b/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
index b76c92b..37c0da2 100644
--- a/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
+++ b/src/test/java/com/twitter/aurora/scheduler/thrift/aop/ForwardingThrift.java
@@ -107,8 +107,8 @@ abstract class ForwardingThrift implements AuroraAdmin.Iface {
   }
 
   @Override
-  public Response getRoleSummary() throws TException {
-    return delegate.getRoleSummary();
+  public Response getJobSummary() throws TException {
+    return delegate.getJobSummary();
   }
 
   @Override


[3/5] git commit: Added a unit test.

Posted by ma...@apache.org.
Added a unit test. <Breaks>


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/78e45bfc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/78e45bfc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/78e45bfc

Branch: refs/heads/skarumuri/MESOS-4679_api_jobs_by_role
Commit: 78e45bfcd5dadeda112f10049c4db415010f924c
Parents: 9a94695
Author: Suman Karumuri <sk...@twitter.com>
Authored: Tue Nov 26 16:14:49 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Tue Nov 26 16:14:49 2013 -0800

----------------------------------------------------------------------
 .../thrift/SchedulerThriftInterface.java        |  4 +--
 .../thrift/SchedulerThriftInterfaceTest.java    | 33 ++++++++++++++++++++
 2 files changed, 35 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/78e45bfc/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
index 317d685..d6af11f 100644
--- a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -377,7 +377,7 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
 
   @Override
   public Response getRoleSummary() {
-    final Function<String, RoleSummary> CREATE_ROLE = new Function<String, RoleSummary>() {
+    final Function<String, RoleSummary> CREATE_ROLE_SUMMARY = new Function<String, RoleSummary>() {
       @Override public RoleSummary apply(String ownerRole) {
         RoleSummary role = new RoleSummary();
         role.setRole(ownerRole);
@@ -396,7 +396,7 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
 
     // TODO(Suman Karumuri): Respond to this request without an expensive query.
     LoadingCache<String, RoleSummary> roleSummaries =
-        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE));
+        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE_SUMMARY));
 
     Set<IScheduledTask> tasks =
         Storage.Util.weaklyConsistentFetchTasks(storage, Query.unscoped());

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/78e45bfc/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
index 1f3cd6e..4debbcc 100644
--- a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
+++ b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
@@ -1034,6 +1034,39 @@ public class SchedulerThriftInterfaceTest extends EasyMockTest {
   }
 
   @Test
+  public void testGetRoleSummary() throws Exception {
+    JobConfiguration cronJobOne = makeJob()
+        .setCronSchedule("1 * * * *")
+        .setKey(JOB_KEY.newBuilder())
+        .setTaskConfig(nonProductionTask());
+    JobKey jobKey2 = JOB_KEY.newBuilder().setRole("other_role");
+    JobConfiguration cronJobTwo = makeJob()
+        .setCronSchedule("2 * * * *")
+        .setKey(jobKey2)
+        .setTaskConfig(nonProductionTask());
+    TaskConfig immediateTaskConfig = defaultTask(false)
+        .setJobName("immediate")
+        .setOwner(ROLE_IDENTITY);
+    IScheduledTask immediateTask = IScheduledTask.build(new ScheduledTask()
+        .setAssignedTask(
+            new AssignedTask().setTask(immediateTaskConfig)));
+    JobConfiguration immediateJob = new JobConfiguration()
+        .setKey(JOB_KEY.newBuilder().setName("immediate"))
+        .setOwner(ROLE_IDENTITY)
+        .setInstanceCount(1)
+        .setTaskConfig(immediateTaskConfig);
+
+    Set<JobConfiguration> crons = ImmutableSet.of(cronJobOne, cronJobTwo);
+    expect(cronJobManager.getJobs()).andReturn(IJobConfiguration.setFromBuilders(crons));
+    storageUtil.expectTaskFetch(Query.unscoped().active(), immediateTask);
+
+    control.replay();
+
+    Response response = thrift.getRoleSummary();
+    assertEquals(ResponseCode.OK, response.getResponseCode());
+  }
+
+  @Test
   public void testSnapshot() throws Exception {
     expectAuth(ROOT, false);
 


[4/5] git commit: Finally a realistic test.

Posted by ma...@apache.org.
Finally a realistic test.


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/80dd60d3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/80dd60d3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/80dd60d3

Branch: refs/heads/skarumuri/MESOS-4679_api_jobs_by_role
Commit: 80dd60d3c54a58d9bd1c923a05e692c2b8e50e41
Parents: 78e45bf
Author: Suman Karumuri <sk...@twitter.com>
Authored: Wed Dec 4 16:51:10 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Wed Dec 4 17:02:42 2013 -0800

----------------------------------------------------------------------
 .../thrift/SchedulerThriftInterfaceTest.java    | 41 +++++++++++++++++---
 1 file changed, 35 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/80dd60d3/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
index 4debbcc..30a3969 100644
--- a/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
+++ b/src/test/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterfaceTest.java
@@ -57,6 +57,8 @@ import com.twitter.aurora.gen.Quota;
 import com.twitter.aurora.gen.Response;
 import com.twitter.aurora.gen.ResponseCode;
 import com.twitter.aurora.gen.RewriteConfigsRequest;
+import com.twitter.aurora.gen.RoleSummary;
+import com.twitter.aurora.gen.RoleSummaryResult;
 import com.twitter.aurora.gen.ScheduleStatus;
 import com.twitter.aurora.gen.ScheduledTask;
 import com.twitter.aurora.gen.SessionKey;
@@ -1035,35 +1037,62 @@ public class SchedulerThriftInterfaceTest extends EasyMockTest {
 
   @Test
   public void testGetRoleSummary() throws Exception {
+    final String BAZ_ROLE = "baz_role";
+    final Identity BAZ_ROLE_IDENTITY = new Identity(BAZ_ROLE, USER);
+
     JobConfiguration cronJobOne = makeJob()
         .setCronSchedule("1 * * * *")
         .setKey(JOB_KEY.newBuilder())
         .setTaskConfig(nonProductionTask());
-    JobKey jobKey2 = JOB_KEY.newBuilder().setRole("other_role");
     JobConfiguration cronJobTwo = makeJob()
         .setCronSchedule("2 * * * *")
-        .setKey(jobKey2)
+        .setKey(JOB_KEY.newBuilder().setRole("other_role"))
         .setTaskConfig(nonProductionTask());
+
+    JobConfiguration cronJobThree = makeJob()
+        .setCronSchedule("3 * * * *")
+        .setKey(JOB_KEY.newBuilder().setRole(BAZ_ROLE))
+        .setTaskConfig(nonProductionTask())
+        .setOwner(BAZ_ROLE_IDENTITY);
+
+    Set<JobConfiguration> crons = ImmutableSet.of(cronJobOne, cronJobTwo, cronJobThree);
+
     TaskConfig immediateTaskConfig = defaultTask(false)
         .setJobName("immediate")
         .setOwner(ROLE_IDENTITY);
     IScheduledTask immediateTask = IScheduledTask.build(new ScheduledTask()
-        .setAssignedTask(
-            new AssignedTask().setTask(immediateTaskConfig)));
+        .setAssignedTask(new AssignedTask().setTask(immediateTaskConfig)));
     JobConfiguration immediateJob = new JobConfiguration()
         .setKey(JOB_KEY.newBuilder().setName("immediate"))
         .setOwner(ROLE_IDENTITY)
         .setInstanceCount(1)
         .setTaskConfig(immediateTaskConfig);
 
-    Set<JobConfiguration> crons = ImmutableSet.of(cronJobOne, cronJobTwo);
+    TaskConfig immediateTaskConfigTwo = defaultTask(false)
+        .setJobName("immediateTwo")
+        .setOwner(BAZ_ROLE_IDENTITY);
+    IScheduledTask immediateTaskTwo = IScheduledTask.build(new ScheduledTask()
+        .setAssignedTask(new AssignedTask().setTask(immediateTaskConfigTwo)));
+    JobConfiguration immediateJob2 = new JobConfiguration()
+        .setKey(JOB_KEY.newBuilder().setName("immediateTwo"))
+        .setOwner(BAZ_ROLE_IDENTITY)
+        .setInstanceCount(1)
+        .setTaskConfig(immediateTaskConfigTwo);
+
+    storageUtil.expectTaskFetch(Query.unscoped(), immediateTask, immediateTaskTwo);
     expect(cronJobManager.getJobs()).andReturn(IJobConfiguration.setFromBuilders(crons));
-    storageUtil.expectTaskFetch(Query.unscoped().active(), immediateTask);
+
+    RoleSummaryResult expectedResult = new RoleSummaryResult();
+    expectedResult.addToSummaries(
+        new RoleSummary().setRole(ROLE).setCronJobCount(2).setJobCount(1));
+    expectedResult.addToSummaries(
+        new RoleSummary().setRole(BAZ_ROLE).setCronJobCount(1).setJobCount(1));
 
     control.replay();
 
     Response response = thrift.getRoleSummary();
     assertEquals(ResponseCode.OK, response.getResponseCode());
+    assertEquals(expectedResult, response.getResult().getRoleSummaryResult());
   }
 
   @Test


[2/5] git commit: Fleshed out the getRoleSummary call.

Posted by ma...@apache.org.
Fleshed out the getRoleSummary call.


Project: http://git-wip-us.apache.org/repos/asf/incubator-aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-aurora/commit/9a946952
Tree: http://git-wip-us.apache.org/repos/asf/incubator-aurora/tree/9a946952
Diff: http://git-wip-us.apache.org/repos/asf/incubator-aurora/diff/9a946952

Branch: refs/heads/skarumuri/MESOS-4679_api_jobs_by_role
Commit: 9a94695261e62e21761e21d0cb70d07c887fa698
Parents: dd21cb6
Author: Suman Karumuri <sk...@twitter.com>
Authored: Mon Nov 25 21:03:16 2013 -0800
Committer: Suman Karumuri <sk...@twitter.com>
Committed: Mon Nov 25 21:03:16 2013 -0800

----------------------------------------------------------------------
 .../thrift/SchedulerThriftInterface.java        | 65 ++++++++++++++------
 .../thrift/com/twitter/aurora/gen/api.thrift    |  2 +-
 2 files changed, 46 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9a946952/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
index ca90e74..317d685 100644
--- a/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
+++ b/src/main/java/com/twitter/aurora/scheduler/thrift/SchedulerThriftInterface.java
@@ -33,6 +33,9 @@ import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.base.Throwables;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
@@ -40,6 +43,7 @@ import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.Ordering;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -74,6 +78,8 @@ import com.twitter.aurora.gen.Response;
 import com.twitter.aurora.gen.ResponseCode;
 import com.twitter.aurora.gen.Result;
 import com.twitter.aurora.gen.RewriteConfigsRequest;
+import com.twitter.aurora.gen.RoleSummary;
+import com.twitter.aurora.gen.RoleSummaryResult;
 import com.twitter.aurora.gen.ScheduleStatus;
 import com.twitter.aurora.gen.ScheduleStatusResult;
 import com.twitter.aurora.gen.SessionKey;
@@ -369,27 +375,46 @@ class SchedulerThriftInterface implements AuroraAdmin.Iface {
     return response;
   }
 
-
+  @Override
   public Response getRoleSummary() {
-//    LoadingCache<String, Role> owners =
-//        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE));
-//
-//    // TODO(William Farner): Render this page without an expensive query.
-//    Set<IScheduledTask> tasks =
-//        Storage.Util.weaklyConsistentFetchTasks(storage, Query.unscoped());
-//    for (ITaskConfig task : Iterables.transform(tasks, Tasks.SCHEDULED_TO_INFO)) {
-//      owners.getUnchecked(task.getOwner().getRole()).accumulate(task);
-//    }
-//
-//    // Add cron job counts for each role.
-//    for (IJobConfiguration job : cronScheduler.getJobs()) {
-//      owners.getUnchecked(job.getOwner().getRole()).accumulate(job);
-//    }
-//
-//    template.setAttribute(
-//        "owners",
-//        DisplayUtils.ROLE_ORDERING.sortedCopy(owners.asMap().values()));
-    return null;
+    final Function<String, RoleSummary> CREATE_ROLE = new Function<String, RoleSummary>() {
+      @Override public RoleSummary apply(String ownerRole) {
+        RoleSummary role = new RoleSummary();
+        role.setRole(ownerRole);
+        role.setCronJobCount(0);
+        role.setJobCount(0);
+        return role;
+      }
+    };
+
+    final Ordering<RoleSummary> ROLE_ORDERING = Ordering.natural().onResultOf(
+        new Function<RoleSummary, String>() {
+          @Override public String apply(RoleSummary role) {
+            return role.getRole();
+          }
+        });
+
+    // TODO(Suman Karumuri): Respond to this request without an expensive query.
+    LoadingCache<String, RoleSummary> roleSummaries =
+        CacheBuilder.newBuilder().build(CacheLoader.from(CREATE_ROLE));
+
+    Set<IScheduledTask> tasks =
+        Storage.Util.weaklyConsistentFetchTasks(storage, Query.unscoped());
+    for (ITaskConfig task : Iterables.transform(tasks, Tasks.SCHEDULED_TO_INFO)) {
+      RoleSummary roleSummary = roleSummaries.getUnchecked(task.getOwner().getRole());
+      roleSummary.setJobCount(roleSummary.getJobCount() + 1);
+    }
+
+    // Add cron job counts for each role.
+    for (IJobConfiguration job : cronJobManager.getJobs()) {
+      RoleSummary roleSummary = roleSummaries.getUnchecked(job.getOwner().getRole());
+      roleSummary.setCronJobCount(roleSummary.getCronJobCount() + 1);
+    }
+
+    return new Response()
+        .setResponseCode(OK)
+        .setResult(Result.roleSummaryResult(
+            new RoleSummaryResult(ROLE_ORDERING.sortedCopy(roleSummaries.asMap().values()))));
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/9a946952/src/main/thrift/com/twitter/aurora/gen/api.thrift
----------------------------------------------------------------------
diff --git a/src/main/thrift/com/twitter/aurora/gen/api.thrift b/src/main/thrift/com/twitter/aurora/gen/api.thrift
index c7012f8..5d6532c 100644
--- a/src/main/thrift/com/twitter/aurora/gen/api.thrift
+++ b/src/main/thrift/com/twitter/aurora/gen/api.thrift
@@ -391,7 +391,7 @@ struct EndMaintenanceResult {
 }
 
 struct RoleSummaryResult {
-  1: set<RoleSummary> summaries
+  1: list<RoleSummary> summaries
 }
 
 // Specifies validation level for the populateJobConfig.