You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ja...@apache.org on 2014/12/15 16:51:46 UTC

[1/2] cassandra git commit: Add auth support to cassandra-stress

Repository: cassandra
Updated Branches:
  refs/heads/trunk 3a609c20c -> 088ffb2b5


Add auth support to cassandra-stress

Path by Mike Adamson; reviewed by tjake for CASSANDRA-7985


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/a78451e5
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/a78451e5
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/a78451e5

Branch: refs/heads/trunk
Commit: a78451e5c6c92c815fb5472956b3165965e5d420
Parents: 254d6f7
Author: T Jake Luciani <ja...@apache.org>
Authored: Mon Dec 15 10:39:55 2014 -0500
Committer: T Jake Luciani <ja...@apache.org>
Committed: Mon Dec 15 10:39:55 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/stress/settings/SettingsMode.java | 63 ++++++++++++++++++--
 .../stress/settings/StressSettings.java         |  6 ++
 .../cassandra/stress/util/JavaDriverClient.java | 17 ++++++
 4 files changed, 83 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/a78451e5/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 07d526c..142d5aa 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.3
+ * Add auth support to cassandra-stress (CASSANDRA-7985)
  * Fix ArrayIndexOutOfBoundsException when generating error message
    for some CQL syntax errors (CASSANDRA-8455)
  * Scale memtable slab allocation logarithmically (CASSANDRA-7882)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a78451e5/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
----------------------------------------------------------------------
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
index 1aa745c..c95ed80 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
@@ -26,6 +26,8 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
+import com.datastax.driver.core.AuthProvider;
+import com.datastax.driver.core.PlainTextAuthProvider;
 import com.datastax.driver.core.ProtocolOptions;
 
 public class SettingsMode implements Serializable
@@ -34,6 +36,12 @@ public class SettingsMode implements Serializable
     public final ConnectionAPI api;
     public final ConnectionStyle style;
     public final CqlVersion cqlVersion;
+
+    public final String username;
+    public final String password;
+    public final String authProviderClassname;
+    public final AuthProvider authProvider;
+
     private final String compression;
 
     public SettingsMode(GroupedOptions options)
@@ -43,8 +51,37 @@ public class SettingsMode implements Serializable
             cqlVersion = CqlVersion.CQL3;
             Cql3Options opts = (Cql3Options) options;
             api = opts.mode().displayPrefix.equals("native") ? ConnectionAPI.JAVA_DRIVER_NATIVE : ConnectionAPI.THRIFT;
-            style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL;
+            style = opts.useUnPrepared.setByUser() ? ConnectionStyle.CQL :  ConnectionStyle.CQL_PREPARED;
             compression = ProtocolOptions.Compression.valueOf(opts.useCompression.value().toUpperCase()).name();
+            username = opts.user.value();
+            password = opts.password.value();
+            authProviderClassname = opts.authProvider.value();
+            if (authProviderClassname != null)
+            {
+                try
+                {
+                    Class<?> clazz = Class.forName(authProviderClassname);
+                    if (!AuthProvider.class.isAssignableFrom(clazz))
+                        throw new IllegalArgumentException(clazz + " is not a valid auth provider");
+                    // check we can instantiate it
+                    if (PlainTextAuthProvider.class.equals(clazz))
+                    {
+                        authProvider = (AuthProvider) clazz.getConstructor(String.class, String.class)
+                            .newInstance(username, password);
+                    } else
+                    {
+                        authProvider = (AuthProvider) clazz.newInstance();
+                    }
+                }
+                catch (Exception e)
+                {
+                    throw new IllegalArgumentException("Invalid auth provider class: " + opts.authProvider.value(), e);
+                }
+            }
+            else
+            {
+                authProvider = null;
+            }
         }
         else if (options instanceof Cql3SimpleNativeOptions)
         {
@@ -53,6 +90,10 @@ public class SettingsMode implements Serializable
             api = ConnectionAPI.SIMPLE_NATIVE;
             style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL;
             compression = ProtocolOptions.Compression.NONE.name();
+            username = null;
+            password = null;
+            authProvider = null;
+            authProviderClassname = null;
         }
         else if (options instanceof Cql2ThriftOptions)
         {
@@ -61,6 +102,10 @@ public class SettingsMode implements Serializable
             Cql2ThriftOptions opts = (Cql2ThriftOptions) options;
             style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL;
             compression = ProtocolOptions.Compression.NONE.name();
+            username = null;
+            password = null;
+            authProvider = null;
+            authProviderClassname = null;
         }
         else if (options instanceof ThriftOptions)
         {
@@ -69,6 +114,10 @@ public class SettingsMode implements Serializable
             api = opts.smart.setByUser() ? ConnectionAPI.THRIFT_SMART : ConnectionAPI.THRIFT;
             style = ConnectionStyle.THRIFT;
             compression = ProtocolOptions.Compression.NONE.name();
+            username = opts.user.value();
+            password = opts.password.value();
+            authProviderClassname = null;
+            authProvider = null;
         }
         else
             throw new IllegalStateException();
