diff options
author | Razvan Becheriu <razvan@isc.org> | 2024-09-11 17:14:09 +0200 |
---|---|---|
committer | Razvan Becheriu <razvan@isc.org> | 2024-09-16 15:31:01 +0200 |
commit | 09a17d0d8d1ad620c176b55fbcbf0e3fabc5f628 (patch) | |
tree | f1c5c366c8028c2aaa750c9b84da1ec5688c0565 /src/lib/dhcpsrv/mysql_host_data_source.h | |
parent | [#3542] Added ChangeLog entry (diff) | |
download | kea-09a17d0d8d1ad620c176b55fbcbf0e3fabc5f628.tar.xz kea-09a17d0d8d1ad620c176b55fbcbf0e3fabc5f628.zip |
[#3536] move lease and host backends
Diffstat (limited to 'src/lib/dhcpsrv/mysql_host_data_source.h')
-rw-r--r-- | src/lib/dhcpsrv/mysql_host_data_source.h | 537 |
1 files changed, 0 insertions, 537 deletions
diff --git a/src/lib/dhcpsrv/mysql_host_data_source.h b/src/lib/dhcpsrv/mysql_host_data_source.h deleted file mode 100644 index 10643d1183..0000000000 --- a/src/lib/dhcpsrv/mysql_host_data_source.h +++ /dev/null @@ -1,537 +0,0 @@ -// Copyright (C) 2015-2023 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 MYSQL_HOST_DATA_SOURCE_H -#define MYSQL_HOST_DATA_SOURCE_H - -#include <database/database_connection.h> -#include <database/db_exceptions.h> -#include <dhcpsrv/base_host_data_source.h> -#include <mysql/mysql_connection.h> - -#include <stdint.h> - -#include <utility> -#include <string> - -namespace isc { -namespace dhcp { - -/// Forward declaration to the implementation of the @ref MySqlHostDataSource. -class MySqlHostDataSourceImpl; - -/// @brief Type of pointers to MySqlHostDataSourceImpl. -typedef boost::shared_ptr<MySqlHostDataSourceImpl> MySqlHostDataSourceImplPtr; - -/// Forward declaration for the thread context for the manager pool. -class MySqlHostContext; - -/// @brief Type of pointers to contexts. -typedef boost::shared_ptr<MySqlHostContext> MySqlHostContextPtr; - -/// @brief MySQL Host Data Source -/// -/// This class implements the @ref isc::dhcp::BaseHostDataSource interface to -/// the MySQL database. Use of this backend presupposes that a MySQL database -/// is available and that the Kea schema has been created within it. -class MySqlHostDataSource : public BaseHostDataSource { -public: - - /// @brief Constructor - /// - /// Uses the following keywords in the parameters passed to it to - /// connect to the database: - /// - name - Name of the database to which to connect (mandatory) - /// - host - Host to which to connect (optional, defaults to "localhost") - /// - user - Username under which to connect (optional) - /// - password - Password for "user" on the database (optional) - /// - /// If the database is successfully opened, the version number in the - /// schema_version table will be checked against hard-coded value in - /// the implementation file. - /// - /// Finally, all the SQL commands are pre-compiled. - /// - /// @param parameters A data structure relating keywords and values - /// concerned with the database. - /// - /// @throw isc::dhcp::NoDatabaseName Mandatory database name not given - /// @throw isc::db::DbOpenError Error opening the database or the - /// schema version is invalid. - /// @throw isc::db::DbOperationError An operation on the open database has - /// failed. - MySqlHostDataSource(const db::DatabaseConnection::ParameterMap& parameters); - - /// @brief Virtual destructor. - /// - /// Releases prepared MySQL statements used by the backend. - virtual ~MySqlHostDataSource(); - - /// @brief Return backend parameters - /// - /// Returns the backend parameters - /// - /// @return Parameters of the backend. - virtual isc::db::DatabaseConnection::ParameterMap getParameters() const; - - /// @brief Adds a new host to the collection. - /// - /// The implementations of this method should guard against duplicate - /// reservations for the same host, where possible. For example, when the - /// reservation for the same HW address and subnet id is added twice, the - /// addHost method should throw an DuplicateEntry exception. Note, that - /// usually it is impossible to guard against adding duplicated host, where - /// one instance is identified by HW address, another one by DUID. - /// - /// @param host Pointer to the new @c Host object being added. - virtual void add(const HostPtr& host); - - /// @brief Attempts to delete hosts by (subnet-id, address) - /// - /// This method supports both v4 and v6. - /// - /// @param subnet_id subnet identifier. - /// @param addr specified address. - /// @return true if deletion was successful, false if the host was not there. - /// @throw various exceptions in case of errors - virtual bool del(const SubnetID& subnet_id, - const asiolink::IOAddress& addr); - - /// @brief Attempts to delete a host by (subnet4-id, identifier type, identifier) - /// - /// This method supports v4 hosts only. - /// - /// @param subnet_id subnet identifier. - /// @param identifier_type Identifier type. - /// @param identifier_begin Pointer to a beginning of a buffer containing - /// an identifier. - /// @param identifier_len Identifier length. - /// - /// @return true if deletion was successful, false if the host was not there. - /// @throw various exceptions in case of errors - virtual bool del4(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len); - - /// @brief Attempts to delete a host by (subnet6-id, identifier type, identifier) - /// - /// This method supports v6 hosts only. - /// - /// @param subnet_id subnet identifier. - /// @param identifier_type Identifier type. - /// @param identifier_begin Pointer to a beginning of a buffer containing - /// an identifier. - /// @param identifier_len Identifier length. - /// - /// @return true if deletion was successful, false if the host was not there. - /// @throw various exceptions in case of errors - virtual bool del6(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len); - - /// @brief Return all hosts connected to any subnet for which reservations - /// have been made using a specified identifier. - /// - /// This method returns all @c Host objects which represent reservations - /// for a specified identifier. This method may return multiple hosts - /// because a particular client may have reservations in multiple subnets. - /// - /// @param identifier_type Identifier type. - /// @param identifier_begin Pointer to a beginning of a buffer containing - /// an identifier. - /// @param identifier_len Identifier length. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAll(const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len) const; - - /// @brief Return all hosts in a DHCPv4 subnet. - /// - /// This method returns all @ref Host objects which represent reservations - /// in a specified subnet. - /// - /// @param subnet_id subnet identifier to filter by - /// - /// @return Collection of const @ref Host objects. - virtual ConstHostCollection getAll4(const SubnetID& subnet_id) const; - - /// @brief Return all hosts in a DHCPv6 subnet. - /// - /// This method returns all @ref Host objects which represent reservations - /// in a specified subnet. - /// - /// @param subnet_id subnet identifier to filter by - /// - /// @return Collection of const @ref Host objects. - virtual ConstHostCollection getAll6(const SubnetID& subnet_id) const; - - /// @brief Return all hosts with a hostname. - /// - /// This method returns all @c Host objects which represent reservations - /// using a specified hostname. - /// - /// MySQL uses the case-insensitive hosts_by_hostname index on hostname. - /// - /// @param hostname The lower case hostname. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAllbyHostname(const std::string& hostname) const; - - /// @brief Return all hosts with a hostname in a DHCPv4 subnet. - /// - /// This method returns all @c Host objects which represent reservations - /// using a specified hostname in a specified subnet. - /// - /// @param hostname The lower case hostname. - /// @param subnet_id Subnet identifier. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAllbyHostname4(const std::string& hostname, - const SubnetID& subnet_id) const; - - /// @brief Return all hosts with a hostname in a DHCPv6 subnet. - /// - /// This method returns all @c Host objects which represent reservations - /// using a specified hostname in a specified subnet. - /// - /// @param hostname The lower case hostname. - /// @param subnet_id Subnet identifier. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAllbyHostname6(const std::string& hostname, - const SubnetID& subnet_id) const; - - /// @brief Returns range of hosts in a DHCPv4 subnet. - /// - /// This method returns a page of @c Host objects which represent - /// reservations in a specified subnet. - /// - /// @param subnet_id Subnet identifier. - /// @param source_index Index of the source (unused). - /// @param lower_host_id Host identifier used as lower bound for the - /// returned range. - /// @param page_size maximum size of the page returned. - /// - /// @return Collection of const @c Host objects (may be empty). - virtual ConstHostCollection getPage4(const SubnetID& subnet_id, - size_t& source_index, - uint64_t lower_host_id, - const HostPageSize& page_size) const; - - /// @brief Returns range of hosts in a DHCPv6 subnet. - /// - /// This method returns a page of @c Host objects which represent - /// reservations in a specified subnet. - /// - /// @param subnet_id Subnet identifier. - /// @param source_index Index of the source (unused). - /// @param lower_host_id Host identifier used as lower bound for the - /// returned range. - /// @param page_size maximum size of the page returned. - /// - /// @return Collection of const @c Host objects (may be empty). - virtual ConstHostCollection getPage6(const SubnetID& subnet_id, - size_t& source_index, - uint64_t lower_host_id, - const HostPageSize& page_size) const; - - /// @brief Returns range of hosts. - /// - /// This method returns a page of @c Host objects which represent - /// reservations. - /// - /// @param source_index Index of the source (unused). - /// @param lower_host_id Host identifier used as lower bound for the - /// returned range. - /// @param page_size maximum size of the page returned. - /// - /// @return Collection of const @c Host objects (may be empty). - virtual ConstHostCollection getPage4(size_t& source_index, - uint64_t lower_host_id, - const HostPageSize& page_size) const; - - /// @brief Returns range of hosts. - /// - /// This method returns a page of @c Host objects which represent - /// reservations. - /// - /// @param source_index Index of the source (unused). - /// @param lower_host_id Host identifier used as lower bound for the - /// returned range. - /// @param page_size maximum size of the page returned. - /// - /// @return Collection of const @c Host objects (may be empty). - virtual ConstHostCollection getPage6(size_t& source_index, - uint64_t lower_host_id, - const HostPageSize& page_size) const; - - /// @brief Returns a collection of hosts using the specified IPv4 address. - /// - /// This method may return multiple @c Host objects if they are connected - /// to different subnets. - /// - /// @param address IPv4 address for which the @c Host object is searched. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAll4(const asiolink::IOAddress& address) const; - - /// @brief Returns a host connected to the IPv4 subnet. - /// - /// @param subnet_id Subnet identifier. - /// @param identifier_type Identifier type. - /// @param identifier_begin Pointer to a beginning of a buffer containing - /// an identifier. - /// @param identifier_len Identifier length. - /// - /// @return Const @c Host object for which reservation has been made using - /// the specified identifier. - virtual ConstHostPtr get4(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len) const; - - /// @brief Returns a host connected to the IPv4 subnet and having - /// a reservation for a specified IPv4 address. - /// - /// One of the use cases for this method is to detect collisions between - /// dynamically allocated addresses and reserved addresses. When the new - /// address is assigned to a client, the allocation mechanism should check - /// if this address is not reserved for some other host and do not allocate - /// this address if reservation is present. - /// - /// Implementations of this method should guard against invalid addresses, - /// such as IPv6 address. - /// - /// @param subnet_id Subnet identifier. - /// @param address reserved IPv4 address. - /// - /// @return Const @c Host object using a specified IPv4 address. - virtual ConstHostPtr get4(const SubnetID& subnet_id, - const asiolink::IOAddress& address) const; - - /// @brief Returns all hosts connected to the IPv4 subnet and having - /// a reservation for a specified address. - /// - /// In most cases it is desired that there is at most one reservation - /// for a given IPv4 address within a subnet. In a default configuration, - /// the backend does not allow for inserting more than one host with - /// the same IPv4 reservation. In that case, the number of hosts returned - /// by this function is 0 or 1. - /// - /// If the backend is configured to allow multiple hosts with reservations - /// for the same IPv4 address in the given subnet, this method can return - /// more than one host. - /// - /// The typical use case when a single IPv4 address is reserved for multiple - /// hosts is when these hosts represent different interfaces of the same - /// machine and each interface comes with a different MAC address. In that - /// case, the same IPv4 address is assigned regardless of which interface is - /// used by the DHCP client to communicate with the server. - /// - /// @param subnet_id Subnet identifier. - /// @param address reserved IPv4 address. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection - getAll4(const SubnetID& subnet_id, - const asiolink::IOAddress& address) const; - - /// @brief Returns a host connected to the IPv6 subnet. - /// - /// @param subnet_id Subnet identifier. - /// @param identifier_type Identifier type. - /// @param identifier_begin Pointer to a beginning of a buffer containing - /// an identifier. - /// @param identifier_len Identifier length. - /// - /// @return Const @c Host object for which reservation has been made using - /// the specified identifier. - virtual ConstHostPtr get6(const SubnetID& subnet_id, - const Host::IdentifierType& identifier_type, - const uint8_t* identifier_begin, - const size_t identifier_len) const; - - /// @brief Returns a host using the specified IPv6 prefix. - /// - /// @param prefix IPv6 prefix for which the @c Host object is searched. - /// @param prefix_len IPv6 prefix length. - /// - /// @return Const @c Host object using a specified IPv6 prefix. - virtual ConstHostPtr get6(const asiolink::IOAddress& prefix, - const uint8_t prefix_len) const; - - /// @brief Returns a host connected to the IPv6 subnet and having - /// a reservation for a specified IPv6 address or prefix. - /// - /// @param subnet_id Subnet identifier. - /// @param address reserved IPv6 address/prefix. - /// - /// @return Const @c Host object using a specified IPv6 address/prefix. - virtual ConstHostPtr get6(const SubnetID& subnet_id, - const asiolink::IOAddress& address) const; - - /// @brief Returns all hosts connected to the IPv6 subnet and having - /// a reservation for a specified address or delegated prefix (lease). - /// - /// In most cases it is desired that there is at most one reservation - /// for a given IPv6 lease within a subnet. In a default configuration, - /// the backend does not allow for inserting more than one host with - /// the same IPv6 address or prefix. In that case, the number of hosts - /// returned by this function is 0 or 1. - /// - /// If the backend is configured to allow multiple hosts with reservations - /// for the same IPv6 lease in the given subnet, this method can return - /// more than one host. - /// - /// The typical use case when a single IPv6 lease is reserved for multiple - /// hosts is when these hosts represent different interfaces of the same - /// machine and each interface comes with a different MAC address. In that - /// case, the same IPv6 lease is assigned regardless of which interface is - /// used by the DHCP client to communicate with the server. - /// - /// @param subnet_id Subnet identifier. - /// @param address reserved IPv6 address/prefix. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection - getAll6(const SubnetID& subnet_id, - const asiolink::IOAddress& address) const; - - /// @brief Returns all hosts having a reservation for a specified - /// address or delegated prefix (lease) in all subnets. - /// - /// In most cases it is desired that there is at most one reservation - /// for a given IPv6 lease within a subnet. In a default configuration, - /// the backend does not allow for inserting more than one host with - /// the same IPv6 address or prefix. - /// - /// If the backend is configured to allow multiple hosts with reservations - /// for the same IPv6 lease in the given subnet, this method can return - /// more than one host per subnet. - /// - /// The typical use case when a single IPv6 lease is reserved for multiple - /// hosts is when these hosts represent different interfaces of the same - /// machine and each interface comes with a different MAC address. In that - /// case, the same IPv6 lease is assigned regardless of which interface is - /// used by the DHCP client to communicate with the server. - /// - /// @param address reserved IPv6 address/prefix. - /// - /// @return Collection of const @c Host objects. - virtual ConstHostCollection getAll6(const asiolink::IOAddress& address) const; - - /// @brief Implements @ref BaseHostDataSource::update() for MySQL. - /// - /// Attempts to update an existing host entry. - /// - /// @param host the host up to date with the requested changes - void update(HostPtr const& host); - - /// @brief Return backend type - /// - /// Returns the type of the backend (e.g. "mysql", "memfile" etc.) - /// - /// @return Type of the backend. - virtual std::string getType() const { - return (std::string("mysql")); - } - - /// @brief Returns backend name. - /// - /// Each backend have specific name. - /// - /// @return "mysql". - virtual std::string getName() const; - - /// @brief Returns description of the backend. - /// - /// This description may be multiline text that describes the backend. - /// - /// @return Description of the backend. - virtual std::string getDescription() const; - - /// @brief Returns backend version. - /// - /// @param timer_name The DB reconnect timer name. - /// @return Version number stored in the database, as a pair of unsigned - /// integers. "first" is the major version number, "second" the - /// minor number. - /// - /// @throw isc::db::DbOperationError An operation on the open database - /// has failed. - virtual std::pair<uint32_t, uint32_t> getVersion(const std::string& timer_name = std::string()) const; - - /// @brief Commit Transactions - /// - /// Commits all pending database operations. - virtual void commit(); - - /// @brief Rollback Transactions - /// - /// Rolls back all pending database operations. - virtual void rollback(); - - /// @brief Controls whether IP reservations are unique or non-unique. - /// - /// In a typical case, the IP reservations are unique and backends verify - /// prior to adding a host reservation to the database that the reservation - /// for a given IP address/subnet does not exist. In some cases it may be - /// required to allow non-unique IP reservations, e.g. in the case when a - /// host has several interfaces and independently of which interface is used - /// by this host to communicate with the DHCP server the same IP address - /// should be assigned. In this case the @c unique value should be set to - /// false to disable the checks for uniqueness on the backend side. - /// - /// @param unique boolean flag indicating if the IP reservations must be - /// unique within the subnet or can be non-unique. - /// @return always true because this backend supports both the case when - /// the addresses must be unique and when they may be non-unique. - virtual bool setIPReservationsUnique(const bool unique); - - /// @brief Flag which indicates if the host manager has at least one - /// unusable connection. - /// - /// @return true if there is at least one unusable connection, false - /// otherwise - virtual bool isUnusable(); - - /// @brief Context RAII Allocator. - class MySqlHostContextAlloc { - public: - - /// @brief Constructor - /// - /// This constructor takes a context of the pool if one is available - /// or creates a new one. - /// - /// @param mgr A parent instance - MySqlHostContextAlloc(MySqlHostDataSourceImpl& mgr); - - /// @brief Destructor - /// - /// This destructor puts back the context in the pool. - ~MySqlHostContextAlloc(); - - /// @brief The context - MySqlHostContextPtr ctx_; - - private: - /// @brief The manager - MySqlHostDataSourceImpl& mgr_; - }; - -private: - /// @brief Pointer to the implementation of the @ref MySqlHostDataSource. - MySqlHostDataSourceImplPtr impl_; -}; - -} -} - -#endif // MYSQL_HOST_DATA_SOURCE_H |