| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.hadoop.yarn.server.timeline; |
| |
| import java.io.File; |
| |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.FileContext; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.security.UserGroupInformation; |
| 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.TimelinePutResponse; |
| import org.apache.hadoop.yarn.conf.YarnConfiguration; |
| import org.apache.hadoop.yarn.security.AdminACLsManager; |
| import org.apache.hadoop.yarn.server.timeline.security.TimelineACLsManager; |
| import org.junit.After; |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| |
| |
| public class TestTimelineDataManager extends TimelineStoreTestUtils { |
| |
| private FileContext fsContext; |
| private File fsPath; |
| private TimelineDataManager dataManaer; |
| private static TimelineACLsManager aclsManager; |
| private static AdminACLsManager adminACLsManager; |
| @Before |
| public void setup() throws Exception { |
| fsPath = new File("target", this.getClass().getSimpleName() + |
| "-tmpDir").getAbsoluteFile(); |
| fsContext = FileContext.getLocalFSFileContext(); |
| fsContext.delete(new Path(fsPath.getAbsolutePath()), true); |
| Configuration conf = new YarnConfiguration(); |
| conf.set(YarnConfiguration.TIMELINE_SERVICE_LEVELDB_PATH, |
| fsPath.getAbsolutePath()); |
| conf.setBoolean(YarnConfiguration.TIMELINE_SERVICE_TTL_ENABLE, false); |
| store = new LeveldbTimelineStore(); |
| store.init(conf); |
| store.start(); |
| loadTestEntityData(); |
| loadVerificationEntityData(); |
| loadTestDomainData(); |
| |
| conf.setBoolean(YarnConfiguration.YARN_ACL_ENABLE, false); |
| aclsManager = new TimelineACLsManager(conf); |
| aclsManager.setTimelineStore(store); |
| dataManaer = new TimelineDataManager(store, aclsManager); |
| conf.setBoolean(YarnConfiguration.YARN_ACL_ENABLE, true); |
| conf.set(YarnConfiguration.YARN_ADMIN_ACL, "admin"); |
| dataManaer.init(conf); |
| adminACLsManager = new AdminACLsManager(conf); |
| } |
| |
| @After |
| public void tearDown() throws Exception { |
| if (store != null) { |
| store.stop(); |
| } |
| if (fsContext != null) { |
| fsContext.delete(new Path(fsPath.getAbsolutePath()), true); |
| } |
| } |
| |
| @Test |
| public void testGetOldEntityWithOutDomainId() throws Exception { |
| TimelineEntity entity = dataManaer.getEntity( |
| "OLD_ENTITY_TYPE_1", "OLD_ENTITY_ID_1", null, |
| UserGroupInformation.getCurrentUser()); |
| Assert.assertNotNull(entity); |
| Assert.assertEquals("OLD_ENTITY_ID_1", entity.getEntityId()); |
| Assert.assertEquals("OLD_ENTITY_TYPE_1", entity.getEntityType()); |
| Assert.assertEquals( |
| TimelineDataManager.DEFAULT_DOMAIN_ID, entity.getDomainId()); |
| } |
| |
| @Test |
| public void testGetEntitiesAclEnabled() throws Exception { |
| AdminACLsManager oldAdminACLsManager = |
| aclsManager.setAdminACLsManager(adminACLsManager); |
| try { |
| TimelineEntities entities = dataManaer.getEntities( |
| "ACL_ENTITY_TYPE_1", null, null, null, null, null, null, 1l, null, |
| UserGroupInformation.createUserForTesting("owner_1", new String[] {"group1"})); |
| Assert.assertEquals(1, entities.getEntities().size()); |
| Assert.assertEquals("ACL_ENTITY_ID_11", |
| entities.getEntities().get(0).getEntityId()); |
| } finally { |
| aclsManager.setAdminACLsManager(oldAdminACLsManager); |
| } |
| } |
| |
| @Test |
| public void testGetOldEntitiesWithOutDomainId() throws Exception { |
| TimelineEntities entities = dataManaer.getEntities( |
| "OLD_ENTITY_TYPE_1", null, null, null, null, null, null, null, null, |
| UserGroupInformation.getCurrentUser()); |
| Assert.assertEquals(2, entities.getEntities().size()); |
| Assert.assertEquals("OLD_ENTITY_ID_2", |
| entities.getEntities().get(0).getEntityId()); |
| Assert.assertEquals("OLD_ENTITY_TYPE_1", |
| entities.getEntities().get(0).getEntityType()); |
| Assert.assertEquals(TimelineDataManager.DEFAULT_DOMAIN_ID, |
| entities.getEntities().get(0).getDomainId()); |
| Assert.assertEquals("OLD_ENTITY_ID_1", |
| entities.getEntities().get(1).getEntityId()); |
| Assert.assertEquals("OLD_ENTITY_TYPE_1", |
| entities.getEntities().get(1).getEntityType()); |
| Assert.assertEquals(TimelineDataManager.DEFAULT_DOMAIN_ID, |
| entities.getEntities().get(1).getDomainId()); |
| } |
| |
| @Test |
| public void testUpdatingOldEntityWithoutDomainId() throws Exception { |
| // Set the domain to the default domain when updating |
| TimelineEntity entity = new TimelineEntity(); |
| entity.setEntityType("OLD_ENTITY_TYPE_1"); |
| entity.setEntityId("OLD_ENTITY_ID_1"); |
| entity.setDomainId(TimelineDataManager.DEFAULT_DOMAIN_ID); |
| entity.addOtherInfo("NEW_OTHER_INFO_KEY", "NEW_OTHER_INFO_VALUE"); |
| TimelineEntities entities = new TimelineEntities(); |
| entities.addEntity(entity); |
| TimelinePutResponse response = dataManaer.postEntities( |
| entities, UserGroupInformation.getCurrentUser()); |
| Assert.assertEquals(0, response.getErrors().size()); |
| entity = store.getEntity("OLD_ENTITY_ID_1", "OLD_ENTITY_TYPE_1", null); |
| Assert.assertNotNull(entity); |
| // Even in leveldb, the domain is updated to the default domain Id |
| Assert.assertEquals( |
| TimelineDataManager.DEFAULT_DOMAIN_ID, entity.getDomainId()); |
| Assert.assertEquals(1, entity.getOtherInfo().size()); |
| Assert.assertEquals("NEW_OTHER_INFO_KEY", |
| entity.getOtherInfo().keySet().iterator().next()); |
| Assert.assertEquals("NEW_OTHER_INFO_VALUE", |
| entity.getOtherInfo().values().iterator().next()); |
| |
| // Set the domain to the non-default domain when updating |
| entity = new TimelineEntity(); |
| entity.setEntityType("OLD_ENTITY_TYPE_1"); |
| entity.setEntityId("OLD_ENTITY_ID_2"); |
| entity.setDomainId("NON_DEFAULT"); |
| entity.addOtherInfo("NEW_OTHER_INFO_KEY", "NEW_OTHER_INFO_VALUE"); |
| entities = new TimelineEntities(); |
| entities.addEntity(entity); |
| response = dataManaer.postEntities( |
| entities, UserGroupInformation.getCurrentUser()); |
| Assert.assertEquals(1, response.getErrors().size()); |
| Assert.assertEquals(TimelinePutResponse.TimelinePutError.ACCESS_DENIED, |
| response.getErrors().get(0).getErrorCode()); |
| entity = store.getEntity("OLD_ENTITY_ID_2", "OLD_ENTITY_TYPE_1", null); |
| Assert.assertNotNull(entity); |
| // In leveldb, the domain Id is still null |
| Assert.assertNull(entity.getDomainId()); |
| // Updating is not executed |
| Assert.assertEquals(0, entity.getOtherInfo().size()); |
| } |
| |
| } |