Commit ca432aa5 authored by Shawn Routhier's avatar Shawn Routhier
Browse files

[trac3665] More tests and cleanup

Add more tests to verity the cleanup of leases files

Cleanup the code for comments, typos, spaces and the like.
parent 3e0491cb
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
#include <dhcpsrv/lease_file_loader.h> #include <dhcpsrv/lease_file_loader.h>
#include <config.h> #include <config.h>
#include <boost/shared_ptr.hpp>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <unistd.h> #include <unistd.h>
...@@ -44,7 +42,7 @@ const char* LFCController::lfc_app_name_ = "DhcpLFC"; ...@@ -44,7 +42,7 @@ const char* LFCController::lfc_app_name_ = "DhcpLFC";
/// @brief Defines the executable name. /// @brief Defines the executable name.
const char* LFCController::lfc_bin_name_ = "kea-lfc"; const char* LFCController::lfc_bin_name_ = "kea-lfc";
/// @brief Maximum number of errors to read the leases from the lease file. /// @brief Maximum number of errors to allow when reading leases from the file.
const uint32_t MAX_LEASE_ERRORS = 100; const uint32_t MAX_LEASE_ERRORS = 100;
LFCController::LFCController() LFCController::LFCController()
...@@ -57,6 +55,8 @@ LFCController::~LFCController() { ...@@ -57,6 +55,8 @@ LFCController::~LFCController() {
void void
LFCController::launch(int argc, char* argv[]) { LFCController::launch(int argc, char* argv[]) {
bool do_clean = true;
try { try {
parseArgs(argc, argv); parseArgs(argc, argv);
} catch (const InvalidUsage& ex) { } catch (const InvalidUsage& ex) {
...@@ -64,7 +64,8 @@ LFCController::launch(int argc, char* argv[]) { ...@@ -64,7 +64,8 @@ LFCController::launch(int argc, char* argv[]) {
throw; // rethrow it throw; // rethrow it
} }
std::cerr << "Starting lease file cleanup" << std::endl; if (verbose_ == true)
std::cerr << "Starting lease file cleanup" << std::endl;
// verify we are the only instance // verify we are the only instance
PIDFile pid_file(pid_file_); PIDFile pid_file(pid_file_);
...@@ -88,26 +89,36 @@ LFCController::launch(int argc, char* argv[]) { ...@@ -88,26 +89,36 @@ LFCController::launch(int argc, char* argv[]) {
return; return;
} }
// do other work (TBD)
// If we don't have a finish file do the processing // If we don't have a finish file do the processing
if (access(finish_file_.c_str(), F_OK) == -1) { if (access(finish_file_.c_str(), F_OK) == -1) {
std::cerr << "LFC Processing files" << std::endl; if (verbose_ == true)
std::cerr << "LFC Processing files" << std::endl;
if (protocol_version_ == 4) {
processLeases<Lease4, CSVLeaseFile4, Lease4Storage>(); try {
} else { if (protocol_version_ == 4) {
processLeases<Lease6, CSVLeaseFile6, Lease6Storage>(); processLeases<Lease4, CSVLeaseFile4, Lease4Storage>();
} } else {
processLeases<Lease6, CSVLeaseFile6, Lease6Storage>();
}
} catch (const isc::Exception& proc_ex) {
// We don't want to do the cleanup but do want to get rid of the pid
do_clean = false;
std::cerr << "Processing failed: " << proc_ex.what() << std::endl;
}
} }
// We either already had a finish file or just created one, do the // If do_clean is true We either already had a finish file or
// file cleanup, we don't want to return after the catch as we // were able to create one. We now want to do the file cleanup,
// we don't want to return after the catch as we
// still need to cleanup the pid file // still need to cleanup the pid file
try { if (do_clean == true) {
std::cerr << "LFC cleaning files" << std::endl; if (verbose_ == true)
fileCleanup(); std::cerr << "LFC cleaning files" << std::endl;
} catch (const RunTimeFail& run_ex) { try {
std::cerr << run_ex.what() << std::endl; fileCleanup();
} catch (const RunTimeFail& run_ex) {
std::cerr << run_ex.what() << std::endl;
}
} }
// delete the pid file for this instance // delete the pid file for this instance
...@@ -115,10 +126,10 @@ LFCController::launch(int argc, char* argv[]) { ...@@ -115,10 +126,10 @@ LFCController::launch(int argc, char* argv[]) {
pid_file.deleteFile(); pid_file.deleteFile();
} catch (const PIDFileError& pid_ex) { } catch (const PIDFileError& pid_ex) {
std::cerr << pid_ex.what() << std::endl; std::cerr << pid_ex.what() << std::endl;
return;
} }
std::cerr << "LFC complete" << std::endl; if (verbose_ == true)
std::cerr << "LFC complete" << std::endl;
} }
void void
...@@ -256,13 +267,14 @@ LFCController::parseArgs(int argc, char* argv[]) { ...@@ -256,13 +267,14 @@ LFCController::parseArgs(int argc, char* argv[]) {
// If verbose is set echo the input information // If verbose is set echo the input information
if (verbose_ == true) { if (verbose_ == true) {
std::cerr << "Protocol version: DHCPv" << protocol_version_ << std::endl std::cerr << "Protocol version: DHCPv" << protocol_version_ << std::endl
<< "Previous or ex lease file: " << previous_file_ << std::endl << "Previous or ex lease file: " << previous_file_ << std::endl
<< "Copy lease file: " << copy_file_ << std::endl << "Copy lease file: " << copy_file_ << std::endl
<< "Output lease file: " << output_file_ << std::endl << "Output lease file: " << output_file_ << std::endl
<< "Finish file: " << finish_file_ << std::endl << "Finish file: " << finish_file_ << std::endl
<< "Config file: " << config_file_ << std::endl << "Config file: " << config_file_ << std::endl
<< "PID file: " << pid_file_ << std::endl; << "PID file: " << pid_file_ << std::endl
<< std::endl;
} }
} }
...@@ -303,26 +315,26 @@ LFCController::getVersion(const bool extended) const{ ...@@ -303,26 +315,26 @@ LFCController::getVersion(const bool extended) const{
template<typename LeaseObjectType, typename LeaseFileType, typename StorageType> template<typename LeaseObjectType, typename LeaseFileType, typename StorageType>
void void
LFCController::processLeases() const { LFCController::processLeases() const {
LeaseFileType lfPrev(previous_file_.c_str()); LeaseFileType lf_prev(previous_file_.c_str());
LeaseFileType lfCopy(copy_file_.c_str()); LeaseFileType lf_copy(copy_file_.c_str());
LeaseFileType lfOutput(output_file_.c_str()); LeaseFileType lf_output(output_file_.c_str());
StorageType storage; StorageType storage;
storage.clear(); storage.clear();
// If a previous file exists read the entries into storage // If a previous file exists read the entries into storage
if (lfPrev.exists()) { if (lf_prev.exists()) {
LeaseFileLoader::load<LeaseObjectType>(lfPrev, storage, LeaseFileLoader::load<LeaseObjectType>(lf_prev, storage,
MAX_LEASE_ERRORS); MAX_LEASE_ERRORS);
} }
// Follow that with the copy of the current lease file // Follow that with the copy of the current lease file
if (lfCopy.exists()) { if (lf_copy.exists()) {
LeaseFileLoader::load<LeaseObjectType>(lfCopy, storage, LeaseFileLoader::load<LeaseObjectType>(lf_copy, storage,
MAX_LEASE_ERRORS); MAX_LEASE_ERRORS);
} }
// Write the result out to the output file // Write the result out to the output file
LeaseFileLoader::write<LeaseObjectType>(lfOutput, storage); LeaseFileLoader::write<LeaseObjectType>(lf_output, storage);
// Once we've finished the output file move it to the complete file // Once we've finished the output file move it to the complete file
if (rename(output_file_.c_str(), finish_file_.c_str()) != 0) if (rename(output_file_.c_str(), finish_file_.c_str()) != 0)
......
...@@ -41,10 +41,6 @@ public: ...@@ -41,10 +41,6 @@ public:
/// manage the command line, check for already running instances, /// manage the command line, check for already running instances,
/// invoke the code to process the lease files and finally to rename /// invoke the code to process the lease files and finally to rename
/// the lease files as necessary. /// the lease files as necessary.
///
/// @todo The current code simply processes the command line we still need to
/// -# invoke the code to read, process and write the lease files
/// -# rename and delete the shell files as required
class LFCController { class LFCController {
public: public:
/// @brief Defines the application name, it may be used to locate /// @brief Defines the application name, it may be used to locate
...@@ -67,10 +63,10 @@ public: ...@@ -67,10 +63,10 @@ public:
/// -# parse command line arguments /// -# parse command line arguments
/// -# verify that it is the only instance /// -# verify that it is the only instance
/// -# create pid file /// -# create pid file
/// -# read leases files TBD /// -# read leases files
/// -# write lease file TBD /// -# write lease file
/// -# move leases files TBD /// -# move leases files
/// -# cleanup artifacts TBD /// -# cleanup artifacts
/// -# remove pid file /// -# remove pid file
/// -# exit to the caller /// -# exit to the caller
/// ///
...@@ -158,6 +154,8 @@ public: ...@@ -158,6 +154,8 @@ public:
/// @brief Process files. Read in the leases from any previous & copy /// @brief Process files. Read in the leases from any previous & copy
/// files we have and write the results out to the output file. Upon /// files we have and write the results out to the output file. Upon
/// completion of the write move the file to the finish file. /// completion of the write move the file to the finish file.
///
/// @throw RunTimeFail if we can't move the file.
template<typename LeaseObjectType, typename LeaseFileType, typename StorageType> template<typename LeaseObjectType, typename LeaseFileType, typename StorageType>
void processLeases() const; void processLeases() const;
...@@ -166,7 +164,7 @@ public: ...@@ -166,7 +164,7 @@ public:
/// delete the work files (previous & copy) and move the finish file /// delete the work files (previous & copy) and move the finish file
/// to be the new previous file. /// to be the new previous file.
/// ///
/// @throw RunTimeFail if the command line parameters are invalid. /// @throw RunTimeFail if we can't manipulate the files.
void fileCleanup() const; void fileCleanup() const;
//@} //@}
......
...@@ -161,20 +161,20 @@ public: ...@@ -161,20 +161,20 @@ public:
} }
} }
/// @brief Write leaes from the storage into a lease file /// @brief Write leases from the storage into a lease file
/// ///
/// This method iterates over the @c Lease4 or @c Lease6 object in the /// This method iterates over the @c Lease4 or @c Lease6 object in the
/// storage specified in the arguments and writes them to the file /// storage specified in the arguments and writes them to the file
/// specified in the arguments. /// specified in the arguments.
/// ///
/// This method writes all entries in the storege to the file, it does /// This method writes all entries in the storage to the file, it does
/// not perform any checks for expriation or duplication. /// not perform any checks for expiration or duplication.
/// ///
/// @param lease_file A reference to the @c CSVLeaseFile4 or /// @param lease_file A reference to the @c CSVLeaseFile4 or
/// @c CSVLeaseFile6 object representing the lease file. The file /// @c CSVLeaseFile6 object representing the lease file. The file
/// doesn't need to be open because the method re-opens the file. /// doesn't need to be open because the method re-opens the file.
/// @param storage A reference to the container from which leases /// @param storage A reference to the container from which leases
/// should be written.. /// should be written.
/// @tparam LeasePtrType A @c Lease4 or @c Lease6. /// @tparam LeasePtrType A @c Lease4 or @c Lease6.
/// @tparam LeaseFileType A @c CSVLeaseFile4 or @c CSVLeaseFile6. /// @tparam LeaseFileType A @c CSVLeaseFile4 or @c CSVLeaseFile6.
/// @tparam StorageType A @c Lease4Storage or @c Lease6Storage. /// @tparam StorageType A @c Lease4Storage or @c Lease6Storage.
...@@ -188,14 +188,14 @@ public: ...@@ -188,14 +188,14 @@ public:
lease_file.close(); lease_file.close();
lease_file.open(); lease_file.open();
// Iterate over the storage area writing out the leases // Iterate over the storage area writing out the leases
for (typename StorageType::const_iterator lease = storage.begin(); for (typename StorageType::const_iterator lease = storage.begin();
lease != storage.end(); lease != storage.end();
++lease) { ++lease) {
lease_file.append(**lease); lease_file.append(**lease);
} }
// Close the file // Close the file
lease_file.close(); lease_file.close();
} }
}; };
......
...@@ -82,31 +82,31 @@ public: ...@@ -82,31 +82,31 @@ public:
/// @brief Tests the write function. /// @brief Tests the write function.
/// ///
/// This method writes the leases from the storage container to the lease file /// This method writes the leases from the storage container to the lease file
/// then compares the output to the string provided in the aguments to verify /// then compares the output to the string provided in the arguments to verify
/// the write was correct. The order of the leases in the output will dpend /// the write was correct. The order of the leases in the output will depend
/// on the order in which the container provides the leases. /// on the order in which the container provides the leases.
/// ///
/// @param storage A reference to the container to be written to the file /// @param storage A reference to the container to be written to the file
/// @param compStr The string to compare to what was read from the file /// @param compare The string to compare to what was read from the file
/// ///
/// @tparam LeaseStorage Type of the container: @c Lease4Container /// @tparam LeaseStorage Type of the container: @c Lease4Container
/// @c Lease6Container. /// @c Lease6Container.
/// ///
template<typename LeaseObjectType, typename LeaseFileType, template<typename LeaseObjectType, typename LeaseFileType,
typename StorageType> typename StorageType>
void writeLeases(LeaseFileType lease_file, void writeLeases(LeaseFileType lease_file,
const StorageType& storage, const StorageType& storage,
const std::string& compare) { const std::string& compare) {
// Prepare for a new file, close and remove the old // Prepare for a new file, close and remove the old
lease_file.close(); lease_file.close();
io_.removeFile(); io_.removeFile();
// Write the current leases to the file // Write the current leases to the file
LeaseFileLoader::write<LeaseObjectType, LeaseFileType, StorageType> LeaseFileLoader::write<LeaseObjectType, LeaseFileType, StorageType>
(lease_file, storage); (lease_file, storage);
// Compare to see if we got what we exepcted. // Compare to see if we got what we exepcted.
EXPECT_EQ(compare, io_.readFile()); EXPECT_EQ(compare, io_.readFile());
} }
...@@ -131,6 +131,9 @@ LeaseFileLoaderTest::absolutePath(const std::string& filename) { ...@@ -131,6 +131,9 @@ LeaseFileLoaderTest::absolutePath(const std::string& filename) {
// This test verifies that the DHCPv4 leases can be loaded from the lease // This test verifies that the DHCPv4 leases can be loaded from the lease
// file and that only the most recent entry for each lease is loaded and // file and that only the most recent entry for each lease is loaded and
// the previous entries are discarded. // the previous entries are discarded.
//
// It also tests the write function by writing the storage to a file
// and comparing that with the expected value.
TEST_F(LeaseFileLoaderTest, load4) { TEST_F(LeaseFileLoaderTest, load4) {
// Create lease file with leases for 192.0.2.1, 192.0.3.15. The lease // Create lease file with leases for 192.0.2.1, 192.0.3.15. The lease
// entry for the 192.0.2.3 is invalid (lacks HW address) and should // entry for the 192.0.2.3 is invalid (lacks HW address) and should
...@@ -177,17 +180,20 @@ TEST_F(LeaseFileLoaderTest, load4) { ...@@ -177,17 +180,20 @@ TEST_F(LeaseFileLoaderTest, load4) {
writeLeases<Lease4, CSVLeaseFile4, Lease4Storage> writeLeases<Lease4, CSVLeaseFile4, Lease4Storage>
(*lf, storage, (*lf, storage,
"address,hwaddr,client_id,valid_lifetime,expire,subnet_id," "address,hwaddr,client_id,valid_lifetime,expire,subnet_id,"
"fqdn_fwd,fqdn_rev,hostname\n" "fqdn_fwd,fqdn_rev,hostname\n"
"192.0.2.1,06:07:08:09:0a:bc,,200,500,8,1,1," "192.0.2.1,06:07:08:09:0a:bc,,200,500,8,1,1,"
"host.example.com\n" "host.example.com\n"
"192.0.3.15,dd:de:ba:0d:1b:2e:3e:4f,0a:00:01:04,100,135,7," "192.0.3.15,dd:de:ba:0d:1b:2e:3e:4f,0a:00:01:04,100,135,7,"
"0,0,\n"); "0,0,\n");
} }
// This test verifies that the lease with a valid lifetime of 0 // This test verifies that the lease with a valid lifetime of 0
// is removed from the storage. The valid lifetime of 0 is set // is removed from the storage. The valid lifetime of 0 is set
// for the released leases. // for the released leases.
//
// It also tests the write function by writing the storage to a file
// and comparing that with the expected value.
TEST_F(LeaseFileLoaderTest, load4LeaseRemove) { TEST_F(LeaseFileLoaderTest, load4LeaseRemove) {
// Create lease file in which one of the entries for 192.0.2.1 // Create lease file in which one of the entries for 192.0.2.1
// has a valid_lifetime of 0 and results in the deletion of the // has a valid_lifetime of 0 and results in the deletion of the
...@@ -219,15 +225,18 @@ TEST_F(LeaseFileLoaderTest, load4LeaseRemove) { ...@@ -219,15 +225,18 @@ TEST_F(LeaseFileLoaderTest, load4LeaseRemove) {
writeLeases<Lease4, CSVLeaseFile4, Lease4Storage> writeLeases<Lease4, CSVLeaseFile4, Lease4Storage>
(*lf, storage, (*lf, storage,
"address,hwaddr,client_id,valid_lifetime,expire,subnet_id," "address,hwaddr,client_id,valid_lifetime,expire,subnet_id,"
"fqdn_fwd,fqdn_rev,hostname\n" "fqdn_fwd,fqdn_rev,hostname\n"
"192.0.3.15,dd:de:ba:0d:1b:2e:3e:4f,0a:00:01:04,100,135,7," "192.0.3.15,dd:de:ba:0d:1b:2e:3e:4f,0a:00:01:04,100,135,7,"
"0,0,\n"); "0,0,\n");
} }
// This test verifies that the DHCPv6 leases can be loaded from the lease // This test verifies that the DHCPv6 leases can be loaded from the lease
// file and that only the most recent entry for each lease is loaded and // file and that only the most recent entry for each lease is loaded and
// the previous entries are discarded. // the previous entries are discarded.
//
// It also tests the write function by writing the storage to a file
// and comparing that with the expected value.
TEST_F(LeaseFileLoaderTest, load6) { TEST_F(LeaseFileLoaderTest, load6) {
// Create a lease file with three valid leases: 2001:db8:1::1, // Create a lease file with three valid leases: 2001:db8:1::1,
// 3000:1:: and 2001:db8:2::10. // 3000:1:: and 2001:db8:2::10.
...@@ -277,20 +286,23 @@ TEST_F(LeaseFileLoaderTest, load6) { ...@@ -277,20 +286,23 @@ TEST_F(LeaseFileLoaderTest, load6) {
writeLeases<Lease6, CSVLeaseFile6, Lease6Storage> writeLeases<Lease6, CSVLeaseFile6, Lease6Storage>
(*lf, storage, (*lf, storage,
"address,duid,valid_lifetime,expire,subnet_id," "address,duid,valid_lifetime,expire,subnet_id,"
"pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd," "pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,"
"fqdn_rev,hostname,hwaddr\n" "fqdn_rev,hostname,hwaddr\n"
"2001:db8:1::1,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f," "2001:db8:1::1,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f,"
"200,400,8,100,0,7,0,1,1,host.example.com,\n" "200,400,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,800,6,150," "2001:db8:2::10,01:01:01:01:0a:01:02:03:04:05,300,800,6,150,"
"0,8,0,0,0,,\n" "0,8,0,0,0,,\n"
"3000:1::,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f,100,200,8,0,2," "3000:1::,00:01:02:03:04:05:06:0a:0b:0c:0d:0e:0f,100,200,8,0,2,"
"16,64,0,0,,\n"); "16,64,0,0,,\n");
} }
// This test verifies that the lease with a valid lifetime of 0 // This test verifies that the lease with a valid lifetime of 0
// is removed from the storage. The valid lifetime of 0 set set // is removed from the storage. The valid lifetime of 0 set set
// for the released leases. // for the released leases.
//
// It also tests the write function by writing the storage to a file
// and comparing that with the expected value.
TEST_F(LeaseFileLoaderTest, load6LeaseRemove) { TEST_F(LeaseFileLoaderTest, load6LeaseRemove) {
// Create lease file in which one of the entries for the 2001:db8:1::1 // Create lease file in which one of the entries for the 2001:db8:1::1
// has valid lifetime set to 0, in which case the lease should be // has valid lifetime set to 0, in which case the lease should be
...@@ -324,11 +336,11 @@ TEST_F(LeaseFileLoaderTest, load6LeaseRemove) { ...@@ -324,11 +336,11 @@ TEST_F(LeaseFileLoaderTest, load6LeaseRemove) {
writeLeases<Lease6, CSVLeaseFile6, Lease6Storage> writeLeases<Lease6, CSVLeaseFile6, Lease6Storage>
(*lf, storage, (*lf, storage,
"address,duid,valid_lifetime,expire,subnet_id," "address,duid,valid_lifetime,expire,subnet_id,"
"pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd," "pref_lifetime,lease_type,iaid,prefix_len,fqdn_fwd,"
"fqdn_rev,hostname,hwaddr\n" "fqdn_rev,hostname,hwaddr\n"
"2001:db8:2::10,01:01:01:01:0a:01:02:03:04:05,300,800,6,150," "2001:db8:2::10,01:01:01:01:0a:01:02:03:04:05,300,800,6,150,"
"0,8,0,0,0,,\n"); "0,8,0,0,0,,\n");
} }
// This test verifies that the exception is thrown when the specific // This test verifies that the exception is thrown when the specific
...@@ -380,6 +392,9 @@ TEST_F(LeaseFileLoaderTest, loadMaxErrors) { ...@@ -380,6 +392,9 @@ TEST_F(LeaseFileLoaderTest, loadMaxErrors) {
// This test verifies that the lease with a valid lifetime set to 0 is // This test verifies that the lease with a valid lifetime set to 0 is
// not loaded if there are no previous entries for this lease in the // not loaded if there are no previous entries for this lease in the
// lease file. // lease file.
//
// It also tests the write function by writing the storage to a file
// and comparing that with the expected value.
TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) { TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) {
// Create lease file. The second lease has a valid lifetime of 0. // Create lease file. The second lease has a valid lifetime of 0.
io_.writeFile("address,hwaddr,client_id,valid_lifetime,expire,subnet_id," io_.writeFile("address,hwaddr,client_id,valid_lifetime,expire,subnet_id,"
...@@ -388,7 +403,7 @@ TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) { ...@@ -388,7 +403,7 @@ TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) {
"192.0.2.3,06:07:08:09:0a:bd,,0,200,8,1,1,,\n"); "192.0.2.3,06:07:08:09:0a:bd,,0,200,8,1,1,,\n");
boost::scoped_ptr<CSVLeaseFile4> lf(new CSVLeaseFile4(filename_)); boost::scoped_ptr<CSVLeaseFile4> lf(new CSVLeaseFile4(filename_));
ASSERT_NO_THROW(lf->open()); ASSERT_NO_THROW(lf->open());
// Set the error count to 0 to make sure that lease with a zero // Set the error count to 0 to make sure that lease with a zero
// lifetime doesn't cause an error. // lifetime doesn't cause an error.
...@@ -405,11 +420,11 @@ TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) { ...@@ -405,11 +420,11 @@ TEST_F(LeaseFileLoaderTest, loadLeaseWithZeroLifetime) {
writeLeases<Lease4, CSVLeaseFile4, Lease4Storage> writeLeases<Lease4, CSVLeaseFile4, Lease4Storage>
(*lf, storage, (*lf, storage,
"address,hwaddr,client_id,valid_lifetime,expire,subnet_id," "address,hwaddr,client_id,valid_lifetime,expire,subnet_id,"
"fqdn_fwd,fqdn_rev,hostname\n" "fqdn_fwd,fqdn_rev,hostname\n"
"192.0.2.1,06:07:08:09:0a:bc,,200,200,8,1,1,\n"); "192.0.2.1,06:07:08:09:0a:bc,,200,200,8,1,1,\n");
} }
} // end of anonymous namespace } // end of anonymous namespace
...@@ -97,4 +97,3 @@ PIDFile::deleteFile() const { ...@@ -97,4 +97,3 @@ PIDFile::deleteFile() const {
} // namespace isc::util } // namespace isc::util
} // namespace isc } // namespace isc
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment