Browse Source

renamed classes and files, fixed issues, added comments

# Conflicts:
#	ChangeLog
#	src/lib/dhcpsrv/cfg_hosts.cc
Tomek Mrugalski 9 years ago
parent
commit
a47f78f491

+ 2 - 4
configure.ac

@@ -1012,11 +1012,9 @@ if test "$CQL_CONFIG" != "" ; then
         AC_MSG_ERROR([--with-cql should point to a cql_config program])
     fi
 
-    CQL_CPPFLAGS=`$CQL_CONFIG --cppflags`
     CQL_INCLUDEDIR=`$CQL_CONFIG --includedir`
-    CQL_CPPFLAGS="$CQL_CPPFLAGS -I$CQL_INCLUDEDIR"
-    CQL_LIBS=`$CQL_CONFIG --libdir`
-    CQL_LIBS="-L$CQL_LIBS -lcassandra_static -luv"
+    CQL_CPPFLAGS="`$CQL_CONFIG --cppflags` -I$CQL_INCLUDEDIR"
+    CQL_LIBS="-L`$CQL_CONFIG --libdir` -lcassandra_static -luv"
     CQL_VERSION=`$CQL_CONFIG --version`
 
     AC_SUBST(CQL_CPPFLAGS)

+ 13 - 8
src/bin/admin/admin-utils.sh

