Repository: aurora Updated Branches: refs/heads/master f6146eb5e -> 8a5dcacdc
Added ExclusionStrategy to Gson formatter in structdump This hides thrift metadata fields such as "__isset_bitfield" and the "optionals" enum. Added a FieldNamingStrategy to rename "value_" and "setName_" fields to "value" and "key" on map formatting. Reviewed at https://reviews.apache.org/r/65076/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/8a5dcacd Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/8a5dcacd Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/8a5dcacd Branch: refs/heads/master Commit: 8a5dcacdc73ab0468e1097d549bbf4e77d0096db Parents: f6146eb Author: Juan Manuel Fresia <jfre...@medallia.com> Authored: Wed Jan 17 15:02:26 2018 -0800 Committer: Bill Farner <wfar...@apache.org> Committed: Wed Jan 17 15:02:26 2018 -0800 ---------------------------------------------------------------------- .../aurora/scheduler/http/StructDump.java | 27 +++++- .../aurora/scheduler/http/StructDumpTest.java | 91 ++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/8a5dcacd/src/main/java/org/apache/aurora/scheduler/http/StructDump.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/http/StructDump.java b/src/main/java/org/apache/aurora/scheduler/http/StructDump.java index 1710e39..9e74301 100644 --- a/src/main/java/org/apache/aurora/scheduler/http/StructDump.java +++ b/src/main/java/org/apache/aurora/scheduler/http/StructDump.java @@ -24,6 +24,8 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -100,7 +102,30 @@ public class StructDump extends JerseyTemplateServlet { .map(IJobConfiguration::newBuilder)); } - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static final Gson GSON = new GsonBuilder() + .setPrettyPrinting() + .setExclusionStrategies(new ExclusionStrategy() { + @Override + public boolean shouldSkipField(FieldAttributes f) { + if (f.getName().startsWith("_")) { + return true; + } + return f.getDeclaredClass().getName().contains("$_Fields"); + } + + @Override + public boolean shouldSkipClass(Class<?> clazz) { + return false; + } + }) + .setFieldNamingStrategy(f -> { + switch (f.getName()) { + case "setField_": return "key"; + case "value_": return "value"; + default: return f.getName(); + } + }) + .create(); private Response dumpEntity(String id, Quiet<Optional<? extends TBase<?, ?>>> work) { return fillTemplate(template -> { http://git-wip-us.apache.org/repos/asf/aurora/blob/8a5dcacd/src/test/java/org/apache/aurora/scheduler/http/StructDumpTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/aurora/scheduler/http/StructDumpTest.java b/src/test/java/org/apache/aurora/scheduler/http/StructDumpTest.java new file mode 100644 index 0000000..8bd8319 --- /dev/null +++ b/src/test/java/org/apache/aurora/scheduler/http/StructDumpTest.java @@ -0,0 +1,91 @@ +/** + * 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 com.google.common.collect.ImmutableSet; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.ClientResponse.Status; + +import org.apache.aurora.gen.AssignedTask; +import org.apache.aurora.gen.Resource; +import org.apache.aurora.gen.ScheduleStatus; +import org.apache.aurora.gen.ScheduledTask; +import org.apache.aurora.gen.TaskConfig; +import org.apache.aurora.scheduler.storage.entities.IScheduledTask; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +public class StructDumpTest extends AbstractJettyTest { + + private static final String SLAVE_HOST = "fakehost"; + private static final String FAKE_TASKID = "fake-task-id"; + + private static final IScheduledTask TASK = IScheduledTask.build( + new ScheduledTask() + .setStatus(ScheduleStatus.RUNNING) + .setAssignedTask( + new AssignedTask() + .setTaskId(FAKE_TASKID) + .setTask(new TaskConfig() + .setResources(ImmutableSet.of( + Resource.numCpus(1), + Resource.ramMb(4000), + Resource.diskMb(10000) + ))) + .setSlaveHost(SLAVE_HOST))); + + @Test + public void testGetUsage() { + replayAndStart(); + + ClientResponse response = getPlainRequestBuilder("/structdump") + .get(ClientResponse.class); + + assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + } + + @Test + public void testTaskConfigDoesNotIncludeMetadata() { + storage.expectOperations(); + storage.expectTaskFetch(FAKE_TASKID, TASK); + + replayAndStart(); + + ClientResponse response = getPlainRequestBuilder("/structdump/task/" + FAKE_TASKID) + .get(ClientResponse.class); + + String htmlResponse = response.getEntity(String.class); + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + assertFalse(htmlResponse.contains("__isset_bitfield")); + } + + @Test + public void testTaskConfigFieldRename() { + storage.expectOperations(); + storage.expectTaskFetch(FAKE_TASKID, TASK); + + replayAndStart(); + + ClientResponse response = getPlainRequestBuilder("/structdump/task/" + FAKE_TASKID) + .get(ClientResponse.class); + + String htmlResponse = response.getEntity(String.class); + + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + assertFalse(htmlResponse.contains("setField_")); + assertFalse(htmlResponse.contains("value_")); + } +}