Parcourir la source

added support for datastax cassandra

Razvan Becheriu il y a 9 ans
Parent
commit
53c1c6aaaa

+ 70 - 0
configure.ac

@@ -995,6 +995,58 @@ fi
 # ... and at the shell level, so Makefile.am can take action depending on this.
 AM_CONDITIONAL(HAVE_PGSQL, test "$PG_CONFIG" != "")
 
+dsc_config="no"
+AC_ARG_WITH([dhcp-dscsql],
+  AC_HELP_STRING([--with-dhcp-dscsql=PATH],
+    [path to the DataStaxCassandraSQL 'dsc_config' script]),
+    [dsc_config="$withval"])
+
+if test "${dsc_config}" = "yes" ; then
+    DSC_CONFIG="/usr/bin/dsc_config"
+elif test "${dsc_config}" != "no" ; then
+    DSC_CONFIG="${withval}"
+fi
+
+if test "$DSC_CONFIG" != "" ; then
+    if test -d "$DSC_CONFIG" -o ! -x "$DSC_CONFIG" ; then
+        AC_MSG_ERROR([--with-dhcp-dscsql should point to a dsc_config program])
+    fi
+
+    DSCSQL_CPPFLAGS=`$DSC_CONFIG --cppflags`
+    DSCSQL_INCLUDEDIR=`$DSC_CONFIG --includedir`
+    DSCSQL_CPPFLAGS="$DSCSQL_CPPFLAGS -I$DSCSQL_INCLUDEDIR"
+    DSCSQL_LIBS=`$DSC_CONFIG --libdir`
+    DSCSQL_LIBS="-L$DSCSQL_LIBS -lcassandra_static -luv"
+    DSCSQL_VERSION=`$DSC_CONFIG --version`
+
+    AC_SUBST(DSCSQL_CPPFLAGS)
+    AC_SUBST(DSCSQL_LIBS)
+
+    # Check that a simple program using DSCSQL functions can compile and link.
+    CPPFLAGS_SAVED="$CPPFLAGS"
+    LIBS_SAVED="$LIBS"
+
+    CPPFLAGS="$DSCSQL_CPPFLAGS $CPPFLAGS"
+    LIBS="$DSCSQL_LIBS $LIBS"
+
+    AC_LINK_IFELSE(
+            [AC_LANG_PROGRAM([#include <cassandra.h>],
+                             [CassCluster* cluster = cass_cluster_new();
+                              cass_cluster_free(cluster);])],
+            [AC_MSG_RESULT([checking for DataStax Cassandra SQL headers and library... yes])],
+            [AC_MSG_RESULT([checking for DataStax Cassandra SQL headers and library... no])
+             AC_MSG_ERROR([Needs DataStax Cassandra SQL library])]
+    )
+    CPPFLAGS=$CPPFLAGS_SAVED
+    LIBS=$LIBS_SAVED
+
+    # Note that DSCSQL is present in the config.h file
+    AC_DEFINE([HAVE_DSCSQL], [1], [DSCSQL is present])
+fi
+
+# ... and at the shell level, so Makefile.am can take action depending on this.
+AM_CONDITIONAL(HAVE_DSCSQL, test "$DSC_CONFIG" != "")
+
 # Check for log4cplus
 log4cplus_path="yes"
 AC_ARG_WITH([log4cplus],
@@ -1409,6 +1461,7 @@ AC_CONFIG_FILES([compatcheck/Makefile
                  src/bin/admin/tests/memfile_tests.sh
                  src/bin/admin/tests/mysql_tests.sh
                  src/bin/admin/tests/pgsql_tests.sh
+                 src/bin/admin/tests/dscsql_tests.sh
                  src/hooks/Makefile
                  src/hooks/dhcp/Makefile
                  src/hooks/dhcp/user_chk/Makefile
@@ -1486,6 +1539,7 @@ AC_CONFIG_FILES([compatcheck/Makefile
                  src/share/database/scripts/pgsql/Makefile
                  src/share/database/scripts/pgsql/upgrade_1.0_to_2.0.sh
                  src/share/database/scripts/pgsql/upgrade_2.0_to_3.0.sh
+                 src/share/database/scripts/dscsql/Makefile
                  tools/Makefile
                  tools/path_replacer.sh
 ])
@@ -1619,6 +1673,22 @@ PostgreSQL:
 END
 fi
 
+if test "$DSCSQL_CPPFLAGS" != "" ; then
+cat >> config.report << END
+
+DataStax Cassandra SQL:
+  DSCSQL_VERSION:   ${DSCSQL_VERSION}
+  DSCSQL_CPPFLAGS:  ${DSCSQL_CPPFLAGS}
+  DSCSQL_LIBS:      ${DSCSQL_LIBS}
+END
+else
+cat >> config.report << END
+
+DataStax Cassandra SQL:
+  no
+END
+fi
+
 if test "$enable_gtest" != "no"; then
 cat >> config.report << END
 

+ 21 - 0
src/bin/admin/admin-utils.sh

@@ -86,3 +86,24 @@ pgsql_version() {
     pgsql_execute "SELECT version || '.' || minor FROM schema_version" "$@"
     return $?
 }
+
+dscsql_execute() {
+    QUERY=$1
+    shift
+    if [ $# -gt 1 ]; then
+        cqlsh $* -e "${QUERY}"
+        retcode=$?
+    else
+        cqlsh -u $db_user -p $db_password -e "${QUERY}" -k $db_name
+        retcode="$?"
+    fi
+
+    return $retcode
+}
+
+dscsql_version() {
+    version=`dscsql_execute "SELECT version, minor FROM schema_version" "$@"`
+    version=`echo "$version" | grep -A 1 "+" | grep -v "+" | tr -d ' ' | cut -d "|" -f 1-2 --output-delimiter="."`
+    echo $version
+    return $?
+}

+ 142 - 3
src/bin/admin/kea-admin.in

@@ -55,7 +55,7 @@ usage() {
     printf " - lease-upgrade: Upgrades your lease database scheme\n"
     printf " - lease-dump: Dump current leases to a CSV file\n"
     printf "\n"
-    printf "BACKEND - one of the supported backends: memfile|mysql|pgsql\n"
+    printf "BACKEND - one of the supported backends: memfile|mysql|pgsql|dscsql\n"
     printf "\n"
     printf "PARAMETERS: Parameters are optional in general, but may be required\n"
     printf "            for specific operation.\n"
@@ -148,7 +148,7 @@ mysql_init() {
     if [ $COUNT -gt 0 ]; then
         # Let't start with a new line. mysql could have printed something out.
         printf "\n"
-        log_error "Expected empty database $db_name, but there are $COUNT tables: \n$_RESULT. Aborting."
+        log_error "Expected empty database $db_name, but there are $COUNT tables: \n$RESULT. Aborting."
         exit 1
     fi
 
@@ -200,6 +200,47 @@ pgsql_init() {
     exit 0
 }
 
+dscsql_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
+    # dsc sql 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 "dscsql_init table query failed, cqlsh status = $ERRCODE"
+        exit 1
+    fi
+
+    COUNT=`echo $RESULT | 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 empty database $db_name, but there are $COUNT tables: \n$RESULT. Aborting."
+        exit 1
+    fi
+
+    printf "Initializing database using script %s\n" $scripts_dir/dscsql/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/dscsql/dhcpdb_create.cql
+    ERRCODE=$?
+
+    printf "cqlsh returned status code $ERRCODE\n"
+
+    if [ "$ERRCODE" -eq 0 ]; then
+        printf "Lease DB version reported after initialization: "
+        dscsql_version
+        printf "\n"
+    fi
+
+    exit $ERRCODE
+}
+
 ### Functions that implement database version checking commands
 memfile_version() {
     # @todo Implement this as part of #3601
@@ -282,6 +323,34 @@ pgsql_upgrade() {
     exit 0
 }
 
+dscsql_upgrade() {
+    version=`dscsql_version`
+    printf "Lease DB version reported before upgrade: $version\n"
+
+    # Check if the scripts directory exists at all.
+    if [ ! -d ${scripts_dir}/dscsql ]; then
+        log_error "Invalid scripts directory: ${scripts_dir}/dscsql"
+        exit 1
+    fi
+
+    # Check if there are any files in it
+    num_files=$(find ${scripts_dir}/dscsql/upgrade*.sh -type f | wc -l)
+    if [ $num_files -eq 0 ]; then
+        log_error "No scripts in ${scripts_dir}/dscsql or the directory is not readable or does not have any upgrade* scripts."
+        exit 1
+    fi
+
+    for script in ${scripts_dir}/dscsql/upgrade*.sh
+    do
+        echo "Processing $script file..."
+        sh ${script} -u ${db_user} -p ${db_password} -k ${db_name}
+    done
+
+    version=`dscsql_version`
+    printf "Lease DB version reported after upgrade: $version\n"
+    exit 0
+}
+
 # Utility function which tests if the given file exists and
 # if so notifies the user and provides them the opportunity
 # to abort the current command.
@@ -315,6 +384,9 @@ get_dump_query() {
     pgsql)
         invoke="select * from"
         ;;
+    dscsql)
+        invoke="select * from"
+        ;;
     *)
         log_error "unsupported backend ${backend}"
         usage
@@ -419,6 +491,61 @@ pgsql_dump() {
     exit 0
 }
 
+dscsql_dump() {
+
+    # get the correct dump query
+    version=`dscsql_version`
+    retcode=$?
+    if [ $retcode -ne 0 ]
+    then
+        log_error "lease-dump: dscsql_version failed, exit code $retcode"
+        exit 1;
+    fi
+
+    # Fetch the correct SQL text. Note this function will exit
+    # if it fails.
+    get_dump_query $version
+
+    # Make sure they specified a file
+    if [ "$dump_file" = "" ]; then
+        log_error "you must specify an output file for lease-dump"
+        usage
+        exit 1
+
+    fi
+
+    # If output file exists, notify user, allow them a chance to bail
+    check_file_overwrite $dump_file
+
+    # Check the temp file too
+    tmp_file="$dump_file.tmp"
+    check_file_overwrite $tmp_file
+
+    # Run the sql to output tab-delimited lease data to a temp file.
+    # By using a temp file we can check for MySQL errors before using
+    # 'tr' to translate tabs to commas.  We do not use MySQL's output
+    # to file as that requires linux superuser privileges to execute
+    # the select.
+    dscsql_execute "${dump_qry}" > $tmp_file
+    retcode=$?
+    if [ $retcode -ne 0 ]; then
+        log_error "lease-dump: dscsql_execute failed, exit code $retcode";
+        exit 1
+    fi
+
+    # Now translate tabs to commas.
+    cat $tmp_file | tr '\t' ',' >$dump_file
+    if [ $? -ne 0 ]; then
+        log_error "lease-dump: reformatting failed";
+        exit 1
+    fi
+
+    # delete the tmp file on success
+    rm $tmp_file
+    echo lease$dump_type successfully dumped to $dump_file
+    exit 0
+}
+
 ### Script starts here ###
 
 # First, find what the command is
@@ -442,7 +569,7 @@ if [ -z ${backend} ]; then
     usage
     exit 1
 fi
-is_in_list "${backend}" "memfile mysql pgsql"
+is_in_list "${backend}" "memfile mysql pgsql dscsql"
 if [ ${_inlist} -eq 0 ]; then
     log_error "invalid backend: ${backend}"
     exit 1
@@ -542,6 +669,9 @@ case ${command} in
             pgsql)
                 pgsql_init
                 ;;
+            dscsql)
+                dscsql_init
+                ;;
             esac
         ;;
     lease-version)
@@ -556,6 +686,9 @@ case ${command} in
             pgsql)
                 pgsql_version
                 ;;
+            dscsql)
+                dscsql_version
+                ;;
             esac
         ;;
     lease-upgrade)
@@ -569,6 +702,9 @@ case ${command} in
             pgsql)
                 pgsql_upgrade
                 ;;
+            dscsql)
+                dscsql_upgrade
+                ;;
             esac
         ;;
     lease-dump)
@@ -582,6 +718,9 @@ case ${command} in
             pgsql)
                 pgsql_dump
                 ;;
+            dscsql)
+                dscsql_dump
+                ;;
             esac
         ;;
 esac

+ 5 - 1
src/bin/admin/tests/Makefile.am

@@ -10,13 +10,17 @@ if HAVE_PGSQL
 SHTESTS += pgsql_tests.sh
 endif
 
+if HAVE_DSCSQL
+SHTESTS += dscsql_tests.sh
+endif
 noinst_SCRIPTS = $(SHTESTS)
 
 EXTRA_DIST = dhcpdb_create_1.0.mysql
 EXTRA_DIST += dhcpdb_create_1.0.pgsql
+EXTRA_DIST += dhcpdb_create_1.0.cql
 
 CLEANFILES = *.log
-DISTCLEANFILES = memfile_tests.sh mysql_tests.sh pgsql_tests.sh
+DISTCLEANFILES = memfile_tests.sh mysql_tests.sh pgsql_tests.sh dscsql_tests.sh
 
 # Execute all test scripts.
 check-local:

+ 3 - 1
src/bin/admin/tests/data/Makefile.am

@@ -1,4 +1,6 @@
 EXTRA_DIST = mysql.lease4_dump_test.reference.csv \
     mysql.lease6_dump_test.reference.csv \
     pgsql.lease4_dump_test.reference.csv \
-    pgsql.lease6_dump_test.reference.csv
+    pgsql.lease6_dump_test.reference.csv \
+    dscsql.lease4_dump_test.reference.csv \
+    dscsql.lease6_dump_test.reference.csv

+ 6 - 0
src/bin/d2/Makefile.am

@@ -9,6 +9,9 @@ endif
 if HAVE_PGSQL
 AM_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_DSCSQL
+AM_CPPFLAGS += $(DSCSQL_CPPFLAGS)
+endif
 
 AM_CXXFLAGS = $(KEA_CXXFLAGS)
 if USE_CLANGPP
@@ -119,6 +122,9 @@ endif
 if HAVE_PGSQL
 kea_dhcp_ddns_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+kea_dhcp_ddns_LDFLAGS += $(DSCSQL_LIBS)
+endif
 
 kea_dhcp_ddnsdir = $(pkgdatadir)
 kea_dhcp_ddns_DATA = dhcp-ddns.spec

+ 6 - 0
src/bin/d2/d_controller.cc

@@ -21,6 +21,9 @@
 #ifdef HAVE_PGSQL
 #include <dhcpsrv/pgsql_lease_mgr.h>
 #endif
+#ifdef HAVE_DSCSQL
+#include <dhcpsrv/dscsql_lease_mgr.h>
+#endif
 #include <dhcpsrv/memfile_lease_mgr.h>
 
 #include <sstream>
@@ -485,6 +488,9 @@ DControllerBase::getVersion(bool extended) {
 #ifdef HAVE_PGSQL
         tmp << isc::dhcp::PgSqlLeaseMgr::getDBVersion() << std::endl;
 #endif
+#ifdef HAVE_DSCSQL
+        tmp << isc::dhcp::DSCSqlLeaseMgr::getDBVersion() << std::endl;
+#endif
         tmp << isc::dhcp::Memfile_LeaseMgr::getDBVersion();
 
         // @todo: more details about database runtime

+ 3 - 0
src/bin/d2/tests/Makefile.am

@@ -75,6 +75,9 @@ endif
 if HAVE_PGSQL
 d2_unittests_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+d2_unittests_LDFLAGS += $(DSCSQL_LIBS)
+endif
 d2_unittests_LDFLAGS += $(GTEST_LDFLAGS)
 
 d2_unittests_LDADD = $(top_builddir)/src/bin/d2/libd2.la

+ 6 - 0
src/bin/dhcp4/Makefile.am

@@ -10,6 +10,9 @@ endif
 if HAVE_PGSQL
 AM_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_DSCSQL
+AM_CPPFLAGS += $(DSCSQL_CPPFLAGS)
+endif
 
 AM_CXXFLAGS = $(KEA_CXXFLAGS)
 if USE_CLANGPP
@@ -99,6 +102,9 @@ endif
 if HAVE_PGSQL
 kea_dhcp4_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+kea_dhcp4_LDFLAGS += $(DSCSQL_LIBS)
+endif
 
 kea_dhcp4dir = $(pkgdatadir)
 kea_dhcp4_DATA = dhcp4.spec

+ 6 - 0
src/bin/dhcp4/dhcp4_srv.cc

@@ -49,6 +49,9 @@
 #ifdef HAVE_PGSQL
 #include <dhcpsrv/pgsql_lease_mgr.h>
 #endif
+#ifdef HAVE_DSCSQL
+#include <dhcpsrv/dscsql_lease_mgr.h>
+#endif
 #include <dhcpsrv/memfile_lease_mgr.h>
 
 #include <boost/bind.hpp>
@@ -2535,6 +2538,9 @@ Dhcpv4Srv::getVersion(bool extended) {
 #ifdef HAVE_PGSQL
         tmp << PgSqlLeaseMgr::getDBVersion() << endl;
 #endif
+#ifdef HAVE_DSCSQL
+        tmp << DSCSqlLeaseMgr::getDBVersion() << endl;
+#endif
         tmp << Memfile_LeaseMgr::getDBVersion();
 
         // @todo: more details about database runtime

+ 3 - 0
src/bin/dhcp4/tests/Makefile.am

@@ -106,6 +106,9 @@ endif
 if HAVE_PGSQL
 dhcp4_unittests_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+dhcp4_unittests_LDFLAGS += $(DSCSQL_LIBS)
+endif
 dhcp4_unittests_LDFLAGS += $(GTEST_LDFLAGS)
 
 dhcp4_unittests_LDADD = $(top_builddir)/src/bin/dhcp4/libdhcp4.la

+ 6 - 0
src/bin/dhcp6/Makefile.am

@@ -10,6 +10,9 @@ endif
 if HAVE_PGSQL
 AM_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_DSCSQL
+AM_CPPFLAGS += $(DSCSQL_CPPFLAGS)
+endif
 
 AM_CXXFLAGS = $(KEA_CXXFLAGS)
 if USE_CLANGPP
@@ -100,6 +103,9 @@ endif
 if HAVE_PGSQL
 kea_dhcp6_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+kea_dhcp6_LDFLAGS += $(DSCSQL_LIBS)
+endif
 
 kea_dhcp6dir = $(pkgdatadir)
 kea_dhcp6_DATA = dhcp6.spec

+ 6 - 0
src/bin/dhcp6/dhcp6_srv.cc

@@ -58,6 +58,9 @@
 #ifdef HAVE_PGSQL
 #include <dhcpsrv/pgsql_lease_mgr.h>
 #endif
+#ifdef HAVE_DSCSQL
+#include <dhcpsrv/dscsql_lease_mgr.h>
+#endif
 #include <dhcpsrv/memfile_lease_mgr.h>
 
 #include <boost/bind.hpp>
@@ -2983,6 +2986,9 @@ Dhcpv6Srv::getVersion(bool extended) {
 #ifdef HAVE_PGSQL
         tmp << PgSqlLeaseMgr::getDBVersion() << endl;
 #endif
+#ifdef HAVE_DSCSQL
+        tmp << DSCSqlLeaseMgr::getDBVersion() << endl;
+#endif
         tmp << Memfile_LeaseMgr::getDBVersion();
 
         // @todo: more details about database runtime

+ 3 - 0
src/bin/dhcp6/tests/Makefile.am

@@ -107,6 +107,9 @@ endif
 if HAVE_PGSQL
 dhcp6_unittests_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+dhcp6_unittests_LDFLAGS += $(DSCSQL_LIBS)
+endif
 dhcp6_unittests_LDFLAGS += $(GTEST_LDFLAGS)
 
 dhcp6_unittests_LDADD = $(top_builddir)/src/bin/dhcp6/libdhcp6.la

+ 3 - 0
src/bin/lfc/Makefile.am

@@ -83,5 +83,8 @@ endif
 if HAVE_PGSQL
 kea_lfc_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+kea_lfc_LDFLAGS += $(DSCSQL_LIBS)
+endif
 
 kea_lfcdir = $(pkgdatadir)

+ 3 - 0
src/bin/lfc/tests/Makefile.am

@@ -52,6 +52,9 @@ endif
 if HAVE_PGSQL
 lfc_unittests_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+lfc_unittests_LDFLAGS += $(DSCSQL_LIBS)
+endif
 lfc_unittests_LDFLAGS += $(GTEST_LDFLAGS)
 
 lfc_unittests_LDADD = $(top_builddir)/src/bin/lfc/liblfc.la

+ 10 - 0
src/lib/dhcpsrv/Makefile.am

@@ -16,6 +16,9 @@ endif
 if HAVE_PGSQL
 AM_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_DSCSQL
+AM_CPPFLAGS += $(DSCSQL_CPPFLAGS)
+endif
 
 AM_CXXFLAGS = $(KEA_CXXFLAGS)
 
@@ -138,6 +141,10 @@ libkea_dhcpsrv_la_SOURCES += pgsql_connection.cc pgsql_connection.h
 libkea_dhcpsrv_la_SOURCES += pgsql_exchange.cc pgsql_exchange.h
 libkea_dhcpsrv_la_SOURCES += pgsql_lease_mgr.cc pgsql_lease_mgr.h
 endif
+if HAVE_DSCSQL
+libkea_dhcpsrv_la_SOURCES += dscsql_lease_mgr.cc dscsql_lease_mgr.h
+libkea_dhcpsrv_la_SOURCES += dscsql_connection.cc dscsql_connection.h
+endif
 libkea_dhcpsrv_la_SOURCES += pool.cc pool.h
 libkea_dhcpsrv_la_SOURCES += srv_config.cc srv_config.h
 libkea_dhcpsrv_la_SOURCES += subnet.cc subnet.h
@@ -197,6 +204,9 @@ endif
 if HAVE_PGSQL
 libkea_dhcpsrv_la_LDFLAGS += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+libkea_dhcpsrv_la_LDFLAGS += $(DSCSQL_LIBS)
+endif
 
 if USE_CLANGPP
 # Disable unused parameter warning caused by some of the

+ 103 - 0
src/lib/dhcpsrv/dhcpsrv_messages.mes

@@ -808,3 +808,106 @@ indicate an error in the source code, please submit a bug report.
 % DHCPSRV_UNKNOWN_DB unknown database type: %1
 The database access string specified a database type (given in the
 message) that is unknown to the software.  This is a configuration error.
+
+% DHCPSRV_DSCSQL_ADD_ADDR4 adding IPv4 lease with address %1
+A debug message issued when the server is about to add an IPv4 lease
+with the specified address to the DataStax Cassandra backend database.
+
+% DHCPSRV_DSCSQL_ADD_ADDR6 adding IPv6 lease with address %1
+A debug message issued when the server is about to add an IPv6 lease
+with the specified address to the DataStax Cassandra backend database.
+
+% DHCPSRV_DSCSQL_COMMIT committing to DataStax Cassandra database
+The code has issued a commit call.
+
+% DHCPSRV_DSCSQL_DB opening DataStax Cassandra lease database: %1
+This informational message is logged when a DHCP server (either V4 or
+V6) is about to open a DataStax Cassandra lease database.  The parameters of
+the connection including database name and username needed to access it
+(but not the password if any) are logged.
+
+% DHCPSRV_DSCSQL_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 DataStax Cassandra database for the specified
+address.
+
+% DHCPSRV_DSCSQL_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
+leases which have expired longer than a specified period of time.
+The argument is the amount of time Kea waits after a reclaimed
+lease expires before considering its removal.
+
+% DHCPSRV_DSCSQL_DELETE_EXPIRED_RECLAIMED6 deleting reclaimed IPv6 leases that expired more than %1 seconds ago
+A debug message issued when the server is removing reclaimed DHCPv6
+leases which have expired longer than a specified period of time.
+The argument is the amount of time Kea waits after a reclaimed
+lease expires before considering its removal.
+
+% DHCPSRV_DSCSQL_GET_ADDR4 obtaining IPv4 lease for address %1
+A debug message issued when the server is attempting to obtain an IPv4
+lease from the DataStax Cassandra database for the specified address.
+
+% DHCPSRV_DSCSQL_GET_ADDR6 obtaining IPv6 lease for address %1 and lease type %2
+A debug message issued when the server is attempting to obtain an IPv6
+lease from the DataStax Cassandra database for the specified address.
+
+% DHCPSRV_DSCSQL_GET_CLIENTID obtaining IPv4 leases for client ID %1
+A debug message issued when the server is attempting to obtain a set of
+IPv4 leases from the DataStax Cassandra database for a client with the specified
+client identification.
+
+% DHCPSRV_DSCSQL_GET_CLIENTID_HWADDR_SUBID obtaining IPv4 lease for client ID %1, hardware address %2 and subnet ID %3
+A debug message issued when the server is attempting to obtain an IPv4
+lease from the DataStax Cassandra database for a client with the specified
+client ID, hardware address and subnet ID.
+
+% DHCPSRV_DSCSQL_GET_EXPIRED4 obtaining maximum %1 of expired IPv4 leases
+A debug message issued when the server is attempting to obtain expired
+IPv4 leases to reclaim them. The maximum number of leases to be retrieved
+is logged in the message.
+
+% DHCPSRV_DSCSQL_GET_EXPIRED6 obtaining maximum %1 of expired IPv6 leases
+A debug message issued when the server is attempting to obtain expired
+IPv6 leases to reclaim them. The maximum number of leases to be retrieved
+is logged in the message.
+
+% DHCPSRV_DSCSQL_GET_HWADDR obtaining IPv4 leases for hardware address %1
+A debug message issued when the server is attempting to obtain a set of
+IPv4 leases from the DataStax Cassandra database for a client with the specified
+hardware address.
+
+% DHCPSRV_DSCSQL_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 DataStax Cassandra database for a client with the specified
+IAID (Identity Association ID) and DUID (DHCP Unique Identifier).
+
+% DHCPSRV_DSCSQL_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
+lease from the DataStax Cassandra database for a client with the specified IAID
+(Identity Association ID), Subnet ID and DUID (DHCP Unique Identifier).
+
+% DHCPSRV_DSCSQL_GET_SUBID_CLIENTID obtaining IPv4 lease for subnet ID %1 and client ID %2
+A debug message issued when the server is attempting to obtain an IPv4
+lease from the DataStax Cassandra database for a client with the specified
+subnet ID and client ID.
+
+% DHCPSRV_DSCSQL_GET_SUBID_HWADDR obtaining IPv4 lease for subnet ID %1 and hardware address %2
+A debug message issued when the server is attempting to obtain an IPv4
+lease from the DataStax Cassandra database for a client with the specified
+subnet ID and hardware address.
+
+% DHCPSRV_DSCSQL_GET_VERSION obtaining schema version information
+A debug message issued when the server is about to obtain schema version
+information from the DataStax Cassandra database.
+
+% DHCPSRV_DSCSQL_ROLLBACK rolling back DataStax Cassandra database
+The code has issued a rollback call.
+
+% DHCPSRV_DSCSQL_UPDATE_ADDR4 updating IPv4 lease for address %1
+A debug message issued when the server is attempting to update IPv4
+lease from the DataStax Cassandra database for the specified address.
+
+% DHCPSRV_DSCSQL_UPDATE_ADDR6 updating IPv6 lease for address %1
+A debug message issued when the server is attempting to update IPv6
+lease from the DataStax Cassandra database for the specified address.
+

+ 7 - 0
src/lib/dhcpsrv/host_data_source_factory.cc

@@ -68,6 +68,13 @@ HostDataSourceFactory::create(const std::string& dbaccess) {
     }
 #endif
 
+#ifdef HAVE_DSCSQL
+    if (db_type == "dscsql") {
+        isc_throw(NotImplemented, "Sorry, DSCSQL backend for host reservations "
+                  "is not implemented yet.");
+    }
+#endif
+
     // Get here on no match.
     isc_throw(InvalidType, "Hosts database access parameter 'type': " <<
                            db_type << " is invalid");

+ 10 - 0
src/lib/dhcpsrv/lease_mgr_factory.cc

@@ -15,6 +15,9 @@
 #ifdef HAVE_PGSQL
 #include <dhcpsrv/pgsql_lease_mgr.h>
 #endif
+#ifdef HAVE_DSCSQL
+#include <dhcpsrv/dscsql_lease_mgr.h>
+#endif
 
 #include <boost/algorithm/string.hpp>
 #include <boost/foreach.hpp>
@@ -68,6 +71,13 @@ LeaseMgrFactory::create(const std::string& dbaccess) {
         return;
     }
 #endif
+#ifdef HAVE_DSCSQL
+    if (parameters[type] == string("dscsql")) {
+        LOG_INFO(dhcpsrv_logger, DHCPSRV_DSCSQL_DB).arg(redacted);
+        getLeaseMgrPtr().reset(new DSCSqlLeaseMgr(parameters));
+        return;
+    }
+#endif
     if (parameters[type] == string("memfile")) {
         LOG_INFO(dhcpsrv_logger, DHCPSRV_MEMFILE_DB).arg(redacted);
         getLeaseMgrPtr().reset(new Memfile_LeaseMgr(parameters));

+ 1 - 1
src/lib/dhcpsrv/parsers/dbaccess_parser.cc

@@ -89,7 +89,7 @@ DbAccessParser::build(isc::data::ConstElementPtr config_value) {
 
     // b. Check if the 'type' keyword known and throw an exception if not.
     string dbtype = type_ptr->second;
-    if ((dbtype != "memfile") && (dbtype != "mysql") && (dbtype != "postgresql")) {
+    if ((dbtype != "memfile") && (dbtype != "mysql") && (dbtype != "postgresql") && (dbtype != "dscsql")) {
         isc_throw(BadValue, "unknown backend database type: " << dbtype
                   << " (" << config_value->getPosition() << ")");
     }

+ 9 - 0
src/lib/dhcpsrv/tests/Makefile.am

@@ -122,6 +122,9 @@ if HAVE_PGSQL
 libdhcpsrv_unittests_SOURCES += pgsql_exchange_unittest.cc
 libdhcpsrv_unittests_SOURCES += pgsql_lease_mgr_unittest.cc
 endif
+if HAVE_DSCSQL
+libdhcpsrv_unittests_SOURCES += dscsql_lease_mgr_unittest.cc
+endif
 libdhcpsrv_unittests_SOURCES += pool_unittest.cc
 libdhcpsrv_unittests_SOURCES += srv_config_unittest.cc
 libdhcpsrv_unittests_SOURCES += subnet_unittest.cc
@@ -137,6 +140,9 @@ endif
 if HAVE_PGSQL
 libdhcpsrv_unittests_CPPFLAGS += $(PGSQL_CPPFLAGS)
 endif
+if HAVE_DSCSQL
+libdhcpsrv_unittests_CPPFLAGS += $(DSCSQL_CPPFLAGS)
+endif
 
 libdhcpsrv_unittests_LDFLAGS  = $(AM_LDFLAGS) $(CRYPTO_LDFLAGS) $(GTEST_LDFLAGS)
 if HAVE_MYSQL
@@ -145,6 +151,9 @@ endif
 if HAVE_PGSQL
 libdhcpsrv_unittests_LDFLAGS  += $(PGSQL_LIBS)
 endif
+if HAVE_DSCSQL
+libdhcpsrv_unittests_LDFLAGS  += $(DSCSQL_LIBS)
+endif
 
 libdhcpsrv_unittests_CXXFLAGS = $(AM_CXXFLAGS)
 if USE_CLANGPP

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

@@ -1 +1 @@
-SUBDIRS = mysql pgsql
+SUBDIRS = mysql pgsql dscsql