You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by ke...@apache.org on 2014/05/30 20:12:56 UTC

git commit: AURORA-478: Fix /cron endpoint.

Repository: incubator-aurora
Updated Branches:
  refs/heads/master fd14fed46 -> 135459758


AURORA-478: Fix /cron endpoint.

Testing Done:
./gradlew -Pq build

./gradlew run
curl -s http://localhost:8081/cron | python -m json.tool

Bugs closed: AURORA-478

Reviewed at https://reviews.apache.org/r/22065/


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

Branch: refs/heads/master
Commit: 135459758d55d5d89e127e9eab06d03d236d2c0c
Parents: fd14fed
Author: Kevin Sweeney <ke...@apache.org>
Authored: Fri May 30 10:34:56 2014 -0700
Committer: Kevin Sweeney <ke...@apache.org>
Committed: Fri May 30 10:35:02 2014 -0700

----------------------------------------------------------------------
 .../cron/quartz/CronJobManagerImpl.java         | 14 +++--
 .../org/apache/aurora/scheduler/http/Cron.java  | 12 ++--
 .../cron/quartz/CronJobManagerImplTest.java     | 11 ++--
 .../apache/aurora/scheduler/http/CronTest.java  | 59 ++++++++++++++++++++
 4 files changed, 84 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/13545975/src/main/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImpl.java b/src/main/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImpl.java
index 3359425..9eda3b7 100644
--- a/src/main/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImpl.java
+++ b/src/main/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImpl.java
@@ -22,6 +22,7 @@ import javax.inject.Inject;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Throwables;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.aurora.gen.CronCollisionPolicy;
@@ -36,7 +37,7 @@ import org.apache.aurora.scheduler.storage.Storage.MutateWork;
 import org.apache.aurora.scheduler.storage.Storage.Work;
 import org.apache.aurora.scheduler.storage.entities.IJobConfiguration;
 import org.apache.aurora.scheduler.storage.entities.IJobKey;
