Commit ecaf777d authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[master] Merge branch 'trac5543' (leaseX-wipe for all subnets)

parents 8717ef28 b89dc0e1
......@@ -5,6 +5,7 @@
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<!-- Converted by db4-upgrade version 1.1 -->
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="hooks-libraries">
......@@ -1422,11 +1423,11 @@ An example deletion by (subnet-id, identifier-type, identifier) looks as follows
</listitem>
<listitem>
<para><command>lease4-wipe</command> - removes all leases from a
specific IPv4 subnet;</para>
specific IPv4 subnet or all subnets;</para>
</listitem>
<listitem>
<para><command>lease6-wipe</command> - removes all leases from a
specific IPv6 subnet;</para>
specific IPv6 subnet or all subnets;</para>
</listitem>
</itemizedlist>
......@@ -1792,8 +1793,8 @@ An example result returned when the host was found:
</para>
<warning>
<para>The <command>lease4-get-command</command> and
<command>lease6-get-command</command> may result in very
<para>The <command>lease4-get</command> and
<command>lease6-get</command> commands may result in very
large responses. This may have negative impact on the DHCP server
responsiveness while the response is generated and transmitted
over the control channel, as the server imposes no restriction
......@@ -1935,6 +1936,9 @@ An example IPv4 lease deletion by "hw-address" looks as follows:
parameters are incorrect or some other exception is
encountered.</para>
<para>The subnet-id 0 has special meaning. It tells Kea to
delete leases from all configured subnets.</para>
<para>Note: not all backends support this command.</para>
</section>
</section>
......
......@@ -759,18 +759,36 @@ LeaseCmdsImpl::lease4WipeHandler(CalloutHandle& handle) {
try {
extractCommand(handle);
// The subnet-id is a mandatory parameter.
if (!cmd_args_) {
isc_throw(isc::BadValue, "no parameters specified for lease4-wipe command");
}
SimpleParser parser;
SubnetID id = parser.getUint32(cmd_args_, "subnet-id");
SubnetID id = 0;
size_t num = LeaseMgrFactory::instance().wipeLeases4(id);
size_t num = 0; // number of leases deleted
stringstream ids; // a text with subnet-ids being wiped
// The subnet-id parameter is now optional.
if (cmd_args_ && cmd_args_->contains("subnet-id")) {
id = parser.getUint32(cmd_args_, "subnet-id");
}
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);
......@@ -787,18 +805,42 @@ LeaseCmdsImpl::lease6WipeHandler(CalloutHandle& handle) {
try {
extractCommand(handle);
// The subnet-id is a mandatory parameter.
if (!cmd_args_) {
isc_throw(isc::BadValue, "no parameters specified for lease6-wipe command");
}
SimpleParser parser;
SubnetID id = parser.getUint32(cmd_args_, "subnet-id");
SubnetID id = 0;
size_t num = 0; // number of leases deleted
stringstream ids; // a text with subnet-ids being wiped
/// @todo: consider extending the code with wipe-leases:
/// - of specific type (v6)
/// - from specific shared network
/// - from specific pool
/// see https://kea.isc.org/ticket/5543#comment:6 for background.
size_t num = LeaseMgrFactory::instance().wipeLeases6(id);
// The subnet-id parameter is now optional.
if (cmd_args_ && cmd_args_->contains("subnet-id")) {
id = parser.getUint32(cmd_args_, "subnet-id");
}
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);
......
......@@ -2648,8 +2648,8 @@ TEST_F(LeaseCmdsTest, Lease6DelByDUID) {
EXPECT_FALSE(lmptr_->getLease6(Lease::TYPE_NA, IOAddress("2001:db8:1::1")));
}
// Checks that lease4-wipe detects missing parmameter properly.
TEST_F(LeaseCmdsTest, Lease4WipeMissingParam) {
// Checks that lease4-wipe can remove leases.
TEST_F(LeaseCmdsTest, Lease4Wipe) {
// Initialize lease manager (false = v4, true = add a lease)
initLeaseMgr(false, true);
......@@ -2659,14 +2659,24 @@ TEST_F(LeaseCmdsTest, Lease4WipeMissingParam) {
"{\n"
" \"command\": \"lease4-wipe\",\n"
" \"arguments\": {"
" \"subnet-id\": 44"
" }\n"
"}";
string exp_rsp = "missing parameter 'subnet-id' (<string>:3:19)";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
string exp_rsp = "Deleted 2 IPv4 lease(s) from subnet(s) 44";
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 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.
TEST_F(LeaseCmdsTest, Lease4Wipe) {
// 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);
......@@ -2676,14 +2686,43 @@ TEST_F(LeaseCmdsTest, Lease4Wipe) {
"{\n"
" \"command\": \"lease4-wipe\",\n"
" \"arguments\": {"
" \"subnet-id\": 44"
" \"subnet-id\": 0"
" }\n"
"}";
string exp_rsp = "Deleted 2 IPv4 lease(s).";
string exp_rsp = "Deleted 4 IPv4 lease(s) from subnet(s) 44 88";
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 gone, too.
EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.3.1")));
EXPECT_FALSE(lmptr_->getLease4(IOAddress("192.0.3.2")));
}
// Checks that lease4-wipe can remove leases from all subnets
// at once (when no parameters are specifed).
TEST_F(LeaseCmdsTest, Lease4WipeAllNoArgs) {
// Initialize lease manager (false = v4, true = add a lease)
initLeaseMgr(false, true);
// Query for valid, existing lease.
string cmd =
"{\n"
" \"command\": \"lease4-wipe\"\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,25 +2739,26 @@ 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 detects missing parmameter properly.
TEST_F(LeaseCmdsTest, Lease6WipeMissingParam) {
// Checks that lease4-wipe properly reports when no leases were deleted.
TEST_F(LeaseCmdsTest, Lease4WipeNoLeasesAll) {
// Initialize lease manager (true = v6, true = add a lease)
initLeaseMgr(true, true);
// Initialize lease manager (false = v4, false = no leases)
initLeaseMgr(false, false);
// Query for valid, existing lease.
string cmd =
"{\n"
" \"command\": \"lease6-wipe\",\n"
" \"command\": \"lease4-wipe\",\n"
" \"arguments\": {"
" \"subnet-id\": 0"
" }\n"
"}";
string exp_rsp = "missing parameter 'subnet-id' (<string>:3:19)";
testCommand(cmd, CONTROL_RESULT_ERROR, exp_rsp);
string exp_rsp = "Deleted 0 IPv4 lease(s) from subnet(s) 44 88";
testCommand(cmd, CONTROL_RESULT_EMPTY, exp_rsp);
}
// Checks that lease4-wipe can remove leases.
......@@ -2734,13 +2774,70 @@ 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 can remove leases from all subnets
// (no arguments)
TEST_F(LeaseCmdsTest, Lease6WipeAllNoArgs) {
initLeaseMgr(true, true); // (true = v6, true = create a lease)
// Now send the command.
string cmd =
"{\n"
" \"command\": \"lease6-wipe\"\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 +2854,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);
}
......
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