package org.vertexium.accumulo; import org.apache.accumulo.core.client.AccumuloException; import org.apache.accumulo.core.client.AccumuloSecurityException; import org.apache.accumulo.core.client.Connector; import org.apache.accumulo.minicluster.MiniAccumuloCluster; import org.apache.accumulo.minicluster.MiniAccumuloConfig; import org.junit.rules.ExternalResource; import org.vertexium.GraphConfiguration; import org.vertexium.test.GraphTestBase; import org.vertexium.util.VertexiumLogger; import org.vertexium.util.VertexiumLoggerFactory; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.vertexium.test.GraphTestBase.*; public class AccumuloResource extends ExternalResource { private static final VertexiumLogger LOGGER = VertexiumLoggerFactory.getLogger(AccumuloResource.class); private static final String ACCUMULO_USERNAME = "root"; private static final String ACCUMULO_PASSWORD = "test"; private File tempDir; private MiniAccumuloCluster accumulo; private Map extraConfig = null; public AccumuloResource() { } public AccumuloResource(Map extraConfig) { this.extraConfig = extraConfig; } @Override protected void before() throws Throwable { ensureAccumuloIsStarted(); super.before(); } @Override protected void after() { try { stop(); } catch (Exception e) { LOGGER.info("Unable to shut down mini accumulo cluster", e); } super.after(); } public void dropGraph() throws Exception { Connector connector = createConnector(); AccumuloGraphTestUtils.ensureTableExists(connector, GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getDataTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getVerticesTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getHistoryVerticesTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getEdgesTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getExtendedDataTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getHistoryEdgesTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); AccumuloGraphTestUtils.dropGraph(connector, AccumuloGraph.getMetadataTableName(GraphConfiguration.DEFAULT_TABLE_NAME_PREFIX)); connector.securityOperations().changeUserAuthorizations( AccumuloGraphConfiguration.DEFAULT_ACCUMULO_USERNAME, new org.apache.accumulo.core.security.Authorizations( VISIBILITY_A_STRING, VISIBILITY_B_STRING, VISIBILITY_C_STRING, VISIBILITY_MIXED_CASE_STRING ) ); } public MiniAccumuloCluster getAccumulo() { return accumulo; } @SuppressWarnings("unchecked") public Map createConfig() { Map configMap = new HashMap(); configMap.put(AccumuloGraphConfiguration.ZOOKEEPER_SERVERS, accumulo.getZooKeepers()); configMap.put(AccumuloGraphConfiguration.ACCUMULO_INSTANCE_NAME, accumulo.getInstanceName()); configMap.put(AccumuloGraphConfiguration.ACCUMULO_USERNAME, ACCUMULO_USERNAME); configMap.put(AccumuloGraphConfiguration.ACCUMULO_PASSWORD, ACCUMULO_PASSWORD); configMap.put(AccumuloGraphConfiguration.AUTO_FLUSH, false); configMap.put(AccumuloGraphConfiguration.MAX_STREAMING_PROPERTY_VALUE_TABLE_DATA_SIZE, GraphTestBase.LARGE_PROPERTY_VALUE_SIZE - 1); configMap.put(AccumuloGraphConfiguration.DATA_DIR, "/tmp/"); configMap.put(AccumuloGraphConfiguration.HISTORY_IN_SEPARATE_TABLE, true); if (extraConfig != null) { configMap.putAll(extraConfig); } return configMap; } public Connector createConnector() throws AccumuloSecurityException, AccumuloException { return new AccumuloGraphConfiguration(createConfig()).createConnector(); } public void ensureAccumuloIsStarted() { try { start(); } catch (Exception e) { throw new RuntimeException("Failed to start Accumulo mini cluster", e); } } protected void stop() throws IOException, InterruptedException { if (accumulo != null) { LOGGER.info("Stopping accumulo"); accumulo.stop(); accumulo = null; } tempDir.delete(); } public void start() throws IOException, InterruptedException { if (accumulo != null) { return; } LOGGER.info("Starting accumulo"); tempDir = File.createTempFile("accumulo-temp", Long.toString(System.nanoTime())); tempDir.delete(); tempDir.mkdir(); LOGGER.info("writing to: %s", tempDir); MiniAccumuloConfig miniAccumuloConfig = new MiniAccumuloConfig(tempDir, ACCUMULO_PASSWORD); miniAccumuloConfig.setZooKeeperStartupTime(60000); accumulo = new MiniAccumuloCluster(miniAccumuloConfig); accumulo.start(); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { try { AccumuloResource.this.stop(); } catch (Exception e) { System.out.println("Failed to stop Accumulo test cluster"); } } }); } }