Kea  2.3.9
base_host_data_source.h
Go to the documentation of this file.
1 // Copyright (C) 2014-2023 Internet Systems Consortium, Inc. ("ISC")
2 //
3 // This Source Code Form is subject to the terms of the Mozilla Public
4 // License, v. 2.0. If a copy of the MPL was not distributed with this
5 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 
7 #ifndef BASE_HOST_DATA_SOURCE_H
8 #define BASE_HOST_DATA_SOURCE_H
9 
10 #include <asiolink/io_address.h>
12 #include <dhcpsrv/host.h>
13 #include <exceptions/exceptions.h>
14 #include <boost/shared_ptr.hpp>
15 
16 #include <limits>
17 #include <vector>
18 
19 namespace isc {
20 namespace dhcp {
21 
23 class DuplicateHost : public Exception {
24 public:
25  DuplicateHost(const char* file, size_t line, const char* what) :
26  isc::Exception(file, line, what) { };
27 };
28 
30 class HostNotFound : public Exception {
31 public:
32  HostNotFound(const char* file, size_t line, const char* what) :
33  isc::Exception(file, line, what) { };
34 };
35 
38 class ReservedAddress : public Exception {
39 public:
40  ReservedAddress(const char* file, size_t line, const char* what) :
41  isc::Exception(file, line, what) { };
42 };
43 
46 class BadHostAddress : public isc::BadValue {
47 public:
48  BadHostAddress(const char* file, size_t line, const char* what) :
49  isc::BadValue(file, line, what) { };
50 };
51 
53 class HostPageSize {
54 public:
55 
61  explicit HostPageSize(const size_t page_size) : page_size_(page_size) {
62  if (page_size_ == 0) {
63  isc_throw(OutOfRange, "page size of retrieved hosts must not be 0");
64  }
65  if (page_size_ > std::numeric_limits<uint32_t>::max()) {
66  isc_throw(OutOfRange, "page size of retrieved hosts must not be greate than "
67  << std::numeric_limits<uint32_t>::max());
68  }
69  }
70 
71  const size_t page_size_;
72 };
73 
89 public:
90 
100  enum IdType {
101  ID_HWADDR = 0,
102  ID_DUID = 1
103  };
104 
106  virtual ~BaseHostDataSource() { }
107 
121  virtual ConstHostCollection
122  getAll(const Host::IdentifierType& identifier_type,
123  const uint8_t* identifier_begin,
124  const size_t identifier_len) const = 0;
125 
134  virtual ConstHostCollection
135  getAll4(const SubnetID& subnet_id) const = 0;
136 
145  virtual ConstHostCollection
146  getAll6(const SubnetID& subnet_id) const = 0;
147 
160  virtual ConstHostCollection
161  getAllbyHostname(const std::string& hostname) const = 0;
162 
172  virtual ConstHostCollection
173  getAllbyHostname4(const std::string& hostname, const SubnetID& subnet_id) const = 0;
174 
184  virtual ConstHostCollection
185  getAllbyHostname6(const std::string& hostname, const SubnetID& subnet_id) const = 0;
186 
204  virtual ConstHostCollection
205  getPage4(const SubnetID& subnet_id,
206  size_t& source_index,
207  uint64_t lower_host_id,
208  const HostPageSize& page_size) const = 0;
209 
227  virtual ConstHostCollection
228  getPage6(const SubnetID& subnet_id,
229  size_t& source_index,
230  uint64_t lower_host_id,
231  const HostPageSize& page_size) const = 0;
232 
249  virtual ConstHostCollection
250  getPage4(size_t& source_index,
251  uint64_t lower_host_id,
252  const HostPageSize& page_size) const = 0;
253 
270  virtual ConstHostCollection
271  getPage6(size_t& source_index,
272  uint64_t lower_host_id,
273  const HostPageSize& page_size) const = 0;
274 
283  virtual ConstHostCollection
284  getAll4(const asiolink::IOAddress& address) const = 0;
285 
296  virtual ConstHostPtr
297  get4(const SubnetID& subnet_id,
298  const Host::IdentifierType& identifier_type,
299  const uint8_t* identifier_begin,
300  const size_t identifier_len) const = 0;
301 
318  virtual ConstHostPtr
319  get4(const SubnetID& subnet_id,
320  const asiolink::IOAddress& address) const = 0;
321 
345  virtual ConstHostCollection
346  getAll4(const SubnetID& subnet_id,
347  const asiolink::IOAddress& address) const = 0;
348 
359  virtual ConstHostPtr
360  get6(const SubnetID& subnet_id,
361  const Host::IdentifierType& identifier_type,
362  const uint8_t* identifier_begin,
363  const size_t identifier_len) const = 0;
364 
371  virtual ConstHostPtr
372  get6(const asiolink::IOAddress& prefix, const uint8_t prefix_len) const = 0;
373 
381  virtual ConstHostPtr
382  get6(const SubnetID& subnet_id, const asiolink::IOAddress& address) const = 0;
383 
407  virtual ConstHostCollection
408  getAll6(const SubnetID& subnet_id,
409  const asiolink::IOAddress& address) const = 0;
410 
421  virtual void add(const HostPtr& host) = 0;
422 
431  virtual bool del(const SubnetID& subnet_id, const asiolink::IOAddress& addr) = 0;
432 
444  virtual bool del4(const SubnetID& subnet_id,
445  const Host::IdentifierType& identifier_type,
446  const uint8_t* identifier_begin, const size_t identifier_len) = 0;
447 
459  virtual bool del6(const SubnetID& subnet_id,
460  const Host::IdentifierType& identifier_type,
461  const uint8_t* identifier_begin, const size_t identifier_len) = 0;
462 
470  virtual void update(HostPtr const& host) {
471  bool deleted(false);
472  if (host->getIPv4SubnetID() != SUBNET_ID_UNUSED) {
473  std::vector<uint8_t> const& identifier(host->getIdentifier());
474  deleted = del4(host->getIPv4SubnetID(), host->getIdentifierType(), identifier.data(),
475  identifier.size());
476  } else if (host->getIPv6SubnetID() != SUBNET_ID_UNUSED) {
477  std::vector<uint8_t> const& identifier(host->getIdentifier());
478  deleted = del6(host->getIPv6SubnetID(), host->getIdentifierType(), identifier.data(),
479  identifier.size());
480  } else {
481  isc_throw(HostNotFound, "Mandatory 'subnet-id' parameter missing.");
482  }
483  if (!deleted) {
484  isc_throw(HostNotFound, "Host not updated (not found).");
485  }
486  add(host);
487  }
488 
494  virtual std::string getType() const = 0;
495 
503  }
504 
509  virtual void commit() {};
510 
515  virtual void rollback() {};
516 
535  virtual bool setIPReservationsUnique(const bool unique) = 0;
536 
542  virtual bool isUnusable() {
543  return (false);
544  }
545 };
546 
548 typedef boost::shared_ptr<BaseHostDataSource> HostDataSourcePtr;
549 
551 typedef std::vector<HostDataSourcePtr> HostDataSourceList;
552 
553 } // namespace dhcp
554 } // namespace isc
555 
556 #endif // BASE_HOST_DATA_SOURCE_H
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
This is a base class for exceptions thrown from the DNS library module.
virtual const char * what() const
Returns a C-style character string of the cause of the exception.
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Exception thrown when invalid IP address has been specified for Host.
BadHostAddress(const char *file, size_t line, const char *what)
Base interface for the classes implementing simple data source for host reservations.
virtual std::string getType() const =0
Return backend type.
virtual bool isUnusable()
Flag which indicates if the host manager has at least one unusable connection.
virtual ConstHostCollection getAllbyHostname6(const std::string &hostname, const SubnetID &subnet_id) const =0
Return all hosts with a hostname in a DHCPv6 subnet.
virtual void add(const HostPtr &host)=0
Adds a new host to the collection.
virtual ConstHostCollection getAll6(const SubnetID &subnet_id) const =0
Return all hosts in a DHCPv6 subnet.
virtual void commit()
Commit Transactions.
virtual ConstHostCollection getAllbyHostname4(const std::string &hostname, const SubnetID &subnet_id) const =0
Return all hosts with a hostname in a DHCPv4 subnet.
virtual bool del(const SubnetID &subnet_id, const asiolink::IOAddress &addr)=0
Attempts to delete hosts by (subnet-id, address)
virtual ConstHostCollection getPage4(const SubnetID &subnet_id, size_t &source_index, uint64_t lower_host_id, const HostPageSize &page_size) const =0
Returns range of hosts in a DHCPv4 subnet.
virtual ConstHostPtr get4(const SubnetID &subnet_id, const asiolink::IOAddress &address) const =0
Returns a host connected to the IPv4 subnet and having a reservation for a specified IPv4 address.
virtual ConstHostPtr get4(const SubnetID &subnet_id, const Host::IdentifierType &identifier_type, const uint8_t *identifier_begin, const size_t identifier_len) const =0
Returns a host connected to the IPv4 subnet.
virtual ConstHostCollection getAll4(const SubnetID &subnet_id, const asiolink::IOAddress &address) const =0
Returns all hosts connected to the IPv4 subnet and having a reservation for a specified address.
virtual bool del6(const SubnetID &subnet_id, const Host::IdentifierType &identifier_type, const uint8_t *identifier_begin, const size_t identifier_len)=0
Attempts to delete a host by (subnet-id6, identifier, identifier-type)
virtual bool setIPReservationsUnique(const bool unique)=0
Controls whether IP reservations are unique or non-unique.
virtual ConstHostPtr get6(const SubnetID &subnet_id, const asiolink::IOAddress &address) const =0
Returns a host connected to the IPv6 subnet and having a reservation for a specified IPv6 address or ...
virtual isc::db::DatabaseConnection::ParameterMap getParameters() const
Return backend parameters.
IdType
Specifies the type of an identifier.
virtual ConstHostCollection getPage6(size_t &source_index, uint64_t lower_host_id, const HostPageSize &page_size) const =0
Returns range of hosts.
virtual ConstHostCollection getAll4(const asiolink::IOAddress &address) const =0
Returns a collection of hosts using the specified IPv4 address.
virtual ConstHostCollection getPage4(size_t &source_index, uint64_t lower_host_id, const HostPageSize &page_size) const =0
Returns range of hosts.
virtual bool del4(const SubnetID &subnet_id, const Host::IdentifierType &identifier_type, const uint8_t *identifier_begin, const size_t identifier_len)=0
Attempts to delete a host by (subnet-id4, identifier, identifier-type)
virtual ConstHostCollection getPage6(const SubnetID &subnet_id, size_t &source_index, uint64_t lower_host_id, const HostPageSize &page_size) const =0
Returns range of hosts in a DHCPv6 subnet.
virtual ConstHostPtr get6(const SubnetID &subnet_id, const Host::IdentifierType &identifier_type, const uint8_t *identifier_begin, const size_t identifier_len) const =0
Returns a host connected to the IPv6 subnet.
virtual ConstHostPtr get6(const asiolink::IOAddress &prefix, const uint8_t prefix_len) const =0
Returns a host using the specified IPv6 prefix.
virtual ConstHostCollection getAllbyHostname(const std::string &hostname) const =0
Return all hosts with a hostname.
virtual void update(HostPtr const &host)
Attempts to update an existing host entry.
virtual ConstHostCollection getAll6(const SubnetID &subnet_id, const asiolink::IOAddress &address) const =0
Returns all hosts connected to the IPv6 subnet and having a reservation for a specified address or de...
virtual ~BaseHostDataSource()
Default destructor implementation.
virtual ConstHostCollection getAll(const Host::IdentifierType &identifier_type, const uint8_t *identifier_begin, const size_t identifier_len) const =0
Return all hosts connected to any subnet for which reservations have been made using a specified iden...
virtual void rollback()
Rollback Transactions.
virtual ConstHostCollection getAll4(const SubnetID &subnet_id) const =0
Return all hosts in a DHCPv4 subnet.
Exception thrown when the duplicate Host object is detected.
DuplicateHost(const char *file, size_t line, const char *what)
Exception thrown when a Host object is expected, but none are found.
HostNotFound(const char *file, size_t line, const char *what)
Wraps value holding size of the page with host reservations.
const size_t page_size_
Holds page size.
HostPageSize(const size_t page_size)
Constructor.
IdentifierType
Type of the host identifier.
Definition: host.h:307
Exception thrown when an address is already reserved by a Host object (DuplicateHost is same identity...
ReservedAddress(const char *file, size_t line, const char *what)
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
boost::shared_ptr< BaseHostDataSource > HostDataSourcePtr
HostDataSource pointer.
boost::shared_ptr< Host > HostPtr
Pointer to the Host object.
Definition: host.h:801
std::vector< ConstHostPtr > ConstHostCollection
Collection of the const Host objects.
Definition: host.h:807
std::vector< HostDataSourcePtr > HostDataSourceList
HostDataSource list.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
Definition: subnet_id.h:25
boost::shared_ptr< const Host > ConstHostPtr
Const pointer to the Host object.
Definition: host.h:804
Defines the logger used by the top-level component of kea-lfc.