From: Thomas Markwalder Date: Wed, 3 Sep 2025 19:38:46 +0000 (-0400) Subject: [#3961] Add force parameter to option def delete X-Git-Tag: Kea-3.1.2~64 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=79fecf513b4cfe222c56d123e44bdfed7a46f25d;p=thirdparty%2Fkea.git [#3961] Add force parameter to option def delete Initial implementation and updated existing UTs. Need to add specific UTs and update ARM. /src/hooks/dhcp/mysql/mysql_cb_dhcp4.* /src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.* /src/lib/dhcpsrv/config_backend_dhcp4.h /src/lib/dhcpsrv/config_backend_pool_dhcp4.* Add force parameter to deleteOption4Def /src/hooks/dhcp/mysql/mysql_cb_dhcp6.* /src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.* /src/lib/dhcpsrv/config_backend_dhcp6.h /src/lib/dhcpsrv/config_backend_pool_dhcp6.* Add force parameter to deleteOption6Def /src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc /src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.* /src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.* Updated tests --- diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc index 4701444544..d9f5d2c56c 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.cc @@ -2194,10 +2194,23 @@ public: /// @param server_selector Server selector. /// @param code Option code. /// @param name Option name. + /// @param force When true, delete is done without checking for + /// dependent options. /// @return Number of deleted option definitions. + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. uint64_t deleteOptionDef4(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force) { + if (!force) { + auto option = getOption(GET_OPTION4_CODE_SPACE, Option::V4, + server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option defintion"); + } + } + MySqlBindingCollection in_bindings = { MySqlBinding::createInteger(code), MySqlBinding::createString(space) @@ -4231,10 +4244,11 @@ MySqlConfigBackendDHCPv4::deleteAllSharedNetworks4(const ServerSelector& server_ uint64_t MySqlConfigBackendDHCPv4::deleteOptionDef4(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_OPTION_DEF4) .arg(code).arg(space); - uint64_t result = impl_->deleteOptionDef4(server_selector, code, space); + uint64_t result = impl_->deleteOptionDef4(server_selector, code, space, force); LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_OPTION_DEF4_RESULT) .arg(result); return (result); diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.h b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.h index 7fa7858f35..abbf8ea8a5 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp4.h +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp4.h @@ -450,11 +450,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. /// @throw NotImplemented if server selector is "unassigned". + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. virtual uint64_t deleteOptionDef4(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc index 6efda22e90..92f1e5b20f 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.cc @@ -2575,10 +2575,24 @@ public: /// @param server_selector Server selector. /// @param code Option code. /// @param name Option name. + /// @param force When true, delete is done without checking for + /// dependent options. /// @return Number of deleted option definitions. + /// @throw NotImplemented if server selector is "unassigned". + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. uint64_t deleteOptionDef6(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force) { + if (!force) { + auto option = getOption(GET_OPTION6_CODE_SPACE, Option::V6, + server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option defintion"); + } + } + MySqlBindingCollection in_bindings = { MySqlBinding::createInteger(code), MySqlBinding::createString(space) @@ -4668,10 +4682,11 @@ MySqlConfigBackendDHCPv6::deleteAllSharedNetworks6(const ServerSelector& server_ uint64_t MySqlConfigBackendDHCPv6::deleteOptionDef6(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false*/) { LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_OPTION_DEF6) .arg(code).arg(space); - uint64_t result = impl_->deleteOptionDef6(server_selector, code, space); + uint64_t result = impl_->deleteOptionDef6(server_selector, code, space, force); LOG_DEBUG(mysql_cb_logger, DBGLVL_TRACE_BASIC, MYSQL_CB_DELETE_OPTION_DEF6_RESULT) .arg(result); return (result); diff --git a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.h b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.h index 5495b6dfb3..dd1297bbe1 100644 --- a/src/hooks/dhcp/mysql/mysql_cb_dhcp6.h +++ b/src/hooks/dhcp/mysql/mysql_cb_dhcp6.h @@ -465,11 +465,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. /// @throw NotImplemented if server selector is "unassigned". + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. virtual uint64_t deleteOptionDef6(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc index 17d77f34e9..c1ee9aefb9 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.cc @@ -2056,10 +2056,23 @@ public: /// @param server_selector Server selector. /// @param code Option code. /// @param name Option name. + /// @param force When true, delete is done without checking for + /// dependent options. /// @return Number of deleted option definitions. + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. uint64_t deleteOptionDef4(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force) { + if (!force) { + auto option = getOption(GET_OPTION4_CODE_SPACE, Option::V4, + server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option defintion"); + } + } + PsqlBindArray in_bindings; in_bindings.add(code); in_bindings.add(space); @@ -5178,10 +5191,11 @@ PgSqlConfigBackendDHCPv4::deleteAllSharedNetworks4(const ServerSelector& server_ uint64_t PgSqlConfigBackendDHCPv4::deleteOptionDef4(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { LOG_DEBUG(pgsql_cb_logger, DBGLVL_TRACE_BASIC, PGSQL_CB_DELETE_OPTION_DEF4) .arg(code).arg(space); - uint64_t result = impl_->deleteOptionDef4(server_selector, code, space); + uint64_t result = impl_->deleteOptionDef4(server_selector, code, space, force); LOG_DEBUG(pgsql_cb_logger, DBGLVL_TRACE_BASIC, PGSQL_CB_DELETE_OPTION_DEF4_RESULT) .arg(result); return (result); diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.h b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.h index 517fcc65b8..61cd332b75 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.h +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp4.h @@ -450,11 +450,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. /// @throw NotImplemented if server selector is "unassigned". + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. virtual uint64_t deleteOptionDef4(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc index c644dabad8..a42ff32dd3 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.cc @@ -2360,10 +2360,23 @@ public: /// @param server_selector Server selector. /// @param code Option code. /// @param name Option name. + /// @param force When true, delete is done without checking for + /// dependent options. /// @return Number of deleted option definitions. + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. uint64_t deleteOptionDef6(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force) { + if (!force) { + auto option = getOption(GET_OPTION6_CODE_SPACE, Option::V6, + server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option defintion"); + } + } + PsqlBindArray in_bindings; in_bindings.add(code); in_bindings.add(space); @@ -5657,10 +5670,11 @@ PgSqlConfigBackendDHCPv6::deleteAllSharedNetworks6(const ServerSelector& server_ uint64_t PgSqlConfigBackendDHCPv6::deleteOptionDef6(const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { LOG_DEBUG(pgsql_cb_logger, DBGLVL_TRACE_BASIC, PGSQL_CB_DELETE_OPTION_DEF6) .arg(code).arg(space); - uint64_t result = impl_->deleteOptionDef6(server_selector, code, space); + uint64_t result = impl_->deleteOptionDef6(server_selector, code, space, force); LOG_DEBUG(pgsql_cb_logger, DBGLVL_TRACE_BASIC, PGSQL_CB_DELETE_OPTION_DEF6_RESULT) .arg(result); return (result); diff --git a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.h b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.h index 51a8c59322..29d3dde9c4 100644 --- a/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.h +++ b/src/hooks/dhcp/pgsql/pgsql_cb_dhcp6.h @@ -465,11 +465,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. /// @throw NotImplemented if server selector is "unassigned". + /// @throw InvalidOperation if force is false and there is an option + /// matching server, code, and space. virtual uint64_t deleteOptionDef6(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/config_backend_dhcp4.h b/src/lib/dhcpsrv/config_backend_dhcp4.h index fe2520bf87..19f9b578bf 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_dhcp4.h @@ -550,10 +550,14 @@ public: /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. /// @return Number of deleted option definitions. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. + /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef4(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space) = 0; + const std::string& space, + bool force = false) = 0; /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/config_backend_dhcp6.h b/src/lib/dhcpsrv/config_backend_dhcp6.h index 9b0450c4e1..9f9ab2f5db 100644 --- a/src/lib/dhcpsrv/config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_dhcp6.h @@ -567,11 +567,14 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef6(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space) = 0; + const std::string& space, + bool force = false) = 0; /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc index a6c2cf397c..e44c928f4a 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.cc @@ -415,10 +415,11 @@ uint64_t ConfigBackendPoolDHCPv4::deleteOptionDef4(const BackendSelector& backend_selector, const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { return (createUpdateDeleteProperty (&ConfigBackendDHCPv4::deleteOptionDef4, backend_selector, - server_selector, code, space)); + server_selector, code, space, force)); } uint64_t diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h index 0523c3d092..03c124aec1 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp4.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp4.h @@ -479,12 +479,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef4(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, + bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc index f8bebd3018..f8f39009d6 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.cc @@ -427,10 +427,11 @@ uint64_t ConfigBackendPoolDHCPv6::deleteOptionDef6(const BackendSelector& backend_selector, const ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { return (createUpdateDeleteProperty (&ConfigBackendDHCPv6::deleteOptionDef6, backend_selector, - server_selector, code, space)); + server_selector, code, space, force)); } uint64_t diff --git a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h index 96ee9d06d2..0aee097be6 100644 --- a/src/lib/dhcpsrv/config_backend_pool_dhcp6.h +++ b/src/lib/dhcpsrv/config_backend_pool_dhcp6.h @@ -494,12 +494,15 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef6(const db::BackendSelector& backend_selector, const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, + bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc b/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc index 3cdf633577..7448adddae 100644 --- a/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc +++ b/src/lib/dhcpsrv/tests/cb_ctl_dhcp_unittest.cc @@ -474,11 +474,10 @@ public: auto option = mgr.getPool()->getOption4(BackendSelector::UNSPEC(), ServerSelector::ALL(), code, space); - if (option) { - mgr.getPool()->deleteOptionDef4(BackendSelector::UNSPEC(), ServerSelector::ALL(), - code, space); - addDeleteAuditEntry("dhcp4_option_def", option->getId()); + mgr.getPool()->deleteOption4(BackendSelector::UNSPEC(), ServerSelector::ALL(), + code, space); + addDeleteAuditEntry("dhcp4_option", option->getId()); } } @@ -718,19 +717,6 @@ public: } } - { - SCOPED_TRACE("option definitions"); - // One of the option definitions should still be there. - EXPECT_TRUE(srv_cfg->getCfgOptionDef()->get("isc", "two")); - auto found_def = srv_cfg->getCfgOptionDef()->get("isc", "one"); - if (deleteConfigElement("dhcp4_option_def", 1)) { - EXPECT_FALSE(found_def); - - } else { - EXPECT_TRUE(found_def); - } - } - { SCOPED_TRACE("global options"); // One of the options should still be there. @@ -746,6 +732,19 @@ public: } } + { + SCOPED_TRACE("option definitions"); + // One of the option definitions should still be there. + EXPECT_TRUE(srv_cfg->getCfgOptionDef()->get("isc", "two")); + auto found_def = srv_cfg->getCfgOptionDef()->get("isc", "one"); + if (deleteConfigElement("dhcp4_option_def", 1)) { + EXPECT_FALSE(found_def); + + } else { + EXPECT_TRUE(found_def); + } + } + { SCOPED_TRACE("shared networks"); // One of the shared networks should still be there. @@ -825,8 +824,8 @@ TEST_F(CBControlDHCPv4Test, databaseConfigApplyAll) { TEST_F(CBControlDHCPv4Test, databaseConfigApplyDeleteAll) { testDatabaseConfigApplyDelete(getTimestamp(-5), [this]() { remoteDeleteGlobalParameter("comment", 1); - remoteDeleteOptionDef(101, "isc"); remoteDeleteOption(DHO_HOST_NAME, DHCP4_OPTION_SPACE); + remoteDeleteOptionDef(101, "isc"); remoteDeleteSharedNetwork("one"); remoteDeleteSubnet(SubnetID(1)); remoteDeleteClientClass("first-class"); @@ -1395,9 +1394,9 @@ public: code, space); if (option) { - mgr.getPool()->deleteOptionDef6(BackendSelector::UNSPEC(), ServerSelector::ALL(), - code, space); - addDeleteAuditEntry("dhcp6_option_def", option->getId()); + mgr.getPool()->deleteOption6(BackendSelector::UNSPEC(), ServerSelector::ALL(), + code, space); + addDeleteAuditEntry("dhcp6_option", option->getId()); } } @@ -1630,19 +1629,6 @@ public: } } - { - SCOPED_TRACE("option definitions"); - // One of the option definitions should still be there. - EXPECT_TRUE(srv_cfg->getCfgOptionDef()->get("isc", "two")); - auto found_def = srv_cfg->getCfgOptionDef()->get("isc", "one"); - if (deleteConfigElement("dhcp6_option_def", 1)) { - EXPECT_FALSE(found_def); - - } else { - EXPECT_TRUE(found_def); - } - } - { SCOPED_TRACE("global options"); // One of the options should still be there. @@ -1658,6 +1644,19 @@ public: } } + { + SCOPED_TRACE("option definitions"); + // One of the option definitions should still be there. + EXPECT_TRUE(srv_cfg->getCfgOptionDef()->get("isc", "two")); + auto found_def = srv_cfg->getCfgOptionDef()->get("isc", "one"); + if (deleteConfigElement("dhcp6_option_def", 1)) { + EXPECT_FALSE(found_def); + + } else { + EXPECT_TRUE(found_def); + } + } + { SCOPED_TRACE("shared networks"); // One of the shared networks should still be there. diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc index b3a87228e6..de9aee74fe 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc @@ -1150,7 +1150,16 @@ TestConfigBackendDHCPv4::deleteAllSharedNetworks4(const db::ServerSelector& serv uint64_t TestConfigBackendDHCPv4::deleteOptionDef4(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { + if (!force) { + auto option = getOption4(server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option definition " + << space << "." << code); + } + } + auto tag = getServerTag(server_selector); uint64_t erased = 0; for (auto option_def_it = option_defs_.begin(); option_def_it != option_defs_.end(); ) { diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h index b75d151c85..76b508d295 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h @@ -423,10 +423,12 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef4(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. /// diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc index 15d8edbd1d..314a9078bd 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.cc @@ -1205,7 +1205,15 @@ TestConfigBackendDHCPv6::deleteAllSharedNetworks6(const db::ServerSelector& serv uint64_t TestConfigBackendDHCPv6::deleteOptionDef6(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space) { + const std::string& space, + bool force /* = false */) { + if (!force) { + auto option = getOption6(server_selector, code, space); + if (option) { + isc_throw(InvalidOperation, "option exists for option definition"); + } + } + auto const& tag = getServerTag(server_selector); uint64_t erased = 0; for (auto option_def_it = option_defs_.begin(); option_def_it != option_defs_.end(); ) { diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h index f2ccbc32f4..21f8274881 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp6.h @@ -436,10 +436,12 @@ public: /// @param server_selector Server selector. /// @param code Code of the option to be deleted. /// @param space Option space of the option to be deleted. + /// @param force When true, delete is done without checking for + /// dependent options. Defaults to false. /// @return Number of deleted option definitions. virtual uint64_t deleteOptionDef6(const db::ServerSelector& server_selector, const uint16_t code, - const std::string& space); + const std::string& space, bool force = false); /// @brief Deletes all option definitions. ///