From: Marcin Siodelski Date: Sat, 15 Mar 2014 21:00:19 +0000 (+0100) Subject: [3360] Implemented class for writing/reading DHCPv6 leases from CSV. X-Git-Tag: bind10-1.2.0rc1-release~14^2~17 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3150e9c0e6ccf84d2bce9f14b4d8916c45cb8767;p=thirdparty%2Fkea.git [3360] Implemented class for writing/reading DHCPv6 leases from CSV. --- diff --git a/configure.ac b/configure.ac index 83707ee50e..97a7fc2a36 100644 --- a/configure.ac +++ b/configure.ac @@ -1535,6 +1535,7 @@ AC_CONFIG_FILES([compatcheck/Makefile src/lib/dhcpsrv/Makefile src/lib/dhcpsrv/tests/Makefile src/lib/dhcpsrv/tests/test_libraries.h + srv/lib/dhcpsrv/tests/testdata/Makefile src/lib/dhcp/tests/Makefile src/lib/dns/benchmarks/Makefile src/lib/dns/gen-rdatacode.py diff --git a/src/lib/dhcpsrv/Makefile.am b/src/lib/dhcpsrv/Makefile.am index 1c8a18ae10..3d0ff9198a 100644 --- a/src/lib/dhcpsrv/Makefile.am +++ b/src/lib/dhcpsrv/Makefile.am @@ -39,6 +39,7 @@ libb10_dhcpsrv_la_SOURCES = libb10_dhcpsrv_la_SOURCES += addr_utilities.cc addr_utilities.h libb10_dhcpsrv_la_SOURCES += alloc_engine.cc alloc_engine.h libb10_dhcpsrv_la_SOURCES += callout_handle_store.h +libb10_dhcpsrv_la_SOURCES += csv_lease_file6.cc csv_lease_file6.h libb10_dhcpsrv_la_SOURCES += d2_client_cfg.cc d2_client_cfg.h libb10_dhcpsrv_la_SOURCES += d2_client_mgr.cc d2_client_mgr.h libb10_dhcpsrv_la_SOURCES += dbaccess_parser.cc dbaccess_parser.h diff --git a/src/lib/dhcpsrv/csv_lease_file6.cc b/src/lib/dhcpsrv/csv_lease_file6.cc new file mode 100644 index 0000000000..86e9fb4d48 --- /dev/null +++ b/src/lib/dhcpsrv/csv_lease_file6.cc @@ -0,0 +1,64 @@ +// Copyright (C) 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 +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include + +using namespace isc::util; + +namespace isc { +namespace dhcp { + +CSVLeaseFile6::CSVLeaseFile6(const std::string& filename) + : CSVFile(filename) { + initColumns(); +} + +void +CSVLeaseFile6::initColumns() { + addColumn("address"); + addColumn("duid"); + addColumn("valid_lifetime"); + addColumn("expire"); + addColumn("subnet_id"); + addColumn("pref_lifetime"); + addColumn("lease_type"); + addColumn("iaid"); + addColumn("prefix_len"); + addColumn("fqdn_fwd"); + addColumn("fqdn_rev"); + addColumn("hostname"); +} + +void +CSVLeaseFile6::append(const Lease6& lease) const { + CSVRow row(getColumnCount()); + row.writeAt(getColumnIndex("address"), lease.addr_.toText()); + row.writeAt(getColumnIndex("duid"), lease.duid_->toText()); + row.writeAt(getColumnIndex("valid_lifetime"), lease.valid_lft_); + row.writeAt(getColumnIndex("expire"), lease.cltt_ + lease.valid_lft_); + row.writeAt(getColumnIndex("subnet_id"), lease.subnet_id_); + row.writeAt(getColumnIndex("pref_lifetime"), lease.preferred_lft_); + row.writeAt(getColumnIndex("lease_type"), lease.type_); + row.writeAt(getColumnIndex("iaid"), lease.iaid_); + row.writeAt(getColumnIndex("prefix_len"), + static_cast(lease.prefixlen_)); + row.writeAt(getColumnIndex("fqdn_fwd"), lease.fqdn_fwd_); + row.writeAt(getColumnIndex("fqdn_rev"), lease.fqdn_rev_); + row.writeAt(getColumnIndex("hostname"), lease.hostname_); + CSVFile::append(row); +} + + +} // end of namespace isc::dhcp +} // end of namespace isc diff --git a/src/lib/dhcpsrv/csv_lease_file6.h b/src/lib/dhcpsrv/csv_lease_file6.h new file mode 100644 index 0000000000..d3acefcea5 --- /dev/null +++ b/src/lib/dhcpsrv/csv_lease_file6.h @@ -0,0 +1,40 @@ +// Copyright (C) 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 +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#ifndef CSV_LEASE_FILE6_H +#define CSV_LEASE_FILE6_H + +#include +#include + +namespace isc { +namespace dhcp { + +class CSVLeaseFile6 : public isc::util::CSVFile { +public: + + CSVLeaseFile6(const std::string& filename); + + void append(const Lease6& lease) const; + +private: + + void initColumns(); + +}; + +} // namespace isc::dhcp +} // namespace isc + +#endif // CSV_LEASE_FILE6_H diff --git a/src/lib/dhcpsrv/tests/Makefile.am b/src/lib/dhcpsrv/tests/Makefile.am index f3e0b11dd6..1d6ddf15f3 100644 --- a/src/lib/dhcpsrv/tests/Makefile.am +++ b/src/lib/dhcpsrv/tests/Makefile.am @@ -1,9 +1,9 @@ -SUBDIRS = . +SUBDIRS = . testdata 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 += -DTEST_DATA_BUILDDIR=\"$(abs_top_builddir)/src/lib/dhcpsrv/tests\" +AM_CPPFLAGS += -DDHCP_DATA_DIR=\"$(abs_top_builddir)/src/lib/dhcpsrv/tests\" AM_CPPFLAGS += -DINSTALL_PROG=\"$(abs_top_srcdir)/install-sh\" AM_CXXFLAGS = $(B10_CXXFLAGS) @@ -15,6 +15,9 @@ AM_CXXFLAGS = $(B10_CXXFLAGS) AM_CXXFLAGS += $(WARNING_NO_MISSING_FIELD_INITIALIZERS_CFLAG) CLEANFILES = *.gcno *.gcda +# CSV files are created by unit tests which check the CSVLeaseFile6 +# and CSVLeaseFile4 classes. +CLEANFILES += *.csv TESTS_ENVIRONMENT = \ $(LIBTOOL) --mode=execute $(VALGRIND_COMMAND) @@ -56,9 +59,11 @@ libdhcpsrv_unittests_SOURCES += addr_utilities_unittest.cc libdhcpsrv_unittests_SOURCES += alloc_engine_unittest.cc libdhcpsrv_unittests_SOURCES += callout_handle_store_unittest.cc libdhcpsrv_unittests_SOURCES += cfgmgr_unittest.cc +libdhcpsrv_unittests_SOURCES += csv_lease_file6_unittest.cc libdhcpsrv_unittests_SOURCES += d2_client_unittest.cc libdhcpsrv_unittests_SOURCES += d2_udp_unittest.cc libdhcpsrv_unittests_SOURCES += dbaccess_parser_unittest.cc +libdhcpsrv_unittests_SOURCES += lease_file_io.cc lease_file_io.h libdhcpsrv_unittests_SOURCES += lease_unittest.cc libdhcpsrv_unittests_SOURCES += lease_mgr_factory_unittest.cc libdhcpsrv_unittests_SOURCES += lease_mgr_unittest.cc diff --git a/src/lib/dhcpsrv/tests/csv_lease_file6_unittest.cc b/src/lib/dhcpsrv/tests/csv_lease_file6_unittest.cc new file mode 100644 index 0000000000..cb69ae2bef --- /dev/null +++ b/src/lib/dhcpsrv/tests/csv_lease_file6_unittest.cc @@ -0,0 +1,105 @@ +// Copyright (C) 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 +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace isc; +using namespace isc::asiolink; +using namespace isc::dhcp; +using namespace isc::dhcp::test; +using namespace isc::util; + +namespace { + +const uint8_t DUID0[] = { 0, 1, 2, 3, 4, 5, 6, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf }; +const uint8_t DUID1[] = { 1, 1, 1, 1, 0xa, 1, 2, 3, 4, 5 }; + +class CSVLeaseFile6Test : public ::testing::Test { +public: + + CSVLeaseFile6Test(); + + /// @brief Prepends the absolute path to the file specified + /// as an argument. + /// + /// @param filename Name of the file. + /// @return Absolute path to the test file. + static std::string absolutePath(const std::string& filename); + + DuidPtr makeDUID(const uint8_t* duid, const unsigned int size) const { + return (DuidPtr(new DUID(duid, size))); + } + + std::string filename_; + LeaseFileIO io_; + +}; + +CSVLeaseFile6Test::CSVLeaseFile6Test() + : filename_(absolutePath("leases6.csv")), io_(filename_) { +} + +std::string +CSVLeaseFile6Test::absolutePath(const std::string& filename) { + std::ostringstream s; + s << TEST_DATA_BUILDDIR << "/" << filename; + return (s.str()); +} + + +TEST_F(CSVLeaseFile6Test, recreate) { + boost::scoped_ptr lf(new CSVLeaseFile6(filename_)); + ASSERT_NO_THROW(lf->recreate()); + ASSERT_TRUE(io_.exists()); + + Lease6Ptr lease(new Lease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"), + makeDUID(DUID0, sizeof(DUID0)), + 7, 100, 200, 50, 80, 8, true, true, + "host.example.com")); + lease->cltt_ = 0; + ASSERT_NO_THROW(lf->append(*lease)); + + lease.reset(new Lease6(Lease::TYPE_NA, IOAddress("2001:db8:2::10"), + makeDUID(DUID1, sizeof(DUID1)), + 8, 150, 300, 40, 70, 6, false, false, + "", 128)); + lease->cltt_ = 0; + ASSERT_NO_THROW(lf->append(*lease)); + + lease.reset(new Lease6(Lease::TYPE_PD, IOAddress("3000:1:1::"), + makeDUID(DUID0, sizeof(DUID0)), + 7, 150, 300, 40, 70, 10, false, false, + "", 64)); + lease->cltt_ = 0; + ASSERT_NO_THROW(lf->append(*lease)); + + EXPECT_EQ("address,duid,valid_lifetime,expire,subnet_id,pref_lifetime," + "lease_type,iaid,prefix_len,fqdn_fwd,fqdn_rev,hostname\n" + "2001:db8:1::1,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f," + "200,200,8,100,0,7,0,1,1,host.example.com\n" + "2001:db8:2::10,01:01:01:01:0a:01:02:03:04:05" + ",300,300,6,150,0,8,128,0,0,\n" + "3000:1:1::,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f," + "300,300,10,150,2,7,64,0,0,\n", + io_.readFile()); +} + +} // end of anonymous namespace diff --git a/src/lib/dhcpsrv/tests/lease_file_io.cc b/src/lib/dhcpsrv/tests/lease_file_io.cc new file mode 100644 index 0000000000..7f7b459bdb --- /dev/null +++ b/src/lib/dhcpsrv/tests/lease_file_io.cc @@ -0,0 +1,69 @@ +// Copyright (C) 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 +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#include +#include +#include + +namespace isc { +namespace dhcp { +namespace test { + +LeaseFileIO::LeaseFileIO(const std::string& filename) + : testfile_(filename) { + removeFile(); +} + +LeaseFileIO::~LeaseFileIO() { + // removeFile(); +} + +bool +LeaseFileIO::exists() const { + std::ifstream fs(testfile_.c_str()); + bool ok = fs.good(); + fs.close(); + return (ok); +} + +std::string +LeaseFileIO::readFile() const { + std::ifstream fs(testfile_.c_str()); + if (!fs.is_open()) { + return (""); + } + std::string contents((std::istreambuf_iterator(fs)), + std::istreambuf_iterator()); + fs.close(); + return (contents); +} + +void +LeaseFileIO::removeFile() const { + remove(testfile_.c_str()); +} + +void +LeaseFileIO::writeFile(const std::string& contents) const { + std::ofstream fs(testfile_.c_str(), std::ofstream::out); + if (fs.is_open()) { + fs << contents; + fs.close(); + } +} + +} // end of namespace isc::dhcp::test +} // end of namespace isc::dhcp +} // end of namespace isc + diff --git a/src/lib/dhcpsrv/tests/lease_file_io.h b/src/lib/dhcpsrv/tests/lease_file_io.h new file mode 100644 index 0000000000..b2e4da29f1 --- /dev/null +++ b/src/lib/dhcpsrv/tests/lease_file_io.h @@ -0,0 +1,55 @@ +// Copyright (C) 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 +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +#ifndef LEASE_FILE_IO_H +#define LEASE_FILE_IO_H + +#include + +namespace isc { +namespace dhcp { +namespace test { + +class LeaseFileIO { +public: + LeaseFileIO(const std::string& filename); + + ~LeaseFileIO(); + + /// @brief Check if test file exists on disk. + bool exists() const; + + /// @brief Reads whole lease file. + /// + /// @return Contents of the file. + std::string readFile() const; + + /// @brief Removes existing file (if any). + void removeFile() const; + + /// @brief Creates file with contents. + /// + /// @param contents Contents of the file. + void writeFile(const std::string& contents) const; + + /// @brief Absolute path to the file used in the tests. + std::string testfile_; + +}; + +} +} +} + +#endif // LEASE_FILE_IO_H diff --git a/src/lib/dhcpsrv/tests/testdata/Makefile.am b/src/lib/dhcpsrv/tests/testdata/Makefile.am new file mode 100644 index 0000000000..effbd081f3 --- /dev/null +++ b/src/lib/dhcpsrv/tests/testdata/Makefile.am @@ -0,0 +1,4 @@ +SUBDIRS = . + +EXTRA_DIST = leases6_0.csv + diff --git a/src/lib/dhcpsrv/tests/testdata/leases6_0.csv b/src/lib/dhcpsrv/tests/testdata/leases6_0.csv new file mode 100644 index 0000000000..e69de29bb2