From: Francis Dupont Date: Mon, 19 Nov 2018 18:33:32 +0000 (+0100) Subject: [65-libyang-simplify-update-models] Checkpoint: removed option-data-list (more to... X-Git-Tag: 75-radius-documentation-needs-an-update_base~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8c5cb466bd333468b9b2620d170fce5d97460c14;p=thirdparty%2Fkea.git [65-libyang-simplify-update-models] Checkpoint: removed option-data-list (more to come) --- diff --git a/src/lib/yang/models/kea-dhcp-types.yang b/src/lib/yang/models/kea-dhcp-types.yang index 27511aeaf6..6fbd3ebc92 100644 --- a/src/lib/yang/models/kea-dhcp-types.yang +++ b/src/lib/yang/models/kea-dhcp-types.yang @@ -15,7 +15,7 @@ module kea-dhcp-types { contact "kea-dev@lists.isc.org"; description "This file defines some commonly used Kea DHCP types and groupings."; - revision 2018-11-13 { + revision 2018-11-14 { description "Initial revision"; reference ""; } diff --git a/src/lib/yang/models/kea-dhcp4-server.yang b/src/lib/yang/models/kea-dhcp4-server.yang index a5746a96a1..c60a5a6b56 100644 --- a/src/lib/yang/models/kea-dhcp4-server.yang +++ b/src/lib/yang/models/kea-dhcp4-server.yang @@ -12,7 +12,7 @@ module kea-dhcp4-server { } import kea-dhcp-types { prefix dhcp; - revision-date 2018-11-13; + revision-date 2018-11-14; } import kea-logging { prefix logging; @@ -24,7 +24,7 @@ module kea-dhcp4-server { description "This model defines a YANG data model that can be used to configure and manage a Kea DHCPv4 server."; - revision 2018-11-13 { + revision 2018-11-14 { description "Initial revision"; reference ""; } @@ -259,27 +259,24 @@ module kea-dhcp4-server { grouping option-data-list { description "Option data list grouping."; - container option-data-list { - description "Option data list."; - list option-data { - key "code space"; - description "Option data entry."; - leaf code { - type uint8; - mandatory true; - description "Option code."; - } - leaf space { - type string; - mandatory true; - description "Option space."; - } - uses dhcp:option-data-name; - uses dhcp:option-data-data; - uses dhcp:option-data-csv-format; - uses dhcp:option-data-always-send; - uses dhcp:option-data-user-context; + list option-data { + key "code space"; + description "Option data entry."; + leaf code { + type uint8; + mandatory true; + description "Option code."; + } + leaf space { + type string; + mandatory true; + description "Option space."; } + uses dhcp:option-data-name; + uses dhcp:option-data-data; + uses dhcp:option-data-csv-format; + uses dhcp:option-data-always-send; + uses dhcp:option-data-user-context; } } diff --git a/src/lib/yang/models/kea-dhcp6-server.yang b/src/lib/yang/models/kea-dhcp6-server.yang index 8423a938c1..3bdda1cd59 100644 --- a/src/lib/yang/models/kea-dhcp6-server.yang +++ b/src/lib/yang/models/kea-dhcp6-server.yang @@ -12,7 +12,7 @@ module kea-dhcp6-server { } import kea-dhcp-types { prefix dhcp; - revision-date 2018-11-13; + revision-date 2018-11-14; } import kea-logging { prefix logging; @@ -24,7 +24,7 @@ module kea-dhcp6-server { description "This model defines a YANG data model that can be used to configure and manage a Kea DHCPv6 server."; - revision 2018-11-13 { + revision 2018-11-14 { description "Initial revision"; reference ""; } @@ -265,27 +265,24 @@ module kea-dhcp6-server { grouping option-data-list { description "Option data list grouping."; - container option-data-list { - description "Option data list."; - list option-data { - key "code space"; - description "Option data entry."; - leaf code { - type uint16; - mandatory true; - description "Option code."; - } - leaf space { - type string; - mandatory true; - description "Option space."; - } - uses dhcp:option-data-name; - uses dhcp:option-data-data; - uses dhcp:option-data-csv-format; - uses dhcp:option-data-always-send; - uses dhcp:option-data-user-context; + list option-data { + key "code space"; + description "Option data entry."; + leaf code { + type uint16; + mandatory true; + description "Option code."; + } + leaf space { + type string; + mandatory true; + description "Option space."; } + uses dhcp:option-data-name; + uses dhcp:option-data-data; + uses dhcp:option-data-csv-format; + uses dhcp:option-data-always-send; + uses dhcp:option-data-user-context; } } diff --git a/src/lib/yang/tests/translator_option_data_unittests.cc b/src/lib/yang/tests/translator_option_data_unittests.cc index 7067b0fbb0..e95030a763 100644 --- a/src/lib/yang/tests/translator_option_data_unittests.cc +++ b/src/lib/yang/tests/translator_option_data_unittests.cc @@ -45,7 +45,7 @@ TEST_F(TranslatorOptionDataListTest, getEmpty) { useModel(KEA_DHCP4_SERVER); // Get the option data list and check if it is empty. - const string& xpath = "/kea-dhcp4-server:config/option-data-list"; + const string& xpath = "/kea-dhcp4-server:config"; ConstElementPtr options; EXPECT_NO_THROW(options = t_obj_->getOptionDataList(xpath)); ASSERT_TRUE(options); @@ -59,7 +59,7 @@ TEST_F(TranslatorOptionDataListTest, get) { useModel(KEA_DHCP6_SERVER); // Create the option code 100. - const string& xpath = "/kea-dhcp6-server:config/option-data-list"; + const string& xpath = "/kea-dhcp6-server:config"; const string& xoption = xpath + "/option-data[code='100'][space='dns']"; const string& xformat = xoption + "/csv-format"; const string& xdata = xoption + "/data"; @@ -98,7 +98,7 @@ TEST_F(TranslatorOptionDataListTest, setEmpty) { useModel(KEA_DHCP4_SERVER); // Set empty list. - const string& xpath = "/kea-dhcp4-server:config/option-data-list"; + const string& xpath = "/kea-dhcp4-server:config"; ConstElementPtr options = Element::createList(); EXPECT_NO_THROW(t_obj_->setOptionDataList(xpath, options)); @@ -120,7 +120,7 @@ TEST_F(TranslatorOptionDataListTest, set) { useModel(KEA_DHCP6_SERVER); // Set one option data. - const string& xpath = "/kea-dhcp6-server:config/option-data-list"; + const string& xpath = "/kea-dhcp6-server:config"; ElementPtr options = Element::createList(); ElementPtr option = Element::createMap(); option->set("code", Element::create(100)); @@ -145,19 +145,17 @@ TEST_F(TranslatorOptionDataListTest, set) { string expected = "kea-dhcp6-server:config (container)\n" " |\n" - " -- option-data-list (container)\n" + " -- option-data (list instance)\n" " |\n" - " -- option-data (list instance)\n" - " |\n" - " -- code = 100\n" - " |\n" - " -- space = dns\n" - " |\n" - " -- data = 12121212\n" - " |\n" - " -- csv-format = false\n" - " |\n" - " -- always-send = false\n"; + " -- code = 100\n" + " |\n" + " -- space = dns\n" + " |\n" + " -- data = 12121212\n" + " |\n" + " -- csv-format = false\n" + " |\n" + " -- always-send = false\n"; EXPECT_EQ(expected, tree->to_string(100)); // Check it validates. diff --git a/src/lib/yang/tests/yang_configs.h b/src/lib/yang/tests/yang_configs.h index 8711bfb129..cfefbf228e 100644 --- a/src/lib/yang/tests/yang_configs.h +++ b/src/lib/yang/tests/yang_configs.h @@ -294,23 +294,21 @@ const YRTree subnetOptionsTreeKeaDhcp4 = { SR_LIST_T, true }, { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/id", "111", SR_UINT32_T, false }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list", - "", SR_CONTAINER_T, false }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']", "", SR_LIST_T, true }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']/code", "100", SR_UINT8_T, false }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']/space", "dns", SR_STRING_T, false }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']/data", "12121212", SR_STRING_T, true }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']/csv-format", "false", SR_BOOL_T, true }, - { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/option-data-list/" + { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/" "option-data[code='100'][space='dns']/always-send", "false", SR_BOOL_T, true }, { "/kea-dhcp4-server:config/subnet4/subnet4[id='111']/pools", @@ -357,30 +355,27 @@ const YRTree subnetOptionsTreeKeaDhcp6 = { "prefix", "2001:db8::1:0/112", SR_STRING_T, true }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list", "", SR_CONTAINER_T, false }, - { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" - "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']", + "option-data[code='100'][space='dns']", "", SR_LIST_T, true }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']/code", + "option-data[code='100'][space='dns']/code", "100", SR_UINT16_T, false }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']/space", + "option-data[code='100'][space='dns']/space", "dns", SR_STRING_T, false }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']/data", + "option-data[code='100'][space='dns']/data", "12121212", SR_STRING_T, true }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']/csv-format", + "option-data[code='100'][space='dns']/csv-format", "false", SR_BOOL_T, true }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/pools/" "pool[start-address='2001:db8::1:0'][end-address='2001:db8::1:ffff']/" - "option-data-list/option-data[code='100'][space='dns']/always-send", + "option-data[code='100'][space='dns']/always-send", "false", SR_BOOL_T, true }, { "/kea-dhcp6-server:config/subnet6/subnet6[id='111']/subnet", "2001:db8::/48", SR_STRING_T, true } diff --git a/src/lib/yang/translator_class.cc b/src/lib/yang/translator_class.cc index 5774a794b4..ad75dd6b41 100644 --- a/src/lib/yang/translator_class.cc +++ b/src/lib/yang/translator_class.cc @@ -64,7 +64,7 @@ TranslatorClass::getClassKea(const string& xpath) { if (required) { result->set("only-if-required", required); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -126,7 +126,7 @@ TranslatorClass::setClassKea(const string& xpath, ConstElementPtr elem) { } ConstElementPtr options = elem->get("option-data"); if (options) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); created = true; } if (model_ == KEA_DHCP4_SERVER) { diff --git a/src/lib/yang/translator_class.h b/src/lib/yang/translator_class.h index 15de324531..d74852eafa 100644 --- a/src/lib/yang/translator_class.h +++ b/src/lib/yang/translator_class.h @@ -38,7 +38,7 @@ namespace yang { /// +--rw name string /// +--rw test? string /// +--rw only-if-required? boolean -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw option-def-list option-def* /// +--rw next-server? inet:ipv4-address /// +--rw server-hostname? string diff --git a/src/lib/yang/translator_config.cc b/src/lib/yang/translator_config.cc index a05bcd3c2d..d3d08901e1 100644 --- a/src/lib/yang/translator_config.cc +++ b/src/lib/yang/translator_config.cc @@ -243,7 +243,7 @@ TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) { if (defs && !defs->empty()) { result->set("option-def", defs); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && !options->empty()) { result->set("option-data", options); } @@ -536,7 +536,7 @@ TranslatorConfig::setServerKeaDhcpCommon(const string& xpath, } ConstElementPtr options = elem->get("option-data"); if (options && !options->empty()) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); } ConstElementPtr hook_libs = elem->get("hooks-libraries"); if (hook_libs) { diff --git a/src/lib/yang/translator_config.h b/src/lib/yang/translator_config.h index b3a09d3d6f..48a3c30785 100644 --- a/src/lib/yang/translator_config.h +++ b/src/lib/yang/translator_config.h @@ -82,7 +82,7 @@ namespace yang { /// +--rw host-reservation-identifiers* enumeration /// +--rw client-classes client-class* /// +--rw option-def-list option-def* -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw hook-library* /// +--rw library string /// +--rw parameters? string diff --git a/src/lib/yang/translator_host.cc b/src/lib/yang/translator_host.cc index 4c4a0ad34f..7b21c161ae 100644 --- a/src/lib/yang/translator_host.cc +++ b/src/lib/yang/translator_host.cc @@ -74,7 +74,7 @@ TranslatorHost::getHostKea(const string& xpath) { result->set("prefixes", prefixes); } } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -148,7 +148,7 @@ TranslatorHost::setHostKea(const string& xpath, ConstElementPtr elem) { } ConstElementPtr options = elem->get("option-data"); if (options && (options->size() > 0)) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); } ConstElementPtr classes = elem->get("client-classes"); if (classes && (classes->size() > 0)) { diff --git a/src/lib/yang/translator_host.h b/src/lib/yang/translator_host.h index e1f6115465..066183da53 100644 --- a/src/lib/yang/translator_host.h +++ b/src/lib/yang/translator_host.h @@ -57,7 +57,7 @@ namespace yang { /// +--rw identifier-type enumeration /// +--rw identifier string /// +--rw hostname? string -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw client-classes* string /// +--rw user-context? string /// (DHCPv4 only) diff --git a/src/lib/yang/translator_option_data.cc b/src/lib/yang/translator_option_data.cc index 0fb64f445a..644cf79469 100644 --- a/src/lib/yang/translator_option_data.cc +++ b/src/lib/yang/translator_option_data.cc @@ -153,7 +153,7 @@ TranslatorOptionDataList::getOptionDataList(const string& xpath) { ConstElementPtr TranslatorOptionDataList::getOptionDataListKea(const string& xpath) { ElementPtr result = Element::createList(); - S_Iter_Value iter = getIter(xpath + "/*"); + S_Iter_Value iter = getIter(xpath + "/option-data"); if (!iter) { // Can't happen. isc_throw(Unexpected, "getOptionDataListKea: can't get iterator: " diff --git a/src/lib/yang/translator_option_data.h b/src/lib/yang/translator_option_data.h index eeb104d3cc..69c444e6ac 100644 --- a/src/lib/yang/translator_option_data.h +++ b/src/lib/yang/translator_option_data.h @@ -54,18 +54,17 @@ namespace yang { /// @endcode /// @code /// /kea-dhcp6-server:config (container) -/// /kea-dhcp6-server:config/option-data-list (container) -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns'] (list instance) -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns']/code = 100 -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns']/space = dns -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns']/data = 12121212 -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns']/csv-format = false -/// /kea-dhcp6-server:config/option-data-list/ +/// /kea-dhcp6-server:config/ /// option-data[code='100'][space='dns']/always-send = false /// @endcode diff --git a/src/lib/yang/translator_pd_pool.cc b/src/lib/yang/translator_pd_pool.cc index a93568a324..716f8c3e7c 100644 --- a/src/lib/yang/translator_pd_pool.cc +++ b/src/lib/yang/translator_pd_pool.cc @@ -160,7 +160,7 @@ TranslatorPdPool::getPdPoolKea(const string& xpath) { if (delegated) { result->set("delegated-len", delegated); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -258,7 +258,7 @@ TranslatorPdPool::setPdPoolKea(const string& xpath, ConstElementPtr elem) { } ConstElementPtr options = elem->get("option-data"); if (options && (options->size() > 0)) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); created = true; } ConstElementPtr guard = elem->get("client-class"); diff --git a/src/lib/yang/translator_pd_pool.h b/src/lib/yang/translator_pd_pool.h index 353049e3e6..5ae4d76675 100644 --- a/src/lib/yang/translator_pd_pool.h +++ b/src/lib/yang/translator_pd_pool.h @@ -52,7 +52,7 @@ namespace yang { /// +--rw prefix? inet:ipv6-prefix /// +--rw delegated-len? uint8 /// +--rw excluded-prefix? inet:ipv6-prefix -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw client-class? string /// +--rw require-client-classes* string /// +--rw user-context? string diff --git a/src/lib/yang/translator_pool.cc b/src/lib/yang/translator_pool.cc index 199487a153..b4ae2654be 100644 --- a/src/lib/yang/translator_pool.cc +++ b/src/lib/yang/translator_pool.cc @@ -108,7 +108,7 @@ TranslatorPool::getPoolKea(const string& xpath) { << end_addr->stringValue(); result->set("pool", Element::create(range.str())); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -217,7 +217,7 @@ TranslatorPool::setPoolKea(const string& xpath, ConstElementPtr elem) { // Skip start-address and end-address as are the keys. ConstElementPtr options = elem->get("option-data"); if (options && (options->size() > 0)) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); created = true; } ConstElementPtr guard = elem->get("client-class"); diff --git a/src/lib/yang/translator_pool.h b/src/lib/yang/translator_pool.h index 85ce580ebe..ffc1086bcd 100644 --- a/src/lib/yang/translator_pool.h +++ b/src/lib/yang/translator_pool.h @@ -52,7 +52,7 @@ namespace yang { /// +--rw prefix? inet:ipv[46]-prefix /// +--rw start-address inet:ipv[46]-address /// +--rw end-address inet:ipv[46]-address -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw client-class? string /// +--rw require-client-classes* string /// +--rw user-context? string diff --git a/src/lib/yang/translator_shared_network.cc b/src/lib/yang/translator_shared_network.cc index e9936f9ecc..8372841b79 100644 --- a/src/lib/yang/translator_shared_network.cc +++ b/src/lib/yang/translator_shared_network.cc @@ -87,7 +87,7 @@ TranslatorSharedNetwork::getSharedNetworkKea(const string& xpath, if (rebind) { result->set("rebind-timer", rebind); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -201,7 +201,7 @@ TranslatorSharedNetwork::setSharedNetworkKea(const string& xpath, } ConstElementPtr options = elem->get("option-data"); if (options && (options->size() > 0)) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); } ConstElementPtr interface = elem->get("interface"); if (interface) { diff --git a/src/lib/yang/translator_shared_network.h b/src/lib/yang/translator_shared_network.h index b836f03404..c07d7fc8db 100644 --- a/src/lib/yang/translator_shared_network.h +++ b/src/lib/yang/translator_shared_network.h @@ -68,7 +68,7 @@ namespace yang { /// +--rw valid-lifetime? uint32 /// +--rw renew-timer? uint32 /// +--rw rebind-timer? uint32 -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw interface? string /// +--rw client-class? string /// +--rw require-client-classes* string diff --git a/src/lib/yang/translator_subnet.cc b/src/lib/yang/translator_subnet.cc index 526f1410df..e047aa9ddf 100644 --- a/src/lib/yang/translator_subnet.cc +++ b/src/lib/yang/translator_subnet.cc @@ -112,7 +112,7 @@ TranslatorSubnet::getSubnetKea(const string& xpath) { if (rebind) { result->set("rebind-timer", rebind); } - ConstElementPtr options = getOptionDataList(xpath + "/option-data-list"); + ConstElementPtr options = getOptionDataList(xpath); if (options && (options->size() > 0)) { result->set("option-data", options); } @@ -285,7 +285,7 @@ TranslatorSubnet::setSubnetKea(const string& xpath, ConstElementPtr elem) { } ConstElementPtr options = elem->get("option-data"); if (options && (options->size() > 0)) { - setOptionDataList(xpath + "/option-data-list", options); + setOptionDataList(xpath, options); } ConstElementPtr pools = elem->get("pools"); if (pools && (pools->size() > 0)) { diff --git a/src/lib/yang/translator_subnet.h b/src/lib/yang/translator_subnet.h index 609052eb85..f8062dd38d 100644 --- a/src/lib/yang/translator_subnet.h +++ b/src/lib/yang/translator_subnet.h @@ -89,7 +89,7 @@ namespace yang { /// +--rw valid-lifetime? uint32 /// +--rw renew-timer? uint32 /// +--rw rebind-timer? uint32 -/// +--rw option-data-list option-data* +/// +--rw option-data* /// +--rw pools pool* /// +--rw subnet inet:ip-prefix /// +--rw interface? string