18#include <boost/foreach.hpp>
19#include <boost/algorithm/string.hpp>
44 : page_size_(page_size) {
50 if (
page_size_ > std::numeric_limits<uint32_t>::max()) {
52 << std::numeric_limits<uint32_t>::max());
58 uint32_t iaid,
SubnetID subnet_id)
const {
63 <<
static_cast<int>(type) <<
", duid "
64 << duid.
toText() <<
", iaid " << iaid
65 <<
" and subnet-id " << subnet_id);
70 return (*col.begin());
75 using namespace stats;
77 StatsMgr& stats_mgr = StatsMgr::instance();
89 stats_mgr.setValue(
"declined-addresses", zero);
92 if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
93 stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
97 if (!stats_mgr.getObservation(
"reclaimed-leases")) {
98 stats_mgr.setValue(
"reclaimed-leases", zero);
102 if (!stats_mgr.getObservation(
"cumulative-assigned-addresses")) {
103 stats_mgr.setValue(
"cumulative-assigned-addresses", zero);
111 for (Subnet4Collection::const_iterator subnet = subnets->begin();
112 subnet != subnets->end(); ++subnet) {
113 SubnetID subnet_id = (*subnet)->getID();
114 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
115 "assigned-addresses"),
118 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
119 "declined-addresses"),
122 const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
123 "reclaimed-declined-addresses"));
124 if (!stats_mgr.getObservation(name_rec_dec)) {
125 stats_mgr.setValue(name_rec_dec, zero);
128 const std::string name_rec(StatsMgr::generateName(
"subnet", subnet_id,
129 "reclaimed-leases"));
130 if (!stats_mgr.getObservation(name_rec)) {
131 stats_mgr.setValue(name_rec, zero);
135 const std::string name_aa(StatsMgr::generateName(
"subnet", subnet_id,
136 StatsMgr::generateName(
"pool", pool->getID(),
137 "assigned-addresses")));
138 if (!stats_mgr.getObservation(name_aa)) {
139 stats_mgr.setValue(name_aa, zero);
142 const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
143 StatsMgr::generateName(
"pool", pool->getID(),
144 "declined-addresses")));
145 if (!stats_mgr.getObservation(name_da)) {
146 stats_mgr.setValue(name_da, zero);
149 const std::string& name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
150 StatsMgr::generateName(
"pool", pool->getID(),
151 "reclaimed-declined-addresses")));
152 if (!stats_mgr.getObservation(name_rec_dec)) {
153 stats_mgr.setValue(name_rec_dec, zero);
156 const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
157 StatsMgr::generateName(
"pool", pool->getID(),
158 "reclaimed-leases")));
159 if (!stats_mgr.getObservation(name_rec)) {
160 stats_mgr.setValue(name_rec, zero);
168 while (query->getNextRow(row)) {
171 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
172 "assigned-addresses"),
176 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
177 "declined-addresses"),
181 stats_mgr.addValue(
"declined-addresses", row.
state_count_);
185 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
186 "assigned-addresses"),
199 while (query->getNextRow(row)) {
202 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
203 StatsMgr::generateName(
"pool", row.
pool_id_,
204 "assigned-addresses")),
208 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
209 StatsMgr::generateName(
"pool", row.
pool_id_,
210 "declined-addresses")),
215 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
216 StatsMgr::generateName(
"pool", row.
pool_id_,
217 "assigned-addresses")),
224 : first_subnet_id_(0), last_subnet_id_(0), select_mode_(select_mode) {
226 isc_throw(
BadValue,
"LeaseStatsQuery: mode must be either ALL_SUBNETS or ALL_SUBNET_POOLS");
231 : first_subnet_id_(subnet_id), last_subnet_id_(0),
232 select_mode_(SINGLE_SUBNET) {
241 : first_subnet_id_(first_subnet_id), last_subnet_id_(last_subnet_id),
242 select_mode_(SUBNET_RANGE) {
254 "LeaseStatsQuery: last_subnet_id_must be > first_subnet_id_");
286 using namespace stats;
288 StatsMgr& stats_mgr = StatsMgr::instance();
300 stats_mgr.setValue(
"declined-addresses", zero);
302 if (!stats_mgr.getObservation(
"reclaimed-declined-addresses")) {
303 stats_mgr.setValue(
"reclaimed-declined-addresses", zero);
306 if (!stats_mgr.getObservation(
"reclaimed-leases")) {
307 stats_mgr.setValue(
"reclaimed-leases", zero);
311 if (!stats_mgr.getObservation(
"cumulative-assigned-nas")) {
312 stats_mgr.setValue(
"cumulative-assigned-nas", zero);
316 if (!stats_mgr.getObservation(
"cumulative-assigned-pds")) {
317 stats_mgr.setValue(
"cumulative-assigned-pds", zero);
325 for (Subnet6Collection::const_iterator subnet = subnets->begin();
326 subnet != subnets->end(); ++subnet) {
327 SubnetID subnet_id = (*subnet)->getID();
328 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
332 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
336 stats_mgr.setValue(StatsMgr::generateName(
"subnet", subnet_id,
337 "declined-addresses"),
340 if (!stats_mgr.getObservation(
341 StatsMgr::generateName(
"subnet", subnet_id,
342 "reclaimed-declined-addresses"))) {
344 StatsMgr::generateName(
"subnet", subnet_id,
345 "reclaimed-declined-addresses"),
349 if (!stats_mgr.getObservation(
350 StatsMgr::generateName(
"subnet", subnet_id,
351 "reclaimed-leases"))) {
353 StatsMgr::generateName(
"subnet", subnet_id,
359 const std::string& name_anas(StatsMgr::generateName(
"subnet", subnet_id,
360 StatsMgr::generateName(
"pool", pool->getID(),
362 if (!stats_mgr.getObservation(name_anas)) {
363 stats_mgr.setValue(name_anas, zero);
366 const std::string& name_da(StatsMgr::generateName(
"subnet", subnet_id,
367 StatsMgr::generateName(
"pool", pool->getID(),
368 "declined-addresses")));
369 if (!stats_mgr.getObservation(name_da)) {
370 stats_mgr.setValue(name_da, zero);
373 const std::string name_rec_dec(StatsMgr::generateName(
"subnet", subnet_id,
374 StatsMgr::generateName(
"pool", pool->getID(),
375 "reclaimed-declined-addresses")));
376 if (!stats_mgr.getObservation(name_rec_dec)) {
377 stats_mgr.setValue(name_rec_dec, zero);
380 const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
381 StatsMgr::generateName(
"pool", pool->getID(),
382 "reclaimed-leases")));
383 if (!stats_mgr.getObservation(name_rec)) {
384 stats_mgr.setValue(name_rec, zero);
389 const std::string& name_apds(StatsMgr::generateName(
"subnet", subnet_id,
390 StatsMgr::generateName(
"pd-pool", pool->getID(),
392 if (!stats_mgr.getObservation(name_apds)) {
393 stats_mgr.setValue(name_apds, zero);
396 const std::string& name_rec(StatsMgr::generateName(
"subnet", subnet_id,
397 StatsMgr::generateName(
"pd-pool", pool->getID(),
398 "reclaimed-leases")));
399 if (!stats_mgr.getObservation(name_rec)) {
400 stats_mgr.setValue(name_rec, zero);
408 while (query->getNextRow(row)) {
413 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
418 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
419 "declined-addresses"),
423 stats_mgr.addValue(
"declined-addresses", row.
state_count_);
427 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
436 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
456 while (query->getNextRow(row)) {
461 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
462 StatsMgr::generateName(
"pool", row.
pool_id_,
467 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
468 StatsMgr::generateName(
"pool", row.
pool_id_,
469 "declined-addresses")),
474 stats_mgr.addValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
475 StatsMgr::generateName(
"pool", row.
pool_id_,
484 stats_mgr.setValue(StatsMgr::generateName(
"subnet", row.
subnet_id_,
485 StatsMgr::generateName(
"pd-pool", row.
pool_id_,
526 std::string extended_info_tables;
528 extended_info_tables = parameters.at(
"extended-info-tables");
529 }
catch (
const exception&) {
530 extended_info_tables =
"false";
533 if (extended_info_tables ==
"true") {
543 bool changed =
false;
572 string verifying =
"";
573 bool removed_extended_info =
false;
576 verifying =
"user context";
580 if (user_context->empty()) {
587 isc = user_context->get(
"ISC");
591 mutable_user_context =
592 boost::const_pointer_cast<Element>(user_context);
593 if (!mutable_user_context) {
595 mutable_user_context =
copy(user_context, 0);
596 lease->setContext(mutable_user_context);
604 mutable_user_context->remove(
"ISC");
605 if (mutable_user_context->empty()) {
611 verifying =
"relay-agent-info";
612 extended_info =
isc->get(
"relay-agent-info");
613 if (!extended_info) {
616 mutable_isc = boost::const_pointer_cast<Element>(
isc);
620 mutable_user_context->set(
"ISC", mutable_isc);
627 upgraded->set(
"sub-options", extended_info);
628 mutable_isc->set(
"relay-agent-info", upgraded);
632 string rai_hex = extended_info->stringValue();
633 vector<uint8_t> rai_data;
642 vector<uint8_t> bytes = remote_id->toBinary();
643 if (bytes.size() > 0) {
644 upgraded->set(
"remote-id",
651 vector<uint8_t> bytes = relay_id->toBinary(
false);
652 if (bytes.size() > 0) {
653 upgraded->set(
"relay-id",
660 .arg(lease->addr_.toText());
663 mutable_isc->remove(
"relay-agent-info");
664 removed_extended_info =
true;
675 verifying =
"sub-options";
677 mutable_isc->remove(
"relay-agent-info");
678 removed_extended_info =
true;
681 string rai_hex = sub_options->stringValue();
682 vector<uint8_t> rai_data;
688 verifying =
"remote-id";
690 mutable_isc->remove(
"relay-agent-info");
691 removed_extended_info =
true;
694 string remote_id_hex = remote_id->stringValue();
695 vector<uint8_t> remote_id_data;
697 if (remote_id_data.empty()) {
698 mutable_isc->remove(
"relay-agent-info");
699 removed_extended_info =
true;
706 verifying =
"relay-id";
708 mutable_isc->remove(
"relay-agent-info");
709 removed_extended_info =
true;
712 string relay_id_hex = relay_id->stringValue();
713 vector<uint8_t> relay_id_data;
715 if (relay_id_data.empty()) {
716 mutable_isc->remove(
"relay-agent-info");
717 removed_extended_info =
true;
726 verifying =
"relay-agent-info";
727 for (
auto elem : extended_info->mapValue()) {
728 if ((elem.first !=
"sub-options") &&
729 (elem.first !=
"remote-id") &&
730 (elem.first !=
"relay-id") &&
731 (elem.first !=
"comment")) {
732 mutable_isc->remove(
"relay-agent-info");
733 removed_extended_info =
true;
735 "' entry in relay-agent-info");
740 }
catch (
const exception& ex) {
742 err <<
"in " << verifying <<
" a problem was found: " << ex.what();
744 .arg(lease->addr_.toText())
748 if (verifying ==
"user context") {
750 }
else if (verifying ==
"isc") {
751 mutable_user_context->remove(
"ISC");
752 if (mutable_user_context->empty()) {
756 if (!removed_extended_info) {
757 mutable_isc->remove(
"relay-agent-info");
759 if (mutable_isc->empty()) {
760 mutable_user_context->remove(
"ISC");
761 if (mutable_user_context->empty()) {
773 bool changed =
false;
791 string verifying =
"";
792 bool removed_relay_info =
false;
793 bool upgraded =
false;
794 bool have_both =
false;
798 verifying =
"user context";
802 if (user_context->empty()) {
809 isc = user_context->get(
"ISC");
813 mutable_user_context =
814 boost::const_pointer_cast<Element>(user_context);
815 if (!mutable_user_context) {
817 mutable_user_context =
copy(user_context, 0);
818 lease->setContext(mutable_user_context);
826 mutable_user_context->remove(
"ISC");
827 if (mutable_user_context->empty()) {
832 mutable_isc = boost::const_pointer_cast<Element>(
isc);
836 mutable_user_context->set(
"ISC", mutable_isc);
839 relay_info = mutable_isc->get(
"relays");
840 if (relay_info &&
isc->contains(
"relay-info")) {
842 mutable_isc->remove(
"relays");
850 verifying =
"relays";
851 mutable_isc->set(
"relay-info", relay_info);
852 mutable_isc->remove(
"relays");
855 mutable_isc->remove(
"relay-info");
856 removed_relay_info =
true;
859 if (relay_info->empty()) {
860 mutable_isc->remove(
"relay-info");
861 removed_relay_info =
true;
866 for (i = 0; i < relay_info->size(); ++i) {
867 ElementPtr relay = relay_info->getNonConst(i);
869 mutable_isc->remove(
"relay-info");
870 removed_relay_info =
true;
874 mutable_isc->remove(
"relay-info");
875 removed_relay_info =
true;
885 verifying =
"options";
887 mutable_isc->remove(
"relay-info");
888 removed_relay_info =
true;
891 string options_hex = options->stringValue();
892 vector<uint8_t> options_data;
898 if (remote_id_it != opts.end()) {
899 OptionPtr remote_id = remote_id_it->second;
901 vector<uint8_t> bytes = remote_id->toBinary();
902 if (bytes.size() > 0) {
903 relay->set(
"remote-id",
910 if (relay_id_it != opts.end()) {
911 OptionPtr relay_id = relay_id_it->second;
913 vector<uint8_t> bytes = relay_id->toBinary(
false);
914 if (bytes.size() > 0) {
915 relay->set(
"relay-id",
923 verifying = (upgraded ?
"relays" :
"relay-info");
925 relay_info = mutable_isc->get(
"relay-info");
930 mutable_isc->remove(
"relay-info");
931 removed_relay_info =
true;
934 if (!upgraded && relay_info->empty()) {
935 mutable_isc->remove(
"relay-info");
936 removed_relay_info =
true;
941 for (i = 0; i < relay_info->size(); ++i) {
942 ElementPtr relay = relay_info->getNonConst(i);
943 if (!upgraded && !relay) {
944 mutable_isc->remove(
"relay-info");
945 removed_relay_info =
true;
949 mutable_isc->remove(
"relay-info");
950 removed_relay_info =
true;
955 if (!upgraded && options) {
957 verifying =
"options";
959 mutable_isc->remove(
"relay-info");
960 removed_relay_info =
true;
963 string options_hex = options->stringValue();
964 vector<uint8_t> options_data;
976 mutable_isc->remove(
"relay-info");
977 removed_relay_info =
true;
981 mutable_isc->remove(
"relay-info");
982 removed_relay_info =
true;
985 IOAddress laddr(link_addr->stringValue());
987 mutable_isc->remove(
"relay-info");
988 removed_relay_info =
true;
993 if (!upgraded && remote_id) {
994 verifying =
"remote-id";
996 mutable_isc->remove(
"relay-info");
997 removed_relay_info =
true;
1000 string remote_id_hex = remote_id->stringValue();
1001 vector<uint8_t> remote_id_data;
1003 if (remote_id_data.empty()) {
1004 mutable_isc->remove(
"relay-info");
1005 removed_relay_info =
true;
1011 if (!upgraded && relay_id) {
1012 verifying =
"relay-id";
1014 mutable_isc->remove(
"relay-info");
1015 removed_relay_info =
true;
1018 string relay_id_hex = relay_id->stringValue();
1019 vector<uint8_t> relay_id_data;
1021 if (relay_id_data.empty()) {
1022 mutable_isc->remove(
"relay-info");
1023 removed_relay_info =
true;
1035 mutable_isc->remove(
"relay-info");
1036 removed_relay_info =
true;
1040 mutable_isc->remove(
"relay-info");
1041 removed_relay_info =
true;
1044 IOAddress paddr(peer_addr->stringValue());
1045 if (!paddr.
isV6()) {
1046 mutable_isc->remove(
"relay-info");
1047 removed_relay_info =
true;
1054 mutable_isc->remove(
"relay-info");
1055 removed_relay_info =
true;
1059 mutable_isc->remove(
"relay-info");
1060 removed_relay_info =
true;
1064 verifying = (upgraded ?
"relays" :
"relay-info");
1065 for (
auto elem : relay->mapValue()) {
1066 if ((elem.first !=
"hop") &&
1067 (elem.first !=
"link") &&
1068 (elem.first !=
"peer") &&
1069 (elem.first !=
"options") &&
1070 (elem.first !=
"remote-id") &&
1071 (elem.first !=
"relay-id") &&
1072 (elem.first !=
"comment")) {
1073 mutable_isc->remove(
"relay-info");
1074 removed_relay_info =
true;
1083 .arg(lease->addr_.toText());
1087 }
catch (
const exception& ex) {
1089 err <<
"in " << verifying;
1091 err <<
" [relay#" << i <<
"]";
1093 err <<
" a problem was found: " << ex.what();
1095 .arg(lease->addr_.toText())
1099 have_both = !have_both;
1100 if (verifying ==
"user context") {
1102 }
else if (verifying ==
"isc") {
1103 mutable_user_context->remove(
"ISC");
1104 if (mutable_user_context->empty()) {
1108 if (!removed_relay_info) {
1109 mutable_isc->remove(
"relay-info");
1111 if (mutable_isc->empty()) {
1112 mutable_user_context->remove(
"ISC");
1113 if (mutable_user_context->empty()) {
1124 bool ignore_errors) {
1130 if (!user_context) {
1134 if (ignore_errors) {
1139 if (user_context->empty()) {
1148 if (ignore_errors) {
1158 if (!extended_info) {
1162 if (ignore_errors) {
1167 if (extended_info->empty()) {
1174 vector<uint8_t> bytes;
1179 if (!ignore_errors) {
1183 lease->relay_id_ = bytes;
1184 }
else if (!ignore_errors) {
1192 vector<uint8_t> bytes;
1197 if (!ignore_errors) {
1201 lease->remote_id_ = bytes;
1202 }
else if (!ignore_errors) {
1217 if (!user_context || (user_context->getType() !=
Element::map) ||
1218 user_context->empty()) {
1228 if (!relay_info || (relay_info->getType() !=
Element::list) ||
1229 relay_info->empty()) {
1233 for (
int i = 0; i < relay_info->size(); ++i) {
1235 if (!relay || (relay->getType() !=
Element::map) || relay->empty()) {
1241 string relay_id_hex = relay_id->stringValue();
1242 vector<uint8_t> relay_id_data;
1244 if (relay_id_data.empty()) {
1253 string remote_id_hex = remote_id->stringValue();
1254 vector<uint8_t> remote_id_data;
1256 if (remote_id_data.empty()) {
1262 }
catch (
const exception&) {
A generic exception that is thrown if a parameter given to a method is considered invalid in that con...
A generic exception that is thrown when a function is not implemented.
A generic exception that is thrown if a parameter given to a method would refer to or modify out-of-r...
A generic exception that is thrown when an unexpected error condition occurs.
The IOAddress class represents an IP addresses (version agnostic)
bool isV6() const
Convenience function to check for an IPv6 address.
static ElementPtr create(const Position &pos=ZERO_POSITION())
static ElementPtr createMap(const Position &pos=ZERO_POSITION())
Creates an empty MapElement type ElementPtr.
std::map< std::string, std::string > ParameterMap
Database configuration parameter map.
Multiple lease records found where one expected.
ExtendedInfoSanity
Values for extended info sanity checks done for leases.
@ EXTENDED_INFO_CHECK_PEDANTIC
@ EXTENDED_INFO_CHECK_FIX
@ EXTENDED_INFO_CHECK_NONE
static CfgMgr & instance()
returns a single instance of Configuration Manager
SrvConfigPtr getCurrentCfg()
Returns a pointer to the current configuration.
Holds DUID (DHCPv6 Unique Identifier)
std::string toText() const
Returns textual representation of the identifier (e.g.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery6(const SubnetID &subnet_id)
Creates and runs the IPv6 lease stats query for a single subnet.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query for all subnets and pools.
virtual Lease6Collection getLeases6() const =0
Returns all IPv6 leases.
void recountLeaseStats6()
Recalculates per-subnet and global stats for IPv6 leases.
void setExtendedInfoTablesEnabled(const bool enabled)
Modifies the setting whether the lease6 extended info tables are enabled.
virtual size_t byRelayId6size() const
Return the by-relay-id table size.
static bool upgradeLease6ExtendedInfo(const Lease6Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
Upgrade a V6 lease user context to the new extended info entry.
virtual size_t byRemoteId6size() const
Return the by-remote-id table size.
virtual void addRelayId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &relay_id)=0
Add lease6 extended info into by-relay-id table.
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.
void recountLeaseStats4()
Recalculates per-subnet and global stats for IPv4 leases.
static std::string getDBVersion()
Class method to return extended version info This class method must be redeclared and redefined in de...
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.
virtual LeaseStatsQueryPtr startSubnetLeaseStatsQuery4(const SubnetID &subnet_id)
Creates and runs the IPv4 lease stats query for a single subnet.
virtual Lease6Ptr getLease6(Lease::Type type, const isc::asiolink::IOAddress &addr) const =0
Returns existing IPv6 lease for a given IPv6 address.
virtual LeaseStatsQueryPtr startLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query for all subnets.
static void extractLease4ExtendedInfo(const Lease4Ptr &lease, bool ignore_errors=true)
Extract relay and remote identifiers from the extended info.
static bool upgradeLease4ExtendedInfo(const Lease4Ptr &lease, CfgConsistency::ExtendedInfoSanity check=CfgConsistency::EXTENDED_INFO_CHECK_FIX)
The following queries are used to fulfill Bulk Lease Query queries.
virtual void addRemoteId6(const isc::asiolink::IOAddress &lease_addr, const std::vector< uint8_t > &remote_id)=0
Add lease6 extended info into by-remote-id table.
virtual LeaseStatsQueryPtr startPoolLeaseStatsQuery4()
Creates and runs the IPv4 lease stats query for all subnets and pools.
virtual bool addExtendedInfo6(const Lease6Ptr &lease)
Extract extended info from a lease6 and add it into tables.
virtual LeaseStatsQueryPtr startLeaseStatsQuery6()
Creates and runs the IPv6 lease stats query for all subnets.
const size_t page_size_
Holds page size.
LeasePageSize(const size_t page_size)
Constructor.
LeaseStatsQuery(const SelectMode &select_mode=ALL_SUBNETS)
Constructor to query statistics for all subnets.
SubnetID first_subnet_id_
First (or only) subnet_id in the selection criteria.
SubnetID last_subnet_id_
Last subnet_id in the selection criteria when a range is given.
virtual bool getNextRow(LeaseStatsRow &row)
Fetches the next row of data.
SelectMode
Defines the types of selection criteria supported.
static OptionDefinitionPtr getOptionDef(const std::string &space, const uint16_t code)
Return the first option definition matching a particular option code.
static size_t unpackOptions6(const OptionBuffer &buf, const std::string &option_space, isc::dhcp::OptionCollection &options, size_t *relay_msg_offset=0, size_t *relay_msg_len=0)
Parses provided buffer as DHCPv6 options and creates Option objects.
Option with defined data fields represented as buffers that can be accessed using data field index.
#define isc_throw(type, stream)
A shortcut macro to insert known values into exception arguments.
An abstract API for lease database.
#define LOG_ERROR(LOGGER, MESSAGE)
Macro to conveniently test error output and log it.
#define LOG_DEBUG(LOGGER, LEVEL, MESSAGE)
Macro to conveniently test debug output and log it.
boost::shared_ptr< IOService > IOServicePtr
Defines a smart pointer to an IOService instance.
ElementPtr copy(ConstElementPtr from, int level)
Copy the data up to a nesting level.
boost::shared_ptr< const Element > ConstElementPtr
boost::shared_ptr< Element > ElementPtr
isc::log::Logger dhcpsrv_logger("dhcpsrv")
DHCP server library Logger.
const isc::log::MessageID DHCPSRV_LEASE6_EXTENDED_INFO_UPGRADED
boost::shared_ptr< OptionCustom > OptionCustomPtr
A pointer to the OptionCustom object.
boost::shared_ptr< Lease6 > Lease6Ptr
Pointer to a Lease6 structure.
std::vector< Lease6Ptr > Lease6Collection
A collection of IPv6 leases.
boost::shared_ptr< LeaseStatsQuery > LeaseStatsQueryPtr
Defines a pointer to a LeaseStatsQuery.
boost::multi_index_container< Subnet6Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet6Collection
A collection of Subnet6 objects.
std::multimap< unsigned int, OptionPtr > OptionCollection
A collection of DHCP (v4 or v6) options.
boost::shared_ptr< OptionDefinition > OptionDefinitionPtr
Pointer to option definition object.
boost::multi_index_container< Subnet4Ptr, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetSubnetIdIndexTag >, boost::multi_index::const_mem_fun< Subnet, SubnetID, &Subnet::getID > >, boost::multi_index::ordered_unique< boost::multi_index::tag< SubnetPrefixIndexTag >, boost::multi_index::const_mem_fun< Subnet, std::string, &Subnet::toText > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetServerIdIndexTag >, boost::multi_index::const_mem_fun< Network4, asiolink::IOAddress, &Network4::getServerId > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< SubnetModificationTimeIndexTag >, boost::multi_index::const_mem_fun< data::BaseStampedElement, boost::posix_time::ptime, &data::BaseStampedElement::getModificationTime > > > > Subnet4Collection
A collection of Subnet4 objects.
uint32_t SubnetID
Defines unique IPv4 or IPv6 subnet identifier.
const isc::log::MessageID DHCPSRV_LEASE4_EXTENDED_INFO_SANITY_FAIL
const isc::log::MessageID DHCPSRV_LEASE4_EXTENDED_INFO_UPGRADED
boost::shared_ptr< Lease4 > Lease4Ptr
Pointer to a Lease4 structure.
const int DHCPSRV_DBG_TRACE
DHCP server library logging levels.
boost::shared_ptr< Option > OptionPtr
const isc::log::MessageID DHCPSRV_LEASE6_EXTENDED_INFO_SANITY_FAIL
string encodeHex(const vector< uint8_t > &binary)
Encode binary data in the base16 ('hex') format.
void decodeHex(const string &input, vector< uint8_t > &result)
Decode a text encoded in the base16 ('hex') format into the original data.
void decodeFormattedHexString(const std::string &hex_string, std::vector< uint8_t > &binary)
Converts a formatted string of hexadecimal digits into a vector.
Defines the logger used by the top-level component of kea-lfc.
#define DHCP4_OPTION_SPACE
global std option spaces
#define DHCP6_OPTION_SPACE
Contains a single row of lease statistical data.
uint32_t pool_id_
The pool ID to which this data applies.
int64_t state_count_
state_count The count of leases in the lease state
uint32_t lease_state_
The lease_state to which the count applies.
SubnetID subnet_id_
The subnet ID to which this data applies.
Lease::Type lease_type_
The lease_type to which the count applies.
static const uint32_t STATE_DEFAULT
A lease in the default state.
static const uint32_t STATE_DECLINED
Declined lease.
Type
Type of lease or pool.
@ TYPE_PD
the lease contains IPv6 prefix (for prefix delegation)
@ TYPE_NA
the lease contains non-temporary IPv6 address