]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1928] Test DHCPv4 CB supports follow_class_name
authorMarcin Siodelski <marcin@isc.org>
Mon, 12 Jul 2021 18:34:30 +0000 (20:34 +0200)
committerMarcin Siodelski <marcin@isc.org>
Wed, 21 Jul 2021 10:49:50 +0000 (10:49 +0000)
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.cc
src/lib/dhcpsrv/testutils/test_config_backend_dhcp4.h

index 7ce4efc919aab19e3c7beb779fa66a6d9c52533e..d5a2974ddae238d63c8e9f1ff3d28cbb3cddb8d2 100644 (file)
@@ -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<ClientClassDef>(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<ClientClassDef>(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<ClientClassDef>(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<std::string> 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
index 9798cadeb5f43ad1d255be036371312fd1f6e84a..7791a0f24161c7056010794a3a52f52ca98674bc 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <map>
 #include <string>
+#include <vector>
 
 namespace isc {
 namespace dhcp {
@@ -534,7 +535,7 @@ public:
     OptionDefContainer option_defs_;
     OptionContainer options_;
     data::StampedValueCollection globals_;
-    ClientClassDictionary classes_;
+    std::vector<ClientClassDefPtr> classes_;
     db::ServerCollection servers_;
 /// @}
 };