summaryrefslogtreecommitdiffstats
path: root/src/bin/agent/ca_command_mgr.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/agent/ca_command_mgr.h')
-rw-r--r--src/bin/agent/ca_command_mgr.h118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/bin/agent/ca_command_mgr.h b/src/bin/agent/ca_command_mgr.h
new file mode 100644
index 0000000..c883f77
--- /dev/null
+++ b/src/bin/agent/ca_command_mgr.h
@@ -0,0 +1,118 @@
+// Copyright (C) 2017-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 CTRL_AGENT_COMMAND_MGR_H
+#define CTRL_AGENT_COMMAND_MGR_H
+
+#include <config/hooked_command_mgr.h>
+#include <exceptions/exceptions.h>
+#include <boost/noncopyable.hpp>
+#include <boost/shared_ptr.hpp>
+
+namespace isc {
+namespace agent {
+
+/// @brief Exception thrown when an error occurred during control command
+/// forwarding.
+class CommandForwardingError : public Exception {
+public:
+ CommandForwardingError(const char* file, size_t line, const char* what) :
+ isc::Exception(file, line, what) { };
+};
+
+/// @brief Command Manager for Control Agent.
+///
+/// This is an implementation of the Command Manager within Control Agent.
+/// In addition to the standard capabilities of the @ref HookedCommandMgr
+/// it is also intended to forward commands to the respective Kea servers
+/// when the command is not supported directly by the Control Agent.
+///
+/// The @ref CtrlAgentCommandMgr is implemented as a singleton. The commands
+/// are registered using @c CtrlAgentCommandMgr::instance().registerCommand().
+/// The @ref CtrlAgentResponseCreator uses the sole instance of the Command
+/// Manager to handle incoming commands.
+class CtrlAgentCommandMgr : public config::HookedCommandMgr,
+ public boost::noncopyable {
+public:
+
+ /// @brief Returns sole instance of the Command Manager.
+ static CtrlAgentCommandMgr& instance();
+
+ /// @brief Triggers command processing.
+ ///
+ /// This method overrides the @c BaseCommandMgr::processCommand to ensure
+ /// that the response is always wrapped in a list. The base implementation
+ /// returns a response map. Kea Control Agent forwards commands to multiple
+ /// daemons behind it and thus it must return a list of responses from
+ /// respective daemons. If an error occurs during command processing the
+ /// error response must also be wrapped in a list because caller expects
+ /// that CA always returns a list.
+ ///
+ /// This method is an entry point for dealing with a command. Internally
+ /// it calls @c CtrlAgentCommandMgr::handleCommand.
+ ///
+ /// @param cmd Pointer to the data element representing command in JSON
+ /// format.
+ /// @return Pointer to the response.
+ virtual isc::data::ConstElementPtr
+ processCommand(const isc::data::ConstElementPtr& cmd);
+
+ /// @brief Handles the command having a given name and arguments.
+ ///
+ /// This method extends the base implementation with the ability to forward
+ /// commands to Kea servers.
+ ///
+ /// If the received command doesn't include 'service' parameter or this
+ /// parameter is blank, the command is first handled by the attached hooks
+ /// libraries, and if still unhandled, the Control Agent itself.
+ ///
+ /// If the non-blank 'service' parameter has been specified the hooks
+ /// are executed. If the hooks process the command the result is returned
+ /// to the controlling client. Otherwise, the command is forwarded to each
+ /// Kea server listed in the 'service' parameter.
+ ///
+ /// @param cmd_name Command name.
+ /// @param params Command arguments.
+ /// @param original_cmd Original command being processed.
+ ///
+ /// @return Pointer to the const data element representing a list of
+ /// responses to the command. If the command has been handled by the CA,
+ /// this list includes one response.
+ virtual isc::data::ConstElementPtr
+ handleCommand(const std::string& cmd_name,
+ const isc::data::ConstElementPtr& params,
+ const isc::data::ConstElementPtr& original_cmd);
+
+private:
+
+ /// @brief Tries to forward received control command to a specified server.
+ ///
+ /// @param service Contains name of the service where the command should be
+ /// forwarded.
+ /// @param cmd_name Command name.
+ /// @param command Pointer to the object representing the forwarded command.
+ ///
+ /// @return Response to forwarded command.
+ /// @throw CommandForwardingError when an error occurred during forwarding.
+ isc::data::ConstElementPtr
+ forwardCommand(const std::string& service, const std::string& cmd_name,
+ const isc::data::ConstElementPtr& command);
+
+ /// @brief Private constructor.
+ ///
+ /// The instance should be created using @ref CtrlAgentCommandMgr::instance,
+ /// thus the constructor is private.
+ CtrlAgentCommandMgr();
+
+ /// @brief Remote address of HTTP endpoint.
+ std::string remote_addr_;
+
+};
+
+} // end of namespace isc::agent
+} // end of namespace isc
+
+#endif