23 #include <boost/date_time/posix_time/posix_time.hpp>
42 NotFound (
const char* file,
size_t line,
const char* what) :
67 switch (select_mode_) {
69 os <<
"[all subnets]";
72 os <<
"[subnet-id=" << first_subnet_id_ <<
"]";
75 os <<
"[subnets " << first_subnet_id_
76 <<
" through " << last_subnet_id_ <<
"]";
142 uint64_t makeResultSet4(
const ElementPtr& result,
const Parameters& params);
160 uint64_t makeResultSet6(
const ElementPtr& result,
const Parameters& params);
182 const std::vector<std::string>& column_labels);
192 int64_t assigned, int64_t declined);
203 int64_t assigned, int64_t declined, int64_t assigned_pds);
211 int64_t getSubnetStat(
const SubnetID& subnet_id,
const std::string& name);
222 extractCommand(handle);
223 params = getParameters(cmd_args_);
224 }
catch (
const std::exception& ex) {
227 setErrorResponse(handle, ex.what());
233 uint64_t rows = makeResultSet4(result, params);
237 std::stringstream os;
238 os <<
"stat-lease4-get" << params.
toText() <<
": " << rows <<
" rows found";
246 std::stringstream os;
247 os <<
"stat-lease4-get" << params.
toText() <<
": no matching data, " << ex.
what();
249 }
catch (
const std::exception& ex) {
253 setErrorResponse(handle, ex.what());
257 setResponse(handle, response);
269 extractCommand(handle);
270 params = getParameters(cmd_args_);
271 }
catch (
const std::exception& ex) {
274 setErrorResponse(handle, ex.what());
280 uint64_t rows = makeResultSet6(result, params);
284 std::stringstream os;
285 os <<
"stat-lease6-get" << params.
toText() <<
": " << rows <<
" rows found";
293 std::stringstream os;
294 os <<
"stat-lease6-get" << params.
toText() <<
": no matching data, " << ex.
what();
296 }
catch (
const std::exception& ex) {
300 setErrorResponse(handle, ex.what());
304 setResponse(handle, response);
320 if (cmd_args->getType() != Element::map) {
325 if (cmd_args->contains(
"subnet-id")) {
328 if (value->getType() != Element::integer) {
332 if (value->intValue() <= 0) {
340 if (cmd_args->contains(
"subnet-range")) {
346 if (range->getType() != Element::map) {
351 if (!value || value->getType() != Element::integer) {
355 if (value->intValue() <= 0) {
361 value = range->get(
"last-subnet-id");
362 if (!value || value->getType() != Element::integer) {
366 if (value->intValue() <= 0) {
383 LeaseStatCmdsImpl::makeResultSet4(
const ElementPtr& result_wrapper,
393 auto lower = idx.begin();
394 auto upper = idx.end();
399 if (lower == idx.end()) {
415 if (lower == upper) {
439 std::vector<std::string>column_labels = {
"subnet-id",
"total-addreses",
440 "assigned-addreses",
"declined-addreses"};
441 ElementPtr value_rows = createResultSet(result_wrapper, column_labels);
445 bool query_eof = !(query->getNextRow(query_row));
448 for (
auto cur_subnet = lower; cur_subnet != upper; ++cur_subnet) {
449 SubnetID cur_id = (*cur_subnet)->getID();
457 addValueRow4(value_rows, cur_id, 0, 0);
464 int64_t assigned = 0;
465 int64_t declined = 0;
466 bool add_row =
false;
467 while (!query_eof && (query_row.
subnet_id_ == cur_id)) {
476 query_eof = !(query->getNextRow(query_row));
481 addValueRow4(value_rows, cur_id, assigned, declined);
485 return (value_rows->size());
489 LeaseStatCmdsImpl::makeResultSet6(
const ElementPtr& result_wrapper,
502 auto lower = idx.begin();
503 auto upper = idx.end();
508 if (lower == idx.end()) {
524 if (lower == upper) {
532 std::vector<std::string>column_labels = {
"subnet-id",
"total-nas",
"assigned-nas",
533 "declined-nas",
"total-pds",
"assigned-pds"};
534 ElementPtr value_rows = createResultSet(result_wrapper, column_labels);
555 bool query_eof = !(query->getNextRow(query_row));
557 for (
auto cur_subnet = lower; cur_subnet != upper; ++cur_subnet) {
558 SubnetID cur_id = (*cur_subnet)->getID();
566 addValueRow6(value_rows, cur_id, 0, 0, 0);
572 int64_t assigned = 0;
573 int64_t declined = 0;
574 int64_t assigned_pds = 0;
575 bool add_row =
false;
576 while (!query_eof && (query_row.
subnet_id_ == cur_id)) {
591 query_eof = !(query->getNextRow(query_row));
595 addValueRow6(value_rows, cur_id, assigned, declined, assigned_pds);
599 return (value_rows->size());
603 LeaseStatCmdsImpl::createResultSet(
const ElementPtr &result_wrapper,
604 const std::vector<std::string>& column_labels) {
607 result_wrapper->set(
"result-set", result_set);
610 boost::posix_time::ptime now(boost::posix_time::microsec_clock::universal_time());
613 result_set->set(
"timestamp", timestamp);
617 for (
auto label = column_labels.begin(); label != column_labels.end(); ++label) {
618 columns->add(Element::create(*label));
620 result_set->set(
"columns", columns);
623 ElementPtr value_rows = Element::createList();
624 result_set->set(
"rows", value_rows);
631 int64_t assigned, int64_t declined) {
633 row->add(Element::create(
static_cast<int64_t
>(subnet_id)));
634 row->add(Element::create(getSubnetStat(subnet_id,
"total-addresses")));
635 row->add(Element::create(assigned));
636 row->add(Element::create(declined));
637 value_rows->add(row);
642 int64_t assigned, int64_t declined, int64_t assigned_pds) {
644 row->add(Element::create(
static_cast<int64_t
>(subnet_id)));
645 row->add(Element::create(getSubnetStat(subnet_id,
"total-nas")));
646 row->add(Element::create(assigned));
647 row->add(Element::create(declined));
648 row->add(Element::create(getSubnetStat(subnet_id,
"total-pds")));
649 row->add(Element::create(assigned_pds));
650 value_rows->add(row);
654 LeaseStatCmdsImpl::getSubnetStat(
const SubnetID& subnet_id,
const std::string& name) {
656 getObservation(StatsMgr::generateName(
"subnet", subnet_id, name));
658 return (stat->getInteger().first);
667 return(
impl.statLease4GetHandler(handle));
673 return(
impl.statLease6GetHandler(handle));