]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[616-error-msgs-contain-references-to-config-file-while-config-backend-is-used] Split...
authorFrancis Dupont <fdupont@isc.org>
Thu, 13 Jun 2019 00:45:04 +0000 (02:45 +0200)
committerFrancis Dupont <fdupont@isc.org>
Thu, 27 Jun 2019 17:32:49 +0000 (19:32 +0200)
src/bin/dhcp4/json_config_parser.cc
src/bin/dhcp4/tests/config_parser_unittest.cc
src/bin/dhcp6/json_config_parser.cc

index 9f4089994563d9e11d0482491889b0d64e7812af..52ffe4d83d4ec8e1789ea4c5c1e72190b8ee69c0 100644 (file)
@@ -650,10 +650,6 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
             const HooksConfig& libraries =
                 CfgMgr::instance().getStagingCfg()->getHooksConfig();
             libraries.loadLibraries();
-
-            // If there are config backends, fetch and merge into staging config
-            server.getCBControl()->databaseConfigFetch(srv_cfg,
-                                                       CBControlDHCPv4::FetchMode::FETCH_ALL);
         }
         catch (const isc::Exception& ex) {
             LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_FAIL).arg(ex.what());
@@ -668,6 +664,29 @@ configureDhcp4Server(Dhcpv4Srv& server, isc::data::ConstElementPtr config_set,
         }
     }
 
+    // Moved from the commit block to add the config backend indication.
+    if (!rollback) {
+        try {
+            // If there are config backends, fetch and merge into staging config
+            server.getCBControl()->databaseConfigFetch(srv_cfg,
+                                                       CBControlDHCPv4::FetchMode::FETCH_ALL);
+        }
+        catch (const isc::Exception& ex) {
+            std::ostringstream err;
+            err << "during update from config backend database: " << ex.what();
+            LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_FAIL).arg((err.str()));
+            answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, err.str());
+            rollback = true;
+        } catch (...) {
+            // For things like bad_cast in boost::lexical_cast
+            std::ostringstream err;
+            err << "during update from config backend database: "
+                << "undefined configuration parsing error";
+            LOG_ERROR(dhcp4_logger, DHCP4_PARSER_COMMIT_FAIL);
+            answer = isc::config::createAnswer(CONTROL_RESULT_ERROR, err.str());
+            rollback = true;
+        }
+    }
 
     // Rollback changes as the configuration parsing failed.
     if (rollback) {
index d03355c450d8f63ac8b5b276059ed803fffbd45e..ea7c77783d99580e1b124b6e77094ecb96f58460 100644 (file)
@@ -6689,7 +6689,9 @@ TEST_F(Dhcp4ParserTest, configControlInfoNoFactory) {
 
     // Should fail because "type=mysql" has no factories.
     configure(config, CONTROL_RESULT_ERROR,
-              "The type of the configuration backend: 'mysql' is not supported");
+              "during update from config backend database: "
+              "The type of the configuration backend: "
+              "'mysql' is not supported");
 }
 
 // This test verifies that configuration control info gets populated.
index 6434f45ebc240011349883084b8c48211d11348c..93659a2861de5f8bc1f13be3a26a32c773ab0717 100644 (file)
@@ -773,10 +773,6 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
             const HooksConfig& libraries =
                 CfgMgr::instance().getStagingCfg()->getHooksConfig();
             libraries.loadLibraries();
-
-            // If there are config backends, fetch and merge into staging config
-            server.getCBControl()->databaseConfigFetch(srv_config,
-                                                       CBControlDHCPv6::FetchMode::FETCH_ALL);
         }
         catch (const isc::Exception& ex) {
             LOG_ERROR(dhcp6_logger, DHCP6_PARSER_COMMIT_FAIL).arg(ex.what());
@@ -793,6 +789,33 @@ configureDhcp6Server(Dhcpv6Srv& server, isc::data::ConstElementPtr config_set,
         }
     }
 
+    // Moved from the commit block to add the config backend indication.
+    if (!rollback) {
+        try {
+
+            // If there are config backends, fetch and merge into staging config
+            server.getCBControl()->databaseConfigFetch(srv_config,
+                                                       CBControlDHCPv6::FetchMode::FETCH_ALL);
+        }
+        catch (const isc::Exception& ex) {
+            std::ostringstream err;
+            err << "during update from config backend database: " << ex.what();
+            LOG_ERROR(dhcp6_logger, DHCP6_PARSER_COMMIT_FAIL).arg(err.str());
+            answer = isc::config::createAnswer(2, err.str());
+            // An error occurred, so make sure to restore the original data.
+            rollback = true;
+        } catch (...) {
+            // for things like bad_cast in boost::lexical_cast
+            std::ostringstream err;
+            err << "during update from config backend database: "
+                << "undefined configuration parsing error";
+            LOG_ERROR(dhcp6_logger, DHCP6_PARSER_COMMIT_FAIL).arg(err.str());
+            answer = isc::config::createAnswer(2, err.str());
+            // An error occurred, so make sure to restore the original data.
+            rollback = true;
+        }
+    }
+
     // Rollback changes as the configuration parsing failed.
     if (rollback) {
         // Revert to original configuration of runtime option definitions