network_.reset(new SharedNetwork4("test_network"));
network_->add(subnet1_);
network_->add(subnet2_);
+
+ std::vector<uint8_t> hwaddr_vec = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
+ hwaddr2_.reset(new HWAddr(hwaddr_vec, HTYPE_ETHER));
+ }
+
+ /// @brief Inserts a new lease for specified address
+ ///
+ /// Creates a new lease for specified address and subnet-id and inserts
+ /// it into database. This is not particularly fancy method, it is used
+ /// just to mark existing addresses as used. It uses hwaddr2_ to allocate
+ /// the lease.
+ ///
+ /// @param addr text representation of the address
+ /// @param subnet_id ID of the subnet
+ /// @param return pointer to the lease
+ Lease4Ptr
+ insertLease(std::string addr, SubnetID subnet_id) {
+ Lease4Ptr lease(new Lease4(IOAddress(addr), hwaddr2_, ClientIdPtr(),
+ 501, 502, 503, time(NULL), subnet_id));
+ lease->cltt_ = time(NULL) - 10; // Allocated 10 seconds ago
+ if (!LeaseMgrFactory::instance().addLease(lease)) {
+ ADD_FAILURE() << "Attempt to add a lease for IP " << addr
+ << " in subnet " << subnet_id << " failed";
+ }
+
+ return (lease);
}
- /// Covenience pointers to configuration elements
+ /// Covenience pointers to configuration elements. These are initialized
+ /// in the constructor and are used throughout the tests.
AllocEngine engine_;
Subnet4Ptr subnet1_;
Subnet4Ptr subnet2_;
Pool4Ptr pool1_;
Pool4Ptr pool2_;
SharedNetwork4Ptr network_;
+
+ HWAddrPtr hwaddr2_; // Note there's hwaddr_ already defined in base class.
};
+// This test verifies that the server can offer an address from a
+// subnet and the introduction of shared network doesn't break anything here.
+TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkSimple) {
+
+ // Create context which will be used to try to allocate leases from the
+ // shared network. The context points to subnet1, which address space
+ // is exhausted. We expect the allocation engine to find another subnet
+ // within the same shared network and offer an address from there.
+ AllocEngine::ClientContext4
+ ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(),
+ false, false, "host.example.com.", true);
+ ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234));
+ Lease4Ptr lease = engine_.allocateLease4(ctx);
+
+ // The allocation engine should have assigned an address from the first
+ // subnet.
+ ASSERT_TRUE(lease);
+ EXPECT_EQ("192.0.2.17", lease->addr_.toText());
+
+ // Make sure the lease is not in the the lease mgr (this is only
+ // discover).
+ ASSERT_FALSE(LeaseMgrFactory::instance().getLease4(lease->addr_));
+}
+
+// This test verifies that the server will pick a second subnet out of two
+// shared subnets if there is a hint for the second subnet.
+TEST_F(SharedNetworkAlloc4Test, discoverSharedNetworkHint) {
+
+ // Create context which will be used to try to allocate leases from the
+ // shared network. The context points to subnet1, which address space
+ // is exhausted. We expect the allocation engine to find another subnet
+ // within the same shared network and offer an address from there.
+
+ AllocEngine::ClientContext4
+ ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress("10.1.2.25"),
+ false, false, "host.example.com.", true);
+ ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234));
+ Lease4Ptr lease = engine_.allocateLease4(ctx);
+
+ // The allocation engine should have assigned an address from the second
+ // subnet, because that's what the hint requested.
+ ASSERT_TRUE(lease);
+ EXPECT_TRUE(subnet2_->inPool(Lease::TYPE_V4, lease->addr_));
+}
+
// This test verifies that the server can offer an address from a
// different subnet than orginally selected, when the address pool in
TEST_F(SharedNetworkAlloc4Test, discoverSharedNetwork) {
// Create a lease for a single address in the first address pool. The
// pool is now exhausted.
- std::vector<uint8_t> hwaddr_vec = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
- HWAddrPtr hwaddr(new HWAddr(hwaddr_vec, HTYPE_ETHER));
- Lease4Ptr lease(new Lease4(IOAddress("192.0.2.17"), hwaddr, ClientIdPtr(),
- 501, 502, 503, time(NULL), subnet1_->getID()));
- lease->cltt_ = time(NULL) - 10; // Allocated 10 seconds ago
- ASSERT_TRUE(LeaseMgrFactory::instance().addLease(lease));
+ Lease4Ptr lease = insertLease("192.0.2.17", subnet1_->getID());
// Create context which will be used to try to allocate leases from the
// shared network. The context points to subnet1, which address space
// to renew its lease regardless of a subnet it begins with. So, it has
// an address assigned from subnet1, but we use subnet2 as a selected
// subnet.
- AllocEngine::ClientContext4 ctx2(subnet2_, ClientIdPtr(), hwaddr,
+ AllocEngine::ClientContext4 ctx2(subnet2_, ClientIdPtr(), hwaddr2_,
IOAddress("0.0.0.0"), false, false,
"host.example.com.", true);
ctx2.query_.reset(new Pkt4(DHCPDISCOVER, 1234));
EXPECT_EQ("10.2.3.23", lease->addr_.toText());
}
+// This test verifies that the server can offer an address from a shared
+// subnet if there's at least 1 address left there, but will not offer
+// anything if both subnets are completely full.
+TEST_F(SharedNetworkAlloc4Test, runningOut) {
+
+ // Allocate everything in subnet1
+ insertLease("192.0.2.17", subnet1_->getID());
+
+ // Allocate everything, except one address in subnet2.
+ for (int i = 5; i < 100; i++) {
+ stringstream tmp;
+ tmp << "10.1.2." << i;
+ insertLease(tmp.str(), subnet2_->getID());
+ }
+
+ // Create context which will be used to try to allocate leases from the
+ // shared network. The context points to subnet1, which address space
+ // is exhausted. We expect the allocation engine to find another subnet
+ // within the same shared network and offer an address from there.
+ AllocEngine::ClientContext4
+ ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(),
+ false, false, "host.example.com.", true);
+ ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234));
+ Lease4Ptr lease = engine_.allocateLease4(ctx);
+ EXPECT_TRUE(lease);
+
+ // Now allocate the last address. Now both subnets are exhausted.
+ insertLease("10.1.2.100", subnet2_->getID());
+
+ // Ok, we're out. We should not get anything now.
+ lease = engine_.allocateLease4(ctx);
+ EXPECT_FALSE(lease);
+}
+
+// This test verifies that the server can offer an address from a
+// subnet and the introduction of shared network doesn't break anything here.
+TEST_F(SharedNetworkAlloc4Test, requestSharedNetworkSimple) {
+
+ // Create context which will be used to try to allocate leases from the
+ // shared network. The context points to subnet1, which address space
+ // is exhausted. We expect the allocation engine to find another subnet
+ // within the same shared network and offer an address from there.
+ AllocEngine::ClientContext4
+ ctx(subnet1_, ClientIdPtr(), hwaddr_, IOAddress::IPV4_ZERO_ADDRESS(),
+ false, false, "host.example.com.", false);
+ ctx.query_.reset(new Pkt4(DHCPDISCOVER, 1234));
+ Lease4Ptr lease = engine_.allocateLease4(ctx);
+
+ // The allocation engine should have assigned an address from the first
+ // subnet.
+ ASSERT_TRUE(lease);
+ EXPECT_EQ("192.0.2.17", lease->addr_.toText());
+
+ // Make sure the lease is in the the lease mgr.
+ ASSERT_TRUE(LeaseMgrFactory::instance().getLease4(lease->addr_));
+}
+
// This test verifies that the server can allocate an address from a
// different subnet than orginally selected, when the address pool in
// the first subnet is exhausted.
-TEST_F(SharedNetworkAlloc4Test, reuqestSharedNetwork) {
+TEST_F(SharedNetworkAlloc4Test, requestSharedNetwork) {
// Create a lease for a single address in the first address pool. The
// pool is now exhausted.
- std::vector<uint8_t> hwaddr_vec = { 0, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe};
- HWAddrPtr hwaddr(new HWAddr(hwaddr_vec, HTYPE_ETHER));
- Lease4Ptr lease(new Lease4(IOAddress("192.0.2.17"), hwaddr, ClientIdPtr(),
- 501, 502, 503, time(NULL), subnet1_->getID()));
- lease->cltt_ = time(NULL) - 10; // Allocated 10 seconds ago
- ASSERT_TRUE(LeaseMgrFactory::instance().addLease(lease));
+ Lease4Ptr lease = insertLease("192.0.2.17", subnet1_->getID());
// Create context which will be used to try to allocate leases from the
// shared network. The context points to subnet1, which address space
// to renew its lease regardless of a subnet it begins with. So, it has
// an address assigned from subnet1, but we use subnet2 as a selected
// subnet.
- AllocEngine::ClientContext4 ctx2(subnet2_, ClientIdPtr(), hwaddr,
+ AllocEngine::ClientContext4 ctx2(subnet2_, ClientIdPtr(), hwaddr2_,
IOAddress("0.0.0.0"), false, false,
"host.example.com.", false);
ctx2.query_.reset(new Pkt4(DHCPREQUEST, 1234));