![]() |
Kea 2.7.7
|
High Availability hooks library implementation. More...
#include <ha_impl.h>
Public Member Functions | |
HAImpl () | |
Constructor. | |
virtual | ~HAImpl () |
Destructor. | |
void | buffer4Receive (hooks::CalloutHandle &callout_handle) |
Implementation of the "buffer4_receive" callout. | |
void | buffer6Receive (hooks::CalloutHandle &callout_handle) |
Implementation of the "buffer6_receive" callout. | |
void | commandProcessed (hooks::CalloutHandle &callout_handle) |
Implementation of the "command_processed" callout. | |
void | configure (const data::ConstElementPtr &input_config) |
Parses configuration. | |
void | continueHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-continue command. | |
HAConfigPtr | getConfig () const |
Returns a configuration for the first relationship. | |
HAConfigPtr | getConfig (const std::string &partner_name) const |
Returns parsed configuration by partner name. | |
HAServicePtr | getHAServiceByServerName (const std::string &command_name, data::ConstElementPtr args) const |
Attempts to get an HAService by server name. | |
isc::asiolink::IOServicePtr | getIOService () |
Get the hook I/O service. | |
void | haResetHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-reset command. | |
void | heartbeatHandler (hooks::CalloutHandle &callout_handle) |
Implements handle for the heartbeat command. | |
void | lease4Expire (hooks::CalloutHandle &callout_handle) |
Implementation of the "lease4_expire" callout. | |
void | lease4ServerDecline (hooks::CalloutHandle &callout_handle) |
Implementation of the "lease4_server_decline" callout. | |
void | lease6Expire (hooks::CalloutHandle &callout_handle) |
Implementation of the "lease6_expire" callout. | |
void | leases4Committed (hooks::CalloutHandle &callout_handle) |
Implementation of the "leases4_committed" callout. | |
void | leases6Committed (hooks::CalloutHandle &callout_handle) |
Implementation of the "leases6_committed" callout. | |
void | maintenanceCancelHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-maintenance-cancel command. | |
void | maintenanceNotifyHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-maintenance-notify command. | |
void | maintenanceStartHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-maintenance-start command. | |
void | scopesHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-scopes command. | |
void | setIOService (isc::asiolink::IOServicePtr io_service) |
Set the hook I/O service. | |
void | startServices (const dhcp::NetworkStatePtr &network_state, const HAServerType &server_type) |
Creates high availability services using current configuration. | |
void | subnet4Select (hooks::CalloutHandle &callout_handle) |
Implementation of the "subnet4_select" callout. | |
void | subnet6Select (hooks::CalloutHandle &callout_handle) |
Implementation of the "subnet6_select" callout. | |
void | syncCompleteNotifyHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-sync-complete-notify command. | |
void | synchronizeHandler (hooks::CalloutHandle &callout_handle) |
Implements handler for the ha-sync command. | |
Protected Member Functions | |
virtual bool | shouldReclaim (const HAServicePtr &service, const dhcp::Lease4Ptr &lease4) const |
Checks if the lease should be reclaimed by this server. | |
virtual bool | shouldReclaim (const HAServicePtr &service, const dhcp::Lease6Ptr &lease6) const |
Checks if the lease should be reclaimed by this server. | |
Protected Attributes | |
HAConfigMapperPtr | config_ |
Holds parsed configuration. | |
isc::asiolink::IOServicePtr | io_service_ |
The hook I/O service. | |
HAServiceMapperPtr | services_ |
Pointer to the high availability services (state machines). | |
High Availability hooks library implementation.
This object provides an interface between the HA hook library callouts and the HA state model implemented in the HAService
. Callouts invoke respective methods of the HAImpl
to configure the service, generate lease updates etc. The HAImpl
retrieves and validates the arguments provided within CalloutHandle
object and then invokes appropriate methods of the HAService
class.
isc::ha::HAImpl::HAImpl | ( | ) |
Constructor.
Definition at line 34 of file ha_impl.cc.
|
virtual |
Destructor.
Definition at line 64 of file ha_impl.cc.
References config_, io_service_, and services_.
void isc::ha::HAImpl::buffer4Receive | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "buffer4_receive" callout.
This callout uses HA service to check if the query should be processed by this server or a partner. If the partner should process the query, this callout sets the status to CalloutHandle::NEXT_STEP_DROP
to cause the server to drop the packet. Therefore it is important to note that, if multiple hook libraries implementing buffer4_receive
hook are loaded, the order of loading the libraries may matter. If this library sets the status to CalloutHandle::NEXT_STEP_DROP
and the other library overrides this status, the query will be processed by the server instead of being dropped. This problem may be mitigated by loading the HA library last, i.e. placing the library at the end of the "hooks-libraries" list within a Kea configuration file.
If the received query is to be processed by this server instance, the CalloutHabndle::NEXT_STEP_SKIP
status is set to prevent the server from unpacking the query because the query is unpacked by the callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 76 of file ha_impl.cc.
References isc::stats::StatsMgr::addValue(), isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::hooks::CalloutHandle::getStatus(), isc::ha::HA_BUFFER4_RECEIVE_NOT_FOR_US, isc::ha::HA_BUFFER4_RECEIVE_PACKET_OPTIONS_SKIPPED, isc::ha::HA_BUFFER4_RECEIVE_UNPACK_FAILED, isc::ha::ha_logger, isc::stats::StatsMgr::instance(), LOG_DEBUG, isc::hooks::CalloutHandle::NEXT_STEP_DROP, isc::hooks::CalloutHandle::NEXT_STEP_SKIP, services_, isc::hooks::CalloutHandle::setStatus(), and isc::Exception::what().
void isc::ha::HAImpl::buffer6Receive | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "buffer6_receive" callout.
This callout uses HA service to check if the query should be processed by this server or a partner. If the partner should process the query, this callout sets the status to CalloutHandle::NEXT_STEP_DROP
to cause the server to drop the packet. Therefore it is important to note that, if multiple hook libraries implementing buffer6_receive
hook are loaded, the order of loading the libraries may matter. If this library sets the status to CalloutHandle::NEXT_STEP_DROP
and the other library overrides this status, the query will be processed by the server instead of being dropped. This problem may be mitigated by loading the HA library last, i.e. placing the library at the end of the "hooks-libraries" list within a Kea configuration file.
If the received query is to be processed by this server instance, the CalloutHabndle::NEXT_STEP_SKIP
status is set to prevent the server from unpacking the query because the query is unpacked by the callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 397 of file ha_impl.cc.
References isc::stats::StatsMgr::addValue(), isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::hooks::CalloutHandle::getStatus(), isc::ha::HA_BUFFER6_RECEIVE_NOT_FOR_US, isc::ha::HA_BUFFER6_RECEIVE_PACKET_OPTIONS_SKIPPED, isc::ha::HA_BUFFER6_RECEIVE_UNPACK_FAILED, isc::ha::ha_logger, isc::stats::StatsMgr::instance(), LOG_DEBUG, isc::hooks::CalloutHandle::NEXT_STEP_DROP, isc::hooks::CalloutHandle::NEXT_STEP_SKIP, services_, isc::hooks::CalloutHandle::setStatus(), and isc::Exception::what().
void isc::ha::HAImpl::commandProcessed | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "command_processed" callout.
It adds the HA servers information to "status-get" command responses by calling HAService::commandProcessed
.
callout_handle | Callout handle provided to the callout. |
Definition at line 678 of file ha_impl.cc.
References config_, isc::data::Element::create(), isc::data::Element::createList(), isc::data::Element::createMap(), isc::hooks::CalloutHandle::getArgument(), isc::ha::HAConfig::HAModeToString(), isc::data::Element::map, and services_.
void isc::ha::HAImpl::configure | ( | const data::ConstElementPtr & | input_config | ) |
Parses configuration.
input_config | Configuration specified for the hooks library. |
ConfigError | when configuration fails. |
Definition at line 39 of file ha_impl.cc.
References config_, and isc::ha::HAConfigParser::parse().
void isc::ha::HAImpl::continueHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-continue command.
callout_handle | Callout handle provided to the callout. |
Definition at line 862 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc::config::parseCommand(), and isc::hooks::CalloutHandle::setArgument().
|
inline |
Returns a configuration for the first relationship.
This function is held here for historical reasons and it is currently only used in the unit tests for a single-relationship test cases. The production code should use the other variant of this function that includes a partner name as a parameter. It coveres both the cases when there is only one relationship and the hub-and-spoke case.
InvalidOperation | when there are no relationships. |
Definition at line 68 of file ha_impl.h.
References config_.
|
inline |
HAServicePtr isc::ha::HAImpl::getHAServiceByServerName | ( | const std::string & | command_name, |
data::ConstElementPtr | args ) const |
Attempts to get an HAService
by server name.
The function expects that the arguments contain the "server-name" parameter. If the parameter is not specified, a default HAService
name is returned.
command_name | command name (used for logging purposes only). |
args | command arguments or null. |
HAService
instance. BadValue | if the specified server-name doesn't exist or if the server-name wasn't specified and more than one HAService exists. |
Definition at line 1022 of file ha_impl.cc.
References isc_throw, isc::data::Element::map, services_, and isc::data::Element::string.
Referenced by continueHandler(), haResetHandler(), heartbeatHandler(), maintenanceNotifyHandler(), scopesHandler(), syncCompleteNotifyHandler(), and synchronizeHandler().
|
inline |
Get the hook I/O service.
Definition at line 237 of file ha_impl.h.
References io_service_.
void isc::ha::HAImpl::haResetHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-reset command.
callout_handle | Callout handle provided to the callout. |
Definition at line 950 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc::config::parseCommand(), and isc::hooks::CalloutHandle::setArgument().
void isc::ha::HAImpl::heartbeatHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handle for the heartbeat command.
callout_handle | Callout handle provided to the callout. |
Definition at line 711 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc::config::parseCommand(), and isc::hooks::CalloutHandle::setArgument().
void isc::ha::HAImpl::lease4Expire | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "lease4_expire" callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 340 of file ha_impl.cc.
References isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::ha::HAConfig::getSubnetServerName(), isc::ha::HA_LEASE4_EXPIRE_INVALID_HA_SERVER_NAME, isc::ha::HA_LEASE4_EXPIRE_RECLAMATION_SKIP, isc::ha::ha_logger, isc::dhcp::CfgMgr::instance(), LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_SKIP, services_, isc::hooks::CalloutHandle::setStatus(), and shouldReclaim().
void isc::ha::HAImpl::lease4ServerDecline | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "lease4_server_decline" callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 307 of file ha_impl.cc.
References config_, isc::hooks::CalloutHandle::getArgument(), isc::hooks::CalloutHandle::NEXT_STEP_CONTINUE, services_, isc::hooks::CalloutHandle::setArgument(), and isc::hooks::CalloutHandle::setStatus().
void isc::ha::HAImpl::lease6Expire | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "lease6_expire" callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 621 of file ha_impl.cc.
References isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::dhcp::CfgMgr::getCurrentCfg(), isc::ha::HAConfig::getSubnetServerName(), isc::ha::HA_LEASE6_EXPIRE_INVALID_HA_SERVER_NAME, isc::ha::HA_LEASE6_EXPIRE_RECLAMATION_SKIP, isc::ha::ha_logger, isc::dhcp::CfgMgr::instance(), LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_SKIP, services_, isc::hooks::CalloutHandle::setStatus(), and shouldReclaim().
void isc::ha::HAImpl::leases4Committed | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "leases4_committed" callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 217 of file ha_impl.cc.
References config_, isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::hooks::CalloutHandle::getContext(), isc::hooks::CalloutHandle::getParkingLotHandlePtr(), isc::ha::HA_LEASES4_COMMITTED_NO_RELATIONSHIP, isc::ha::HA_LEASES4_COMMITTED_NOTHING_TO_UPDATE, isc::ha::ha_logger, isc_throw, LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_DROP, isc::hooks::CalloutHandle::NEXT_STEP_PARK, services_, and isc::hooks::CalloutHandle::setStatus().
void isc::ha::HAImpl::leases6Committed | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "leases6_committed" callout.
callout_handle | Callout handle provided to the callout. |
Definition at line 538 of file ha_impl.cc.
References config_, isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::hooks::CalloutHandle::getContext(), isc::hooks::CalloutHandle::getParkingLotHandlePtr(), isc::ha::HA_LEASES6_COMMITTED_NO_RELATIONSHIP, isc::ha::HA_LEASES6_COMMITTED_NOTHING_TO_UPDATE, isc::ha::ha_logger, isc_throw, LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_DROP, isc::hooks::CalloutHandle::NEXT_STEP_PARK, services_, and isc::hooks::CalloutHandle::setStatus().
void isc::ha::HAImpl::maintenanceCancelHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-maintenance-cancel command.
callout_handle | Callout handle provided to the callout. |
Definition at line 941 of file ha_impl.cc.
References services_, and isc::hooks::CalloutHandle::setArgument().
void isc::ha::HAImpl::maintenanceNotifyHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-maintenance-notify command.
callout_handle | Callout handle provided to the callout. |
Definition at line 887 of file ha_impl.cc.
References isc::data::Element::boolean, isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc_throw, isc::config::parseCommandWithArgs(), isc::hooks::CalloutHandle::setArgument(), and isc::data::Element::string.
void isc::ha::HAImpl::maintenanceStartHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-maintenance-start command.
callout_handle | Callout handle provided to the callout. |
Definition at line 927 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_SUCCESS, isc::config::parseAnswer(), services_, and isc::hooks::CalloutHandle::setArgument().
void isc::ha::HAImpl::scopesHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-scopes command.
callout_handle | Callout handle provided to the callout. |
Definition at line 803 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc_throw, isc::data::Element::list, isc::data::Element::map, isc::config::parseCommand(), isc::hooks::CalloutHandle::setArgument(), and isc::data::Element::string.
|
inline |
Set the hook I/O service.
io_service | the hook I/O service. |
Definition at line 244 of file ha_impl.h.
References io_service_.
|
protectedvirtual |
Checks if the lease should be reclaimed by this server.
The lease must not be reclaimed by the server when the server is in the terminated state and the lease belongs to another server (per load balancing algorithm or when it is a standby server).
This function is virtual so that it can be derived and mocked in the tests.
service | pointer to the HA service to which the lease belongs. |
lease4 | pointer to the DHCPv4 lease being reclaimed. |
Definition at line 1052 of file ha_impl.cc.
Referenced by lease4Expire(), and lease6Expire().
|
protectedvirtual |
Checks if the lease should be reclaimed by this server.
The lease must not be reclaimed by the server when the server is in the terminated state and the lease belongs to another server (per load balancing algorithm or when it is a standby server).
This function is virtual so that it can be derived and mocked in the tests.
service | pointer to the HA service to which the lease belongs. |
lease6 | pointer to the DHCPv4 lease being reclaimed. |
Definition at line 1057 of file ha_impl.cc.
void isc::ha::HAImpl::startServices | ( | const dhcp::NetworkStatePtr & | network_state, |
const HAServerType & | server_type ) |
Creates high availability services using current configuration.
The caller must ensure that the HA configuration is valid before calling this function.
network_state | pointer to the object holding a state of the DHCP service (enabled/disabled). |
server_type | DHCP server type for which the HA service should be created. |
Definition at line 44 of file ha_impl.cc.
References config_, io_service_, and services_.
void isc::ha::HAImpl::subnet4Select | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "subnet4_select" callout.
This callout decides whether the received packet should be processed by the server when the server has multiple HA relationships. The relationship selection is based on the selected subnet.
callout_handle | Callout handle provided to the callout. |
Definition at line 133 of file ha_impl.cc.
References isc::stats::StatsMgr::addValue(), isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::ha::HAConfig::getSubnetServerName(), isc::ha::ha_logger, isc::ha::HA_SUBNET4_SELECT_INVALID_HA_SERVER_NAME, isc::ha::HA_SUBNET4_SELECT_NO_RELATIONSHIP_FOR_SUBNET, isc::ha::HA_SUBNET4_SELECT_NO_RELATIONSHIP_SELECTOR_FOR_SUBNET, isc::ha::HA_SUBNET4_SELECT_NO_SUBNET_SELECTED, isc::ha::HA_SUBNET4_SELECT_NOT_FOR_US, isc::stats::StatsMgr::instance(), LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_DROP, services_, isc::hooks::CalloutHandle::setContext(), and isc::hooks::CalloutHandle::setStatus().
void isc::ha::HAImpl::subnet6Select | ( | hooks::CalloutHandle & | callout_handle | ) |
Implementation of the "subnet6_select" callout.
This callout decides whether the received packet should be processed by the server when the server has multiple HA relationships. The relationship selection is based on the selected subnet.
callout_handle | Callout handle provided to the callout. |
Definition at line 454 of file ha_impl.cc.
References isc::stats::StatsMgr::addValue(), isc::log::DBGLVL_TRACE_BASIC, isc::hooks::CalloutHandle::getArgument(), isc::ha::HAConfig::getSubnetServerName(), isc::ha::ha_logger, isc::ha::HA_SUBNET6_SELECT_INVALID_HA_SERVER_NAME, isc::ha::HA_SUBNET6_SELECT_NO_RELATIONSHIP_FOR_SUBNET, isc::ha::HA_SUBNET6_SELECT_NO_RELATIONSHIP_SELECTOR_FOR_SUBNET, isc::ha::HA_SUBNET6_SELECT_NO_SUBNET_SELECTED, isc::ha::HA_SUBNET6_SELECT_NOT_FOR_US, isc::stats::StatsMgr::instance(), LOG_DEBUG, LOG_ERROR, isc::hooks::CalloutHandle::NEXT_STEP_DROP, services_, isc::hooks::CalloutHandle::setContext(), and isc::hooks::CalloutHandle::setStatus().
void isc::ha::HAImpl::syncCompleteNotifyHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-sync-complete-notify command.
callout_handle | Callout handle provided to the callout. |
Definition at line 976 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc::dhcp::NetworkState::HA_REMOTE_COMMAND, isc::data::Element::integer, isc_throw, isc::config::parseCommand(), and isc::hooks::CalloutHandle::setArgument().
void isc::ha::HAImpl::synchronizeHandler | ( | hooks::CalloutHandle & | callout_handle | ) |
Implements handler for the ha-sync command.
callout_handle | Callout handle provided to the callout. |
Definition at line 738 of file ha_impl.cc.
References isc::config::CONTROL_RESULT_ERROR, isc::config::createAnswer(), isc::hooks::CalloutHandle::getArgument(), getHAServiceByServerName(), isc::data::Element::integer, isc_throw, isc::data::Element::map, isc::config::parseCommand(), isc::hooks::CalloutHandle::setArgument(), and isc::data::Element::string.
|
protected |
Holds parsed configuration.
Definition at line 282 of file ha_impl.h.
Referenced by ~HAImpl(), commandProcessed(), configure(), getConfig(), getConfig(), lease4ServerDecline(), leases4Committed(), leases6Committed(), and startServices().
|
protected |
The hook I/O service.
Definition at line 279 of file ha_impl.h.
Referenced by ~HAImpl(), getIOService(), setIOService(), and startServices().
|
protected |
Pointer to the high availability services (state machines).
Definition at line 285 of file ha_impl.h.
Referenced by ~HAImpl(), buffer4Receive(), buffer6Receive(), commandProcessed(), getHAServiceByServerName(), lease4Expire(), lease4ServerDecline(), lease6Expire(), leases4Committed(), leases6Committed(), maintenanceCancelHandler(), maintenanceStartHandler(), startServices(), subnet4Select(), and subnet6Select().