summaryrefslogtreecommitdiffstats
path: root/src/bin/netconf/netconf.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/netconf/netconf.h')
-rw-r--r--src/bin/netconf/netconf.h180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/bin/netconf/netconf.h b/src/bin/netconf/netconf.h
new file mode 100644
index 0000000..bb37ea5
--- /dev/null
+++ b/src/bin/netconf/netconf.h
@@ -0,0 +1,180 @@
+// 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/.
+
+/// @file netconf.h
+
+#ifndef NETCONF_H
+#define NETCONF_H
+
+#include <netconf/control_socket.h>
+#include <netconf/http_control_socket.h>
+#include <netconf/netconf_cfg_mgr.h>
+#include <netconf/stdout_control_socket.h>
+#include <netconf/unix_control_socket.h>
+
+#include <sysrepo-cpp/Session.hpp>
+
+#include <map>
+
+namespace isc {
+namespace netconf {
+
+/// @brief Forward declaration to the @c NetconfAgent.
+class NetconfAgent;
+
+/// @brief Type definition for the pointer to the @c NetconfAgent.
+using NetconfAgentPtr = std::shared_ptr<NetconfAgent>;
+
+/// @brief Netconf agent.
+///
+/// Service performed by the Netconf agent:
+/// - at boot get and display Kea server configurations.
+/// - load Kea server configurations from YANG datastore.
+/// - validate YANG datastore changes using Kea configuration test.
+/// - load updated Kea server configurations from YANG datastore.
+/// - on shutdown close subscriptions.
+class NetconfAgent {
+public:
+ /// @brief Destructor (call clear).
+ virtual ~NetconfAgent();
+
+ /// @brief Initialize sysrepo sessions.
+ ///
+ /// Must be called before init. Collect the list of available
+ /// modules with their revisions.
+ void initSysrepo();
+
+ /// @brief Initialization.
+ ///
+ /// Check available modules / revisions.
+ /// Get and display Kea server configurations.
+ /// Load Kea server configurations from YANG datastore.
+ /// Subscribe configuration changes in YANG datastore.
+ ///
+ /// @param cfg_mgr The configuration manager (can be null).
+ void init(NetconfCfgMgrPtr cfg_mgr);
+
+ /// @brief Clear.
+ ///
+ /// Close subscriptions and sysrepo.
+ void clear();
+
+ /// @brief Event::Change callback.
+ ///
+ /// Validate YANG datastore changes using Kea configuration test.
+ ///
+ /// @param sess The sysrepo running datastore session.
+ /// @param service_pair The service name and configuration pair.
+ /// @return return code for sysrepo.
+ static sysrepo::ErrorCode
+ change(sysrepo::Session sess, const CfgServersMapPair& service_pair);
+
+ /// @brief Event::Done callback.
+ ///
+ /// Get notified that a Kea configuration has been written to the YANG
+ /// datastore.
+ ///
+ /// @param sess The sysrepo running datastore session.
+ /// @param service_pair The service name and configuration pair.
+ /// @return return code for sysrepo.
+ static sysrepo::ErrorCode
+ done(sysrepo::Session sess, const CfgServersMapPair& service_pair);
+
+ /// @brief Log changes.
+ ///
+ /// Iterate on changes logging them. Sysrepo changes are an operation
+ /// (created, modified, deleted or moved) with old and new values
+ /// (cf sr_change_oper_e sysrepo documentation).
+ ///
+ /// @param sess The sysrepo running datastore session.
+ /// @param model The model name.
+ static void logChanges(sysrepo::Session sess, std::string_view const& model);
+
+protected:
+ /// @brief Get and display Kea server configuration.
+ ///
+ /// Retrieves current configuration via control socket (unix or http)
+ /// from a running Kea server. If boot-update is set to false, this
+ /// operation is a no-op.
+ ///
+ /// @param service_pair The service name and configuration pair.
+ void keaConfig(const CfgServersMapPair& service_pair);
+
+ /// @brief Check essential module availability.
+ ///
+ /// Emit a fatal error if an essential one (i.e. required in
+ /// a further phase) is missing or does not have the expected revision.
+ ///
+ /// @param module_name The module name.
+ /// @return true if available, false if not.
+ bool checkModule(const std::string& module_name) const;
+
+ /// @brief Retrieve names and revisions of installed modules through the
+ /// sysrepo API.
+ ///
+ /// @throw Unexpected if module information cannot be retrieved from sysrepo
+ void getModules();
+
+ /// @brief Check module availability.
+ ///
+ /// Emit a warning if a module is missing or does not have
+ /// the expected revision.
+ ///
+ /// @param servers the configured servers to check against YANG_REVISIONS.
+ /// Is empty by default for when the caller only wants to check
+ /// installed modules.
+ ///
+ /// @throw Unexpected if a module from YANG_REVISIONS is not installed or
+ /// has the wrong revision.
+ void checkModules(CfgServersMapPtr const& servers = {}) const;
+
+ /// @brief Retrieve Kea server configuration from the YANG startup
+ /// datastore and applies it to servers.
+ ///
+ /// This method retrieves the configuation from sysrepo first, then
+ /// established control socket connection to Kea servers (currently
+ /// dhcp4 and/or dhcp6) and then attempts to send configuration
+ /// using config-set.
+ ///
+ /// If boot-update is set to false, this operation is a no-op.
+ ///
+ /// @param service_pair The service name and configuration pair.
+ void yangConfig(const CfgServersMapPair& service_pair);
+
+ /// @brief Subscribe changes for a module in YANG datastore.
+ ///
+ /// @param service_pair The service name and configuration pair.
+ void subscribeToDataChanges(const CfgServersMapPair& service_pair);
+
+ /// @brief Subscribe to notifications for a given YANG module.
+ ///
+ /// @param service_pair the service name and configuration pair
+ void subscribeToNotifications(const CfgServersMapPair& service_pair);
+
+ /// @brief Set the shutdown flag of the process to true so that it can exit
+ /// at the earliest convenient time.
+ void announceShutdown() const;
+
+ /// @brief Check the shutdown flag of the process.
+ bool shouldShutdown() const;
+
+ /// @brief Sysrepo startup datastore session.
+ std::optional<sysrepo::Session> startup_sess_;
+
+ /// @brief Sysrepo running datastore session.
+ std::optional<sysrepo::Session> running_sess_;
+
+ /// @brief Available modules and revisions in Sysrepo.
+ std::map<const std::string, const std::string> modules_;
+
+ /// @brief Subscription map.
+ std::map<const std::string, sysrepo::Subscription> subscriptions_;
+}; // NetconfAgent
+
+} // namespace netconf
+} // namespace isc
+
+#endif // NETCONF_H