@@ -48,11 +48,11 @@ pgsql_execute() {
     QUERY=$1
     shift
     if [ $# -gt 0 ]; then
-        echo $QUERY | psql --set ON_ERROR_STOP=1 -A -t -q $*
+        echo $QUERY | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q $*
         retcode=$?
     else
         export PGPASSWORD=$db_password
-        echo $QUERY | psql --set ON_ERROR_STOP=1 -A -t -q -U $db_user -d $db_name
+        echo $QUERY | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U $db_user -d $db_name
         retcode=$?
     fi
     return $retcode
@@ -72,11 +72,11 @@ pgsql_execute_script() {
     file=$1
     shift
     if [ $# -gt 0 ]; then
-        psql --set ON_ERROR_STOP=1 -A -t -q -f $file $*
+        psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -f $file $*
         retcode=$?
     else
         export PGPASSWORD=$db_password
-        psql --set ON_ERROR_STOP=1 -A -t -q -U $db_user -d $db_name -f $file
+        psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U $db_user -d $db_name -h localhost -f $file
         retcode=$?
     fi
     return $retcode
@@ -88,14 +88,19 @@ pgsql_version() {
 }
 
 cql_execute() {
-    QUERY=$1
+    query=$1
     shift
     if [ $# -gt 1 ]; then
-        cqlsh $* -e "${QUERY}"
+        cqlsh $* -e "$query"
         retcode=$?
     else
-        cqlsh -u $db_user -p $db_password -e "${QUERY}" -k $db_name
-        retcode="$?"
+        cqlsh -u $db_user -p $db_password -k $db_name -e "$query"
+        retcode=$?
+    fi
+
+    if [ $retcode -ne 0 ]; then
+        printf "cqlsh returned with exit status $retcode\n"
+        exit $retcode
     fi
 
     return $retcode

+ 36 - 44
src/bin/admin/kea-admin.in

@@ -201,44 +201,31 @@ pgsql_init() {
 }
 
 cql_init() {
-    printf "Checking if there is a database initialized already. Please ignore errors.\n"
-
-    # Let's try to count the number of tables. Anything above 0 means that there
-    # is some database in place. If there is anything, we abort. Note that
-    # cql may spit out connection or access errors to stderr, we ignore those.
-    # We should not hide them as they may give hints to user what is wrong with
-    # his setup.
-    #
-    RESULT=`echo "DESCRIBE keyspaces;" | cqlsh`
-    ERRCODE=$?
-    if [ $ERRCODE -ne  0 ]
-    then
-        log_error "cql_init table query failed, cqlsh status = $ERRCODE"
-        exit 1
+    printf "Checking if there is a database initialized already... Please ignore errors.\n"
+
+    result=`cql_execute "DESCRIBE KEYSPACES;"`
+    if [ "$result" != "" ]; then
+        result=`echo "$result" | sed -n "/$db_name/ p"`
+        if [ "$result" = "" ]; then
+            printf "Creating keyspace $db_name...\n"
+            cql_execute "CREATE KEYSPACE $db_name WITH replication = {'class' : 'SimpleStrategy','replication_factor' : 1};"
+        else
+            printf "Keyspace $db_name already exists.\n"
+        fi
     fi
 
-    COUNT=`echo $RESULT | tr " " "\n" | grep $db_name | wc -w`
-    if [ $COUNT -gt 0 ]; then
-        # Let't start with a new line. cqlsh could have printed something out.
-        printf "\n"
-        log_error "Expected no database $db_name, but there are $COUNT databases: \n$RESULT. Aborting."
-        exit 1
+    result=`cql_execute "USE $db_name; DESCRIBE tables;"`
+    if [ "$result"="<empty>" ]; then
+        printf "Creating and initializing tables using script %s...\n" $scripts_dir/cql/dhcpdb_create.cql
+        cql_execute_script $scripts_dir/cql/dhcpdb_create.cql
+    else
+        printf "Tables are already created.\n"
     fi
 
-    printf "Initializing database using script %s\n" $scripts_dir/cql/dhcpdb_create.cql
-    cqlsh -u $db_user -p $db_password -e "CREATE KEYSPACE $db_name WITH replication = {'class' : 'SimpleStrategy','replication_factor' : 1};"
-    cqlsh -u $db_user -p $db_password -k $db_name -f $scripts_dir/cql/dhcpdb_create.cql
-    ERRCODE=$?
-
-    printf "cqlsh returned status code $ERRCODE\n"
-
-    if [ "$ERRCODE" -eq 0 ]; then
-        printf "Lease DB version reported after initialization: "
-        cql_version
-        printf "\n"
-    fi
+    version=`cql_version`
+    printf "Lease DB version reported after initialization: $version\n"
 
-    exit $ERRCODE
+    return 0
 }
 
 ### Functions that implement database version checking commands
@@ -333,22 +320,27 @@ cql_upgrade() {
         exit 1
     fi
 
-    # Check if there are any files in it
-    num_files=$(find ${scripts_dir}/cql/upgrade*.sh -type f | wc -l)
-    if [ $num_files -eq 0 ]; then
-        log_error "No scripts in ${scripts_dir}/cql or the directory is not readable or does not have any upgrade* scripts."
+    # Check if directory is readable.
+    if [ ! -r ${scripts_dir}/cql ]; then
+        log_error "Directory is not readable: ${scripts_dir}/cql"
         exit 1
     fi
 
-    for script in ${scripts_dir}/cql/upgrade*.sh
-    do
-        echo "Processing $script file..."
-        sh ${script} -u ${db_user} -p ${db_password} -k ${db_name}
-    done
+    # Check if there are upgrade scripts.
+    files=$(find ${scripts_dir}/cql/upgrade*.sh -type f)
+    if [ $? -eq 0 ]; then # Upgrade scripts are present.
+        for script in ${scripts_dir}/cql/upgrade*.sh
+        do
+            echo "Processing $script file..."
+            sh ${script} -u ${db_user} -p ${db_password} -k ${db_name}
+        done
+    else
+        echo "No upgrade script available."
+    fi
 
     version=`cql_version`
     printf "Lease DB version reported after upgrade: $version\n"
-    exit 0
+    return 0
 }
 
 # Utility function which tests if the given file exists and
@@ -543,7 +535,7 @@ cql_dump() {
     # delete the tmp file on success
     rm $tmp_file
     echo lease$dump_type successfully dumped to $dump_file
-    exit 0
+    return 0
 }
 
 ### Script starts here ###

+ 0 - 38
src/bin/admin/tests/cql_tests.sh

@@ -1,38 +0,0 @@
-#!/bin/sh
-
-# Copyright (C) 2014-2015 Internet Systems Consortium, Inc. ("ISC")
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-# Include common test library.
-. /home/andrei/work/git/isc-kea-integration/kea/src/lib/testutils/dhcp_test_lib.sh
-
-cql_init_test() {
-    test_start "cql.init"
-    
-    # @todo: Implement this
-
-    test_finish 0
-}
-
-cql_version_test() {
-    test_start "cql.version"
-    
-    # @todo: Implement this
-
-    test_finish 0
-}
-
-cql_upgrade_test() {
-    test_start "cql.upgrade"
-    
-    # @todo: Implement this
-
-    test_finish 0
-}
-
-cql_init_test
-cql_version_test
-cql_upgrade_test

+ 86 - 6
src/bin/admin/tests/cql_tests.sh.in

@@ -9,26 +9,106 @@
 # Include common test library.
 . @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh
 
+# Include admin utilities
+. @abs_top_srcdir@/src/bin/admin/admin-utils.sh
+
+# Set path to the production schema scripts
+db_scripts_dir=@abs_top_srcdir@/src/share/database/scripts
+
+db_user="keatest"
+db_password="keatest"
+db_name="keatest"
+
+# Set location of the kea-admin.
+keaadmin=@abs_top_builddir@/src/bin/admin/kea-admin
+
 cql_init_test() {
     test_start "cql.init"
-    
-    # @todo: Implement this
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
+
+    # Create the database
+    $keaadmin lease-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir
+    assert_eq 0 $? "kea-admin lease-init cql failed, expected exit code: %d, actual: %d"
+
+    # Verify that all the expected tables exist
+
+    # Check schema_version table
+    cql_execute "SELECT version, minor FROM schema_version;"
+    assert_eq 0 $? "schema_version table check failed, expected exit code: %d, actual: %d"
+
+    # Check lease4 table
+    cql_execute "SELECT address, hwaddr, client_id, valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, state FROM lease4;"
+    assert_eq 0 $? "lease4 table check failed, expected exit code: %d, actual: %d"
+
+    # Check lease6 table
+    cql_execute "SELECT address, duid, valid_lifetime, expire, subnet_id, pref_lifetime, lease_type, iaid, prefix_len, fqdn_fwd, fqdn_rev, hostname,\
+     state FROM lease6;"
+    assert_eq 0 $? "lease6 table check failed, expected exit code: %d, actual: %d"
+
+    # Check lease6_types table
+    cql_execute "SELECT lease_type, name FROM lease6_types;"
+    assert_eq 0 $? "lease6_types table check failed, expected exit code: %d, actual: %d"
+
+    # Check lease_state table
+    cql_execute "SELECT state, name FROM lease_state;"
+    assert_eq 0 $? "lease_state table check failed, expected exit code: %d, actual: %d"
+
+    # Trying to create it again should fail.  This verifies the db present
+    # check
+    echo ""
+    echo "Making sure keyspace creation fails the second time..."
+    $keaadmin lease-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir
+    assert_eq 2 $? "kea-admin failed to deny lease-init, expected exit code: %d, actual: %d"
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
 
     test_finish 0
 }
 
 cql_version_test() {
     test_start "cql.version"
-    
-    # @todo: Implement this
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
+
+    # Create the database
+    $keaadmin lease-init cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir
+    assert_eq 0 $? "kea-admin lease-init cql failed, expected exit code: %d, actual: %d"
+
+    # Verfiy that kea-admin lease-version returns the correct version
+    version=$($keaadmin lease-version cql -u $db_user -p $db_password -n $db_name)
+    assert_str_eq "1.0" $version "Expected kea-admin to return %s, returned value was %s"
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
 
     test_finish 0
 }
 
 cql_upgrade_test() {
     test_start "cql.upgrade"
-    
-    # @todo: Implement this
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
+
+    # Initialize database to schema 1.0.
+    cql_execute_script @abs_top_srcdir@/src/bin/admin/tests/dhcpdb_create_1.0.cql
+    assert_eq 0 $? "cannot initialize the database, expected exit code: %d, actual: %d"
+
+    $keaadmin lease-upgrade cql -u $db_user -p $db_password -n $db_name -d $db_scripts_dir
+    assert_eq 0 $? "lease-upgrade failed, expected exit code: %d, actual: %d"
+
+    # Wipe the database.
+    cql_execute_script $db_scripts_dir/cql/dhcpdb_drop.cql
+    assert_eq 0 $? "drop table query failed, exit code %d, expected %d"
 
     test_finish 0
 }

+ 2 - 4
src/bin/admin/tests/dhcpdb_create_1.0.cql

@@ -31,7 +31,7 @@
 
 -- SOURCE dhcpdb_create.cql
 
+-- This script is also called from kea-admin, see kea-admin lease-init cql
 
 -- Over time, Kea database schema will evolve. Each version is marked with
 -- major.minor version. This file is organized sequentially, i.e. database
@@ -103,11 +103,10 @@ CREATE TABLE lease6_types (
     name varchar,                               -- Name of the lease type
     PRIMARY KEY (lease_type)
 );
---START TRANSACTION;
 INSERT INTO lease6_types (lease_type, name) VALUES (0, 'IA_NA');   -- Non-temporary v6 addresses
 INSERT INTO lease6_types (lease_type, name) VALUES (1, 'IA_TA');   -- Temporary v6 addresses
 INSERT INTO lease6_types (lease_type, name) VALUES (2, 'IA_PD');   -- Prefix delegations
---COMMIT;
+
 
 -- Kea keeps track of the hardware/MAC address source, i.e. how the address
 -- was obtained. Depending on the technique and your network topology, it may
@@ -199,15 +198,9 @@ INSERT INTO lease_state (state, name) VALUES (2, 'expired-reclaimed');
 -- (related to the names of the columns in the BIND 10 DNS database file), the
 -- first column is called "version" and not "major".
 
 CREATE TABLE schema_version (
     version int,
     minor int,
     PRIMARY KEY (version)
 );
---START TRANSACTION;
 INSERT INTO schema_version (version, minor) VALUES (1, 0);
---COMMIT;

+ 4 - 3
src/lib/dhcpsrv/cql_connection.cc

@@ -119,7 +119,8 @@ CqlConnection::openDatabase() {
 
     session_ = cass_session_new();
 
-    CassFuture* connect_future = cass_session_connect_keyspace(session_, cluster_, keyspace);
+    CassFuture* connect_future = cass_session_connect_keyspace(session_,
+        cluster_, keyspace);
     cass_future_wait(connect_future);
     std::string error;
     checkStatementError(error, connect_future, "could not connect to DB");
@@ -199,9 +200,9 @@ CqlConnection::rollback() {
     LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL, DHCPSRV_CQL_ROLLBACK);
 }
 
-
 void
-CqlConnection::checkStatementError(std::string& error, CassFuture* future, uint32_t stindex, const char* what) const
+CqlConnection::checkStatementError(std::string& error, CassFuture* future,
+    uint32_t stindex, const char* what) const
 {
     CassError rc;
     const char* errorMessage;

+ 2 - 2
src/lib/dhcpsrv/cql_connection.h

@@ -79,7 +79,7 @@ public:
     ///
     /// @return Type of the backend.
     virtual std::string getType() const {
-        return (std::string("cassandra"));
+        return (std::string("cql"));
     }
 
     /// @brief Returns name of the database.
@@ -133,7 +133,7 @@ public:
     CassCluster* cluster_;
     CassSession* session_;
     std::vector<const CassPrepared*> statements_;       ///< Prepared statements
-    CqlTaggedStatement *tagged_statements_;
+    CqlTaggedStatement* tagged_statements_;
 };
 
 }; // end of isc::dhcp namespace

+ 16 - 17
src/lib/dhcpsrv/dhcpsrv_messages.mes

@@ -326,9 +326,9 @@ IPv4 leases from the memory file database for a client with the specified
 hardware address.
 
 % DHCPSRV_MEMFILE_GET_IAID_DUID obtaining IPv6 leases for IAID %1 and DUID %2 and lease type %3
-A debug message issued when the server is attempting to obtain a set of
-IPv6 lease from the memory file database for a client with the specified
-IAID (Identity Association ID) and DUID (DHCP Unique Identifier).
+A debug message issued when the server is attempting to obtain a set of IPv6
+leases from the memory file database for a client with the specified IAID
+(Identity Association ID) and DUID (DHCP Unique Identifier).
 
 % DHCPSRV_MEMFILE_GET_IAID_SUBID_DUID obtaining IPv6 leases for IAID %1, Subnet ID %2, DUID %3 and lease type %4
 A debug message issued when the server is attempting to obtain an IPv6
@@ -518,9 +518,9 @@ of IPv4 leases from the MySQL database for a client with the specified
 hardware address.
 
 % DHCPSRV_MYSQL_GET_IAID_DUID obtaining IPv6 leases for IAID %1, DUID %2, lease type %3
-A debug message issued when the server is attempting to obtain a set of
-IPv6 lease from the MySQL database for a client with the specified IAID
-(Identity Association ID) and DUID (DHCP Unique Identifier).
+A debug message issued when the server is attempting to obtain a set of IPv6
+leases from the MySQL database for a client with the specified IAID (Identity
+Association ID) and DUID (DHCP Unique Identifier).
 
 % DHCPSRV_MYSQL_GET_IAID_SUBID_DUID obtaining IPv6 leases for IAID %1, Subnet ID %2, DUID %3, lease type %4
 A debug message issued when the server is attempting to obtain an IPv6
@@ -663,8 +663,8 @@ of IPv4 leases from the PostgreSQL database for a client with the specified
 hardware address.
 
 % DHCPSRV_PGSQL_GET_IAID_DUID obtaining IPv4 leases for IAID %1 and DUID %2, lease type %3
-A debug message issued when the server is attempting to obtain a set of
-IPv6 lease from the PostgreSQL database for a client with the specified IAID
+A debug message issued when the server is attempting to obtain a set of IPv6
+leases from the PostgreSQL database for a client with the specified IAID
 (Identity Association ID) and DUID (DHCP Unique Identifier).
 
 % DHCPSRV_PGSQL_GET_IAID_SUBID_DUID obtaining IPv4 leases for IAID %1, Subnet ID %2, DUID %3, and lease type %4
@@ -818,7 +818,7 @@ A debug message issued when the server is about to add an IPv6 lease
 with the specified address to the Cassandra backend database.
 
 % DHCPSRV_CQL_COMMIT committing to Cassandra database
-The code has issued a commit call.
+A commit call been issued on the server. For Cassandra, this is a no-op.
 
 % DHCPSRV_CQL_DB opening Cassandra lease database: %1
 This informational message is logged when a DHCP server (either V4 or
@@ -827,9 +827,8 @@ the connection including database name and username needed to access it
 (but not the password if any) are logged.
 
 % DHCPSRV_CQL_DELETE_ADDR deleting lease for address %1
-A debug message issued when the server is attempting to delete a lease
-for the specified address from the Cassandra database for the specified
-address.
+A debug message issued when the server is attempting to delete a lease from the
+Cassandra database for the specified address.
 
 % DHCPSRV_CQL_DELETE_EXPIRED_RECLAIMED4 deleting reclaimed IPv4 leases that expired more than %1 seconds ago
 A debug message issued when the server is removing reclaimed DHCPv4
@@ -877,9 +876,9 @@ IPv4 leases from the Cassandra database for a client with the specified
 hardware address.
 
 % DHCPSRV_CQL_GET_IAID_DUID obtaining IPv6 leases for IAID %1 and DUID %2 and lease type %3
-A debug message issued when the server is attempting to obtain a set of
-IPv6 lease from the Cassandra database for a client with the specified
-IAID (Identity Association ID) and DUID (DHCP Unique Identifier).
+A debug message issued when the server is attempting to obtain a set of IPv6
+leases from the Cassandra database for a client with the specified IAID
+(Identity Association ID) and DUID (DHCP Unique Identifier).
 
 % DHCPSRV_CQL_GET_IAID_SUBID_DUID obtaining IPv6 leases for IAID %1, Subnet ID %2, DUID %3 and lease type %4
 A debug message issued when the server is attempting to obtain an IPv6
@@ -901,7 +900,8 @@ A debug message issued when the server is about to obtain schema version
 information from the Cassandra database.
 
 % DHCPSRV_CQL_ROLLBACK rolling back Cassandra database
-The code has issued a rollback call.
+The code has issued a rollback call. For Cassandra, this is
+a no-op.
 
 % DHCPSRV_CQL_UPDATE_ADDR4 updating IPv4 lease for address %1
 A debug message issued when the server is attempting to update IPv4
@@ -910,4 +910,3 @@ lease from the Cassandra database for the specified address.
 % DHCPSRV_CQL_UPDATE_ADDR6 updating IPv6 lease for address %1
 A debug message issued when the server is attempting to update IPv6
 lease from the Cassandra database for the specified address.
-

+ 2 - 2
src/lib/dhcpsrv/lease_mgr_factory.cc

@@ -74,7 +74,7 @@ LeaseMgrFactory::create(const std::string& dbaccess) {
 #ifdef HAVE_CQL
     if (parameters[type] == string("cql")) {
         LOG_INFO(dhcpsrv_logger, DHCPSRV_CQL_DB).arg(redacted);
-        getLeaseMgrPtr().reset(new CQLLeaseMgr(parameters));
+        getLeaseMgrPtr().reset(new CqlLeaseMgr(parameters));
         return;
     }
 #endif
@@ -87,7 +87,7 @@ LeaseMgrFactory::create(const std::string& dbaccess) {
     // Get here on no match
     LOG_ERROR(dhcpsrv_logger, DHCPSRV_UNKNOWN_DB).arg(parameters[type]);
     isc_throw(InvalidType, "Database access parameter 'type' does "
-              "not specify a supported database backend");
+              "not specify a supported database backend:" << parameters[type]);
 }
 
 void

+ 1 - 1
src/lib/dhcpsrv/mysql_lease_mgr.h

@@ -376,7 +376,7 @@ public:
     /// Commits all pending database operations.  On databases that don't
     /// support transactions, this is a no-op.
     ///
-    /// @throw DbOperationError Iif the commit failed.
+    /// @throw DbOperationError If the commit failed.
     virtual void commit();
 
     /// @brief Rollback Transactions

+ 1 - 1
src/lib/dhcpsrv/pgsql_lease_mgr.cc

@@ -159,7 +159,7 @@ PgSqlTaggedStatement tagged_statements[] = {
 
     // INSERT_LEASE4
     { 10, { OID_INT8, OID_BYTEA, OID_BYTEA, OID_INT8, OID_TIMESTAMP, OID_INT8,
-            OID_BOOL, OID_BOOL, OID_VARCHAR, OID_INT8, OID_INT8 },
+            OID_BOOL, OID_BOOL, OID_VARCHAR, OID_INT8 },
       "insert_lease4",
       "INSERT INTO lease4(address, hwaddr, client_id, "
         "valid_lifetime, expire, subnet_id, fqdn_fwd, fqdn_rev, hostname, "

+ 1 - 1
src/lib/dhcpsrv/pgsql_lease_mgr.h

@@ -351,7 +351,7 @@ public:
     ///
     /// Commits all pending database operations.
     ///
-    /// @throw DbOperationError Iif the commit failed.
+    /// @throw DbOperationError If the commit failed.
     virtual void commit();
 
     /// @brief Rollback Transactions

+ 8 - 8
src/lib/dhcpsrv/tests/cql_lease_mgr_unittest.cc

@@ -45,8 +45,8 @@ public:
     CqlLeaseMgrTest() {
 
         // Ensure schema is the correct one.
-        destroyCqlSchema();
-        createCqlSchema();
+        destroyCqlSchema(false, true);
+        createCqlSchema(false, true);
 
         // Connect to the database
         try {
@@ -69,7 +69,7 @@ public:
     virtual ~CqlLeaseMgrTest() {
         lmptr_->rollback();
         LeaseMgrFactory::destroy();
-        destroyCqlSchema();
+        destroyCqlSchema(false, true);
     }
 
     /// @brief Reopen the database
@@ -97,8 +97,8 @@ public:
 TEST(CQLOpenTest, OpenDatabase) {
 
     // Schema needs to be created for the test to work.
-    destroyCqlSchema();
-    createCqlSchema();
+    destroyCqlSchema(false, true);
+    createCqlSchema(false, true);
 
     // Check that lease manager open the database opens correctly and tidy up.
     //  If it fails, print the error message.
@@ -147,15 +147,15 @@ TEST(CQLOpenTest, OpenDatabase) {
         NoDatabaseName);
 
     // Tidy up after the test
-    destroyCqlSchema();
+    destroyCqlSchema(false, true);
 }
 
 /// @brief Check the getType() method
 ///
 /// getType() returns a string giving the type of the backend, which should
-/// always be "cassandra".
+/// always be "cql".
 TEST_F(CqlLeaseMgrTest, getType) {
-    EXPECT_EQ(std::string("cassandra"), lmptr_->getType());
+    EXPECT_EQ(std::string("cql"), lmptr_->getType());
 }
 
 /// @brief Check conversion functions

+ 13 - 0
src/lib/dhcpsrv/testutils/Makefile.am

@@ -20,6 +20,10 @@ libdhcpsrvtest_la_SOURCES += schema.cc schema.h
 else
 if HAVE_PGSQL
 libdhcpsrvtest_la_SOURCES += schema.cc schema.h
+else
+if HAVE_CQL
+libdhcpsrvtest_la_SOURCES += schema.cc schema.h
+endif
 endif
 endif
 
@@ -29,6 +33,9 @@ endif
 if HAVE_PGSQL
 libdhcpsrvtest_la_SOURCES += pgsql_schema.cc pgsql_schema.h
 endif
+if HAVE_CQL
+libdhcpsrvtest_la_SOURCES += cql_schema.cc cql_schema.h
+endif
 
 libdhcpsrvtest_la_CXXFLAGS = $(AM_CXXFLAGS)
 libdhcpsrvtest_la_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
@@ -38,6 +45,9 @@ endif
 if HAVE_PGSQL
 libdhcpsrvtest_la_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_CQL
+libdhcpsrvtest_la_CPPFLAGS += $(CQL_CPPFLAGS)
+endif
 
 libdhcpsrvtest_la_LDFLAGS  = $(AM_LDFLAGS)
 if HAVE_MYSQL
@@ -46,6 +56,9 @@ endif
 if HAVE_PGSQL
 libdhcpsrvtest_la_LDFLAGS  += $(PGSQL_LIBS)
 endif
+if HAVE_CQL
+libdhcpsrvtest_la_LDFLAGS  += $(CQL_LIBS)
+endif
 
 libdhcpsrvtest_la_LIBADD   = $(top_builddir)/src/lib/cc/libkea-cc.la
 libdhcpsrvtest_la_LIBADD  += $(top_builddir)/src/lib/log/libkea-log.la

+ 28 - 8
src/lib/dhcpsrv/testutils/cql_schema.cc

@@ -21,7 +21,7 @@ namespace isc {
 namespace dhcp {
 namespace test {
 
-const char* CQL_VALID_TYPE = "type=cassandra";
+const char* CQL_VALID_TYPE = "type=cql";
 
 string
 validCqlConnectionString() {
@@ -29,25 +29,45 @@ validCqlConnectionString() {
                              VALID_USER, VALID_PASSWORD));
 }
 
-void destroyCqlSchema(bool show_err) {
-    runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_drop.cql", show_err);
+bool softWipeEnabled() {
+    const char* const env = getenv("KEA_TEST_CASSANDRA_WIPE");
+    if (env && (string(env) == string("soft"))) {
+        return (true);
+    }
+
+    return (false);
 }
 
-void createCqlSchema(bool show_err) {
-    runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_create.cql",
-                   show_err);
+void destroyCqlSchema(bool , bool show_err) {
+//    if (force_wipe || !softWipeEnabled()) {
+        // Do full wipe
+        runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_drop.cql", show_err);
+//    } else {
+
+        // do soft wipe (just remove the data, not the structures)
+//        runCqlScript(DATABASE_SCRIPTS_DIR, "cql/soft_wipe.cql", show_err);
+//    }
+}
+
+void createCqlSchema(bool force_wipe, bool show_err) {
+    if (force_wipe || !softWipeEnabled()) {
+        runCqlScript(DATABASE_SCRIPTS_DIR, "cql/dhcpdb_create.cql",
+                        show_err);
+    }
 }
 
 void runCqlScript(const std::string& path, const std::string& script_name,
                     bool show_err) {
     std::ostringstream cmd;
-    cmd << "cqlsh -u keatest -p keatest -k keatest -f";
+    cmd << "cqlsh -u keatest -p keatest -k keatest";
     if (!show_err) {
         cmd << " 2>/dev/null ";
     }
 
+    cmd << " -f";
+
     if (!path.empty()) {
-        cmd << " < " << path << "/";
+        cmd << path << "/";
     }
 
     cmd << script_name;

+ 30 - 3
src/lib/dhcpsrv/testutils/cql_schema.h

@@ -32,8 +32,10 @@ std::string validCqlConnectionString();
 /// will fail. The output of stderr is suppressed unless the parameter,
 /// show_err is true.
 ///
+/// @param force_wipe forces wipe of the database, even if KEA_TEST_CASSANDRA_WIPE
+///                   is set.
 /// @param show_err flag which governs whether or not stderr is suppressed.
-void destroyCqlSchema(bool show_err = false);
+void destroyCqlSchema(bool force_wipe, bool show_err = false);
 
 /// @brief Create the CQL Schema
 ///
@@ -45,10 +47,12 @@ void destroyCqlSchema(bool show_err = false);
 /// will fail. The output of stderr is suppressed unless the parameter,
 /// show_err is true.
 ///
+/// @param force_wipe forces wipe of the database, even if KEA_TEST_CASSANDRA_WIPE
+///                   is set.
 /// @param show_err flag which governs whether or not stderr is suppressed.
-void createCqlSchema(bool show_err = false);
+void createCqlSchema(bool force_wipe, bool show_err = false);
 
-/// @brief Run a CQL SQL script against the CQL unit test database
+/// @brief Run a CQL script against the CQL unit test database
 ///
 /// Submits the given SQL script to CQL via cqlsh CLI. The output of
 /// stderr is suppressed unless the parameter, show_err is true.  The is done
@@ -61,6 +65,29 @@ void createCqlSchema(bool show_err = false);
 void runCqlScript(const std::string& path, const std::string& script_name,
                     bool show_err);
 
+/// @brief Returns status if the soft-wipe is enabled or not.
+///
+/// In some deployments (In case of Tomek's dev system) Cassandra tests take
+/// a very long time to execute. This was traced back to slow table/indexes
+/// creation/deletion. With full wipe and recreation of all structures, it
+/// took over 60 seconds for each test to execute. To avoid this problem, a
+/// feature called soft-wipe has been implemented. If enabled, it does not
+/// remove the structures, just the data from essential tables. To enable
+/// it set KEA_TEST_CASSANDRA_WIPE environment variable to 'soft'. Make sure
+/// that the database schema is set up properly before running in soft-wipe
+/// mode.
+///
+/// For example to use soft-wipe mode, you can:
+///
+/// $ cqlsh -u keatest -p keatest -k keatest
+///         -f src/share/database/scripts/cql/dhcpdb_create.cql
+/// $ export KEA_TEST_CASSANDRA_WIPE=soft
+/// $ cd src/lib/dhcpsrv
+/// $ make -j9
+/// $ tests/libdhcpsrv_unittests --gtest_filter=CqlLeaseMgrTest.*
+///
+/// @return true if soft-wipe is enabled, false otherwise
+bool softWipeEnabled();
 };
 };
 };

+ 1 - 1
src/lib/dhcpsrv/testutils/pgsql_schema.cc

@@ -49,7 +49,7 @@ void runPgSQLScript(const std::string& path, const std::string& script_name,
     }
 
     cmd << script_name
-        << " | psql --set ON_ERROR_STOP=1 -A -t -q -U keatest -d keatest";
+        << " | psql --set ON_ERROR_STOP=1 -A -t -h localhost -q -U keatest -d keatest";
 
     if (!show_err) {
         cmd << " 2>/dev/null ";

+ 1 - 2
src/share/database/scripts/cql/Makefile.am

@@ -1,7 +1,6 @@
 SUBDIRS = .
 
 sqlscriptsdir = ${datarootdir}/${PACKAGE_NAME}/scripts/cql
-sqlscripts_DATA = dhcpdb_create.cql
-sqlscripts_DATA += dhcpdb_drop.cql
+sqlscripts_DATA = dhcpdb_create.cql dhcpdb_drop.cql
 
 EXTRA_DIST = ${sqlscripts_DATA}

+ 1 - 1
src/share/database/scripts/mysql/dhcpdb_create.mysql

@@ -19,7 +19,7 @@
 #
 # source dhcpdb_create.mysql
 #
-# This script is also called from kea-admin, see kea-admin init mysql
+# This script is also called from kea-admin, see kea-admin lease-init mysql
 #
 # Over time, Kea database schema will evolve. Each version is marked with
 # major.minor version. This file is organized sequentially, i.e. database