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)
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
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
}
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
}
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
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
# 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 ###
+++ /dev/null
-#!/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
# 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
}
-- SOURCE dhcpdb_create.cql
--- This script is also called from kea-admin, see kea-admin init 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
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
-- (related to the names of the columns in the BIND 10 DNS database file), the
-- first column is called "version" and not "major".
--- NOTE: this MUST be kept in step with src/lib/dhcpsrv/tests/schema_copy.h,
--- which defines the schema for the unit tests. If you are updating
--- the version number, the schema has changed: please ensure that
--- schema_copy.h has been updated as well.
CREATE TABLE schema_version (
version int,
minor int,
PRIMARY KEY (version)
);
---START TRANSACTION;
INSERT INTO schema_version (version, minor) VALUES (1, 0);
---COMMIT;
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");
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;
///
/// @return Type of the backend.
virtual std::string getType() const {
- return (std::string("cassandra"));
+ return (std::string("cql"));
}
/// @brief Returns name of the database.
CassCluster* cluster_;
CassSession* session_;
std::vector<const CassPrepared*> statements_; ///< Prepared statements
- CqlTaggedStatement *tagged_statements_;
+ CqlTaggedStatement* tagged_statements_;
};
}; // end of isc::dhcp namespace
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
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
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
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
(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
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
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
% 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.
-
#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
// 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
/// 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
// 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, "
///
/// Commits all pending database operations.
///
- /// @throw DbOperationError Iif the commit failed.
+ /// @throw DbOperationError If the commit failed.
virtual void commit();
/// @brief Rollback Transactions
CqlLeaseMgrTest() {
// Ensure schema is the correct one.
- destroyCqlSchema();
- createCqlSchema();
+ destroyCqlSchema(false, true);
+ createCqlSchema(false, true);
// Connect to the database
try {
virtual ~CqlLeaseMgrTest() {
lmptr_->rollback();
LeaseMgrFactory::destroy();
- destroyCqlSchema();
+ destroyCqlSchema(false, true);
}
/// @brief Reopen the database
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.
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
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
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)
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
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
namespace dhcp {
namespace test {
-const char* CQL_VALID_TYPE = "type=cassandra";
+const char* CQL_VALID_TYPE = "type=cql";
string
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;
/// 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
///
/// 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
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();
};
};
};
}
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 ";
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}
#
# 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