Author: brandonwilliams Date: Wed Aug 3 22:10:32 2011 New Revision: 1153688
URL: http://svn.apache.org/viewvc?rev=1153688&view=rev Log: Update distributed tests to work with whirr 0.4 Patch by Michael Allen, reviewed by brandonwilliams for CASSANDRA-2523 Added: cassandra/branches/cassandra-0.8/test/resources/functions/ cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh (with props) cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh (with props) cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh (with props) cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh (with props) cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh (with props) cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh (with props) Modified: cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/CassandraServiceController.java cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/MutationTest.java cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/TestBase.java Modified: cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/CassandraServiceController.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/CassandraServiceController.java?rev=1153688&r1=1153687&r2=1153688&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/CassandraServiceController.java (original) +++ cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/CassandraServiceController.java Wed Aug 3 22:10:32 2011 @@ -39,21 +39,21 @@ import org.apache.thrift.transport.TTran import org.apache.whirr.service.*; import org.apache.whirr.service.Cluster.Instance; import org.apache.whirr.service.cassandra.CassandraClusterActionHandler; -import org.apache.whirr.service.jclouds.RunUrlStatement; +import org.apache.whirr.service.jclouds.StatementBuilder; import org.jclouds.blobstore.domain.BlobMetadata; import org.jclouds.compute.ComputeService; import org.jclouds.compute.domain.ExecResponse; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.options.RunScriptOptions; +import org.jclouds.compute.RunScriptOnNodesException; import org.jclouds.domain.Credentials; import org.jclouds.scriptbuilder.domain.OsFamily; +import org.jclouds.scriptbuilder.domain.Statements; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import static org.jclouds.io.Payloads.newStringPayload; - public class CassandraServiceController { private static final Logger LOG = @@ -76,7 +76,6 @@ public class CassandraServiceController private Service service; private Cluster cluster; private ComputeService computeService; - private Credentials credentials; private CompositeConfiguration config; private BlobMetadata tarball; private List<InetAddress> hosts; @@ -113,12 +112,12 @@ public class CassandraServiceController try { Cassandra.Client client = createClient(addr); - client.describe_cluster_name(); break; } catch (TException e) { + LOG.debug(e.toString()); try { Thread.sleep(1000); @@ -168,14 +167,13 @@ public class CassandraServiceController for (Instance instance : cluster.getInstances()) { hosts.add(instance.getPublicAddress()); - credentials = instance.getLoginCredentials(); } - waitForClusterInitialization(); - ShutdownHook shutdownHook = new ShutdownHook(this); Runtime.getRuntime().addShutdownHook(shutdownHook); + waitForClusterInitialization(); + running = true; } @@ -231,7 +229,7 @@ public class CassandraServiceController */ public void nodetool(String args, InetAddress... hosts) { - callOnHosts(String.format("apache/cassandra/nodetool %s", args), hosts); + callOnHosts(Arrays.asList(hosts), "nodetool_cassandra", args); } /** @@ -239,25 +237,31 @@ public class CassandraServiceController */ public void wipeHosts(InetAddress... hosts) { - callOnHosts("apache/cassandra/wipe-state", hosts); + callOnHosts(Arrays.asList(hosts), "wipe_cassandra"); } public Failure failHosts(List<InetAddress> hosts) { - return new Failure(hosts.toArray(new InetAddress[hosts.size()])).trigger(); + return new Failure(hosts).trigger(); } public Failure failHosts(InetAddress... hosts) { - return new Failure(hosts).trigger(); + return new Failure(Arrays.asList(hosts)).trigger(); } /** TODO: Move to CassandraService? */ - protected void callOnHosts(String payload, InetAddress... hosts) + protected void callOnHosts(List<InetAddress> hosts, String functionName, String... functionArgs) { final Set<String> hostset = new HashSet<String>(); + for (InetAddress host : hosts) hostset.add(host.getHostAddress()); + + StatementBuilder statementBuilder = new StatementBuilder(); + statementBuilder.addStatement(Statements.call(functionName, functionArgs)); + Credentials credentials = new Credentials(clusterSpec.getClusterUser(), clusterSpec.getPrivateKey()); + Map<? extends NodeMetadata,ExecResponse> results; try { @@ -269,18 +273,27 @@ public class CassandraServiceController intersection.retainAll(node.getPublicAddresses()); return !intersection.isEmpty(); } - }, newStringPayload(new RunUrlStatement(clusterSpec.getRunUrlBase(), payload).render(OsFamily.UNIX)), - RunScriptOptions.Builder.overrideCredentialsWith(credentials)); + }, + statementBuilder, + RunScriptOptions.Builder.overrideCredentialsWith(credentials).wrapInInitScript(false).runAsRoot(false)); } - catch (Exception e) + catch (RunScriptOnNodesException e) { throw new RuntimeException(e); } + if (results.size() != hostset.size()) + { throw new RuntimeException(results.size() + " hosts matched " + hostset + ": " + results); + } + for (ExecResponse response : results.values()) + { if (response.getExitCode() != 0) - throw new RuntimeException("Call " + payload + " failed on at least one of " + hostset + ": " + results.values()); + { + throw new RuntimeException("Call " + functionName + " failed on at least one of " + hostset + ": " + results.values()); + } + } } public List<InetAddress> getHosts() @@ -290,24 +303,26 @@ public class CassandraServiceController class Failure { - private InetAddress[] hosts; + private List<InetAddress> hosts; - public Failure(InetAddress... hosts) + public Failure(List<InetAddress> hosts) { this.hosts = hosts; } public Failure trigger() { - callOnHosts("apache/cassandra/stop", hosts); + callOnHosts(hosts, "stop_cassandra"); return this; } public void resolve() { - callOnHosts("apache/cassandra/start", hosts); + callOnHosts(hosts, "start_cassandra"); for (InetAddress host : hosts) + { waitForNodeInitialization(host); + } } } Modified: cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/MutationTest.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/MutationTest.java?rev=1153688&r1=1153687&r2=1153688&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/MutationTest.java (original) +++ cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/MutationTest.java Wed Aug 3 22:10:32 2011 @@ -129,6 +129,7 @@ public class MutationTest extends TestBa .expecting(UnavailableException.class).perform(ConsistencyLevel.QUORUM); } finally { failure.resolve(); + Thread.sleep(10000); } // with all nodes up Modified: cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/TestBase.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/TestBase.java?rev=1153688&r1=1153687&r2=1153688&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/TestBase.java (original) +++ cassandra/branches/cassandra-0.8/test/distributed/org/apache/cassandra/TestBase.java Wed Aug 3 22:10:32 2011 @@ -61,7 +61,6 @@ public abstract class TestBase cfdef.setRow_cache_size(1000); cfdef.setRow_cache_save_period_in_seconds(0); cfdef.setKey_cache_save_period_in_seconds(3600); - cfdef.setMemtable_flush_after_mins(59); cfdef.setMemtable_throughput_in_mb(255); cfdef.setMemtable_operations_in_millions(0.29); } @@ -87,8 +86,7 @@ public abstract class TestBase client.system_add_keyspace(new KsDef(name, "org.apache.cassandra.locator.SimpleStrategy", Arrays.asList(cfdef)) - .setStrategy_options(stratOptions) - .setCf_defs(Collections.<CfDef>emptyList())); + .setStrategy_options(stratOptions)); // poll, until KS added for (InetAddress host : hosts) @@ -199,7 +197,7 @@ public abstract class TestBase protected long timestamp; private Set<Class<Exception>> expected = new HashSet<Class<Exception>>(); - private long timeout = StorageService.RING_DELAY; + private long timeout = StorageService.RING_DELAY * 2; public RetryingAction(Cassandra.Client client, String cf, ByteBuffer key) { Added: cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,85 @@ +# +# 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. +# +function configure_cassandra() { + local OPTIND + local OPTARG + + . /etc/profile + + CLOUD_PROVIDER= + while getopts "c:" OPTION; do + case $OPTION in + c) + CLOUD_PROVIDER="$OPTARG" + shift $((OPTIND-1)); OPTIND=1 + ;; + esac + done + + case $CLOUD_PROVIDER in + # We want the gossip protocol to use internal (private) addresses, and the + # client to use public addresses. + # See http://wiki.apache.org/cassandra/FAQ#cant_listen_on_ip_any + ec2 | aws-ec2 ) + PRIVATE_SELF_HOST=`wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4` + # EC2 is NATed + PUBLIC_SELF_HOST=$PRIVATE_SELF_HOST + ;; + *) + PUBLIC_SELF_HOST=`/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` + PRIVATE_SELF_HOST=`/sbin/ifconfig eth1 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'` + ;; + esac + + OH_SIX_CONFIG="/etc/cassandra/conf/storage-conf.xml" + + if [[ -e "$OH_SIX_CONFIG" ]] ; then + config_file=$OH_SIX_CONFIG + seeds="" + for server in "$@"; do + seeds="${seeds}<Seed>${server}</Seed>" + done + + #TODO set replication + sed -i -e "s|<Seed>127.0.0.1</Seed>|$seeds|" $config_file + sed -i -e "s|<ListenAddress>localhost</ListenAddress>|<ListenAddress>$PRIVATE_SELF_HOST</ListenAddress>|" $config_file + sed -i -e "s|<ThriftAddress>localhost</ThriftAddress>|<ThriftAddress>$PUBLIC_SELF_HOST</ThriftAddress>|" $config_file + else + config_file="/etc/cassandra/conf/cassandra.yaml" + if [[ "x"`grep -e '^seeds:' $config_file` == "x" ]]; then + seeds="$1" # 08 format seeds + shift + for server in "$@"; do + seeds="${seeds},${server}" + done + sed -i -e "s|- seeds: \"127.0.0.1\"|- seeds: \"${seeds}\"|" $config_file + else + seeds="" # 07 format seeds + for server in "$@"; do + seeds="${seeds}\n - ${server}" + done + sed -i -e "/^seeds:/,/^/d" $config_file ; echo -e "seeds:${seeds}" >> $config_file + fi + + sed -i -e "s|listen_address: localhost|listen_address: $PRIVATE_SELF_HOST|" $config_file + sed -i -e "s|rpc_address: localhost|rpc_address: $PUBLIC_SELF_HOST|" $config_file + fi + + # Now that it's configured, start Cassandra + nohup /etc/rc.local & + +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/configure_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native Added: cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,55 @@ +# +# 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. +# +function install_cassandra() { + + C_MAJOR_VERSION=$1 + C_TAR_URL=$2 + + c_tar_file=`basename $C_TAR_URL` + c_tar_dir=`echo $c_tar_file | awk -F '-bin' '{print $1}'` + + CASSANDRA_HOME=/usr/local/$c_tar_dir + C_CONF_DIR=/etc/cassandra/conf + C_LOG_DIR=/var/log/cassandra + + install_tarball $C_TAR_URL + + echo "export CASSANDRA_HOME=$CASSANDRA_HOME" >> /etc/profile + echo "export CASSANDRA_CONF=$C_CONF_DIR" >> /etc/profile + echo 'export PATH=$CASSANDRA_HOME/bin:$PATH' >> /etc/profile + + mkdir -p /mnt/cassandra/logs + ln -s /mnt/cassandra/logs $C_LOG_DIR + mkdir -p $C_CONF_DIR + cp $CASSANDRA_HOME/conf/log4j*.properties $C_CONF_DIR + if [[ "0.6" == "$C_MAJOR_VERSION" ]] ; then + cp $CASSANDRA_HOME/conf/storage-conf.xml $C_CONF_DIR + sed -i -e "s|CASSANDRA_CONF=\$cassandra_home/conf|CASSANDRA_CONF=$C_CONF_DIR|" $CASSANDRA_HOME/bin/cassandra.in.sh + else + cp $CASSANDRA_HOME/conf/cassandra.yaml $C_CONF_DIR + cp $CASSANDRA_HOME/conf/cassandra-env.sh $C_CONF_DIR + # FIXME: this is only necessary because CASSANDRA_CONF/HOME are not in root's environment as they should be + sed -i -e "s|CASSANDRA_CONF=\$CASSANDRA_HOME/conf|CASSANDRA_CONF=$C_CONF_DIR|" $CASSANDRA_HOME/bin/cassandra.in.sh + fi + + # Ensure Cassandra starts on boot + sed -i -e "s/exit 0//" /etc/rc.local + cat >> /etc/rc.local <<EOF +$CASSANDRA_HOME/bin/cassandra > /dev/null 2>&1 & +EOF + +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/install_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native Added: cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,26 @@ +# +# 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. +# + +function nodetool_cassandra() { + set -x + set -e + + . /etc/profile + + sudo nodetool -h localhost $* + exit $? +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/nodetool_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native Added: cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,27 @@ +# +# 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. +# + +function start_cassandra() { + set -x + set -e + + . /etc/profile + + # launch using the script created by install + sudo nohup /etc/rc.local & + sleep 5 +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/start_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native Added: cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,28 @@ +# +# 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. +# + +function stop_cassandra() { + set -x + set -e + + . /etc/profile + + # assume we are the only java process + # FIXME: unsafe assumption, but easier than true init + sudo killall java + exit $? +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/stop_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native Added: cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh?rev=1153688&view=auto ============================================================================== --- cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh (added) +++ cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh Wed Aug 3 22:10:32 2011 @@ -0,0 +1,27 @@ +# +# 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. +# + +function wipe_cassandra() { + set -x + set -e + + . /etc/profile + + DD=/var/lib/cassandra + sudo rm -Rf $DD/data $DD/commitlog $DD/saved_caches + exit $? +} Propchange: cassandra/branches/cassandra-0.8/test/resources/functions/wipe_cassandra.sh ------------------------------------------------------------------------------ svn:eol-style = native