@@ -102,15 +151,18 @@ public class SettingsMode implements Serializable
     private static abstract class Cql3Options extends GroupedOptions
     {
         final OptionSimple api = new OptionSimple("cql3", "", null, "", true);
-        final OptionSimple usePrepared = new OptionSimple("prepared", "", null, "", false);
+        final OptionSimple useUnPrepared = new OptionSimple("unprepared", "", null, "force use of unprepared statements", false);
         final OptionSimple useCompression = new OptionSimple("compression=", "none|lz4|snappy", "none", "", false);
         final OptionSimple port = new OptionSimple("port=", "[0-9]+", "9046", "", false);
+        final OptionSimple user = new OptionSimple("user=", ".+", null, "username", false);
+        final OptionSimple password = new OptionSimple("password=", ".+", null, "password", false);
+        final OptionSimple authProvider = new OptionSimple("auth-provider=", ".*", null, "Fully qualified implementation of com.datastax.driver.core.AuthProvider", false);
 
         abstract OptionSimple mode();
         @Override
         public List<? extends Option> options()
         {
-            return Arrays.asList(mode(), usePrepared, api, useCompression, port);
+            return Arrays.asList(mode(), useUnPrepared, api, useCompression, port, user, password, authProvider);
         }
     }
 
@@ -146,11 +198,14 @@ public class SettingsMode implements Serializable
     {
         final OptionSimple api = new OptionSimple("thrift", "", null, "", true);
         final OptionSimple smart = new OptionSimple("smart", "", null, "", false);
+        final OptionSimple user = new OptionSimple("user=", ".+", null, "username", false);
+        final OptionSimple password = new OptionSimple("password=", ".+", null, "password", false);
+
 
         @Override
         public List<? extends Option> options()
         {
-            return Arrays.asList(api, smart);
+            return Arrays.asList(api, smart, user, password);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a78451e5/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
----------------------------------------------------------------------
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java b/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
index 219e7cd..6d2f7ea 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
@@ -25,11 +25,13 @@ import java.io.Serializable;
 import java.util.*;
 
 import com.datastax.driver.core.Metadata;
+import com.google.common.collect.ImmutableMap;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.stress.util.JavaDriverClient;
 import org.apache.cassandra.stress.util.SimpleThriftClient;
 import org.apache.cassandra.stress.util.SmartThriftClient;
 import org.apache.cassandra.stress.util.ThriftClient;
+import org.apache.cassandra.thrift.AuthenticationRequest;
 import org.apache.cassandra.thrift.Cassandra;
 import org.apache.cassandra.thrift.InvalidRequestException;
 import org.apache.cassandra.transport.SimpleClient;
@@ -128,6 +130,10 @@ public class StressSettings implements Serializable
 
             if (setKeyspace)
                 client.set_keyspace(schema.keyspace);
+
+            if (mode.username != null)
+                client.login(new AuthenticationRequest(ImmutableMap.of("username", mode.username, "password", mode.password)));
+
         }
         catch (InvalidRequestException e)
         {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a78451e5/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
----------------------------------------------------------------------
diff --git a/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java b/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
index 295ed25..7aa7257 100644
--- a/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
+++ b/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
@@ -41,6 +41,10 @@ public class JavaDriverClient
 
     public final String host;
     public final int port;
+    public final String username;
+    public final String password;
+    public final AuthProvider authProvider;
+
     private final EncryptionOptions.ClientEncryptionOptions encryptionOptions;
     private Cluster cluster;
     private Session session;
@@ -57,6 +61,9 @@ public class JavaDriverClient
     {
         this.host = host;
         this.port = port;
+        this.username = settings.mode.username;
+        this.password = settings.mode.password;
+        this.authProvider = settings.mode.authProvider;
         this.encryptionOptions = encryptionOptions;
         if (settings.node.isWhiteList)
             whitelist = new WhiteListPolicy(new DCAwareRoundRobinPolicy(), settings.node.resolveAll(settings.port.nativePort));
@@ -96,6 +103,16 @@ public class JavaDriverClient
             SSLOptions sslOptions = new SSLOptions(sslContext, encryptionOptions.cipher_suites);
             clusterBuilder.withSSL(sslOptions);
         }
+
+        if (authProvider != null)
+        {
+            clusterBuilder.withAuthProvider(authProvider);
+        }
+        else if (username != null)
+        {
+            clusterBuilder.withCredentials(username, password);
+        }
+
         cluster = clusterBuilder.build();
         Metadata metadata = cluster.getMetadata();
         System.out.printf("Connected to cluster: %s%n",


[2/2] cassandra git commit: Merge branch 'cassandra-2.1' into trunk

Posted by ja...@apache.org.
Merge branch 'cassandra-2.1' into trunk

Conflicts:
	tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/088ffb2b
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/088ffb2b
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/088ffb2b

Branch: refs/heads/trunk
Commit: 088ffb2b50b2a8dbc541917b65950868079a75d4
Parents: 3a609c2 a78451e
Author: T Jake Luciani <ja...@apache.org>
Authored: Mon Dec 15 10:51:30 2014 -0500
Committer: T Jake Luciani <ja...@apache.org>
Committed: Mon Dec 15 10:51:30 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/stress/settings/SettingsMode.java | 59 ++++++++++++++++++--
 .../stress/settings/StressSettings.java         |  6 ++
 .../cassandra/stress/util/JavaDriverClient.java | 17 ++++++
 4 files changed, 79 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/088ffb2b/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 985a3c9,142d5aa..11189b4
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,45 -1,5 +1,46 @@@
 +3.0
 + * Support for user-defined aggregation functions (CASSANDRA-8053)
 + * Fix NPE in SelectStatement with empty IN values (CASSANDRA-8419)
 + * Refactor SelectStatement, return IN results in natural order instead
 +   of IN value list order (CASSANDRA-7981)
 + * Support UDTs, tuples, and collections in user-defined
 +   functions (CASSANDRA-7563)
 + * Fix aggregate fn results on empty selection, result column name,
 +   and cqlsh parsing (CASSANDRA-8229)
 + * Mark sstables as repaired after full repair (CASSANDRA-7586)
 + * Extend Descriptor to include a format value and refactor reader/writer apis (CASSANDRA-7443)
 + * Integrate JMH for microbenchmarks (CASSANDRA-8151)
 + * Keep sstable levels when bootstrapping (CASSANDRA-7460)
 + * Add Sigar library and perform basic OS settings check on startup (CASSANDRA-7838)
 + * Support for aggregation functions (CASSANDRA-4914)
 + * Remove cassandra-cli (CASSANDRA-7920)
 + * Accept dollar quoted strings in CQL (CASSANDRA-7769)
 + * Make assassinate a first class command (CASSANDRA-7935)
 + * Support IN clause on any clustering column (CASSANDRA-4762)
 + * Improve compaction logging (CASSANDRA-7818)
 + * Remove YamlFileNetworkTopologySnitch (CASSANDRA-7917)
 + * Do anticompaction in groups (CASSANDRA-6851)
 + * Support pure user-defined functions (CASSANDRA-7395, 7526, 7562, 7740, 7781, 7929,
 +   7924, 7812, 8063, 7813)
 + * Permit configurable timestamps with cassandra-stress (CASSANDRA-7416)
 + * Move sstable RandomAccessReader to nio2, which allows using the
 +   FILE_SHARE_DELETE flag on Windows (CASSANDRA-4050)
 + * Remove CQL2 (CASSANDRA-5918)
 + * Add Thrift get_multi_slice call (CASSANDRA-6757)
 + * Optimize fetching multiple cells by name (CASSANDRA-6933)
 + * Allow compilation in java 8 (CASSANDRA-7028)
 + * Make incremental repair default (CASSANDRA-7250)
 + * Enable code coverage thru JaCoCo (CASSANDRA-7226)
 + * Switch external naming of 'column families' to 'tables' (CASSANDRA-4369) 
 + * Shorten SSTable path (CASSANDRA-6962)
 + * Use unsafe mutations for most unit tests (CASSANDRA-6969)
 + * Fix race condition during calculation of pending ranges (CASSANDRA-7390)
 + * Fail on very large batch sizes (CASSANDRA-8011)
 + * Improve concurrency of repair (CASSANDRA-6455, 8208)
 +
 +
  2.1.3
+  * Add auth support to cassandra-stress (CASSANDRA-7985)
   * Fix ArrayIndexOutOfBoundsException when generating error message
     for some CQL syntax errors (CASSANDRA-8455)
   * Scale memtable slab allocation logarithmically (CASSANDRA-7882)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/088ffb2b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
----------------------------------------------------------------------
diff --cc tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
index b258609,c95ed80..2c91b6d
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMode.java
@@@ -53,7 -90,23 +90,11 @@@ public class SettingsMode implements Se
              api = ConnectionAPI.SIMPLE_NATIVE;
              style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL;
              compression = ProtocolOptions.Compression.NONE.name();
+             username = null;
+             password = null;
+             authProvider = null;
+             authProviderClassname = null;
          }
 -        else if (options instanceof Cql2ThriftOptions)
 -        {
 -            cqlVersion = CqlVersion.CQL2;
 -            api = ConnectionAPI.THRIFT;
 -            Cql2ThriftOptions opts = (Cql2ThriftOptions) options;
 -            style = opts.usePrepared.setByUser() ? ConnectionStyle.CQL_PREPARED : ConnectionStyle.CQL;
 -            compression = ProtocolOptions.Compression.NONE.name();
 -            username = null;
 -            password = null;
 -            authProvider = null;
 -            authProviderClassname = null;
 -        }
          else if (options instanceof ThriftOptions)
          {
              ThriftOptions opts = (ThriftOptions) options;