|
@@ -0,0 +1,152 @@
|
|
|
+/**
|
|
|
+ * 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.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;
|
|
|
+
|
|
|
+ @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();
|
|
|
+
|
|
|
+ TimelineACLsManager aclsManager = new TimelineACLsManager(conf);
|
|
|
+ dataManaer = new TimelineDataManager(store, aclsManager);
|
|
|
+ }
|
|
|
+
|
|
|
+ @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 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());
|
|
|
+ }
|
|
|
+
|
|
|
+}
|