123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- // Copyright (C) 2016 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 PGSQL_HOST_DATA_SOURCE_H
- #define PGSQL_HOST_DATA_SOURCE_H
- #include <dhcpsrv/base_host_data_source.h>
- #include <dhcpsrv/pgsql_connection.h>
- #include <dhcpsrv/pgsql_exchange.h>
- namespace isc {
- namespace dhcp {
- /// Forward declaration to the implementation of the @ref PgSqlHostDataSource.
- class PgSqlHostDataSourceImpl;
- /// @brief PostgreSQL Host Data Source
- ///
- /// This class implements the @ref isc::dhcp::BaseHostDataSource interface to
- /// the PostgreSQL database. Use of this backend presupposes that a PostgreSQL
- /// database is available and that the Kea schema has been created within it.
- ///
- /// Reservations are uniquely identified by identifier type and value.
- /// The currently supported values are defined in @ref Host::IdentifierType
- /// as well as in host_identifier_table:
- ///
- /// - IDENT_HWADDR
- /// - IDENT_DUID
- /// - IDENT_CIRCUIT_ID
- /// - IDENT_CLIENT_ID
- ///
- class PgSqlHostDataSource: 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::dhcp::DbOpenError Error opening the database
- /// @throw isc::dhcp::DbOperationError An operation on the open database has
- /// failed.
- PgSqlHostDataSource(const DatabaseConnection::ParameterMap& parameters);
- /// @brief Virtual destructor.
- /// Frees database resources and closes the database connection through
- /// the destruction of member impl_.
- virtual ~PgSqlHostDataSource();
- /// @brief Return all hosts for the specified HW address or DUID.
- ///
- /// This method returns all @c Host objects which represent reservations
- /// for the specified HW address or DUID. Note, that this method may
- /// return multiple reservations because a particular client may have
- /// reservations in multiple subnets and the same client may be identified
- /// by HW address or DUID. The server is unable to verify that the specific
- /// DUID and HW address belong to the same client, until the client sends
- /// a DHCP message.
- ///
- /// Specifying both hardware address and DUID is allowed for this method
- /// and results in returning all objects that are associated with hardware
- /// address OR duid. For example: if one host is associated with the
- /// specified hardware address and another host is associated with the
- /// specified DUID, two hosts will be returned.
- ///
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid client id or NULL if not available, e.g. DHCPv4 client case.
- ///
- /// @return Collection of const @c Host objects.
- virtual ConstHostCollection
- getAll(const HWAddrPtr& hwaddr, const DuidPtr& duid = DuidPtr()) const;
- /// @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 begining 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 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.
- ///
- /// Implementations of this method should guard against the case when
- /// mutliple instances of the @c Host are present, e.g. when two
- /// @c Host objects are found, one for the DUID, another one for the
- /// HW address. In such case, an implementation of this method
- /// should throw an MultipleRecords exception.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid client id or NULL if not available.
- ///
- /// @return Const @c Host object using a specified HW address or DUID.
- virtual ConstHostPtr
- get4(const SubnetID& subnet_id, const HWAddrPtr& hwaddr,
- const DuidPtr& duid = DuidPtr()) 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 begining 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.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param address reserved IPv4 address.
- ///
- /// @return Const @c Host object using a specified IPv4 address.
- /// @throw BadValue is given an IPv6 address
- virtual ConstHostPtr
- get4(const SubnetID& subnet_id, const asiolink::IOAddress& address) const;
- /// @brief Returns a host connected to the IPv6 subnet.
- ///
- /// Implementations of this method should guard against the case when
- /// mutliple instances of the @c Host are present, e.g. when two
- /// @c Host objects are found, one for the DUID, another one for the
- /// HW address. In such case, an implementation of this method
- /// should throw an MultipleRecords exception.
- ///
- /// @param subnet_id Subnet identifier.
- /// @param hwaddr HW address of the client or NULL if no HW address
- /// available.
- /// @param duid DUID or NULL if not available.
- ///
- /// @return Const @c Host object using a specified HW address or DUID.
- virtual ConstHostPtr
- get6(const SubnetID& subnet_id, const DuidPtr& duid,
- const HWAddrPtr& hwaddr = HWAddrPtr()) 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 begining 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 HW address or DUID.
- virtual ConstHostPtr
- get6(const asiolink::IOAddress& prefix, const uint8_t prefix_len) const;
- /// @brief Adds a new host to the collection.
- ///
- /// The method will insert the given host and all of its children (v4
- /// options, v6 options, and v6 reservations) into the database. It
- /// relies on constraints defined as part of the PostgreSQL schema to
- /// defend against duplicate entries and to ensure referential
- /// integrity.
- ///
- /// Violation of any of these constraints for a host will result in a
- /// DuplicateEntry exception:
- ///
- /// -# IPV4_ADDRESS and DHCP4_SUBNET_ID combination must be unique
- /// -# IPV6 ADDRESS and PREFIX_LEN combination must be unique
- /// -# DHCP ID, DHCP ID TYPE, and DHCP4_SUBNET_ID combination must be unique
- /// -# DHCP ID, DHCP ID TYPE, and DHCP6_SUBNET_ID combination must be unique
- ///
- /// In addition, violating the following referential contraints will
- /// a DbOperationError exception:
- ///
- /// -# DHCP ID TYPE must be defined in the HOST_IDENTIFIER_TYPE table
- /// -# For DHCP4 Options:
- /// -# HOST_ID must exist with HOSTS
- /// -# SCOPE_ID must be defined in DHCP_OPTION_SCOPE
- /// -# For DHCP6 Options:
- /// -# HOST_ID must exist with HOSTS
- /// -# SCOPE_ID must be defined in DHCP_OPTION_SCOPE
- /// -# For IPV6 Reservations:
- /// -# HOST_ID must exist with HOSTS
- /// -# Address and Prefix Length must be unique (DuplicateEntry)
- ///
- /// @param host Pointer to the new @c Host object being added.
- /// @throw DuplicateEntry or DbOperationError dependent on the constraint
- /// violation
- virtual void add(const HostPtr& host);
- /// @brief Return backend type
- ///
- /// Returns the type of database as the string "postgresql". This is
- /// same value as used for configuration purposes.
- ///
- /// @return Type of the backend.
- virtual std::string getType() const {
- return (std::string("postgresql"));
- }
- /// @brief Returns the name of the open database
- ///
- /// @return String containing the name of the database
- 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.
- ///
- /// @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::dhcp::DbOperationError An operation on the open database
- /// has failed.
- virtual std::pair<uint32_t, uint32_t> getVersion() const;
- /// @brief Commit Transactions
- ///
- /// Commits all pending database operations.
- virtual void commit();
- /// @brief Rollback Transactions
- ///
- /// Rolls back all pending database operations.
- virtual void rollback();
- private:
- /// @brief Pointer to the implementation of the @ref PgSqlHostDataSource.
- PgSqlHostDataSourceImpl* impl_;
- };
- }
- }
- #endif // PGSQL_HOST_DATA_SOURCE_H
|