diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:15:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-13 12:15:43 +0000 |
commit | f5f56e1a1c4d9e9496fcb9d81131066a964ccd23 (patch) | |
tree | 49e44c6f87febed37efb953ab5485aa49f6481a7 /src/lib/yang/translator_config.h | |
parent | Initial commit. (diff) | |
download | isc-kea-f5f56e1a1c4d9e9496fcb9d81131066a964ccd23.tar.xz isc-kea-f5f56e1a1c4d9e9496fcb9d81131066a964ccd23.zip |
Adding upstream version 2.4.1.upstream/2.4.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/lib/yang/translator_config.h')
-rw-r--r-- | src/lib/yang/translator_config.h | 556 |
1 files changed, 556 insertions, 0 deletions
diff --git a/src/lib/yang/translator_config.h b/src/lib/yang/translator_config.h new file mode 100644 index 0000000..cbdff25 --- /dev/null +++ b/src/lib/yang/translator_config.h @@ -0,0 +1,556 @@ +// Copyright (C) 2018-2022 Internet Systems Consortium, Inc. ("ISC") +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef ISC_TRANSLATOR_CONFIG_H +#define ISC_TRANSLATOR_CONFIG_H 1 + +#include <yang/translator.h> +#include <yang/translator_class.h> +#include <yang/translator_control_socket.h> +#include <yang/translator_database.h> +#include <yang/translator_logger.h> +#include <yang/translator_shared_network.h> + +namespace isc { +namespace yang { + +/// @brief DHCP configuration translation between YANG and JSON +/// +/// This translator supports kea-dhcp4-server, kea-dhcp6-server and +/// partially ietf-dhcpv6-server. + +/// JSON syntax for kea-dhcp4 is: +/// @code +/// "Dhcp4": { +/// "valid-lifetime": <valid lifetime>, +/// "min-valid-lifetime": <minimum valid lifetime>, +/// "max-valid-lifetime": <maximum valid lifetime>, +/// "renew-timer": <renew timer>, +/// "rebind-timer": <rebind timer>, +/// "calculate-tee-times": <calculate T1/T2 times>, +/// "t1-percent": <T1 percent>, +/// "t2-percent": <T2 percent>, +/// "decline-probation-period": <decline probation period>, +/// "subnet4": [ <list of subnet4> ], +/// <shared-networks>, +/// "interfaces-config": { +/// "interfaces" [ <list of interface names / specs> ], +/// ... +/// }, +/// <databases>, +/// <host-reservation-identifiers>, +/// <client-classes>, +/// <option-def>, +/// <option-data>, +/// <hooks-libraries>, +/// <expired-leases-processing>, +/// <dhcp4o6-port>, +/// <control-socket>, +/// <hostname-char-set": <hostname character set>, +/// <hostname-char-replacement": <hostname character replacement>, +/// <dhcp-ddns>, +/// "echo-client-id": <echo client id flag>, +/// "match-client-id": <match client id flag>, +/// "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> }, +/// "reservation-mode": <host reservation mode>, +/// "reservations": [ <list of host reservations> ], +/// <config-control>, +/// "server-tag": <server tag>, +/// "dhcp-queue-control": { <DHCP queue control> }, +/// "loggers": [ <list of loggers> ] +/// }, +/// @endcode +/// +/// YANG syntax for kea-dhcp4-server:config is: +/// @code +/// +--rw valid-lifetime? uint32 +/// +--rw min-valid-lifetime? uint32 +/// +--rw max-valid-lifetime? uint32 +/// +--rw renew-timer? uint32 +/// +--rw rebind-timer? uint32 +/// +--rw calculate-tee-times? boolean +/// +--rw t1-percent? decimal64 +/// +--rw t2-percent? decimal64 +/// +--rw decline-probation-period? uint32 +/// +--rw subnet4* [id] +/// +--rw shared-network* [name] +/// +--rw interfaces-config +/// +--rw lease-database! +/// +--rw hosts-database* [database-type] +/// +--rw host-reservation-identifiers* host-identifier-type +/// +--rw client-class* [name] +/// +--rw option-def* [code space] +/// +--rw option-data* [code space] +/// +--rw hook-library* [library] +/// +--rw expired-leases-processing +/// +--rw dhcp4o6-port? uint16 +/// +--rw control-socket! +/// +--rw hostname-char-set? string +/// +--rw hostname-char-replacement? string +/// +--rw dhcp-ddns +/// +--rw echo-client-id? boolean +/// +--rw match-client-id? boolean +/// +--rw next-server? inet:ipv4-address +/// +--rw server-hostname? string +/// +--rw boot-file-name? string +/// +--rw authoritative? boolean +/// +--rw user-context? user-context +/// +--rw sanity-checks +/// +--rw reservation-mode? host-reservation-mode +/// +--rw host* [identifier-type identifier] +/// +--rw config-control +/// +--rw server-tag? string +/// +--rw dhcp-queue-control? string +/// +--rw logger* [name] +/// +--rw cache-max-age? uint32 +/// +--rw cache-threshold? decimal64 +/// +--rw compatibility +/// +--rw ddns-generated-prefix? string +/// +--rw ddns-override-client-update? boolean +/// +--rw ddns-override-no-update? boolean +/// +--rw ddns-qualifying-suffix? string +/// +--rw ddns-replace-client-name? string +/// +--rw ddns-send-updates? boolean +/// +--rw ddns-update-on-renew? boolean +/// +--rw ddns-use-conflict-resolution? boolean +/// +--rw ip-reservations-unique? boolean +/// +--rw early-global-reservations-lookup? boolean +/// +--rw reservations-lookup-first? boolean +/// +--rw multi-threading +/// +--rw parked-packet-limit? uint32 +/// +--rw reservations-global? boolean +/// +--rw reservations-in-subnet? boolean +/// +--rw reservations-out-of-pool? boolean +/// +--rw statistic-default-sample-age? uint32 +/// +--rw statistic-default-sample-count? uint32 +/// +--rw store-extended-info? boolean +/// @endcode +/// +/// Example of kea-dhcp6 simple configuration: +/// @code +/// { +/// "Dhcp4": { +/// "interfaces-config": +/// { +/// "interfaces": [ "eth1" ] +/// }, +/// "control-socket": { +/// "socket-type": "unix", +/// "socket-name": "/tmp/kea4-sock" +/// }, +/// "subnet4": +/// [ +/// { +/// "subnet": "10.0.35.0/24", +/// "pools": +/// [ +/// { +/// "pool": "10.0.35.64/27" +/// } +/// ] +/// } +/// ] +/// } +/// } +/// +/// @endcode +/// +/// The same configuration wrote into YANG datastore using @c setConfig() +/// with the kea-dhcp4-model and exported to XML format: +/// @code +/// <config xmlns="urn:ietf:params:xml:ns:yang:kea-dhcp4-server"> +/// <subnet4> +/// <id>1</id> +/// <pool> +/// <start-address>10.0.35.64</start-address> +/// <end-address>10.0.35.95</end-address> +/// <prefix>10.0.35.64/27</prefix> +/// </pool> +/// <subnet>10.0.35.0/24</subnet> +/// </subnet4> +/// <interfaces-config> +/// <interfaces>eth1</interfaces> +/// </interfaces-config> +/// <control-socket> +/// <socket-name>/tmp/kea4-sock</socket-name> +/// <socket-type>unix</socket-type> +/// </control-socket> +/// </config> +/// @endcode + +/// JSON syntax for kea-dhcp6 is: +/// @code +/// "Dhcp6": { +/// "data-directory": <data directory>, +/// "preferred-lifetime": <preferred lifetime>, +/// "min-preferred-lifetime": <minimum preferred lifetime>, +/// "max-preferred-lifetime": <maximum preferred lifetime>, +/// "valid-lifetime": <valid lifetime>, +/// "min-valid-lifetime": <minimum valid lifetime>, +/// "max-valid-lifetime": <maximum valid lifetime>, +/// "renew-timer": <renew timer>, +/// "rebind-timer": <rebind timer>, +/// "calculate-tee-times": <calculate T1/T2 times>, +/// "t1-percent": <T1 percent>, +/// "t2-percent": <T2 percent>, +/// "decline-probation-period": <decline probation period>, +/// "subnet6": [ <list of subnet6> ], +/// <shared-networks>, +/// "interfaces-config": { +/// "interfaces" [ <list of interface names / specs> ], +/// ... +/// }, +/// <databases>, +/// <mac-sources>, +/// <relay-supplied-options>, +/// <host-reservation-identifiers>, +/// <client-classes>, +/// <option-def>, +/// <option-data>, +/// <hooks-libraries>, +/// <expired-leases-processing>, +/// <server-id>, +/// <dhcp4o6-port>, +/// <control-socket>, +/// <hostname-char-set": <hostname character set>, +/// <hostname-char-replacement": <hostname character replacement>, +/// <dhcp-ddns>, +/// <user-context>, +/// <comment> +/// "sanity-checks": { <sanity checks> }, +/// "reservation-mode": <host reservation mode>, +/// "reservations": [ <list of host reservations> ], +/// <config-control>, +/// "server-tag": <server tag>, +/// "dhcp-queue-control": { <DHCP queue control> }, +/// "loggers": [ <list of loggers> ] +/// }, +/// @endcode +/// +/// YANG syntax for kea-dhcp6-server:config is: +/// @code +/// +--rw data-directory? string +/// +--rw preferred-lifetime? uint32 +/// +--rw min-preferred-lifetime? uint32 +/// +--rw max-preferred-lifetime? uint32 +/// +--rw valid-lifetime? uint32 +/// +--rw min-valid-lifetime? uint32 +/// +--rw max-valid-lifetime? uint32 +/// +--rw renew-timer? uint32 +/// +--rw rebind-timer? uint32 +/// +--rw calculate-tee-times? boolean +/// +--rw t1-percent? decimal64 +/// +--rw t2-percent? decimal64 +/// +--rw decline-probation-period? uint32 +/// +--rw subnet6* [id] +/// +--rw shared-network* [name] +/// +--rw interfaces-config +/// +--rw lease-database! +/// +--rw hosts-database* [database-type] +/// +--rw relay-supplied-options* string +/// +--rw mac-sources* string +/// +--rw host-reservation-identifiers* host-identifier-type +/// +--rw client-class* [name] +/// +--rw option-def* [code space] +/// +--rw option-data* [code space] +/// +--rw hook-library* [library] +/// +--rw expired-leases-processing +/// +--rw server-id! +/// +--rw dhcp4o6-port? uint16 +/// +--rw control-socket! +/// +--rw hostname-char-set? string +/// +--rw hostname-char-replacement? string +/// +--rw dhcp-ddns +/// +--rw user-context? user-context +/// +--rw sanity-checks +/// +--rw reservation-mode? host-reservation-mode +/// +--rw host* [identifier-type identifier] +/// +--rw config-control +/// +--rw server-tag? string +/// +--rw dhcp-queue-control? string +/// +--rw logger* [name] +/// +--rw cache-max-age? uint32 +/// +--rw cache-threshold? decimal64 +/// +--rw compatibility +/// +--rw ddns-generated-prefix? string +/// +--rw ddns-override-client-update? boolean +/// +--rw ddns-override-no-update? boolean +/// +--rw ddns-qualifying-suffix? string +/// +--rw ddns-replace-client-name? string +/// +--rw ddns-send-updates? boolean +/// +--rw ddns-update-on-renew? boolean +/// +--rw ddns-use-conflict-resolution? boolean +/// +--rw ip-reservations-unique? boolean +/// +--rw early-global-reservations-lookup? boolean +/// +--rw reservations-lookup-first? boolean +/// +--rw multi-threading +/// +--rw parked-packet-limit? uint32 +/// +--rw reservations-global? boolean +/// +--rw reservations-in-subnet? boolean +/// +--rw reservations-out-of-pool? boolean +/// +--rw statistic-default-sample-age? uint32 +/// +--rw statistic-default-sample-count? uint32 +/// +--rw store-extended-info? boolean +/// @endcode +/// +/// Example of kea-dhcp6 simple configuration: +/// @code +/// { +/// "Dhcp6": { +/// "interfaces-config": +/// { +/// "interfaces": [ "eth1" ] +/// }, +/// "control-socket": { +/// "socket-type": "unix", +/// "socket-name": "/tmp/kea6-sock" +/// }, +/// "subnet6": +/// [ +/// { +/// "subnet": "2001:db8::/64", +/// "pools": +/// [ +/// { +/// "pool": "2001:db8::1:0/112" +/// } +/// ] +/// } +/// ] +/// } +/// } +/// @endcode +/// +/// The same configuration wrote into YANG datastore using @c setConfig() +/// with the kea-dhcp6-model and exported to XML format: +/// @code +/// <config xmlns="urn:ietf:params:xml:ns:yang:kea-dhcp6-server"> +/// <subnet6> +/// <id>1</id> +/// <pool> +/// <start-address>2001:db8::1:0</start-address> +/// <end-address>2001:db8::1:ffff</end-address> +/// <prefix>2001:db8::1:0/112</prefix> +/// </pool> +/// <subnet>2001:db8::/64</subnet> +/// </subnet6> +/// <interfaces-config> +/// <interfaces>eth1</interfaces> +/// </interfaces-config> +/// <control-socket> +/// <socket-name>/tmp/kea6-sock</socket-name> +/// <socket-type>unix</socket-type> +/// </control-socket> +/// </config> +/// @endcode + +/// Inheritance graph between translators is: +/// +/// +-----------------------------------------+ +/// | | +/// +------------------------------+ | +/// | | | +/// +----------+-------------------+----------+ +/// | | | | +/// | | +---------+----------+ +/// | | | | | +/// config +- shared +- subnet +- pool --+- option -+ basic +/// | network (list) | (list) | data | +/// | (list) | | (list) | +/// | | | | +/// | +- pd ----+ | +/// | | pool | | +/// | | (list) | | +/// | | | | +/// +--------------------+- host --+ | +/// | (liat) | | +/// | | | +/// | +--------------------+----------+ +/// | | | +/// +- class -+- option ----------------------+ +/// | (list) | def | +/// | | (list) | +/// +---------+ | +/// | | +/// + control --------------------------------+ +/// | socket | +/// | | +/// +------------+ | +/// | | | +/// +- database -+- database -----------------+ +/// | list | +/// | | +/// +- logger --------------------------------+ +/// (list) +/// +/// 'XXX (list)' stands for 'XXX list --- XXX' which is a common motif +/// (only database shows direct dependencies on both the list and the element) + +/// @brief A translator class for converting the config between YANG and JSON. +/// +/// Currently supports the following models: +/// - kea-dhcp4-server +/// - kea-dhcp6-server +/// - ietf-dhcpv6-server (partial) +class TranslatorConfig : virtual public TranslatorControlSocket, + virtual public TranslatorDatabases, + virtual public TranslatorClasses, + virtual public TranslatorSharedNetworks, + virtual public TranslatorLoggers { +public: + /// @brief Constructor. + /// + /// @param session Sysrepo session. + /// @param model Model name. + TranslatorConfig(sysrepo::Session session, const std::string& model); + + /// @brief Destructor. + virtual ~TranslatorConfig() = default; + + /// @brief Translate the whole DHCP server configuration from YANG to JSON. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getConfig(); + + /// @brief Translate and set the DHCP server configuration from JSON to YANG. + /// + /// Null elem argument removes the config containers. + /// + /// @param elem The JSON element. + void setConfig(isc::data::ElementPtr elem); + +protected: + /// @brief getConfig for ietf-dhcpv6-server. + /// + /// This implementation is very preliminary. It handles network-ranges + /// only partially and nothing else. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getConfigIetf6(); + + /// @brief delConfig for ietf-dhcpv6-server. + void delConfigIetf6(); + + /// @brief setConfig for ietf-dhcpv6-server. + /// + /// This implementation is very preliminary. It handles network-ranges + /// only partially and nothing else. + /// + /// @param elem The JSON element. + /// @throw BadValue on config without Dhcp6. + void setConfigIetf6(isc::data::ConstElementPtr elem); + + /// @brief getConfig for kea-dhcp4-server. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getConfigKea4(); + + /// @brief getConfig for kea-dhcp6-server. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getConfigKea6(); + + /// @brief getServer common part for kea-dhcp[46]-server:config. + /// + /// @param data_node the YANG node representing the server configuration + /// + /// @return JSON representation of the server. + isc::data::ElementPtr getServerKeaDhcpCommon(libyang::DataNode const& data_node); + + /// @brief getServer for kea-dhcp4-server:config. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getServerKeaDhcp4(); + + /// @brief getServer for kea-dhcp6-server:config. + /// + /// @return JSON representation of the config. + /// @throw NetconfError when sysrepo raises an error. + isc::data::ElementPtr getServerKeaDhcp6(); + + /// @brief delConfig for kea-dhcp[46]-server. + void delConfigKea(); + + /// @brief setConfig for kea-dhcp[46]-server. + /// + /// @param elem The JSON element. + void setConfigKea4(isc::data::ConstElementPtr elem); + + /// @brief setConfig for kea-dhcp6-server. + /// + /// @param elem The JSON element. + void setConfigKea6(isc::data::ConstElementPtr elem); + + /// @brief setServer common part for kea-dhcp[46]-server:config. + /// + /// @param xpath The xpath of the server. + /// @param elem The JSON element. + void setServerKeaDhcpCommon(const std::string& xpath, + isc::data::ConstElementPtr elem); + + isc::data::ElementPtr getHook(libyang::DataNode const& data_node); + + /// @brief Retrieves hooks configuration from sysrepo. + /// + /// @param data_node the YANG node representing the hook libraries + /// + /// @return ElementList with hooks configuration. + isc::data::ElementPtr getHooksKea(libyang::DataNode const& data_node); + + /// @brief Retrieves expired leases processing parameters from sysrepo. + /// + /// @param data_node the YANG node representing the configuration for expired lease processing + /// + /// @return ElementList with expired leases configuration. + isc::data::ElementPtr getExpiredKea(libyang::DataNode const& data_node); + + /// @brief Retrieves DDNS configuration from sysrepo + /// + /// @param data_node the YANG node representing dhcp-ddns configuration + /// + /// @return ElementList with dhcp-ddns configuration. + isc::data::ElementPtr getDdnsKea(libyang::DataNode const& data_node); + + /// @brief Retrieves configuration control from sysrepo. + /// + /// @param data_node the YANG node representing configuration control + /// + /// @return ElementMap with configuration control. + isc::data::ElementPtr getConfigControlKea(libyang::DataNode const& data_node); + + /// @brief Retrieves interfaces configuration from sysrepo. + /// + /// @param data_node the YANG node representing the interfaces configuration + /// + /// @return ElementMap with configuration control. + isc::data::ElementPtr getInterfacesKea(libyang::DataNode const& data_node); + + /// @brief setServer for kea-dhcp4-server:config. + /// + /// @param elem The JSON element. + void setServerKeaDhcp4(isc::data::ConstElementPtr elem); + + /// @brief setServer for kea-dhcp6-server:config. + /// + /// @param elem The JSON element. + void setServerKeaDhcp6(isc::data::ConstElementPtr elem); +}; // TranslatorConfig + +} // namespace yang +} // namespace isc + +#endif // ISC_TRANSLATOR_CONFIG_H |