Kea  1.9.9-git
lease_mgr.h
Go to the documentation of this file.
1 // Copyright (C) 2012-2021 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 LEASE_MGR_H
8 #define LEASE_MGR_H
9 
10 #include <asiolink/io_address.h>
11 #include <asiolink/io_service.h>
12 #include <database/db_exceptions.h>
13 #include <dhcp/duid.h>
14 #include <dhcp/option.h>
15 #include <dhcp/hwaddr.h>
16 #include <dhcpsrv/lease.h>
17 #include <dhcpsrv/subnet.h>
18 
19 #include <boost/noncopyable.hpp>
20 #include <boost/shared_ptr.hpp>
21 
22 #include <fstream>
23 #include <iostream>
24 #include <map>
25 #include <string>
26 #include <utility>
27 #include <vector>
28 
36 namespace isc {
37 namespace dhcp {
38 
40 typedef std::pair<uint32_t, uint32_t> VersionPair;
41 
44 public:
45 
51  explicit LeasePageSize(const size_t page_size);
52 
53  const size_t page_size_;
54 };
55 
61 struct LeaseStatsRow {
64  subnet_id_(0), lease_type_(Lease::TYPE_NA),
65  lease_state_(Lease::STATE_DEFAULT), state_count_(0) {
66  }
67 
75  LeaseStatsRow(const SubnetID& subnet_id, const uint32_t lease_state,
76  const int64_t state_count)
77  : subnet_id_(subnet_id), lease_type_(Lease::TYPE_NA),
78  lease_state_(lease_state), state_count_(state_count) {
79  }
80 
87  LeaseStatsRow(const SubnetID& subnet_id, const Lease::Type& lease_type,
88  const uint32_t lease_state, const int64_t state_count)
89  : subnet_id_(subnet_id), lease_type_(lease_type),
90  lease_state_(lease_state), state_count_(state_count) {
91  }
92 
94  bool operator< (const LeaseStatsRow &rhs) const {
95  if (subnet_id_ < rhs.subnet_id_) {
96  return (true);
97  }
98 
99  if (subnet_id_ == rhs.subnet_id_ &&
100  lease_type_ < rhs.lease_type_) {
101  return (true);
102  }
103 
104  if (subnet_id_ == rhs.subnet_id_ &&
105  lease_type_ == rhs.lease_type_ &&
106  lease_state_ < rhs.lease_state_) {
107  return (true);
108  }
109 
110  return (false);
111  }
112 
118  uint32_t lease_state_;
120  int64_t state_count_;
121 };
122 
129 public:
131  typedef enum {
135  } SelectMode;
136 
139  LeaseStatsQuery();
140 
147  LeaseStatsQuery(const SubnetID& subnet_id);
148 
157  LeaseStatsQuery(const SubnetID& first_subnet_id, const SubnetID& last_subnet_id);
158 
160  virtual ~LeaseStatsQuery() {};
161 
167  virtual void start() {};
168 
175  virtual bool getNextRow(LeaseStatsRow& row);
176 
179  return (first_subnet_id_);
180  };
181 
184  return (last_subnet_id_);
185  };
186 
191  return (select_mode_);
192  };
193 
194 protected:
197 
200 
201 private:
203  SelectMode select_mode_;
204 };
205 
207 typedef boost::shared_ptr<LeaseStatsQuery> LeaseStatsQueryPtr;
208 
210 typedef boost::shared_ptr<LeaseStatsRow> LeaseStatsRowPtr;
211 
222 class LeaseMgr {
223 public:
227  {}
228 
230  virtual ~LeaseMgr()
231  {}
232 
235  static std::string getDBVersion();
236 
248  virtual bool addLease(const Lease4Ptr& lease) = 0;
249 
261  virtual bool addLease(const Lease6Ptr& lease) = 0;
262 
275  virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress& addr) const = 0;
276 
287  virtual Lease4Collection getLease4(const isc::dhcp::HWAddr& hwaddr) const = 0;
288 
299  virtual Lease4Ptr getLease4(const isc::dhcp::HWAddr& hwaddr,
300  SubnetID subnet_id) const = 0;
301 
312  virtual Lease4Collection getLease4(const ClientId& clientid) const = 0;
313 
323  virtual Lease4Ptr getLease4(const ClientId& clientid,
324  SubnetID subnet_id) const = 0;
325 
331  virtual Lease4Collection getLeases4(SubnetID subnet_id) const = 0;
332 
338  virtual Lease4Collection getLeases4(const std::string& hostname) const = 0;
339 
343  virtual Lease4Collection getLeases4() const = 0;
344 
369  virtual Lease4Collection
370  getLeases4(const asiolink::IOAddress& lower_bound_address,
371  const LeasePageSize& page_size) const = 0;
372 
383  virtual Lease6Ptr getLease6(Lease::Type type,
384  const isc::asiolink::IOAddress& addr) const = 0;
385 
398  virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid,
399  uint32_t iaid) const = 0;
400 
412  virtual Lease6Collection getLeases6(Lease::Type type, const DUID& duid,
413  uint32_t iaid, SubnetID subnet_id) const = 0;
414 
438  Lease6Ptr getLease6(Lease::Type type, const DUID& duid,
439  uint32_t iaid, SubnetID subnet_id) const;
440 
446  virtual Lease6Collection getLeases6(SubnetID subnet_id) const = 0;
447 
453  virtual Lease6Collection getLeases6(const std::string& hostname) const = 0;
454 
458  virtual Lease6Collection getLeases6() const = 0;
459 
464  virtual Lease6Collection getLeases6(const DUID& duid) const = 0;
465 
490  virtual Lease6Collection
491  getLeases6(const asiolink::IOAddress& lower_bound_address,
492  const LeasePageSize& page_size) const = 0;
493 
504  virtual void getExpiredLeases4(Lease4Collection& expired_leases,
505  const size_t max_leases) const = 0;
506 
517  virtual void getExpiredLeases6(Lease6Collection& expired_leases,
518  const size_t max_leases) const = 0;
519 
525  virtual void updateLease4(const Lease4Ptr& lease4) = 0;
526 
530  virtual void updateLease6(const Lease6Ptr& lease6) = 0;
531 
540  virtual bool deleteLease(const Lease4Ptr& lease) = 0;
541 
550  virtual bool deleteLease(const Lease6Ptr& lease) = 0;
551 
559  virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs) = 0;
560 
568  virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs) = 0;
569 
587  void recountLeaseStats4();
588 
598  virtual LeaseStatsQueryPtr startLeaseStatsQuery4();
599 
609  virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID& subnet_id);
610 
622  virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id,
623  const SubnetID& last_subnet_id);
624 
644  void recountLeaseStats6();
645 
655  virtual LeaseStatsQueryPtr startLeaseStatsQuery6();
656 
666  virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID& subnet_id);
667 
679  virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID& first_subnet_id,
680  const SubnetID& last_subnet_id);
681 
689  virtual size_t wipeLeases4(const SubnetID& subnet_id) = 0;
690 
698  virtual size_t wipeLeases6(const SubnetID& subnet_id) = 0;
699 
705  virtual std::string getType() const = 0;
706 
713  virtual std::string getName() const = 0;
714 
720  virtual std::string getDescription() const = 0;
721 
736  virtual VersionPair getVersion() const = 0;
737 
742  virtual void commit() = 0;
743 
748  virtual void rollback() = 0;
749 
753  static void setIOService(const isc::asiolink::IOServicePtr& io_service) {
754  io_service_ = io_service;
755  }
756 
759  return (io_service_);
760  }
761 
762 private:
764  static isc::asiolink::IOServicePtr io_service_;
765 };
766 
767 } // namespace dhcp
768 } // namespace isc
769 
770 #endif // LEASE_MGR_H
virtual std::string getType() const =0
Return backend type.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
Definition: lease_mgr.cc:343
virtual void updateLease4(const Lease4Ptr &lease4)=0
Updates IPv4 lease.
std::pair< uint32_t, uint32_t > VersionPair
Pair containing major and minor versions.
Definition: lease_mgr.h:40
boost::shared_ptr< LeaseStatsQuery > LeaseStatsQueryPtr
Defines a pointer to a LeaseStatsQuery.
Definition: lease_mgr.h:207
SelectMode getSelectMode() const
Returns the selection criteria mode The value returned is based upon the constructor variant used and...
Definition: lease_mgr.h:190
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery6(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
Definition: lease_mgr.cc:348
LeasePageSize(const size_t page_size)
Constructor.
Definition: lease_mgr.cc:36
Abstract Lease Manager.
Definition: lease_mgr.h:222
virtual size_t wipeLeases4(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
virtual LeaseStatsQueryPtr startLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query for all subnets.
Definition: lease_mgr.cc:194
LeaseStatsQuery()
Default constructor The query created will return statistics for all subnets.
Definition: lease_mgr.cc:161
virtual Lease4Collection getLeases4() const =0
Returns all IPv4 leases.
std::vector< Lease4Ptr > Lease4Collection
A collection of IPv4 leases.
Definition: lease.h:487
LeaseStatsRow()
Default constructor.
Definition: lease_mgr.h:63
virtual uint64_t deleteExpiredReclaimedLeases4(const uint32_t secs)=0
Deletes all expired and reclaimed DHCPv4 leases.
Base class for fulfilling a statistical lease data query.
Definition: lease_mgr.h:128
virtual std::string getName() const =0
Returns backend name.
Holds DUID (DHCPv6 Unique Identifier)
Definition: duid.h:27
virtual void rollback()=0
Rollback Transactions.
virtual void getExpiredLeases6(Lease6Collection &expired_leases, const size_t max_leases) const =0
Returns a collection of expired DHCPv6 leases.
virtual std::string getDescription() const =0
Returns description of the backend.
static isc::asiolink::IOServicePtr & getIOService()
Returns pointer to the IO service.
Definition: lease_mgr.h:758
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
Definition: lease_mgr.cc:354
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
Definition: lease_mgr.cc:199
virtual Lease6Collection getLeases6() const =0
Returns all IPv6 leases.
virtual ~LeaseStatsQuery()
virtual destructor
Definition: lease_mgr.h:160
const size_t page_size_
Holds page size.
Definition: lease_mgr.h:53
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
Definition: lease.h:283
SubnetID last_subnet_id_
Last subnet_id in the selection criteria when a range is given.
Definition: lease_mgr.h:199
LeaseStatsRow(const SubnetID &subnet_id, const uint32_t lease_state, const int64_t state_count)
Constructor.
Definition: lease_mgr.h:75
SelectMode
Defines the types of selection criteria supported.
Definition: lease_mgr.h:131
SubnetID subnet_id_
The subnet ID to which this data applies.
Definition: lease_mgr.h:114
void recountLeaseStats4()
Recalculates per-subnet and global stats for IPv4 leases.
Definition: lease_mgr.cc:67
virtual void commit()=0
Commit Transactions.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
Definition: lease.h:640
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual void getExpiredLeases4(Lease4Collection &expired_leases, const size_t max_leases) const =0
Returns a collection of expired DHCPv4 leases.
virtual ~LeaseMgr()
Destructor.
Definition: lease_mgr.h:230
boost::shared_ptr< LeaseStatsRow > LeaseStatsRowPtr
Defines a pointer to a LeaseStatsRow.
Definition: lease_mgr.h:210
virtual VersionPair getVersion() const =0
Returns backend version.
virtual LeaseStatsQueryPtr startSubnetRangeLeaseStatsQuery4(const SubnetID &first_subnet_id, const SubnetID &last_subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
Definition: lease_mgr.cc:204
Defines the logger used by the top-level component of kea-dhcp-ddns.
LeaseStatsRow(const SubnetID &subnet_id, const Lease::Type &lease_type, const uint32_t lease_state, const int64_t state_count)
Constructor.
Definition: lease_mgr.h:87
virtual LeaseStatsQueryPtr startLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query for all subnets.
Definition: lease_mgr.cc:338
bool operator<(const LeaseStatsRow &rhs) const
Less-than operator.
Definition: lease_mgr.h:94
virtual void start()
Executes the query.
Definition: lease_mgr.h:167
a common structure for IPv4 and IPv6 leases
Definition: lease.h:35
uint32_t lease_state_
The lease_state to which the count applies.
Definition: lease_mgr.h:118
Type
Type of lease or pool.
Definition: lease.h:50
Holds Client identifier or client IPv4 address.
Definition: duid.h:111
Hardware type that represents information from DHCPv4 packet.
Definition: hwaddr.h:20
virtual bool addLease(const Lease4Ptr &lease)=0
Adds an IPv4 lease.
SubnetID first_subnet_id_
First (or only) subnet_id in the selection criteria.
Definition: lease_mgr.h:192
int64_t state_count_
state_count The count of leases in the lease state
Definition: lease_mgr.h:120
virtual size_t wipeLeases6(const SubnetID &subnet_id)=0
Virtual method which removes specified leases.
static void setIOService(const isc::asiolink::IOServicePtr &io_service)
Sets IO service to be used by the Lease Manager.
Definition: lease_mgr.h:753
virtual Lease4Ptr getLease4(const isc::asiolink::IOAddress &addr) const =0
Returns an IPv4 lease for specified IPv4 address.
void recountLeaseStats6()
Recalculates per-subnet and global stats for IPv6 leases.
Definition: lease_mgr.cc:215
SubnetID getFirstSubnetID() const
Returns the value of first subnet ID specified (or zero)
Definition: lease_mgr.h:178
virtual bool deleteLease(const Lease4Ptr &lease)=0
Deletes an IPv4 lease.
Contains a single row of lease statistical data.
Definition: lease_mgr.h:61
Wraps value holding size of the page with leases.
Definition: lease_mgr.h:43
Lease::Type lease_type_
The lease_type to which the count applies.
Definition: lease_mgr.h:116
SubnetID getLastSubnetID() const
Returns the value of last subnet ID specified (or zero)
Definition: lease_mgr.h:183
virtual bool getNextRow(LeaseStatsRow &row)
Fetches the next row of data.
Definition: lease_mgr.cc:210
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
Definition: lease.h:492
virtual uint64_t deleteExpiredReclaimedLeases6(const uint32_t secs)=0
Deletes all expired and reclaimed DHCPv6 leases.
LeaseMgr()
Constructor.
Definition: lease_mgr.h:226
virtual void updateLease6(const Lease6Ptr &lease6)=0
Updates IPv6 lease.
uint32_t SubnetID
Unique identifier for a subnet (both v4 and v6)
Definition: lease.h:24