Browse Source

[5110] Adding bison parsing for forward-ddns and reverser-ddns to D2

src/bin/d2/d2_lexer.ll
    Added regexp for ddns-domians, key-name,
    dns-servers, hostname

src/bin/d2/d2_parser.yy
    Added tokens and rules for ddns-domains,
    key-name, dns-servers, hostname

src/bin/d2/parser_context.h
src/bin/d2/parser_context.cc
    Added contexts FORWARD_DDNS, REVERSE_DDNS,
    DDNS_DOMAINS, DNS_SERVERS,

src/bin/d2/tests/testdata/d2_cfg_tests.json
    Changed logic-errors to syntax-errors
Thomas Markwalder 8 years ago
parent
commit
e93455bd5c

File diff suppressed because it is too large
+ 753 - 626
src/bin/d2/d2_lexer.cc


+ 41 - 0
src/bin/d2/d2_lexer.ll

@@ -168,6 +168,7 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
 \"ip-address\" {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
+    case isc::d2::D2ParserContext::DNS_SERVERS:
         return isc::d2::D2Parser::make_IP_ADDRESS(driver.loc_);
     default:
         return isc::d2::D2Parser::make_STRING("ip-address", driver.loc_);
@@ -177,6 +178,7 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
 \"port\" {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
+    case isc::d2::D2ParserContext::DNS_SERVERS:
         return isc::d2::D2Parser::make_PORT(driver.loc_);
     default:
         return isc::d2::D2Parser::make_STRING("port", driver.loc_);
