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_);
}
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);
// 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)));
/// 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;
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_);
}
// 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);
// 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)));
/// 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
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 "";
}
}
}
+ 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).";
+ }
+ }
+
}
}
import kea-dhcp-types {
prefix dhcp;
- revision-date 2018-11-11;
+ revision-date 2018-11-13;
}
import kea-logging {
prefix logging;
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 "";
}
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
description "Global host reservations.";
}
}
- uses authoritative;
+ uses dhcp:config-control;
+ uses dhcp:server-tag;
+ uses dhcp:dhcp-queue-control;
}
container logging {
}
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 "";
}
description "Global host reservations.";
}
}
+ uses dhcp:config-control;
+ uses dhcp:server-tag;
+ uses dhcp:dhcp-queue-control;
}
container logging {
}
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();
}
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");
}
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");
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());
}
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);
}
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
/// "next-server": <next server address>,
/// "server-hostname": <server hostname>,
/// "boot-file-name": <boot file name>,
+/// "authoritative": <authoritative flag>,
/// <user-context>,
/// <comment>,
/// "sanity-checks": { <sanity checks> },
-/// "reservations": [ <list of host reservations> ]
+/// "reservations": [ <list of host reservations> ],
+/// <config-control>,
+/// "server-tag": <server tag>,
+/// "dhcp-queue-control": { <DHCP queue control> }
/// },
/// "Logging": <logging>
/// @endcode
/// +--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:
/// <user-context>,
/// <comment>
/// "sanity-checks": { <sanity checks> },
-/// "reservations": [ <list of host reservations> ]
+/// "reservations": [ <list of host reservations> ],
+/// <config-control>,
+/// "server-tag": <server tag>,
+/// "dhcp-queue-control": { <DHCP queue control> }
/// },
/// "Logging": <logging>
/// @endcode
/// +--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:
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.
///
///
/// 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
/// "next-server": "<next server>",
/// "server-hostname": "<server hostname>",
/// "boot-file-name": "<boot file name>",
+/// "authoritative": <authoritative flag>,
/// "user-context": { <json map> },
/// "comment": "<comment>"
/// }
/// +--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
/// "4o6-interface": "<dhpv4-over-dhcpv6 interface>",
/// "4o6-interface-id": "<dhpv4-over-dhcpv6 interface id>",
/// "4o6-subnet": "<dhpv4-over-dhcpv6 subnet>",
+/// "authoritative": <authoritative flag>,
/// "user-context": { <json map> },
/// "comment": "<comment>"
/// }
/// +--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*