From: Tomek Mrugalski Date: Tue, 10 Apr 2018 21:50:05 +0000 (+0200) Subject: [5543] leaseX-wipe now allows deleting leases from all subnets. X-Git-Tag: trac5458a_base~3^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cb0fd5fa75f752359e638228dc56fd7a173885da;p=thirdparty%2Fkea.git [5543] leaseX-wipe now allows deleting leases from all subnets. --- diff --git a/src/hooks/dhcp/lease_cmds/lease_cmds.cc b/src/hooks/dhcp/lease_cmds/lease_cmds.cc index c088fce659..6e4ae14f07 100644 --- a/src/hooks/dhcp/lease_cmds/lease_cmds.cc +++ b/src/hooks/dhcp/lease_cmds/lease_cmds.cc @@ -767,10 +767,28 @@ LeaseCmdsImpl::lease4WipeHandler(CalloutHandle& handle) { SimpleParser parser; SubnetID id = parser.getUint32(cmd_args_, "subnet-id"); - size_t num = LeaseMgrFactory::instance().wipeLeases4(id); + size_t num = 0; // number of leases deleted + stringstream ids; // a text with subnet-ids being wiped + + if (id) { + // Wipe a single subnet + num = LeaseMgrFactory::instance().wipeLeases4(id); + ids << id; + } else { + // Wipe them all! + ConstSrvConfigPtr config = CfgMgr::instance().getCurrentCfg(); + ConstCfgSubnets4Ptr subnets = config->getCfgSubnets4(); + const Subnet4Collection * subs = subnets->getAll(); + + // Go over all subnets and wipe leases in each of them. + for (auto sub : *subs) { + num += LeaseMgrFactory::instance().wipeLeases4(sub->getID()); + ids << sub->getID() << " "; + } + } stringstream tmp; - tmp << "Deleted " << num << " IPv4 lease(s)."; + tmp << "Deleted " << num << " IPv4 lease(s) from subnet(s) " << ids.str(); ConstElementPtr response = createAnswer(num ? CONTROL_RESULT_SUCCESS : CONTROL_RESULT_EMPTY, tmp.str()); setResponse(handle, response); @@ -795,10 +813,28 @@ LeaseCmdsImpl::lease6WipeHandler(CalloutHandle& handle) { SimpleParser parser; SubnetID id = parser.getUint32(cmd_args_, "subnet-id"); - size_t num = LeaseMgrFactory::instance().wipeLeases6(id); + size_t num = 0; // number of leases deleted + stringstream ids; // a text with subnet-ids being wiped + + if (id) { + // Wipe a single subnet. + num = LeaseMgrFactory::instance().wipeLeases6(id); + ids << id; + } else { + // Wipe them all! + ConstSrvConfigPtr config = CfgMgr::instance().getCurrentCfg(); + ConstCfgSubnets6Ptr subnets = config->getCfgSubnets6(); + const Subnet6Collection * subs = subnets->getAll(); + + // Go over all subnets and wipe leases in each of them. + for (auto sub : *subs) { + num += LeaseMgrFactory::instance().wipeLeases6(sub->getID()); + ids << sub->getID() << " "; + } + } stringstream tmp; - tmp << "Deleted " << num << " IPv6 lease(s)."; + tmp << "Deleted " << num << " IPv6 lease(s) from subnet(s) " << ids.str(); ConstElementPtr response = createAnswer(num ? CONTROL_RESULT_SUCCESS : CONTROL_RESULT_EMPTY, tmp.str()); setResponse(handle, response); diff --git a/src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.cc b/src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.cc index 3b86105fff..b408bb28de 100644 --- a/src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.cc +++ b/src/hooks/dhcp/lease_cmds/tests/lease_cmds_unittest.cc @@ -2679,11 +2679,43 @@ TEST_F(LeaseCmdsTest, Lease4Wipe) { " \"subnet-id\": 44" " }\n" "}"; - string exp_rsp = "Deleted 2 IPv4 lease(s)."; + string exp_rsp = "Deleted 2 IPv4 lease(s) from subnet(s) 44"; testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp); - // Make sure the lease is really gone. + // Make sure the leases in subnet 44 are really gone. EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1"))); + EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.2"))); + + // Make sure the leases from subnet 88 are still there. + EXPECT_TRUE(lmptr_->getLease4(IOAddress("192.0.3.1"))); + EXPECT_TRUE(lmptr_->getLease4(IOAddress("192.0.3.2"))); +} + +// Checks that lease4-wipe can remove leases from all subnets +// at once. +TEST_F(LeaseCmdsTest, Lease4WipeAll) { + + // Initialize lease manager (false = v4, true = add a lease) + initLeaseMgr(false, true); + + // Query for valid, existing lease. + string cmd = + "{\n" + " \"command\": \"lease4-wipe\",\n" + " \"arguments\": {" + " \"subnet-id\": 0" + " }\n" + "}"; + string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88 "; + testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp); + + // Make sure the leases in subnet 44 are really gone. + EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.1"))); + EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.2.2"))); + + // Make sure the leases from subnet 88 are gone, too. + EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.3.1"))); + EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.3.2"))); } // Checks that lease4-wipe properly reports when no leases were deleted. @@ -2700,7 +2732,25 @@ TEST_F(LeaseCmdsTest, Lease4WipeNoLeases) { " \"subnet-id\": 44" " }\n" "}"; - string exp_rsp = "Deleted 0 IPv4 lease(s)."; + string exp_rsp = "Deleted 0 IPv4 lease(s) from subnet(s) 44"; + testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp); +} + +// Checks that lease4-wipe properly reports when no leases were deleted. +TEST_F(LeaseCmdsTest, Lease4WipeNoLeasesAll) { + + // Initialize lease manager (false = v4, false = no leases) + initLeaseMgr(false, false); + + // Query for valid, existing lease. + string cmd = + "{\n" + " \"command\": \"lease4-wipe\",\n" + " \"arguments\": {" + " \"subnet-id\": 0" + " }\n" + "}"; + string exp_rsp = "Deleted 0 IPv4 lease(s) from subnet(s) 44 88 "; testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp); } @@ -2734,13 +2784,45 @@ TEST_F(LeaseCmdsTest, Lease6Wipe) { " \"subnet-id\": 66\n" " }\n" "}"; - string exp_rsp = "Deleted 2 IPv6 lease(s)."; + string exp_rsp = "Deleted 2 IPv6 lease(s) from subnet(s) 66"; // The status expected is success. The lease should be deleted. testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp); - // Make sure the lease is really gone. + // Make sure the leases in subnet 44 are really gone. EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"))); + EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2"))); + + // The leases in subnet 88 are supposed to be still there. + EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::1"))); + EXPECT_TRUE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::2"))); +} + +// Checks that lease4-wipe can remove leases from all subnets +TEST_F(LeaseCmdsTest, Lease6WipeAll) { + + initLeaseMgr(true, true); // (true = v6, true = create a lease) + + // Now send the command. + string cmd = + "{\n" + " \"command\": \"lease6-wipe\",\n" + " \"arguments\": {" + " \"subnet-id\": 0\n" + " }\n" + "}"; + string exp_rsp = "Deleted 4 IPv6 lease(s) from subnet(s) 66 99 "; + + // The status expected is success. The lease should be deleted. + testCommand(cmd, CONTROL_RESULT_SUCCESS, exp_rsp); + + // Make sure the leases in subnet 44 are really gone. + EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1"))); + EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::2"))); + + // The leases in subnet 88 are supposed to be still there. + EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::1"))); + EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:2::2"))); } // Checks that lease4-wipe properly reports when no leases were deleted. @@ -2757,7 +2839,25 @@ TEST_F(LeaseCmdsTest, Lease6WipeNoLeases) { " \"subnet-id\": 66" " }\n" "}"; - string exp_rsp = "Deleted 0 IPv6 lease(s)."; + string exp_rsp = "Deleted 0 IPv6 lease(s) from subnet(s) 66"; + testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp); +} + +// Checks that lease4-wipe properly reports when no leases were deleted. +TEST_F(LeaseCmdsTest, Lease6WipeNoLeasesAll) { + + // Initialize lease manager (false = v4, false = no leases) + initLeaseMgr(true, false); + + // Query for valid, existing lease. + string cmd = + "{\n" + " \"command\": \"lease6-wipe\",\n" + " \"arguments\": {" + " \"subnet-id\": 0" + " }\n" + "}"; + string exp_rsp = "Deleted 0 IPv6 lease(s) from subnet(s) 66 99 "; testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp); }