@@ -258,6 +260,44 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"ddns-domains\" {
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::FORWARD_DDNS:
+    case isc::d2::D2ParserContext::REVERSE_DDNS:
+        return isc::d2::D2Parser::make_DDNS_DOMAINS(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("ddns-domains", driver.loc_);
+    }
+}
+
+\"key-name\" {
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DDNS_DOMAINS:
+        return isc::d2::D2Parser::make_KEY_NAME(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("key-name", driver.loc_);
+    }
+}
+
+\"dns-servers\" {
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DDNS_DOMAINS:
+        return isc::d2::D2Parser::make_DNS_SERVERS(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("dns-servers", driver.loc_);
+    }
+}
+
+\"hostname\" {
+    switch(driver.ctx_) {
+    case isc::d2::D2ParserContext::DNS_SERVERS:
+        return isc::d2::D2Parser::make_HOSTNAME(driver.loc_);
+    default:
+        return isc::d2::D2Parser::make_STRING("hostname", driver.loc_);
+    }
+}
+
+
 \"tsig-keys\" {
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::DHCPDDNS:
@@ -335,6 +375,7 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     switch(driver.ctx_) {
     case isc::d2::D2ParserContext::LOGGERS:
     case isc::d2::D2ParserContext::TSIG_KEYS:
+    case isc::d2::D2ParserContext::DDNS_DOMAINS:
         return isc::d2::D2Parser::make_NAME(driver.loc_);
     default:
         return isc::d2::D2Parser::make_STRING("name", driver.loc_);

File diff suppressed because it is too large
+ 577 - 336
src/bin/d2/d2_parser.cc


+ 95 - 51
src/bin/d2/d2_parser.h

@@ -362,24 +362,28 @@ namespace isc { namespace d2 {
         TOKEN_JSON = 275,
         TOKEN_FORWARD_DDNS = 276,
         TOKEN_REVERSE_DDNS = 277,
-        TOKEN_TSIG_KEYS = 278,
-        TOKEN_ALGORITHM = 279,
-        TOKEN_DIGEST_BITS = 280,
-        TOKEN_SECRET = 281,
-        TOKEN_LOGGING = 282,
-        TOKEN_LOGGERS = 283,
-        TOKEN_NAME = 284,
-        TOKEN_OUTPUT_OPTIONS = 285,
-        TOKEN_OUTPUT = 286,
-        TOKEN_DEBUGLEVEL = 287,
-        TOKEN_SEVERITY = 288,
-        TOKEN_TOPLEVEL_JSON = 289,
-        TOKEN_TOPLEVEL_DHCPDDNS = 290,
-        TOKEN_SUB_DHCPDDNS = 291,
-        TOKEN_STRING = 292,
-        TOKEN_INTEGER = 293,
-        TOKEN_FLOAT = 294,
-        TOKEN_BOOLEAN = 295
+        TOKEN_DDNS_DOMAINS = 278,
+        TOKEN_KEY_NAME = 279,
+        TOKEN_DNS_SERVERS = 280,
+        TOKEN_HOSTNAME = 281,
+        TOKEN_TSIG_KEYS = 282,
+        TOKEN_ALGORITHM = 283,
+        TOKEN_DIGEST_BITS = 284,
+        TOKEN_SECRET = 285,
+        TOKEN_LOGGING = 286,
+        TOKEN_LOGGERS = 287,
+        TOKEN_NAME = 288,
+        TOKEN_OUTPUT_OPTIONS = 289,
+        TOKEN_OUTPUT = 290,
+        TOKEN_DEBUGLEVEL = 291,
+        TOKEN_SEVERITY = 292,
+        TOKEN_TOPLEVEL_JSON = 293,
+        TOKEN_TOPLEVEL_DHCPDDNS = 294,
+        TOKEN_SUB_DHCPDDNS = 295,
+        TOKEN_STRING = 296,
+        TOKEN_INTEGER = 297,
+        TOKEN_FLOAT = 298,
+        TOKEN_BOOLEAN = 299
       };
     };
 
@@ -580,6 +584,22 @@ namespace isc { namespace d2 {
 
     static inline
     symbol_type
+    make_DDNS_DOMAINS (const location_type& l);
+
+    static inline
+    symbol_type
+    make_KEY_NAME (const location_type& l);
+
+    static inline
+    symbol_type
+    make_DNS_SERVERS (const location_type& l);
+
+    static inline
+    symbol_type
+    make_HOSTNAME (const location_type& l);
+
+    static inline
+    symbol_type
     make_TSIG_KEYS (const location_type& l);
 
     static inline
@@ -717,7 +737,7 @@ namespace isc { namespace d2 {
     // Tables.
   // YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
   // STATE-NUM.
-  static const signed char yypact_[];
+  static const short int yypact_[];
 
   // YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
   // Performed when YYTABLE does not specify something else to do.  Zero
@@ -733,7 +753,7 @@ namespace isc { namespace d2 {
   // YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
   // positive, shift that token.  If negative, reduce the rule whose
   // number is the opposite.  If YYTABLE_NINF, syntax error.
-  static const unsigned char yytable_[];
+  static const unsigned short int yytable_[];
 
   static const short int yycheck_[];
 
@@ -855,12 +875,12 @@ namespace isc { namespace d2 {
     enum
     {
       yyeof_ = 0,
-      yylast_ = 159,     ///< Last index in yytable_.
-      yynnts_ = 82,  ///< Number of nonterminal symbols.
+      yylast_ = 245,     ///< Last index in yytable_.
+      yynnts_ = 110,  ///< Number of nonterminal symbols.
       yyfinal_ = 8, ///< Termination state number.
       yyterror_ = 1,
       yyerrcode_ = 256,
-      yyntokens_ = 41  ///< Number of tokens.
+      yyntokens_ = 45  ///< Number of tokens.
     };
 
 
@@ -906,9 +926,9 @@ namespace isc { namespace d2 {
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    36,    37,    38,    39,    40
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44
     };
-    const unsigned int user_token_number_max_ = 295;
+    const unsigned int user_token_number_max_ = 299;
     const token_number_type undef_token_ = 2;
 
     if (static_cast<int>(t) <= yyeof_)
@@ -941,24 +961,24 @@ namespace isc { namespace d2 {
   {
       switch (other.type_get ())
     {
-      case 46: // value
-      case 73: // ncr_protocol_value
+      case 50: // value
+      case 77: // ncr_protocol_value
         value.copy< ElementPtr > (other.value);
         break;
 
-      case 40: // "boolean"
+      case 44: // "boolean"
         value.copy< bool > (other.value);
         break;
 
-      case 39: // "floating point"
+      case 43: // "floating point"
         value.copy< double > (other.value);
         break;
 
-      case 38: // "integer"
+      case 42: // "integer"
         value.copy< int64_t > (other.value);
         break;
 
-      case 37: // "constant string"
+      case 41: // "constant string"
         value.copy< std::string > (other.value);
         break;
 
@@ -979,24 +999,24 @@ namespace isc { namespace d2 {
     (void) v;
       switch (this->type_get ())
     {
-      case 46: // value
-      case 73: // ncr_protocol_value
+      case 50: // value
+      case 77: // ncr_protocol_value
         value.copy< ElementPtr > (v);
         break;
 
-      case 40: // "boolean"
+      case 44: // "boolean"
         value.copy< bool > (v);
         break;
 
-      case 39: // "floating point"
+      case 43: // "floating point"
         value.copy< double > (v);
         break;
 
-      case 38: // "integer"
+      case 42: // "integer"
         value.copy< int64_t > (v);
         break;
 
-      case 37: // "constant string"
+      case 41: // "constant string"
         value.copy< std::string > (v);
         break;
 
@@ -1076,24 +1096,24 @@ namespace isc { namespace d2 {
     // Type destructor.
     switch (yytype)
     {
-      case 46: // value
-      case 73: // ncr_protocol_value
+      case 50: // value
+      case 77: // ncr_protocol_value
         value.template destroy< ElementPtr > ();
         break;
 
-      case 40: // "boolean"
+      case 44: // "boolean"
         value.template destroy< bool > ();
         break;
 
-      case 39: // "floating point"
+      case 43: // "floating point"
         value.template destroy< double > ();
         break;
 
-      case 38: // "integer"
+      case 42: // "integer"
         value.template destroy< int64_t > ();
         break;
 
-      case 37: // "constant string"
+      case 41: // "constant string"
         value.template destroy< std::string > ();
         break;
 
@@ -1120,24 +1140,24 @@ namespace isc { namespace d2 {
     super_type::move(s);
       switch (this->type_get ())
     {
-      case 46: // value
-      case 73: // ncr_protocol_value
+      case 50: // value
+      case 77: // ncr_protocol_value
         value.move< ElementPtr > (s.value);
         break;
 
-      case 40: // "boolean"
+      case 44: // "boolean"
         value.move< bool > (s.value);
         break;
 
-      case 39: // "floating point"
+      case 43: // "floating point"
         value.move< double > (s.value);
         break;
 
-      case 38: // "integer"
+      case 42: // "integer"
         value.move< int64_t > (s.value);
         break;
 
-      case 37: // "constant string"
+      case 41: // "constant string"
         value.move< std::string > (s.value);
         break;
 
@@ -1200,7 +1220,7 @@ namespace isc { namespace d2 {
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
-     295
+     295,   296,   297,   298,   299
     };
     return static_cast<token_type> (yytoken_number_[type]);
   }
@@ -1332,6 +1352,30 @@ namespace isc { namespace d2 {
   }
 
   D2Parser::symbol_type
+  D2Parser::make_DDNS_DOMAINS (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_DDNS_DOMAINS, l);
+  }
+
+  D2Parser::symbol_type
+  D2Parser::make_KEY_NAME (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_KEY_NAME, l);
+  }
+
+  D2Parser::symbol_type
+  D2Parser::make_DNS_SERVERS (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_DNS_SERVERS, l);
+  }
+
+  D2Parser::symbol_type
+  D2Parser::make_HOSTNAME (const location_type& l)
+  {
+    return symbol_type (token::TOKEN_HOSTNAME, l);
+  }
+
+  D2Parser::symbol_type
   D2Parser::make_TSIG_KEYS (const location_type& l)
   {
     return symbol_type (token::TOKEN_TSIG_KEYS, l);
@@ -1442,7 +1486,7 @@ namespace isc { namespace d2 {
 
 #line 14 "d2_parser.yy" // lalr1.cc:392
 } } // isc::d2
-#line 1446 "d2_parser.h" // lalr1.cc:392
+#line 1490 "d2_parser.h" // lalr1.cc:392
 
 
 

+ 162 - 13
src/bin/d2/d2_parser.yy

@@ -63,6 +63,10 @@ using namespace std;
   JSON "JSON"
   FORWARD_DDNS "forward-ddns"
   REVERSE_DDNS "reverse-ddns"
+  DDNS_DOMAINS "ddns-domains"
+  KEY_NAME "key-name"
+  DNS_SERVERS "dns-servers"
+  HOSTNAME "hostname"
   TSIG_KEYS "tsig-keys"
   ALGORITHM "algorithm"
   DIGEST_BITS "digest-bits"
@@ -158,14 +162,6 @@ list_generic: LSQUARE_BRACKET {
     // list parsing complete. Put any sanity checking here
 };
 
-//// This one is used in syntax parser.
-//list2: LSQUARE_BRACKET {
-//    // List parsing about to start
-//} list_content RSQUARE_BRACKET {
-//    // list parsing complete. Put any sanity checking here
-//    //ctx.stack_.pop_back();
-//};
-
 list_content: %empty // Empty list
             | not_empty_list
             ;
@@ -300,19 +296,172 @@ ncr_format: NCR_FORMAT {
 };
 
 forward_ddns : FORWARD_DDNS {
-    ctx.enter(ctx.NO_KEYWORD);
-} COLON value {
-    ctx.stack_.back()->set("forward-ddns", $4);
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("forward-ddns", m);
+    ctx.stack_.push_back(m);
+    ctx.enter(ctx.FORWARD_DDNS);
+} COLON LCURLY_BRACKET ddns_mgr_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
     ctx.leave();
 };
 
 reverse_ddns : REVERSE_DDNS {
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("reverse-ddns", m);
+    ctx.stack_.push_back(m);
+    ctx.enter(ctx.REVERSE_DDNS);
+} COLON LCURLY_BRACKET ddns_mgr_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
+    ctx.leave();
+};
+
+ddns_mgr_params: %empty
+               | not_empty_ddns_mgr_params
+               ;
+
+not_empty_ddns_mgr_params: ddns_mgr_param 
+                         | ddns_mgr_params COMMA ddns_mgr_param
+                         ;
+
+ddns_mgr_param: ddns_domains 
+              | unknown_map_entry
+              ;
+
+
+// --- ddns-domains ----------------------------------------
+
+ddns_domains: DDNS_DOMAINS {
+    ElementPtr l(new ListElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("ddns-domains", l);
+    ctx.stack_.push_back(l);
+    ctx.enter(ctx.DDNS_DOMAINS);
+} COLON LSQUARE_BRACKET ddns_domain_list RSQUARE_BRACKET {
+    ctx.stack_.pop_back();
+    ctx.leave();
+};
+
+ddns_domain_list: %empty
+              | not_empty_ddns_domain_list
+              ;
+
+not_empty_ddns_domain_list: ddns_domain
+                        | not_empty_ddns_domain_list COMMA ddns_domain
+                        ;
+
+ddns_domain: LCURLY_BRACKET {
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->add(m);
+    ctx.stack_.push_back(m);
+} ddns_domain_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
+};
+
+ddns_domain_params: ddns_domain_param 
+                  | ddns_domain_params COMMA ddns_domain_param
+                  ;
+
+ddns_domain_param: ddns_domain_name
+                 | ddns_domain_key_name
+                 | dns_servers
+                 | unknown_map_entry
+                 ;
+
+//  @todo NAME needs to be an FQDN sort of thing
+ddns_domain_name: NAME {
     ctx.enter(ctx.NO_KEYWORD);
-} COLON value {
-    ctx.stack_.back()->set("reverse-ddns", $4);
+} COLON STRING {
+    if ($4 == "") {
+        error(@3, "name cannot be blank");
+    } 
+    ElementPtr elem(new StringElement($4, ctx.loc2pos(@4)));
+    ElementPtr name(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("name", name);
     ctx.leave();
 };
 
+ddns_domain_key_name: KEY_NAME {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+    if ($4 == "") {
+        error(@3, "key-name cannot be blank");
+    } 
+    ElementPtr elem(new StringElement($4, ctx.loc2pos(@4)));
+    ElementPtr name(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("key-name", name);
+    ctx.leave();
+};
+
+// --- end ddns-domains ----------------------------------------
+
+// --- dns-servers ----------------------------------------
+dns_servers: DNS_SERVERS {
+    ElementPtr l(new ListElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->set("dns-servers", l);
+    ctx.stack_.push_back(l);
+    ctx.enter(ctx.DNS_SERVERS);
+} COLON LSQUARE_BRACKET dns_server_list RSQUARE_BRACKET {
+    ctx.stack_.pop_back();
+    ctx.leave();
+};
+
+dns_server_list: %empty
+              | not_empty_dns_server_list
+              ;
+
+not_empty_dns_server_list: dns_server
+                        | not_empty_dns_server_list COMMA dns_server
+                        ;
+
+dns_server: LCURLY_BRACKET {
+    ElementPtr m(new MapElement(ctx.loc2pos(@1)));
+    ctx.stack_.back()->add(m);
+    ctx.stack_.push_back(m);
+} dns_server_params RCURLY_BRACKET {
+    ctx.stack_.pop_back();
+};
+
+dns_server_params: dns_server_param 
+               | dns_server_params COMMA dns_server_param
+               ;
+
+dns_server_param: dns_server_hostname
+              | dns_server_ip_address
+              | dns_server_port
+              | unknown_map_entry
+              ;
+
+dns_server_hostname: HOSTNAME {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+    if ($4 == "") {
+        error(@3, "hostname cannot be blank");
+    } 
+    ElementPtr elem(new StringElement($4, ctx.loc2pos(@4)));
+    ElementPtr name(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("hostname", name);
+    ctx.leave();
+};
+
+dns_server_ip_address: IP_ADDRESS {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON STRING {
+    ElementPtr s(new StringElement($4, ctx.loc2pos(@4)));
+    ctx.stack_.back()->set("ip-address", s);
+    ctx.leave();
+};
+
+dns_server_port: PORT COLON INTEGER {
+    if ($3 <= 0) {
+        error(@3, "port must be greater than zero");
+    } 
+    ElementPtr i(new IntElement($3, ctx.loc2pos(@3)));
+    ctx.stack_.back()->set("port", i);
+};
+
+// --- end of dns-servers ---------------------------------
+
+
+
 // --- tsig-keys ----------------------------------------
 // "tsig-keys" : [ ... ]
 tsig_keys: TSIG_KEYS {

+ 14 - 0
src/bin/d2/parser_context.cc

@@ -125,6 +125,20 @@ D2ParserContext::contextName()
         return ("DhcpDdns");
     case TSIG_KEYS:
         return ("tsig-keys");
+    case ALGORITHM:
+        return("algorithm");
+    case DIGEST_BITS:
+        return("digest-bits");
+    case SECRET:
+        return("secret");
+    case FORWARD_DDNS:
+        return("forward-ddns");
+    case REVERSE_DDNS:
+        return("reverse-ddns");
+    case DDNS_DOMAINS:
+        return("ddns-domains");
+    case DNS_SERVERS:
+        return("dns-servers");
     case LOGGING:
         return ("Logging");
     case LOGGERS:

+ 12 - 0
src/bin/d2/parser_context.h

@@ -168,6 +168,18 @@ public:
         ///< Used while parsing content of DhcpDdns/tsig-keys/secret
         SECRET,
 
+        ///< Used while parsing content of DhcpDdns/forward-ddns
+        FORWARD_DDNS,
+
+        ///< Used while parsing content of DhcpDdns/reverse-ddns
+        REVERSE_DDNS,
+
+        ///< Used while parsing content of DhcpDdns/<forward|reverse>-ddns/ddns-domains
+        DDNS_DOMAINS,
+
+        ///< Used while parsing content of DhcpDdns/<forward|reverse>-ddns/ddns-domains/dns-servers
+        DNS_SERVERS,
+
         ///< Used while parsing content of Logging
         LOGGING,
 

+ 4 - 3
src/bin/d2/tests/d2_cfg_mgr_unittests.cc

@@ -1773,9 +1773,10 @@ TEST_F(D2CfgMgrTest, configPermutations) {
                 EXPECT_EQ(expected_syntax_error, ex.what())
                             << description << ", syntax error mismatch";
 
-                // Expected or not, skip logic testing on syntax errors.
-                continue;
-           }
+            }
+
+            // Expected or not, skip logic testing on syntax errors.
+            continue;
         }
 
         // Attempt to Element parse the configuration. We verify that we get the

+ 13 - 13
src/bin/d2/tests/testdata/d2_cfg_tests.json

@@ -736,7 +736,7 @@
 #------
 ,{
 "description" : "D2.forward-ddns, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.21-27: got unexpected keyword \"bogus\" in forward-ddns map.",
 "data" :
     {
     "forward-ddns" :
@@ -820,7 +820,7 @@
 #----- D2.forward-ddns.dhcp-ddns  tests
 ,{
 "description" : "D2.forward-ddns.dhcp-ddns, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.41-47: got unexpected keyword \"bogus\" in ddns-domains map.",
 "data" :
     {
     "forward-ddns" :
@@ -839,8 +839,8 @@
 
 #----- D2.forward-ddns.dhcp-ddns.name tests
 ,{
-"description" : "D2.forward-ddns.dhcp-ddns, no name",
-"logic-error" : true,
+"description" : "D2.forward-ddns.dhcp-ddns, empty domain",
+"syntax-error" : "<string>:1.42: syntax error, unexpected }, expecting key-name or dns-servers or name or constant string",
 "data" :
     {
     "forward-ddns" :
@@ -859,7 +859,7 @@
 #-----
 ,{
 "description" : "D2.forward-ddns.dhcp-ddns, blank name",
-"logic-error" : true,
+"syntax-error" : "<string>:1.47: name cannot be blank",
 "data" :
     {
     "forward-ddns" :
@@ -934,7 +934,7 @@
 #----- D2.forward-ddns.dhcp-ddns.dns-servers tests
 ,{
 "description" : "D2.forward-ddns.dhcp-ddns.dns-servers, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.60-66: got unexpected keyword \"bogus\" in dns-servers map.",
 "data" :
     {
     "forward-ddns" :
@@ -1089,7 +1089,7 @@
 #-----
 ,{
 "description" : "D2.forward-ddns.dhcp-ddns.dns-servers.port cannot be 0 ",
-"logic-error" : true,
+"syntax-error" : "<string>:1.97: port must be greater than zero",
 "data" :
     {
     "forward-ddns" :
@@ -1130,7 +1130,7 @@
 #------
 ,{
 "description" : "D2.reverse-ddns, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.43-49: got unexpected keyword \"bogus\" in reverse-ddns map.",
 "data" :
     {
     "forward-ddns" : {},
@@ -1214,7 +1214,7 @@
 #----- D2.reverse-ddns.dhcp-ddns  tests
 ,{
 "description" : "D2.reverse-ddns.dhcp-ddns, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.63-69: got unexpected keyword \"bogus\" in ddns-domains map.",
 "data" :
     {
     "forward-ddns" : {},
@@ -1234,7 +1234,7 @@
 #----- D2.reverse-ddns.dhcp-ddns.name tests
 ,{
 "description" : "D2.reverse-ddns.dhcp-ddns, no name",
-"logic-error" : true,
+"syntax-error" : "<string>:1.64: syntax error, unexpected }, expecting key-name or dns-servers or name or constant string",
 "data" :
     {
     "forward-ddns" : {},
@@ -1253,7 +1253,7 @@
 #-----
 ,{
 "description" : "D2.reverse-ddns.dhcp-ddns, blank name",
-"logic-error" : true,
+"syntax-error" : "<string>:1.69: name cannot be blank",
 "data" :
     {
     "forward-ddns" : {},
@@ -1328,7 +1328,7 @@
 #----- D2.reverse-ddns.dhcp-ddns.dns-servers tests
 ,{
 "description" : "D2.reverse-ddns.dhcp-ddns.dns-servers, unknown parameter",
-"logic-error" : true,
+"syntax-error" : "<string>:1.82-88: got unexpected keyword \"bogus\" in dns-servers map.",
 "data" :
     {
     "forward-ddns" : {},
@@ -1482,7 +1482,7 @@
 #-----
 ,{
 "description" : "D2.reverse-ddns.dhcp-ddns.dns-servers.port cannot be 0 ",
-"logic-error" : true,
+"syntax-error" : "<string>:1.119: port must be greater than zero",
 "data" :
     {
     "forward-ddns" : {},