http://git-wip-us.apache.org/repos/asf/hadoop/blob/d78b452a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServices.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServices.java index 549cfe1..472b93c 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServices.java @@ -36,6 +36,7 @@ import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response.Status; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.authentication.server.AuthenticationFilter; @@ -44,6 +45,8 @@ import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities; import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity; import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent; import org.apache.hadoop.yarn.api.records.timeline.TimelineEvents; +import org.apache.hadoop.yarn.api.records.timeline.TimelineDomain; +import org.apache.hadoop.yarn.api.records.timeline.TimelineDomains; import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse; import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse.TimelinePutError; import org.apache.hadoop.yarn.conf.YarnConfiguration; @@ -69,7 +72,6 @@ import com.sun.jersey.guice.spi.container.servlet.GuiceContainer; import com.sun.jersey.test.framework.JerseyTest; import com.sun.jersey.test.framework.WebAppDescriptor; - public class TestTimelineWebServices extends JerseyTest { private static TimelineStore store; @@ -85,7 +87,7 @@ public class TestTimelineWebServices extends JerseyTest { bind(YarnJacksonJaxbJsonProvider.class); bind(TimelineWebServices.class); bind(GenericExceptionHandler.class); - try{ + try { store = mockTimelineStore(); } catch (Exception e) { Assert.fail(); @@ -100,7 +102,8 @@ public class TestTimelineWebServices extends JerseyTest { new TimelineDataManager(store, timelineACLsManager); bind(TimelineDataManager.class).toInstance(timelineDataManager); serve("/*").with(GuiceContainer.class); - TimelineAuthenticationFilter taFilter = new TimelineAuthenticationFilter(); + TimelineAuthenticationFilter taFilter = + new TimelineAuthenticationFilter(); FilterConfig filterConfig = mock(FilterConfig.class); when(filterConfig.getInitParameter(AuthenticationFilter.CONFIG_PREFIX)) .thenReturn(null); @@ -159,7 +162,8 @@ public class TestTimelineWebServices extends JerseyTest { .filterClass(com.google.inject.servlet.GuiceFilter.class) .contextPath("jersey-guice-filter") .servletPath("/") - .clientConfig(new DefaultClientConfig(YarnJacksonJaxbJsonProvider.class)) + .clientConfig( + new DefaultClientConfig(YarnJacksonJaxbJsonProvider.class)) .build()); } @@ -277,7 +281,7 @@ public class TestTimelineWebServices extends JerseyTest { WebResource r = resource(); ClientResponse response = r.path("ws").path("v1").path("timeline") .path("type_1").queryParam("primaryFilter", - "long:" + Long.toString((long)Integer.MAX_VALUE + 1l)) + "long:" + Long.toString((long) Integer.MAX_VALUE + 1l)) .accept(MediaType.APPLICATION_JSON) .get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); @@ -406,7 +410,8 @@ public class TestTimelineWebServices extends JerseyTest { TimelineEntities entities = new TimelineEntities(); TimelineEntity entity = new TimelineEntity(); Map<String, Set<Object>> filters = new HashMap<String, Set<Object>>(); - filters.put(TimelineStore.SystemFilter.ENTITY_OWNER.toString(), new HashSet<Object>()); + filters.put(TimelineStore.SystemFilter.ENTITY_OWNER.toString(), + new HashSet<Object>()); entity.setPrimaryFilters(filters); entity.setEntityId("test id 6"); entity.setEntityType("test type 6"); @@ -418,13 +423,15 @@ public class TestTimelineWebServices extends JerseyTest { .accept(MediaType.APPLICATION_JSON) .type(MediaType.APPLICATION_JSON) .post(ClientResponse.class, entities); - TimelinePutResponse putResposne = response.getEntity(TimelinePutResponse.class); + TimelinePutResponse putResposne = + response.getEntity(TimelinePutResponse.class); Assert.assertEquals(1, putResposne.getErrors().size()); List<TimelinePutError> errors = putResposne.getErrors(); - Assert.assertEquals(TimelinePutResponse.TimelinePutError.SYSTEM_FILTER_CONFLICT, - errors.get(0).getErrorCode()); + Assert.assertEquals( + TimelinePutResponse.TimelinePutError.SYSTEM_FILTER_CONFLICT, + errors.get(0).getErrorCode()); } - + @Test public void testPostEntities() throws Exception { TimelineEntities entities = new TimelineEntities(); @@ -449,7 +456,8 @@ public class TestTimelineWebServices extends JerseyTest { .type(MediaType.APPLICATION_JSON) .post(ClientResponse.class, entities); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - TimelinePutResponse putResposne = response.getEntity(TimelinePutResponse.class); + TimelinePutResponse putResposne = + response.getEntity(TimelinePutResponse.class); Assert.assertNotNull(putResposne); Assert.assertEquals(0, putResposne.getErrors().size()); // verify the entity exists in the store @@ -482,7 +490,8 @@ public class TestTimelineWebServices extends JerseyTest { .type(MediaType.APPLICATION_JSON) .post(ClientResponse.class, entities); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - TimelinePutResponse putResponse = response.getEntity(TimelinePutResponse.class); + TimelinePutResponse putResponse = + response.getEntity(TimelinePutResponse.class); Assert.assertNotNull(putResponse); Assert.assertEquals(0, putResponse.getErrors().size()); @@ -668,4 +677,202 @@ public class TestTimelineWebServices extends JerseyTest { } } + @Test + public void testGetDomain() throws Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("timeline") + .path("domain").path("domain_id_1") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + TimelineDomain domain = response.getEntity(TimelineDomain.class); + verifyDomain(domain, "domain_id_1", true); + } + + @Test + public void testGetDomainYarnACLsEnabled() { + AdminACLsManager oldAdminACLsManager = + timelineACLsManager.setAdminACLsManager(adminACLsManager); + try { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("timeline") + .path("domain").path("domain_id_1") + .queryParam("user.name", "owner_1") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + TimelineDomain domain = response.getEntity(TimelineDomain.class); + verifyDomain(domain, "domain_id_1", true); + + response = r.path("ws").path("v1").path("timeline") + .path("domain").path("domain_id_1") + .queryParam("user.name", "tester") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + domain = response.getEntity(TimelineDomain.class); + verifyDomain(domain, "domain_id_1", false); + } finally { + timelineACLsManager.setAdminACLsManager(oldAdminACLsManager); + } + } + + @Test + public void testGetDomains() throws Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("timeline") + .path("domain") + .queryParam("owner", "owner_1") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + TimelineDomains domains = response.getEntity(TimelineDomains.class); + Assert.assertEquals(2, domains.getDomains().size()); + for (int i = 0; i < domains.getDomains().size(); ++i) { + verifyDomain(domains.getDomains().get(i), + i == 0 ? "domain_id_4" : "domain_id_1", true); + } + } + + @Test + public void testGetDomainsYarnACLsEnabled() throws Exception { + AdminACLsManager oldAdminACLsManager = + timelineACLsManager.setAdminACLsManager(adminACLsManager); + try { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("timeline") + .path("domain") + .queryParam("user.name", "owner_1") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + TimelineDomains domains = response.getEntity(TimelineDomains.class); + Assert.assertEquals(2, domains.getDomains().size()); + for (int i = 0; i < domains.getDomains().size(); ++i) { + verifyDomain(domains.getDomains().get(i), + i == 0 ? "domain_id_4" : "domain_id_1", true); + } + + response = r.path("ws").path("v1").path("timeline") + .path("domain") + .queryParam("owner", "owner_1") + .queryParam("user.name", "tester") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + domains = response.getEntity(TimelineDomains.class); + Assert.assertEquals(2, domains.getDomains().size()); + for (int i = 0; i < domains.getDomains().size(); ++i) { + verifyDomain(domains.getDomains().get(i), + i == 0 ? "domain_id_4" : "domain_id_1", false); + } + } finally { + timelineACLsManager.setAdminACLsManager(oldAdminACLsManager); + } + } + + @Test + public void testPutDomain() throws Exception { + TimelineDomain domain = new TimelineDomain(); + domain.setId("test_domain_id"); + WebResource r = resource(); + // No owner, will be rejected + ClientResponse response = r.path("ws").path("v1") + .path("timeline").path("domain") + .accept(MediaType.APPLICATION_JSON) + .type(MediaType.APPLICATION_JSON) + .put(ClientResponse.class, domain); + assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + assertEquals(ClientResponse.Status.FORBIDDEN, + response.getClientResponseStatus()); + + response = r.path("ws").path("v1") + .path("timeline").path("domain") + .queryParam("user.name", "tester") + .accept(MediaType.APPLICATION_JSON) + .type(MediaType.APPLICATION_JSON) + .put(ClientResponse.class, domain); + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + + // Verify the domain exists + response = r.path("ws").path("v1").path("timeline") + .path("domain").path("test_domain_id") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + domain = response.getEntity(TimelineDomain.class); + Assert.assertNotNull(domain); + Assert.assertEquals("test_domain_id", domain.getId()); + Assert.assertEquals("tester", domain.getOwner()); + Assert.assertEquals(null, domain.getDescription()); + + // Update the domain + domain.setDescription("test_description"); + response = r.path("ws").path("v1") + .path("timeline").path("domain") + .queryParam("user.name", "tester") + .accept(MediaType.APPLICATION_JSON) + .type(MediaType.APPLICATION_JSON) + .put(ClientResponse.class, domain); + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + + // Verify the domain is updated + response = r.path("ws").path("v1").path("timeline") + .path("domain").path("test_domain_id") + .accept(MediaType.APPLICATION_JSON) + .get(ClientResponse.class); + Assert.assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + domain = response.getEntity(TimelineDomain.class); + Assert.assertNotNull(domain); + Assert.assertEquals("test_domain_id", domain.getId()); + Assert.assertEquals("test_description", domain.getDescription()); + } + + @Test + public void testPutDomainYarnACLsEnabled() throws Exception { + AdminACLsManager oldAdminACLsManager = + timelineACLsManager.setAdminACLsManager(adminACLsManager); + try { + TimelineDomain domain = new TimelineDomain(); + domain.setId("test_domain_id_acl"); + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1") + .path("timeline").path("domain") + .queryParam("user.name", "tester") + .accept(MediaType.APPLICATION_JSON) + .type(MediaType.APPLICATION_JSON) + .put(ClientResponse.class, domain); + assertEquals(Status.OK.getStatusCode(), response.getStatus()); + + // Update the domain by another user + response = r.path("ws").path("v1") + .path("timeline").path("domain") + .queryParam("user.name", "other") + .accept(MediaType.APPLICATION_JSON) + .type(MediaType.APPLICATION_JSON) + .put(ClientResponse.class, domain); + assertEquals(Status.FORBIDDEN.getStatusCode(), response.getStatus()); + } finally { + timelineACLsManager.setAdminACLsManager(oldAdminACLsManager); + } + } + + private static void verifyDomain(TimelineDomain domain, + String domainId, boolean hasAccess) { + Assert.assertNotNull(domain); + Assert.assertEquals(domainId, domain.getId()); + // The specific values have been verified in TestMemoryTimelineStore + Assert.assertTrue(hasAccess && domain.getDescription() != null || + !hasAccess && domain.getDescription() == null); + Assert.assertTrue(hasAccess && domain.getOwner() != null || + !hasAccess && domain.getOwner() == null); + Assert.assertTrue(hasAccess && domain.getReaders() != null || + !hasAccess && domain.getReaders() == null); + Assert.assertTrue(hasAccess && domain.getWriters() != null || + !hasAccess && domain.getWriters() == null); + Assert.assertTrue(hasAccess && domain.getCreatedTime() != null || + !hasAccess && domain.getCreatedTime() == null); + Assert.assertTrue(hasAccess && domain.getModifiedTime() != null || + !hasAccess && domain.getModifiedTime() == null); + } }
http://git-wip-us.apache.org/repos/asf/hadoop/blob/d78b452a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServicesWithSSL.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServicesWithSSL.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServicesWithSSL.java index 81f87fb..7c1fe16 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServicesWithSSL.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-applicationhistoryservice/src/test/java/org/apache/hadoop/yarn/server/timeline/webapp/TestTimelineWebServicesWithSSL.java @@ -24,7 +24,6 @@ import java.util.EnumSet; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileUtil; import org.apache.hadoop.security.ssl.KeyStoreTestUtil; -import org.apache.hadoop.yarn.api.records.timeline.TimelineEntities; import org.apache.hadoop.yarn.api.records.timeline.TimelineEntity; import org.apache.hadoop.yarn.api.records.timeline.TimelineEvent; import org.apache.hadoop.yarn.api.records.timeline.TimelinePutResponse; @@ -124,8 +123,8 @@ public class TestTimelineWebServicesWithSSL { private ClientResponse resp; @Override - public ClientResponse doPostingEntities(TimelineEntities entities) { - resp = super.doPostingEntities(entities); + public ClientResponse doPostingObject(Object obj, String path) { + resp = super.doPostingObject(obj, path); return resp; }