Commit b6d4dff8 authored by Francis Dupont's avatar Francis Dupont

[5374] Checkpoint before regen

parent ed00b40d
......@@ -759,9 +759,9 @@ concatenation of the strings</entry></row>
<title>Configuring Classes</title>
<para>
A class contains five items: a name, a test expression, option data,
option definition and eval on-demand flag.
option definition and only-if-required flag.
The name must exist and must be unique amongst all classes. The test
expression, option data and definition, and eval on-demand flag are
expression, option data and definition, and only-if-required flag are
optional.
</para>
......@@ -786,21 +786,21 @@ concatenation of the strings</entry></row>
Usually the test expression is evaluated before subnet selection
but in some cases it is useful to evaluate it later when the
subnet, shared-network or pools are known but output option
processing not yet done. The eval-on-demand flag, false by default,
allows to defer and make only on-demand the evaluation of the
test expression.
processing not yet done. The only-if-required flag, false by default,
allows to perform the evaluation of the test expression only
when it was required, i.e. in a required-client-classes list.
</para>
<para>
The eval-client-classes list which is valid for shared-network,
The required-client-classes list which is valid for shared-network,
subnet and pool scope specifies the classes which are evaluated
in the second pass before output option processing.
The list is built in the reversed precedence order of option
data, i.e. an option data in a subnet takes precedence on one
in a shared-network but an on-demand class in a subnet is added
in a shared-network but required class in a subnet is added
after one in a shared-network.
The mechanism is related to the eval-on-demand flag but it is
not required that the flag was set to true.
The mechanism is related to the only-if-required flag but it is
not mandatory that the flag was set to true.
</para>
<para>
......
......@@ -2095,8 +2095,8 @@ It is merely echoed by the server
is to assess an incoming packet and assign it to zero or more classes. The
second step is to choose a subnet, possibly based on the class information.
The third step is to assign classes from host reservations.
The forth step is to build the list of on-demand classes and perform
deferred evaluation for each class of the list.
The forth step is to build the list of required classes and perform
the evaluation for each class of the list.
The last step is to assign options, again possibly based on the class
information.
</para>
......@@ -2248,23 +2248,23 @@ It is merely echoed by the server
</para>
</section>
<section id="dhcp4-on-demand-class">
<title>On-demand classification</title>
<section id="dhcp4-required-class">
<title>Required classification</title>
<para>
In some cases it is useful to limit the scope of class.
Two devices are available to perform evaluation of test
expressions so assignment when it returns true only on-demand.
expressions so assignment when it was required.
</para>
<para>
The first one is the per-class <command>eval-on-demand</command>
The first one is the per-class <command>only-if-required</command>
flag which is false by default. When it is set to
<command>true</command> the test expression of the class is not
evaluated at the reception of a new incoming ticket.
</para>
<para>
The second is the <command>eval-client-classes</command> which
The second is the <command>required-client-classes</command> which
takes a list of class names and is valid in shared-network,
subnet and pool scope. Classes in these lists are evaluated
after resource assignment and before output option processing.
......@@ -2280,7 +2280,7 @@ It is merely echoed by the server
{<userinput>
"name": "Client_foo",
"test": "'' == ''",
"eval-on-demand": true</userinput>
"only-if-required": true</userinput>
},
...
],
......@@ -2288,7 +2288,7 @@ It is merely echoed by the server
{
"subnet": "192.0.2.0/24",
"pools": [ { "pool": "192.0.2.10 - 192.0.2.20" } ],
<userinput>"eval-client-classes": [ "Client_foo" ],</userinput>
<userinput>"required-client-classes": [ "Client_foo" ],</userinput>
...
},
...
......
......@@ -1955,8 +1955,8 @@ should include options from the isc option space:
is to assess an incoming packet and assign it to zero or more classes. The
second step is to choose a subnet, possibly based on the class information.
The third step is to assign classes from host reservations.
The forth step is to build the list of on-demand classes and perform
deferred evaluation for each class of the list.
The forth step is to build the list of required classes and perform
the evaluation for each class of the list.
The last step is to assign options again possibly based on the class
information.
</para>
......@@ -2041,23 +2041,23 @@ should include options from the isc option space:
</para>
</section>
<section id="dhcp6-on-demand-class">
<title>On-demand classification</title>
<section id="dhcp6-required-class">
<title>Required classification</title>
<para>
In some cases it is useful to limit the scope of class.
Two devices are available to perform evaluation of test
expressions so assignment when it returns true only on-demand.
expressions so assignment when it was required.
</para>
<para>
The first one is the per-class <command>eval-on-demand</command>
The first one is the per-class <command>only-if-required</command>
flag which is false by default. When it is set to
<command>true</command> the test expression of the class is not
evaluated at the reception of a new incoming ticket.
</para>
<para>
The second is the <command>eval-client-classes</command> which
The second is the <command>required-client-classes</command> which
takes a list of class names and is valid in shared-network,
subnet and pool scope. Classes in these lists are evaluated
after resource assignment and before output option processing.
......@@ -2073,7 +2073,7 @@ should include options from the isc option space:
{<userinput>
"name": "Client_foo",
"test": "'' == ''",
"eval-on-demand": true</userinput>
"only-if-required": true</userinput>
},
...
],
......@@ -2085,7 +2085,7 @@ should include options from the isc option space:
"pool": "2001:db8:1::-2001:db8:1::ffff"
}
],
<userinput>"eval-client-classes": [ "Client_foo" ],</userinput>
<userinput>"required-client-classes": [ "Client_foo" ],</userinput>
...
},
...
......
......@@ -795,14 +795,14 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
\"eval-client-classes\" {
\"required-client-classes\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::SUBNET4:
case isc::dhcp::Parser4Context::POOLS:
case isc::dhcp::Parser4Context::SHARED_NETWORK:
return isc::dhcp::Dhcp4Parser::make_EVAL_CLIENT_CLASSES(driver.loc_);
return isc::dhcp::Dhcp4Parser::make_REQUIRED_CLIENT_CLASSES(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("eval-client-classes", driver.loc_);
return isc::dhcp::Dhcp4Parser::make_STRING("required-client-classes", driver.loc_);
}
}
......@@ -827,12 +827,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
}
\"eval-on-demand\" {
\"only-if-required\" {
switch(driver.ctx_) {
case isc::dhcp::Parser4Context::CLIENT_CLASSES:
return isc::dhcp::Dhcp4Parser::make_EVAL_ON_DEMAND(driver.loc_);
return isc::dhcp::Dhcp4Parser::make_ONLY_IF_REQUIRED(driver.loc_);
default:
return isc::dhcp::Dhcp4Parser::make_STRING("eval-on-demand", driver.loc_);
return isc::dhcp::Dhcp4Parser::make_STRING("only-if-required", driver.loc_);
}
}
......
# Copyright (C) 2012-2017 Internet Systems Consortium, Inc. ("ISC")
# Copyright (C) 2012-2018 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
......@@ -59,12 +59,12 @@ which cannot be found in the configuration. Either a hook written
before the classification was added to Kea is used, or class naming is
inconsistent.
% DHCP4_CLASS_UNKNOWN on-demand class %1 has no definition
This debug message informs that a class is listed for late evaluation but
% DHCP4_CLASS_UNDEFINED required class %1 has no definition
This debug message informs that a class is listed for required evaluation but
has no definition.
% DHCP4_CLASS_UNTESTABLE on-demand class %1 has no test expression
This debug message informs that a class was listed for late evaluation but
% DHCP4_CLASS_UNTESTABLE required class %1 has no test expression
This debug message informs that a class was listed for required evaluation but
its definition does not include a test expression to evaluate.
% DHCP4_CLIENTID_IGNORED_FOR_LEASES %1: not using client identifier for lease allocation for subnet %2
......
......@@ -123,9 +123,9 @@ using namespace std;
HOST_RESERVATION_IDENTIFIERS "host-reservation-identifiers"
CLIENT_CLASSES "client-classes"
EVAL_CLIENT_CLASSES "eval-client-classes"
REQUIRED_CLIENT_CLASSES "required-client-classes"
TEST "test"
EVAL_ON_DEMAND "eval-on-demand"
ONLY_IF_REQUIRED "only-if-required"
CLIENT_CLASS "client-class"
RESERVATIONS "reservations"
......@@ -911,7 +911,7 @@ subnet4_param: valid_lifetime
| id
| rapid_commit
| client_class
| eval_client_classes
| required_client_classes
| reservations
| reservation_mode
| relay
......@@ -982,9 +982,9 @@ client_class: CLIENT_CLASS {
ctx.leave();
};
eval_client_classes: EVAL_CLIENT_CLASSES {
required_client_classes: REQUIRED_CLIENT_CLASSES {
ElementPtr c(new ListElement(ctx.loc2pos(@1)));
ctx.stack_.back()->set("eval-client-classes", c);
ctx.stack_.back()->set("required-client-classes", c);
ctx.stack_.push_back(c);
ctx.enter(ctx.NO_KEYWORD);
} COLON list_strings {
......@@ -1061,7 +1061,7 @@ shared_network_param: name
| relay
| reservation_mode
| client_class
| eval_client_classes
| required_client_classes
| valid_lifetime
| unknown_map_entry
;
......@@ -1344,7 +1344,7 @@ pool_params: pool_param
pool_param: pool_entry
| option_data_list
| client_class
| eval_client_classes
| required_client_classes
| user_context
| unknown_map_entry
;
......@@ -1575,7 +1575,7 @@ not_empty_client_class_params: client_class_param
client_class_param: client_class_name
| client_class_test
| eval_on_demand
| only_if_required
| option_def_list
| option_data_list
| next_server
......@@ -1594,9 +1594,9 @@ client_class_test: TEST {
ctx.leave();
};
eval_on_demand: EVAL_ON_DEMAND COLON BOOLEAN {
only_if_required: ONLY_IF_REQUIRED COLON BOOLEAN {
ElementPtr b(new BoolElement($3, ctx.loc2pos(@3)));
ctx.stack_.back()->set("eval-on-demand", b);
ctx.stack_.back()->set("only-if-required", b);
};
// --- end of client classes ---------------------------------
......
// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2011-2018 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
......@@ -2340,8 +2340,8 @@ Dhcpv4Srv::processDiscover(Pkt4Ptr& discover) {
if (!ex.getResponse()->getYiaddr().isV4Zero()) {
// Assign reserved classes.
ex.setReservedClientClasses();
// Late classification
lateClassify(ex);
// Required classification
requiredClassify(ex);
buildCfgOptionList(ex);
appendRequestedOptions(ex);
......@@ -2397,8 +2397,8 @@ Dhcpv4Srv::processRequest(Pkt4Ptr& request) {
if (!ex.getResponse()->getYiaddr().isV4Zero()) {
// Assign reserved classes.
ex.setReservedClientClasses();
// Late classification
lateClassify(ex);
// Required classification
requiredClassify(ex);
buildCfgOptionList(ex);
appendRequestedOptions(ex);
......@@ -2683,7 +2683,7 @@ Dhcpv4Srv::processInform(Pkt4Ptr& inform) {
Pkt4Ptr ack = ex.getResponse();
ex.setReservedClientClasses();
lateClassify(ex);
requiredClassify(ex);
buildCfgOptionList(ex);
appendRequestedOptions(ex);
......@@ -2986,8 +2986,8 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) {
if (!expr_ptr) {
continue;
}
// Not the right time if on demand
if ((*it)->getOnDemand()) {
// Not the right time if only when required
if ((*it)->getRequired()) {
continue;
}
// Evaluate the expression which can return false (no match),
......@@ -3017,8 +3017,8 @@ void Dhcpv4Srv::classifyPacket(const Pkt4Ptr& pkt) {
}
}
void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) {
// First collect on-demand classes
void Dhcpv4Srv::requiredClassify(Dhcpv4Exchange& ex) {
// First collect required classes
Pkt4Ptr query = ex.getQuery();
ClientClasses classes = query->getClasses(true);
Subnet4Ptr subnet = ex.getContext()->subnet_;
......@@ -3028,7 +3028,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) {
SharedNetwork4Ptr network;
subnet->getSharedNetwork(network);
if (network) {
const ClientClasses& to_add = network->getOnDemandClasses();
const ClientClasses& to_add = network->getRequiredClasses();
for (ClientClasses::const_iterator cclass = to_add.cbegin();
cclass != to_add.cend(); ++cclass) {
classes.insert(*cclass);
......@@ -3036,7 +3036,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) {
}
// Followed by the subnet
const ClientClasses& to_add = subnet->getOnDemandClasses();
const ClientClasses& to_add = subnet->getRequiredClasses();
for(ClientClasses::const_iterator cclass = to_add.cbegin();
cclass != to_add.cend(); ++cclass) {
classes.insert(*cclass);
......@@ -3051,7 +3051,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) {
if (!addr.isV4Zero()) {
PoolPtr pool = subnet->getPool(Lease::TYPE_V4, addr, false);
if (pool) {
const ClientClasses& to_add = pool->getOnDemandClasses();
const ClientClasses& to_add = pool->getRequiredClasses();
for (ClientClasses::const_iterator cclass = to_add.cbegin();
cclass != to_add.cend(); ++cclass) {
classes.insert(*cclass);
......@@ -3070,7 +3070,7 @@ void Dhcpv4Srv::lateClassify(Dhcpv4Exchange& ex) {
cclass != classes.cend(); ++cclass) {
const ClientClassDefPtr class_def = dict->findClass(*cclass);
if (!class_def) {
LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNKNOWN)
LOG_DEBUG(dhcp4_logger, DBG_DHCP4_BASIC, DHCP4_CLASS_UNDEFINED)
.arg(*cclass);
continue;
}
......
// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2011-2018 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
......@@ -803,17 +803,17 @@ protected:
/// @param pkt packet to be classified
void classifyPacket(const Pkt4Ptr& pkt);
/// @brief Assigns incoming packet to zero or more classes (late pass).
/// @brief Assigns incoming packet to zero or more classes (required pass).
///
/// @note This late classification evaluates all classes which
/// were marked for this deferred/on-demand pass. Classes are
/// collected in the reversed order than output option processing.
/// @note This required classification evaluates all classes which
/// were marked for required evaluation. Classes are collected so
/// evaluated in the reversed order than output option processing.
///
/// @note The eval-on-demand flag is related because it avoids
/// @note The only-if-required flag is related because it avoids
/// double evaluation (which is not forbidden).
///
/// @param ex The exchange holding needed informations.
void lateClassify(Dhcpv4Exchange& ex);
void requiredClassify(Dhcpv4Exchange& ex);
/// @brief Perform deferred option unpacking.
///
......
// Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
// Copyright (C) 2016-2018 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
......@@ -56,7 +56,7 @@ namespace {
/// or member(<last two>), set boot-file-name to pxelinux.0
///
/// - Configuration 3:
/// - Used for late/on-demand classification
/// - Used for required classification
/// - 1 subnet: 10.0.0.0/24
/// - 1 pool: 10.0.0.10-10.0.0.100
/// - the following classes defined:
......@@ -185,19 +185,19 @@ const char* CONFIGS[] = {
"{"
" \"name\": \"pxe1\","
" \"test\": \"option[93].hex == 0x0009\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"next-server\": \"1.2.3.4\""
"},"
"{"
" \"name\": \"pxe2\","
" \"test\": \"option[93].hex == 0x0007\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"server-hostname\": \"deneb\""
"},"
"{"
" \"name\": \"pxe3\","
" \"test\": \"option[93].hex == 0x0006\","
" \"eval-on-demand\": false,"
" \"only-if-required\": false,"
" \"boot-file-name\": \"pxelinux.0\""
"},"
"{"
......@@ -209,7 +209,7 @@ const char* CONFIGS[] = {
" \"subnet\": \"10.0.0.0/24\", "
" \"id\": 1,"
" \"pools\": [ { \"pool\": \"10.0.0.10-10.0.0.100\" } ],"
" \"eval-client-classes\": [ \"pxe2\" ]"
" \"required-client-classes\": [ \"pxe2\" ]"
" } ]"
"}"
......@@ -566,7 +566,7 @@ TEST_F(ClassifyTest, fixedFieldsInformNoClasses3) {
testFixedFields(CONFIGS[3], DHCPINFORM, OptionPtr(), "0.0.0.0", "", "");
}
// Class 'pxe1' is on-demand and not subject to late evaluation
// Class 'pxe1' is only-if-required and not subject to required evaluation
TEST_F(ClassifyTest, fixedFieldsDiscoverNextServer3) {
OptionPtr pxe(new OptionInt<uint16_t>(Option::V4, 93, 0x0009));
......@@ -584,7 +584,7 @@ TEST_F(ClassifyTest, fixedFieldsInformNextServer3) {
}
// Class pxe2 is on-demand but the subnet requests its late evaluation
// Class pxe2 is only-if-required but the subnet requires its evaluation
TEST_F(ClassifyTest, fixedFieldsDiscoverHostname3) {
OptionPtr pxe(new OptionInt<uint16_t>(Option::V4, 93, 0x0007));
......@@ -633,7 +633,7 @@ TEST_F(ClassifyTest, fixedFieldsInformFile32) {
testFixedFields(CONFIGS[3], DHCPINFORM, pxe, "0.0.0.0", "", "ipxe.efi");
}
// This test checks the precedence order in requested late evaluation.
// This test checks the precedence order in required evaluation.
// This order is: shared-network > subnet > pools
TEST_F(ClassifyTest, precedenceNone) {
std::string config =
......@@ -650,7 +650,7 @@ TEST_F(ClassifyTest, precedenceNone) {
" {"
" \"name\": \"for-pool\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.1\""
......@@ -659,7 +659,7 @@ TEST_F(ClassifyTest, precedenceNone) {
" {"
" \"name\": \"for-subnet\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.2\""
......@@ -668,7 +668,7 @@ TEST_F(ClassifyTest, precedenceNone) {
" {"
" \"name\": \"for-network\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.3\""
......@@ -705,7 +705,7 @@ TEST_F(ClassifyTest, precedenceNone) {
EXPECT_FALSE(opt);
}
// This test checks the precedence order in requested late evaluation.
// This test checks the precedence order in required evaluation.
// This order is: shared-network > subnet > pools
TEST_F(ClassifyTest, precedencePool) {
std::string config =
......@@ -722,7 +722,7 @@ TEST_F(ClassifyTest, precedencePool) {
" {"
" \"name\": \"for-pool\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.1\""
......@@ -731,7 +731,7 @@ TEST_F(ClassifyTest, precedencePool) {
" {"
" \"name\": \"for-subnet\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.2\""
......@@ -740,7 +740,7 @@ TEST_F(ClassifyTest, precedencePool) {
" {"
" \"name\": \"for-network\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.3\""
......@@ -754,7 +754,7 @@ TEST_F(ClassifyTest, precedencePool) {
" \"id\": 1,"
" \"pools\": [ { "
" \"pool\": \"10.0.0.10-10.0.0.100\","
" \"eval-client-classes\": [ \"for-pool\" ]"
" \"required-client-classes\": [ \"for-pool\" ]"
" } ]"
" } ]"
"} ]"
......@@ -784,7 +784,7 @@ TEST_F(ClassifyTest, precedencePool) {
EXPECT_EQ("10.0.0.1", addrs[0].toText());
}
// This test checks the precedence order in requested late evaluation.
// This test checks the precedence order in required evaluation.
// This order is: shared-network > subnet > pools
TEST_F(ClassifyTest, precedenceSubnet) {
std::string config =
......@@ -801,7 +801,7 @@ TEST_F(ClassifyTest, precedenceSubnet) {
" {"
" \"name\": \"for-pool\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.1\""
......@@ -810,7 +810,7 @@ TEST_F(ClassifyTest, precedenceSubnet) {
" {"
" \"name\": \"for-subnet\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.2\""
......@@ -819,7 +819,7 @@ TEST_F(ClassifyTest, precedenceSubnet) {
" {"
" \"name\": \"for-network\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.3\""
......@@ -831,10 +831,10 @@ TEST_F(ClassifyTest, precedenceSubnet) {
" \"subnet4\": [ { "
" \"subnet\": \"10.0.0.0/24\","
" \"id\": 1,"
" \"eval-client-classes\": [ \"for-subnet\" ],"
" \"required-client-classes\": [ \"for-subnet\" ],"
" \"pools\": [ { "
" \"pool\": \"10.0.0.10-10.0.0.100\","
" \"eval-client-classes\": [ \"for-pool\" ]"
" \"required-client-classes\": [ \"for-pool\" ]"
" } ]"
" } ]"
"} ]"
......@@ -864,7 +864,7 @@ TEST_F(ClassifyTest, precedenceSubnet) {
EXPECT_EQ("10.0.0.2", addrs[0].toText());
}
// This test checks the precedence order in requested late evaluation.
// This test checks the precedence order in required evaluation.
// This order is: shared-network > subnet > pools
TEST_F(ClassifyTest, precedenceNetwork) {
std::string config =
......@@ -881,7 +881,7 @@ TEST_F(ClassifyTest, precedenceNetwork) {
" {"
" \"name\": \"for-pool\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.1\""
......@@ -890,7 +890,7 @@ TEST_F(ClassifyTest, precedenceNetwork) {
" {"
" \"name\": \"for-subnet\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","
" \"data\": \"10.0.0.2\""
......@@ -899,7 +899,7 @@ TEST_F(ClassifyTest, precedenceNetwork) {
" {"
" \"name\": \"for-network\","
" \"test\": \"member('all')\","
" \"eval-on-demand\": true,"
" \"only-if-required\": true,"
" \"option-data\": [ {"
" \"name\": \"domain-name-servers\","