]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add a 'creationOrder' field to rules 7078/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 17 Oct 2018 15:28:58 +0000 (17:28 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Wed, 17 Oct 2018 15:28:58 +0000 (17:28 +0200)
pdns/dnsdist-lua-actions.cc
pdns/dnsdist-lua-rules.cc
pdns/dnsdist-lua.hh
pdns/dnsdist-web.cc
pdns/dnsdist.hh
regression-tests.dnsdist/test_API.py

index f59ec3353fb240f6642a5b9e3df190fafee016cf..6e92336347914eead3465429c11103c5abc9332e 100644 (file)
@@ -1004,11 +1004,12 @@ static void addAction(GlobalStateHolder<vector<T> > *someRulActions, luadnsrule_
   setLuaSideEffect();
 
   boost::uuids::uuid uuid;
-  parseRuleParams(params, uuid);
+  uint64_t creationOrder;
+  parseRuleParams(params, uuid, creationOrder);
 
   auto rule=makeRule(var);
-  someRulActions->modify([rule, action, uuid](vector<T>& rulactions){
-      rulactions.push_back({rule, action, uuid});
+  someRulActions->modify([rule, action, uuid, creationOrder](vector<T>& rulactions){
+      rulactions.push_back({rule, action, uuid, creationOrder});
     });
 }
 
@@ -1016,10 +1017,11 @@ void setupLuaActions()
 {
   g_lua.writeFunction("newRuleAction", [](luadnsrule_t dnsrule, std::shared_ptr<DNSAction> action, boost::optional<luaruleparams_t> params) {
       boost::uuids::uuid uuid;
-      parseRuleParams(params, uuid);
+      uint64_t creationOrder;
+      parseRuleParams(params, uuid, creationOrder);
 
       auto rule=makeRule(dnsrule);
-      DNSDistRuleAction ra({rule, action, uuid});
+      DNSDistRuleAction ra({rule, action, uuid, creationOrder});
       return std::make_shared<DNSDistRuleAction>(ra);
     });
 
index 973047ae7fc89ee60427ea9f67af1f48a4b011fd..28630b1fe7c15be9f5a2281e98d1302dccf6cffc 100644 (file)
@@ -68,8 +68,10 @@ static boost::uuids::uuid makeRuleID(std::string& id)
   return gen(id);
 }
 
-void parseRuleParams(boost::optional<luaruleparams_t> params, boost::uuids::uuid& uuid)
+void parseRuleParams(boost::optional<luaruleparams_t> params, boost::uuids::uuid& uuid, uint64_t& creationOrder)
 {
+  static uint64_t s_creationOrder = 0;
+
   string uuidStr;
 
   if (params) {
@@ -79,6 +81,7 @@ void parseRuleParams(boost::optional<luaruleparams_t> params, boost::uuids::uuid
   }
 
   uuid = makeRuleID(uuidStr);
+  creationOrder = s_creationOrder++;
 }
 
 typedef std::unordered_map<std::string, boost::variant<bool, int, std::string, std::vector<std::pair<int,int> > > > ruleparams_t;
@@ -101,11 +104,11 @@ static void showRules(GlobalStateHolder<vector<T> > *someRulActions, boost::opti
 
   auto rules = someRulActions->getLocal();
   if (showUUIDs) {
-    boost::format fmt("%-3d %-38s %9d %-56s %s\n");
-    g_outputBuffer += (fmt % "#" % "UUID" % "Matches" % "Rule" % "Action").str();
+    boost::format fmt("%-3d %-38s %9d %9d %-56s %s\n");
+    g_outputBuffer += (fmt % "#" % "UUID" % "Cr. Order" % "Matches" % "Rule" % "Action").str();
     for(const auto& lim : *rules) {
       string name = lim.d_rule->toString().substr(0, truncateRuleWidth);
-      g_outputBuffer += (fmt % num % boost::uuids::to_string(lim.d_id) % lim.d_rule->d_matches % name % lim.d_action->toString()).str();
+      g_outputBuffer += (fmt % num % boost::uuids::to_string(lim.d_id) % lim.d_creationOrder % lim.d_rule->d_matches % name % lim.d_action->toString()).str();
       ++num;
     }
   }
index b14dde8f44bfba9296830cd8979b42a7b83d635b..7ab5d963ca442e03347d0f94029586b10ca9936f 100644 (file)
@@ -80,7 +80,7 @@ private:
 typedef boost::variant<string, vector<pair<int, string>>, std::shared_ptr<DNSRule>, DNSName, vector<pair<int, DNSName> > > luadnsrule_t;
 std::shared_ptr<DNSRule> makeRule(const luadnsrule_t& var);
 typedef std::unordered_map<std::string, boost::variant<std::string> > luaruleparams_t;
-void parseRuleParams(boost::optional<luaruleparams_t> params, boost::uuids::uuid& uuid);
+void parseRuleParams(boost::optional<luaruleparams_t> params, boost::uuids::uuid& uuid, uint64_t& creationOrder);
 
 typedef NetmaskTree<DynBlock> nmts_t;
 
index 810a4b9433205ce72fd7ce9541df6108051c783f..44b5977f05864c160d616b6f6220ea2ec2a0048a 100644 (file)
@@ -231,6 +231,7 @@ static json11::Json::array someResponseRulesToJson(GlobalStateHolder<vector<T>>*
   for(const auto& a : *localResponseRules) {
     Json::object rule{
       {"id", num++},
+      {"creationOrder", (double)a.d_creationOrder},
       {"uuid", boost::uuids::to_string(a.d_id)},
       {"matches", (double)a.d_rule->d_matches},
       {"rule", a.d_rule->toString()},
@@ -589,6 +590,7 @@ static void connectionThread(int sock, ComboAddress remote, string password, str
       for(const auto& a : *localRules) {
        Json::object rule{
           {"id", num++},
+          {"creationOrder", (double)a.d_creationOrder},
           {"uuid", boost::uuids::to_string(a.d_id)},
           {"matches", (double)a.d_rule->d_matches},
           {"rule", a.d_rule->toString()},
index 08393675e88db78ae9be24bae695479f673d2c7b..e457b5806633993c7e48a4023513b5d6bd382509 100644 (file)
@@ -896,6 +896,7 @@ struct DNSDistRuleAction
   std::shared_ptr<DNSRule> d_rule;
   std::shared_ptr<DNSAction> d_action;
   boost::uuids::uuid d_id;
+  uint64_t d_creationOrder;
 };
 
 struct DNSDistResponseRuleAction
@@ -903,6 +904,7 @@ struct DNSDistResponseRuleAction
   std::shared_ptr<DNSRule> d_rule;
   std::shared_ptr<DNSResponseAction> d_action;
   boost::uuids::uuid d_id;
+  uint64_t d_creationOrder;
 };
 
 extern GlobalStateHolder<SuffixMatchTree<DynBlock>> g_dynblockSMT;
index 5d0483e10dfc9a14f35c43b02617679fc80c8fe7..b5d2a167a047e63b9fad01307ba66dcdfe9c2583 100644 (file)
@@ -78,21 +78,15 @@ class TestAPIBasics(DNSDistTest):
 
         self.assertEquals(content['daemon_type'], 'dnsdist')
 
-        rule_groups = ['response-rules', 'cache-hit-response-rules', 'self-answered-response-rules']
-        for key in ['version', 'acl', 'local', 'rules', 'servers', 'frontends', 'pools'] + rule_groups:
+        rule_groups = ['response-rules', 'cache-hit-response-rules', 'self-answered-response-rules', 'rules']
+        for key in ['version', 'acl', 'local', 'servers', 'frontends', 'pools'] + rule_groups:
             self.assertIn(key, content)
 
-        for rule in content['rules']:
-            for key in ['id', 'matches', 'rule', 'action', 'uuid']:
-                self.assertIn(key, rule)
-            for key in ['id', 'matches']:
-                self.assertTrue(rule[key] >= 0)
-
         for rule_group in rule_groups:
             for rule in content[rule_group]:
-                for key in ['id', 'matches', 'rule', 'action', 'uuid']:
+                for key in ['id', 'creationOrder', 'matches', 'rule', 'action', 'uuid']:
                     self.assertIn(key, rule)
-                for key in ['id', 'matches']:
+                for key in ['id', 'creationOrder', 'matches']:
                     self.assertTrue(rule[key] >= 0)
 
         for server in content['servers']: