diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc index 7ce4efc919..d5a2974dda 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc @@ -512,7 +512,13 @@ TestConfigBackendDHCPv4::getModifiedGlobalParameters4(const db::ServerSelector& ClientClassDefPtr TestConfigBackendDHCPv4::getClientClass4(const db::ServerSelector& server_selector, const std::string& name) const { - auto client_class = classes_.findClass(name); + ClientClassDefPtr client_class; + for (auto c : classes_) { + if (c->getName() == name) { + client_class = c; + break; + } + } if (!client_class || server_selector.amAny()) { return (client_class); } @@ -532,7 +538,7 @@ ClientClassDictionary TestConfigBackendDHCPv4::getAllClientClasses4(const db::ServerSelector& server_selector) const { auto tags = server_selector.getTags(); ClientClassDictionary all_classes; - for (auto client_class : *classes_.getClasses()) { + for (auto client_class : classes_) { auto non_const_client_class = boost::const_pointer_cast(client_class); if (server_selector.amAny()) { all_classes.addClass(non_const_client_class); @@ -567,7 +573,7 @@ TestConfigBackendDHCPv4::getModifiedClientClasses4(const db::ServerSelector& ser const boost::posix_time::ptime& modification_time) const { auto tags = server_selector.getTags(); ClientClassDictionary modified_classes; - for (auto client_class : *classes_.getClasses()) { + for (auto client_class : classes_) { if (client_class->getModificationTime() >= modification_time) { auto non_const_client_class = boost::const_pointer_cast(client_class); bool got = false; @@ -592,15 +598,47 @@ TestConfigBackendDHCPv4::getModifiedClientClasses4(const db::ServerSelector& ser void TestConfigBackendDHCPv4::createUpdateClientClass4(const db::ServerSelector& server_selector, const ClientClassDefPtr& client_class, - const std::string&) { + const std::string& follow_class_name) { + int follow_class_index = -1; + if (!follow_class_name.empty()) { + for (auto i = 0; i < classes_.size(); ++i) { + if (classes_[i]->getName() == follow_class_name) { + follow_class_index = i; + break; + } + } + if (follow_class_index < 0) { + isc_throw(BadValue, "class " << follow_class_name << " does not exist"); + + } + } + mergeServerTags(client_class, server_selector); - auto existing_class = classes_.findClass(client_class->getName()); - if (existing_class) { - classes_.removeClass(client_class->getName()); + int existing_class_index = -1; + for (auto i = 0; i < classes_.size(); ++i) { + if (classes_[i]->getName() == client_class->getName()) { + existing_class_index = i; + break; + } } + auto non_const_client_class = boost::const_pointer_cast(client_class); - classes_.addClass(non_const_client_class); + + if (follow_class_index < 0) { + if (existing_class_index >= 0) { + classes_[existing_class_index] = non_const_client_class; + } else { + classes_.push_back(non_const_client_class); + } + } else { + if (existing_class_index < 0) { + classes_.insert(classes_.begin() + follow_class_index + 1, client_class); + } else { + classes_.erase(classes_.begin() + existing_class_index); + classes_.insert(classes_.begin() + follow_class_index + 1, client_class); + } + } } AuditEntryCollection @@ -1322,7 +1360,14 @@ TestConfigBackendDHCPv4::deleteAllGlobalParameters4(const db::ServerSelector& se uint64_t TestConfigBackendDHCPv4::deleteClientClass4(const db::ServerSelector& server_selector, const std::string& name) { - auto existing_class = classes_.findClass(name); + ClientClassDefPtr existing_class; + auto c = classes_.begin(); + for (; c != classes_.end(); ++c) { + if ((*c)->getName() == name) { + existing_class = (*c); + break; + } + } if (!existing_class) { return (0); } @@ -1343,21 +1388,24 @@ TestConfigBackendDHCPv4::deleteClientClass4(const db::ServerSelector& server_sel return (0); } } - classes_.removeClass(name); + classes_.erase(c); return (1); } uint64_t TestConfigBackendDHCPv4::deleteAllClientClasses4(const db::ServerSelector& server_selector) { - std::list class_names; - for (auto client_class : (*classes_.getClasses())) { + uint64_t count = 0; + for (auto c = classes_.begin(); c != classes_.end(); ++c) { + auto client_class = *c; if (server_selector.amAny()) { - class_names.push_back(client_class->getName()); + c = classes_.erase(c); + ++count; continue; } if (server_selector.amUnassigned()) { if (client_class->getServerTags().empty()) { - class_names.push_back(client_class->getName()); + c = classes_.erase(c); + ++count; } continue; } @@ -1365,7 +1413,8 @@ TestConfigBackendDHCPv4::deleteAllClientClasses4(const db::ServerSelector& serve auto tags = server_selector.getTags(); for (auto tag : tags) { if (client_class->hasServerTag(ServerTag(tag))) { - class_names.push_back(client_class->getName()); + c = classes_.erase(c); + ++count; got = true; break; } @@ -1374,15 +1423,12 @@ TestConfigBackendDHCPv4::deleteAllClientClasses4(const db::ServerSelector& serve continue; } if (client_class->hasAllServerTag()) { - class_names.push_back(client_class->getName()); + c = classes_.erase(c); + ++count; } } - // Erase client classes. - for (auto name : class_names) { - classes_.removeClass(name); - } - return (class_names.size()); + return (count); } uint64_t diff --git a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h index 9798cadeb5..7791a0f241 100644 --- a/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h +++ b/src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h @@ -20,6 +20,7 @@ #include #include +#include namespace isc { namespace dhcp { @@ -534,7 +535,7 @@ public: OptionDefContainer option_defs_; OptionContainer options_; data::StampedValueCollection globals_; - ClientClassDictionary classes_; + std::vector classes_; db::ServerCollection servers_; /// @} };