From: Francis Dupont Date: Mon, 19 Nov 2018 17:52:29 +0000 (+0100) Subject: [65-libyang-simplify-update-models] Added new entries - fixed syntax X-Git-Tag: 75-radius-documentation-needs-an-update_base~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0985556e1ca75249aba554435e0576075a8192f;p=thirdparty%2Fkea.git [65-libyang-simplify-update-models] Added new entries - fixed syntax --- diff --git a/src/bin/dhcp4/dhcp4_lexer.ll b/src/bin/dhcp4/dhcp4_lexer.ll index 314ca284ae..46b3d41a05 100644 --- a/src/bin/dhcp4/dhcp4_lexer.ll +++ b/src/bin/dhcp4/dhcp4_lexer.ll @@ -135,6 +135,8 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp4Parser::make_SUB_HOOKS_LIBRARY(driver.loc_); case Parser4Context::PARSER_DHCP_DDNS: return isc::dhcp::Dhcp4Parser::make_SUB_DHCP_DDNS(driver.loc_); + case Parser4Context::PARSER_CONFIG_CONTROL: + return isc::dhcp::Dhcp4Parser::make_SUB_CONFIG_CONTROL(driver.loc_); case Parser4Context::PARSER_LOGGING: return isc::dhcp::Dhcp4Parser::make_SUB_LOGGING(driver.loc_); } diff --git a/src/bin/dhcp4/dhcp4_parser.yy b/src/bin/dhcp4/dhcp4_parser.yy index fe1f905fb5..084182e71d 100644 --- a/src/bin/dhcp4/dhcp4_parser.yy +++ b/src/bin/dhcp4/dhcp4_parser.yy @@ -2070,15 +2070,6 @@ control_agent_json_object: CONTROL_AGENT { ctx.leave(); }; -config_control: LCURLY_BRACKET { - ElementPtr m(new MapElement(ctx.loc2pos(@1))); - ctx.stack_.back()->add(m); - ctx.stack_.push_back(m); -} config_control_params RCURLY_BRACKET { - ctx.stack_.pop_back(); -}; - - config_control: CONFIG_CONTROL { ElementPtr i(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("config-control", i); @@ -2101,13 +2092,12 @@ sub_config_control: LCURLY_BRACKET { // This defines that subnet can have one or more parameters. config_control_params: config_control_param - | config_control_params COMMA config_control_param - ; + | config_control_params COMMA config_control_param + ; // This defines a list of allowed parameters for each subnet. config_control_param: config_databases - | unknown_map_entry - ; + ; config_databases: CONFIG_DATABASES { ElementPtr l(new ListElement(ctx.loc2pos(@1))); diff --git a/src/bin/dhcp4/parser_context.h b/src/bin/dhcp4/parser_context.h index a9a35ea2c2..ae95f02c07 100644 --- a/src/bin/dhcp4/parser_context.h +++ b/src/bin/dhcp4/parser_context.h @@ -88,6 +88,9 @@ public: /// This will parse the input as dhcp-ddns. PARSER_DHCP_DDNS, + /// This will parse the input as config-control. + PARSER_CONFIG_CONTROL, + /// This will parse the content of Logging. PARSER_LOGGING } ParserType; diff --git a/src/bin/dhcp6/dhcp6_lexer.ll b/src/bin/dhcp6/dhcp6_lexer.ll index 0cb1a73fdb..4347991bde 100644 --- a/src/bin/dhcp6/dhcp6_lexer.ll +++ b/src/bin/dhcp6/dhcp6_lexer.ll @@ -137,6 +137,8 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence} return isc::dhcp::Dhcp6Parser::make_SUB_HOOKS_LIBRARY(driver.loc_); case Parser6Context::PARSER_DHCP_DDNS: return isc::dhcp::Dhcp6Parser::make_SUB_DHCP_DDNS(driver.loc_); + case Parser6Context::PARSER_CONFIG_CONTROL: + return isc::dhcp::Dhcp6Parser::make_SUB_CONFIG_CONTROL(driver.loc_); case Parser6Context::PARSER_LOGGING: return isc::dhcp::Dhcp6Parser::make_SUB_LOGGING(driver.loc_); } diff --git a/src/bin/dhcp6/dhcp6_parser.yy b/src/bin/dhcp6/dhcp6_parser.yy index d29a2975d4..71253663ec 100644 --- a/src/bin/dhcp6/dhcp6_parser.yy +++ b/src/bin/dhcp6/dhcp6_parser.yy @@ -2162,15 +2162,6 @@ control_agent_json_object: CONTROL_AGENT { // Config control information element -config_control: LCURLY_BRACKET { - ElementPtr m(new MapElement(ctx.loc2pos(@1))); - ctx.stack_.back()->add(m); - ctx.stack_.push_back(m); -} config_control_params RCURLY_BRACKET { - ctx.stack_.pop_back(); -}; - - config_control: CONFIG_CONTROL { ElementPtr i(new MapElement(ctx.loc2pos(@1))); ctx.stack_.back()->set("config-control", i); @@ -2193,13 +2184,12 @@ sub_config_control: LCURLY_BRACKET { // This defines that subnet can have one or more parameters. config_control_params: config_control_param - | config_control_params COMMA config_control_param - ; + | config_control_params COMMA config_control_param + ; // This defines a list of allowed parameters for each subnet. config_control_param: config_databases - | unknown_map_entry - ; + ; config_databases: CONFIG_DATABASES { ElementPtr l(new ListElement(ctx.loc2pos(@1))); diff --git a/src/bin/dhcp6/parser_context.h b/src/bin/dhcp6/parser_context.h index 9cec79b29a..aea40cc28b 100644 --- a/src/bin/dhcp6/parser_context.h +++ b/src/bin/dhcp6/parser_context.h @@ -91,6 +91,9 @@ public: /// This will parse the input as dhcp-ddns. (D2 client config) PARSER_DHCP_DDNS, + /// This will parse the input as config-control. + PARSER_CONFIG_CONTROL, + /// This will parse the content of Logging. PARSER_LOGGING diff --git a/src/lib/yang/models/kea-dhcp-types.yang b/src/lib/yang/models/kea-dhcp-types.yang index e47bd11835..27511aeaf6 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-11 { + revision 2018-11-13 { description "Initial revision"; reference ""; } @@ -761,4 +761,32 @@ module kea-dhcp-types { } } + grouping config-control { + description "Config control grouping."; + container config-control { + description "Config control."; + list config-databases { + key database-type; + description "List of databases."; + uses database; + } + } + } + + grouping server-tag { + description "Server tag grouping."; + leaf server-tag { + type string; + description "Server tag."; + } + } + + grouping dhcp-queue-control { + description "DHCP queue control grouping."; + leaf dhcp-queue-control { + type string; + description "DHCP queue control (JSON map)."; + } + } + } diff --git a/src/lib/yang/models/kea-dhcp4-server.yang b/src/lib/yang/models/kea-dhcp4-server.yang index 6a164d09d6..a5746a96a1 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-11; + revision-date 2018-11-13; } 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-12 { + revision 2018-11-13 { description "Initial revision"; reference ""; } @@ -403,6 +403,7 @@ module kea-dhcp4-server { uses next-server; uses server-hostname; uses boot-file-name; + uses authoritative; uses kea:user-context { refine user-context { description "DHCPv4 server user context. Arbitrary JSON data can @@ -415,7 +416,9 @@ module kea-dhcp4-server { description "Global host reservations."; } } - uses authoritative; + uses dhcp:config-control; + uses dhcp:server-tag; + uses dhcp:dhcp-queue-control; } container logging { diff --git a/src/lib/yang/models/kea-dhcp6-server.yang b/src/lib/yang/models/kea-dhcp6-server.yang index 0246c283c4..8423a938c1 100644 --- a/src/lib/yang/models/kea-dhcp6-server.yang +++ b/src/lib/yang/models/kea-dhcp6-server.yang @@ -12,20 +12,19 @@ module kea-dhcp6-server { } import kea-dhcp-types { prefix dhcp; - revision-date 2018-11-11; + revision-date 2018-11-13; } import kea-logging { prefix logging; revision-date 2018-11-11; } - organization "Internet Systems Consortium"; contact "kea-dev@lists.isc.org"; description "This model defines a YANG data model that can be used to configure and manage a Kea DHCPv6 server."; - revision 2018-11-12 { + revision 2018-11-13 { description "Initial revision"; reference ""; } @@ -448,6 +447,9 @@ module kea-dhcp6-server { description "Global host reservations."; } } + uses dhcp:config-control; + uses dhcp:server-tag; + uses dhcp:dhcp-queue-control; } container logging { diff --git a/src/lib/yang/translator_config.cc b/src/lib/yang/translator_config.cc index a2798e377d..a05bcd3c2d 100644 --- a/src/lib/yang/translator_config.cc +++ b/src/lib/yang/translator_config.cc @@ -111,7 +111,7 @@ TranslatorConfig::getParam(ElementPtr& storage, const std::string& xpath, } ElementPtr -TranslatorConfig::getHooksKea(std::string xpath) { +TranslatorConfig::getHooksKea(const std::string& xpath) { S_Iter_Value iter = getIter(xpath + "/*"); if (iter) { ElementPtr hook_libs = Element::createList(); @@ -143,7 +143,7 @@ TranslatorConfig::getHooksKea(std::string xpath) { } isc::data::ElementPtr -TranslatorConfig::getExpiredKea(std::string xpath) { +TranslatorConfig::getExpiredKea(const std::string& xpath) { ElementPtr expired = Element::createMap(); getParam(expired, xpath, "reclaim-timer-wait-time"); @@ -161,7 +161,7 @@ TranslatorConfig::getExpiredKea(std::string xpath) { } isc::data::ElementPtr -TranslatorConfig::getDdnsKea(std::string xpath) { +TranslatorConfig::getDdnsKea(const std::string& xpath) { ElementPtr ddns = Element::createMap(); getParam(ddns, xpath, "enable-updates"); getParam(ddns, xpath, "qualifying-suffix"); @@ -189,7 +189,23 @@ TranslatorConfig::getDdnsKea(std::string xpath) { return (ddns); } - // If not, return null + // If not, return null. + return (ElementPtr()); +} + +ElementPtr +TranslatorConfig::getConfigControlKea(const string& xpath) { + ElementPtr config_ctrl = Element::createMap(); + ConstElementPtr databases = getDatabases(xpath + "/config-databases"); + if (databases && !databases->empty()) { + config_ctrl->set("config-databases", databases); + } + if (!config_ctrl->empty()) { + // If there's something to return, use it. + return (config_ctrl); + } + + // If not, return null. return (ElementPtr()); } @@ -263,6 +279,17 @@ TranslatorConfig::getServerKeaDhcpCommon(const string& xpath) { if (hosts && !hosts->empty()) { result->set("reservations", hosts); } + ConstElementPtr config_ctrl = + getConfigControlKea(xpath + "/config-control"); + if (config_ctrl) { + result->set("config-control", config_ctrl); + } + getParam(result, xpath, "server-tag"); + ConstElementPtr queue_ctrl = getItem(xpath + "/dhcp-queue-control"); + if (queue_ctrl) { + result->set("dhcp-queue-control", + Element::fromJSON(queue_ctrl->stringValue())); + } return (result); } @@ -666,6 +693,23 @@ TranslatorConfig::setServerKeaDhcpCommon(const string& xpath, if (hosts && !hosts->empty()) { setHosts(xpath + "/reservations", hosts); } + ConstElementPtr config_ctrl = elem->get("config-control"); + if (config_ctrl && !config_ctrl->empty()) { + databases = config_ctrl->get("config-databases"); + if (databases && !databases->empty()) { + setDatabases(xpath + "/config-control/config-databases", + databases); + } + } + ConstElementPtr server_tag = elem->get("server-tag"); + if (server_tag) { + setItem(xpath + "/server-tag", server_tag, SR_STRING_T); + } + ConstElementPtr queue_ctrl = elem->get("dhcp-queue-control"); + if (queue_ctrl) { + ConstElementPtr repr = Element::create(queue_ctrl->str()); + setItem(xpath + "/dhcp-queue-control", repr, SR_STRING_T); + } } void diff --git a/src/lib/yang/translator_config.h b/src/lib/yang/translator_config.h index ead115f006..b3a09d3d6f 100644 --- a/src/lib/yang/translator_config.h +++ b/src/lib/yang/translator_config.h @@ -51,10 +51,14 @@ namespace yang { /// "next-server": , /// "server-hostname": , /// "boot-file-name": , +/// "authoritative": , /// , /// , /// "sanity-checks": { }, -/// "reservations": [ ] +/// "reservations": [ ], +/// , +/// "server-tag": , +/// "dhcp-queue-control": { } /// }, /// "Logging": /// @endcode @@ -91,9 +95,14 @@ namespace yang { /// +--rw next-server? inet:ipv4-address /// +--rw server-hostname? string /// +--rw boot-file-name? string +/// +--rw authoritative? boolean /// +--rw user-context? string /// +--rw sanity-checks /// +--rw lease-checks? enumeration +/// +--rw config-control +/// +--rw config-databases config-databases* +/// +--rw server-tag string +/// +--rw dhcp-queue-control string /// @endcode /// /// Example of kea-dhcp6 simple configuration: @@ -182,7 +191,10 @@ namespace yang { /// , /// /// "sanity-checks": { }, -/// "reservations": [ ] +/// "reservations": [ ], +/// , +/// "server-tag": , +/// "dhcp-queue-control": { } /// }, /// "Logging": /// @endcode @@ -220,6 +232,10 @@ namespace yang { /// +--rw user-context? string /// +--rw sanity-checks /// +--rw lease-checks? enumeration +/// +--rw config-control +/// +--rw config-databases config-databases* +/// +--rw server-tag string +/// +--rw dhcp-queue-control string /// @endcode /// /// Example of kea-dhcp6 simple configuration: @@ -496,23 +512,29 @@ protected: void setServerKeaDhcpCommon(const std::string& xpath, isc::data::ConstElementPtr elem); - /// @brief Retrieves hooks configuration from sysrepo + /// @brief Retrieves hooks configuration from sysrepo. /// - /// @param xpath path to hooks configuration - /// @return ElementList with hooks configuration - isc::data::ElementPtr getHooksKea(std::string xpath); + /// @param xpath path to hooks configuration. + /// @return ElementList with hooks configuration. + isc::data::ElementPtr getHooksKea(const std::string& xpath); - /// @brief Retrieves expired leases processing parameters from sysrepo + /// @brief Retrieves expired leases processing parameters from sysrepo. /// - /// @param xpath path to expired leases configuration - /// @return ElementList with expired leases configuration - isc::data::ElementPtr getExpiredKea(std::string xpath); + /// @param xpath path to expired leases configuration. + /// @return ElementList with expired leases configuration. + isc::data::ElementPtr getExpiredKea(const std::string& xpath); /// @brief Retrieves DDNS configuration from sysrepo /// - /// @param xpath path to dhcp-ddns configuration - /// @return ElementList with dhcp-ddns configuration - isc::data::ElementPtr getDdnsKea(std::string xpath); + /// @param xpath path to dhcp-ddns configuration. + /// @return ElementList with dhcp-ddns configuration. + isc::data::ElementPtr getDdnsKea(const std::string& xpath); + + /// @brief Retrieves configuration control from sysrepo. + /// + /// @param xpath path to configuration control. + /// @return ElementMap with configuration control. + isc::data::ElementPtr getConfigControlKea(const std::string& xpath); /// @brief setServer for kea-dhcp4-server:config. /// diff --git a/src/lib/yang/translator_database.h b/src/lib/yang/translator_database.h index fd6573f320..29637fd85f 100644 --- a/src/lib/yang/translator_database.h +++ b/src/lib/yang/translator_database.h @@ -42,7 +42,7 @@ namespace yang { /// /// YANG syntax for kea-dhcp[46] is using database-type as the list key: /// @code -/// +--rw database container +/// +--rw database (list) /// | /// +--rw database-type? string /// +--rw user? string diff --git a/src/lib/yang/translator_shared_network.h b/src/lib/yang/translator_shared_network.h index f9141125cb..b836f03404 100644 --- a/src/lib/yang/translator_shared_network.h +++ b/src/lib/yang/translator_shared_network.h @@ -34,6 +34,7 @@ namespace yang { /// "next-server": "", /// "server-hostname": "", /// "boot-file-name": "", +/// "authoritative": , /// "user-context": { }, /// "comment": "" /// } @@ -80,6 +81,7 @@ namespace yang { /// +--rw next-server? inet:ipv4-address /// +--rw server-hostname? string /// +--rw boot-file-name? string +/// +--rw authoritative? boolean /// (DHCPv6 only) /// +--rw subnet6 subnet6* /// +--rw preferred-lifetime? uint32 diff --git a/src/lib/yang/translator_subnet.h b/src/lib/yang/translator_subnet.h index f1d5f83540..609052eb85 100644 --- a/src/lib/yang/translator_subnet.h +++ b/src/lib/yang/translator_subnet.h @@ -41,6 +41,7 @@ namespace yang { /// "4o6-interface": "", /// "4o6-interface-id": "", /// "4o6-subnet": "", +/// "authoritative": , /// "user-context": { }, /// "comment": "" /// } @@ -107,6 +108,7 @@ namespace yang { /// +--rw subnet-4o6-interface? string /// +--rw subnet-4o6-interface-id? string /// +--rw subnet-4o6-subnet? inet:ipv6-prefix +/// +--rw authoritative? boolean /// (DHCPv6 only) /// +--rw preferred-lifetime? uint32 /// +--rw pd-pools pd-pool*