"name": "late",
// Boolean flag indicating whether the class expression is only evaluated
- // when the class is required, e.g. the selected address pool configuration
- // includes this class name in its "require-client-classes" list. The
+ // when the selected configuration (i.e. pool, subnet, shared-network)
+ // includes this class name in its "evaluate-additional-classes" list. The
// default value false means that the class test expression must
// always be evaluated.
- "only-if-required": true,
+ "only-in-additional-list": true,
// Class selection expression.
"test": "member('ALL')"
// to use for the DNS TTL.
"ddns-ttl-percent": 0.75,
+ // When greater than 0 it will be used as the DNS TTL. Specified in seconds.
+ // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+ // ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // When greater than 0 it used as the lower boundary for calculated DNS TTL values.
+ // Specified in seconds.
+ "ddns-ttl-min": 24000,
+
+ // When greater than 0 it used as the upper boundary for calculated DNS TTL values.
+ // Specified in seconds.
+ "ddns-ttl-max": 64000,
+
// Time in seconds specifying how long a declined lease should be
// excluded from DHCP assignments. The default value is 86400 (24 hours).
"decline-probation-period": 86400,
// requested.
"always-send": false,
+ // An optional list of classes for which this option applies.
+ // If the the client matches any of the classes in this list the
+ // option will be applied. If the list is empty or is
+ // omitted this option will be applied regardless of class
+ // membership.
+ "client-classes": [ "class1", "class2" ],
+
// Option code. It is not required if the option name is
// provided.
"code": 6,
"boot-file-name": "/dev/null",
// Restricts this shared network to allow only clients
- // that belong to a particular client class. If an
- // empty string is provided, no restriction is applied.
- "client-class": "",
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [],
// Shared-network level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Shared-network level value. See description at the global level.
"ddns-ttl-percent": 0.65,
+ // Shared-network level value. See description at the global level.
+ // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+ // ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // Shared-network level value. See description at the global level.
+ "ddns-ttl-min": 10000,
+
+ // Shared-network level value. See description at the global level.
+ "ddns-ttl-max": 20000,
+
// Shared-network level value. See description at the global level.
"hostname-char-replacement": "x",
// List of client classes which must be evaluated when this shared
// network is selected for client assignments.
- "require-client-classes": [ "late" ],
+ "evaluate-additional-classes": [ "late" ],
// Turn off storage of extended information (e.g. relay agent
// information) with each lease for this shared network.
// Subnet-level bootfile name, set in 'file' field.
"boot-file-name": "",
- // Restricts this subnet to allow only clients that belong
- // to a particular client class. If an empty string is
- // provided, no restriction is applied.
- "client-class": "",
+ // Restricts this subnet to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [],
// Subnet-level value. See description at the global level.
"ddns-generated-prefix": "myhost",
"ddns-conflict-resolution-mode": "check-with-dhcid",
// Subnet-level value. See description at the global level.
- "ddns-ttl-percent": 0.55,
+ // "ddns-ttl-percent": 0.55,
+
+ // Subnet-level value. See description at the global level.
+ // You cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min, or
+ // ddns-ttl-max. They are mutually exclusive.
+ "ddns-ttl": 500,
+
+ // Subnet-evel value. See description at the global level.
+ // "ddns-ttl-min": 10000,
+
+ // Subnet-level value. See description at the global level.
+ // "ddns-ttl-max": 20000,
// Subnet-level value. See description at the global level.
"hostname-char-replacement": "x",
// should be always sent or sent only when requested.
"always-send": false,
+ // An optional list of classes for which this option applies.
+ // If the the client matches any of the classes in this list the
+ // option will be applied. If the list is empty or is
+ // omitted this option will be applied regardless of class
+ // membership.
+ "client-classes": [],
+
// Option code.
"code": 3,
// List of IP address pools belonging to the subnet.
"pools": [
{
- // Restricts this pool to only be used for client
- // requests belonging to a particular client class.
- "client-class": "phones_server1",
+ // Restricts this pool to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [ "phones_server1" ],
// Pool-level list of DHCP options.
"option-data": [],
// List of client classes which must be evaluated when this pool
// is selected for client assignments.
- "require-client-classes": [ "late" ]
+ "evaluate-additional-classes": [ "late" ],
+
+ // Pool-level value. See description at the global level.
+ "ddns-generated-prefix": "mypool",
+
+ // Pool-level value. See description at the global level.
+ "ddns-override-client-update": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-override-no-update": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-qualifying-suffix": "pool.example.com.",
+
+ // Pool-level value. See description at the global level.
+ "ddns-replace-client-name": "always",
+
+ // Pool-level value. See description at the global level.
+ "ddns-send-updates": true,
+
+ // Pool-level value. See description at the global level.
+ "ddns-update-on-renew": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-conflict-resolution-mode": "check-with-dhcid",
+
+ // Pool-level value. See description at the global level.
+ "ddns-ttl-percent": 0.55,
+
+ // Pool-level value. See description at the global level.
+ // You cannot specify both ddns-ttl and any of ddns-ttl-percent,
+ // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // Pool-evel value. See description at the global level.
+ "ddns-ttl-min": 10000,
+
+ // Pool-level value. See description at the global level.
+ "ddns-ttl-max": 20000,
+
+ // Pool-level value. See description at the global level.
+ "hostname-char-replacement": "x",
+
+ // Pool-level value. See description at the global level.
+ "hostname-char-set": "[^A-Za-z0-9.-]"
},
{
- // Restricts this pool to only be used for client
- // requests belonging to a particular client class.
- "client-class": "phones_server2",
+ // Restricts this pool to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [ "phones_server2" ],
// Pool-level list of DHCP options.
"option-data": [],
// List of client classes which must be evaluated when this pool
// is selected for client assignments.
- "require-client-classes": [],
+ "evaluate-additional-classes": [],
// Pool identifier used to enable statistics for this pool.
// The pool ID does not need to be unique within the subnet
// List of client classes which must be evaluated when this subnet
// is selected for client assignments.
- "require-client-classes": [ "late" ],
+ "evaluate-additional-classes": [ "late" ],
// Subnet-level server hostname set in 'sname' field.
"server-hostname": "",
// list of parameters supported by the Kea DHCPv6 server along with the brief
// description of each parameter.
//
-// This stable version is used for YANG as we do not want to update code
+// This stable version is used for YANG, as we do not want to update code
// and models each time a keyword is added to the syntax.
{
// Kea DHCPv6 server configuration begins here.
// Boolean flag indicating whether the class expression is only evaluated
// when the class is required, e.g. the selected address pool configuration
- // includes this class name in its "require-client-classes" list. The
+ // includes this class name in its "evaluate-additional-classes" list. The
// default value false means that the class test expression must
// always be evaluated.
- "only-if-required": true,
+ "only-in-additional-list": true,
// Class selection expression.
"test": "member('ALL')"
// Command control socket configuration parameters for the Kea DHCPv6 server.
"control-socket": {
- // Location of the UNIX domain socket file the DHCPv6 server uses
+ // Location of the UNIX domain socket file the DHCPv4 server uses
// to receive control commands from the Kea Control Agent or the
// local server administrator.
"socket-name": "kea6-ctrl-socket",
- // Control socket type used by the Kea DHCPv6 server. The 'unix'
+ // Control socket type used by the Kea DHCPv4 server. The 'unix'
// socket is currently the only supported type.
"socket-type": "unix"
},
// to use for the DNS TTL.
"ddns-ttl-percent": 0.75,
+ // When greater than 0 it will be used as the DNS TTL. Specified in seconds.
+ // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+ // ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // When greater than 0 it used as the lower boundary for calculated DNS TTL values.
+ // Specified in seconds.
+ "ddns-ttl-min": 24000,
+
+ // When greater than 0 it used as the upper boundary for calculated DNS TTL values.
+ // Specified in seconds.
+ "ddns-ttl-max": 64000,
+
// Time in seconds specifying how long a declined lease should be
// excluded from DHCP assignments. The default value is 24 hours.
"decline-probation-period": 86400,
// requested.
"always-send": false,
+ // An optional list of classes for which this option applies.
+ // If the the client matches any of the classes in this list the
+ // option will be applied. If the list is empty or is
+ // omitted this option will be applied regardless of class
+ // membership.
+ "client-classes": [ "class1", "class2" ],
+
// Option code. It is not required if the option name is
// provided.
"code": 23,
"pd-allocator": "iterative",
// Restricts this shared network to allow only clients
- // that belong to a particular client class. If an
- // empty string is provided, no restriction is applied.
- "client-class": "",
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [],
// Shared-network level value. See description at the global level.
"ddns-generated-prefix": "myhost",
// Shared-network level value. See description at the global level.
"ddns-ttl-percent": 0.65,
+ // Shared-network level value. See description at the global level.
+ // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+ // ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // Shared-network level value. See description at the global level.
+ "ddns-ttl-min": 10000,
+
+ // Shared-network level value. See description at the global level.
+ "ddns-ttl-max": 20000,
+
// Shared-network level value. See description at the global level.
"hostname-char-replacement": "x",
// List of client classes which must be evaluated when this shared
// network is selected for client assignments.
- "require-client-classes": [ "late" ],
+ "evaluate-additional-classes": [ "late" ],
// Turn off storage of extended information (e.g. relay agent
// information) with each lease for this shared network.
// for the subnet.
"pd-allocator": "iterative",
- // Restricts this subnet to allow only clients that belong
- // to a particular client class. If an empty string is
- // provided, no restriction is applied.
- "client-class": "",
+ // Restricts this subnet to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [],
// Subnet-level value. See description at the global level.
"ddns-generated-prefix": "myhost",
"ddns-conflict-resolution-mode": "check-with-dhcid",
// Subnet-level value. See description at the global level.
- "ddns-ttl-percent": 0.55,
+ // "ddns-ttl-percent": 0.55,
+
+ // "ddns-ttl": 0,
+ // Cannot specify both ddns-ttl and any of ddns-ttl-percent, ddns-ttl-min or
+ // ddns-ttl-max. They are mutually exclusive.
+ "ddns-ttl": 500,
+
+ // Subnet-evel value. See description at the global level.
+ // "ddns-ttl-min": 10000,
+
+ // Subnet-level value. See description at the global level.
+ // "ddns-ttl-max": 20000,
// Subnet-level value. See description at the global level.
"hostname-char-replacement": "x",
// should be always sent or sent only when requested.
"always-send": false,
+ // An optional list of classes for which this option applies.
+ // If the the client matches any of the classes in this list the
+ // option will be applied. If the list is empty or is
+ // omitted this option will be applied regardless of class
+ // membership.
+ "client-classes": [],
+
// Option code.
"code": 7,
// clients.
"pd-pools": [
{
- // Restricts this prefix pool to be used only for the client
- // requests belonging to a particular client class.
- "client-class": "phones_server1",
+ // Restricts this prefix pool subnet to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [ "phones_server1" ],
// Length of prefixes delegated to clients.
"delegated-len": 64,
// List of client classes which must be evaluated
// when this prefix pool is selected for client assignments.
- "require-client-classes": [],
+ "evaluate-additional-classes": [],
// PD-pool identifier used to enable statistics for this pd-pool.
// The pd-pool ID does not need to be unique within the subnet
// List of IP address pools belonging to the subnet.
"pools": [
{
- // Restricts this pool to only be used for client
- // requests belonging to a particular client class.
- "client-class": "phones_server1",
+ // Restricts this pool subnet to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [ "phones_server1" ],
// Pool-level list of DHCP options.
"option-data": [],
// List of client classes which must be evaluated when this pool
// is selected for client assignments.
- "require-client-classes": [ "late" ]
+ "evaluate-additional-classes": [ "late" ],
+
+ // Pool-level value. See description at the global level.
+ "ddns-generated-prefix": "mypool",
+
+ // Pool-level value. See description at the global level.
+ "ddns-override-client-update": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-override-no-update": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-qualifying-suffix": "pool.example.com.",
+
+ // Pool-level value. See description at the global level.
+ "ddns-replace-client-name": "always",
+
+ // Pool-level value. See description at the global level.
+ "ddns-send-updates": true,
+
+ // Pool-level value. See description at the global level.
+ "ddns-update-on-renew": false,
+
+ // Pool-level value. See description at the global level.
+ "ddns-conflict-resolution-mode": "check-with-dhcid",
+
+ // Pool-level value. See description at the global level.
+ "ddns-ttl-percent": 0.55,
+
+ // Pool-level value. See description at the global level.
+ // You cannot specify both ddns-ttl and any of ddns-ttl-percent,
+ // ddns-ttl-min, or ddns-ttl-max. They are mutually exclusive.
+ // "ddns-ttl": 500,
+
+ // Pool-evel value. See description at the global level.
+ "ddns-ttl-min": 10000,
+
+ // Pool-level value. See description at the global level.
+ "ddns-ttl-max": 20000,
+
+ // Pool-level value. See description at the global level.
+ "hostname-char-replacement": "x",
+
+ // Pool-level value. See description at the global level.
+ "hostname-char-set": "[^A-Za-z0-9.-]"
},
{
- // Restricts this pool to only be used for client
- // requests belonging to a particular client class.
- "client-class": "phones_server2",
+ // Restricts this pool subnet to allow only clients
+ // that belong to at least one class in this list. If omitted
+ // or an empty list is provided, no restriction is applied.
+ "client-classes": [ "phones_server2" ],
// Pool-level list of DHCP options.
"option-data": [],
// List of client classes which must be evaluated when this pool
// is selected for client assignments.
- "require-client-classes": [],
+ "evaluate-additional-classes": [],
// Pool identifier used to enable statistics for this pool.
// The pool ID does not need to be unique within the subnet
// List of reserved IPv6 prefixes.
"prefixes": [ "2001:db8:2:abcd::/64" ],
+ // List of excluded IPv6 prefixes.
+ "excluded-prefixes": [ "2001:db8:2:abcd:1::/80" ],
+
// Reserved hostname.
"hostname": "foo.example.com",
// List of client classes which must be evaluated when this subnet
// is selected for client assignments.
- "require-client-classes": [ "late" ],
+ "evaluate-additional-classes": [ "late" ],
// Subnet prefix.
"subnet": "2001:db8::/32",
"id": 1,
"pools": [ { "pool": "2001:db8:1::/80" } ],
"subnet": "2001:db8:1::/64",
- "client-class": "cable-modems",
+ "client-classes": [ "cable-modems" ],
"interface": "eth0"
},
"pools": [
{
"pool": "2001:db8:4::/80",
- "client-class": "cable-modems"
+ "client-classes": [ "cable-modems" ]
} ],
"subnet": "2001:db8:4::/64",
"interface": "eth1"
"id": 1,
"pools": [ { "pool": "2001:db8:1::/80" } ],
"subnet": "2001:db8:1::/64",
- "client-class": "cable-modems",
+ "client-classes": [ "cable-modems" ],
"interface": "eth0"
},
// The following subnet contains a class reservation for a client using
"pools": [
{
"pool": "2001:db8:4::/80",
- "client-class": "cable-modems"
+ "client-classes": [ "cable-modems" ]
} ],
"subnet": "2001:db8:4::/64",
"interface": "eth1"
"pools": [
{
"pool": "2001:db8:8::/64",
- "client-class": "UNKNOWN"
+ "client-classes": [ "UNKNOWN" ]
},
{
"pool": "2001:db8:9::/64",
- "client-class": "KNOWN"
+ "client-classes": [ "KNOWN" ]
}
],
"subnet": "2001:db8:8::/46",
}
return (s + " }");
};
+ // Remove deprecated parameters. This needs to be done because even though
+ // they are supported, examples are loaded by yang tests also and they don't
+ // support both old and new syntax.
+ ASSERT_EQ(syntax_keys.erase("client-class"), 1);
+ ASSERT_EQ(syntax_keys.erase("only-if-required"), 1);
+ ASSERT_EQ(syntax_keys.erase("require-client-classes"), 1);
EXPECT_EQ(syntax_keys, sample_keys)
<< "syntax has: " << print_keys(syntax_keys) << endl
<< "sample has: " << print_keys(sample_keys) << endl;
}
return (s + " }");
};
+ // Remove deprecated parameters. This needs to be done because even though
+ // they are supported, examples are loaded by yang tests also and they don't
+ // support both old and new syntax.
+ ASSERT_EQ(syntax_keys.erase("client-class"), 1);
+ ASSERT_EQ(syntax_keys.erase("only-if-required"), 1);
+ ASSERT_EQ(syntax_keys.erase("require-client-classes"), 1);
EXPECT_EQ(syntax_keys, sample_keys)
<< "syntax has: " << print_keys(syntax_keys) << endl
<< "sample has: " << print_keys(sample_keys) << endl;
ElementPtr option = options->getNonConst(i);
setSpace(option, space);
setCode(option, codes);
+ ConstElementPtr classes = option->get("client-classes");
+ if (classes && classes->empty()) {
+ option->remove("client-classes");
+ }
}
}
}
void
-AdaptorConfig::sanitizeRequireClassesPools(ConstElementPtr pools) {
+AdaptorConfig::sanitizeEmptyListPools(ConstElementPtr pools) {
if (!pools || pools->empty()) {
// nothing to do here.
return;
for (size_t i = 0; i < pools->size(); ++i) {
ElementPtr pool = pools->getNonConst(i);
- ConstElementPtr require = pool->get("require-client-classes");
+ ConstElementPtr require = pool->get("evaluate-additional-classes");
if (require && require->empty()) {
- pool->remove("require-client-classes");
+ pool->remove("evaluate-additional-classes");
+ }
+ ConstElementPtr classes = pool->get("client-classes");
+ if (classes && classes->empty()) {
+ pool->remove("client-classes");
}
}
}
void
-AdaptorConfig::sanitizeRequireClassesSubnets(ConstElementPtr subnets) {
+AdaptorConfig::sanitizeEmptyListSubnets(ConstElementPtr subnets) {
if (!subnets || subnets->empty()) {
// nothing to do here.
return;
for (size_t i = 0; i < subnets->size(); ++i) {
ElementPtr subnet = subnets->getNonConst(i);
- sanitizeRequireClassesPools(subnet->get("pools"));
- sanitizeRequireClassesPools(subnet->get("pd-pools"));
- ConstElementPtr require = subnet->get("require-client-classes");
+ sanitizeEmptyListPools(subnet->get("pools"));
+ sanitizeEmptyListPools(subnet->get("pd-pools"));
+ ConstElementPtr require = subnet->get("evaluate-additional-classes");
if (require && require->empty()) {
- subnet->remove("require-client-classes");
+ subnet->remove("evaluate-additional-classes");
+ }
+ ConstElementPtr classes = subnet->get("client-classes");
+ if (classes && classes->empty()) {
+ subnet->remove("client-classes");
}
}
}
void
-AdaptorConfig::requireClassesSharedNetworks(ConstElementPtr networks,
- const string& subsel) {
+AdaptorConfig::sanitizeEmptyListSharedNetworks(ConstElementPtr networks,
+ const string& subsel) {
if (!networks || networks->empty()) {
// nothing to do here.
return;
for (size_t i = 0; i < networks->size(); ++i) {
ElementPtr network = networks->getNonConst(i);
- sanitizeRequireClassesSubnets(network->get(subsel));
- ConstElementPtr require = network->get("require-client-classes");
+ sanitizeEmptyListSubnets(network->get(subsel));
+ ConstElementPtr require = network->get("evaluate-additional-classes");
if (require && require->empty()) {
- network->remove("require-client-classes");
+ network->remove("evaluate-additional-classes");
+ }
+ ConstElementPtr classes = network->get("client-classes");
+ if (classes && classes->empty()) {
+ network->remove("client-classes");
}
}
}
sanitizeRelaySubnets(subnets);
sanitizeRelayInSharedNetworks(networks, subsel);
- sanitizeRequireClassesSubnets(subnets);
- requireClassesSharedNetworks(networks, subsel);
+ sanitizeEmptyListSubnets(subnets);
+ sanitizeEmptyListSharedNetworks(networks, subsel);
sanitizeDatabase(dhcp);
const std::string& space,
const OptionCodes& codes);
- /// @brief Process require client classes in a pool list.
+ /// @brief Process empty lists in a pool list.
///
- /// Remove empty require client class list.
+ /// Remove empty lists in a pool list.
+ /// removing:
+ /// - evaluate-additional-classes
+ /// - client-classes
///
/// @param pools The pool list.
- static void sanitizeRequireClassesPools(isc::data::ConstElementPtr pools);
+ static void sanitizeEmptyListPools(isc::data::ConstElementPtr pools);
- /// @brief Process require client classes in a subnet list.
+ /// @brief Process empty lists in a subnet list.
///
- /// Remove empty require client class lists.
+ /// Remove empty lists in a subnet list.
+ /// removing:
+ /// - evaluate-additional-classes
+ /// - client-classes
///
/// @param subnets The subnet list.
- static void sanitizeRequireClassesSubnets(isc::data::ConstElementPtr subnets);
+ static void sanitizeEmptyListSubnets(isc::data::ConstElementPtr subnets);
- /// @brief Process require client classes in a shared network list.
+ /// @brief Process empty lists in a shared-network list.
///
- /// Remove empty require client class lists.
+ /// Remove empty lists in a shared network list.
+ /// removing:
+ /// - evaluate-additional-classes
+ /// - client-classes
///
/// @param networks The shared network list.
/// @param subsel The subnet list name.
- static void requireClassesSharedNetworks(isc::data::ConstElementPtr networks,
- const std::string& subsel);
+ static void sanitizeEmptyListSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& subsel);
/// @brief Process host reservation list.
///
tc.setConfig(json);
}
- /// @brief Load a cofiguration from a string containing JSON.
+ /// @brief Load a configuration from a string containing JSON.
///
/// @param config The JSON tree to load in textual format.
void load(const string& config) {
"all-keys-netconf.json",
"all-options.json",
"backends.json",
- //"classify.json",
- //"classify2.json",
+ "classify.json",
+ "classify2.json",
//"comments.json",
"config-backend.json",
"dhcpv4-over-dhcpv6.json",
"global-reservations.json",
- //"ha-load-balancing-server1-mt-with-tls.json",
- //"ha-load-balancing-server2-mt.json",
+ "ha-load-balancing-server1-mt-with-tls.json",
+ "ha-load-balancing-server2-mt.json",
"hooks.json",
//"hooks-radius.json",
"leases-expiration.json",
"single-subnet.json",
"vendor-specific.json",
"vivso.json",
- //"with-ddns.json",
+ "with-ddns.json",
};
for (auto const& file : examples) {
resetSession();
"all-options.json",
"backends.json",
"classify.json",
- //"classify2.json",
+ "classify2.json",
//"comments.json",
"config-backend.json",
"dhcpv4-over-dhcpv6.json",
"softwire46.json",
"stateless.json",
"tee-times.json",
- //"with-ddns.json",
+ "with-ddns.json",
};
for (auto const& file : examples) {
resetSession();
ElementPtr cclass = Element::createMap();
cclass->set("name", Element::create("foo"));
cclass->set("test", Element::create("''==''"));
- cclass->set("only-if-required", Element::create(false));
+ cclass->set("only-in-additional-list", Element::create(false));
classes->add(cclass);
EXPECT_NO_THROW_LOG(translator_->setClasses(xpath, classes));
checkAndGetLeaf(result, data_node, "max-valid-lifetime");
checkAndGetLeaf(result, data_node, "min-valid-lifetime");
- checkAndGetLeaf(result, data_node, "only-if-required");
+ checkAndGetLeaf(result, data_node, "only-in-additional-list");
checkAndGetLeaf(result, data_node, "template-test");
checkAndGetLeaf(result, data_node, "test");
checkAndGetLeaf(result, data_node, "valid-lifetime");
checkAndSetLeaf(elem, xpath, "max-valid-lifetime", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "min-valid-lifetime", LeafBaseType::Uint32);
- checkAndSetLeaf(elem, xpath, "only-if-required", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "only-in-additional-list", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "template-test", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "test", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
/// {
/// "name": <name>,
/// "test": <test expression>,
-/// "only-if-required": <only if required flag>,
+/// "only-in-additional-list": <only in additional list flag>,
/// "option-data": <option data list>,
/// (DHCPv4 only)
/// "option-def": <option definition list>,
/// YANG syntax for kea-dhcp[46] is with the name as the list key:
/// @code
/// +--rw client-class* [name]
-/// +--rw name string
-/// +--rw test? string
-/// +--rw only-if-required? boolean
+/// +--rw name string
+/// +--rw test? string
+/// +--rw only-in-additional-list? boolean
/// +--rw option-def* [code space]
/// +--rw option-data* [code space]
-/// +--rw next-server? inet:ipv4-address
-/// +--rw server-hostname? string
-/// +--rw boot-file-name? string
-/// +--rw valid-lifetime? uint32
-/// +--rw min-valid-lifetime? uint32
-/// +--rw max-valid-lifetime? uint32
-/// +--rw user-context? user-context
+/// +--rw next-server? inet:ipv4-address
+/// +--rw server-hostname? string
+/// +--rw boot-file-name? string
+/// +--rw valid-lifetime? uint32
+/// +--rw min-valid-lifetime? uint32
+/// +--rw max-valid-lifetime? uint32
+/// +--rw user-context? user-context
/// @endcode
///
/// An example in JSON and YANG formats:
/// {
/// "name": "foo",
/// "test": "''==''",
-/// "only-if-required": false
+/// "only-in-additional-list": false
/// }
/// ]
/// @endcode
/// /kea-dhcp6-server:config/client-class[name='foo'] (list instance)
/// /kea-dhcp6-server:config/client-class[name='foo']/name = foo
/// /kea-dhcp6-server:config/client-class[name='foo']/test = ''==''
-/// /kea-dhcp6-server:config/client-class[name='foo']/only-if-required = false
+/// /kea-dhcp6-server:config/client-class[name='foo']/only-in-additional-list = false
/// @endcode
/// @brief A translator class for converting a client class between
checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
checkAndGetLeaf(result, data_node, "ddns-send-updates");
checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+ checkAndGetLeaf(result, data_node, "ddns-ttl");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-max");
checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
} else {
checkAndGetLeaf(result, data_node, "ip-addresses");
checkAndGetLeaf(result, data_node, "prefixes");
+ checkAndGetLeaf(result, data_node, "excluded-prefixes");
}
return (result->empty() ? ElementPtr() : result);
} else {
checkAndSetLeafList(elem, xpath, "ip-addresses", LeafBaseType::String);
checkAndSetLeafList(elem, xpath, "prefixes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "excluded-prefixes", LeafBaseType::String);
}
// User context is supported in both kea-dhcp4-server and kea-dhcp6-server.
checkAndGetLeaf(result, data_node, "csv-format");
checkAndGetLeaf(result, data_node, "name");
checkAndGetLeaf(result, data_node, "never-send");
+ checkAndGetLeaf(result, data_node, "client-classes");
checkAndGetAndJsonifyLeaf(result, data_node, "user-context");
checkAndSetLeaf(elem, xpath, "csv-format", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "name", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "never-send", LeafBaseType::Bool);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
checkAndSetUserContext(elem, xpath);
}
getMandatoryDivergingLeaf(result, data_node, "prefix-len", "prefix-length");
checkAndGetLeaf(result, data_node, "preferred-lifetime");
- checkAndGetLeaf(result, data_node, "client-class");
+ checkAndGetLeaf(result, data_node, "client-classes");
checkAndGetLeaf(result, data_node, "valid-lifetime");
checkAndGetDivergingLeaf(result, data_node, "rebind-timer", "rebind-time");
checkAndGetDivergingLeaf(result, data_node, "renew-timer", "renew-time");
- // no require-client-classes nor user-context.
+ // no evaluate-additional-classes nor user-context.
// Skip max-pd-space-utilization.
// Skip rapid-commit.
// @todo: option-data
}
}
- checkAndGetLeaf(result, data_node, "client-class");
+ checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
+ checkAndGetLeaf(result, data_node, "ddns-override-client-update");
+ checkAndGetLeaf(result, data_node, "ddns-override-no-update");
+ checkAndGetLeaf(result, data_node, "ddns-qualifying-suffix");
+ checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
+ checkAndGetLeaf(result, data_node, "ddns-send-updates");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+ checkAndGetLeaf(result, data_node, "ddns-ttl");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-max");
+ checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
+ checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
+ checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
+ checkAndGetLeaf(result, data_node, "hostname-char-replacement");
+ checkAndGetLeaf(result, data_node, "hostname-char-set");
+ checkAndGetLeaf(result, data_node, "client-classes");
checkAndGetLeaf(result, data_node, "delegated-len");
- checkAndGetLeaf(result, data_node, "require-client-classes");
+ checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
checkAndGetLeaf(result, data_node, "pool-id");
setItem(xpath + "/prefix", Element::create(prefix.str()), LeafBaseType::String);
setItem(xpath + "/prefix-length", length, LeafBaseType::Uint8);
- checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "preferred-lifetime", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
// Keys are set by setting the list itself.
setItem(xpath, ElementPtr(), LeafBaseType::Unknown);
- checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "delegated-len", LeafBaseType::Uint8);
- checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-qualifying-suffix", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
+ checkAndSetLeaf(elem, xpath, "hostname-char-replacement", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "hostname-char-set", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "pool-id", LeafBaseType::Dec64);
/// "excluded-prefix": <excluded prefix>,
/// "excluded-prefix-len": <excluded prefix length>,
/// "option-data": [ <list of option data> ],
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "user-context": { <json map> },
/// "comment": "<comment>"
/// }
/// +--rw rebind-time yang:timeticks
/// +--rw preferred-lifetime yang:timeticks
/// +--rw rapid-commit? boolean
-/// +--rw client-class? string
+/// +--rw client-classes* string
/// +--rw max-pd-space-utilization? threshold
/// +--rw option-set-id?
/// /server/server-config/option-sets/option-set/option-set-id
/// YANG syntax for kea-dhcp6-server is with prefix as the key.
/// @code
/// +--rw pd-pool* [prefix]
-/// +--rw prefix inet:ipv6-prefix
-/// +--rw delegated-len? uint8
+/// +--rw prefix inet:ipv6-prefix
+/// +--rw delegated-len? uint8
/// +--rw option-data* [code space]
-/// +--rw client-class? string
-/// +--rw require-client-classes* string
-/// +--rw excluded-prefix? inet:ipv6-prefix
-/// +--rw user-context? user-context
+/// +--rw client-classes* string
+/// +--rw evaluate-additional-classes* string
+/// +--rw excluded-prefix? inet:ipv6-prefix
+/// +--rw user-context? user-context
/// @endcode
///
/// An example in JSON and YANG formats:
// Skip rapid-commit.
// Skip start-address - end-address as prefix form is mandatory?
// @todo: option-data
- // No require-client-classes.
+ // No evaluate-additional-classes.
// No user-context.
return (result->empty() ? ElementPtr() : result);
if (options) {
result->set("option-data", options);
}
-
- checkAndGetLeaf(result, data_node, "client-class");
- checkAndGetLeaf(result, data_node, "require-client-classes");
+ checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
+ checkAndGetLeaf(result, data_node, "ddns-override-client-update");
+ checkAndGetLeaf(result, data_node, "ddns-override-no-update");
+ checkAndGetLeaf(result, data_node, "ddns-qualifying-suffix");
+ checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
+ checkAndGetLeaf(result, data_node, "ddns-send-updates");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+ checkAndGetLeaf(result, data_node, "ddns-ttl");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-max");
+ checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
+ checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
+ checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
+ checkAndGetLeaf(result, data_node, "hostname-char-replacement");
+ checkAndGetLeaf(result, data_node, "hostname-char-set");
+
+ checkAndGetLeaf(result, data_node, "client-classes");
+ checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
checkAndGetLeaf(result, data_node, "pool-id");
// Keys are set by setting the list itself.
setItem(xpath, ElementPtr(), LeafBaseType::Unknown);
- checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
-
- checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-qualifying-suffix", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
+ checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
+ checkAndSetLeaf(elem, xpath, "hostname-char-replacement", LeafBaseType::String);
+ checkAndSetLeaf(elem, xpath, "hostname-char-set", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "pool-id", LeafBaseType::Dec64);
/// {
/// "pool": "<pool prefix or start - end addresses>",
/// "option-data": [ <list of option data> ],
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "user-context": { <json map> },
/// "comment": "<comment>"
/// }
/// +--rw rebind-time yang:timeticks
/// +--rw preferred-lifetime yang:timeticks
/// +--rw rapid-commit? boolean
-/// +--rw client-class? string
+/// +--rw client-classes* string
/// +--rw max-address-count threshold
/// +--rw option-set-id
/// /server/server-config/option-sets/option-set/option-set-id
/// as the keys:
/// @code
/// +--rw pool* [start-address end-address]
-/// +--rw prefix? inet:ipv[46]-prefix
-/// +--rw start-address inet:ipv[46]-address
-/// +--rw end-address inet:ipv[46]-address
+/// +--rw prefix? inet:ipv[46]-prefix
+/// +--rw start-address inet:ipv[46]-address
+/// +--rw end-address inet:ipv[46]-address
/// +--rw option-data* [code space]
-/// +--rw client-class? string
-/// +--rw require-client-classes* string
-/// +--rw user-context? user-context
+/// +--rw client-classes* string
+/// +--rw evaluate-additional-classes* string
+/// +--rw user-context? user-context
/// @endcode
///
/// An example in JSON and YANG formats for the IETF model:
checkAndGetLeaf(result, data_node, "cache-max-age");
checkAndGetLeaf(result, data_node, "cache-threshold");
checkAndGetLeaf(result, data_node, "calculate-tee-times");
- checkAndGetLeaf(result, data_node, "client-class");
+ checkAndGetLeaf(result, data_node, "client-classes");
checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
checkAndGetLeaf(result, data_node, "ddns-override-client-update");
checkAndGetLeaf(result, data_node, "ddns-override-no-update");
checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
checkAndGetLeaf(result, data_node, "ddns-send-updates");
checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+ checkAndGetLeaf(result, data_node, "ddns-ttl");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-max");
checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
checkAndGetLeaf(result, data_node, "min-valid-lifetime");
checkAndGetLeaf(result, data_node, "rebind-timer");
checkAndGetLeaf(result, data_node, "renew-timer");
- checkAndGetLeaf(result, data_node, "require-client-classes");
+ checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
checkAndGetLeaf(result, data_node, "reservations-global");
checkAndGetLeaf(result, data_node, "reservations-in-subnet");
checkAndGetLeaf(result, data_node, "reservations-out-of-pool");
checkAndSetLeaf(elem, xpath, "cache-max-age", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "cache-threshold", LeafBaseType::Dec64);
checkAndSetLeaf(elem, xpath, "calculate-tee-times", LeafBaseType::Bool);
- checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
checkAndSetLeaf(elem, xpath, "t2-percent", LeafBaseType::Dec64);
checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
- checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
checkAndSetUserContext(elem, xpath);
/// "t2-percent": <T2 percent>,
/// "option-data": [ <list of option data> ],
/// "interface": "<interface>",
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "relay": <relay ip address(es)>,
/// "match-client-id": <match client id flag>,
/// "next-server": "<next server>",
/// "interface": "<interface>",
/// "interface-id": "<interface id>",
/// "rapid-commit": <rapid commit flag>,
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "relay": <relay ip address(es)>,
/// "user-context": { <json map> },
/// "comment": "<comment>"
/// +--rw renew-timer? uint32
/// +--rw rebind-timer? uint32
/// +--rw option-data* [code space]
-/// +--rw client-class? string
-/// +--rw require-client-classes* string
+/// +--rw client-classes* string
+/// +--rw evaluate-additional-classes* string
/// +--rw valid-lifetime? uint32
/// +--rw min-valid-lifetime? uint32
/// +--rw max-valid-lifetime? uint32
checkAndGetLeaf(result, data_node, "cache-max-age");
checkAndGetLeaf(result, data_node, "cache-threshold");
checkAndGetLeaf(result, data_node, "calculate-tee-times");
- checkAndGetLeaf(result, data_node, "client-class");
+ checkAndGetLeaf(result, data_node, "client-classes");
checkAndGetLeaf(result, data_node, "ddns-generated-prefix");
checkAndGetLeaf(result, data_node, "ddns-override-client-update");
checkAndGetLeaf(result, data_node, "ddns-override-no-update");
checkAndGetLeaf(result, data_node, "ddns-replace-client-name");
checkAndGetLeaf(result, data_node, "ddns-send-updates");
checkAndGetLeaf(result, data_node, "ddns-ttl-percent");
+ checkAndGetLeaf(result, data_node, "ddns-ttl");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-min");
+ checkAndGetLeaf(result, data_node, "ddns-ttl-max");
checkAndGetLeaf(result, data_node, "ddns-update-on-renew");
checkAndGetLeaf(result, data_node, "ddns-use-conflict-resolution");
checkAndGetLeaf(result, data_node, "ddns-conflict-resolution-mode");
checkAndGetLeaf(result, data_node, "min-valid-lifetime");
checkAndGetLeaf(result, data_node, "rebind-timer");
checkAndGetLeaf(result, data_node, "renew-timer");
- checkAndGetLeaf(result, data_node, "require-client-classes");
+ checkAndGetLeaf(result, data_node, "evaluate-additional-classes");
checkAndGetLeaf(result, data_node, "reservations-global");
checkAndGetLeaf(result, data_node, "reservations-in-subnet");
checkAndGetLeaf(result, data_node, "reservations-out-of-pool");
checkAndSetLeaf(elem, xpath, "cache-max-age", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "cache-threshold", LeafBaseType::Dec64);
checkAndSetLeaf(elem, xpath, "calculate-tee-times", LeafBaseType::Bool);
- checkAndSetLeaf(elem, xpath, "client-class", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-generated-prefix", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-override-client-update", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-override-no-update", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-replace-client-name", LeafBaseType::String);
checkAndSetLeaf(elem, xpath, "ddns-send-updates", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-ttl-percent", LeafBaseType::Dec64);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-min", LeafBaseType::Uint32);
+ checkAndSetLeaf(elem, xpath, "ddns-ttl-max", LeafBaseType::Uint32);
checkAndSetLeaf(elem, xpath, "ddns-update-on-renew", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-use-conflict-resolution", LeafBaseType::Bool);
checkAndSetLeaf(elem, xpath, "ddns-conflict-resolution-mode", LeafBaseType::Enum);
checkAndSetLeaf(elem, xpath, "t2-percent", LeafBaseType::Dec64);
checkAndSetLeaf(elem, xpath, "valid-lifetime", LeafBaseType::Uint32);
- checkAndSetLeafList(elem, xpath, "require-client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "client-classes", LeafBaseType::String);
+ checkAndSetLeafList(elem, xpath, "evaluate-additional-classes", LeafBaseType::String);
ConstElementPtr options = elem->get("option-data");
if (options && !options->empty()) {
/// "subnet": "<subnet prefix>",
/// "interface": "<interface>",
/// "id": <id>,
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "reservations": [ <list of host reservations> ],
/// "relay": <relay ip address(es)>,
/// "match-client-id": <match client id flag>,
/// "interface-id": "<interface id>",
/// "id": <id>,
/// "rapid-commit": <rapid commit flag>,
-/// "client-class": "<guard class name>",
-/// "require-client-classes": [ <list of required class names> ],
+/// "client-classes": [ <list of guard class names> ],
+/// "evaluate-additional-classes": [ <list of evaluate additional class names> ],
/// "reservations": [ <list of host reservations> ],
/// "relay": <relay ip address(es)>,
/// "user-context": { <json map> },
/// +--rw subnet inet:ipv4-prefix
/// +--rw interface? string
/// +--rw id uint32
-/// +--rw client-class? string
-/// +--rw require-client-classes* string
+/// +--rw client-classes* string
+/// +--rw evaluate-additional-classes* string
/// +--rw host* [identifier-type identifier]
/// +--rw relay
/// +--rw cache-max-age? uint32
{ "ietf-dhcpv6-options", "2018-09-04" },
{ "ietf-dhcpv6-server", "2018-09-04" },
{ "kea-types", "2019-08-12" },
- { "kea-dhcp-types", "2024-05-29" },
- { "kea-dhcp4-server", "2024-05-29" },
- { "kea-dhcp6-server", "2024-05-29" },
+ { "kea-dhcp-types", "2025-06-25" },
+ { "kea-dhcp4-server", "2025-06-25" },
+ { "kea-dhcp6-server", "2025-06-25" },
{ "kea-ctrl-agent", "2019-08-12" },
{ "kea-dhcp-ddns", "2022-07-27" }
}; // YANG_REVISIONS
+++ /dev/null
-ed30e29cccb5c67db520704003a88e9a574e46f3579d3a20e651deefcbec33c7
--- /dev/null
+59fe3a0d6ee9a5a71e861908c559f5d34098f7443bc38601c439102a088b636c
+++ /dev/null
-57ef5ec1a319aa17b5440f60963ae208b69e7a12943c3bb8fff830df02bdfe23
--- /dev/null
+cf4f3382b9ba301f50593a1ccc277c8635225090e17af2dea75d09ad9c5d197b
+++ /dev/null
-aabb48a3bb003438297b8ce1600cfe068adc71accccaa6d711d32ed781afaaf9
--- /dev/null
+f7dd8cb1cd744d0533e7f3207d131b6305b083f2a7fe2aefd77b9e4598c2dbf8
description "This file defines some commonly used Kea DHCP types and
groupings.";
+ revision 2025-06-25 {
+ description "Renamed only-if-required to only-in-additional-list, renamed
+ require-client-classes to evaluate-additional-classes, removed
+ client-class and added client-classes list, and added ddns-ttl,
+ ddns-ttl-min, ddns-ttl-max.";
+ }
+
revision 2024-05-29 {
description "Removed qualifying-suffix, override-no-update,
override-client-update, replace-client-name, generated-prefix,
}
}
- grouping client-class {
- description "Client class grouping.";
- leaf client-class {
+ grouping client-classes {
+ description "Client classes grouping.";
+ leaf-list client-classes {
type string;
- description "Client class entry.";
+ description "List of client classes.";
+ }
+ }
+
+ grouping option-data-client-classes {
+ description "Client classes grouping for option data.";
+ uses client-classes {
+ refine client-classes {
+ description "Option data client classes guard (this option will be
+ assigned only to clients belonging to one of these classes).";
+ }
}
}
- grouping pool-client-class {
- description "Client class grouping for a pool.";
- uses client-class {
- refine client-class {
- description "Pool client class guard (only clients belonging
- to this class will be allowed in this pool).";
+ grouping pool-client-classes {
+ description "Client classes grouping for a pool.";
+ uses client-classes {
+ refine client-classes {
+ description "Pool client classes guard (only clients belonging
+ to one of these classes will be allowed in this pool).";
}
}
}
- grouping subnet-client-class {
- description "Client class grouping for a subnet.";
- uses client-class {
- refine client-class {
- description "Subnet client class guard (only clients belonging to this
- class will be allowed in this subnet).";
+ grouping subnet-client-classes {
+ description "Client classes grouping for a subnet.";
+ uses client-classes {
+ refine client-classes {
+ description "Subnet client classes guard (only clients belonging to one
+ of these classes will be allowed in this subnet).";
}
}
}
- grouping network-client-class {
- description "Client class grouping for a shared network.";
- uses client-class {
- refine client-class {
+ grouping network-client-classes {
+ description "Client classes grouping for a shared network.";
+ uses client-classes {
+ refine client-classes {
description "Shared network client class guard (only clients
- belonging to this class will be allowed in this
+ belonging to one of these classes will be allowed in this
shared network).";
}
}
}
- grouping require-client-classes {
- description "Require client classes grouping.";
- leaf-list require-client-classes {
+ grouping evaluate-additional-classes {
+ description "Evaluate additional client classes grouping.";
+ leaf-list evaluate-additional-classes {
type string;
description "List of client classes.";
}
}
- grouping pool-require-client-classes {
- description "Require client classes grouping for a pool.";
- uses require-client-classes {
- refine require-client-classes {
- description "Pool require client classes.";
+ grouping pool-evaluate-additional-classes {
+ description "Evaluate additional client classes grouping for a pool.";
+ uses evaluate-additional-classes {
+ refine evaluate-additional-classes {
+ description "Pool evaluate additional client classes.";
}
}
}
- grouping subnet-require-client-classes {
- description "Require client classes grouping for a subnet.";
- uses require-client-classes {
- refine require-client-classes {
- description "Subnet require client classes.";
+ grouping subnet-evaluate-additional-classes {
+ description "Evaluate additional client classes grouping for a subnet.";
+ uses evaluate-additional-classes {
+ refine evaluate-additional-classes {
+ description "Subnet evaluate additional client classes.";
}
}
}
- grouping network-require-client-classes {
- description "Require client classes grouping for a shared network.";
- uses require-client-classes {
- refine require-client-classes {
- description "Shared network require client classes.";
+ grouping network-evaluate-additional-classes {
+ description "Evaluate additional client classes grouping for a shared network.";
+ uses evaluate-additional-classes {
+ refine evaluate-additional-classes {
+ description "Shared network evaluate additional client classes.";
}
}
}
leaf-list client-classes {
type string;
description "Host client classes (if host identifier matches, a
- client's packet will be added to the classes liste
+ client's packet will be added to the classes listed
here.)";
}
}
}
}
- grouping class-only-if-required {
- description "Client class only-if-required grouping.";
- leaf only-if-required {
+ grouping class-only-in-additional-list {
+ description "Client class only-in-additional-list grouping.";
+ leaf only-in-additional-list {
type boolean;
- description "Client class only if required flag.";
+ description "Client class only in additional list flag.";
}
}
}
}
+ grouping ddns-ttl {
+ leaf ddns-ttl {
+ type uint32;
+ description
+ "the DDNS TTL.";
+ }
+ }
+
+ grouping ddns-ttl-min {
+ leaf ddns-ttl-min {
+ type uint32;
+ description
+ "the minimum DDNS TTL.";
+ }
+ }
+
+ grouping ddns-ttl-max {
+ leaf ddns-ttl-max {
+ type uint32;
+ description
+ "the maximum DDNS TTL.";
+ }
+ }
+
grouping ddns-update-on-renew {
leaf ddns-update-on-renew {
type boolean;
}
import kea-dhcp-types {
prefix dhcp;
- revision-date 2024-05-29;
+ revision-date 2025-06-25;
}
organization "Internet Systems Consortium";
description "This model defines a YANG data model that can be
used to configure and manage a Kea DHCPv4 server.";
+ revision 2025-06-25 {
+ description "Renamed only-if-required to only-in-additional-list, renamed
+ require-client-classes to evaluate-additional-classes, removed
+ client-class and added client-classes list, added ddns-ttl,
+ ddns-ttl-min, ddns-ttl-max, and added ddns-generated-prefix,
+ ddns-override-client-update, ddns-override-no-update,
+ ddns-qualifying-suffix, ddns-replace-client-name, ddns-send-updates,
+ ddns-update-on-renew, ddns-conflict-resolution-mode,
+ hostname-char-replacement and hostname-char-set at pool level.";
+ }
+
revision 2024-05-29 {
description "Removed reservation-mode and added
ddns-conflict-resolution-mode and stash-agent-options.";
description "Last IPv4 address in a pool.";
}
uses option-data-list;
- uses dhcp:pool-client-class;
- uses dhcp:pool-require-client-classes;
+ uses dhcp:ddns-generated-prefix;
+ uses dhcp:ddns-override-client-update;
+ uses dhcp:ddns-override-no-update;
+ uses dhcp:ddns-qualifying-suffix;
+ uses dhcp:ddns-replace-client-name;
+ uses dhcp:ddns-send-updates;
+ uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
+ uses dhcp:ddns-update-on-renew;
+ uses dhcp:ddns-use-conflict-resolution;
+ uses dhcp:ddns-conflict-resolution-mode;
+ uses dhcp:hostname-char-replacement;
+ uses dhcp:hostname-char-set;
+ uses dhcp:pool-client-classes;
+ uses dhcp:pool-evaluate-additional-classes;
uses dhcp:pool-id;
uses dhcp:pool-user-context;
}
}
uses dhcp:subnet-interface;
uses dhcp:subnet-id;
- uses dhcp:subnet-client-class;
- uses dhcp:subnet-require-client-classes;
+ uses dhcp:subnet-client-classes;
+ uses dhcp:subnet-evaluate-additional-classes;
uses reservations {
refine host {
description "Subnet host reservations list.";
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
uses dhcp:class-name;
uses dhcp:class-test;
uses dhcp:template-test;
- uses dhcp:class-only-if-required;
+ uses dhcp:class-only-in-additional-list;
uses dhcp:offer-lifetime;
uses option-def-list;
uses option-data-list;
uses dhcp:option-data-csv-format;
uses dhcp:option-data-always-send;
uses dhcp:option-data-never-send;
+ uses dhcp:option-data-client-classes;
uses dhcp:option-data-user-context;
}
}
uses relay;
}
uses authoritative;
- uses dhcp:network-client-class;
- uses dhcp:network-require-client-classes;
+ uses dhcp:network-client-classes;
+ uses dhcp:network-evaluate-additional-classes;
uses dhcp:valid-lifetime;
uses dhcp:min-valid-lifetime;
uses dhcp:max-valid-lifetime;
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
}
import kea-dhcp-types {
prefix dhcp;
- revision-date 2024-05-29;
+ revision-date 2025-06-25;
}
organization "Internet Systems Consortium";
description "This model defines a YANG data model that can be
used to configure and manage a Kea DHCPv6 server.";
+ revision 2025-06-25 {
+ description "Renamed only-if-required to only-in-additional-list, renamed
+ require-client-classes to evaluate-additional-classes, removed
+ client-class and added client-classes list, added ddns-ttl,
+ ddns-ttl-min, ddns-ttl-max, added ddns-generated-prefix,
+ ddns-override-client-update, ddns-override-no-update,
+ ddns-qualifying-suffix, ddns-replace-client-name, ddns-send-updates,
+ ddns-update-on-renew, ddns-conflict-resolution-mode,
+ hostname-char-replacement and hostname-char-set at pool and pd-pool
+ level, and added excluded-prefixes at pd-pool level.";
+ }
+
revision 2024-05-29 {
description "Removed reservation-mode and added
ddns-conflict-resolution-mode.";
type inet:ipv6-prefix;
description "Host reserved IP prefixes.";
}
+ leaf-list excluded-prefixes {
+ type inet:ipv6-prefix;
+ description "Excluded IP prefixes.";
+ }
uses dhcp:host-hostname;
uses dhcp:host-client-classes;
uses option-data-list;
description "Last IPv6 address in a pool.";
}
uses option-data-list;
- uses dhcp:pool-client-class;
- uses dhcp:pool-require-client-classes;
+ uses dhcp:ddns-generated-prefix;
+ uses dhcp:ddns-override-client-update;
+ uses dhcp:ddns-override-no-update;
+ uses dhcp:ddns-qualifying-suffix;
+ uses dhcp:ddns-replace-client-name;
+ uses dhcp:ddns-send-updates;
+ uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
+ uses dhcp:ddns-update-on-renew;
+ uses dhcp:ddns-use-conflict-resolution;
+ uses dhcp:ddns-conflict-resolution-mode;
+ uses dhcp:hostname-char-replacement;
+ uses dhcp:hostname-char-set;
+ uses dhcp:pool-client-classes;
+ uses dhcp:pool-evaluate-additional-classes;
uses dhcp:pool-id;
uses dhcp:pool-user-context;
}
description "Prefix pool delegated length.";
}
uses option-data-list;
- uses dhcp:client-class {
- refine client-class {
- description "Prefix pool client class guard. (only
- clients belonging to this class will be
+ uses dhcp:ddns-generated-prefix;
+ uses dhcp:ddns-override-client-update;
+ uses dhcp:ddns-override-no-update;
+ uses dhcp:ddns-qualifying-suffix;
+ uses dhcp:ddns-replace-client-name;
+ uses dhcp:ddns-send-updates;
+ uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
+ uses dhcp:ddns-update-on-renew;
+ uses dhcp:ddns-use-conflict-resolution;
+ uses dhcp:ddns-conflict-resolution-mode;
+ uses dhcp:hostname-char-replacement;
+ uses dhcp:hostname-char-set;
+ uses dhcp:client-classes {
+ refine client-classes {
+ description "Prefix pool client class guard. (only clients
+ belonging to any of these class will be
allowed in this pool).";
}
}
- uses dhcp:require-client-classes {
- refine require-client-classes {
- description "Prefix pool require client classes.";
+ uses dhcp:evaluate-additional-classes {
+ refine evaluate-additional-classes {
+ description "Prefix pool evaluate additional client classes.";
}
}
leaf excluded-prefix {
description "Subnet rapid commit flag.";
}
}
- uses dhcp:subnet-client-class;
- uses dhcp:require-client-classes;
+ uses dhcp:subnet-client-classes;
+ uses dhcp:subnet-evaluate-additional-classes;
uses reservations {
refine host {
description "Subnet host reservations list.";
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
uses dhcp:class-name;
uses dhcp:class-test;
uses dhcp:template-test;
- uses dhcp:class-only-if-required;
+ uses dhcp:class-only-in-additional-list;
uses option-data-list;
uses preferred-lifetime;
uses min-preferred-lifetime;
uses dhcp:option-data-csv-format;
uses dhcp:option-data-always-send;
uses dhcp:option-data-never-send;
+ uses dhcp:option-data-client-classes;
uses dhcp:option-data-user-context;
}
}
description "Optional information about relay agent.";
uses relay;
}
- uses dhcp:network-client-class;
- uses dhcp:require-client-classes;
+ uses dhcp:network-client-classes;
+ uses dhcp:network-evaluate-additional-classes;
uses preferred-lifetime;
uses min-preferred-lifetime;
uses max-preferred-lifetime;
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
uses dhcp:ddns-replace-client-name;
uses dhcp:ddns-send-updates;
uses dhcp:ddns-ttl-percent;
+ uses dhcp:ddns-ttl;
+ uses dhcp:ddns-ttl-min;
+ uses dhcp:ddns-ttl-max;
uses dhcp:ddns-update-on-renew;
uses dhcp:ddns-use-conflict-resolution;
uses dhcp:ddns-conflict-resolution-mode;
'ietf-yang-types@2013-07-15.yang',
'kea-ctrl-agent@2019-08-12.yang',
'kea-dhcp-ddns@2022-07-27.yang',
- 'kea-dhcp-types@2024-05-29.yang',
- 'kea-dhcp4-server@2024-05-29.yang',
- 'kea-dhcp6-server@2024-05-29.yang',
+ 'kea-dhcp-types@2025-06-25.yang',
+ 'kea-dhcp4-server@2025-06-25.yang',
+ 'kea-dhcp6-server@2025-06-25.yang',
'kea-types@2019-08-12.yang',
'keatest-module@2022-11-30.yang',
]