/* * Copyright 2016 Apache Software Foundation. * * 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 io.hops; import io.hops.exception.StorageException; import io.hops.exception.StorageInitializtionException; import io.hops.metadata.yarn.dal.ContainerIdToCleanDataAccess; import io.hops.metadata.yarn.dal.ContainerStatusDataAccess; import io.hops.metadata.yarn.dal.FinishedApplicationsDataAccess; import io.hops.metadata.yarn.dal.NextHeartbeatDataAccess; import io.hops.metadata.yarn.dal.PendingEventDataAccess; import io.hops.metadata.yarn.dal.RMNodeDataAccess; import io.hops.metadata.yarn.dal.ResourceDataAccess; import io.hops.metadata.yarn.dal.UpdatedContainerInfoDataAccess; import io.hops.metadata.yarn.dal.util.YARNOperationType; import io.hops.metadata.yarn.entity.ContainerId; import io.hops.metadata.yarn.entity.ContainerStatus; import io.hops.metadata.yarn.entity.FinishedApplications; import io.hops.metadata.yarn.entity.NextHeartbeat; import io.hops.metadata.yarn.entity.PendingEvent; import io.hops.metadata.yarn.entity.RMNode; import io.hops.metadata.yarn.entity.Resource; import io.hops.metadata.yarn.entity.UpdatedContainerInfo; import io.hops.streaming.ContainerIdToCleanEvent; import io.hops.streaming.ContainerStatusEvent; import io.hops.streaming.DBEvent; import io.hops.streaming.FinishedApplicationsEvent; import io.hops.streaming.NextHeartBeatEvent; import io.hops.streaming.PendingEventEvent; import io.hops.streaming.RMNodeEvent; import io.hops.streaming.ResourceEvent; import io.hops.streaming.UpdatedContainerInfoEvent; import io.hops.transaction.handler.LightWeightRequestHandler; import io.hops.util.DBUtility; import io.hops.util.RMStorageFactory; import io.hops.util.YarnAPIStorageFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; public class testStreaming { private static Configuration conf; @BeforeClass public static void setUp() throws Exception { conf = new YarnConfiguration(); // Set configuration options conf.set(YarnConfiguration.EVENT_RT_CONFIG_PATH, "target/test-classes/RT_EventAPIConfig.ini"); conf.set(YarnConfiguration.EVENT_SHEDULER_CONFIG_PATH, "target/test-classes/RM_EventAPIConfig.ini"); conf.setBoolean(YarnConfiguration.DISTRIBUTED_RM, true); RMStorageFactory.setConfiguration(conf); YarnAPIStorageFactory.setConfiguration(conf); DBUtility.InitializeDB(); } @Test public void test() throws StorageInitializtionException, IOException, InterruptedException { RMStorageFactory.kickTheNdbEventStreamingAPI(true, conf); LightWeightRequestHandler handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); RMNodeDataAccess rmnDA = (RMNodeDataAccess) RMStorageFactory .getDataAccess(RMNodeDataAccess.class); rmnDA.add(new RMNode("nodeid", "node name", 42, 43, "tout vat bien", 1, "tiptop", "version", 2)); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); DBEvent event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof RMNodeEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); PendingEventDataAccess DA = (PendingEventDataAccess) RMStorageFactory .getDataAccess(PendingEventDataAccess.class); DA.add(new PendingEvent("nodeId", PendingEvent.Type.NODE_ADDED, PendingEvent.Status.NEW, 0, 1)); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof PendingEventEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); ResourceDataAccess DA = (ResourceDataAccess) RMStorageFactory .getDataAccess(ResourceDataAccess.class); DA.add(new Resource("resource", 1, 2, 3)); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof ResourceEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); UpdatedContainerInfoDataAccess DA = (UpdatedContainerInfoDataAccess) RMStorageFactory .getDataAccess(UpdatedContainerInfoDataAccess.class); List<UpdatedContainerInfo> toAdd = new ArrayList<>(); toAdd.add(new UpdatedContainerInfo("rmnodeid", "containerid", 1, 2)); DA.addAll(toAdd); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof UpdatedContainerInfoEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); ContainerStatusDataAccess DA = (ContainerStatusDataAccess) RMStorageFactory .getDataAccess(ContainerStatusDataAccess.class); List<ContainerStatus> toAdd = new ArrayList<>(); toAdd.add(new ContainerStatus("containerid", "state", "diagnostics", 0, "rmnodeid", 1, 2)); DA.addAll(toAdd); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof ContainerStatusEvent); RMStorageFactory.stopTheNdbEventStreamingAPI(); RMStorageFactory.kickTheNdbEventStreamingAPI(false, conf); Thread.sleep(1000); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); ContainerIdToCleanDataAccess DA = (ContainerIdToCleanDataAccess) RMStorageFactory .getDataAccess(ContainerIdToCleanDataAccess.class); DA.add(new ContainerId("rmnodeId", "containerId")); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof ContainerIdToCleanEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); NextHeartbeatDataAccess DA = (NextHeartbeatDataAccess) RMStorageFactory .getDataAccess(NextHeartbeatDataAccess.class); DA.update(new NextHeartbeat("nodeId", true)); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof NextHeartBeatEvent); handler = new LightWeightRequestHandler( YARNOperationType.TEST) { @Override public Object performTask() throws StorageException { connector.beginTransaction(); connector.writeLock(); FinishedApplicationsDataAccess DA = (FinishedApplicationsDataAccess) RMStorageFactory .getDataAccess(FinishedApplicationsDataAccess.class); DA.add(new FinishedApplications("rmnodeId", "applicationId")); connector.commit(); return null; } }; handler.handle(); Thread.sleep(1000); Assert.assertEquals(DBEvent.receivedEvents.size(), 1); event = DBEvent.receivedEvents.take(); Assert.assertTrue(event instanceof FinishedApplicationsEvent); } }