-import org.quartz.JobDetail;
+import org.quartz.CronTrigger;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
@@ -240,10 +241,15 @@ class CronJobManagerImpl implements CronJobManager {
     ImmutableMap.Builder<IJobKey, CrontabEntry> scheduledJobs = ImmutableMap.builder();
     try {
       for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.<JobKey>anyGroup())) {
-        Optional<JobDetail> jobDetail = Optional.fromNullable(scheduler.getJobDetail(jobKey));
-        if (jobDetail.isPresent()) {
+        // The quartz API allows jobs to have multiple triggers. We don't use that feature but
+        // we're defensive here since this function is used for debugging.
+        Optional<CronTrigger> trigger = FluentIterable.from(scheduler.getTriggersOfJob(jobKey))
+            .filter(CronTrigger.class)
+            .first();
+        if (trigger.isPresent()) {
           scheduledJobs.put(
-              Quartz.auroraJobKey(jobKey), CrontabEntry.parse(jobDetail.get().getDescription()));
+              Quartz.auroraJobKey(jobKey),
+              Quartz.crontabEntry(trigger.get()));
         }
       }
     } catch (SchedulerException e) {

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/13545975/src/main/java/org/apache/aurora/scheduler/http/Cron.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/aurora/scheduler/http/Cron.java b/src/main/java/org/apache/aurora/scheduler/http/Cron.java
index 6ccf583..fd658e1 100644
--- a/src/main/java/org/apache/aurora/scheduler/http/Cron.java
+++ b/src/main/java/org/apache/aurora/scheduler/http/Cron.java
@@ -24,7 +24,10 @@ import javax.ws.rs.core.Response;
 
 import com.google.common.collect.ImmutableMap;
 
+import org.apache.aurora.scheduler.base.JobKeys;
 import org.apache.aurora.scheduler.cron.CronJobManager;
+import org.apache.aurora.scheduler.cron.CrontabEntry;
+import org.apache.aurora.scheduler.storage.entities.IJobKey;
 
 /**
  * HTTP interface to dump state of the internal cron scheduler.
@@ -46,10 +49,11 @@ public class Cron {
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   public Response dumpContents() {
-    Map<String, Object> response = ImmutableMap.<String, Object>builder()
-        .put("scheduled", cronManager.getScheduledJobs())
-        .build();
+    ImmutableMap.Builder<String, String> scheduled = ImmutableMap.builder();
+    for (Map.Entry<IJobKey, CrontabEntry> entry : cronManager.getScheduledJobs().entrySet()) {
+      scheduled.put(JobKeys.canonicalString(entry.getKey()), entry.getValue().toString());
+    }
 
-   return Response.ok(response).build();
+    return Response.ok(ImmutableMap.<String, Object>of("scheduled", scheduled.build())).build();
   }
 }

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/13545975/src/test/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImplTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImplTest.java b/src/test/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImplTest.java
index efa0a58..d56c36c 100644
--- a/src/test/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImplTest.java
+++ b/src/test/java/org/apache/aurora/scheduler/cron/quartz/CronJobManagerImplTest.java
@@ -14,6 +14,7 @@
 package org.apache.aurora.scheduler.cron.quartz;
 
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 
@@ -35,6 +36,7 @@ import org.apache.aurora.scheduler.storage.mem.MemStorage;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
+import org.quartz.CronTrigger;
 import org.quartz.JobDetail;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
@@ -183,12 +185,13 @@ public class CronJobManagerImplTest extends EasyMockTest {
 
   @Test
   public void testGetScheduledJobs() throws Exception {
-    JobDetail jobDetail = createMock(JobDetail.class);
+    CronTrigger cronTrigger = createMock(CronTrigger.class);
     expect(scheduler.getJobKeys(EasyMock.<GroupMatcher<JobKey>>anyObject()))
         .andReturn(ImmutableSet.of(QuartzTestUtil.QUARTZ_JOB_KEY));
-    expect(scheduler.getJobDetail(QuartzTestUtil.QUARTZ_JOB_KEY))
-        .andReturn(jobDetail);
-    expect(jobDetail.getDescription()).andReturn("* * * * *");
+    EasyMock.
+        <List<? extends Trigger>>expect(scheduler.getTriggersOfJob(QuartzTestUtil.QUARTZ_JOB_KEY))
+        .andReturn(ImmutableList.of(cronTrigger));
+    expect(cronTrigger.getDescription()).andReturn("* * * * *");
 
     control.replay();
 

http://git-wip-us.apache.org/repos/asf/incubator-aurora/blob/13545975/src/test/java/org/apache/aurora/scheduler/http/CronTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/aurora/scheduler/http/CronTest.java b/src/test/java/org/apache/aurora/scheduler/http/CronTest.java
new file mode 100644
index 0000000..6171daf
--- /dev/null
+++ b/src/test/java/org/apache/aurora/scheduler/http/CronTest.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.aurora.scheduler.http;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.Response;
+
+import com.google.common.collect.ImmutableMap;
+import com.twitter.common.testing.easymock.EasyMockTest;
+
+import org.apache.aurora.scheduler.base.JobKeys;
+import org.apache.aurora.scheduler.cron.CronJobManager;
+import org.apache.aurora.scheduler.cron.CrontabEntry;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.easymock.EasyMock.expect;
+import static org.junit.Assert.assertEquals;
+
+public class CronTest extends EasyMockTest {
+  private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+
+  private CronJobManager cronJobManager;
+
+  private Cron cron;
+
+  @Before
+  public void setUp() {
+    cronJobManager = createMock(CronJobManager.class);
+
+    cron = new Cron(cronJobManager);
+  }
+
+  @Test
+  public void testDumpContents() throws Exception {
+    expect(cronJobManager.getScheduledJobs()).andReturn(ImmutableMap.of(
+        JobKeys.from("test", "test", "test"), CrontabEntry.parse("* * * * *")));
+
+    control.replay();
+
+    Response response = cron.dumpContents();
+    assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+    assertEquals(
+        "{\"scheduled\":{\"test/test/test\":\"* * * * *\"}}",
+        OBJECT_MAPPER.writeValueAsString(response.getEntity()));
+  }
+}