diff options
Diffstat (limited to 'src/lib/yang/translator_subnet.h')
-rw-r--r-- | src/lib/yang/translator_subnet.h | 386 |
1 files changed, 386 insertions, 0 deletions
diff --git a/src/lib/yang/translator_subnet.h b/src/lib/yang/translator_subnet.h new file mode 100644 index 0000000..2584047 --- /dev/null +++ b/src/lib/yang/translator_subnet.h @@ -0,0 +1,386 @@ +// Copyright (C) 2018-2019,2021 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_SUBNET_H +#define ISC_TRANSLATOR_SUBNET_H 1 + +#include <yang/translator.h> +#include <yang/translator_pool.h> +#include <yang/translator_pd_pool.h> +#include <yang/translator_host.h> +#include <list> + +namespace isc { +namespace yang { + +/// Subnet (aka network range) translation between YANG and JSON +/// +/// JSON syntax for kea-dhcp4 is: +/// @code +/// { +/// "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>, +/// "option-data": [ <list of option data> ], +/// "pools": [ <list of pools> ], +/// "subnet": "<subnet prefix>", +/// "interface": "<interface>", +/// "id": <id>, +/// "client-class": "<guard class name>", +/// "require-client-classes": [ <list of required class names> ], +/// "reservations": [ <list of host reservations> ], +/// "reservation-mode": <host reservation mode>, +/// "relay": <relay ip address(es)>, +/// "match-client-id": <match client id flag>, +/// "next-server": "<next server>", +/// "server-hostname": "<server hostname>", +/// "boot-file-name": "<boot file name>", +/// "4o6-interface": "<dhcpv4-over-dhcpv6 interface>", +/// "4o6-interface-id": "<dhcpv4-over-dhcpv6 interface id>", +/// "4o6-subnet": "<dhcpv4-over-dhcpv6 subnet>", +/// "authoritative": <authoritative flag>, +/// "user-context": { <json map> }, +/// "comment": "<comment>" +/// } +/// @endcode +/// +/// JSON syntax for kea-dhcp6 is: +/// @code +/// { +/// "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>, +/// "option-data": [ <list of option data> ], +/// "pools": [ <list of pools> ], +/// "pd-pools": [ <list of prefix delegation pools> ], +/// "subnet": "<subnet prefix>", +/// "interface": "<interface>", +/// "interface-id": "<interface id>", +/// "id": <id>, +/// "rapid-commit": <rapid commit flag>, +/// "client-class": "<guard class name>", +/// "require-client-classes": [ <list of required class names> ], +/// "reservations": [ <list of host reservations> ], +/// "reservation-mode": <host reservation mode>, +/// "relay": <relay ip address(es)>, +/// "user-context": { <json map> }, +/// "comment": "<comment>" +/// } +/// @endcode +/// +/// YANG syntax for ietf-dhcpv6-server is with network-range-id as the key: +/// @code +/// +--rw network-range-id uint32 +/// +--rw network-description string +/// +--rw network-prefix inet:ipv4-prefix +/// +--rw option-set-id? +/// /server/server-config/option-sets/option-set/option-set-id +/// +--rw address-pool* [pool-id] +/// +--rw pd-pool* [pool-id] +/// +--rw host-reservations host-reservation* [cli-id] +/// @endcode +/// +/// YANG syntax for kea-dhcp[46]-server is with id as the key: +/// @code +/// +--rw subnet[46]* [id] +/// +--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 option-data* [code space] +/// +--rw pool* [start-address end-address] +/// +--rw subnet inet:ipv4-prefix +/// +--rw interface? string +/// +--rw id uint32 +/// +--rw client-class? string +/// +--rw require-client-classes* string +/// +--rw host* [identifier-type identifier] +/// +--rw reservation-mode? host-reservation-mode +/// +--rw relay +/// +--rw cache-max-age? uint32 +/// +--rw cache-threshold? decimal64 +/// +--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 hostname-char-replacement? string +/// +--rw hostname-char-set? string +/// +--rw reservations-global? boolean +/// +--rw reservations-in-subnet? boolean +/// +--rw reservations-out-of-pool? boolean +/// +--rw store-extended-info? boolean +/// +--rw user-context? user-context +/// +/// DHCPv4 only: +/// +--rw match-client-id? boolean +/// +--rw next-server? inet:ipv4-address +/// +--rw server-hostname? string +/// +--rw boot-file-name? string +/// +--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 min-preferred-lifetime? uint32 +/// +--rw max-preferred-lifetime? uint32 +/// +--rw pd-pool* +/// +--rw interface-id? string +/// +--rw rapid-commit? boolean +/// @endcode +/// +/// An example in JSON and YANG formats for the IETF model: +/// @code +/// [ +/// { +/// "subnet": "2001:db8::/48", +/// "id": 123, +/// "pools": +/// [ +/// { +/// "pool": "2001:db8::1:0/112" +/// }, +/// { +/// "pool": "2001:db8::2:0/112" +/// } +/// ] +/// } +/// ] +/// @endcode +/// @code +/// /ietf-dhcpv6-server:server (container) +/// /ietf-dhcpv6-server:server/server-config (container) +/// /ietf-dhcpv6-server:server/server-config/network-ranges (container) +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123'] (list instance) +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/network-range-id = 123 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/network-prefix = 2001:db8::/48 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools (container) +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0'] (list instance) +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0']/pool-id = 0 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0']/pool-prefix = 2001:db8::1:0/112 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0']/start-address = 2001:db8::1:0 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0']/end-address = 2001:db8::1:ffff +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='0']/max-address-count = disabled +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1'] (list instance) +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1']/pool-id = 1 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1']/pool-prefix = 2001:db8::2:0/112 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1']/start-address = 2001:db8::2:0 +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1']/end-address = 2001:db8::2:ffff +/// /ietf-dhcpv6-server:server/server-config/network-ranges/ +/// network-range[network-range-id='123']/address-pools/ +/// address-pool[pool-id='1']/max-address-count = disabled +/// @endcode +/// +/// An example in JSON and YANG formats for the Kea model: +/// @code +/// [ +/// { +/// "subnet": "10.0.1.0/24", +/// "id": 123, +/// "pools": +/// [ +/// { +/// "pool": "10.0.1.0/28", +/// }, +/// { +/// "pool": "10.0.1.200 - 10.0.1.222" +/// } +/// ] +/// } +/// ] +/// @endcode +/// @code +/// /kea-dhcp4-server:config (container) +/// /kea-dhcp4-server:config/subnet4[id='123'] (list instance) +/// /kea-dhcp4-server:config/subnet4[id='123']/id = 123 +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.0'][end-address='10.0.1.15'] (list instance) +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.0'][end-address='10.0.1.15']/ +/// start-address = 10.0.1.0 +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.0'][end-address='10.0.1.15']/ +/// end-address = 10.0.1.15 +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.0'][end-address='10.0.1.15']/ +/// prefix = 10.0.1.0/28 +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.200'][end-address='10.0.1.222'] +/// (list instance) +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.200'][end-address='10.0.1.222']/ +/// start-address = 10.0.1.200 +/// /kea-dhcp4-server:config/subnet4[id='123']/ +/// pool[start-address='10.0.1.200'][end-address='10.0.1.222']/ +/// end-address = 10.0.1.222 +/// /kea-dhcp4-server:config/subnet4[id='123']/subnet = 10.0.1.0/24 +/// @endcode + +/// @brief A translator class for converting a subnet between YANG and JSON. +/// +/// Currently supports on kea-dhcp[46]-server and partially ietf-dhcpv6-server. +class TranslatorSubnet : virtual public TranslatorPools, + virtual public TranslatorPdPools, virtual public TranslatorHosts { +public: + + /// @brief Constructor. + /// + /// @param session Sysrepo session. + /// @param model Model name. + TranslatorSubnet(sysrepo::S_Session session, const std::string& model); + + /// @brief Destructor. + virtual ~TranslatorSubnet(); + + /// @brief Get and translate a subnet from YANG to JSON. + /// + /// @param xpath The xpath of the subnet. + /// @return JSON representation of the subnet. + /// @throw SysrepoError when sysrepo raises an error. + /// @throw BadValue on a subnet without prefix or id. + isc::data::ElementPtr getSubnet(const std::string& xpath); + + /// @brief Translate and set subnet from JSON to YANG. + /// + /// @param xpath The xpath of the subnet. + /// @param elem The JSON element. + /// @throw BadValue on a subnet without prefix. + void setSubnet(const std::string& xpath, isc::data::ConstElementPtr elem); + +protected: + /// @brief getSubnet for ietf-dhcpv6-server. + /// + /// @param xpath The xpath of the subnet. + /// @return JSON representation of the subnet. + isc::data::ElementPtr getSubnetIetf6(const std::string& xpath); + + /// @brief setSubnet for ietf-dhcpv6-server. + /// + /// @param xpath The xpath of the subnet. + /// @param elem The JSON element. + void setSubnetIetf6(const std::string& xpath, + isc::data::ConstElementPtr elem); + + /// @brief getSubnet for kea-dhcp[46]-server. + /// + /// @param xpath The xpath of the subnet. + /// @return JSON representation of the subnet. + isc::data::ElementPtr getSubnetKea(const std::string& xpath); + + /// @brief setSubnet for kea-dhcp[46]-server. + /// + /// @param xpath The xpath of the subnet. + /// @param elem The JSON element. + void setSubnetKea(const std::string& xpath, + isc::data::ConstElementPtr elem); +}; + +/// @brief A translator class for converting a subnet list between +/// YANG and JSON. +/// +/// Currently supports on kea-dhcp[46]-server and partially ietf-dhcpv6-server. +class TranslatorSubnets : virtual public TranslatorSubnet { +public: + + /// @brief Constructor. + /// + /// @param session Sysrepo session. + /// @param model Model name. + TranslatorSubnets(sysrepo::S_Session session, const std::string& model); + + /// @brief Destructor. + virtual ~TranslatorSubnets(); + + /// @brief Get and translate subnets from YANG to JSON. + /// + /// @param xpath The xpath of the subnet list. + /// @throw SysrepoError when sysrepo raises an error. + isc::data::ElementPtr getSubnets(const std::string& xpath); + + /// @brief Translate and set subnets from JSON to YANG. + /// + /// @param xpath The xpath of the subnet list. + /// @param elem The JSON element. + /// @throw BadValue on a subnet without id. + void setSubnets(const std::string& xpath, isc::data::ConstElementPtr elem); + +protected: + /// @brief getSubnets common part. + /// + /// @param xpath The xpath of the subnet list. + /// @param subsel The subnet list name. + isc::data::ElementPtr getSubnetsCommon(const std::string& xpath, + const std::string& subsel); + + /// @brief setSubnets for ietf-dhcpv6-server. + /// + /// @param xpath The xpath of the subnet list. + /// @param elem The JSON element. + void setSubnetsIetf6(const std::string& xpath, + isc::data::ConstElementPtr elem); + + /// @brief setSubnets for kea-dhcp[46]-server. + /// + /// @param xpath The xpath of the subnet list. + /// @param elem The JSON element. + /// @param subsel The subnet list name. + void setSubnetsKea(const std::string& xpath, + isc::data::ConstElementPtr elem, + const std::string& subsel); +}; + +} // namespace yang +} // namespace isc + +#endif // ISC_TRANSLATOR_SUBNET_H |