]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[65-libyang-config-adaptor] Added empty require client class list removal
authorFrancis Dupont <fdupont@isc.org>
Sat, 20 Oct 2018 22:17:53 +0000 (00:17 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Mon, 22 Oct 2018 18:28:37 +0000 (20:28 +0200)
src/lib/yang/adaptor_config.cc
src/lib/yang/adaptor_config.h

index 142546424cd977cc0237ff32bf76986bbfcd8121..52979beb56d4ddf8eb0df625210920a832451eb7 100644 (file)
@@ -279,6 +279,49 @@ AdaptorConfig::optionSharedNetworks(ConstElementPtr networks,
     }
 }
 
+void
+AdaptorConfig::requireClassesPools(ConstElementPtr pools) {
+    if (pools && (pools->size() > 0)) {
+        for (size_t i = 0; i < pools->size(); ++i) {
+            ElementPtr pool = pools->getNonConst(i);
+            ConstElementPtr requires = pool->get("require-client-classes");
+            if (requires && (requires->size() == 0)) {
+                pool->remove("require-client-classes");
+            }
+        }
+    }
+}
+
+void
+AdaptorConfig::requireClassesSubnets(ConstElementPtr subnets) {
+    if (subnets && (subnets->size() > 0)) {
+        for (size_t i = 0; i < subnets->size(); ++i) {
+            ElementPtr subnet = subnets->getNonConst(i);
+            requireClassesPools(subnet->get("pools"));
+            requireClassesPools(subnet->get("pd-pools"));
+            ConstElementPtr requires = subnet->get("require-client-classes");
+            if (requires && (requires->size() == 0)) {
+                subnet->remove("require-client-classes");
+            }
+        }
+    }
+}
+
+void
+AdaptorConfig::requireClassesSharedNetworks(ConstElementPtr networks,
+                                            const string& subsel) {
+    if (networks && (networks->size() > 0)) {
+        for (size_t i = 0; i < networks->size(); ++i) {
+            ElementPtr network = networks->getNonConst(i);
+            requireClassesSubnets(network->get(subsel));
+            ConstElementPtr requires = network->get("require-client-classes");
+            if (requires && (requires->size() == 0)) {
+                network->remove("require-client-classes");
+            }
+        }
+    }
+}
+
 void
 AdaptorConfig::hostList(ConstElementPtr hosts) {
     if (hosts && (hosts->size() > 0)) {
@@ -426,6 +469,9 @@ AdaptorConfig::preProcess(ConstElementPtr dhcp, const string& subsel,
     relaySubnets(subnets);
     relaySharedNetworks(networks, subsel);
 
+    requireClassesSubnets(subnets);
+    requireClassesSharedNetworks(networks, subsel);
+
     updateDatabase(dhcp);
 }
 
index f06fbcbbe55343fb27eaf4a485a11e2501f87c63..dcc6e59c2e3d4c8316779293299d44121582820b 100644 (file)
@@ -163,6 +163,23 @@ protected:
                                      const std::string& space,
                                      const OptionCodes& codes);
 
+    /// @brief Process require client classes in a pool list.
+    ///
+    /// @param pools The pool list.
+    static void requireClassesPools(isc::data::ConstElementPtr pools);
+
+    /// @brief Process require client classes in a subnet list.
+    ///
+    /// @param subnets The subnet list.
+    static void requireClassesSubnets(isc::data::ConstElementPtr subnets);
+
+    /// @brief Process require client classes in a shared network list.
+    ///
+    /// @param networks The shared network list.
+    /// @param subsel The subnet list name.
+    static void requireClassesSharedNetworks(isc::data::ConstElementPtr networks,
+                                             const std::string& subsel);
+
     /// @brief Process host reservation list.
     ///
     /// @param hosts The host reservation list.