blob: 0cd4942cb549ffa6acb1df225a8c2f316bdbeb4d [file] [log] [blame]
/*
* 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.rya.accumulo.mr.merge.driver;
import java.io.File;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.core.client.Instance;
import org.apache.accumulo.core.client.ZooKeeperInstance;
import org.apache.accumulo.core.client.admin.SecurityOperations;
import org.apache.accumulo.core.client.mock.MockInstance;
import org.apache.accumulo.core.security.Authorizations;
import org.apache.accumulo.core.security.ColumnVisibility;
import org.apache.accumulo.minicluster.MiniAccumuloCluster;
import org.apache.log4j.Logger;
import org.apache.rya.accumulo.AccumuloRdfConfiguration;
import org.apache.rya.accumulo.AccumuloRyaDAO;
import org.apache.rya.accumulo.mr.merge.util.AccumuloInstanceDriver;
import org.apache.rya.api.domain.RyaStatement;
import org.apache.rya.api.persist.RyaDAOException;
/**
* Handles running a {@link MiniAccumuloCluster} or a {@link MockInstance} for a parent and child instance for testing.
*/
public class AccumuloDualInstanceDriver {
private static final Logger log = Logger.getLogger(AccumuloDualInstanceDriver.class);
private final boolean isMock;
private final boolean shouldCreateIndices;
private final boolean isParentReadOnly;
private final boolean isChildReadOnly;
private final boolean doesChildInitiallyExist;
public static final String PARENT_USER_NAME = "parent_user";
public static final String PARENT_PASSWORD = "parent_pwd";
public static final String PARENT_INSTANCE = "parent_instance";
public static final String PARENT_TABLE_PREFIX = "pt_";
public static final String PARENT_AUTH = "parent_auth";
public static final ColumnVisibility PARENT_COLUMN_VISIBILITY = new ColumnVisibility(PARENT_AUTH);
public static final String CHILD_USER_NAME = "child_user";
public static final String CHILD_PASSWORD = "child_pwd";
public static final String CHILD_INSTANCE = "child_instance";
public static final String CHILD_TABLE_PREFIX = "ct_";
public static final String CHILD_AUTH = "child_auth";
public static final ColumnVisibility CHILD_COLUMN_VISIBILITY = new ColumnVisibility(CHILD_AUTH);
private final AccumuloInstanceDriver parentAccumuloInstanceDriver;
private final AccumuloInstanceDriver childAccumuloInstanceDriver;
/**
* Creates a new instance of {@link AccumuloDualInstanceDriver}.
* @param isMock {@code true} if the parent and child instances will use {@link MockInstance}s.
* {@code false} if the parent and child instances will use {@link MiniAccumuloCluster}s.
* @param shouldCreateIndices {@code true} to create all the indices associated with a Rya deployment.
* {@code false} otherwise.
* @param isParentReadOnly {@code true} if all the tables in the parent instance should have their
* table permissions set to read only. {@code false} if the table permission are set to write.
* @param isChildReadOnly {@code true} if all the tables in the child instance should have their
* table permissions set to read only. {@code false} if the table permission are set to write.
* @param doesChildInitiallyExist {@code true} if all the child instance exists initially.
* {@code false} otherwise.
*/
public AccumuloDualInstanceDriver(final boolean isMock, final boolean shouldCreateIndices, final boolean isParentReadOnly, final boolean isChildReadOnly, final boolean doesChildInitiallyExist) {
this.isMock = isMock;
this.shouldCreateIndices = shouldCreateIndices;
this.isParentReadOnly = isParentReadOnly;
this.isChildReadOnly = isChildReadOnly;
this.doesChildInitiallyExist = doesChildInitiallyExist;
final String parentUser = isMock ? PARENT_USER_NAME : AccumuloInstanceDriver.ROOT_USER_NAME;
final String childUser = isMock ? CHILD_USER_NAME : AccumuloInstanceDriver.ROOT_USER_NAME;
parentAccumuloInstanceDriver = new AccumuloInstanceDriver("Parent", isMock, shouldCreateIndices, isParentReadOnly, true, parentUser, PARENT_PASSWORD, PARENT_INSTANCE, PARENT_TABLE_PREFIX, PARENT_AUTH);
childAccumuloInstanceDriver = new AccumuloInstanceDriver("Child", isMock, shouldCreateIndices, isChildReadOnly, false, childUser, CHILD_PASSWORD, CHILD_INSTANCE, CHILD_TABLE_PREFIX, CHILD_AUTH);
}
/**
* Sets up the parent and child {@link AccumuloInstanceDriver}s.
* @throws Exception
*/
public void setUp() throws Exception {
log.info("Setting up parent and child drivers.");
setUpInstances();
setUpTables();
setUpDaos();
setUpConfigs();
}
/**
* Sets up the parent and child instances.
* @throws Exception
*/
public void setUpInstances() throws Exception {
parentAccumuloInstanceDriver.setUpInstance();
if (doesChildInitiallyExist) {
childAccumuloInstanceDriver.setUpInstance();
}
}
/**
* Sets up all the tables and indices for the parent and child instances.
* @throws Exception
*/
public void setUpTables() throws Exception {
parentAccumuloInstanceDriver.setUpTables();
if (doesChildInitiallyExist) {
childAccumuloInstanceDriver.setUpTables();
}
}
/**
* Sets up the {@link AccumuloRyaDAO}s for the parent and child instances.
* @throws Exception
*/
public void setUpDaos() throws Exception {
parentAccumuloInstanceDriver.setUpDao();
if (doesChildInitiallyExist) {
childAccumuloInstanceDriver.setUpDao();
}
}
/**
* Sets up the configuration and prints the arguments for the parent and child instances.
*/
public void setUpConfigs() {
parentAccumuloInstanceDriver.setUpConfig();
childAccumuloInstanceDriver.setUpConfig();
}
/**
* Tears down all the tables and indices for the parent and child instances.
* @throws Exception
*/
public void tearDownTables() throws Exception {
parentAccumuloInstanceDriver.tearDownTables();
childAccumuloInstanceDriver.tearDownTables();
}
/**
* Tears down the {@link AccumuloRyaDAO}s for the parent and child instances.
* @throws Exception
*/
public void tearDownDaos() throws Exception {
parentAccumuloInstanceDriver.tearDownDao();
childAccumuloInstanceDriver.tearDownDao();
}
/**
* Tears down the parent and child instances.
* @throws Exception
*/
public void tearDownInstances() throws Exception {
parentAccumuloInstanceDriver.tearDownInstance();
childAccumuloInstanceDriver.tearDownInstance();
}
/**
* Tears down the {@link AccumuloInstanceDriver} for the parent and child instances.
* @throws Exception
*/
public void tearDown() throws Exception {
try {
//tearDownTables();
tearDownDaos();
tearDownInstances();
} finally {
removeTempDirs();
}
}
/**
* Deletes the {@link MiniAccumuloCluster} temporary directories for the parent and child instances.
*/
private void removeTempDirs() {
parentAccumuloInstanceDriver.removeTempDir();
childAccumuloInstanceDriver.removeTempDir();
}
/**
* Adds authorizations to the {@link SecurityOperations} of the parent instance's user.
* @param auths the list of authorizations to add.
* @throws AccumuloException
* @throws AccumuloSecurityException
*/
public void addParentAuths(final String... auths) throws AccumuloException, AccumuloSecurityException {
parentAccumuloInstanceDriver.addAuths(auths);
}
/**
* Adds authorizations to the {@link SecurityOperations} of the child instance's user.
* @param auths the list of authorizations to add.
* @throws AccumuloException
* @throws AccumuloSecurityException
*/
public void addChildAuths(final String... auths) throws AccumuloException, AccumuloSecurityException {
childAccumuloInstanceDriver.addAuths(auths);
}
/**
* @return the {@link Authorizations} of the parent instance's user.
* @throws AccumuloException
* @throws AccumuloSecurityException
*/
public Authorizations getParentAuths() throws AccumuloException, AccumuloSecurityException {
return parentAccumuloInstanceDriver.getAuths();
}
/**
* @return the {@link Authorizations} of the child instance's user.
* @throws AccumuloException
* @throws AccumuloSecurityException
*/
public Authorizations getChildAuths() throws AccumuloException, AccumuloSecurityException {
return childAccumuloInstanceDriver.getAuths();
}
/**
* Adds a {@link Collection} of {@link RyaStatement}s to the parent instance's DAO.
* @param ryaStatements the {@link Collection} of {@link RyaStatement}s.
* @throws RyaDAOException
*/
public void addParentRyaStatements(final Collection<RyaStatement> ryaStatements) throws RyaDAOException {
addRyaStatements(ryaStatements.iterator(), parentAccumuloInstanceDriver.getDao());
}
/**
* Adds a {@link Collection} of {@link RyaStatement}s to the child instance's DAO.
* @param ryaStatements the {@link Collection} of {@link RyaStatement}s.
* @throws RyaDAOException
*/
public void addChildRyaStatements(final Collection<RyaStatement> ryaStatements) throws RyaDAOException {
addRyaStatements(ryaStatements.iterator(), childAccumuloInstanceDriver.getDao());
}
/**
* Adds {@link RyaStatement}s to the parent instance's DAO from the provided {@link Iterator}.
* @param ryaStatementIterator the {@link RyaStatement} {@link Iterator}.
* @throws RyaDAOException
*/
public void addParentRyaStatements(final Iterator<RyaStatement> ryaStatementIterator) throws RyaDAOException {
addRyaStatements(ryaStatementIterator, parentAccumuloInstanceDriver.getDao());
}
/**
* Adds {@link RyaStatement}s to the child instance's DAO from the provided {@link Iterator}.
* @param ryaStatementIterator the {@link RyaStatement} {@link Iterator}.
* @throws RyaDAOException
*/
public void addChildRyaStatements(final Iterator<RyaStatement> ryaStatementIterator) throws RyaDAOException {
addRyaStatements(ryaStatementIterator, childAccumuloInstanceDriver.getDao());
}
/**
* Adds a {@link RyaStatement} to the parent instance's DAO.
* @param ryaStatement the {@link RyaStatement}.
* @throws RyaDAOException
*/
public void addParentRyaStatement(final RyaStatement ryaStatement) throws RyaDAOException {
addRyaStatement(ryaStatement, parentAccumuloInstanceDriver.getDao());
}
/**
* Adds a {@link RyaStatement} to the child instance's DAO.
* @param ryaStatement the {@link RyaStatement}.
* @throws RyaDAOException
*/
public void addChildRyaStatement(final RyaStatement ryaStatement) throws RyaDAOException {
addRyaStatement(ryaStatement, childAccumuloInstanceDriver.getDao());
}
/**
* Adds {@link RyaStatement}s to specified DAO from the provided {@link Iterator}.
* @param ryaStatementIterator the {@link RyaStatement} {@link Iterator}.
* @param dao the {@link AccumuloRyaDAO}.
* @throws RyaDAOException
*/
private static void addRyaStatements(final Iterator<RyaStatement> ryaStatementIterator, final AccumuloRyaDAO dao) throws RyaDAOException {
dao.add(ryaStatementIterator);
}
/**
* Adds a {@link RyaStatement} to the specified DAO.
* @param ryaStatement the {@link RyaStatement}.
* @throws RyaDAOException
*/
private static void addRyaStatement(final RyaStatement ryaStatement, final AccumuloRyaDAO dao) throws RyaDAOException {
dao.add(ryaStatement);
}
/**
* @return the parent instance's {@link AccumuloInstanceDriver}.
*/
public AccumuloInstanceDriver getParentAccumuloInstanceDriver() {
return parentAccumuloInstanceDriver;
}
/**
* @return the child instance's {@link AccumuloInstanceDriver}.
*/
public AccumuloInstanceDriver getChildAccumuloInstanceDriver() {
return childAccumuloInstanceDriver;
}
/**
* @return {@code true} if this is a mock instance. {@code false} if this is a MiniAccumuloCluster instance.
*/
public boolean isMock() {
return isMock;
}
/**
* @return {@code true} to create all the indices associated with a Rya deployment.
* {@code false} otherwise.
*/
public boolean shouldCreateIndices() {
return shouldCreateIndices;
}
/**
* @return {@code true} if all the tables in the parent instance should have their
* table permissions set to read only. {@code false} if the table permission are set to write.
*/
public boolean isParentReadOnly() {
return isParentReadOnly;
}
/**
* @return {@code true} if all the tables in the child instance should have their
* table permissions set to read only. {@code false} if the table permission are set to write.
*/
public boolean isChildReadOnly() {
return isChildReadOnly;
}
/**
* @return {@code true} if all the child instance exists initially.
* {@code false} otherwise.
*/
public boolean doesChildInitiallyExist() {
return doesChildInitiallyExist;
}
/**
* @return the user name tied to the parent instance.
*/
public String getParentUser() {
return parentAccumuloInstanceDriver.getUser();
}
/**
* @return the user name tied to the child instance.
*/
public String getChildUser() {
return childAccumuloInstanceDriver.getUser();
}
/**
* @return the password for the parent instance's user.
*/
public String getParentPassword() {
return parentAccumuloInstanceDriver.getPassword();
}
/**
* @return the password for the child instance's user.
*/
public String getChildPassword() {
return childAccumuloInstanceDriver.getPassword();
}
/**
* @return the name of the parent instance.
*/
public String getParentInstanceName() {
return parentAccumuloInstanceDriver.getInstanceName();
}
/**
* @return the name of the child instance.
*/
public String getChildInstanceName() {
return childAccumuloInstanceDriver.getInstanceName();
}
/**
* @return the parent instance's table prefix.
*/
public String getParentTablePrefix() {
return parentAccumuloInstanceDriver.getTablePrefix();
}
/**
* @return the child instance's table prefix.
*/
public String getChildTablePrefix() {
return childAccumuloInstanceDriver.getTablePrefix();
}
/**
* @return the comma-separated authorization list for the parent instance.
*/
public String getParentAuth() {
return parentAccumuloInstanceDriver.getAuth();
}
/**
* @return the comma-separated authorization list for the child instance.
*/
public String getChildAuth() {
return childAccumuloInstanceDriver.getAuth();
}
/**
* @return the {@link Connector} to the parent instance.
*/
public Connector getParentConnector() {
return parentAccumuloInstanceDriver.getConnector();
}
/**
* @return the {@link Connector} to the child instance.
*/
public Connector getChildConnector() {
return childAccumuloInstanceDriver.getConnector();
}
/**
* @return the {@link AccumuloRyaDAO} for the parent instance.
*/
public AccumuloRyaDAO getParentDao() {
return parentAccumuloInstanceDriver.getDao();
}
/**
* @return the {@link AccumuloRyaDAO} for the child instance.
*/
public AccumuloRyaDAO getChildDao() {
return childAccumuloInstanceDriver.getDao();
}
/**
* @return the {@link SecurityOperations} for the parent instance.
*/
public SecurityOperations getParentSecOps() {
return parentAccumuloInstanceDriver.getSecOps();
}
/**
* @return the {@link SecurityOperations} for the child instance.
*/
public SecurityOperations getChildSecOps() {
return childAccumuloInstanceDriver.getSecOps();
}
/**
* @return the {@link AccumuloRdfConfiguration} for the parent instance.
*/
public AccumuloRdfConfiguration getParentConfig() {
return parentAccumuloInstanceDriver.getConfig();
}
/**
* @return the {@link AccumuloRdfConfiguration} for the child instance.
*/
public AccumuloRdfConfiguration getChildConfig() {
return childAccumuloInstanceDriver.getConfig();
}
/**
* @return the {@link MiniAccumuloCluster} for the parent instance or {@code null}
* if this is a {@link MockInstance}.
*/
public MiniAccumuloCluster getParentMiniAccumuloCluster() {
return parentAccumuloInstanceDriver.getMiniAccumuloCluster();
}
/**
* @return the {@link MiniAccumuloCluster} for the child instance or {@code null}
* if this is a {@link MockInstance}.
*/
public MiniAccumuloCluster getChildMiniAccumuloCluster() {
return childAccumuloInstanceDriver.getMiniAccumuloCluster();
}
/**
* @return the {@link MockInstance} for the parent instance or {@code null}
* if this is a {@link MiniAccumuloCluster}.
*/
public MockInstance getParentMockInstance() {
return parentAccumuloInstanceDriver.getMockInstance();
}
/**
* @return the {@link MockInstance} for the child instance or {@code null}
* if this is a {@link MiniAccumuloCluster}.
*/
public MockInstance getChildMockInstance() {
return childAccumuloInstanceDriver.getMockInstance();
}
/**
* @return the {@link ZooKeeperInstance} for the parent instance or {@code null} if
* this is a {@link MockInstance}.
*/
public ZooKeeperInstance getParentZooKeeperInstance() {
return parentAccumuloInstanceDriver.getZooKeeperInstance();
}
/**
* @return the {@link ZooKeeperInstance} for the child instance or {@code null} if
* this is a {@link MockInstance}.
*/
public ZooKeeperInstance getChildZooKeeperInstance() {
return childAccumuloInstanceDriver.getZooKeeperInstance();
}
/**
* @return the parent {@link ZooKeepInstance} or {@link MockInstance}.
*/
public Instance getParentInstance() {
return parentAccumuloInstanceDriver.getInstance();
}
/**
* @return the child {@link ZooKeepInstance} or {@link MockInstance}.
*/
public Instance getChildInstance() {
return childAccumuloInstanceDriver.getInstance();
}
/**
* @return the comma-separated list of zoo keeper host names for the parent instance.
*/
public String getParentZooKeepers() {
return parentAccumuloInstanceDriver.getZooKeepers();
}
/**
* @return the comma-separated list of zoo keeper host names for the child instance.
*/
public String getChildZooKeepers() {
return childAccumuloInstanceDriver.getZooKeepers();
}
/**
* @return an unmodifiable map of the configuration keys and values for the parent instance.
*/
public Map<String, String> getParentConfigMap() {
return parentAccumuloInstanceDriver.getConfigMap();
}
/**
* @return an unmodifiable map of the configuration keys and values for the child instance.
*/
public Map<String, String> getChildConfigMap() {
return childAccumuloInstanceDriver.getConfigMap();
}
/**
* @return an unmodifiable list of the table names and indices for the parent instance.
*/
public List<String> getParentTableList() {
return parentAccumuloInstanceDriver.getTableList();
}
/**
* @return an unmodifiable list of the table names and indices for the child instance.
*/
public List<String> getChildTableList() {
return childAccumuloInstanceDriver.getTableList();
}
/**
* @return the {@link MiniAccumuloCluster} temporary directory for the parent instance or {@code null}
* if it's a {@link MockInstance}.
*/
public File getParentTempDir() {
return parentAccumuloInstanceDriver.getTempDir();
}
/**
* @return the {@link MiniAccumuloCluster} temporary directory for the child instance or {@code null}
* if it's a {@link MockInstance}.
*/
public File getChildTempDir() {
return childAccumuloInstanceDriver.getTempDir();
}
}