Repository: aurora Updated Branches: refs/heads/master f0ff1c4fb -> 795a2728c
Extend getJobUpdateDetails to accept JobUpdateQuery This extends getJobUpdateDetails to return a list of details instead of being scoped to a single update. Bugs closed: AURORA-1764 Reviewed at https://reviews.apache.org/r/51712/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/795a2728 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/795a2728 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/795a2728 Branch: refs/heads/master Commit: 795a2728c623c35bd509d582c24684a6921c74ad Parents: f0ff1c4 Author: Zameer Manji <[email protected]> Authored: Tue Sep 13 12:45:17 2016 -0700 Committer: Zameer Manji <[email protected]> Committed: Tue Sep 13 12:45:17 2016 -0700 ---------------------------------------------------------------------- RELEASE-NOTES.md | 1 + .../thrift/org/apache/aurora/gen/api.thrift | 5 ++- .../scheduler/thrift/ReadOnlySchedulerImpl.java | 27 +++++++++++++--- .../thrift/SchedulerThriftInterface.java | 4 +-- .../python/apache/aurora/client/api/__init__.py | 4 ++- .../python/apache/aurora/client/cli/update.py | 11 ++++++- .../resources/scheduler/assets/js/services.js | 7 +++-- .../thrift/ReadOnlySchedulerImplTest.java | 33 +++++++++++++++++--- .../python/apache/aurora/client/api/test_api.py | 3 +- .../apache/aurora/client/cli/test_supdate.py | 3 +- 10 files changed, 80 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/RELEASE-NOTES.md ---------------------------------------------------------------------- diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 4476d52..b947c23 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -48,6 +48,7 @@ It will be removed from Mesos in a future release. - The scheduler flag `-zk_use_curator` has been deprecated. If you have never set the flag and are upgrading you should take care as described in the [note](#zk_use_curator_upgrade) above. +- The `key` argument of `getJobUpdateDetails` has been deprecated. Use the `query` argument instead. 0.15.0 ====== http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/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 c5765b7..3f7079d 100644 --- a/api/src/main/thrift/org/apache/aurora/gen/api.thrift +++ b/api/src/main/thrift/org/apache/aurora/gen/api.thrift @@ -896,7 +896,9 @@ struct GetJobUpdateSummariesResult { /** Result of the getJobUpdateDetails call. */ struct GetJobUpdateDetailsResult { + // TODO(zmanji): Remove this once we complete AURORA-1765 1: JobUpdateDetails details + 2: list<JobUpdateDetails> detailsList } /** Result of the pulseJobUpdate call. */ @@ -1022,7 +1024,8 @@ service ReadOnlyScheduler { Response getJobUpdateSummaries(1: JobUpdateQuery jobUpdateQuery) /** Gets job update details. */ - Response getJobUpdateDetails(1: JobUpdateKey key) + // TODO(zmanji): `key` is deprecated, remove this with AURORA-1765 + Response getJobUpdateDetails(1: JobUpdateKey key, 2: JobUpdateQuery query) /** Gets the diff between client (desired) and server (current) job states. */ Response getJobUpdateDiff(1: JobUpdateRequest request) http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/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 4202f0e..bba1161 100644 --- a/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java +++ b/src/main/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImpl.java @@ -108,6 +108,7 @@ import static org.apache.aurora.gen.ResponseCode.INVALID_REQUEST; import static org.apache.aurora.scheduler.base.Numbers.convertRanges; import static org.apache.aurora.scheduler.base.Numbers.toRanges; import static org.apache.aurora.scheduler.resources.ResourceManager.aggregateFromBag; +import static org.apache.aurora.scheduler.thrift.Responses.addMessage; import static org.apache.aurora.scheduler.thrift.Responses.error; import static org.apache.aurora.scheduler.thrift.Responses.invalidRequest; import static org.apache.aurora.scheduler.thrift.Responses.ok; @@ -315,14 +316,30 @@ class ReadOnlySchedulerImpl implements ReadOnlyScheduler.Iface { } @Override - public Response getJobUpdateDetails(JobUpdateKey mutableKey) { + public Response getJobUpdateDetails(JobUpdateKey mutableKey, JobUpdateQuery mutableQuery) { + if (mutableKey == null && mutableQuery == null) { + return error("Either key or query must be set."); + } + + if (mutableQuery != null) { + IJobUpdateQuery query = IJobUpdateQuery.build(mutableQuery); + + List<IJobUpdateDetails> details = storage.read(storeProvider -> + storeProvider.getJobUpdateStore().fetchJobUpdateDetails(query)); + + return ok(Result.getJobUpdateDetailsResult(new GetJobUpdateDetailsResult() + .setDetailsList(IJobUpdateDetails.toBuildersList(details)))); + } + + // TODO(zmanji): Remove this code once `mutableKey` is removed in AURORA-1765 IJobUpdateKey key = IJobUpdateKey.build(mutableKey); - Optional<IJobUpdateDetails> details = - storage.read(storeProvider -> storeProvider.getJobUpdateStore().fetchJobUpdateDetails(key)); + Optional<IJobUpdateDetails> details = storage.read(storeProvider -> + storeProvider.getJobUpdateStore().fetchJobUpdateDetails(key)); if (details.isPresent()) { - return ok(Result.getJobUpdateDetailsResult( - new GetJobUpdateDetailsResult().setDetails(details.get().newBuilder()))); + return addMessage(ok(Result.getJobUpdateDetailsResult( + new GetJobUpdateDetailsResult().setDetails(details.get().newBuilder()))), + "The key argument is deprecated, use the query argument instead"); } else { return invalidRequest("Invalid update: " + key); } http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/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 929d021..cd18d0d 100644 --- a/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java +++ b/src/main/java/org/apache/aurora/scheduler/thrift/SchedulerThriftInterface.java @@ -1003,8 +1003,8 @@ class SchedulerThriftInterface implements AnnotatedAuroraAdmin { } @Override - public Response getJobUpdateDetails(JobUpdateKey key) throws TException { - return readOnlyScheduler.getJobUpdateDetails(key); + public Response getJobUpdateDetails(JobUpdateKey key, JobUpdateQuery query) throws TException { + return readOnlyScheduler.getJobUpdateDetails(key, query); } private static IJobUpdateKey validateJobUpdateKey(JobUpdateKey mutableKey) { http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/src/main/python/apache/aurora/client/api/__init__.py ---------------------------------------------------------------------- diff --git a/src/main/python/apache/aurora/client/api/__init__.py b/src/main/python/apache/aurora/client/api/__init__.py index 9149c30..05b9c3b 100644 --- a/src/main/python/apache/aurora/client/api/__init__.py +++ b/src/main/python/apache/aurora/client/api/__init__.py @@ -261,7 +261,9 @@ class AuroraClientAPI(object): if not isinstance(key, JobUpdateKey): raise self.TypeError('Invalid key %r: expected %s but got %s' % (key, JobUpdateKey.__name__, key.__class__.__name__)) - return self._scheduler_proxy.getJobUpdateDetails(key) + + query = JobUpdateQuery(key=key) + return self._scheduler_proxy.getJobUpdateDetails(key, query) def restart(self, job_key, instances, restart_settings): """Perform a rolling restart of the job. http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/src/main/python/apache/aurora/client/cli/update.py ---------------------------------------------------------------------- diff --git a/src/main/python/apache/aurora/client/cli/update.py b/src/main/python/apache/aurora/client/cli/update.py index d23243d..a634c44 100644 --- a/src/main/python/apache/aurora/client/cli/update.py +++ b/src/main/python/apache/aurora/client/cli/update.py @@ -526,7 +526,16 @@ class UpdateInfo(Verb): api = context.get_api(context.options.jobspec.cluster) response = api.get_job_update_details(key) context.log_response_and_raise(response) - details = response.result.getJobUpdateDetailsResult.details + detailsList = response.result.getJobUpdateDetailsResult.detailsList + if detailsList is not None: + if len(detailsList) == 0: + context.print_err("There is no update for key: %s" % key) + return EXIT_INVALID_PARAMETER + + details = detailsList[0] + else: + details = response.result.getJobUpdateDetailsResult.details + if context.options.write_json: result = { "updateId": ("%s" % details.update.summary.key.id), http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/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 315fc17..0818fc2 100644 --- a/src/main/resources/scheduler/assets/js/services.js +++ b/src/main/resources/scheduler/assets/js/services.js @@ -167,10 +167,13 @@ getJobUpdateDetails: function (updateKey) { return async(function (deferred) { - auroraClient.getSchedulerClient().getJobUpdateDetails(updateKey, function (response) { + var schedulerClient = auroraClient.getSchedulerClient(); + var query = new JobUpdateQuery(); + query.key = updateKey; + schedulerClient.getJobUpdateDetails(null, query, function (response) { var result = auroraClient.processResponse(response); result.details = response.result !== null ? - response.result.getJobUpdateDetailsResult.details : {}; + response.result.getJobUpdateDetailsResult.detailsList[0] : {}; deferred.resolve(result); }); }); http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/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 a7d1f74..7935432 100644 --- a/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java +++ b/src/test/java/org/apache/aurora/scheduler/thrift/ReadOnlySchedulerImplTest.java @@ -17,6 +17,7 @@ import java.util.Date; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import javax.annotation.Nullable; import com.google.common.base.Function; @@ -601,10 +602,27 @@ public class ReadOnlySchedulerImplTest extends EasyMockTest { control.replay(); - Response response = assertOkResponse(thrift.getJobUpdateDetails(UPDATE_KEY.newBuilder())); + Response response = assertOkResponse(thrift.getJobUpdateDetails(UPDATE_KEY.newBuilder(), null)); assertEquals( IJobUpdateDetails.build(details), IJobUpdateDetails.build(response.getResult().getGetJobUpdateDetailsResult().getDetails())); + // Specifying the UPDATE_KEY alone is deprecated, so there should be a message. + assertEquals(1, response.getDetailsSize()); + } + + @Test + public void testGetJobUpdateDetailsQuery() throws Exception { + JobUpdateQuery query = new JobUpdateQuery().setRole(ROLE); + List<IJobUpdateDetails> details = IJobUpdateDetails.listFromBuilders(createJobUpdateDetails(5)); + expect(storageUtil.jobUpdateStore.fetchJobUpdateDetails(IJobUpdateQuery.build(query))) + .andReturn(details); + + control.replay(); + + Response response = assertOkResponse(thrift.getJobUpdateDetails(null, query)); + assertEquals( + IJobUpdateDetails.toBuildersList(details), + response.getResult().getGetJobUpdateDetailsResult().getDetailsList()); } private static List<JobUpdateSummary> createJobUpdateSummaries(int count) { @@ -617,9 +635,16 @@ public class ReadOnlySchedulerImplTest extends EasyMockTest { return builder.build(); } + private static List<JobUpdateDetails> createJobUpdateDetails(int count) { + List<JobUpdateSummary> summaries = createJobUpdateSummaries(count); + return summaries.stream() + .map(jobUpdateSummary -> + new JobUpdateDetails().setUpdate(new JobUpdate().setSummary(jobUpdateSummary))) + .collect(Collectors.toList()); + } + private static JobUpdateDetails createJobUpdateDetails() { - return new JobUpdateDetails() - .setUpdate(new JobUpdate().setSummary(createJobUpdateSummaries(1).get(0))); + return createJobUpdateDetails(1).get(0); } @Test @@ -706,7 +731,7 @@ public class ReadOnlySchedulerImplTest extends EasyMockTest { control.replay(); - assertResponse(INVALID_REQUEST, thrift.getJobUpdateDetails(UPDATE_KEY.newBuilder())); + assertResponse(INVALID_REQUEST, thrift.getJobUpdateDetails(UPDATE_KEY.newBuilder(), null)); } @Test http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/src/test/python/apache/aurora/client/api/test_api.py ---------------------------------------------------------------------- diff --git a/src/test/python/apache/aurora/client/api/test_api.py b/src/test/python/apache/aurora/client/api/test_api.py index 7a0797d..f1579b5 100644 --- a/src/test/python/apache/aurora/client/api/test_api.py +++ b/src/test/python/apache/aurora/client/api/test_api.py @@ -190,7 +190,8 @@ class TestJobUpdateApis(unittest.TestCase): api, mock_proxy = self.mock_api() key = JobUpdateKey(job=JobKey(role="role", environment="env", name="name"), id="id") api.get_job_update_details(key) - mock_proxy.getJobUpdateDetails.assert_called_once_with(key) + query = JobUpdateQuery(key=key) + mock_proxy.getJobUpdateDetails.assert_called_once_with(key, query) def test_set_quota(self): """Test setting quota.""" http://git-wip-us.apache.org/repos/asf/aurora/blob/795a2728/src/test/python/apache/aurora/client/cli/test_supdate.py ---------------------------------------------------------------------- diff --git a/src/test/python/apache/aurora/client/cli/test_supdate.py b/src/test/python/apache/aurora/client/cli/test_supdate.py index 92fb039..2dfee1f 100644 --- a/src/test/python/apache/aurora/client/cli/test_supdate.py +++ b/src/test/python/apache/aurora/client/cli/test_supdate.py @@ -553,7 +553,8 @@ class TestUpdateInfo(AuroraClientCommandTest): instanceId=2, timestampMs=9000, action=JobUpdateAction.INSTANCE_UPDATED)]) - query_response.result.getJobUpdateDetailsResult = GetJobUpdateDetailsResult(details=details) + query_response.result.getJobUpdateDetailsResult = GetJobUpdateDetailsResult( + detailsList=[details]) return query_response def test_active_update_info(self):
