Browse Source

[5097] Added missing user-context map in flex/bison

Francis Dupont 8 years ago
parent
commit
46303ccf47

+ 9 - 0
src/bin/dhcp4/dhcp4_lexer.ll

@@ -426,6 +426,15 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"user-context\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser4Context::POOLS:
+        return isc::dhcp::Dhcp4Parser::make_USER_CONTEXT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp4Parser::make_STRING("user-context", driver.loc_);
+    }
+}
+
 \"subnet\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser4Context::SUBNET4:

+ 12 - 0
src/bin/dhcp4/dhcp4_parser.yy

@@ -93,6 +93,7 @@ using namespace std;
 
   POOLS "pools"
   POOL "pool"
+  USER_CONTEXT "user-context"
 
   SUBNET "subnet"
   INTERFACE "interface"
@@ -193,6 +194,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> map_value
 %type <ElementPtr> socket_type
 
 %printer { yyoutput << $$; } <*>;
@@ -246,6 +248,8 @@ map2: LCURLY_BRACKET {
     // for it.
 };
 
+map_value: map2 { $$ = ctx.stack_.back(); ctx.stack_.pop_back(); };
+
 // Assignments rule
 map_content: %empty // empty map
            | not_empty_map
@@ -1106,6 +1110,7 @@ pool_params: pool_param
 
 pool_param: pool_entry
           | option_data_list
+          | user_context
           | unknown_map_entry
           ;
 
@@ -1117,6 +1122,13 @@ pool_entry: POOL {
     ctx.leave();
 };
 
+user_context: USER_CONTEXT {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON map_value {
+    ctx.stack_.back()->set("user-context", $4);
+    ctx.leave();
+};
+
 // --- end of pools definition -------------------------------
 
 // --- reservations ------------------------------------------

+ 3 - 2
src/bin/dhcp4/tests/config_parser_unittest.cc

@@ -1,4 +1,4 @@
-// Copyright (C) 2012-2016 Internet Systems Consortium, Inc. ("ISC")
+// Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC")
 //
 // This Source Code Form is subject to the terms of the Mozilla Public
 // License, v. 2.0. If a copy of the MPL was not distributed with this
@@ -572,8 +572,9 @@ public:
     void getPool(const std::string& config, size_t subnet_index,
                  size_t pool_index, PoolPtr& pool) {
         ConstElementPtr status;
-        ElementPtr json = Element::fromJSON(config);
+        ConstElementPtr json;
 
+        EXPECT_NO_THROW(json = parseDHCP4(config, true));
         EXPECT_NO_THROW(status = configureDhcp4Server(*srv_, json));
         ASSERT_TRUE(status);
         checkResult(status, 0);

+ 10 - 0
src/bin/dhcp6/dhcp6_lexer.ll

@@ -466,6 +466,16 @@ ControlCharacterFill            [^"\\]|\\{JSONEscapeSequence}
     }
 }
 
+\"user-context\" {
+    switch(driver.ctx_) {
+    case isc::dhcp::Parser6Context::POOLS:
+    case isc::dhcp::Parser6Context::PD_POOLS:
+        return isc::dhcp::Dhcp6Parser::make_USER_CONTEXT(driver.loc_);
+    default:
+        return isc::dhcp::Dhcp6Parser::make_STRING("user-context", driver.loc_);
+    }
+}
+
 \"subnet\" {
     switch(driver.ctx_) {
     case isc::dhcp::Parser6Context::SUBNET6:

+ 13 - 0
src/bin/dhcp6/dhcp6_parser.yy

@@ -88,6 +88,7 @@ using namespace std;
   EXCLUDED_PREFIX "excluded-prefix"
   EXCLUDED_PREFIX_LEN "excluded-prefix-len"
   DELEGATED_LEN "delegated-len"
+  USER_CONTEXT "user-context"
 
   SUBNET "subnet"
   INTERFACE "interface"
@@ -194,6 +195,7 @@ using namespace std;
 %token <bool> BOOLEAN "boolean"
 
 %type <ElementPtr> value
+%type <ElementPtr> map_value
 %type <ElementPtr> duid_type
 
 %printer { yyoutput << $$; } <*>;
@@ -248,6 +250,8 @@ map2: LCURLY_BRACKET {
     // for it.
 };
 
+map_value: map2 { $$ = ctx.stack_.back(); ctx.stack_.pop_back(); };
+
 // Assignments rule
 map_content: %empty // empty map
            | not_empty_map
@@ -1083,6 +1087,7 @@ pool_params: pool_param
 
 pool_param: pool_entry
           | option_data_list
+          | user_context
           | unknown_map_entry
           ;
 
@@ -1094,6 +1099,13 @@ pool_entry: POOL {
     ctx.leave();
 };
 
+user_context: USER_CONTEXT {
+    ctx.enter(ctx.NO_KEYWORD);
+} COLON map_value {
+    ctx.stack_.back()->set("user-context", $4);
+    ctx.leave();
+};
+
 // --- end of pools definition -------------------------------
 
 // --- pd-pools ----------------------------------------------
@@ -1143,6 +1155,7 @@ pd_pool_param: pd_prefix
              | option_data_list
              | excluded_prefix
              | excluded_prefix_len
+             | user_context
              | unknown_map_entry
              ;
 

+ 2 - 1
src/bin/dhcp6/tests/config_parser_unittest.cc

@@ -707,8 +707,9 @@ public:
     void getPool(const std::string& config, size_t subnet_index,
                  size_t pool_index, Lease::Type type, PoolPtr& pool) {
         ConstElementPtr status;
-        ElementPtr json = Element::fromJSON(config);
+        ConstElementPtr json;
 
+        EXPECT_NO_THROW(json = parseDHCP6(config, true));
         EXPECT_NO_THROW(status = configureDhcp6Server(srv_, json));
         ASSERT_TRUE(status);
         checkResult(status, 0);