Commit f09a4f68 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[3084] Use FQDN data from the lease database to create lease instance.

parent 879bf7b4
......@@ -33,15 +33,34 @@ namespace isc {
namespace dhcp {
Lease::Lease(const isc::asiolink::IOAddress& addr, uint32_t t1, uint32_t t2,
uint32_t valid_lft, SubnetID subnet_id, time_t cltt)
uint32_t valid_lft, SubnetID subnet_id, time_t cltt,
const bool fqdn_fwd, const bool fqdn_rev,
const std::string& hostname)
:addr_(addr), t1_(t1), t2_(t2), valid_lft_(valid_lft), cltt_(cltt),
subnet_id_(subnet_id), fixed_(false), fqdn_fwd_(false), fqdn_rev_(false) {
subnet_id_(subnet_id), fixed_(false), hostname_(hostname),
fqdn_fwd_(fqdn_fwd), fqdn_rev_(fqdn_rev) {
}
Lease6::Lease6(LeaseType type, const isc::asiolink::IOAddress& addr,
DuidPtr duid, uint32_t iaid, uint32_t preferred, uint32_t valid,
uint32_t t1, uint32_t t2, SubnetID subnet_id, uint8_t prefixlen)
: Lease(addr, t1, t2, valid, subnet_id, 0/*cltt*/),
: Lease(addr, t1, t2, valid, subnet_id, 0/*cltt*/, false, false, ""),
type_(type), prefixlen_(prefixlen), iaid_(iaid), duid_(duid),
preferred_lft_(preferred) {
if (!duid) {
isc_throw(InvalidOperation, "DUID must be specified for a lease");
}
cltt_ = time(NULL);
}
Lease6::Lease6(LeaseType type, const isc::asiolink::IOAddress& addr,
DuidPtr duid, uint32_t iaid, uint32_t preferred, uint32_t valid,
uint32_t t1, uint32_t t2, SubnetID subnet_id,
const bool fqdn_fwd, const bool fqdn_rev,
const std::string& hostname, uint8_t prefixlen)
: Lease(addr, t1, t2, valid, subnet_id, 0/*cltt*/,
fqdn_fwd, fqdn_rev, hostname),
type_(type), prefixlen_(prefixlen), iaid_(iaid), duid_(duid),
preferred_lft_(preferred) {
if (!duid) {
......
......@@ -122,8 +122,13 @@ struct Lease {
/// @param valid_lft Lifetime of the lease
/// @param subnet_id Subnet identification
/// @param cltt Client last transmission time
/// @param fqdn_fwd If true, forward DNS update is performed for a lease.
/// @param fqdn_rev If true, reverse DNS update is performed for a lease.
/// @param hostname FQDN of the client which gets the lease.
Lease(const isc::asiolink::IOAddress& addr, uint32_t t1, uint32_t t2,
uint32_t valid_lft, SubnetID subnet_id, time_t cltt);
uint32_t valid_lft, SubnetID subnet_id, time_t cltt,
const bool fqdn_fwd, const bool fqdn_rev,
const std::string& hostname);
/// @brief Destructor
virtual ~Lease() {}
......@@ -243,10 +248,16 @@ struct Lease4 : public Lease {
/// @param t2 rebinding time
/// @param cltt Client last transmission time
/// @param subnet_id Subnet identification
/// @param fqdn_fwd If true, forward DNS update is performed for a lease.
/// @param fqdn_rev If true, reverse DNS update is performed for a lease.
/// @param hostname FQDN of the client which gets the lease.
Lease4(const isc::asiolink::IOAddress& addr, const uint8_t* hwaddr, size_t hwaddr_len,
const uint8_t* clientid, size_t clientid_len, uint32_t valid_lft,
uint32_t t1, uint32_t t2, time_t cltt, uint32_t subnet_id)
: Lease(addr, t1, t2, valid_lft, subnet_id, cltt),
uint32_t t1, uint32_t t2, time_t cltt, uint32_t subnet_id,
const bool fqdn_fwd = false, const bool fqdn_rev = false,
const std::string& hostname = "")
: Lease(addr, t1, t2, valid_lft, subnet_id, cltt, fqdn_fwd, fqdn_rev,
hostname),
ext_(0), hwaddr_(hwaddr, hwaddr + hwaddr_len) {
if (clientid_len) {
client_id_.reset(new ClientId(clientid, clientid_len));
......@@ -256,7 +267,7 @@ struct Lease4 : public Lease {
/// @brief Default constructor
///
/// Initialize fields that don't have a default constructor.
Lease4() : Lease(0, 0, 0, 0, 0, 0) {
Lease4() : Lease(0, 0, 0, 0, 0, 0, false, false, "") {
}
/// @brief Compare two leases for equality
......@@ -331,14 +342,46 @@ struct Lease6 : public Lease {
/// @todo: Add DHCPv6 failover related fields here
/// @brief Constructor
/// @param type Lease type.
/// @param addr Assigned address.
/// @param duid A pointer to an object representing DUID.
/// @param iaid IAID.
/// @param preferred Preferred lifetime.
/// @param valid Valid lifetime.
/// @param t1 A value of the T1 timer.
/// @param t2 A value of the T2 timer.
/// @param subnet_id A Subnet identifier.
/// @param prefixlen An address prefix length.
Lease6(LeaseType type, const isc::asiolink::IOAddress& addr, DuidPtr duid,
uint32_t iaid, uint32_t preferred, uint32_t valid, uint32_t t1,
uint32_t t2, SubnetID subnet_id, uint8_t prefixlen_ = 0);
uint32_t t2, SubnetID subnet_id, uint8_t prefixlen = 0);
/// @brief Constructor, including FQDN data.
///
/// @param type Lease type.
/// @param addr Assigned address.
/// @param duid A pointer to an object representing DUID.
/// @param iaid IAID.
/// @param preferred Preferred lifetime.
/// @param valid Valid lifetime.
/// @param t1 A value of the T1 timer.
/// @param t2 A value of the T2 timer.
/// @param subnet_id A Subnet identifier.
/// @param fqdn_fwd If true, forward DNS update is performed for a lease.
/// @param fqdn_rev If true, reverse DNS update is performed for a lease.
/// @param hostname FQDN of the client which gets the lease.
/// @param prefixlen An address prefix length.
Lease6(LeaseType type, const isc::asiolink::IOAddress& addr, DuidPtr duid,
uint32_t iaid, uint32_t preferred, uint32_t valid, uint32_t t1,
uint32_t t2, SubnetID subnet_id, const bool fqdn_fwd,
const bool fqdn_rev, const std::string& hostname,
uint8_t prefixlen = 0);
/// @brief Constructor
///
/// Initialize fields that don't have a default constructor.
Lease6() : Lease(isc::asiolink::IOAddress("::"), 0, 0, 0, 0, 0),
Lease6() : Lease(isc::asiolink::IOAddress("::"), 0, 0, 0, 0, 0,
false, false, ""),
type_(LEASE_IA_NA) {
}
......
......@@ -565,10 +565,16 @@ public:
client_id_length_ = 0;
}
// Hostname is passed to Lease4 as a string object. We have to create
// it from the buffer holding hostname and the buffer length.
std::string hostname(hostname_buffer_,
hostname_buffer_ + hostname_length_);
// note that T1 and T2 are not stored
return (Lease4Ptr(new Lease4(addr4_, hwaddr_buffer_, hwaddr_length_,
client_id_buffer_, client_id_length_,
valid_lifetime_, 0, 0, cltt, subnet_id_)));
valid_lifetime_, 0, 0, cltt, subnet_id_,
fqdn_fwd_, fqdn_rev_, hostname)));
}
/// @brief Return columns in error
......@@ -980,11 +986,17 @@ public:
// Set up DUID,
DuidPtr duid_ptr(new DUID(duid_buffer_, duid_length_));
// Hostname is passed to Lease6 as a string object, so we have to
// create it from the hostname buffer and length.
std::string hostname(hostname_buffer_,
hostname_buffer_ + hostname_length_);
// Create the lease and set the cltt (after converting from the
// expire time retrieved from the database).
Lease6Ptr result(new Lease6(type, addr, duid_ptr, iaid_,
pref_lifetime_, valid_lifetime_, 0, 0,
subnet_id_, prefixlen_));
subnet_id_, fqdn_fwd_, fqdn_rev_,
hostname, prefixlen_));
time_t cltt = 0;
MySqlLeaseMgr::convertFromDatabaseTime(expire_, valid_lifetime_, cltt);
result->cltt_ = cltt;
......
......@@ -272,8 +272,9 @@ TEST(Lease4, Lease4Constructor) {
// Create the lease
Lease4 lease(ADDRESS[i], HWADDR, sizeof(HWADDR),
CLIENTID, sizeof(CLIENTID), VALID_LIFETIME, 0, 0, current_time,
SUBNET_ID);
CLIENTID, sizeof(CLIENTID), VALID_LIFETIME, 0, 0,
current_time, SUBNET_ID, true, true,
"hostname.example.com.");
EXPECT_EQ(ADDRESS[i], static_cast<uint32_t>(lease.addr_));
EXPECT_EQ(0, lease.ext_);
......@@ -285,9 +286,9 @@ TEST(Lease4, Lease4Constructor) {
EXPECT_EQ(current_time, lease.cltt_);
EXPECT_EQ(SUBNET_ID, lease.subnet_id_);
EXPECT_FALSE(lease.fixed_);
EXPECT_TRUE(lease.hostname_.empty());
EXPECT_FALSE(lease.fqdn_fwd_);
EXPECT_FALSE(lease.fqdn_rev_);
EXPECT_EQ("hostname.example.com.", lease.hostname_);
EXPECT_TRUE(lease.fqdn_fwd_);
EXPECT_TRUE(lease.fqdn_rev_);
EXPECT_TRUE(lease.comments_.empty());
}
}
......@@ -427,7 +428,7 @@ TEST(Lease4, OperatorEquals) {
// Lease6 is also defined in lease_mgr.h, so is tested in this file as well.
// This test checks if the Lease6 structure can be instantiated correctly
TEST(Lease6, Lease6Constructor) {
TEST(Lease6, Lease6ConstructorDefault) {
// check a variety of addresses with different bits set.
const char* ADDRESS[] = {
......@@ -458,6 +459,56 @@ TEST(Lease6, Lease6Constructor) {
EXPECT_TRUE(lease->valid_lft_ == 200);
EXPECT_TRUE(lease->t1_ == 50);
EXPECT_TRUE(lease->t2_ == 80);
EXPECT_FALSE(lease->fqdn_fwd_);
EXPECT_FALSE(lease->fqdn_rev_);
EXPECT_TRUE(lease->hostname_.empty());
}
// Lease6 must be instantiated with a DUID, not with NULL pointer
IOAddress addr(ADDRESS[0]);
Lease6Ptr lease2;
EXPECT_THROW(lease2.reset(new Lease6(Lease6::LEASE_IA_NA, addr,
DuidPtr(), iaid, 100, 200, 50, 80,
subnet_id)), InvalidOperation);
}
// This test verifies that the Lease6 constructor which accepts FQDN data,
// sets the data correctly for the lease.
TEST(Lease6, Lease6ConstructorWithFQDN) {
// check a variety of addresses with different bits set.
const char* ADDRESS[] = {
"::", "::1", "2001:db8:1::456",
"7fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
"8000::", "8000::1",
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
};
// Other values
uint8_t llt[] = {0, 1, 2, 3, 4, 5, 6, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
DuidPtr duid(new DUID(llt, sizeof(llt)));
uint32_t iaid = 7; // Just a number
SubnetID subnet_id = 8; // Just another number
for (int i = 0; i < sizeof(ADDRESS) / sizeof(ADDRESS[0]); ++i) {
IOAddress addr(ADDRESS[i]);
Lease6Ptr lease(new Lease6(Lease6::LEASE_IA_NA, addr,
duid, iaid, 100, 200, 50, 80, subnet_id,
true, true, "host.example.com."));
EXPECT_TRUE(lease->addr_ == addr);
EXPECT_TRUE(*lease->duid_ == *duid);
EXPECT_TRUE(lease->iaid_ == iaid);
EXPECT_TRUE(lease->subnet_id_ == subnet_id);
EXPECT_TRUE(lease->type_ == Lease6::LEASE_IA_NA);
EXPECT_TRUE(lease->preferred_lft_ == 100);
EXPECT_TRUE(lease->valid_lft_ == 200);
EXPECT_TRUE(lease->t1_ == 50);
EXPECT_TRUE(lease->t2_ == 80);
EXPECT_TRUE(lease->fqdn_fwd_);
EXPECT_TRUE(lease->fqdn_rev_);
EXPECT_EQ("host.example.com.", lease->hostname_);
}
// Lease6 must be instantiated with a DUID, not with NULL pointer
......@@ -468,6 +519,7 @@ TEST(Lease6, Lease6Constructor) {
subnet_id)), InvalidOperation);
}
/// @brief Lease6 Equality Test
///
/// Checks that the operator==() correctly compares two leases for equality.
......
// Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2012-2013 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
......@@ -249,6 +249,9 @@ public:
lease->valid_lft_ = 8677;
lease->cltt_ = 168256;
lease->subnet_id_ = 23;
lease->fqdn_rev_ = true;
lease->fqdn_fwd_ = false;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress4_[1]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x19);
......@@ -257,6 +260,9 @@ public:
lease->valid_lft_ = 3677;
lease->cltt_ = 123456;
lease->subnet_id_ = 73;
lease->fqdn_rev_ = true;
lease->fqdn_fwd_ = true;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress4_[2]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x2a);
......@@ -265,6 +271,9 @@ public:
lease->valid_lft_ = 5412;
lease->cltt_ = 234567;
lease->subnet_id_ = 73; // Same as lease 1
lease->fqdn_rev_ = false;
lease->fqdn_fwd_ = false;
lease->hostname_ = "";
} else if (address == straddress4_[3]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
......@@ -278,6 +287,9 @@ public:
lease->valid_lft_ = 7000;
lease->cltt_ = 234567;
lease->subnet_id_ = 37;
lease->fqdn_rev_ = true;
lease->fqdn_fwd_ = true;
lease->hostname_ = "otherhost.example.com.";
} else if (address == straddress4_[4]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x4c);
......@@ -287,6 +299,9 @@ public:
lease->valid_lft_ = 7736;
lease->cltt_ = 222456;
lease->subnet_id_ = 85;
lease->fqdn_rev_ = true;
lease->fqdn_fwd_ = true;
lease->hostname_ = "otherhost.example.com.";
} else if (address == straddress4_[5]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x19); // Same as lease 1
......@@ -296,6 +311,9 @@ public:
lease->valid_lft_ = 7832;
lease->cltt_ = 227476;
lease->subnet_id_ = 175;
lease->fqdn_rev_ = false;
lease->fqdn_fwd_ = false;
lease->hostname_ = "otherhost.example.com.";
} else if (address == straddress4_[6]) {
lease->hwaddr_ = vector<uint8_t>(6, 0x6e);
......@@ -305,6 +323,9 @@ public:
lease->valid_lft_ = 1832;
lease->cltt_ = 627476;
lease->subnet_id_ = 112;
lease->fqdn_rev_ = false;
lease->fqdn_fwd_ = true;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress4_[7]) {
lease->hwaddr_ = vector<uint8_t>(); // Empty
......@@ -312,6 +333,9 @@ public:
lease->valid_lft_ = 7975;
lease->cltt_ = 213876;
lease->subnet_id_ = 19;
lease->fqdn_rev_ = true;
lease->fqdn_fwd_ = true;
lease->hostname_ = "myhost.example.com.";
} else {
// Unknown address, return an empty pointer.
......@@ -358,6 +382,9 @@ public:
lease->valid_lft_ = 8677;
lease->cltt_ = 168256;
lease->subnet_id_ = 23;
lease->fqdn_fwd_ = true;
lease->fqdn_rev_ = true;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress6_[1]) {
lease->type_ = Lease6::LEASE_IA_TA;
......@@ -368,6 +395,9 @@ public:
lease->valid_lft_ = 3677;
lease->cltt_ = 123456;
lease->subnet_id_ = 73;
lease->fqdn_fwd_ = false;
lease->fqdn_rev_ = true;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress6_[2]) {
lease->type_ = Lease6::LEASE_IA_PD;
......@@ -378,6 +408,9 @@ public:
lease->valid_lft_ = 5412;
lease->cltt_ = 234567;
lease->subnet_id_ = 73; // Same as lease 1
lease->fqdn_fwd_ = false;
lease->fqdn_rev_ = false;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress6_[3]) {
lease->type_ = Lease6::LEASE_IA_NA;
......@@ -397,6 +430,9 @@ public:
lease->valid_lft_ = 7000;
lease->cltt_ = 234567;
lease->subnet_id_ = 37;
lease->fqdn_fwd_ = true;
lease->fqdn_rev_ = false;
lease->hostname_ = "myhost.example.com.";
} else if (address == straddress6_[4]) {
// Same DUID and IAID as straddress6_1
......@@ -408,6 +444,9 @@ public:
lease->valid_lft_ = 7736;
lease->cltt_ = 222456;
lease->subnet_id_ = 671;
lease->fqdn_fwd_ = true;
lease->fqdn_rev_ = true;
lease->hostname_ = "otherhost.example.com.";
} else if (address == straddress6_[5]) {
// Same DUID and IAID as straddress6_1
......@@ -420,6 +459,9 @@ public:
lease->valid_lft_ = 7832;
lease->cltt_ = 227476;
lease->subnet_id_ = 175;
lease->fqdn_fwd_ = false;
lease->fqdn_rev_ = true;
lease->hostname_ = "hostname.example.com.";
} else if (address == straddress6_[6]) {
// Same DUID as straddress6_1
......@@ -432,6 +474,9 @@ public:
lease->valid_lft_ = 1832;
lease->cltt_ = 627476;
lease->subnet_id_ = 112;
lease->fqdn_fwd_ = false;
lease->fqdn_rev_ = true;
lease->hostname_ = "hostname.example.com.";
} else if (address == straddress6_[7]) {
// Same IAID as straddress6_1
......@@ -443,6 +488,9 @@ public:
lease->valid_lft_ = 7975;
lease->cltt_ = 213876;
lease->subnet_id_ = 19;
lease->fqdn_fwd_ = false;
lease->fqdn_rev_ = true;
lease->hostname_ = "hostname.example.com.";
} else {
// Unknown address, return an empty pointer.
......
......@@ -47,6 +47,9 @@ detailCompareLease(const Lease4Ptr& first, const Lease4Ptr& second) {
EXPECT_EQ(first->valid_lft_, second->valid_lft_);
EXPECT_EQ(first->cltt_, second->cltt_);
EXPECT_EQ(first->subnet_id_, second->subnet_id_);
EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
EXPECT_EQ(first->hostname_, second->hostname_);
}
void
......@@ -67,6 +70,9 @@ detailCompareLease(const Lease6Ptr& first, const Lease6Ptr& second) {
EXPECT_EQ(first->valid_lft_, second->valid_lft_);
EXPECT_EQ(first->cltt_, second->cltt_);
EXPECT_EQ(first->subnet_id_, second->subnet_id_);
EXPECT_EQ(first->fqdn_fwd_, second->fqdn_fwd_);
EXPECT_EQ(first->fqdn_rev_, second->fqdn_rev_);
EXPECT_EQ(first->hostname_, second->hostname_);
}
};
......
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