A debug message issued when the server is attempting to update IPv6
lease from the memory file database for the specified address.
-% DHCPSRV_MEMFILE_WARNING using early version of memfile lease database - leases will be lost after a restart
-This warning message is issued when the 'memfile' lease database is
-opened. The current version of memfile does not store anything
-to disk, so lease information will be lost in the event of a restart.
-Using this version of memfile in a production environment is NOT
-recommended.
-
% DHCPSRV_MYSQL_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 MySQL backend database.
-// Copyright (C) 2012-2013 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
+#include <dhcpsrv/cfgmgr.h>
#include <dhcpsrv/dhcpsrv_log.h>
#include <dhcpsrv/memfile_lease_mgr.h>
#include <exceptions/exceptions.h>
Memfile_LeaseMgr::Memfile_LeaseMgr(const ParameterMap& parameters)
: LeaseMgr(parameters) {
- LOG_WARN(dhcpsrv_logger, DHCPSRV_MEMFILE_WARNING);
+ // Get the lease files locations.
+ lease_file4_ = initLeaseFilePath(V4);
+ lease_file6_ = initLeaseFilePath(V6);
}
Memfile_LeaseMgr::~Memfile_LeaseMgr() {
LOG_DEBUG(dhcpsrv_logger, DHCPSRV_DBG_TRACE_DETAIL,
DHCPSRV_MEMFILE_ROLLBACK);
}
+
+std::string
+Memfile_LeaseMgr::getDefaultLeaseFilePath(Universe u) const {
+ std::ostringstream s;
+ s << CfgMgr::instance().getDataDir() << "/kea-leases";
+ s << (u == V4 ? "4" : "6");
+ s << ".csv";
+ return (s.str());
+}
+
+bool
+Memfile_LeaseMgr::persistLeases(Universe u) const {
+ // Currently, if the lease file is empty, it means that writes to disk have
+ // been explicitly disabled by the administrator. At some point, there may
+ // be a dedicated ON/OFF flag implemented to control this.
+ return (u == V4 ? !lease_file4_.empty() : !lease_file6_.empty());
+}
+
+std::string
+Memfile_LeaseMgr::initLeaseFilePath(Universe u) {
+ std::string param_name = (u == V4 ? "leasefile4" : "leasefile6");
+ std::string lease_file;
+ try {
+ lease_file = getParameter(param_name);
+ } catch (const Exception& ex) {
+ lease_file = getDefaultLeaseFilePath(u);
+ }
+ return (lease_file);
+}
-// Copyright (C) 2012-2013 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2014 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
class Memfile_LeaseMgr : public LeaseMgr {
public:
+ /// @brief Specifies universe (V4, V6)
+ ///
+ /// This enumeration is used by various functions in Memfile Lease Manager,
+ /// to identify the lease type referred to. In particular, it is used by
+ /// functions operating on the lease files to distinguish between lease
+ /// files for DHCPv4 and DHCPv6.
+ enum Universe {
+ V4,
+ V6
+ };
+
/// @brief The sole lease manager constructor
///
/// dbconfig is a generic way of passing parameters. Parameters
/// support transactions, this is a no-op.
virtual void rollback();
+ /// @brief Returns default path to the lease file.
+ ///
+ /// @param u Universe (V4 or V6).
+ std::string getDefaultLeaseFilePath(Universe u) const;
+
+ /// @brief Returns an absolute path to the lease file.
+ ///
+ /// @param u Universe (V4 or V6).
+ std::string getLeaseFilePath(Universe u) const {
+ return (u == V4 ? lease_file4_ : lease_file6_);
+ }
+
+ /// @brief Specifies whether or not leases are written to disk.
+ ///
+ /// It is possible that leases for DHCPv4 are written to disk whereas leases
+ /// for DHCPv6 are not; or vice versa. The argument of the method specifies
+ /// the type of lease in that respect.
+ ///
+ /// @param u Universe (V4 or V6).
+ ///
+ /// @return true if leases are written to lease file; if false is
+ /// returned, leases will be held in memory and will be lost upon
+ /// server shut down.
+ bool persistLeases(Universe u) const;
+
protected:
+ /// @brief Initialize the location of the lease file.
+ ///
+ /// This method uses the parameters passed as a map to the constructor to
+ /// initialize the location of the lease file. If the lease file is not
+ /// specified, the method will use the default location for the universe
+ /// (v4 or v6) selected. If the location is specified in the map as empty
+ /// it will set the empty location, which implies that leases belonging to
+ /// the specified universe will not be written to disk.
+ ///
+ /// @param u Universe (v4 or v6)
+ /// @param parameters Map holding parameters of the Lease Manager, passed to
+ /// the constructor.
+ ///
+ /// @return The location of the lease file that should be assigned to the
+ /// lease_file4_ or lease_file6_, depending on the universe specified as an
+ /// argument to this function.
+ std::string initLeaseFilePath(Universe u);
+
// This is a multi-index container, which holds elements that can
// be accessed using different search indexes.
typedef boost::multi_index_container<
// be accessed using different search indexes.
typedef boost::multi_index_container<
// It holds pointers to Lease4 objects.
- Lease4Ptr,
+ Lease4Ptr,
// Specification of search indexes starts here.
boost::multi_index::indexed_by<
// Specification of the first index starts here.
/// @brief stores IPv6 leases
Lease6Storage storage6_;
+
+ /// @brief Holds the absolute path to the lease file for DHCPv4.
+ std::string lease_file4_;
+
+ /// @brief Holds the absolute path to the lease file for DHCPv6.
+ std::string lease_file6_;
};
}; // end of isc::dhcp namespace
AM_CPPFLAGS = -I$(top_builddir)/src/lib -I$(top_srcdir)/src/lib
AM_CPPFLAGS += $(BOOST_INCLUDES)
AM_CPPFLAGS += -DTEST_DATA_BUILDDIR=\"$(abs_top_builddir)/src/lib/dhcp/tests\"
+AM_CPPFLAGS += -DDHCP_DATA_DIR=\"$(abs_top_builddir)/src/lib/dhcp/tests\"
AM_CPPFLAGS += -DINSTALL_PROG=\"$(abs_top_srcdir)/install-sh\"
AM_CXXFLAGS = $(B10_CXXFLAGS)
#include <asiolink/io_address.h>
#include <dhcp/duid.h>
+#include <dhcpsrv/cfgmgr.h>
#include <dhcpsrv/lease_mgr.h>
#include <dhcpsrv/memfile_lease_mgr.h>
#include <dhcpsrv/tests/test_utils.h>
lmptr_ = 0;
}
+ /// @brief Return path to the lease file used by unit tests.
+ ///
+ /// @param filename Name of the lease file appended to the path to the
+ /// directory where test data is held.
+ ///
+ /// @return Full path to the lease file.
+ std::string getLeaseFilePath(const std::string& filename) const {
+ std::ostringstream s;
+ s << TEST_DATA_BUILDDIR << "/" << filename;
+ return (s.str());
+ }
+
};
// This test checks if the LeaseMgr can be instantiated and that it
EXPECT_EQ(std::string("memory"), lmptr_->getName());
}
+// Checks if the path to the lease files is initialized correctly.
+TEST_F(MemfileLeaseMgrTest, getLeaseFilePath) {
+ LeaseMgr::ParameterMap pmap;
+ boost::scoped_ptr<Memfile_LeaseMgr> lease_mgr(new Memfile_LeaseMgr(pmap));
+
+ std::ostringstream s4;
+ s4 << CfgMgr::instance().getDataDir() << "/" << "kea-leases4.csv";
+ std::ostringstream s6;
+ s6 << CfgMgr::instance().getDataDir() << "/" << "kea-leases6.csv";
+ EXPECT_EQ(s4.str(),
+ lease_mgr->getDefaultLeaseFilePath(Memfile_LeaseMgr::V4));
+ EXPECT_EQ(s6.str(),
+ lease_mgr->getDefaultLeaseFilePath(Memfile_LeaseMgr::V6));
+
+
+ EXPECT_EQ(lease_mgr->getDefaultLeaseFilePath(Memfile_LeaseMgr::V4),
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V4));
+
+ EXPECT_EQ(lease_mgr->getDefaultLeaseFilePath(Memfile_LeaseMgr::V6),
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V6));
+
+ pmap["leasefile4"] = getLeaseFilePath("leasefile4.csv");
+ lease_mgr.reset(new Memfile_LeaseMgr(pmap));
+ EXPECT_EQ(pmap["leasefile4"],
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V4));
+ EXPECT_EQ(lease_mgr->getDefaultLeaseFilePath(Memfile_LeaseMgr::V6),
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V6));
+
+ pmap["leasefile6"] = getLeaseFilePath("kea-leases6.csv");
+ lease_mgr.reset(new Memfile_LeaseMgr(pmap));
+ EXPECT_EQ(pmap["leasefile4"],
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V4));
+ EXPECT_EQ(pmap["leasefile6"],
+ lease_mgr->getLeaseFilePath(Memfile_LeaseMgr::V6));
+}
+
+// Check if the persitLeases correctly checks that leases should not be written
+// to disk when lease file is set to empty value.
+TEST_F(MemfileLeaseMgrTest, persistLeases) {
+ LeaseMgr::ParameterMap pmap;
+ boost::scoped_ptr<Memfile_LeaseMgr> lease_mgr(new Memfile_LeaseMgr(pmap));
+ // If the leasefile4 and leasefile6 are not specified, the default
+ // file names will be used. The leases will be written to these files.
+ EXPECT_TRUE(lease_mgr->persistLeases(Memfile_LeaseMgr::V4));
+ EXPECT_TRUE(lease_mgr->persistLeases(Memfile_LeaseMgr::V6));
+
+ // Specify the names of the lease files. Leases will be written.
+ pmap["leasefile4"] = "leases4.csv";
+ pmap["leasefile6"] = "leases6.csv";
+ lease_mgr.reset(new Memfile_LeaseMgr(pmap));
+ EXPECT_TRUE(lease_mgr->persistLeases(Memfile_LeaseMgr::V4));
+ EXPECT_TRUE(lease_mgr->persistLeases(Memfile_LeaseMgr::V6));
+
+ // Specify empty names of the lease files. This should disable writes
+ // of leases to disk.
+ pmap["leasefile4"] = "";
+ pmap["leasefile6"] = "";
+ lease_mgr.reset(new Memfile_LeaseMgr(pmap));
+ EXPECT_FALSE(lease_mgr->persistLeases(Memfile_LeaseMgr::V4));
+ EXPECT_FALSE(lease_mgr->persistLeases(Memfile_LeaseMgr::V6));
+}
+
+
// Checks that adding/getting/deleting a Lease6 object works.
TEST_F(MemfileLeaseMgrTest, addGetDelete6) {
testAddGetDelete6(true); // true - check T1,T2 values