summaryrefslogtreecommitdiffstats
path: root/src/lib/yang/adaptor_config.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:15:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 12:15:43 +0000
commitf5f56e1a1c4d9e9496fcb9d81131066a964ccd23 (patch)
tree49e44c6f87febed37efb953ab5485aa49f6481a7 /src/lib/yang/adaptor_config.h
parentInitial commit. (diff)
downloadisc-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/adaptor_config.h')
-rw-r--r--src/lib/yang/adaptor_config.h286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/lib/yang/adaptor_config.h b/src/lib/yang/adaptor_config.h
new file mode 100644
index 0000000..4848250
--- /dev/null
+++ b/src/lib/yang/adaptor_config.h
@@ -0,0 +1,286 @@
+// 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_ADAPTOR_CONFIG_H
+#define ISC_ADAPTOR_CONFIG_H 1
+
+#include <dhcpsrv/subnet_id.h>
+#include <yang/adaptor_host.h>
+#include <yang/adaptor_option.h>
+#include <yang/adaptor_pool.h>
+#include <yang/adaptor_subnet.h>
+
+namespace isc {
+namespace yang {
+
+/// @brief JSON adaptor for Kea server configurations.
+///
+/// Currently only from JSON to YANG for DHCPv4 and DHCPv6 available
+/// as preProcess4 and preProcess6 class methods, filling some required
+/// (by YANG) fields (e.g. subnet IDs, or option code and space), or
+/// transforming a hand-written JSON configuration into a canonical form.
+class AdaptorConfig : public AdaptorHost, public AdaptorOption,
+ public AdaptorSubnet {
+public:
+ /// @brief Pre process a DHCPv4 configuration.
+ ///
+ /// Assign subnet IDs, check and set defaults in options, etc.
+ /// Note even though the parameter is a ConstElementPtr and is not modified,
+ /// sub-structures can modify it, so if you need a copy do a deep one.
+ ///
+ /// @param config The configuration.
+ /// @throw MissingKey when a required key is missing.
+ /// @throw BadValue when null or not a map or deprecated Logging present.
+ /// @note Does nothing if "Dhcp4" is not present in the map.
+ static void preProcess4(isc::data::ElementPtr config);
+
+ /// @brief Pre process a DHCPv6 configuration.
+ ///
+ /// Assign subnet IDs, check and set default in options, etc.
+ /// Note even though the parameter is a ConstElementPtr and is not modified,
+ /// sub-structures can modify it, so if you need a copy do a deep one.
+ ///
+ /// @param config The configuration.
+ /// @throw MissingKey when a required key is missing.
+ /// @throw BadValue when null or not a map or deprecated Logging present.
+ /// @note Does nothing if "Dhcp6" is not present in the map.
+ static void preProcess6(isc::data::ElementPtr config);
+
+protected:
+ /// @brief Collects subnet-ids on all subnets.
+ ///
+ /// It will go over all subnets and collect their ids. It will then return
+ /// true if all subnets have ids. If the subnets list is empty, it will also
+ /// return true. False will be returned if there is at least one subnet that
+ /// doesn't have subnet-id.
+ ///
+ /// @param subnets The subnet list.
+ /// @param set The reference to the set of assigned IDs.
+ /// @return True if all subnets have an ID, false otherwise.
+ static bool subnetsCollectID(isc::data::ConstElementPtr subnets,
+ isc::dhcp::SubnetIDSet& set);
+
+ /// @brief Collects subnet-ids in all subnets in all shared network list.
+ ///
+ /// It will go over all subnets in all shared networks specified to collect
+ /// their subnet-ids. It will then return true if all subnets have ids. If
+ /// the subnets list is empty, it will also return true. False will be
+ /// returned if there is at least one subnet that doesn't have subnet-id.
+ ///
+ /// @param networks The shared network list.
+ /// @param set The reference to the set of assigned IDs.
+ /// @param subsel The subnet list name.
+ /// @return True if all subnets have an ID, false otherwise.
+ static bool sharedNetworksCollectID(isc::data::ConstElementPtr networks,
+ isc::dhcp::SubnetIDSet& set,
+ const std::string& subsel);
+
+ /// @brief Assigns subnet-id to every subnet in a subnet list.
+ ///
+ /// Only those subnets that don't have one subnet-id assigned yet,
+ /// will get a new subnet-id value.
+ ///
+ /// @param subnets The subnet list.
+ /// @param set The reference to the set of assigned IDs.
+ /// @param next The next ID.
+ static void subnetsAssignID(isc::data::ConstElementPtr subnets,
+ isc::dhcp::SubnetIDSet& set,
+ isc::dhcp::SubnetID& next);
+
+ /// @brief Assigns subnet-id to every subnet in a shared network list.
+ ///
+ /// Only those subnets that don't have one subnet-id assigned yet,
+ /// will get a new subnet-id value.
+ ///
+ /// @param networks The shared network list.
+ /// @param set The reference to the set of assigned IDs.
+ /// @param next The next ID.
+ /// @param subsel The subnet list name.
+ static void sharedNetworksAssignID(isc::data::ConstElementPtr networks,
+ isc::dhcp::SubnetIDSet& set,
+ isc::dhcp::SubnetID& next,
+ const std::string& subsel);
+
+ /// @brief Sanitizes all pools in a pools list.
+ ///
+ /// Goes over each pool and cleans up its definition (removes extra spaces,
+ /// adds one space before and after - ).
+ ///
+ /// @param pools The pool list.
+ static void sanitizePools(isc::data::ConstElementPtr pools);
+
+ /// @brief Sanitizes all pools in a subnets list.
+ ///
+ /// @param subnets The subnet list.
+ static void sanitizePoolsInSubnets(isc::data::ConstElementPtr subnets);
+
+ /// @brief Sanitizes all pools in all subnets in a shared network list.
+ ///
+ /// @param networks The shared network list.
+ /// @param subsel The subnet list name.
+ static void sanitizePoolsInSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& subsel);
+
+ /// @brief Collect option definitions from an option definition list.
+ ///
+ /// Collects options definitions, but also sets missing option space
+ /// with default.
+ ///
+ /// @param defs The option definition list.
+ /// @param space The default space name (missing will be filled with this)
+ /// @param codes Option definitions.
+ static void sanitizeOptionDefList(isc::data::ConstElementPtr defs,
+ const std::string& space,
+ OptionCodes& codes);
+
+ /// @brief Set missing option codes to an option data list.
+ ///
+ /// @param options The option data list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionDataList(isc::data::ConstElementPtr options,
+ const std::string& space,
+ const OptionCodes& codes);
+
+ /// @brief Collect option definitions from a client class list
+ /// and set missing option codes.
+ ///
+ /// @param classes The client class list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionClasses(isc::data::ConstElementPtr classes,
+ const std::string& space,
+ OptionCodes& codes);
+
+ /// @brief Set missing option codes to a pool list.
+ ///
+ /// @param pools The pool list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionPools(isc::data::ConstElementPtr pools,
+ const std::string& space,
+ const OptionCodes& codes);
+
+ /// @brief Set missing option codes to a host reservation list.
+ ///
+ /// @param hosts The host reservation list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionHosts(isc::data::ConstElementPtr hosts,
+ const std::string& space,
+ const OptionCodes& codes);
+
+ /// @brief Set missing option codes to a subnet list.
+ ///
+ /// @param subnets The subnet list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionSubnets(isc::data::ConstElementPtr subnets,
+ const std::string& space,
+ const OptionCodes& codes);
+
+ /// @brief Set missing option codes to a shared network list.
+ ///
+ /// @param networks The shared network list.
+ /// @param space The default space name.
+ /// @param codes Option definitions.
+ static void sanitizeOptionSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& space,
+ const OptionCodes& codes);
+
+ /// @brief Process require client classes in a pool list.
+ ///
+ /// Remove empty require client class list.
+ ///
+ /// @param pools The pool list.
+ static void sanitizeRequireClassesPools(isc::data::ConstElementPtr pools);
+
+ /// @brief Process require client classes in a subnet list.
+ ///
+ /// Remove empty require client class lists.
+ ///
+ /// @param subnets The subnet list.
+ static void sanitizeRequireClassesSubnets(isc::data::ConstElementPtr subnets);
+
+ /// @brief Process require client classes in a shared network list.
+ ///
+ /// Remove empty require client class lists.
+ ///
+ /// @param networks The shared network list.
+ /// @param subsel The subnet list name.
+ static void requireClassesSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& subsel);
+
+ /// @brief Process host reservation list.
+ ///
+ /// Quote when needed flex-id identifiers.
+ ///
+ /// @param hosts The host reservation list.
+ static void sanitizeHostList(isc::data::ConstElementPtr hosts);
+
+ /// @brief Process host reservations in a subnet list.
+ ///
+ /// Quote when needed flex-id identifiers.
+ ///
+ /// @param subnets The subnet list.
+ static void sanitizeHostSubnets(isc::data::ConstElementPtr subnets);
+
+ /// @brief Process host reservations in a shared network list.
+ ///
+ /// Quote when needed flex-id identifiers.
+ ///
+ /// @param networks The shared network list.
+ /// @param space The default space name.
+ static void SanitizeHostsInSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& space);
+
+ /// @brief Sanitizes relay information in subnets in a subnet list.
+ ///
+ /// Force the use of ip-addresses when it finds an ip-address entry.
+ ///
+ /// @param subnets The subnet list.
+ static void sanitizeRelaySubnets(isc::data::ConstElementPtr subnets);
+
+ /// @brief Sanitizes relay information in a shared network list.
+ ///
+ /// Force the use of ip-addresses when it finds an ip-address entry.
+ ///
+ /// @param networks The shared network list.
+ /// @param subsel The subnet list name.
+ static void sanitizeRelayInSharedNetworks(isc::data::ConstElementPtr networks,
+ const std::string& subsel);
+
+ /// @brief Update (hosts) database.
+ ///
+ /// Force the use of hosts-databases vs. hosts-database.
+ ///
+ /// @param dhcp The DHCP server.
+ static void sanitizeDatabase(isc::data::ElementPtr dhcp);
+
+ /// @brief Update relay supplied options.
+ ///
+ /// Remove empty relay supplied option list.
+ ///
+ /// @param dhcp The DHCPv6 server.
+ static void sanitizeRelaySuppliedOptions(isc::data::ElementPtr dhcp);
+
+ /// @brief Pre process a configuration.
+ ///
+ /// Assign subnet IDs, check and set default in options, etc.
+ ///
+ /// @param dhcp The server configuration.
+ /// @param subsel The subnet list name.
+ /// @param space The default option space name.
+ /// @throw MissingKey when a required key is missing.
+ static void preProcess(isc::data::ElementPtr dhcp,
+ const std::string& subsel,
+ const std::string& space);
+}; // AdaptorConfig
+
+} // namespace yang
+} // namespace isc
+
+#endif // ISC_ADAPTOR_CONFIG_H